2018-03-26 23:32:43 +02:00
// @flow
2018-11-26 02:21:25 +01:00
import * as ICONS from 'constants/icons' ;
2019-06-17 22:32:38 +02:00
import * as SETTINGS from 'constants/settings' ;
2019-08-21 22:54:44 +02:00
import * as PAGES from 'constants/pages' ;
import React , { Fragment } from 'react' ;
2019-06-17 22:32:38 +02:00
import { withRouter } from 'react-router' ;
2019-08-27 16:43:42 +02:00
import classnames from 'classnames' ;
2018-03-26 23:32:43 +02:00
import Button from 'component/button' ;
2018-12-19 06:44:53 +01:00
import LbcSymbol from 'component/common/lbc-symbol' ;
2017-12-21 22:08:54 +01:00
import WunderBar from 'component/wunderbar' ;
2019-06-17 22:32:38 +02:00
import Icon from 'component/common/icon' ;
import { Menu , MenuList , MenuButton , MenuItem } from '@reach/menu-button' ;
2019-08-27 16:43:42 +02:00
import Tooltip from 'component/common/tooltip' ;
2020-01-25 22:04:48 +01:00
import NavigationButton from 'component/navigationButton' ;
2020-05-07 20:44:11 +02:00
import { LOGO _TITLE } from 'config' ;
2020-06-30 07:51:15 +02:00
import useIsMobile from 'effects/use-is-mobile' ;
2019-10-15 18:21:49 +02:00
// @if TARGET='app'
2020-05-18 06:26:30 +02:00
import { remote } from 'electron' ;
2019-10-15 18:21:49 +02:00
import { IS _MAC } from 'component/app/view' ;
// @endif
2019-10-09 18:34:18 +02:00
2018-03-26 23:32:43 +02:00
type Props = {
balance : string ,
2019-06-11 20:10:58 +02:00
roundedBalance : number ,
2020-01-22 05:37:33 +01:00
history : {
entities : { } [ ] ,
goBack : ( ) => void ,
goForward : ( ) => void ,
index : number ,
length : number ,
location : { pathname : string } ,
push : string => void ,
} ,
2019-06-17 22:32:38 +02:00
currentTheme : string ,
automaticDarkModeEnabled : boolean ,
setClientSetting : ( string , boolean | string ) => void ,
2019-07-29 17:37:29 +02:00
hideBalance : boolean ,
2019-08-21 22:54:44 +02:00
email : ? string ,
2020-01-03 20:34:17 +01:00
authenticated : boolean ,
2019-10-28 15:04:37 +01:00
authHeader : boolean ,
2020-06-30 07:51:15 +02:00
backout : {
backFunction : ( ) => void ,
title : string ,
simpleTitle : string , // Just use the same value as `title` if `title` is already short (~< 10 chars), unless you have a better idea for title overlfow on mobile
} ,
2019-11-01 17:19:28 +01:00
syncError : ? string ,
2020-04-13 21:16:07 +02:00
emailToVerify ? : string ,
2019-09-26 18:07:11 +02:00
signOut : ( ) => void ,
2019-12-18 06:27:08 +01:00
openMobileNavigation : ( ) => void ,
2020-01-03 20:11:47 +01:00
openChannelCreate : ( ) => void ,
2020-03-14 00:00:22 +01:00
openSignOutModal : ( ) => void ,
2020-04-13 21:16:07 +02:00
clearEmailEntry : ( ) => void ,
clearPasswordEntry : ( ) => void ,
2018-03-26 23:32:43 +02:00
} ;
const Header = ( props : Props ) => {
2019-08-21 22:54:44 +02:00
const {
roundedBalance ,
history ,
setClientSetting ,
currentTheme ,
automaticDarkModeEnabled ,
hideBalance ,
email ,
2020-01-03 20:34:17 +01:00
authenticated ,
2019-10-28 15:04:37 +01:00
authHeader ,
2019-09-26 18:07:11 +02:00
signOut ,
2019-11-01 17:19:28 +01:00
syncError ,
2019-12-18 06:27:08 +01:00
openMobileNavigation ,
2020-03-14 00:00:22 +01:00
openSignOutModal ,
2020-04-13 21:16:07 +02:00
clearEmailEntry ,
clearPasswordEntry ,
emailToVerify ,
2020-06-29 21:54:07 +02:00
backout ,
2019-08-21 22:54:44 +02:00
} = props ;
2020-06-30 07:51:15 +02:00
const isMobile = useIsMobile ( ) ;
2019-11-22 22:13:00 +01:00
// on the verify page don't let anyone escape other than by closing the tab to keep session data consistent
2019-11-14 01:33:36 +01:00
const isVerifyPage = history . location . pathname . includes ( PAGES . AUTH _VERIFY ) ;
2020-04-13 21:16:07 +02:00
const isSignUpPage = history . location . pathname . includes ( PAGES . AUTH ) ;
const isSignInPage = history . location . pathname . includes ( PAGES . AUTH _SIGNIN ) ;
2019-11-14 01:33:36 +01:00
2019-11-01 17:19:28 +01:00
// Sign out if they click the "x" when they are on the password prompt
2020-01-20 17:47:03 +01:00
const authHeaderAction = syncError ? { onClick : signOut } : { navigate : '/' } ;
const homeButtonNavigationProps = isVerifyPage ? { } : authHeader ? authHeaderAction : { navigate : '/' } ;
2020-04-13 21:16:07 +02:00
const closeButtonNavigationProps = {
onClick : ( ) => {
clearEmailEntry ( ) ;
clearPasswordEntry ( ) ;
if ( isSignInPage && ! emailToVerify ) {
history . goBack ( ) ;
}
if ( isSignUpPage ) {
history . goBack ( ) ;
}
if ( syncError ) {
signOut ( ) ;
}
} ,
} ;
2018-03-26 23:32:43 +02:00
2019-06-17 22:32:38 +02:00
function handleThemeToggle ( ) {
if ( automaticDarkModeEnabled ) {
setClientSetting ( SETTINGS . AUTOMATIC _DARK _MODE _ENABLED , false ) ;
}
if ( currentTheme === 'dark' ) {
setClientSetting ( SETTINGS . THEME , 'light' ) ;
} else {
setClientSetting ( SETTINGS . THEME , 'dark' ) ;
}
}
2018-03-26 23:32:43 +02:00
2019-09-26 18:07:11 +02:00
function getWalletTitle ( ) {
2020-05-27 04:14:18 +02:00
return hideBalance || Number ( roundedBalance ) === 0 ? (
_ _ ( 'Your Wallet' )
2019-09-26 18:07:11 +02:00
) : (
< React.Fragment >
{ roundedBalance } < LbcSymbol / >
< / React.Fragment >
) ;
2019-08-21 22:54:44 +02:00
}
2017-06-06 23:19:12 +02:00
return (
2019-10-15 18:21:49 +02:00
< header
className = { classnames ( 'header' , {
2019-10-28 15:04:37 +01:00
'header--minimal' : authHeader ,
2019-11-22 22:13:00 +01:00
// @if TARGET='web'
'header--noauth-web' : ! authenticated ,
// @endif
2019-10-15 18:21:49 +02:00
// @if TARGET='app'
'header--mac' : IS _MAC ,
// @endif
} ) }
2020-05-18 06:26:30 +02:00
// @if TARGET='app'
onDoubleClick = { e => {
remote . getCurrentWindow ( ) . maximize ( ) ;
} }
// @endif
2019-10-15 18:21:49 +02:00
>
2019-06-11 20:10:58 +02:00
< div className = "header__contents" >
2020-06-29 21:54:07 +02:00
{ ! authHeader && backout ? (
2020-06-30 07:51:15 +02:00
< div className = "card__actions--between" >
< Button onClick = { backout . backFunction } button = "link" label = { _ _ ( 'Cancel' ) } icon = { ICONS . ARROW _LEFT } / >
2020-07-02 19:01:08 +02:00
{ backout . title && (
< h1 className = { 'card__title' } > { isMobile ? backout . simpleTitle || backout . title : backout . title } < / h1 >
) }
2020-06-29 21:54:07 +02:00
< Button
aria - label = { _ _ ( 'Your wallet' ) }
navigate = { ` / $ / ${ PAGES . WALLET } ` }
className = "header__navigation-item menu__title header__navigation-item--balance"
label = { getWalletTitle ( ) }
// @if TARGET='app'
onDoubleClick = { e => {
e . stopPropagation ( ) ;
} }
// @endif
/ >
< / div >
) : (
< >
< div className = "header__navigation" >
< Button
className = "header__navigation-item header__navigation-item--lbry header__navigation-item--button-mobile"
label = { LOGO _TITLE }
icon = { ICONS . LBRY }
onClick = { ( ) => {
if ( history . location . pathname === '/' ) window . location . reload ( ) ;
} }
// @if TARGET='app'
onDoubleClick = { e => {
e . stopPropagation ( ) ;
} }
// @endif
{ ... homeButtonNavigationProps }
/ >
{ /* @if TARGET='app' */ }
{ ! authHeader && (
< div className = "header__navigation-arrows" >
< NavigationButton isBackward history = { history } / >
< NavigationButton isBackward = { false } history = { history } / >
< / div >
) }
{ /* @endif */ }
2019-09-30 23:48:30 +02:00
2020-06-29 21:54:07 +02:00
{ ! authHeader && < WunderBar / > }
2019-08-27 16:43:42 +02:00
< / div >
2020-06-29 21:54:07 +02:00
{ ! authHeader ? (
< div className = { classnames ( 'header__menu' , { 'header__menu--with-balance' : ! IS _WEB || authenticated } ) } >
{ ( ! IS _WEB || authenticated ) && (
< Fragment >
< Button
aria - label = { _ _ ( 'Your wallet' ) }
navigate = { ` / $ / ${ PAGES . WALLET } ` }
className = "header__navigation-item menu__title header__navigation-item--balance"
label = { getWalletTitle ( ) }
// @if TARGET='app'
onDoubleClick = { e => {
e . stopPropagation ( ) ;
} }
// @endif
/ >
< Menu >
< MenuButton
aria - label = { _ _ ( 'Publish a file, or create a channel' ) }
title = { _ _ ( 'Publish a file, or create a channel' ) }
className = "header__navigation-item menu__title header__navigation-item--icon"
// @if TARGET='app'
onDoubleClick = { e => {
e . stopPropagation ( ) ;
} }
// @endif
>
< Icon size = { 18 } icon = { ICONS . PUBLISH } aria - hidden / >
< / MenuButton >
< MenuList className = "menu__list--header" >
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . PUBLISH } ` ) } >
< Icon aria - hidden icon = { ICONS . PUBLISH } / >
{ _ _ ( 'Publish' ) }
< / MenuItem >
2020-07-02 18:18:59 +02:00
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . CHANNEL _NEW } ` ) } >
2020-06-29 21:54:07 +02:00
< Icon aria - hidden icon = { ICONS . CHANNEL } / >
{ _ _ ( 'New Channel' ) }
< / MenuItem >
< / MenuList >
< / Menu >
2019-08-27 16:43:42 +02:00
2020-06-29 21:54:07 +02:00
< Menu >
< MenuButton
aria - label = { _ _ ( 'Your account' ) }
title = { _ _ ( 'Your account' ) }
className = "header__navigation-item menu__title header__navigation-item--icon"
// @if TARGET='app'
onDoubleClick = { e => {
e . stopPropagation ( ) ;
} }
// @endif
>
< Icon size = { 18 } icon = { ICONS . ACCOUNT } aria - hidden / >
< / MenuButton >
< MenuList className = "menu__list--header" >
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . PUBLISHED } ` ) } >
< Icon aria - hidden icon = { ICONS . PUBLISH } / >
{ _ _ ( 'Publishes' ) }
< / MenuItem >
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . CHANNELS } ` ) } >
< Icon aria - hidden icon = { ICONS . CHANNEL } / >
{ _ _ ( 'Channels' ) }
< / MenuItem >
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . CREATOR _DASHBOARD } ` ) } >
< Icon aria - hidden icon = { ICONS . ANALYTICS } / >
{ _ _ ( 'Creator Analytics' ) }
< / MenuItem >
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . REWARDS } ` ) } >
< Icon aria - hidden icon = { ICONS . REWARDS } / >
{ _ _ ( 'Rewards' ) }
< / MenuItem >
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . INVITE } ` ) } >
< Icon aria - hidden icon = { ICONS . INVITE } / >
{ _ _ ( 'Invites' ) }
< / MenuItem >
2020-01-03 17:43:51 +01:00
2020-06-29 21:54:07 +02:00
{ authenticated ? (
< MenuItem onSelect = { IS _WEB ? signOut : openSignOutModal } >
< div className = "menu__link" >
< Icon aria - hidden icon = { ICONS . SIGN _OUT } / >
{ _ _ ( 'Sign Out' ) }
< / div >
< span className = "menu__link-help" > { email } < / span >
< / MenuItem >
) : (
< React.Fragment >
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . AUTH } ` ) } >
< Icon aria - hidden icon = { ICONS . SIGN _UP } / >
{ _ _ ( 'Register' ) }
< / MenuItem >
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . AUTH _SIGNIN } ` ) } >
< Icon aria - hidden icon = { ICONS . SIGN _IN } / >
{ _ _ ( 'Sign In' ) }
< / MenuItem >
< / React.Fragment >
) }
< / MenuList >
< / Menu >
< / Fragment >
) }
2020-01-03 17:43:51 +01:00
< Menu >
2020-04-30 17:42:40 +02:00
< MenuButton
2020-06-29 21:54:07 +02:00
aria - label = { _ _ ( 'Settings' ) }
title = { _ _ ( 'Settings' ) }
2020-04-30 17:42:40 +02:00
className = "header__navigation-item menu__title header__navigation-item--icon"
2020-05-18 06:26:30 +02:00
// @if TARGET='app'
onDoubleClick = { e => {
e . stopPropagation ( ) ;
} }
// @endif
2020-04-30 17:42:40 +02:00
>
2020-06-29 21:54:07 +02:00
< Icon size = { 18 } icon = { ICONS . SETTINGS } aria - hidden / >
2020-01-03 17:43:51 +01:00
< / MenuButton >
< MenuList className = "menu__list--header" >
2020-06-29 21:54:07 +02:00
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . SETTINGS } ` ) } >
< Icon aria - hidden tootlip icon = { ICONS . SETTINGS } / >
{ _ _ ( 'Settings' ) }
2019-08-27 16:43:42 +02:00
< / MenuItem >
2020-06-29 21:54:07 +02:00
< MenuItem className = "menu__link" onSelect = { ( ) => history . push ( ` / $ / ${ PAGES . HELP } ` ) } >
< Icon aria - hidden icon = { ICONS . HELP } / >
{ _ _ ( 'Help' ) }
2020-03-18 18:33:17 +01:00
< / MenuItem >
2020-06-29 21:54:07 +02:00
< MenuItem className = "menu__link" onSelect = { handleThemeToggle } >
< Icon icon = { currentTheme === 'light' ? ICONS . DARK : ICONS . LIGHT } / >
{ currentTheme === 'light' ? _ _ ( 'Dark' ) : _ _ ( 'Light' ) }
2020-01-02 17:30:27 +01:00
< / MenuItem >
2019-08-27 16:43:42 +02:00
< / MenuList >
< / Menu >
2020-06-29 21:54:07 +02:00
{ IS _WEB && ! authenticated && (
< div className = "header__auth-buttons" >
< Button navigate = { ` / $ / ${ PAGES . AUTH _SIGNIN } ` } button = "link" label = { _ _ ( 'Sign In' ) } / >
< Button navigate = { ` / $ / ${ PAGES . AUTH } ` } button = "primary" label = { _ _ ( 'Register' ) } / >
< / div >
) }
2020-04-13 21:16:07 +02:00
< / div >
2020-06-29 21:54:07 +02:00
) : (
! isVerifyPage && (
< div className = "header__menu" >
{ /* Add an empty span here so we can use the same style as above */ }
{ /* This pushes the close button to the right side */ }
< span / >
< Tooltip label = { _ _ ( 'Go Back' ) } >
< Button
button = "alt"
// className="button--header-close"
icon = { ICONS . REMOVE }
{ ... closeButtonNavigationProps }
// @if TARGET='app'
onDoubleClick = { e => {
e . stopPropagation ( ) ;
} }
// @endif
/ >
< / Tooltip >
< / div >
)
2019-08-27 16:43:42 +02:00
) }
2020-06-29 21:54:07 +02:00
< Button
onClick = { openMobileNavigation }
icon = { ICONS . MENU }
iconSize = { 24 }
className = "header__menu--mobile"
// @if TARGET='app'
onDoubleClick = { e => {
e . stopPropagation ( ) ;
} }
// @endif
/ >
< / >
2019-08-27 16:43:42 +02:00
) }
2017-06-06 23:19:12 +02:00
< / div >
< / header >
) ;
2017-06-06 06:21:55 +02:00
} ;
2016-08-27 16:12:56 +02:00
2019-06-17 22:32:38 +02:00
export default withRouter ( Header ) ;