mirror of
				https://github.com/cinnyapp/cinny.git
				synced 2025-11-04 14:30:29 +03:00 
			
		
		
		
	add back btn for mobile view (#1861)
This commit is contained in:
		
							parent
							
								
									c62050445b
								
							
						
					
					
						commit
						9cb5c70d51
					
				
					 12 changed files with 370 additions and 100 deletions
				
			
		
							
								
								
									
										86
									
								
								src/app/components/BackRouteHandler.tsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/app/components/BackRouteHandler.tsx
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -87,15 +87,17 @@ export const Page = as<'div'>(({ className, ...props }, ref) => (
 | 
			
		|||
  />
 | 
			
		||||
));
 | 
			
		||||
 | 
			
		||||
export const PageHeader = as<'div'>(({ className, ...props }, ref) => (
 | 
			
		||||
export const PageHeader = as<'div', css.PageHeaderVariants>(
 | 
			
		||||
  ({ className, balance, ...props }, ref) => (
 | 
			
		||||
    <Header
 | 
			
		||||
      as="header"
 | 
			
		||||
      size="600"
 | 
			
		||||
    className={classNames(css.PageHeader, className)}
 | 
			
		||||
      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} />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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({
 | 
			
		||||
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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,12 +32,25 @@ export function JoinBeforeNavigate({
 | 
			
		|||
 | 
			
		||||
  return (
 | 
			
		||||
    <Page>
 | 
			
		||||
      <PageHeader>
 | 
			
		||||
      <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">
 | 
			
		||||
        <Scroll hideTrack visibility="Hover" size="0">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,8 +136,29 @@ 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">
 | 
			
		||||
        {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 && (
 | 
			
		||||
| 
						 | 
				
			
			@ -153,7 +177,15 @@ export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) {
 | 
			
		|||
                </>
 | 
			
		||||
              )}
 | 
			
		||||
            </Box>
 | 
			
		||||
        <Box shrink="No" grow="Yes" basis="No" justifyContent="End">
 | 
			
		||||
          </>
 | 
			
		||||
        )}
 | 
			
		||||
        <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}
 | 
			
		||||
| 
						 | 
				
			
			@ -169,6 +201,7 @@ export function LobbyHeader({ showProfile, powerLevels }: LobbyHeaderProps) {
 | 
			
		|||
                </IconButton>
 | 
			
		||||
              )}
 | 
			
		||||
            </TooltipProvider>
 | 
			
		||||
          )}
 | 
			
		||||
          <TooltipProvider
 | 
			
		||||
            position="Bottom"
 | 
			
		||||
            align="End"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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">
 | 
			
		||||
          {screenSize !== ScreenSize.Mobile && (
 | 
			
		||||
            <Avatar size="300">
 | 
			
		||||
              <RoomAvatar
 | 
			
		||||
                roomId={room.roomId}
 | 
			
		||||
                src={avatarUrl}
 | 
			
		||||
                alt={name}
 | 
			
		||||
                renderFallback={() => (
 | 
			
		||||
                <RoomIcon size="200" joinRule={room.getJoinRule() ?? JoinRule.Restricted} filled />
 | 
			
		||||
                  <RoomIcon
 | 
			
		||||
                    size="200"
 | 
			
		||||
                    joinRule={room.getJoinRule() ?? JoinRule.Restricted}
 | 
			
		||||
                    filled
 | 
			
		||||
                  />
 | 
			
		||||
                )}
 | 
			
		||||
              />
 | 
			
		||||
            </Avatar>
 | 
			
		||||
          )}
 | 
			
		||||
          <Box direction="Column">
 | 
			
		||||
            <Text size={topic ? 'H5' : 'H3'} truncate>
 | 
			
		||||
              {name}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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" 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">
 | 
			
		||||
            <Icon size="400" src={Icons.Category} />
 | 
			
		||||
              {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">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,22 +1,39 @@
 | 
			
		|||
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} />
 | 
			
		||||
      <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">
 | 
			
		||||
        <Scroll ref={scrollRef} hideTrack visibility="Hover">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,13 +229,27 @@ export function Invites() {
 | 
			
		|||
 | 
			
		||||
  return (
 | 
			
		||||
    <Page>
 | 
			
		||||
      <PageHeader>
 | 
			
		||||
        <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
 | 
			
		||||
          <Icon size="400" src={Icons.Mail} />
 | 
			
		||||
      <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">
 | 
			
		||||
        <Scroll hideTrack visibility="Hover">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,13 +552,27 @@ export function Notifications() {
 | 
			
		|||
 | 
			
		||||
  return (
 | 
			
		||||
    <Page>
 | 
			
		||||
      <PageHeader>
 | 
			
		||||
        <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
 | 
			
		||||
          <Icon size="400" src={Icons.Message} />
 | 
			
		||||
      <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>
 | 
			
		||||
 | 
			
		||||
      <Box style={{ position: 'relative' }} grow="Yes">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,13 +28,27 @@ export function SpaceSearch() {
 | 
			
		|||
 | 
			
		||||
  return (
 | 
			
		||||
    <Page>
 | 
			
		||||
      <PageHeader>
 | 
			
		||||
        <Box grow="Yes" justifyContent="Center" alignItems="Center" gap="200">
 | 
			
		||||
          <Icon size="400" src={Icons.Search} />
 | 
			
		||||
      <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">
 | 
			
		||||
        <Scroll ref={scrollRef} hideTrack visibility="Hover">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue