import React from 'react'; import { useTranslation } from 'react-i18next'; import { ChevronRight, CreditCard, FileText, HelpCircle, User, X } from 'lucide-react'; import { XStack, YStack } from '@tamagui/stacks'; import { SizableText as Text } from '@tamagui/text'; import { Pressable } from '@tamagui/react-native-web-lite'; import { ListItem } from '@tamagui/list-item'; import { YGroup } from '@tamagui/group'; import { Switch } from '@tamagui/switch'; import { Separator } from 'tamagui'; import { useAppearance } from '@/hooks/use-appearance'; import { ADMIN_BILLING_PATH, ADMIN_DATA_EXPORTS_PATH, ADMIN_FAQ_PATH, ADMIN_PROFILE_ACCOUNT_PATH, adminPath } from '../../constants'; import { useAdminTheme } from '../theme'; import { MobileSelect } from './FormControls'; type UserMenuSheetProps = { open: boolean; onClose: () => void; user?: { name?: string | null; email?: string | null; avatar_url?: string | null }; isMember: boolean; navigate: (path: string) => void; }; const MENU_WIDTH = 320; export function UserMenuSheet({ open, onClose, user, isMember, navigate }: UserMenuSheetProps) { const { t, i18n } = useTranslation('management'); const theme = useAdminTheme(); const { appearance, resolved, updateAppearance } = useAppearance(); const [language, setLanguage] = React.useState(() => (i18n.language?.startsWith('en') ? 'en' : 'de')); React.useEffect(() => { setLanguage(i18n.language?.startsWith('en') ? 'en' : 'de'); }, [i18n.language]); const isDark = resolved === 'dark'; const handleNavigate = (path: string) => { onClose(); navigate(path); }; const menuItems = [ { label: t('mobileProfile.account', 'Account bearbeiten'), icon: User, path: ADMIN_PROFILE_ACCOUNT_PATH, show: true, }, { label: t('billing.sections.packages.title', 'Pakete'), icon: CreditCard, path: adminPath('/mobile/billing#packages'), show: !isMember, }, { label: t('billing.sections.invoices.title', 'Rechnungen & Zahlungen'), icon: CreditCard, path: adminPath('/mobile/billing#invoices'), show: !isMember, }, { label: t('dataExports.title', 'Datenexporte'), icon: FileText, path: ADMIN_DATA_EXPORTS_PATH, show: !isMember, }, { label: t('common.help', 'Help'), icon: HelpCircle, path: ADMIN_FAQ_PATH, show: true, }, ].filter((item) => item.show); return ( {t('mobileProfile.title', 'Profil')} {user?.name?.charAt(0)?.toUpperCase() ?? 'U'} {user?.name ?? t('events.members.roles.guest', 'Guest')} {user?.email ?? ''} {t('mobileProfile.settings', 'Einstellungen')} {menuItems.map((item) => ( handleNavigate(item.path)} title={ {item.label} } iconAfter={} /> ))} {t('settings.appearance.title', 'Darstellung')} {t('mobileProfile.language', 'Sprache')} } iconAfter={ { const lng = event.target.value; setLanguage(lng); void i18n.changeLanguage(lng); }} compact style={{ minWidth: 120 }} > } /> {t('mobileProfile.theme', 'Dark Mode')} } iconAfter={ updateAppearance(next ? 'dark' : 'light')} aria-label={t('mobileProfile.theme', 'Dark Mode')} > } /> {appearance === 'system' ? ( {t('mobileProfile.themeSystem', 'System')} ) : null} ); }