From 5cfddd81e0ca1a3a3e4738ca1f5c904789ee082d Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Thu, 11 Apr 2024 11:16:30 +0530 Subject: [PATCH] add join room or space before navigate screen --- src/app/components/room-card/RoomCard.tsx | 1 + .../JoinBeforeNavigate.tsx | 61 +++++++++++++++++++ .../features/join-before-navigate/index.ts | 1 + src/app/organisms/room/Room.tsx | 4 +- src/app/pages/client/space/SpaceProvider.tsx | 6 +- 5 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 src/app/features/join-before-navigate/JoinBeforeNavigate.tsx create mode 100644 src/app/features/join-before-navigate/index.ts diff --git a/src/app/components/room-card/RoomCard.tsx b/src/app/components/room-card/RoomCard.tsx index ccbd297f..517a0ee3 100644 --- a/src/app/components/room-card/RoomCard.tsx +++ b/src/app/components/room-card/RoomCard.tsx @@ -176,6 +176,7 @@ export const RoomCard = as<'div', RoomCardProps>( ( diff --git a/src/app/features/join-before-navigate/JoinBeforeNavigate.tsx b/src/app/features/join-before-navigate/JoinBeforeNavigate.tsx new file mode 100644 index 00000000..2b9c3e50 --- /dev/null +++ b/src/app/features/join-before-navigate/JoinBeforeNavigate.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { Box, Scroll, Text, toRem } from 'folds'; +import { useAtomValue } from 'jotai'; +import { RoomCard } from '../../components/room-card'; +import { RoomTopicViewer } from '../../components/room-topic-viewer'; +import { Page, PageHeader } from '../../components/page'; +import { RoomSummaryLoader } from '../../components/RoomSummaryLoader'; +import { useRoomNavigate } from '../../hooks/useRoomNavigate'; +import { useMatrixClient } from '../../hooks/useMatrixClient'; +import { allRoomsAtom } from '../../state/room-list/roomList'; + +type JoinBeforeNavigateProps = { roomIdOrAlias: string }; +export function JoinBeforeNavigate({ roomIdOrAlias }: JoinBeforeNavigateProps) { + const mx = useMatrixClient(); + const allRooms = useAtomValue(allRoomsAtom); + const { navigateRoom, navigateSpace } = useRoomNavigate(); + + const handleView = (roomId: string) => { + if (mx.getRoom(roomId)?.isSpaceRoom()) { + navigateSpace(roomId); + return; + } + navigateRoom(roomId); + }; + + return ( + + + + + {roomIdOrAlias} + + + + + + + + {(summary) => ( + ( + + )} + onView={handleView} + /> + )} + + + + + + ); +} diff --git a/src/app/features/join-before-navigate/index.ts b/src/app/features/join-before-navigate/index.ts new file mode 100644 index 00000000..9093325c --- /dev/null +++ b/src/app/features/join-before-navigate/index.ts @@ -0,0 +1 @@ +export * from './JoinBeforeNavigate'; diff --git a/src/app/organisms/room/Room.tsx b/src/app/organisms/room/Room.tsx index 2afe3d99..f26b2572 100644 --- a/src/app/organisms/room/Room.tsx +++ b/src/app/organisms/room/Room.tsx @@ -17,6 +17,7 @@ import { } from '../../state/typingMembers'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { useSelectedRoom } from '../../hooks/router/useSelectedRoom'; +import { JoinBeforeNavigate } from '../../features/join-before-navigate'; export type RoomBaseViewProps = { room: Room; @@ -51,11 +52,12 @@ export function RoomBaseView({ room, eventId }: RoomBaseViewProps) { export function RoomViewer() { const mx = useMatrixClient(); + const { roomIdOrAlias } = useParams(); const roomId = useSelectedRoom(); const room = mx.getRoom(roomId); const { eventId } = useParams(); - if (!room || !roomId) return

try joining this room

; + if (!room || !roomId) return ; return ; } diff --git a/src/app/pages/client/space/SpaceProvider.tsx b/src/app/pages/client/space/SpaceProvider.tsx index 5365b78b..b107cc61 100644 --- a/src/app/pages/client/space/SpaceProvider.tsx +++ b/src/app/pages/client/space/SpaceProvider.tsx @@ -1,20 +1,22 @@ import React from 'react'; -import { Outlet } from 'react-router-dom'; +import { Outlet, useParams } from 'react-router-dom'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { useSpaces } from '../../../state/hooks/roomList'; import { allRoomsAtom } from '../../../state/room-list/roomList'; import { useSelectedSpace } from '../../../hooks/router/useSelectedSpace'; import { SpaceProvider } from '../../../hooks/useSpace'; +import { JoinBeforeNavigate } from '../../../features/join-before-navigate'; export function RouteSpaceProvider() { const mx = useMatrixClient(); const joinedSpaces = useSpaces(mx, allRoomsAtom); + const { spaceIdOrAlias } = useParams(); const selectedSpaceId = useSelectedSpace(); const space = mx.getRoom(selectedSpaceId); if (!space || !joinedSpaces.includes(space.roomId)) { - return

TODO: join space screen

; + return ; } return (