import classNames from 'classnames'; import React from 'react'; import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; import { useDispatch } from 'react-redux'; import { Link, NavLink } from 'react-router-dom'; import { fetchOwnAccounts, logOut, switchAccount } from 'soapbox/actions/auth'; import { getSettings } from 'soapbox/actions/settings'; import { closeSidebar } from 'soapbox/actions/sidebar'; import Account from 'soapbox/components/account'; import SiteLogo from 'soapbox/components/site-logo'; import { Stack } from 'soapbox/components/ui'; import ProfileStats from 'soapbox/features/ui/components/profile_stats'; import { useAppSelector, useFeatures, useLogo } from 'soapbox/hooks'; import { makeGetAccount, makeGetOtherAccounts } from 'soapbox/selectors'; import { HStack, Icon, IconButton, Text } from './ui'; import type { List as ImmutableList } from 'immutable'; import type { Account as AccountEntity } from 'soapbox/types/entities'; const messages = defineMessages({ follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' }, followers: { id: 'account.followers', defaultMessage: 'Followers' }, follows: { id: 'account.follows', defaultMessage: 'Follows' }, profile: { id: 'account.profile', defaultMessage: 'Profile' }, preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' }, soapboxConfig: { id: 'navigation_bar.soapbox_config', defaultMessage: 'Soapbox config' }, importData: { id: 'navigation_bar.import_data', defaultMessage: 'Import data' }, accountMigration: { id: 'navigation_bar.account_migration', defaultMessage: 'Move account' }, accountAliases: { id: 'navigation_bar.account_aliases', defaultMessage: 'Account aliases' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, bookmarks: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' }, lists: { id: 'column.lists', defaultMessage: 'Lists' }, invites: { id: 'navigation_bar.invites', defaultMessage: 'Invites' }, developers: { id: 'navigation.developers', defaultMessage: 'Developers' }, addAccount: { id: 'profile_dropdown.add_account', defaultMessage: 'Add an existing account' }, direct: { id: 'column.direct', defaultMessage: 'Direct messages' }, directory: { id: 'navigation_bar.profile_directory', defaultMessage: 'Profile directory' }, dashboard: { id: 'tabs_bar.dashboard', defaultMessage: 'Dashboard' }, tags: { id: 'navigation_bar.tags', defaultMessage: 'Hashtags' }, }); interface ISidebarLink { href?: string, to?: string, icon: string, text: string | JSX.Element, onClick: React.EventHandler, } const SidebarLink: React.FC = ({ href, to, icon, text, onClick }) => { const body = (
{text}
); if (to) { return ( {body} ); } return ( {body} ); }; const getOtherAccounts = makeGetOtherAccounts(); const SidebarMenu: React.FC = (): JSX.Element | null => { const intl = useIntl(); const dispatch = useDispatch(); const logo = useLogo(); const features = useFeatures(); const getAccount = makeGetAccount(); const instance = useAppSelector((state) => state.instance); const me = useAppSelector((state) => state.me); const account = useAppSelector((state) => me ? getAccount(state, me) : null); const otherAccounts: ImmutableList = useAppSelector((state) => getOtherAccounts(state)); const sidebarOpen = useAppSelector((state) => state.sidebar.sidebarOpen); const settings = useAppSelector((state) => getSettings(state)); const followRequestsCount = useAppSelector((state) => state.user_lists.follow_requests.items.count()); const bubbleTimeline = features.bubbleTimeline && settings.getIn(['public', 'bubble']); const closeButtonRef = React.useRef(null); const [switcher, setSwitcher] = React.useState(false); const onClose = () => dispatch(closeSidebar()); const handleClose = () => { setSwitcher(false); onClose(); }; const handleSwitchAccount = (account: AccountEntity): React.MouseEventHandler => { return (e) => { e.preventDefault(); dispatch(switchAccount(account.id)); }; }; const onClickLogOut: React.MouseEventHandler = (e) => { e.preventDefault(); dispatch(logOut()); }; const handleSwitcherClick: React.MouseEventHandler = (e) => { e.preventDefault(); setSwitcher((prevState) => (!prevState)); }; const renderAccount = (account: AccountEntity) => (
); React.useEffect(() => { dispatch(fetchOwnAccounts()); }, []); if (!account) return null; return (
{switcher && (
{otherAccounts.map(account => renderAccount(account))} {intl.formatMessage(messages.addAccount)}
)}

{features.bookmarks && ( )} {features.lists && ( )} {features.followTags && ( )} {features.profileDirectory && ( )} {settings.get('isDeveloper') && ( )} {features.publicTimeline && <>
} onClick={onClose} /> {features.federating && ( } onClick={onClose} /> )} }
{ (account.locked || followRequestsCount > 0) && } {account.admin && ( )} {account.staff && ( )} {features.import && ( )}
); }; export default SidebarMenu;