import React from 'react' import { Linking, StyleProp, StyleSheet, TouchableOpacity, View, ViewStyle, } from 'react-native' import {observer} from 'mobx-react-lite' import { FontAwesomeIcon, FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' import {s, colors} from 'lib/styles' import {FEEDBACK_FORM_URL} from 'lib/constants' import {useStores} from 'state/index' import { HomeIcon, HomeIconSolid, BellIcon, BellIconSolid, UserIcon, CogIcon, MagnifyingGlassIcon2, MagnifyingGlassIcon2Solid, MoonIcon, } from 'lib/icons' import {TabPurpose, TabPurposeMainPath} from 'state/models/navigation' import {UserAvatar} from '../../com/util/UserAvatar' import {Text} from '../../com/util/text/Text' import {useTheme} from 'lib/ThemeContext' import {usePalette} from 'lib/hooks/usePalette' import {useAnalytics} from 'lib/analytics' export const Menu = observer(({onClose}: {onClose: () => void}) => { const theme = useTheme() const pal = usePalette('default') const store = useStores() const {track} = useAnalytics() // events // = const onNavigate = (url: string) => { track('Menu:ItemClicked', {url}) onClose() if (url === TabPurposeMainPath[TabPurpose.Notifs]) { store.nav.switchTo(TabPurpose.Notifs, true) } else if (url === TabPurposeMainPath[TabPurpose.Search]) { store.nav.switchTo(TabPurpose.Search, true) } else { store.nav.switchTo(TabPurpose.Default, true) if (url !== '/') { store.nav.navigate(url) } } } const onPressFeedback = () => { track('Menu:FeedbackClicked') Linking.openURL(FEEDBACK_FORM_URL) } // rendering // = const MenuItem = ({ icon, label, count, url, bold, onPress, }: { icon: JSX.Element label: string count?: number url?: string bold?: boolean onPress?: () => void }) => ( onNavigate(url || '/')}> {icon} {count ? ( {count} ) : undefined} {label} ) const onDarkmodePress = () => { track('Menu:ItemClicked', {url: '/darkmode'}) store.shell.setDarkMode(!store.shell.darkMode) } const isAtHome = store.nav.tab.current.url === TabPurposeMainPath[TabPurpose.Default] const isAtSearch = store.nav.tab.current.url === TabPurposeMainPath[TabPurpose.Search] const isAtNotifications = store.nav.tab.current.url === TabPurposeMainPath[TabPurpose.Notifs] return ( onNavigate(`/profile/${store.me.handle}`)}> {store.me.displayName || store.me.handle} @{store.me.handle} } size={24} strokeWidth={1.7} /> ) : ( } size={24} strokeWidth={1.7} /> ) } label="Search" url="/search" bold={isAtSearch} /> } size="24" strokeWidth={3.25} fillOpacity={1} /> ) : ( } size="24" strokeWidth={3.25} /> ) } label="Home" url="/" bold={isAtHome} /> } size="24" strokeWidth={1.7} fillOpacity={1} /> ) : ( } size="24" strokeWidth={1.7} /> ) } label="Notifications" url="/notifications" count={store.me.notifications.unreadCount} bold={isAtNotifications} /> } size="26" strokeWidth={1.5} /> } label="Profile" url={`/profile/${store.me.handle}`} /> } size="26" strokeWidth={1.75} /> } label="Settings" url="/settings" /> } strokeWidth={2} /> Feedback ) }) const styles = StyleSheet.create({ view: { flex: 1, paddingTop: 10, paddingBottom: 50, paddingLeft: 30, }, viewDarkMode: { backgroundColor: '#202023', }, profileCardDisplayName: { marginTop: 20, paddingRight: 20, }, profileCardHandle: { marginTop: 4, paddingRight: 20, }, menuItem: { flexDirection: 'row', alignItems: 'center', paddingVertical: 16, paddingRight: 10, }, menuItemIconWrapper: { width: 24, height: 24, alignItems: 'center', justifyContent: 'center', marginRight: 12, }, menuItemCount: { position: 'absolute', right: -6, top: -2, backgroundColor: colors.red3, paddingHorizontal: 4, paddingBottom: 1, borderRadius: 6, }, menuItemCountLabel: { fontSize: 12, fontWeight: 'bold', color: colors.white, }, footer: { flexDirection: 'row', justifyContent: 'space-between', paddingRight: 30, paddingTop: 20, }, footerBtn: { flexDirection: 'row', alignItems: 'center', padding: 10, borderRadius: 25, }, footerBtnDarkMode: { backgroundColor: colors.black, }, footerBtnFeedback: { paddingHorizontal: 24, }, footerBtnFeedbackLight: { backgroundColor: '#DDEFFF', }, footerBtnFeedbackDark: { backgroundColor: colors.blue6, }, })