phanpy/src/components/menu.jsx

127 lines
3.7 KiB
React
Raw Normal View History

2023-02-16 09:51:54 +00:00
import { Menu, MenuDivider, MenuItem } from '@szhsin/react-menu';
2023-02-12 09:38:50 +00:00
import { useSnapshot } from 'valtio';
2023-02-10 16:05:18 +00:00
import { api } from '../utils/api';
import states from '../utils/states';
import Icon from './icon';
2023-02-16 09:51:54 +00:00
import MenuLink from './MenuLink';
function NavMenu(props) {
2023-02-12 09:38:50 +00:00
const snapStates = useSnapshot(states);
2023-02-11 11:39:30 +00:00
const { instance, authenticated } = api();
// Home = Following
// But when in multi-column mode, Home becomes columns of anything
// User may choose pin or not to pin Following
// If user doesn't pin Following, we show it in the menu
const showFollowing =
snapStates.settings.shortcutsColumnsMode &&
!snapStates.shortcuts.find((pin) => pin.type === 'following');
return (
<Menu
2023-02-10 16:05:18 +00:00
portal={{
target: document.body,
}}
{...props}
overflow="auto"
2023-02-10 22:25:38 +00:00
viewScroll="close"
boundingBoxPadding="8 8 8 8"
menuButton={
<button type="button" class="button plain">
<Icon icon="menu" size="l" />
</button>
}
>
2023-02-28 07:27:42 +00:00
{!!snapStates.appVersion?.commitHash &&
__COMMIT_HASH__ !== snapStates.appVersion.commitHash && (
<>
<MenuItem
onClick={() => {
const yes = confirm('Reload page now to update?');
if (yes) {
(async () => {
try {
location.reload();
} catch (e) {}
})();
}
}}
>
<Icon icon="sparkles" size="l" />{' '}
<span>New update available</span>
</MenuItem>
<MenuDivider />
</>
)}
<MenuLink to="/">
<Icon icon="home" size="l" /> <span>Home</span>
</MenuLink>
2023-02-11 11:39:30 +00:00
{authenticated && (
<>
{showFollowing && (
<MenuLink to="/following">
<Icon icon="following" size="l" /> <span>Following</span>
</MenuLink>
)}
2023-02-11 11:39:30 +00:00
<MenuLink to="/notifications">
<Icon icon="notification" size="l" /> <span>Notifications</span>
2023-02-12 09:38:50 +00:00
{snapStates.notificationsShowNew && (
<sup title="New" style={{ opacity: 0.5 }}>
{' '}
&bull;
</sup>
)}
2023-02-11 11:39:30 +00:00
</MenuLink>
<MenuDivider />
<MenuLink to="/l">
<Icon icon="list" size="l" /> <span>Lists</span>
</MenuLink>
<MenuLink to="/ft">
<Icon icon="hashtag" size="l" /> <span>Followed Hashtags</span>
</MenuLink>
<MenuLink to="/b">
<Icon icon="bookmark" size="l" /> <span>Bookmarks</span>
</MenuLink>
<MenuLink to="/f">
<Icon icon="heart" size="l" /> <span>Favourites</span>
</MenuLink>
</>
)}
2023-02-10 16:05:18 +00:00
<MenuDivider />
<MenuLink to={`/search`}>
2023-02-10 16:05:18 +00:00
<Icon icon="search" size="l" /> <span>Search</span>
</MenuLink>
2023-02-10 16:05:18 +00:00
<MenuLink to={`/${instance}/p/l`}>
<Icon icon="group" size="l" /> <span>Local</span>
</MenuLink>
<MenuLink to={`/${instance}/p`}>
<Icon icon="earth" size="l" /> <span>Federated</span>
</MenuLink>
2023-02-11 11:39:30 +00:00
{authenticated && (
<>
<MenuDivider />
2023-02-16 09:51:54 +00:00
<MenuItem
onClick={() => {
states.showShortcutsSettings = true;
}}
>
<Icon icon="shortcut" size="l" />{' '}
<span>Shortcuts Settings&hellip;</span>
</MenuItem>
2023-02-11 11:39:30 +00:00
<MenuItem
onClick={() => {
states.showSettings = true;
}}
>
2023-02-16 09:51:54 +00:00
<Icon icon="gear" size="l" /> <span>Settings&hellip;</span>
2023-02-11 11:39:30 +00:00
</MenuItem>
</>
)}
</Menu>
);
}
export default NavMenu;