import React, { useMemo, useState } from 'react'; import { Avatar, Box, config, Icon, IconButton, Icons, IconSrc, MenuItem, Text } from 'folds'; 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'; enum SettingsPages { GeneralPage, AccountPage, NotificationPage, SessionPage, EncryptionPage, EmojisStickersPage, DeveloperToolsPage, AboutPage, } type SettingsMenuItem = { page: SettingsPages; name: string; icon: IconSrc; }; const useSettingsMenuItems = (): SettingsMenuItem[] => useMemo( () => [ { page: SettingsPages.GeneralPage, name: 'General', icon: Icons.Setting, }, { page: SettingsPages.AccountPage, name: 'Account', icon: Icons.User, }, { page: SettingsPages.NotificationPage, name: 'Notifications', icon: Icons.Bell, }, { page: SettingsPages.SessionPage, name: 'Sessions', icon: Icons.Category, }, { page: SettingsPages.EncryptionPage, name: 'Encryption', icon: Icons.ShieldLock, }, { page: SettingsPages.EmojisStickersPage, name: 'Emojis & Stickers', icon: Icons.Smile, }, { page: SettingsPages.DeveloperToolsPage, name: 'Developer Tools', icon: Icons.Terminal, }, { page: SettingsPages.AboutPage, name: 'About', icon: Icons.Info, }, ], [] ); type SettingsProps = { requestClose: () => void; }; export function Settings({ requestClose }: SettingsProps) { 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( screenSize === ScreenSize.Mobile ? undefined : SettingsPages.GeneralPage ); const menuItems = useSettingsMenuItems(); const handlePageRequestClose = () => { if (screenSize === ScreenSize.Mobile) { setActivePage(undefined); return; } requestClose(); }; return ( {nameInitials(displayName)}} /> Settings {screenSize === ScreenSize.Mobile && ( )}
{menuItems.map((item) => ( } onClick={() => setActivePage(item.page)} > {item.name} ))}
) } > {activePage === SettingsPages.GeneralPage && ( )} {activePage === SettingsPages.AccountPage && ( )}
); }