"use client"; import Image from "next/image"; import { useEffect, useMemo, useState } from "react"; import { useFormState } from "react-dom"; import { useRouter } from "next/navigation"; import { updateDefaultQrLogoAction, type DefaultQrLogoState, } from "../app/(app)/dashboard/actions"; const buildInitialState = (logo: "monero" | "none" | "custom", logoDataUrl: string | null) => ({ logo, logoDataUrl, error: null, success: null, }); export default function DefaultQrLogoSection({ initialLogo, initialLogoDataUrl, }: { initialLogo: "monero" | "none" | "custom"; initialLogoDataUrl: string | null; }) { const router = useRouter(); const [logo, setLogo] = useState<"monero" | "none" | "custom">(initialLogo); const [logoDataUrl, setLogoDataUrl] = useState(initialLogoDataUrl); const [state, formAction] = useFormState( updateDefaultQrLogoAction, buildInitialState(initialLogo, initialLogoDataUrl) ); useEffect(() => { if (state.success) { router.refresh(); } }, [router, state.success]); useEffect(() => { setLogo(initialLogo); setLogoDataUrl(initialLogoDataUrl); }, [initialLogo, initialLogoDataUrl]); const previewSrc = useMemo(() => { if (logo === "monero") { return "/monero-logo.svg"; } if (logo === "custom") { return logoDataUrl; } return null; }, [logo, logoDataUrl]); const handleLogoFileChange = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (!file) { setLogoDataUrl(null); return; } const reader = new FileReader(); reader.onload = () => { const result = reader.result; if (typeof result === "string") { setLogoDataUrl(result); } }; reader.readAsDataURL(file); }; return (

Default QR logo

Applies to new invoices unless overridden at creation time.

{logo === "custom" ? (

Stored as a data URL for use on public invoice pages. Keep it small.

{logoDataUrl ? ( ) : null}
) : null} {previewSrc ? (
QR logo preview

Preview (used in the QR center).

) : null} {state.error ? (

{state.error}

) : null} {state.success ? (

{state.success}

) : null}
); }