"use server"; import { revalidatePath } from "next/cache"; import { getPaths } from "yt-dlp-transcript-common/lib/paths"; import { addWidgetPreset, moveWidgetPreset, removeWidgetPreset, renameWidgetPreset, } from "yt-dlp-transcript-common/lib/widgetPresets"; // Server actions behind the preset row. The in-widget menu reads // back through /api/widget/presets (it is a client component with no server // parent to revalidate into); the builder page SSR-seeds and this // revalidatePath refreshes it. export type PresetActionResult = { ok: true } | { ok: false; error: string }; function refreshBuilder(): void { revalidatePath("/widget/builder"); } // Save `query` under `name`. Saving over an existing name overwrites it — a // named slot, not an ever-growing list of same-named entries. export async function saveWidgetPresetAction( name: string, query: string, ): Promise { const preset = await addWidgetPreset(getPaths(), name, query); if (!preset) return { ok: false, error: "A preset needs a name." }; refreshBuilder(); return { ok: true }; } export async function renameWidgetPresetAction( id: string, name: string, ): Promise { const ok = await renameWidgetPreset(getPaths(), id, name); if (!ok) return { ok: false, error: "A preset needs a name." }; refreshBuilder(); return { ok: true }; } export async function deleteWidgetPresetAction( id: string, ): Promise { await removeWidgetPreset(getPaths(), id); refreshBuilder(); return { ok: true }; } export async function moveWidgetPresetAction( id: string, dir: -1 | 1, ): Promise { await moveWidgetPreset(getPaths(), id, dir); refreshBuilder(); return { ok: true }; }