From 93d0f7353f5d3ff8414f30d2448dff42d2c7c8da Mon Sep 17 00:00:00 2001 From: Matt Hillsdon Date: Mon, 30 Sep 2024 15:24:02 +0100 Subject: [PATCH 01/19] Prep for home page work --- src/components/DefaultPageLayout.tsx | 142 +++++++++-------- src/components/ResourceCard.tsx | 46 ++++++ src/components/ResourceCardPlaceholder.tsx | 34 +++++ src/components/YoutubeVideoEmbed.tsx | 34 +++++ src/deployment/default/fonts.ts | 5 +- src/hooks/project-hooks.tsx | 45 +++--- src/pages/DataSamplesPage.tsx | 9 +- src/pages/HomePage.tsx | 169 ++++++++++++--------- src/pages/TestingModelPage.tsx | 9 +- 9 files changed, 319 insertions(+), 174 deletions(-) create mode 100644 src/components/ResourceCard.tsx create mode 100644 src/components/ResourceCardPlaceholder.tsx create mode 100644 src/components/YoutubeVideoEmbed.tsx diff --git a/src/components/DefaultPageLayout.tsx b/src/components/DefaultPageLayout.tsx index fe7d86404..af9e02c1c 100644 --- a/src/components/DefaultPageLayout.tsx +++ b/src/components/DefaultPageLayout.tsx @@ -11,16 +11,16 @@ import { VStack, } from "@chakra-ui/react"; import { ReactNode, useCallback, useEffect } from "react"; -import { RiDownload2Line, RiFolderOpenLine, RiHome2Line } from "react-icons/ri"; +import { RiDownload2Line, RiHome2Line } from "react-icons/ri"; import { FormattedMessage, useIntl } from "react-intl"; import { useNavigate } from "react-router"; import { TOOL_NAME } from "../constants"; import { flags } from "../flags"; import { useProject } from "../hooks/project-hooks"; -import { SaveStep, TrainModelDialogStage } from "../model"; +import { TrainModelDialogStage } from "../model"; import { SessionPageId } from "../pages-config"; import Tour from "../pages/Tour"; -import { useSettings, useStore } from "../store"; +import { useStore } from "../store"; import { createHomePageUrl, createSessionPageUrl } from "../urls"; import ActionBar from "./ActionBar"; import AppLogo from "./AppLogo"; @@ -28,8 +28,6 @@ import ConnectionDialogs from "./ConnectionFlowDialogs"; import DownloadDialogs from "./DownloadDialogs"; import HelpMenu from "./HelpMenu"; import LanguageMenuItem from "./LanguageMenuItem"; -import LoadProjectMenuItem from "./LoadProjectMenuItem"; -import OpenButton from "./OpenButton"; import PrototypeVersionWarning from "./PrototypeVersionWarning"; import SaveDialogs from "./SaveDialogs"; import SettingsMenu from "./SettingsMenu"; @@ -40,28 +38,23 @@ interface DefaultPageLayoutProps { titleId?: string; children: ReactNode; toolbarItemsLeft?: ReactNode; + toolbarItemsRight?: ReactNode; + menuItems?: ReactNode; showPageTitle?: boolean; - showHomeButton?: boolean; - showSaveButton?: boolean; - showOpenButton?: boolean; } const DefaultPageLayout = ({ titleId, children, + menuItems, toolbarItemsLeft, + toolbarItemsRight, showPageTitle = false, - showHomeButton = false, - showSaveButton = false, - showOpenButton = false, }: DefaultPageLayoutProps) => { const intl = useIntl(); const navigate = useNavigate(); const isEditorOpen = useStore((s) => s.isEditorOpen); const stage = useStore((s) => s.trainModelDialogStage); - - const { saveHex } = useProject(); - const [settings] = useSettings(); const toast = useToast(); useEffect(() => { @@ -91,19 +84,6 @@ const DefaultPageLayout = ({ ); }, [intl, navigate, toast]); - const handleHomeClick = useCallback(() => { - navigate(createHomePageUrl()); - }, [navigate]); - - const setSave = useStore((s) => s.setSave); - const handleSave = useCallback(() => { - if (settings.showPreSaveHelp) { - setSave({ step: SaveStep.PreSaveHelp }); - } else { - void saveHex(); - } - }, [saveHex, setSave, settings.showPreSaveHelp]); - return ( <> {/* Suppress dialogs to prevent overlapping dialogs */} @@ -138,26 +118,7 @@ const DefaultPageLayout = ({ itemsRight={ <> - {showOpenButton && } - {showSaveButton && ( - - )} - {showHomeButton && ( - } - aria-label={intl.formatMessage({ id: "homepage.Link" })} - variant="plain" - size="lg" - fontSize="xl" - /> - )} + {toolbarItemsRight} @@ -166,31 +127,7 @@ const DefaultPageLayout = ({ variant="plain" label={intl.formatMessage({ id: "main-menu" })} > - {showOpenButton && ( - } - accept=".hex" - > - - - )} - {showSaveButton && ( - } - > - - - )} - - {showHomeButton && ( - } - > - - - )} + {menuItems} @@ -205,4 +142,65 @@ const DefaultPageLayout = ({ ); }; +export const ProjectToolbarItems = () => { + const intl = useIntl(); + const { saveHex } = useProject(); + const navigate = useNavigate(); + const handleSave = useCallback(() => { + void saveHex(); + }, [saveHex]); + const handleHomeClick = useCallback(() => { + navigate(createHomePageUrl()); + }, [navigate]); + + return ( + <> + + } + aria-label={intl.formatMessage({ id: "homepage.Link" })} + variant="plain" + size="lg" + fontSize="xl" + /> + + ); +}; + +export const ProjectMenuItems = () => { + const { saveHex } = useProject(); + const navigate = useNavigate(); + const handleSave = useCallback(() => { + void saveHex(); + }, [saveHex]); + const handleHomeClick = useCallback(() => { + navigate(createHomePageUrl()); + }, [navigate]); + + return ( + <> + } + > + + + + } + > + + + + ); +}; + export default DefaultPageLayout; diff --git a/src/components/ResourceCard.tsx b/src/components/ResourceCard.tsx new file mode 100644 index 000000000..b69017952 --- /dev/null +++ b/src/components/ResourceCard.tsx @@ -0,0 +1,46 @@ +import { + AspectRatio, + HStack, + Heading, + Image, + LinkBox, + LinkOverlay, + VStack, +} from "@chakra-ui/react"; +import { ReactNode } from "react"; +import Link from "./Link"; + +interface ResourceCardProps { + url: string; + imgSrc: string; + title: ReactNode; +} + +const ResourceCard = ({ imgSrc, url, title }: ResourceCardProps) => { + return ( + + + + + + + + + {title} + + + + + + ); +}; + +export default ResourceCard; diff --git a/src/components/ResourceCardPlaceholder.tsx b/src/components/ResourceCardPlaceholder.tsx new file mode 100644 index 000000000..7738b0acf --- /dev/null +++ b/src/components/ResourceCardPlaceholder.tsx @@ -0,0 +1,34 @@ +import { AspectRatio, Box, Text, VStack } from "@chakra-ui/react"; + +const ResourceCardPlaceholder = () => { + return ( + + + + + + + More soon + + + ); +}; + +export default ResourceCardPlaceholder; diff --git a/src/components/YoutubeVideoEmbed.tsx b/src/components/YoutubeVideoEmbed.tsx new file mode 100644 index 000000000..8df16fb07 --- /dev/null +++ b/src/components/YoutubeVideoEmbed.tsx @@ -0,0 +1,34 @@ +import { AspectRatio, Box } from "@chakra-ui/react"; + +export interface YoutubeVideo { + alt: string; + youtubeId: string; +} + +interface YoutubeVideoProps { + alt: string; + youtubeId: string; +} + +const YoutubeVideoEmbed = ({ alt, youtubeId }: YoutubeVideoProps) => { + return ( + + +