import React from 'react' import {observer} from 'mobx-react-lite' import {StyleSheet, TouchableOpacity, View} from 'react-native' import {PressableWithHover} from 'view/com/util/PressableWithHover' import { useLinkProps, useNavigation, useNavigationState, } from '@react-navigation/native' import { FontAwesomeIcon, FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' import {Text} from 'view/com/util/text/Text' import {UserAvatar} from 'view/com/util/UserAvatar' import {Link} from 'view/com/util/Link' import {usePalette} from 'lib/hooks/usePalette' import {useStores} from 'state/index' import {s, colors} from 'lib/styles' import { HomeIcon, HomeIconSolid, MagnifyingGlassIcon2, MagnifyingGlassIcon2Solid, BellIcon, BellIconSolid, UserIcon, UserIconSolid, CogIcon, CogIconSolid, ComposeIcon2, HandIcon, SatelliteDishIcon, SatelliteDishIconSolid, } from 'lib/icons' import {getCurrentRoute, isTab, isStateAtTabRoot} from 'lib/routes/helpers' import {NavigationProp} from 'lib/routes/types' import {router} from '../../../routes' const ProfileCard = observer(() => { const store = useStores() return ( ) }) function BackBtn() { const pal = usePalette('default') const navigation = useNavigation() const shouldShow = useNavigationState(state => !isStateAtTabRoot(state)) const onPressBack = React.useCallback(() => { if (navigation.canGoBack()) { navigation.goBack() } else { navigation.navigate('Home') } }, [navigation]) if (!shouldShow) { return <> } return ( ) } interface NavItemProps { count?: string href: string icon: JSX.Element iconFilled: JSX.Element label: string } const NavItem = observer( ({count, href, icon, iconFilled, label}: NavItemProps) => { const pal = usePalette('default') const store = useStores() const [pathName] = React.useMemo(() => router.matchPath(href), [href]) const currentRouteInfo = useNavigationState(state => { if (!state) { return {name: 'Home'} } return getCurrentRoute(state) }) let isCurrent = currentRouteInfo.name === 'Profile' ? isTab(currentRouteInfo.name, pathName) && currentRouteInfo.params.name === store.me.handle : isTab(currentRouteInfo.name, pathName) const {onPress} = useLinkProps({to: href}) const onPressWrapped = React.useCallback( (e: React.MouseEvent) => { if (e.ctrlKey || e.metaKey || e.altKey) { return } e.preventDefault() if (isCurrent) { store.emitScreenSoftReset() } else { onPress() } }, [onPress, isCurrent, store], ) return ( {isCurrent ? iconFilled : icon} {typeof count === 'string' && count ? ( {count} ) : null} {label} ) }, ) function ComposeBtn() { const store = useStores() const onPressCompose = () => store.shell.openComposer({}) return ( New Post ) } export const DesktopLeftNav = observer(function DesktopLeftNav() { const store = useStores() const pal = usePalette('default') return ( {store.session.hasSession && } } iconFilled={ } label="Home" /> } iconFilled={ } label="Search" /> } iconFilled={ } label="My Feeds" /> } iconFilled={ } label="Notifications" /> } iconFilled={ } label="Moderation" /> {store.session.hasSession && ( } iconFilled={ } label="Profile" /> )} } iconFilled={ } label="Settings" /> {store.session.hasSession && } ) }) const styles = StyleSheet.create({ leftNav: { position: 'absolute', top: 10, right: 'calc(50vw + 312px)', width: 220, maxHeight: 'calc(100vh - 10px)', overflowY: 'auto', }, profileCard: { marginVertical: 10, width: 90, paddingLeft: 12, }, backBtn: { position: 'absolute', top: 12, right: 12, width: 30, height: 30, }, navItemWrapper: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 12, padding: 12, borderRadius: 8, gap: 10, }, navItemIconWrapper: { alignItems: 'center', justifyContent: 'center', width: 28, height: 28, marginTop: 2, }, navItemCount: { position: 'absolute', top: 0, left: 15, backgroundColor: colors.blue3, color: colors.white, fontSize: 12, fontWeight: 'bold', paddingHorizontal: 4, borderRadius: 6, }, newPostBtn: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', width: 140, borderRadius: 24, paddingVertical: 10, paddingHorizontal: 16, backgroundColor: colors.blue3, marginLeft: 12, marginTop: 20, marginBottom: 10, }, newPostBtnIconWrapper: { marginRight: 8, }, newPostBtnLabel: { color: colors.white, fontSize: 16, fontWeight: 'bold', }, })