add back btn for mobile view (#1861)
authorAjay Bura <32841439+ajbura@users.noreply.github.com>
Sat, 3 Aug 2024 13:47:53 +0000 (19:17 +0530)
committerGitHub <noreply@github.com>
Sat, 3 Aug 2024 13:47:53 +0000 (23:47 +1000)
12 files changed:
src/app/components/BackRouteHandler.tsx [new file with mode: 0644]
src/app/components/page/Page.tsx
src/app/components/page/style.css.ts
src/app/features/join-before-navigate/JoinBeforeNavigate.tsx
src/app/features/lobby/LobbyHeader.tsx
src/app/features/room/RoomViewHeader.tsx
src/app/pages/client/explore/Featured.tsx
src/app/pages/client/explore/Server.tsx
src/app/pages/client/home/Search.tsx
src/app/pages/client/inbox/Invites.tsx
src/app/pages/client/inbox/Notifications.tsx
src/app/pages/client/space/Search.tsx

diff --git a/src/app/components/BackRouteHandler.tsx b/src/app/components/BackRouteHandler.tsx
new file mode 100644 (file)
index 0000000..fa3d759
--- /dev/null
@@ -0,0 +1,86 @@
+import { ReactNode, useCallback } from 'react';
+import { matchPath, useLocation, useNavigate } from 'react-router-dom';
+import {
+  getDirectPath,
+  getExplorePath,
+  getHomePath,
+  getInboxPath,
+  getSpacePath,
+} from '../pages/pathUtils';
+import { DIRECT_PATH, EXPLORE_PATH, HOME_PATH, INBOX_PATH, SPACE_PATH } from '../pages/paths';
+
+type BackRouteHandlerProps = {
+  children: (onBack: () => void) => ReactNode;
+};
+export function BackRouteHandler({ children }: BackRouteHandlerProps) {
+  const navigate = useNavigate();
+  const location = useLocation();
+
+  const goBack = useCallback(() => {
+    if (
+      matchPath(
+        {
+          path: HOME_PATH,
+          caseSensitive: true,
+          end: false,
+        },
+        location.pathname
+      )
+    ) {
+      navigate(getHomePath());
+      return;
+    }
+    if (
+      matchPath(
+        {
+          path: DIRECT_PATH,
+          caseSensitive: true,
+          end: false,
+        },
+        location.pathname
+      )
+    ) {
+      navigate(getDirectPath());
+      return;
+    }
+    const spaceMatch = matchPath(
+      {
+        path: SPACE_PATH,
+        caseSensitive: true,
+        end: false,
+      },
+      location.pathname
+    );
+    if (spaceMatch?.params.spaceIdOrAlias) {
+      navigate(getSpacePath(spaceMatch.params.spaceIdOrAlias));
+      return;
+    }
+    if (
+      matchPath(
+        {
+          path: EXPLORE_PATH,
+          caseSensitive: true,
+          end: false,
+        },
+        location.pathname
+      )
+    ) {
+      navigate(getExplorePath());
+      return;
+    }
+    if (
+      matchPath(
+        {
+          path: INBOX_PATH,
+          caseSensitive: true,
+          end: false,
+        },
+        location.pathname
+      )
+    ) {
+      navigate(getInboxPath());
+    }
+  }, [navigate, location]);
+
+  return children(goBack);
+}
index 4ccb1ec0d79340e55bb0dfbdd52bd4ed6da25bf1..a8b9ea0446e24fb719f9922d26d4274ce3f88284 100644 (file)
@@ -87,15 +87,17 @@ export const Page = as<'div'>(({ className, ...props }, ref) => (
   />
 ));
 
-export const PageHeader = as<'div'>(({ className, ...props }, ref) => (
-  <Header
-    as="header"
-    size="600"
-    className={classNames(css.PageHeader, className)}
-    {...props}
-    ref={ref}
-  />
-));
+export const PageHeader = as<'div', css.PageHeaderVariants>(
+  ({ className, balance, ...props }, ref) => (
+    <Header
+      as="header"
+      size="600"
+      className={classNames(css.PageHeader({ balance }), className)}
+      {...props}
+      ref={ref}
+    />
+  )
+);
 
 export const PageContent = as<'div'>(({ className, ...props }, ref) => (
   <div className={classNames(css.PageContent, className)} {...props} ref={ref} />
index 4807a22714fc2027e0b45d5fbeca38888ebb9c03..23f2da4941d51e796e1ccaa6f97e92162ce47d83 100644 (file)
@@ -1,4 +1,5 @@
 import { style } from '@vanilla-extract/css';
+import { recipe, RecipeVariants } from '@vanilla-extract/recipes';
 import { DefaultReset, color, config, toRem } from 'folds';
 
 export const PageNav = style({
@@ -33,11 +34,21 @@ export const PageNavContent = style({
   paddingBottom: config.space.S700,
 });
 
-export const PageHeader = style({
-  paddingLeft: config.space.S400,
-  paddingRight: config.space.S200,
-  borderBottomWidth: config.borderWidth.B300,
+export const PageHeader = recipe({
+  base: {
+    paddingLeft: config.space.S400,
+    paddingRight: config.space.S200,
+    borderBottomWidth: config.borderWidth.B300,
+  },
+  variants: {
+    balance: {
+      true: {
+        paddingLeft: config.space.S200,
+      },
+    },
+  },
 });
+export type PageHeaderVariants = RecipeVariants<typeof PageHeader>;
 
 export const PageContent = style([
   DefaultReset,
index 1cec659929ca8cc8f29d25556a3ce440d355751e..028cd560e5c0f372e52ae35dddbdf180e12bf7ca 100644 (file)
@@ -1,5 +1,5 @@
 import React from 'react';
-import { Box, Scroll, Text, toRem } from 'folds';
+import { Box, Icon, IconButton, Icons, Scroll, Text, toRem } from 'folds';
 import { useAtomValue } from 'jotai';
 import { RoomCard } from '../../components/room-card';
 import { RoomTopicViewer } from '../../components/room-topic-viewer';
@@ -8,6 +8,8 @@ import { RoomSummaryLoader } from '../../components/RoomSummaryLoader';
 import { useRoomNavigate } from '../../hooks/useRoomNavigate';
 import { useMatrixClient } from '../../hooks/useMatrixClient';
 import { allRoomsAtom } from '../../state/room-list/roomList';
+import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize';
+import { BackRouteHandler } from '../../components/BackRouteHandler';
 
 type JoinBeforeNavigateProps = { roomIdOrAlias: string; eventId?: string; viaServers?: string[] };
 export function JoinBeforeNavigate({
@@ -18,6 +20,7 @@ export function JoinBeforeNavigate({
   const mx = useMatrixClient();
   const allRooms = useAtomValue(allRoomsAtom);
   const { navigateRoom, navigateSpace } = useRoomNavigate();
+  const screenSize = useScreenSizeContext();
 
   const handleView = (roomId: string) => {
     if (mx.getRoom(roomId)?.isSpaceRoom()) {
@@ -29,11 +32,24 @@ export function JoinBeforeNavigate({
 
   return (
     <Page>
-      <PageHeader>
-        <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
-          <Text size="H3" truncate>
-            {roomIdOrAlias}
-          </Text>
+      <PageHeader balance>
+        <Box grow="Yes" gap="200">
+          <Box shrink="No">
+            {screenSize === ScreenSize.Mobile && (
+              <BackRouteHandler>
+                {(onBack) => (
+                  <IconButton onClick={onBack}>
+                    <Icon src={Icons.ArrowLeft} />
+                  </IconButton>
+                )}
+              </BackRouteHandler>
+            )}
+          </Box>
+          <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
+            <Text size="H3" truncate>
+              {roomIdOrAlias}
+            </Text>
+          </Box>
         </Box>
       </PageHeader>
       <Box grow="Yes">
index e01d3ad500f418063cf55f2055ec9982cc936f18..fa415bd2cd2bde8428d59464e46f770be63b56cb 100644 (file)
@@ -31,6 +31,8 @@ import { IPowerLevels, usePowerLevelsAPI } from '../../hooks/usePowerLevels';
 import { UseStateProvider } from '../../components/UseStateProvider';
 import { LeaveSpacePrompt } from '../../components/leave-space-prompt';
 import { stopPropagation } from '../../utils/keyboard';
+import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize';
+import { BackRouteHandler } from '../../components/BackRouteHandler';
 
 type LobbyMenuProps = {
   roomId: string;
@@ -123,6 +125,7 @@ export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) {
   const space = useSpace();
   const setPeopleDrawer = useSetSetting(settingsAtom, 'isPeopleDrawer');
   const [menuAnchor, setMenuAnchor] = useState<RectCords>();
+  const screenSize = useScreenSizeContext();
 
   const name = useRoomName(space);
   const avatarMxc = useRoomAvatar(space);
@@ -133,42 +136,72 @@ export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) {
   };
 
   return (
-    <PageHeader className={showProfile ? undefined : css.Header}>
+    <PageHeader className={showProfile ? undefined : css.Header} balance>
       <Box grow="Yes" alignItems="Center" gap="200">
-        <Box grow="Yes" basis="No" />
-        <Box justifyContent="Center" alignItems="Center" gap="300">
-          {showProfile && (
-            <>
-              <Avatar size="300">
-                <RoomAvatar
-                  roomId={space.roomId}
-                  src={avatarUrl}
-                  alt={name}
-                  renderFallback={() => <Text size="H4">{nameInitials(name)}</Text>}
-                />
-              </Avatar>
-              <Text size="H3" truncate>
-                {name}
-              </Text>
-            </>
+        {screenSize === ScreenSize.Mobile ? (
+          <>
+            <Box shrink="No">
+              <BackRouteHandler>
+                {(onBack) => (
+                  <IconButton onClick={onBack}>
+                    <Icon src={Icons.ArrowLeft} />
+                  </IconButton>
+                )}
+              </BackRouteHandler>
+            </Box>
+            <Box grow="Yes" justifyContent="Center">
+              {showProfile && (
+                <Text size="H3" truncate>
+                  {name}
+                </Text>
+              )}
+            </Box>
+          </>
+        ) : (
+          <>
+            <Box grow="Yes" basis="No" />
+            <Box justifyContent="Center" alignItems="Center" gap="300">
+              {showProfile && (
+                <>
+                  <Avatar size="300">
+                    <RoomAvatar
+                      roomId={space.roomId}
+                      src={avatarUrl}
+                      alt={name}
+                      renderFallback={() => <Text size="H4">{nameInitials(name)}</Text>}
+                    />
+                  </Avatar>
+                  <Text size="H3" truncate>
+                    {name}
+                  </Text>
+                </>
+              )}
+            </Box>
+          </>
+        )}
+        <Box
+          shrink="No"
+          grow={screenSize === ScreenSize.Mobile ? 'No' : 'Yes'}
+          basis={screenSize === ScreenSize.Mobile ? 'Yes' : 'No'}
+          justifyContent="End"
+        >
+          {screenSize !== ScreenSize.Mobile && (
+            <TooltipProvider
+              position="Bottom"
+              offset={4}
+              tooltip={
+                <Tooltip>
+                  <Text>Members</Text>
+                </Tooltip>
+              }
+            >
+              {(triggerRef) => (
+                <IconButton ref={triggerRef} onClick={() => setPeopleDrawer((drawer) => !drawer)}>
+                  <Icon size="400" src={Icons.User} />
+                </IconButton>
+              )}
+            </TooltipProvider>
           )}
-        </Box>
-        <Box shrink="No" grow="Yes" basis="No" justifyContent="End">
-          <TooltipProvider
-            position="Bottom"
-            offset={4}
-            tooltip={
-              <Tooltip>
-                <Text>Members</Text>
-              </Tooltip>
-            }
-          >
-            {(triggerRef) => (
-              <IconButton ref={triggerRef} onClick={() => setPeopleDrawer((drawer) => !drawer)}>
-                <Icon size="400" src={Icons.User} />
-              </IconButton>
-            )}
-          </TooltipProvider>
           <TooltipProvider
             position="Bottom"
             align="End"
index 709f66c8e112e751cc2d3d363d0d427b592e4220..0b8ef74ea61ca4a51a0f63dccf3bb270e53aa7a8 100644 (file)
@@ -52,6 +52,7 @@ import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize';
 import { stopPropagation } from '../../utils/keyboard';
 import { getMatrixToRoom } from '../../plugins/matrix-to';
 import { getViaServers } from '../../plugins/via-servers';
+import { BackRouteHandler } from '../../components/BackRouteHandler';
 
 type RoomMenuProps = {
   room: Room;
@@ -203,19 +204,36 @@ export function RoomViewHeader() {
   };
 
   return (
-    <PageHeader>
+    <PageHeader balance={screenSize === ScreenSize.Mobile}>
       <Box grow="Yes" gap="300">
+        {screenSize === ScreenSize.Mobile && (
+          <BackRouteHandler>
+            {(onBack) => (
+              <Box shrink="No" alignItems="Center">
+                <IconButton onClick={onBack}>
+                  <Icon src={Icons.ArrowLeft} />
+                </IconButton>
+              </Box>
+            )}
+          </BackRouteHandler>
+        )}
         <Box grow="Yes" alignItems="Center" gap="300">
-          <Avatar size="300">
-            <RoomAvatar
-              roomId={room.roomId}
-              src={avatarUrl}
-              alt={name}
-              renderFallback={() => (
-                <RoomIcon size="200" joinRule={room.getJoinRule() ?? JoinRule.Restricted} filled />
-              )}
-            />
-          </Avatar>
+          {screenSize !== ScreenSize.Mobile && (
+            <Avatar size="300">
+              <RoomAvatar
+                roomId={room.roomId}
+                src={avatarUrl}
+                alt={name}
+                renderFallback={() => (
+                  <RoomIcon
+                    size="200"
+                    joinRule={room.getJoinRule() ?? JoinRule.Restricted}
+                    filled
+                  />
+                )}
+              />
+            </Avatar>
+          )}
           <Box direction="Column">
             <Text size={topic ? 'H5' : 'H3'} truncate>
               {name}
index 4838127f5735d98c9b3acc74599e095b49c026aa..f056cbb5cd6daf8d2dd453547a8c2639b5d06751 100644 (file)
@@ -1,5 +1,5 @@
 import React from 'react';
-import { Box, Icon, Icons, Scroll, Text } from 'folds';
+import { Box, Icon, IconButton, Icons, Scroll, Text } from 'folds';
 import { useAtomValue } from 'jotai';
 import { useClientConfig } from '../../../hooks/useClientConfig';
 import { RoomCard, RoomCardGrid } from '../../../components/room-card';
@@ -9,21 +9,38 @@ import {
   Page,
   PageContent,
   PageContentCenter,
+  PageHeader,
   PageHero,
   PageHeroSection,
 } from '../../../components/page';
 import { RoomTopicViewer } from '../../../components/room-topic-viewer';
 import * as css from './style.css';
 import { useRoomNavigate } from '../../../hooks/useRoomNavigate';
+import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize';
+import { BackRouteHandler } from '../../../components/BackRouteHandler';
 
 export function FeaturedRooms() {
   const { featuredCommunities } = useClientConfig();
   const { rooms, spaces } = featuredCommunities ?? {};
   const allRooms = useAtomValue(allRoomsAtom);
+  const screenSize = useScreenSizeContext();
   const { navigateSpace, navigateRoom } = useRoomNavigate();
 
   return (
     <Page>
+      {screenSize === ScreenSize.Mobile && (
+        <PageHeader>
+          <Box shrink="No">
+            <BackRouteHandler>
+              {(onBack) => (
+                <IconButton onClick={onBack}>
+                  <Icon src={Icons.ArrowLeft} />
+                </IconButton>
+              )}
+            </BackRouteHandler>
+          </Box>
+        </PageHeader>
+      )}
       <Box grow="Yes">
         <Scroll hideTrack visibility="Hover">
           <PageContent>
index 1a81c225fcf718668622ea6d144995723f11e58a..1f493df17f516cd77409609a59579965668c4a1e 100644 (file)
@@ -13,6 +13,7 @@ import {
   Button,
   Chip,
   Icon,
+  IconButton,
   Icons,
   Input,
   Line,
@@ -42,6 +43,8 @@ import { allRoomsAtom } from '../../../state/room-list/roomList';
 import { useRoomNavigate } from '../../../hooks/useRoomNavigate';
 import { getMxIdServer } from '../../../utils/matrix';
 import { stopPropagation } from '../../../utils/keyboard';
+import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize';
+import { BackRouteHandler } from '../../../components/BackRouteHandler';
 
 const useServerSearchParams = (searchParams: URLSearchParams): ExploreServerPathSearchParams =>
   useMemo(
@@ -344,6 +347,7 @@ export function PublicRooms() {
   const userServer = userId && getMxIdServer(userId);
   const allRooms = useAtomValue(allRoomsAtom);
   const { navigateSpace, navigateRoom } = useRoomNavigate();
+  const screenSize = useScreenSizeContext();
 
   const [searchParams] = useSearchParams();
   const serverSearchParams = useServerSearchParams(searchParams);
@@ -466,7 +470,7 @@ export function PublicRooms() {
 
   return (
     <Page>
-      <PageHeader>
+      <PageHeader balance>
         {isSearch ? (
           <>
             <Box grow="Yes" basis="No">
@@ -482,20 +486,34 @@ export function PublicRooms() {
             </Box>
 
             <Box grow="No" justifyContent="Center" alignItems="Center" gap="200">
-              <Icon size="400" src={Icons.Search} />
+              {screenSize !== ScreenSize.Mobile && <Icon size="400" src={Icons.Search} />}
               <Text size="H3" truncate>
                 Search
               </Text>
             </Box>
-            <Box grow="Yes" />
+            <Box grow="Yes" basis="No" />
           </>
         ) : (
-          <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
-            <Icon size="400" src={Icons.Category} />
-            <Text size="H3" truncate>
-              {server}
-            </Text>
-          </Box>
+          <>
+            <Box grow="Yes" basis="No">
+              {screenSize === ScreenSize.Mobile && (
+                <BackRouteHandler>
+                  {(onBack) => (
+                    <IconButton onClick={onBack}>
+                      <Icon src={Icons.ArrowLeft} />
+                    </IconButton>
+                  )}
+                </BackRouteHandler>
+              )}
+            </Box>
+            <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
+              {screenSize !== ScreenSize.Mobile && <Icon size="400" src={Icons.Category} />}
+              <Text size="H3" truncate>
+                {server}
+              </Text>
+            </Box>
+            <Box grow="Yes" basis="No" />
+          </>
         )}
       </PageHeader>
       <Box grow="Yes">
index af7b1eb9a1e0dfa98da839e19d7c102c6cd0aab5..d5ddfb778a21b62d6750ead8cb564a31323586a5 100644 (file)
@@ -1,21 +1,38 @@
 import React, { useRef } from 'react';
-import { Box, Icon, Icons, Text, Scroll } from 'folds';
+import { Box, Icon, Icons, Text, Scroll, IconButton } from 'folds';
 import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page';
 import { MessageSearch } from '../../../features/message-search';
 import { useHomeRooms } from './useHomeRooms';
+import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize';
+import { BackRouteHandler } from '../../../components/BackRouteHandler';
 
 export function HomeSearch() {
   const scrollRef = useRef<HTMLDivElement>(null);
   const rooms = useHomeRooms();
+  const screenSize = useScreenSizeContext();
 
   return (
     <Page>
-      <PageHeader>
-        <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
-          <Icon size="400" src={Icons.Search} />
-          <Text size="H3" truncate>
-            Message Search
-          </Text>
+      <PageHeader balance>
+        <Box grow="Yes" alignItems="Center" gap="200">
+          <Box grow="Yes" basis="No">
+            {screenSize === ScreenSize.Mobile && (
+              <BackRouteHandler>
+                {(onBack) => (
+                  <IconButton onClick={onBack}>
+                    <Icon src={Icons.ArrowLeft} />
+                  </IconButton>
+                )}
+              </BackRouteHandler>
+            )}
+          </Box>
+          <Box justifyContent="Center" alignItems="Center" gap="200">
+            {screenSize !== ScreenSize.Mobile && <Icon size="400" src={Icons.Search} />}
+            <Text size="H3" truncate>
+              Message Search
+            </Text>
+          </Box>
+          <Box grow="Yes" basis="No" />
         </Box>
       </PageHeader>
       <Box style={{ position: 'relative' }} grow="Yes">
index 06e5f6c6be147519e11ac2b5ab508b82d8140a81..18993081b0deed1d29c33102ae36966ec69c3a1e 100644 (file)
@@ -4,6 +4,7 @@ import {
   Box,
   Button,
   Icon,
+  IconButton,
   Icons,
   Overlay,
   OverlayBackdrop,
@@ -39,6 +40,8 @@ import { RoomTopicViewer } from '../../../components/room-topic-viewer';
 import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback';
 import { useRoomNavigate } from '../../../hooks/useRoomNavigate';
 import { useRoomTopic } from '../../../hooks/useRoomMeta';
+import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize';
+import { BackRouteHandler } from '../../../components/BackRouteHandler';
 
 const COMPACT_CARD_WIDTH = 548;
 
@@ -205,6 +208,7 @@ export function Invites() {
     useCallback(() => containerRef.current, []),
     useCallback((width) => setCompact(width <= COMPACT_CARD_WIDTH), [])
   );
+  const screenSize = useScreenSizeContext();
 
   const { navigateRoom, navigateSpace } = useRoomNavigate();
 
@@ -225,12 +229,26 @@ export function Invites() {
 
   return (
     <Page>
-      <PageHeader>
-        <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
-          <Icon size="400" src={Icons.Mail} />
-          <Text size="H3" truncate>
-            Invitations
-          </Text>
+      <PageHeader balance>
+        <Box grow="Yes" gap="200">
+          <Box grow="Yes" basis="No">
+            {screenSize === ScreenSize.Mobile && (
+              <BackRouteHandler>
+                {(onBack) => (
+                  <IconButton onClick={onBack}>
+                    <Icon src={Icons.ArrowLeft} />
+                  </IconButton>
+                )}
+              </BackRouteHandler>
+            )}
+          </Box>
+          <Box alignItems="Center" gap="200">
+            {screenSize !== ScreenSize.Mobile && <Icon size="400" src={Icons.Mail} />}
+            <Text size="H3" truncate>
+              Invitations
+            </Text>
+          </Box>
+          <Box grow="Yes" basis="No" />
         </Box>
       </PageHeader>
       <Box grow="Yes">
index 3425b51940e75204dcab74d90e1f1e42474f9706..6a8160d868b848c509d54fda544214dd5d3c510d 100644 (file)
@@ -78,6 +78,8 @@ import { UserAvatar } from '../../../components/user-avatar';
 import { EncryptedContent } from '../../../features/room/message';
 import { useMentionClickHandler } from '../../../hooks/useMentionClickHandler';
 import { useSpoilerClickHandler } from '../../../hooks/useSpoilerClickHandler';
+import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize';
+import { BackRouteHandler } from '../../../components/BackRouteHandler';
 
 type RoomNotificationsGroup = {
   roomId: string;
@@ -484,6 +486,7 @@ export function Notifications() {
   const mx = useMatrixClient();
   const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad');
   const [urlPreview] = useSetting(settingsAtom, 'urlPreview');
+  const screenSize = useScreenSizeContext();
 
   const { navigateRoom } = useRoomNavigate();
   const [searchParams, setSearchParams] = useSearchParams();
@@ -549,12 +552,26 @@ export function Notifications() {
 
   return (
     <Page>
-      <PageHeader>
-        <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
-          <Icon size="400" src={Icons.Message} />
-          <Text size="H3" truncate>
-            Notification Messages
-          </Text>
+      <PageHeader balance>
+        <Box grow="Yes" gap="200">
+          <Box grow="Yes" basis="No">
+            {screenSize === ScreenSize.Mobile && (
+              <BackRouteHandler>
+                {(onBack) => (
+                  <IconButton onClick={onBack}>
+                    <Icon src={Icons.ArrowLeft} />
+                  </IconButton>
+                )}
+              </BackRouteHandler>
+            )}
+          </Box>
+          <Box alignItems="Center" gap="200">
+            {screenSize !== ScreenSize.Mobile && <Icon size="400" src={Icons.Message} />}
+            <Text size="H3" truncate>
+              Notification Messages
+            </Text>
+          </Box>
+          <Box grow="Yes" basis="No" />
         </Box>
       </PageHeader>
 
index 6e7ac57d445c55c9144f327d9b6b91cba19587c4..017262b5b879b49bf83e54c84874b5b6d4598d90 100644 (file)
@@ -1,5 +1,5 @@
 import React, { useRef } from 'react';
-import { Box, Icon, Icons, Text, Scroll } from 'folds';
+import { Box, Icon, Icons, Text, Scroll, IconButton } from 'folds';
 import { useAtomValue } from 'jotai';
 import { Page, PageContent, PageContentCenter, PageHeader } from '../../../components/page';
 import { MessageSearch } from '../../../features/message-search';
@@ -9,11 +9,14 @@ import { allRoomsAtom } from '../../../state/room-list/roomList';
 import { mDirectAtom } from '../../../state/mDirectList';
 import { roomToParentsAtom } from '../../../state/room/roomToParents';
 import { useMatrixClient } from '../../../hooks/useMatrixClient';
+import { ScreenSize, useScreenSizeContext } from '../../../hooks/useScreenSize';
+import { BackRouteHandler } from '../../../components/BackRouteHandler';
 
 export function SpaceSearch() {
   const mx = useMatrixClient();
   const scrollRef = useRef<HTMLDivElement>(null);
   const space = useSpace();
+  const screenSize = useScreenSizeContext();
 
   const mDirects = useAtomValue(mDirectAtom);
   const roomToParents = useAtomValue(roomToParentsAtom);
@@ -25,12 +28,26 @@ export function SpaceSearch() {
 
   return (
     <Page>
-      <PageHeader>
-        <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
-          <Icon size="400" src={Icons.Search} />
-          <Text size="H3" truncate>
-            Message Search
-          </Text>
+      <PageHeader balance>
+        <Box grow="Yes" alignItems="Center" gap="200">
+          <Box grow="Yes" basis="No">
+            {screenSize === ScreenSize.Mobile && (
+              <BackRouteHandler>
+                {(onBack) => (
+                  <IconButton onClick={onBack}>
+                    <Icon src={Icons.ArrowLeft} />
+                  </IconButton>
+                )}
+              </BackRouteHandler>
+            )}
+          </Box>
+          <Box justifyContent="Center" alignItems="Center" gap="200">
+            {screenSize !== ScreenSize.Mobile && <Icon size="400" src={Icons.Search} />}
+            <Text size="H3" truncate>
+              Message Search
+            </Text>
+          </Box>
+          <Box grow="Yes" basis="No" />
         </Box>
       </PageHeader>
       <Box style={{ position: 'relative' }} grow="Yes">