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, BellIcon, UserIcon, CogIcon, MagnifyingGlassIcon, } from 'lib/icons' import {TabPurpose, TabPurposeMainPath} from 'state/models/navigation' import {UserAvatar} from '../../com/util/UserAvatar' import {Text} from '../../com/util/text/Text' import {ToggleButton} from '../../com/util/forms/ToggleButton' import {usePalette} from 'lib/hooks/usePalette' import {useAnalytics} from 'lib/analytics' export const Menu = observer(({onClose}: {onClose: () => void}) => { 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) } return ( onNavigate(`/profile/${store.me.handle}`)} style={styles.profileCard}> {store.me.displayName || store.me.handle} @{store.me.handle} onNavigate('/search')}> } size={25} /> Search } size="26" />} label="Home" url="/" /> } size="28" />} label="Notifications" url="/notifications" count={store.me.notifications.unreadCount} /> } size="30" strokeWidth={2} /> } label="Profile" url={`/profile/${store.me.handle}`} /> } size="30" strokeWidth={2} /> } label="Settings" url="/settings" /> } label="Feedback" onPress={onPressFeedback} /> ) }) const styles = StyleSheet.create({ view: { flex: 1, paddingBottom: 90, }, viewMinimalShell: { paddingBottom: 50, }, section: { paddingHorizontal: 10, paddingTop: 10, paddingBottom: 10, borderBottomWidth: 1, }, heading: { paddingVertical: 8, paddingHorizontal: 4, }, profileCard: { flexDirection: 'row', alignItems: 'center', margin: 10, marginBottom: 6, }, profileCardDisplayName: { marginLeft: 12, }, profileCardHandle: { marginLeft: 12, }, searchBtn: { flexDirection: 'row', borderRadius: 8, margin: 10, marginBottom: 0, paddingVertical: 10, paddingHorizontal: 12, }, searchBtnLabel: { marginLeft: 14, fontWeight: 'normal', }, menuItem: { flexDirection: 'row', alignItems: 'center', paddingVertical: 6, paddingLeft: 6, paddingRight: 10, }, menuItemIconWrapper: { width: 36, height: 36, alignItems: 'center', justifyContent: 'center', marginRight: 12, }, menuItemLabel: { flex: 1, fontWeight: 'normal', }, menuItemLabelBold: { flex: 1, fontWeight: 'bold', }, 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: { paddingHorizontal: 10, }, })