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_IMPRINT = `
Impressum
Angaben gemäß § 5 TMG
Hacker-Net Telekommunikation
Stefan Hacker
Am Wunderburgpark 5b
26135 Oldenburg
Kontakt
Telefon: [Ihre Telefonnummer]
E-Mail: info@hacker-net.de
Umsatzsteuer-ID
Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz:
[Ihre USt-IdNr.]
Berufsbezeichnung und berufsrechtliche Regelungen
Berufsbezeichnung: Telekommunikationsdienstleister
Zuständige Kammer: [IHK Oldenburg]
Verliehen in: Deutschland
Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV
Stefan Hacker
Am Wunderburgpark 5b
26135 Oldenburg
EU-Streitschlichtung
Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit:
https://ec.europa.eu/consumers/odr/ .
Unsere E-Mail-Adresse finden Sie oben im Impressum.
Verbraucherstreitbeilegung / Universalschlichtungsstelle
Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.
`;
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 ImprintEditor() {
const queryClient = useQueryClient();
const [showPreview, setShowPreview] = useState(false);
const [saved, setSaved] = useState(false);
const { data, isLoading } = useQuery({
queryKey: ['imprint'],
queryFn: () => gdprApi.getImprint(),
});
const saveMutation = useMutation({
mutationFn: (html: string) => gdprApi.updateImprint(html),
onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['imprint'] }); setSaved(true); setTimeout(() => setSaved(false), 2000); },
});
const initialContent = data?.data?.html || DEFAULT_IMPRINT;
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 handleSave = () => { if (editor) saveMutation.mutate(editor.getHTML()); };
const handleReset = () => { if (confirm('Auf Standardtext zurücksetzen?')) editor?.commands.setContent(DEFAULT_IMPRINT); };
if (isLoading) return Laden...
;
return (
Impressum bearbeiten
Standardtext laden
setShowPreview(!showPreview)}> {showPreview ? 'Editor' : 'Vorschau'}
{saved ? 'Gespeichert!' : saveMutation.isPending ? 'Speichern...' : 'Speichern'}
{showPreview ? (
) : (
)}
{saveMutation.isError &&
Fehler beim Speichern.
}
);
}