"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { FiEdit3, FiSend, FiX, FiUser, FiLink, FiAlertCircle, FiCheckCircle, FiImage, FiTrash2, FiUpload } from "react-icons/fi"; import './styles/AddUpdateForm.css'; export default function AddUpdateForm() { const [title, setTitle] = useState(""); const [content, setContent] = useState(""); const [linksText, setLinksText] = useState(""); const [userId, setUserId] = useState(null); const [uploadedFiles, setUploadedFiles] = useState([]); const [isUploadingFiles, setIsUploadingFiles] = useState(false); const [loading, setLoading] = useState(false); const [toast, setToast] = useState(null); const router = useRouter(); useEffect(() => { const usn = typeof window !== 'undefined' ? localStorage.getItem('usn') : null; if (!usn) return; (async () => { try { const res = await fetch(`/api/user/id?usn=${encodeURIComponent(usn)}`); if (res.ok) { const data = await res.json(); if (data?.userId) setUserId(data.userId); } } catch (err) { console.error('Failed to resolve user id', err); } })(); }, []); const showToast = (msg, type = 'info') => { setToast({ message: msg, type }); setTimeout(() => setToast(null), 3500); }; const parseLinks = (text) => { if (!text) return []; return text .split(/[,\n]+/) .map(s => s.trim()) .filter(Boolean); }; const handleSubmit = async (e) => { e.preventDefault(); if (!title.trim() || !content.trim()) { showToast('Please enter title and content', 'error'); return; } setLoading(true); const links = parseLinks(linksText); try { const res = await fetch('/api/updates', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title: title.trim(), content: content.trim(), links, userId, files: uploadedFiles }), }); const data = await res.json(); if (res.ok) { showToast('Update created successfully', 'success'); setTitle(''); setContent(''); setLinksText(''); setUploadedFiles([]); // Optionally navigate to updates list // router.push('/updates'); } else { showToast(data?.error || 'Failed to create update', 'error'); } } catch (err) { console.error(err); showToast('Network error', 'error'); } finally { setLoading(false); } }; const handleFilesSelected = async (e) => { const files = Array.from(e.target.files || []); if (!files.length) return; setIsUploadingFiles(true); try { for (let i = 0; i < files.length; i++) { const f = files[i]; const fd = new FormData(); fd.append('file', f); if (userId) fd.append('userId', userId); const res = await fetch('/api/updates/upload', { method: 'POST', body: fd }); const data = await res.json(); if (res.ok && data?.file) { setUploadedFiles((p) => [...p, data.file]); } else { showToast(data?.error || `Failed to upload ${f.name}`, 'error'); } } } catch (err) { console.error('File upload error', err); showToast('File upload failed', 'error'); } finally { setIsUploadingFiles(false); // clear file input e.target.value = null; } }; const removeUploadedFile = (idx) => { setUploadedFiles((p) => p.filter((_, i) => i !== idx)); }; const handleClear = () => { setTitle(''); setContent(''); setLinksText(''); }; return (
{/* Header */}

Create Update

{/* Toast Notification */} {toast && (
{toast.type === 'success' ? ( ) : ( )} {toast.message}
)} {/* Form Card */}
{/* Title Field */}
setTitle(e.target.value)} placeholder="Enter update title..." className="auf-input" required />
{/* Files / Raw Upload Field */}
{isUploadingFiles && Uploading…}
{uploadedFiles.length > 0 && (
{uploadedFiles.map((f, i) => (
{f.name || f.url}
))}
)} {/* Content Field */}