/** * VideoStreamingPage Component * * Main page component for the video streaming feature. * Demonstrates how to compose the modular components together. */ import React, { useState, useMemo } from 'react'; import { VideoList, VideoModal } from './components'; import { type VideoFile, type VideoListFilters, type VideoListSortOptions } from './types'; export const VideoStreamingPage: React.FC = () => { const [selectedVideo, setSelectedVideo] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [filters, setFilters] = useState({}); const [sortOptions, setSortOptions] = useState({ field: 'created_at', direction: 'desc', }); // Available cameras for filtering (this could come from an API) const availableCameras = ['camera1', 'camera2', 'camera3']; // This should be fetched from your camera API const handleVideoSelect = (video: VideoFile) => { setSelectedVideo(video); setIsModalOpen(true); }; const handleModalClose = () => { setIsModalOpen(false); setSelectedVideo(null); }; const handleCameraFilterChange = (cameraName: string) => { setFilters(prev => ({ ...prev, cameraName: cameraName === 'all' ? undefined : cameraName, })); }; const handleSortChange = (field: VideoListSortOptions['field'], direction: VideoListSortOptions['direction']) => { setSortOptions({ field, direction }); }; const handleDateRangeChange = (start: string, end: string) => { setFilters(prev => ({ ...prev, dateRange: start && end ? { start, end } : undefined, })); }; return (
{/* Header */}

Video Library

Browse and view recorded videos from your camera system

{/* Filters and Controls */}
{/* Camera Filter */}
{/* Sort Options */}
{/* Date Range Filter */}
handleDateRangeChange(e.target.value, filters.dateRange?.end || '')} className="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" /> handleDateRangeChange(filters.dateRange?.start || '', e.target.value)} className="flex-1 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
{/* Clear Filters */} {(filters.cameraName || filters.dateRange) && (
)}
{/* Video List */}
{/* Video Modal */}
); };