import { useState, useRef } from "react";
import SuperDocTemplateBuilder, {
SuperDocTemplateBuilderHandle,
FieldDefinition,
} from "@superdoc-dev/template-builder";
function TemplateEditor() {
const builderRef = useRef<SuperDocTemplateBuilderHandle>(null);
const [fields, setFields] = useState<FieldDefinition[]>([
{ id: "1", label: "Customer Name", group: "customer" },
{ id: "2", label: "Customer Email", group: "customer" },
{ id: "3", label: "Invoice Date", group: "invoice" },
{ id: "4", label: "Total Amount", group: "invoice" },
]);
const handleExport = async () => {
const blob = await builderRef.current?.exportTemplate({
fileName: "invoice-template.docx",
triggerDownload: true,
});
};
const handleFieldCreate = async (field: FieldDefinition) => {
// Save to your database
const saved = await fetch("/api/fields", {
method: "POST",
body: JSON.stringify(field),
}).then((r) => r.json());
// Add to local state
setFields((prev) => [...prev, { ...field, id: saved.id }]);
return { ...field, id: saved.id };
};
return (
<div>
<header>
<h1>Invoice Template Builder</h1>
<button onClick={handleExport}>Export Template</button>
</header>
<SuperDocTemplateBuilder
ref={builderRef}
document={{
source: "invoice-base.docx",
mode: "editing",
}}
fields={{
available: fields,
allowCreate: true,
}}
menu={{
trigger: "{{",
}}
list={{
position: "right",
}}
toolbar={{
items: ["bold", "italic", "underline", "align", "list"],
sticky: true,
}}
onFieldsChange={(templateFields) => {
console.log("Template updated:", templateFields);
}}
onFieldCreate={handleFieldCreate}
onReady={() => {
console.log("Document ready for editing");
}}
/>
</div>
);
}