diff --git a/src/app/features/create-space/CreateSpaceModal.tsx b/src/app/features/create-space/CreateSpaceModal.tsx new file mode 100644 index 00000000..c1bc6898 --- /dev/null +++ b/src/app/features/create-space/CreateSpaceModal.tsx @@ -0,0 +1,95 @@ +import React from 'react'; +import { + Box, + config, + Header, + Icon, + IconButton, + Icons, + Modal, + Overlay, + OverlayBackdrop, + OverlayCenter, + Scroll, + Text, +} from 'folds'; +import FocusTrap from 'focus-trap-react'; +import { useAllJoinedRoomsSet, useGetRoom } from '../../hooks/useGetRoom'; +import { SpaceProvider } from '../../hooks/useSpace'; +import { CreateSpaceForm } from './CreateSpace'; +import { + useCloseCreateSpaceModal, + useCreateSpaceModalState, +} from '../../state/hooks/createSpaceModal'; +import { CreateSpaceModalState } from '../../state/createSpaceModal'; +import { stopPropagation } from '../../utils/keyboard'; + +type CreateSpaceModalProps = { + state: CreateSpaceModalState; +}; +function CreateSpaceModal({ state }: CreateSpaceModalProps) { + const { spaceId } = state; + const closeDialog = useCloseCreateSpaceModal(); + + const allJoinedRooms = useAllJoinedRoomsSet(); + const getRoom = useGetRoom(allJoinedRooms); + const space = spaceId ? getRoom(spaceId) : undefined; + + return ( + + }> + + + + +
+ + New Space + + + + + + +
+ + + + + +
+
+
+
+
+
+ ); +} + +export function CreateSpaceModalRenderer() { + const state = useCreateSpaceModalState(); + + if (!state) return null; + return ; +} diff --git a/src/app/features/create-space/index.ts b/src/app/features/create-space/index.ts index 2cfe6657..d203993b 100644 --- a/src/app/features/create-space/index.ts +++ b/src/app/features/create-space/index.ts @@ -1 +1,2 @@ export * from './CreateSpace'; +export * from './CreateSpaceModal'; diff --git a/src/app/features/lobby/SpaceItem.tsx b/src/app/features/lobby/SpaceItem.tsx index e9e26adf..72830de4 100644 --- a/src/app/features/lobby/SpaceItem.tsx +++ b/src/app/features/lobby/SpaceItem.tsx @@ -30,11 +30,12 @@ import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; import * as css from './SpaceItem.css'; import * as styleCss from './style.css'; import { useDraggableItem } from './DnD'; -import { openCreateRoom, openSpaceAddExisting } from '../../../client/action/navigation'; +import { openSpaceAddExisting } from '../../../client/action/navigation'; import { stopPropagation } from '../../utils/keyboard'; import { mxcUrlToHttp } from '../../utils/matrix'; import { useMediaAuthentication } from '../../hooks/useMediaAuthentication'; import { useOpenCreateRoomModal } from '../../state/hooks/createRoomModal'; +import { useOpenCreateSpaceModal } from '../../state/hooks/createSpaceModal'; function SpaceProfileLoading() { return ( @@ -305,13 +306,14 @@ function AddRoomButton({ item }: { item: HierarchyItem }) { function AddSpaceButton({ item }: { item: HierarchyItem }) { const [cords, setCords] = useState(); + const openCreateSpaceModal = useOpenCreateSpaceModal(); const handleAddSpace: MouseEventHandler = (evt) => { setCords(evt.currentTarget.getBoundingClientRect()); }; const handleCreateSpace = () => { - openCreateRoom(true, item.roomId as any); + openCreateSpaceModal(item.roomId as any); setCords(undefined); }; diff --git a/src/app/pages/Router.tsx b/src/app/pages/Router.tsx index 8950e66e..d6d93aa4 100644 --- a/src/app/pages/Router.tsx +++ b/src/app/pages/Router.tsx @@ -65,6 +65,7 @@ import { SpaceSettingsRenderer } from '../features/space-settings'; import { CreateRoomModalRenderer } from '../features/create-room'; import { HomeCreateRoom } from './client/home/CreateRoom'; import { Create } from './client/create'; +import { CreateSpaceModalRenderer } from '../features/create-space'; export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) => { const { hashRouter } = clientConfig; @@ -130,6 +131,7 @@ export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) + diff --git a/src/app/pages/client/create/Create.tsx b/src/app/pages/client/create/Create.tsx index c27bd95b..288169b6 100644 --- a/src/app/pages/client/create/Create.tsx +++ b/src/app/pages/client/create/Create.tsx @@ -8,8 +8,11 @@ import { PageHeroSection, } from '../../../components/page'; import { CreateSpaceForm } from '../../../features/create-space'; +import { useRoomNavigate } from '../../../hooks/useRoomNavigate'; export function Create() { + const { navigateSpace } = useRoomNavigate(); + return ( @@ -23,7 +26,7 @@ export function Create() { title="Create Space" subTitle="Build a space for your community." /> - + diff --git a/src/app/state/createSpaceModal.ts b/src/app/state/createSpaceModal.ts new file mode 100644 index 00000000..fe4db755 --- /dev/null +++ b/src/app/state/createSpaceModal.ts @@ -0,0 +1,7 @@ +import { atom } from 'jotai'; + +export type CreateSpaceModalState = { + spaceId?: string; +}; + +export const createSpaceModalAtom = atom(undefined); diff --git a/src/app/state/hooks/createSpaceModal.ts b/src/app/state/hooks/createSpaceModal.ts new file mode 100644 index 00000000..ea7cb47a --- /dev/null +++ b/src/app/state/hooks/createSpaceModal.ts @@ -0,0 +1,34 @@ +import { useCallback } from 'react'; +import { useAtomValue, useSetAtom } from 'jotai'; +import { createSpaceModalAtom, CreateSpaceModalState } from '../createSpaceModal'; + +export const useCreateSpaceModalState = (): CreateSpaceModalState | undefined => { + const data = useAtomValue(createSpaceModalAtom); + + return data; +}; + +type CloseCallback = () => void; +export const useCloseCreateSpaceModal = (): CloseCallback => { + const setSettings = useSetAtom(createSpaceModalAtom); + + const close: CloseCallback = useCallback(() => { + setSettings(undefined); + }, [setSettings]); + + return close; +}; + +type OpenCallback = (space?: string) => void; +export const useOpenCreateSpaceModal = (): OpenCallback => { + const setSettings = useSetAtom(createSpaceModalAtom); + + const open: OpenCallback = useCallback( + (spaceId) => { + setSettings({ spaceId }); + }, + [setSettings] + ); + + return open; +};