Add mobile camera drawer to separate component

This commit is contained in:
Nicolas Mowen 2024-03-27 10:38:10 -06:00
parent 18988a0f8c
commit 9b8485c551
2 changed files with 50 additions and 30 deletions

View File

@ -0,0 +1,41 @@
import { useState } from "react";
import { Drawer, DrawerContent, DrawerTrigger } from "../ui/drawer";
import { Button } from "../ui/button";
import { FaVideo } from "react-icons/fa";
type MobileCameraDrawerProps = {
allCameras: string[];
selected: string;
onSelectCamera: (cam: string) => void;
};
export default function MobileCameraDrawer({
allCameras,
selected,
onSelectCamera,
}: MobileCameraDrawerProps) {
const [cameraDrawer, setCameraDrawer] = useState(false);
return (
<Drawer open={cameraDrawer} onOpenChange={setCameraDrawer}>
<DrawerTrigger asChild>
<Button className="rounded-lg capitalize" size="sm" variant="secondary">
<FaVideo className="text-muted-foreground" />
</Button>
</DrawerTrigger>
<DrawerContent className="max-h-[75dvh] overflow-hidden flex flex-col items-center gap-2">
{allCameras.map((cam) => (
<div
key={cam}
className={`w-full mx-4 py-2 text-center capitalize ${cam == selected ? "bg-secondary rounded-lg" : ""}`}
onClick={() => {
onSelectCamera(cam);
setCameraDrawer(false);
}}
>
{cam.replaceAll("_", " ")}
</div>
))}
</DrawerContent>
</Drawer>
);
}

View File

@ -1,5 +1,4 @@
import ReviewCard from "@/components/card/ReviewCard"; import ReviewCard from "@/components/card/ReviewCard";
import FilterCheckBox from "@/components/filter/FilterCheckBox";
import ReviewFilterGroup from "@/components/filter/ReviewFilterGroup"; import ReviewFilterGroup from "@/components/filter/ReviewFilterGroup";
import ExportDialog from "@/components/overlay/ExportDialog"; import ExportDialog from "@/components/overlay/ExportDialog";
import PreviewPlayer, { import PreviewPlayer, {
@ -9,7 +8,6 @@ import { DynamicVideoController } from "@/components/player/dynamic/DynamicVideo
import DynamicVideoPlayer from "@/components/player/dynamic/DynamicVideoPlayer"; import DynamicVideoPlayer from "@/components/player/dynamic/DynamicVideoPlayer";
import MotionReviewTimeline from "@/components/timeline/MotionReviewTimeline"; import MotionReviewTimeline from "@/components/timeline/MotionReviewTimeline";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Drawer, DrawerContent, DrawerTrigger } from "@/components/ui/drawer";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
import { useOverlayState } from "@/hooks/use-overlay-state"; import { useOverlayState } from "@/hooks/use-overlay-state";
import { ExportMode } from "@/types/filter"; import { ExportMode } from "@/types/filter";
@ -31,12 +29,12 @@ import {
useState, useState,
} from "react"; } from "react";
import { isDesktop, isMobile } from "react-device-detect"; import { isDesktop, isMobile } from "react-device-detect";
import { FaCircle, FaVideo } from "react-icons/fa";
import { IoMdArrowRoundBack } from "react-icons/io"; import { IoMdArrowRoundBack } from "react-icons/io";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { Toaster } from "@/components/ui/sonner"; import { Toaster } from "@/components/ui/sonner";
import useSWR from "swr"; import useSWR from "swr";
import { TimeRange } from "@/types/timeline"; import { TimeRange } from "@/types/timeline";
import MobileCameraDrawer from "@/components/overlay/MobileCameraDrawer";
const SEGMENT_DURATION = 30; const SEGMENT_DURATION = 30;
type TimelineType = "timeline" | "events"; type TimelineType = "timeline" | "events";
@ -70,7 +68,6 @@ export function RecordingView({
const [mainCamera, setMainCamera] = useState(startCamera); const [mainCamera, setMainCamera] = useState(startCamera);
const mainControllerRef = useRef<DynamicVideoController | null>(null); const mainControllerRef = useRef<DynamicVideoController | null>(null);
const previewRefs = useRef<{ [camera: string]: PreviewController }>({}); const previewRefs = useRef<{ [camera: string]: PreviewController }>({});
const [cameraDrawer, setCameraDrawer] = useState(false);
const [playbackStart, setPlaybackStart] = useState(startTime); const [playbackStart, setPlaybackStart] = useState(startTime);
@ -231,32 +228,14 @@ export function RecordingView({
</Button> </Button>
<div className="flex items-center justify-end gap-2"> <div className="flex items-center justify-end gap-2">
{isMobile && ( {isMobile && (
<Drawer open={cameraDrawer} onOpenChange={setCameraDrawer}> <MobileCameraDrawer
<DrawerTrigger asChild> allCameras={allCameras}
<Button selected={mainCamera}
className="rounded-lg capitalize" onSelectCamera={(cam) => {
size="sm"
variant="secondary"
>
<FaVideo className="text-muted-foreground" />
</Button>
</DrawerTrigger>
<DrawerContent className="max-h-[75dvh] overflow-hidden flex flex-col items-center gap-2">
{allCameras.map((cam) => (
<div
key={cam}
className={`w-full mx-4 py-2 text-center capitalize ${cam == mainCamera ? "bg-secondary rounded-lg" : ""}`}
onClick={() => {
setPlaybackStart(currentTime); setPlaybackStart(currentTime);
setMainCamera(cam); setMainCamera(cam);
setCameraDrawer(false);
}} }}
> />
{cam.replaceAll("_", " ")}
</div>
))}
</DrawerContent>
</Drawer>
)} )}
<ExportDialog <ExportDialog
camera={mainCamera} camera={mainCamera}