diff --git a/src/app/(modules)/upload/components/ProcessedVideoDialog.tsx b/src/app/(modules)/upload/components/ProcessedVideoDialog.tsx deleted file mode 100644 index 107ca72..0000000 --- a/src/app/(modules)/upload/components/ProcessedVideoDialog.tsx +++ /dev/null @@ -1,53 +0,0 @@ -'use client'; - -import { Loader2 } from 'lucide-react'; - -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from '@/components/ui/dialog'; -import { useAnnotatedVideoQuery } from '@/app/(modules)/results/hooks/useVideoResults'; -import type { UploadVideo } from '@/types'; - -interface ProcessedVideoDialogProps { - upload: UploadVideo | null; - open: boolean; - onOpenChange: (open: boolean) => void; -} - -export function ProcessedVideoDialog({ - upload, - open, - onOpenChange, -}: ProcessedVideoDialogProps) { - const { videoUrl, isLoading, isError } = useAnnotatedVideoQuery( - open ? upload?.processed_video_url ?? undefined : undefined, - ); - - return ( - - - - {upload?.filename ?? 'Processed Video'} - Processed video preview - - -
- {isLoading ? ( - - ) : isError || !videoUrl ? ( -

- Processed video is not available. -

- ) : ( -
-
-
- ); -} - diff --git a/src/app/(modules)/upload/components/UploadActionsMenu.tsx b/src/app/(modules)/upload/components/UploadActionsMenu.tsx index 89f25df..8e7d964 100644 --- a/src/app/(modules)/upload/components/UploadActionsMenu.tsx +++ b/src/app/(modules)/upload/components/UploadActionsMenu.tsx @@ -13,14 +13,14 @@ import type { UploadVideo } from '@/types'; interface UploadActionsMenuProps { upload: UploadVideo; + onViewVideo: (upload: UploadVideo) => void; onViewDetails: (upload: UploadVideo) => void; - onViewProcessedVideo: (upload: UploadVideo) => void; } export function UploadActionsMenu({ upload, + onViewVideo, onViewDetails, - onViewProcessedVideo, }: UploadActionsMenuProps) { return ( @@ -37,16 +37,26 @@ export function UploadActionsMenu({ - onViewDetails(upload)}> + {upload.video_url ? ( + { + event.stopPropagation(); + onViewVideo(upload); + }} + > + + View Video + + ) : null} + { + event.stopPropagation(); + onViewDetails(upload); + }} + > View Details - {upload.processed_video_url ? ( - onViewProcessedVideo(upload)}> - - View Processed Video - - ) : null} ); diff --git a/src/app/(modules)/upload/components/UploadCardGrid.tsx b/src/app/(modules)/upload/components/UploadCardGrid.tsx index ebbc280..6423f9f 100644 --- a/src/app/(modules)/upload/components/UploadCardGrid.tsx +++ b/src/app/(modules)/upload/components/UploadCardGrid.tsx @@ -21,8 +21,8 @@ interface UploadCardGridProps { onLimitChange: (limit: number) => void; onUploadNew: () => void; onOpenUpload: (upload: UploadVideo) => void; + onViewVideo: (upload: UploadVideo) => void; onViewDetails: (upload: UploadVideo) => void; - onViewProcessedVideo: (upload: UploadVideo) => void; } export function UploadCardGrid({ @@ -35,8 +35,8 @@ export function UploadCardGrid({ onLimitChange, onUploadNew, onOpenUpload, + onViewVideo, onViewDetails, - onViewProcessedVideo, }: UploadCardGridProps) { const skeletonItems = Array.from({ length: Math.min(limit, 20) }); @@ -85,8 +85,8 @@ export function UploadCardGrid({ diff --git a/src/app/(modules)/upload/components/UploadColumns.tsx b/src/app/(modules)/upload/components/UploadColumns.tsx index cd15ecc..8bbaa4a 100644 --- a/src/app/(modules)/upload/components/UploadColumns.tsx +++ b/src/app/(modules)/upload/components/UploadColumns.tsx @@ -10,13 +10,13 @@ import { Badge } from '@/components/ui/badge'; import type { UploadVideo } from '@/types'; interface UseUploadColumnsProps { + onViewVideo: (upload: UploadVideo) => void; onViewDetails: (upload: UploadVideo) => void; - onViewProcessedVideo: (upload: UploadVideo) => void; } export function useUploadColumns({ + onViewVideo, onViewDetails, - onViewProcessedVideo, }: UseUploadColumnsProps) { return useMemo[]>( () => [ @@ -65,13 +65,13 @@ export function useUploadColumns({
), }, ], - [onViewDetails, onViewProcessedVideo], + [onViewDetails, onViewVideo], ); } diff --git a/src/app/(modules)/upload/components/UploadVideoDialog.tsx b/src/app/(modules)/upload/components/UploadVideoDialog.tsx new file mode 100644 index 0000000..6ca09b4 --- /dev/null +++ b/src/app/(modules)/upload/components/UploadVideoDialog.tsx @@ -0,0 +1,44 @@ +'use client'; + +import { ProtectedVideoPlayer } from '@/components/media/ProtectedVideoPlayer'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import type { UploadVideo } from '@/types'; + +interface UploadVideoDialogProps { + upload: UploadVideo | null; + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export function UploadVideoDialog({ + upload, + open, + onOpenChange, +}: UploadVideoDialogProps) { + return ( + + + + + Video Preview + + + {upload?.filename ?? 'Uploaded video'} + + + + + + + ); +} diff --git a/src/app/(modules)/upload/page.tsx b/src/app/(modules)/upload/page.tsx index 11ac0e1..6f44623 100644 --- a/src/app/(modules)/upload/page.tsx +++ b/src/app/(modules)/upload/page.tsx @@ -8,11 +8,11 @@ import { Button } from '@/components/ui/button'; import type { UploadVideo } from '@/types'; import { CreateUploadDialog } from './components/CreateUploadDialog'; -import { ProcessedVideoDialog } from './components/ProcessedVideoDialog'; import { UploadCardGrid } from './components/UploadCardGrid'; import { useUploadColumns } from './components/UploadColumns'; import { UploadDetailsDialog } from './components/UploadDetailsDialog'; import { UploadTable } from './components/UploadTable'; +import { UploadVideoDialog } from './components/UploadVideoDialog'; import { ViewSwitcher } from './components/ViewSwitcher'; import { useUploadFilters } from './hooks/useUploadFilters'; import { useMyUploadsQuery } from './hooks/useUploadQueries'; @@ -23,9 +23,7 @@ export default function UploadPage() { const uploadsQuery = useMyUploadsQuery({ skip, limit }); const [isCreateOpen, setIsCreateOpen] = useState(false); const [detailsUpload, setDetailsUpload] = useState(null); - const [processedUpload, setProcessedUpload] = useState( - null, - ); + const [videoUpload, setVideoUpload] = useState(null); const uploads = uploadsQuery.data?.items ?? []; const total = uploadsQuery.data?.total ?? 0; @@ -35,24 +33,22 @@ export default function UploadPage() { setDetailsUpload(upload); }, []); - const handleViewProcessedVideo = useCallback((upload: UploadVideo) => { - setProcessedUpload(upload); + const handleViewUploadVideo = useCallback((upload: UploadVideo) => { + setVideoUpload(upload); }, []); const handleOpenUpload = useCallback( (upload: UploadVideo) => { - if (upload.processed_video_url) { - handleViewProcessedVideo(upload); - return; + if (upload.video_url) { + handleViewUploadVideo(upload); } - handleViewDetails(upload); }, - [handleViewDetails, handleViewProcessedVideo], + [handleViewUploadVideo], ); const columns = useUploadColumns({ + onViewVideo: handleViewUploadVideo, onViewDetails: handleViewDetails, - onViewProcessedVideo: handleViewProcessedVideo, }); return ( @@ -85,8 +81,8 @@ export default function UploadPage() { onLimitChange={setLimit} onUploadNew={() => setIsCreateOpen(true)} onOpenUpload={handleOpenUpload} + onViewVideo={handleViewUploadVideo} onViewDetails={handleViewDetails} - onViewProcessedVideo={handleViewProcessedVideo} /> ) : ( - { - if (!open) setProcessedUpload(null); + if (!open) setVideoUpload(null); }} /> diff --git a/src/components/media/ProtectedVideoPlayer.tsx b/src/components/media/ProtectedVideoPlayer.tsx index b8c47af..0cc7c74 100644 --- a/src/components/media/ProtectedVideoPlayer.tsx +++ b/src/components/media/ProtectedVideoPlayer.tsx @@ -1,8 +1,7 @@ 'use client'; -import { Video } from 'lucide-react'; +import { Loader2, Video } from 'lucide-react'; -import { Skeleton } from '@/components/ui/skeleton'; import { useProtectedMediaObjectUrl } from '@/hooks/useProtectedMedia'; import { cn } from '@/lib/utils'; @@ -39,9 +38,20 @@ export function ProtectedVideoPlayer({ if (isLoading) { return ( - +
+ +
+

Loading video

+

+ Preparing secure playback... +

+
+
); } diff --git a/src/types/upload.ts b/src/types/upload.ts index 7c489e9..fce6cc8 100644 --- a/src/types/upload.ts +++ b/src/types/upload.ts @@ -13,6 +13,7 @@ export interface UploadVideo { uploaded_at: string; uploaded_by_user_id?: number | null; uploaded_by_email?: string | null; + video_url?: string | null; processed_video_path?: string | null; processed_video_url?: string | null; status: UploadVideoStatus; @@ -22,4 +23,3 @@ export interface UploadVideosResponse { items: UploadVideo[]; total: number; } -