import React, { useMemo, useState } from 'react'; import { Avatar, Box, config, Icon, IconButton, Icons, IconSrc, MenuItem, Text } from 'folds'; import { JoinRule } from 'matrix-js-sdk'; import { PageNav, PageNavContent, PageNavHeader, PageRoot } from '../../components/page'; import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { mxcUrlToHttp } from '../../utils/matrix'; import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; import { useRoomAvatar, useRoomJoinRule, useRoomName } from '../../hooks/useRoomMeta'; import { isOneOnOneRoom } from '../../utils/room'; import { RoomAvatar, RoomIcon } from '../../components/room-avatar'; import { SpaceSettingsPage } from '../../state/spaceSettings'; import { useRoom } from '../../hooks/useRoom'; import { EmojisStickers } from '../common-settings/emojis-stickers'; import { Members } from '../common-settings/members'; import { DeveloperTools } from '../common-settings/developer-tools'; import { General } from './general'; import { Permissions } from './permissions'; type SpaceSettingsMenuItem = { page: SpaceSettingsPage; name: string; icon: IconSrc; }; const useSpaceSettingsMenuItems = (): SpaceSettingsMenuItem[] => useMemo( () => [ { page: SpaceSettingsPage.GeneralPage, name: 'General', icon: Icons.Setting, }, { page: SpaceSettingsPage.MembersPage, name: 'Members', icon: Icons.User, }, { page: SpaceSettingsPage.PermissionsPage, name: 'Permissions', icon: Icons.Lock, }, { page: SpaceSettingsPage.EmojisStickersPage, name: 'Emojis & Stickers', icon: Icons.Smile, }, { page: SpaceSettingsPage.DeveloperToolsPage, name: 'Developer Tools', icon: Icons.Terminal, }, ], [] ); type SpaceSettingsProps = { initialPage?: SpaceSettingsPage; requestClose: () => void; }; export function SpaceSettings({ initialPage, requestClose }: SpaceSettingsProps) { const room = useRoom(); const mx = useMatrixClient(); const useAuthentication = useMediaAuthentication(); // `isOneOnOneRoom` excludes spaces, so this resolves to `false` for the // space-settings drawer — kept on the helper for symmetry with RoomSettings. const roomAvatar = useRoomAvatar(room, isOneOnOneRoom(room)); const roomName = useRoomName(room); const joinRuleContent = useRoomJoinRule(room); const avatarUrl = roomAvatar ? mxcUrlToHttp(mx, roomAvatar, useAuthentication, 96, 96, 'crop') ?? undefined : undefined; const screenSize = useScreenSizeContext(); const [activePage, setActivePage] = useState(() => { if (initialPage) return initialPage; return screenSize === ScreenSize.Mobile ? undefined : SpaceSettingsPage.GeneralPage; }); const menuItems = useSpaceSettingsMenuItems(); const handlePageRequestClose = () => { if (screenSize === ScreenSize.Mobile) { setActivePage(undefined); return; } requestClose(); }; return ( ( )} /> {roomName} {screenSize === ScreenSize.Mobile && ( )}
{menuItems.map((item) => ( } onClick={() => setActivePage(item.page)} > {item.name} ))}
) } > {activePage === SpaceSettingsPage.GeneralPage && ( )} {activePage === SpaceSettingsPage.MembersPage && ( )} {activePage === SpaceSettingsPage.PermissionsPage && ( )} {activePage === SpaceSettingsPage.EmojisStickersPage && ( )} {activePage === SpaceSettingsPage.DeveloperToolsPage && ( )}
); }