/** * Social Settings sub-page * * Social media profile links (Twitter, GitHub, Facebook, Instagram, LinkedIn, YouTube). */ import { Button, Input } from "@cloudflare/kumo"; import { useLingui } from "@lingui/react/macro"; import { FloppyDisk, CheckCircle, WarningCircle } from "@phosphor-icons/react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import * as React from "react"; import { fetchSettings, updateSettings, type SiteSettings } from "../../lib/api"; import { EditorHeader } from "../EditorHeader"; import { BackToSettingsLink } from "./BackToSettingsLink.js"; export function SocialSettings() { const { t } = useLingui(); const queryClient = useQueryClient(); const { data: settings, isLoading } = useQuery({ queryKey: ["settings"], queryFn: fetchSettings, staleTime: Infinity, }); const [formData, setFormData] = React.useState>({}); const [saveStatus, setSaveStatus] = React.useState<{ type: "success" | "error"; message: string; } | null>(null); React.useEffect(() => { if (settings) setFormData(settings); }, [settings]); React.useEffect(() => { if (saveStatus) { const timer = setTimeout(setSaveStatus, 3000, null); return () => clearTimeout(timer); } }, [saveStatus]); const saveMutation = useMutation({ mutationFn: (data: Partial) => updateSettings(data), onSuccess: () => { void queryClient.invalidateQueries({ queryKey: ["settings"] }); setSaveStatus({ type: "success", message: t`Social links saved` }); }, onError: (error) => { setSaveStatus({ type: "error", message: error instanceof Error ? error.message : t`Failed to save settings`, }); }, }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); saveMutation.mutate(formData); }; const handleSocialChange = (key: string, value: string) => { setFormData((prev) => ({ ...prev, social: { ...prev.social, [key]: value, }, })); }; if (isLoading) { return (

{t`Social Links`}

{t`Loading settings...`}

); } return (
{/* Sticky header — see GeneralSettings for the same pattern. */} } actions={ } >

{t`Social Links`}

{/* Status banner */} {saveStatus && (
{saveStatus.type === "success" ? ( ) : ( )} {saveStatus.message}
)}

{t`Social Profiles`}

{t`Add your social media profiles. These are available to your site's theme and can be displayed in headers, footers, or author bios.`}

handleSocialChange("twitter", e.target.value)} description={t`Your Twitter/X handle (e.g., @username)`} /> handleSocialChange("github", e.target.value)} description={t`Your GitHub username`} /> handleSocialChange("facebook", e.target.value)} description={t`Your Facebook page or profile username`} /> handleSocialChange("instagram", e.target.value)} description={t`Your Instagram username`} /> handleSocialChange("linkedin", e.target.value)} description={t`Your LinkedIn profile username`} /> handleSocialChange("youtube", e.target.value)} description={t`Your YouTube channel ID or handle`} />
{/* Save Button */}
); } export default SocialSettings;