import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Avatar, Box, Button, config, Icon, IconButton, Icons, IconSrc, MenuItem, Overlay, OverlayBackdrop, OverlayCenter, Text, } from 'folds'; import FocusTrap from 'focus-trap-react'; import { General } from './general'; import { PageNav, PageNavContent, PageNavHeader, PageRoot } from '../../components/page'; import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; import { Account } from './account'; import { useUserProfile } from '../../hooks/useUserProfile'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { getMxIdLocalPart, mxcUrlToHttp } from '../../utils/matrix'; import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; import { UserAvatar } from '../../components/user-avatar'; import { nameInitials } from '../../utils/common'; import { Notifications } from './notifications'; import { Devices } from './devices'; import { EmojisStickers } from './emojis-stickers'; import { DeveloperTools } from './developer-tools'; import { About } from './about'; import { UseStateProvider } from '../../components/UseStateProvider'; import { stopPropagation } from '../../utils/keyboard'; import { LogoutDialog } from '../../components/LogoutDialog'; export enum SettingsPages { GeneralPage, AccountPage, NotificationPage, DevicesPage, EmojisStickersPage, DeveloperToolsPage, AboutPage, } type SettingsMenuItem = { page: SettingsPages; nameKey: string; icon: IconSrc; }; const SETTINGS_MENU_ITEMS: SettingsMenuItem[] = [ { page: SettingsPages.GeneralPage, nameKey: 'Settings.menu_general', icon: Icons.Setting }, { page: SettingsPages.AccountPage, nameKey: 'Settings.menu_account', icon: Icons.User }, { page: SettingsPages.NotificationPage, nameKey: 'Settings.menu_notifications', icon: Icons.Bell, }, { page: SettingsPages.DevicesPage, nameKey: 'Settings.menu_devices', icon: Icons.Monitor }, { page: SettingsPages.EmojisStickersPage, nameKey: 'Settings.menu_emojis_stickers', icon: Icons.Smile, }, { page: SettingsPages.DeveloperToolsPage, nameKey: 'Settings.menu_developer_tools', icon: Icons.Terminal, }, { page: SettingsPages.AboutPage, nameKey: 'Settings.menu_about', icon: Icons.Info }, ]; type SettingsProps = { initialPage?: SettingsPages; requestClose: () => void; }; export function Settings({ initialPage, requestClose }: SettingsProps) { const { t } = useTranslation(); const mx = useMatrixClient(); const useAuthentication = useMediaAuthentication(); const userId = mx.getUserId()!; const profile = useUserProfile(userId); const displayName = profile.displayName ?? getMxIdLocalPart(userId) ?? userId; const avatarUrl = profile.avatarUrl ? mxcUrlToHttp(mx, profile.avatarUrl, useAuthentication, 96, 96, 'crop') ?? undefined : undefined; const screenSize = useScreenSizeContext(); const [activePage, setActivePage] = useState(() => { if (initialPage) return initialPage; return screenSize === ScreenSize.Mobile ? undefined : SettingsPages.GeneralPage; }); const menuItems = SETTINGS_MENU_ITEMS; const handlePageRequestClose = () => { if (screenSize === ScreenSize.Mobile) { setActivePage(undefined); return; } requestClose(); }; return ( {nameInitials(displayName)}} /> {t('Settings.title')} {screenSize === ScreenSize.Mobile && ( )}
{menuItems.map((item) => ( } onClick={() => setActivePage(item.page)} > {t(item.nameKey)} ))}
{(logout, setLogout) => ( <> {logout && ( }> setLogout(false), clickOutsideDeactivates: true, escapeDeactivates: stopPropagation, }} > setLogout(false)} /> )} )}
) } > {activePage === SettingsPages.GeneralPage && ( )} {activePage === SettingsPages.AccountPage && ( )} {activePage === SettingsPages.NotificationPage && ( )} {activePage === SettingsPages.DevicesPage && ( )} {activePage === SettingsPages.EmojisStickersPage && ( )} {activePage === SettingsPages.DeveloperToolsPage && ( )} {activePage === SettingsPages.AboutPage && }
); }