import ChunkedUploaderInput from '@/components/chunked-uploader-input'; import InputError from '@/components/input-error'; import LoadingButton from '@/components/loading-button'; import { Card } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { Separator } from '@/components/ui/separator'; import VideoPlayer from '@/components/video-player'; import DashboardLayout from '@/layouts/dashboard/layout'; import { onHandleChange } from '@/lib/inertia'; import { useForm, usePage } from '@inertiajs/react'; import { ReactNode, useEffect, useMemo, useState } from 'react'; import { CourseUpdateProps } from '../update'; const Media = () => { const { props } = usePage(); const { translate } = props; const { dashboard, input, button } = translate; const { tab, course } = props; const [isSubmit, setIsSubmit] = useState(false); const [isFileSelected, setIsFileSelected] = useState(false); const [isFileUploaded, setIsFileUploaded] = useState(false); const [previewBanner, setPreviewBanner] = useState(course.banner); const [thumbnailBanner, setThumbnailBanner] = useState(course.thumbnail); const { data, setData, post, errors, reset, processing } = useForm({ tab: tab, thumbnail: null, banner: null, preview: course.preview, preview_type: 'video_url', }); // Memoize the entire VideoPlayer component to prevent re-renders const memoizedVideoPlayer = useMemo(() => { if (!course.preview) return null; return ( ); }, [course.preview]); // Handle form submission const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (isFileSelected) { setIsSubmit(true); return; } submitForm(); }; const submitForm = () => { post(route('courses.update', { id: course.id }), { onSuccess() { reset(); }, }); }; useEffect(() => { if (isSubmit && data.preview && isFileUploaded) { submitForm(); reset(); setIsSubmit(false); setIsFileUploaded(false); } }, [isSubmit, data.preview]); return (
onHandleChange(e, setData, setThumbnailBanner)} />
onHandleChange(e, setData, setPreviewBanner)} />
setData('preview_type', value)} className="flex flex-wrap items-center gap-5 pt-3" >
{data.preview_type === 'video_url' ? ( onHandleChange(e, setData)} /> ) : ( { setIsFileSelected(true); }} onFileUploaded={(fileData) => { setIsFileUploaded(true); setData('preview', fileData.file_url); }} onError={(errors) => { setIsSubmit(false); }} onCancelUpload={() => { setIsSubmit(false); }} /> )}

{data.preview_type === 'video_url' ? 'Supported URL: youtube or vimeo' : 'Supported Video file: .mp4 or .webm or .ogg'}

{/* */} {memoizedVideoPlayer}
{button.save_changes}
); }; Media.layout = (page: ReactNode) => ; export default Media;