import { useState, useCallback } from 'react';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { useEditor, EditorContent } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';
import TiptapLink from '@tiptap/extension-link';
import { gdprApi } from '../../services/api';
import Button from '../../components/ui/Button';
import Card from '../../components/ui/Card';
import { ArrowLeft, Save, Eye, Bold, Italic, List, ListOrdered, Heading1, Heading2, Heading3, Link as LinkIcon, Undo, Redo, Type } from 'lucide-react';
import { Link as RouterLink } from 'react-router-dom';
const DEFAULT_TEMPLATE = `
Vollmacht
Hiermit bevollmächtige ich,
{{vollmachtgeber_vorname}} {{vollmachtgeber_nachname}}
Kundennummer: {{vollmachtgeber_kundennummer}}
den/die
{{bevollmaechtigter_vorname}} {{bevollmaechtigter_nachname}}
Kundennummer: {{bevollmaechtigter_kundennummer}}
mich in allen Angelegenheiten rund um meine Telekommunikationsverträge bei der Firma Hacker-Net Telekommunikation – Stefan Hacker zu vertreten. Dies umfasst insbesondere:
Einsicht in meine Vertragsdaten, Rechnungen und Kundendaten
Kommunikation mit dem Kundenservice in meinem Namen
Entgegennahme von Informationen zu meinen Verträgen
Diese Vollmacht gilt bis auf Widerruf. Ich kann sie jederzeit schriftlich oder über das Kundenportal widerrufen.
Datenschutzhinweis
Mit der Erteilung dieser Vollmacht erkläre ich mich damit einverstanden, dass die oben genannte bevollmächtigte Person Zugriff auf meine bei Hacker-Net Telekommunikation gespeicherten personenbezogenen Daten erhält. Dies geschieht auf Grundlage meiner ausdrücklichen Einwilligung gemäß Art. 6 Abs. 1 lit. a DSGVO.
Ich bin darüber informiert, dass ich diese Einwilligung jederzeit mit Wirkung für die Zukunft widerrufen kann.
Oldenburg, den {{datum}}
_______________________________
Unterschrift des Vollmachtgebers
Hacker-Net Telekommunikation – Stefan Hacker
Am Wunderburgpark 5b, 26135 Oldenburg
info@hacker-net.de
`;
const PLACEHOLDERS = [
{ key: '{{vollmachtgeber_vorname}}', label: 'Vorname (Vollmachtgeber)' },
{ key: '{{vollmachtgeber_nachname}}', label: 'Nachname (Vollmachtgeber)' },
{ key: '{{vollmachtgeber_kundennummer}}', label: 'Kundennr. (Vollmachtgeber)' },
{ key: '{{bevollmaechtigter_vorname}}', label: 'Vorname (Bevollmächtigter)' },
{ key: '{{bevollmaechtigter_nachname}}', label: 'Nachname (Bevollmächtigter)' },
{ key: '{{bevollmaechtigter_kundennummer}}', label: 'Kundennr. (Bevollmächtigter)' },
{ key: '{{datum}}', label: 'Aktuelles Datum' },
];
function MenuBar({ editor }: { editor: ReturnType }) {
if (!editor) return null;
const setLink = useCallback(() => {
const previousUrl = editor.getAttributes('link').href;
const url = window.prompt('URL eingeben:', previousUrl);
if (url === null) return;
if (url === '') {
editor.chain().focus().extendMarkRange('link').unsetLink().run();
return;
}
editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();
}, [editor]);
const btnClass = (active: boolean) =>
`p-1.5 rounded hover:bg-gray-200 transition-colors ${active ? 'bg-gray-200 text-blue-600' : 'text-gray-600'}`;
return (
editor.chain().focus().toggleBold().run()} className={btnClass(editor.isActive('bold'))} title="Fett">
editor.chain().focus().toggleItalic().run()} className={btnClass(editor.isActive('italic'))} title="Kursiv">
editor.chain().focus().toggleHeading({ level: 1 }).run()} className={btnClass(editor.isActive('heading', { level: 1 }))} title="Überschrift 1">
editor.chain().focus().toggleHeading({ level: 2 }).run()} className={btnClass(editor.isActive('heading', { level: 2 }))} title="Überschrift 2">
editor.chain().focus().toggleHeading({ level: 3 }).run()} className={btnClass(editor.isActive('heading', { level: 3 }))} title="Überschrift 3">
editor.chain().focus().setParagraph().run()} className={btnClass(editor.isActive('paragraph'))} title="Absatz">
editor.chain().focus().toggleBulletList().run()} className={btnClass(editor.isActive('bulletList'))} title="Aufzählung">
editor.chain().focus().toggleOrderedList().run()} className={btnClass(editor.isActive('orderedList'))} title="Nummerierung">
editor.chain().focus().undo().run()} disabled={!editor.can().undo()} className="p-1.5 rounded hover:bg-gray-200 text-gray-600 disabled:opacity-30" title="Rückgängig">
editor.chain().focus().redo().run()} disabled={!editor.can().redo()} className="p-1.5 rounded hover:bg-gray-200 text-gray-600 disabled:opacity-30" title="Wiederherstellen">
);
}
export default function AuthorizationTemplateEditor() {
const queryClient = useQueryClient();
const [showPreview, setShowPreview] = useState(false);
const [saved, setSaved] = useState(false);
const { data: templateData, isLoading } = useQuery({
queryKey: ['authorization-template'],
queryFn: () => gdprApi.getAuthorizationTemplate(),
});
const saveMutation = useMutation({
mutationFn: (html: string) => gdprApi.updateAuthorizationTemplate(html),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['authorization-template'] });
setSaved(true);
setTimeout(() => setSaved(false), 2000);
},
});
// Wenn noch keine Vorlage gespeichert: Default-Template verwenden
const initialContent = templateData?.data?.html || DEFAULT_TEMPLATE;
const editor = useEditor({
extensions: [
StarterKit,
TiptapLink.configure({
openOnClick: false,
HTMLAttributes: { target: '_blank', rel: 'noopener noreferrer' },
}),
],
content: initialContent,
editorProps: {
attributes: {
class: 'prose prose-sm max-w-none p-4 min-h-[400px] focus:outline-none',
},
},
}, [initialContent]);
const insertPlaceholder = (key: string) => {
if (editor) {
editor.chain().focus().insertContent(key).run();
}
};
const handleSave = () => {
if (editor) {
saveMutation.mutate(editor.getHTML());
}
};
const handleResetToDefault = () => {
if (confirm('Vorlage auf den Standardtext zurücksetzen? Alle Änderungen gehen verloren.')) {
editor?.commands.setContent(DEFAULT_TEMPLATE);
}
};
if (isLoading) {
return Laden...
;
}
return (
Vollmacht-Vorlage bearbeiten
Standardtext laden
setShowPreview(!showPreview)}
>
{showPreview ? 'Editor' : 'Vorschau'}
{saved ? 'Gespeichert!' : saveMutation.isPending ? 'Speichern...' : 'Speichern'}
{/* Editor / Vorschau */}
{showPreview ? (
) : (
)}
{/* Platzhalter-Sidebar */}
Klicken Sie auf einen Platzhalter, um ihn an der Cursorposition einzufügen.
{PLACEHOLDERS.map((p) => (
insertPlaceholder(p.key)}
className="w-full text-left px-3 py-2 text-sm bg-gray-50 border rounded hover:bg-blue-50 hover:border-blue-300 transition-colors"
>
{p.key}
{p.label}
))}
{saveMutation.isError && (
Fehler beim Speichern. Bitte versuchen Sie es erneut.
)}
);
}