// AVA — Presets tab: load/delete preset scripts, download the original .avs // binaries for the built-ins, save the current editor script as a preset. 'use client' import { useEffect, useState } from 'react' import { Download, FilePlus2, Play, Save, Trash2 } from 'lucide-react' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { originalFileUrl, STARTER_TEMPLATE } from '@/lib/ava/presets' import { validateScript } from '@/lib/ava/script' import { refreshPresets, useAvaStore, type PresetItem } from '@/lib/store' import { applyScriptText } from '@/components/ava/audio-source' import { modeOfScript, thinScrollbar } from '@/components/ava/shared' import { useToast } from '@/hooks/use-toast' import { cn } from '@/lib/utils' function PresetCard({ preset }: { preset: PresetItem }) { const { toast } = useToast() const setTab = useAvaStore((s) => s.setTab) const [confirmingDelete, setConfirmingDelete] = useState(false) const [deleting, setDeleting] = useState(false) useEffect(() => { if (!confirmingDelete) return const t = setTimeout(() => setConfirmingDelete(false), 3000) return () => clearTimeout(t) }, [confirmingDelete]) const load = () => { const result = applyScriptText(preset.content) if (result.ok) { toast({ title: 'Preset loaded', description: `"${preset.name}" is now running.` }) } else if (result.error) { toast({ title: 'Preset failed to compile', description: `[${result.error.section}] line ${result.error.line}: ${result.error.message}`, variant: 'destructive', }) setTab('script') } } const remove = async () => { setDeleting(true) try { const res = await fetch(`/api/presets/${preset.id}`, { method: 'DELETE' }) if (!res.ok) throw new Error(`HTTP ${res.status}`) await refreshPresets() toast({ title: 'Preset deleted', description: `"${preset.name}" removed.` }) } catch { toast({ title: 'Delete failed', description: 'Could not remove that preset.', variant: 'destructive' }) } finally { setDeleting(false) setConfirmingDelete(false) } } const original = preset.isBuiltIn ? originalFileUrl(preset.name) : undefined return (
by {preset.author || 'unknown'}
{preset.description}
Saved under the script's editor content — reuse it any time from this list.
{presets.length} preset{presets.length === 1 ? '' : 's'} — classics adapted from the original Winamp AVS files.