diff --git a/web/public/locales/en/views/settings.json b/web/public/locales/en/views/settings.json index 627326cd2..9db71f2b5 100644 --- a/web/public/locales/en/views/settings.json +++ b/web/public/locales/en/views/settings.json @@ -220,7 +220,17 @@ "notConnected": "Not Connected", "featuresTitle": "Features", "go2rtc": "Reduce connections to camera", - "detectRoleWarning": "At least one stream must have the \"detect\" role to proceed." + "detectRoleWarning": "At least one stream must have the \"detect\" role to proceed.", + "rolesPopover": { + "title": "Stream Roles", + "detect": "Main feed for object detection.", + "record": "Saves segments of the video feed based on configuration settings.", + "audio": "Feed for audio based detection." + }, + "featuresPopover": { + "title": "Stream Features", + "description": "Use go2rtc restreaming to reduce connections to your camera." + } }, "step3": { "description": "Final validation and bandwidth analysis before saving your camera configuration.", diff --git a/web/src/components/settings/Step2StreamConfig.tsx b/web/src/components/settings/Step2StreamConfig.tsx index 03bc6dbc1..c108fed35 100644 --- a/web/src/components/settings/Step2StreamConfig.tsx +++ b/web/src/components/settings/Step2StreamConfig.tsx @@ -17,6 +17,14 @@ import { } from "@/types/cameraWizard"; import { Label } from "../ui/label"; import { FaCircleCheck } from "react-icons/fa6"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { LuInfo, LuExternalLink } from "react-icons/lu"; +import { Link } from "react-router-dom"; +import { useDocDomain } from "@/hooks/use-doc-domain"; type Step2StreamConfigProps = { wizardData: Partial; @@ -33,7 +41,8 @@ export default function Step2StreamConfig({ onNext, canProceed, }: Step2StreamConfigProps) { - const { t } = useTranslation(["views/settings"]); + const { t } = useTranslation(["views/settings", "components/dialog"]); + const { getLocaleDocUrl } = useDocDomain(); const [testingStreams, setTestingStreams] = useState>(new Set()); const streams = useMemo(() => wizardData.streams || [], [wizardData.streams]); @@ -312,7 +321,50 @@ export default function Step2StreamConfig({ )}
- +
+ + + + + + +
+
+ {t("cameraWizard.step2.rolesPopover.title")} +
+
+
+ detect -{" "} + {t("cameraWizard.step2.rolesPopover.detect")} +
+
+ record -{" "} + {t("cameraWizard.step2.rolesPopover.record")} +
+
+ audio -{" "} + {t("cameraWizard.step2.rolesPopover.audio")} +
+
+
+ + {t("readTheDocumentation", { ns: "common" })} + + +
+
+
+
+
{(["detect", "record", "audio"] as const).map((role) => { @@ -339,9 +391,41 @@ export default function Step2StreamConfig({
- +
+ + + + + + +
+
+ {t("cameraWizard.step2.featuresPopover.title")} +
+
+ {t("cameraWizard.step2.featuresPopover.description")} +
+
+ + {t("readTheDocumentation", { ns: "common" })} + + +
+
+
+
+