import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { useDispatch, useSelector } from 'react-redux'; import { Link, NavLink } from 'react-router-dom'; import { logOut, switchAccount } from 'soapbox/actions/auth'; import { fetchOwnAccounts } from 'soapbox/actions/auth'; import { getSoapboxConfig } from 'soapbox/actions/soapbox'; import Account from 'soapbox/components/account'; import { Stack } from 'soapbox/components/ui'; import ProfileStats from 'soapbox/features/ui/components/profile_stats'; import { getFeatures } from 'soapbox/utils/features'; import { closeSidebar } from '../actions/sidebar'; import { makeGetAccount, makeGetOtherAccounts } from '../selectors'; import { isAdmin, isStaff } from '../utils/accounts'; import { HStack, Icon, IconButton, Text } from './ui'; const messages = defineMessages({ 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' }, blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' }, domainBlocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' }, mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' }, filters: { id: 'navigation_bar.filters', defaultMessage: 'Muted words' }, 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' }, logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' }, }); const SidebarLink = ({ to, icon, text, onClick }) => (
{text}
); SidebarLink.propTypes = { to: PropTypes.string.isRequired, icon: PropTypes.string.isRequired, text: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired, }; const SidebarMenu = () => { const intl = useIntl(); const dispatch = useDispatch(); const logo = useSelector((state) => getSoapboxConfig(state).get('logo')); const features = useSelector((state) => getFeatures(state.get('instance'))); const getAccount = makeGetAccount(); const getOtherAccounts = makeGetOtherAccounts(); const me = useSelector((state) => state.get('me')); const account = useSelector((state) => getAccount(state, me)); const otherAccounts = useSelector((state) => getOtherAccounts(state)); const sidebarOpen = useSelector((state) => state.get('sidebar').sidebarOpen); const closeButtonRef = React.useRef(null); const [switcher, setSwitcher] = React.useState(false); const onClose = () => dispatch(closeSidebar()); const handleClose = () => { setSwitcher(false); onClose(); }; const handleSwitchAccount = (event, account) => { event.preventDefault(); switchAccount(account); dispatch(switchAccount(account.get('id'))); }; const onClickLogOut = (event) => { event.preventDefault(); dispatch(logOut(intl)); }; const handleSwitcherClick = (e) => { e.preventDefault(); setSwitcher((prevState) => (!prevState)); }; const renderAccount = (account) => ( handleSwitchAccount(event, account)} key={account.get('id')}> ); React.useEffect(() => { dispatch(fetchOwnAccounts()); }, []); if (!account) { return null; } const acct = account.get('acct'); const classes = classNames('sidebar-menu__root', { 'sidebar-menu__root--visible': sidebarOpen, }); return (
Logo {isStaff(account) && ( {switcher && (
{otherAccounts.map(account => renderAccount(account))}
)}
)}


{features.federating && ( )} {features.filters && ( )} {isAdmin(account) && ( )} {features.importAPI && ( )} {(features.federating && features.accountMoving) && ( )}
); }; export default SidebarMenu;