'use client' import { useState, FormEvent } from 'react' import { useTranslations } from 'next-intl' import { useRouter } from '@/navigation' const FORMATS = ['mp4', 'mp3', 'webm', 'mkv'] const QUALITIES = ['best', '1080p', '720p', '480p', '360p'] function Spinner() { return ( ) } const selectClass = 'rounded-lg border border-gray-200 dark:border-slate-700 bg-white dark:bg-slate-900 px-2 py-1 text-gray-900 dark:text-gray-50 text-sm outline-none focus:ring-2 focus:ring-violet-500' export function SubmitForm({ examplePlaceholder }: { examplePlaceholder?: string } = {}) { const t = useTranslations('home') const router = useRouter() const [url, setUrl] = useState('') const [format, setFormat] = useState('mp4') const [quality, setQuality] = useState('best') const [subtitles, setSubtitles] = useState(false) const [extraArgs, setExtraArgs] = useState('') const [error, setError] = useState(null) const [loading, setLoading] = useState(false) async function handleSubmit(e: FormEvent) { e.preventDefault() setError(null) setLoading(true) const res = await fetch('/api/downloads', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ url, format, quality, subtitles, extraArgs: extraArgs.trim() || null, }), }) setLoading(false) if (res.status === 429) { setError(t('errorRateLimit')) return } if (!res.ok) { const body = await res.json().catch(() => ({})) setError((body as { error?: string }).error ?? t('errorGeneric')) return } const { uuid } = (await res.json()) as { uuid: string } router.push(`/status/${uuid}`) } return (
{/* URL input with inline submit button */}
{/* Violet glow behind the input */}
setUrl(e.target.value)} required placeholder={examplePlaceholder ?? 'https://www.youtube.com/watch?v=...'} className="flex-1 px-4 py-3 bg-transparent text-sm outline-none placeholder:text-gray-400 dark:placeholder:text-slate-500" />
{/* Options row */}
{t('advanced')} setExtraArgs(e.target.value)} placeholder='["--sponsorblock-remove","all"]' className="mt-2 w-full rounded-lg border border-gray-200 dark:border-slate-700 bg-white dark:bg-slate-900 px-3 py-2 text-sm text-gray-900 dark:text-gray-50 outline-none focus:ring-2 focus:ring-violet-500" />
{error && (

{error}

)} ) }