From 164fb99ace43d45636779bceb642b22249259c8d Mon Sep 17 00:00:00 2001 From: Timo K Date: Mon, 15 Jun 2026 14:42:45 +0200 Subject: [PATCH] refactor using enum vs jsx node --- src/AppBar.tsx | 47 ++++++++++++++++++++++++++---------------- src/room/LobbyView.tsx | 5 ++--- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/AppBar.tsx b/src/AppBar.tsx index 978ca2e67..071ad397a 100644 --- a/src/AppBar.tsx +++ b/src/AppBar.tsx @@ -18,7 +18,11 @@ import { type ReactNode, } from "react"; import { Heading, IconButton, Tooltip } from "@vector-im/compound-web"; -import { CollapseIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; +import { + ArrowLeftIcon, + ChevronLeftIcon, + CollapseIcon, +} from "@vector-im/compound-design-tokens/assets/web/icons"; import { useTranslation } from "react-i18next"; import { logger } from "matrix-js-sdk/lib/logger"; @@ -29,9 +33,7 @@ import styles from "./AppBar.module.css"; interface AppBarContext { setTitle: (value: string) => void; setSecondaryButton: (value: ReactNode) => void; - setPrimaryButtonIcon: ( - value: ComponentType> | null, - ) => void; + setPrimaryButtonIconKind: (value: "back" | "minimise") => void; setHidden: (value: boolean) => void; } @@ -57,20 +59,22 @@ export const AppBar: FC = ({ children }) => { const [secondaryButton, setSecondaryButton] = useState( null, ); - const [PrimaryButtonIcon, setPrimaryButtonIcon] = useState - > | null>(null); + const [primaryButtonIcon, setPrimaryButtonIconKind] = useState< + "back" | "minimise" + >("minimise"); const context = useMemo( () => ({ setTitle, setSecondaryButton, setHidden, - setPrimaryButtonIcon, + setPrimaryButtonIconKind, }), - [setTitle, setHidden, setSecondaryButton, setPrimaryButtonIcon], + [setTitle, setHidden, setSecondaryButton, setPrimaryButtonIconKind], ); + const BackIcon = platform === "android" ? ArrowLeftIcon : ChevronLeftIcon; + return ( <>
= ({ children }) => { > - - {PrimaryButtonIcon ? ( - + + {primaryButtonIcon === "back" ? ( + ) : ( )} @@ -128,14 +137,16 @@ export function useAppBarTitle(title: string): void { * React hook which sets the title to be shown in the app bar, if present. It is * an error to call this hook from multiple sites in the same component tree. */ -export function useAppBarPrimaryButtonIcon(icon: typeof CollapseIcon): void { - const setIcon = use(AppBarContext)?.setPrimaryButtonIcon; +export function useAppBarPrimaryButtonIconKind( + icon: "back" | "minimise", +): void { + const setIconKind = use(AppBarContext)?.setPrimaryButtonIconKind; useEffect(() => { - if (setIcon !== undefined) { - setIcon(icon); - return (): void => setIcon(null); + if (setIconKind !== undefined) { + setIconKind(icon); + return (): void => setIconKind("minimise"); } - }, [setIcon, icon]); + }, [setIconKind, icon]); } /** diff --git a/src/room/LobbyView.tsx b/src/room/LobbyView.tsx index 65dd0d68c..f4fef5fe9 100644 --- a/src/room/LobbyView.tsx +++ b/src/room/LobbyView.tsx @@ -26,7 +26,6 @@ import { } from "livekit-client"; import { useObservableEagerState } from "observable-hooks"; import { useNavigate } from "react-router-dom"; -import { ArrowLeftIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import inCallStyles from "./InCallView.module.css"; import styles from "./LobbyView.module.css"; @@ -54,7 +53,7 @@ import { createLobbyFooterViewModel } from "../components/CallFooterViewModel"; import { type ViewModel } from "../state/ViewModel"; import { useAppBarHidden, - useAppBarPrimaryButtonIcon, + useAppBarPrimaryButtonIconKind, useAppBarTitle, } from "../AppBar"; @@ -95,7 +94,7 @@ export const LobbyView: FC = ({ useAppBarHidden(false); useAppBarTitle(matrixInfo.roomName); - useAppBarPrimaryButtonIcon(ArrowLeftIcon); + useAppBarPrimaryButtonIconKind("back"); const audioEnabled = useBehavior(muteStates.audio.enabled$); const videoEnabled = useBehavior(muteStates.video.enabled$); const toggleAudio = useBehavior(muteStates.audio.toggle$);