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 (
); } 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

{showPreview ? (
) : (
)} {saveMutation.isError &&
Fehler beim Speichern.
}
); }