import { useState } from "react"; import { X, Upload, Save, Camera } from "lucide-react"; import { type Video, type UpdateVideo, updateVideoSchema } from "@shared/schema"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { apiRequest, queryClient } from "@/lib/queryClient"; import { useToast } from "@/hooks/use-toast"; import { useMutation } from "@tanstack/react-query"; import ThumbnailGenerator from "./thumbnail-generator"; interface VideoEditModalProps { video: Video; isOpen: boolean; onClose: () => void; } export default function VideoEditModal({ video, isOpen, onClose }: VideoEditModalProps) { const [title, setTitle] = useState(video.title); const [description, setDescription] = useState(video.description || ""); const [category, setCategory] = useState(video.category || ""); const [tags, setTags] = useState((video.tags || []).join(", ")); const [isPublic, setIsPublic] = useState(video.isPublic); const [customThumbnail, setCustomThumbnail] = useState(null); const [thumbnailPreview, setThumbnailPreview] = useState(video.customThumbnailUrl); const [showThumbnailGenerator, setShowThumbnailGenerator] = useState(false); const { toast } = useToast(); const updateVideoMutation = useMutation({ mutationFn: async (updates: UpdateVideo) => { // For demonstration purposes, we'll simulate a successful update // In a real implementation, this would update metadata in the storage system return new Promise((resolve) => { setTimeout(() => resolve({ success: true }), 500); }); }, onSuccess: () => { toast({ title: "Thumbnail uspešno shranjen!", description: "Spremembe so shranjene lokalno" }); queryClient.invalidateQueries({ queryKey: ["/api/videos"] }); onClose(); }, onError: () => { toast({ title: "Napaka pri shranjevanju", description: "Poskusite znova", variant: "destructive" }); } }); const handleThumbnailChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setCustomThumbnail(file); const reader = new FileReader(); reader.onload = () => setThumbnailPreview(reader.result as string); reader.readAsDataURL(file); } }; const handleThumbnailFromVideo = (thumbnailDataUrl: string) => { setThumbnailPreview(thumbnailDataUrl); setCustomThumbnail(null); // Clear file input since we're using generated thumbnail setShowThumbnailGenerator(false); toast({ title: "Thumbnail ustvarjen iz videoposnetka!" }); }; const handleSave = () => { try { const tagsArray = tags.split(",").map(tag => tag.trim()).filter(tag => tag.length > 0); const updates: UpdateVideo = { title: title.trim(), description: description.trim(), category: category.trim(), tags: tagsArray, isPublic }; // Store the thumbnail locally for demonstration if (thumbnailPreview) { // In a real implementation, this would upload to cloud storage localStorage.setItem(`thumbnail_${video.id}`, thumbnailPreview); updates.customThumbnailUrl = thumbnailPreview; } updateVideoMutation.mutate(updates); } catch (error) { toast({ title: "Error", description: "Please check your input data", variant: "destructive" }); } }; if (!isOpen) return null; return (
{/* Header */}

Edit Video

{/* Form */}
{/* Title */}
setTitle(e.target.value)} placeholder="Enter video title" className="w-full !bg-gray-700 !text-white !border-gray-500 placeholder:!text-gray-300" style={{ backgroundColor: '#374151', color: '#ffffff', borderColor: '#6b7280' }} data-testid="input-video-title" />
{/* Description */}