import React, { useEffect, useState } from 'react'; import { DataService } from '../services/dataService'; import { GeminiService } from '../services/geminiService'; import { MaterialType, UserDTO } from '../types'; import { X, Wand2, UploadCloud } from 'lucide-react'; import { useToast } from './ToastProvider'; interface CreateModalProps { onClose: () => void; onSuccess: () => void; } export const CreateModal: React.FC = ({ onClose, onSuccess }) => { const toast = useToast(); const [formData, setFormData] = useState({ title: '', description: '', type: MaterialType.CODE, codeSnippet: '', tags: [] as string[] }); const [file, setFile] = useState(null); const [currentUser, setCurrentUser] = useState(null); const [isProcessing, setIsProcessing] = useState(false); useEffect(() => { DataService.getCurrentUser().then(setCurrentUser).catch(() => setCurrentUser(null)); }, []); const handleAutoGenerate = async () => { if (!formData.codeSnippet) return; setIsProcessing(true); const { description, tags } = await GeminiService.analyzeCode(formData.codeSnippet); setFormData(prev => ({ ...prev, description, tags: [...prev.tags, ...tags] })); setIsProcessing(false); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsProcessing(true); try { if (formData.type === MaterialType.CODE) { await DataService.createMaterial(formData); } else if (formData.type === MaterialType.ASSET_ZIP) { if (!file) throw new Error('Please select ZIP file'); if (file.size > 3 * 1024 * 1024) throw new Error('ZIP must be ≤ 3MB'); await DataService.uploadZip(file, { title: formData.title, description: formData.description, tags: formData.tags }); } else if (formData.type === MaterialType.VIDEO) { if (!(currentUser?.role === 'MANAGER' || currentUser?.role === 'ADMIN')) throw new Error('Manager role required'); if (!file) throw new Error('Please select video file'); await DataService.uploadVideo(file, { title: formData.title, description: formData.description, tags: formData.tags }); } onSuccess(); } catch (err: any) { toast.error(err.message || 'Upload failed'); } finally { setIsProcessing(false); } }; return (
{/* Decorative Header */}

UPLOAD_NEW_PROTOCOL

{/* Type Selection */}
{Object.values(MaterialType).map(t => { const isVideo = t === MaterialType.VIDEO; const allowed = !isVideo || (currentUser?.role === 'MANAGER' || currentUser?.role === 'ADMIN'); return ( ); })}
{/* Title */}
setFormData({...formData, title: e.target.value})} />
{/* Content Input Based on Type */} {formData.type === MaterialType.CODE ? (