import PropTypes from 'prop-types' ;
import { Component } from 'react' ;
import { defineMessages , injectIntl } from 'react-intl' ;
import { Link } from 'react-router-dom' ;
import { ReactComponent as AlternateEmailIcon } from '@material-symbols/svg-600/outlined/alternate_email.svg' ;
import { ReactComponent as BookmarksIcon } from '@material-symbols/svg-600/outlined/bookmarks-fill.svg' ;
import { ReactComponent as HomeIcon } from '@material-symbols/svg-600/outlined/home-fill.svg' ;
import { ReactComponent as ListAltIcon } from '@material-symbols/svg-600/outlined/list_alt.svg' ;
import { ReactComponent as MoreHorizIcon } from '@material-symbols/svg-600/outlined/more_horiz.svg' ;
import { ReactComponent as PublicIcon } from '@material-symbols/svg-600/outlined/public.svg' ;
import { ReactComponent as SearchIcon } from '@material-symbols/svg-600/outlined/search.svg' ;
import { ReactComponent as SettingsIcon } from '@material-symbols/svg-600/outlined/settings-fill.svg' ;
import { ReactComponent as StarIcon } from '@material-symbols/svg-600/outlined/star-fill.svg' ;
import { ReactComponent as TagIcon } from '@material-symbols/svg-600/outlined/tag.svg' ;
import { WordmarkLogo } from 'mastodon/components/logo' ;
import { NavigationPortal } from 'mastodon/components/navigation_portal' ;
import { timelinePreview , trendsEnabled } from 'mastodon/initial_state' ;
import { transientSingleColumn } from 'mastodon/is_mobile' ;
import ColumnLink from './column_link' ;
import DisabledAccountBanner from './disabled_account_banner' ;
import FollowRequestsColumnLink from './follow_requests_column_link' ;
import ListPanel from './list_panel' ;
import NotificationsCounterIcon from './notifications_counter_icon' ;
import SignInBanner from './sign_in_banner' ;
const messages = defineMessages ( {
home : { id : 'tabs_bar.home' , defaultMessage : 'Home' } ,
notifications : { id : 'tabs_bar.notifications' , defaultMessage : 'Notifications' } ,
explore : { id : 'explore.title' , defaultMessage : 'Explore' } ,
firehose : { id : 'column.firehose' , defaultMessage : 'Live feeds' } ,
direct : { id : 'navigation_bar.direct' , defaultMessage : 'Private mentions' } ,
favourites : { id : 'navigation_bar.favourites' , defaultMessage : 'Favorites' } ,
bookmarks : { id : 'navigation_bar.bookmarks' , defaultMessage : 'Bookmarks' } ,
lists : { id : 'navigation_bar.lists' , defaultMessage : 'Lists' } ,
preferences : { id : 'navigation_bar.preferences' , defaultMessage : 'Preferences' } ,
followsAndFollowers : { id : 'navigation_bar.follows_and_followers' , defaultMessage : 'Follows and followers' } ,
about : { id : 'navigation_bar.about' , defaultMessage : 'About' } ,
search : { id : 'navigation_bar.search' , defaultMessage : 'Search' } ,
advancedInterface : { id : 'navigation_bar.advanced_interface' , defaultMessage : 'Open in advanced web interface' } ,
openedInClassicInterface : { id : 'navigation_bar.opened_in_classic_interface' , defaultMessage : 'Posts, accounts, and other specific pages are opened by default in the classic web interface.' } ,
} ) ;
class NavigationPanel extends Component {
static contextTypes = {
identity : PropTypes . object . isRequired ,
} ;
static propTypes = {
intl : PropTypes . object . isRequired ,
} ;
isFirehoseActive = ( match , location ) => {
return match || location . pathname . startsWith ( '/public' ) ;
} ;
render ( ) {
const { intl } = this . props ;
const { signedIn , disabledAccountId } = this . context . identity ;
let banner = undefined ;
if ( transientSingleColumn )
banner = ( < div className = 'switch-to-advanced' >
{ intl . formatMessage ( messages . openedInClassicInterface ) }
{ " " }
< a href = { ` /deck ${ location . pathname } ` } className = 'switch-to-advanced__toggle' >
{ intl . formatMessage ( messages . advancedInterface ) }
< / a >
< / div > ) ;
return (
< div className = 'navigation-panel' >
< div className = 'navigation-panel__logo' >
< Link to = '/' className = 'column-link column-link--logo' > < WordmarkLogo / > < / Link >
{ ! banner && < hr / > }
< / div >
{ banner &&
< div class = 'navigation-panel__banner' >
{ banner }
< / div >
}
{ signedIn && (
< >
< ColumnLink transparent to = '/home' icon = 'home' iconComponent = { HomeIcon } text = { intl . formatMessage ( messages . home ) } / >
< ColumnLink transparent to = '/notifications' icon = { < NotificationsCounterIcon className = 'column-link__icon' / > } text = { intl . formatMessage ( messages . notifications ) } / >
< FollowRequestsColumnLink / >
< / >
) }
{ trendsEnabled ? (
< ColumnLink transparent to = '/explore' icon = 'hashtag' iconComponent = { TagIcon } text = { intl . formatMessage ( messages . explore ) } / >
) : (
< ColumnLink transparent to = '/search' icon = 'search' iconComponent = { SearchIcon } text = { intl . formatMessage ( messages . search ) } / >
) }
{ ( signedIn || timelinePreview ) && (
< ColumnLink transparent to = '/public/local' isActive = { this . isFirehoseActive } icon = 'globe' iconComponent = { PublicIcon } text = { intl . formatMessage ( messages . firehose ) } / >
) }
{ ! signedIn && (
< div className = 'navigation-panel__sign-in-banner' >
< hr / >
{ disabledAccountId ? < DisabledAccountBanner / > : < SignInBanner / > }
< / div >
) }
{ signedIn && (
< >
< ColumnLink transparent to = '/conversations' icon = 'at' iconComponent = { AlternateEmailIcon } text = { intl . formatMessage ( messages . direct ) } / >
< ColumnLink transparent to = '/bookmarks' icon = 'bookmarks' iconComponent = { BookmarksIcon } text = { intl . formatMessage ( messages . bookmarks ) } / >
< ColumnLink transparent to = '/favourites' icon = 'star' iconComponent = { StarIcon } text = { intl . formatMessage ( messages . favourites ) } / >
< ColumnLink transparent to = '/lists' icon = 'list-ul' iconComponent = { ListAltIcon } text = { intl . formatMessage ( messages . lists ) } / >
< ListPanel / >
< hr / >
< ColumnLink transparent href = '/settings/preferences' icon = 'cog' iconComponent = { SettingsIcon } text = { intl . formatMessage ( messages . preferences ) } / >
< / >
) }
< div className = 'navigation-panel__legal' >
< hr / >
< ColumnLink transparent to = '/about' icon = 'ellipsis-h' iconComponent = { MoreHorizIcon } text = { intl . formatMessage ( messages . about ) } / >
< / div >
< NavigationPortal / >
< / div >
) ;
}
}
export default injectIntl ( NavigationPanel ) ;