import React, { useEffect, useState } from 'react'; import axios from "axios"; import AppLayout from '@/Layouts/AppLayout'; import { Video, Channel } from "@/types"; import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; import {faDownload, faFileVideo, faFont} from "@fortawesome/free-solid-svg-icons"; import { router } from '@inertiajs/core'; import { Link, Head } from '@inertiajs/react'; import classNames from 'classnames'; import useRoute from '@/Hooks/useRoute'; import {MultiSelect} from "@/Components/MultiSelect"; import { format } from 'date-fns'; export default function Videos() { const route = useRoute(); const [videos, setVideos] = useState([]); const [channels, setChannels] = useState([]); const [distinctLanguages, setDistinctLanguages] = useState([]); const [loadingChannels, setLoadingChannels] = useState(true); const [loadingVideos, setLoadingVideos] = useState(true); // Filter states const [selectedChannelIds, setSelectedChannelIds] = useState([]); const [selectedLanguages, setSelectedLanguages] = useState([]); const [startDate, setStartDate] = useState(''); const [endDate, setEndDate] = useState(''); // (1) Initial fetch on mount to get all channels and compute distinct languages (runs only once) useEffect(() => { setLoadingChannels(true); axios.get('/api/channels/get') .then(response => { const channelsData = response.data as Channel[]; setChannels(channelsData); // Compute distinct languages once (from the full unfiltered list) const langs = [...new Set(channelsData.map(channel => channel.language))]; setDistinctLanguages(langs); setLoadingChannels(false); }) .catch(error => { console.error('Error fetching channels:', error); setLoadingChannels(false); }); }, []); // (2) Fetch channels based on language selection changes useEffect(() => { setLoadingChannels(true); const params: Record = {}; if (selectedLanguages.length > 0) { params.languages = selectedLanguages.filter(lang => lang !== ''); } axios.get('/api/channels/get', { params }) .then(response => { setChannels(response.data); setLoadingChannels(false); }) .catch(error => { console.error('Error fetching channels:', error); setLoadingChannels(false); }); }, [selectedLanguages]); // Fetch clips when filters change (including videoId) useEffect(() => { setLoadingVideos(true); const params: Record = {}; if (selectedChannelIds.length > 0) { params.channel_ids = selectedChannelIds.filter(id => id !== ''); } if (selectedLanguages.length > 0) { params.languages = selectedLanguages.filter(lang => lang !== ''); } if (startDate) params.start_date = startDate; if (endDate) params.end_date = endDate; axios.get('/api/videos/get', { params }) .then(response => { setVideos(response.data); setLoadingVideos(false); }) .catch(error => { console.error('Error fetching clips:', error); setLoadingVideos(false); }); }, [selectedChannelIds, selectedLanguages, startDate, endDate]); return ( (

Videos

)} >
{/* Filter Options */}
{/* Channel Filter */}
{loadingChannels ? ( ) : ( ({ value: ch.id.toString(), label: ch.channel_name, }))} selected={selectedChannelIds} onChange={setSelectedChannelIds} /> )}
{/* Language Filter */}
{loadingChannels ? ( ) : ( ({ value: ln, label: ln, }))} selected={selectedLanguages} onChange={setSelectedLanguages} /> )}
{/* Start Date Filter */}
setStartDate(e.target.value)} />
{/* End Date Filter */}
setEndDate(e.target.value)} />
{/* head */} {loadingVideos ? (
) : videos.map((video) => ( )) }
Channel Title ...
{video.channel.channel_name}/
{video.channel.channel_name}
{video.external_date ? format(video.external_date, 'dd-MM-yy') : ''}
); }