diff --git a/web/src/views/classification/ModelSelectionView.tsx b/web/src/views/classification/ModelSelectionView.tsx index b91ea5648..b993feb86 100644 --- a/web/src/views/classification/ModelSelectionView.tsx +++ b/web/src/views/classification/ModelSelectionView.tsx @@ -1,31 +1,54 @@ import { baseUrl } from "@/api/baseUrl"; import ActivityIndicator from "@/components/indicators/activity-indicator"; +import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; +import useOptimisticState from "@/hooks/use-optimistic-state"; import { cn } from "@/lib/utils"; import { CustomClassificationModelConfig, FrigateConfig, } from "@/types/frigateConfig"; -import { useMemo } from "react"; +import { useMemo, useState } from "react"; import { isMobile } from "react-device-detect"; +import { useTranslation } from "react-i18next"; import useSWR from "swr"; +const allModelTypes = ["objects", "states"] as const; +type ModelType = (typeof allModelTypes)[number]; + type ModelSelectionViewProps = { onClick: (model: CustomClassificationModelConfig) => void; }; export default function ModelSelectionView({ onClick, }: ModelSelectionViewProps) { + const { t } = useTranslation(["views/classificationModel"]); + const [page, setPage] = useState("objects"); + const [pageToggle, setPageToggle] = useOptimisticState(page, setPage, 100); const { data: config } = useSWR("config", { revalidateOnFocus: false, }); + // data + const classificationConfigs = useMemo(() => { if (!config) { return []; } - return Object.values(config.classification.custom); - }, [config]); + const allModels = Object.values(config.classification.custom); + + return allModels.filter((model) => { + if (pageToggle == "objects" && model.object_config != undefined) { + return true; + } + + if (pageToggle == "states" && model.state_config != undefined) { + return true; + } + + return false; + }); + }, [config, pageToggle]); if (!config) { return ; @@ -36,14 +59,47 @@ export default function ModelSelectionView({ } return ( -
- {classificationConfigs.map((config) => ( - onClick(config)} - /> - ))} +
+
+
+ { + if (value) { + // Restrict viewer navigation + setPageToggle(value); + } + }} + > + {allModelTypes.map((item) => ( + +
{t("menu." + item)}
+
+ ))} +
+
+
+
+ {classificationConfigs.map((config) => ( + onClick(config)} + /> + ))} +
); } @@ -94,10 +150,7 @@ function ModelCard({ config, onClick }: ModelCardProps) { /> ))}
-
- {config.name} ({config.state_config != null ? "State" : "Object"}{" "} - Classification) -
+
{config.name}
); }