import React, { useState, useEffect } from "react"; import { toast } from "react-toastify"; import { Button } from "@mui/joy"; import { Dropdown } from "primereact/dropdown/dropdown.esm.js"; import { AutoComplete } from "primereact/autocomplete/autocomplete.esm.js"; import { InputText } from "primereact/inputtext/inputtext.esm.js"; export default function ReqForm() { const [type, setType] = useState(""); const [title, setTitle] = useState(""); const [year, setYear] = useState(""); const [requester, setRequester] = useState(""); const [selectedItem, setSelectedItem] = useState(null); const [selectedOverview, setSelectedOverview] = useState(""); const [selectedTitle, setSelectedTitle] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const [suggestions, setSuggestions] = useState([]); useEffect(() => { if (title !== selectedTitle && selectedOverview) { setSelectedOverview(""); setSelectedTitle(""); } }, [title, selectedTitle, selectedOverview]); const searchTitles = async (event) => { const query = event.query; if (query.length < 3) { setSuggestions([]); return; } try { const response = await fetch(`/api/search?q=${encodeURIComponent(query)}`); if (!response.ok) { throw new Error(`API error: ${response.status}`); } const data = await response.json(); setSuggestions(data); } catch (error) { console.error('Error fetching suggestions:', error); setSuggestions([]); } }; const handleSubmit = async (e) => { e.preventDefault(); if (!title.trim()) { toast.error("Please fill in the required fields."); return; } setIsSubmitting(true); try { const response = await fetch('/api/submit', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ title, year, type, requester }), }); if (!response.ok) { throw new Error('Submission failed'); } toast.success("Request submitted successfully!"); // Reset form setType(""); setTitle(""); setYear(""); setRequester(""); setSelectedOverview(""); setSelectedTitle(""); setSelectedItem(null); } catch (error) { console.error('Submission error:', error); toast.error("Failed to submit request. Please try again."); } finally { setIsSubmitting(false); } }; const attachScrollFix = () => { setTimeout(() => { const panel = document.querySelector(".p-autocomplete-panel"); const items = panel?.querySelector(".p-autocomplete-items"); if (items) { items.style.maxHeight = "200px"; items.style.overflowY = "auto"; items.style.overscrollBehavior = "contain"; const wheelHandler = (e) => { const delta = e.deltaY; const atTop = items.scrollTop === 0; const atBottom = items.scrollTop + items.clientHeight >= items.scrollHeight; if ((delta < 0 && atTop) || (delta > 0 && atBottom)) { e.preventDefault(); } else { e.stopPropagation(); } }; items.removeEventListener("wheel", wheelHandler); items.addEventListener("wheel", wheelHandler, { passive: false }); } }, 0); }; return (

Request Movies/TV

Submit your request for review

setTitle(typeof e.value === 'string' ? e.value : e.value.label)} onSelect={(e) => { setType(e.value.mediaType === 'tv' ? 'tv' : 'movie'); setTitle(e.value.label); setSelectedTitle(e.value.label); setSelectedItem(e.value); if (e.value.year) setYear(e.value.year); setSelectedOverview(e.value.overview || ""); }} placeholder="Enter movie or TV show title" className="w-full" inputClassName="w-full border-2 border-gray-200 dark:border-gray-600 rounded-xl px-4 py-3 focus:border-[#12f8f4] transition-colors" panelClassName="border-2 border-gray-200 dark:border-gray-600 rounded-xl" field="label" onShow={attachScrollFix} itemTemplate={(item) => (
{item.label} {item.year && ({item.year})} {item.mediaType === 'tv' ? 'TV' : 'Movie'}
)} />
{selectedOverview && (

{selectedOverview}

{selectedItem?.poster_path && ( Poster )}
)}
setYear(e.target.value)} placeholder="e.g. 2023" className="w-full border-2 border-gray-200 dark:border-gray-600 rounded-xl px-4 py-3 focus:border-[#12f8f4] transition-colors" />
setRequester(e.target.value)} placeholder="Who is requesting this?" className="w-full border-2 border-gray-200 dark:border-gray-600 rounded-xl px-4 py-3 focus:border-[#12f8f4] transition-colors" />
); }