"use server"; import { revalidatePath } from "next/cache"; import { getPaths } from "yt-dlp-transcript-common/lib/paths"; import { getHomepageConfig, writeHomepageConfig, parseHomepageUrl, type HomepageConfig, } from "yt-dlp-transcript-common/lib/homepage"; import { formValues, type FormState } from "../../lib/formState"; // A failure carries what was submitted (lib/formState.ts). export type SaveResult = FormState; // Branding/config for the hub landing site. The hub is a single cross-site // landing page (no authored Markdown pages), so this is the only homepage action. export async function saveHomepageConfigAction( _prev: SaveResult | undefined, formData: FormData, ): Promise { const values = formValues(formData); const paths = getPaths(); const current = getHomepageConfig(paths); const siteTitle = String(formData.get("siteTitle") ?? "").trim(); const headerTitle = String(formData.get("headerTitle") ?? "").trim(); if (!siteTitle) { return { ok: false, error: "Site title is required", values }; } if (!headerTitle) { return { ok: false, error: "Header title is required", values }; } const siteUrlRaw = String(formData.get("siteUrl") ?? "").trim(); if (siteUrlRaw && !parseHomepageUrl(siteUrlRaw)) { return { ok: false, error: "Public URL must be an absolute http(s):// URL, or left blank.", values, }; } const cloudflareProject = String( formData.get("cloudflareProject") ?? "", ).trim(); const next: HomepageConfig = { ...current, siteTitle, headerTitle, siteDescription: String(formData.get("siteDescription") ?? "").trim(), homeTagline: String(formData.get("homeTagline") ?? "").trim(), siteUrl: parseHomepageUrl(siteUrlRaw), cloudflareProject: cloudflareProject || undefined, // Default on, the site form's opt-out idiom: unticked → false → persisted. transcriptDownloads: formData.get("transcriptDownloads") === "on" ? undefined : false, }; try { await writeHomepageConfig(next, paths); } catch (err) { return { ok: false, error: err instanceof Error ? err.message : String(err), values, }; } revalidatePath("/sites"); return { ok: true }; }