"use client" import { useRef, useState } from "react" import type { Editor } from "@tiptap/react" import { Icon } from "@iconify/react" import { ImageIcon, Pencil, Sparkles } from "lucide-react" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Button } from "@/components/ui/button" import { DocsDriveImagePickerDialog } from "@/components/drive/richtext/docs-drive-image-picker-dialog" import { openDocsGraphicDrawModal } from "@/components/drive/richtext/docs-graphic-draw-modal" import { buildImageInsertGraphicAttrs, buildInsertGraphicAttrs, } from "@/lib/drive/extensions/docs-graphic" import { DOCS_GRAPHIC_PLACEMENT_LABELS, DOCS_GRAPHIC_WRAP_LABELS, type DocsGraphicFloatSide, type DocsGraphicPlacement, type DocsGraphicWrap, parseGraphicAttrs, } from "@/lib/drive/docs-graphic-types" import { suitePublicAsset } from "@/lib/suite/suite-public-asset" function readSelectedGraphicAttrs(editor: Editor) { if (editor.isActive("docsGraphic")) { return parseGraphicAttrs(editor.getAttributes("docsGraphic") as Record) } if (editor.isActive("docsInlineGraphic")) { return parseGraphicAttrs(editor.getAttributes("docsInlineGraphic") as Record) } return null } export function DocsGraphicInsertMenu({ editor, disabled, }: { editor: Editor | null disabled?: boolean }) { const imageInputRef = useRef(null) const [drivePickerOpen, setDrivePickerOpen] = useState(false) if (!editor) return null const insertImageSrc = ( src: string, options?: { wrap?: DocsGraphicWrap; placement?: DocsGraphicPlacement; alt?: string } ) => { void buildImageInsertGraphicAttrs({ src, alt: options?.alt ?? "", wrap: options?.wrap ?? "square", placement: options?.placement ?? "block", }).then((attrs) => { editor.chain().focus().insertDocsGraphic(attrs).run() }) } const insertImageFile = ( file: File, options?: { wrap?: DocsGraphicWrap; placement?: DocsGraphicPlacement } ) => { const reader = new FileReader() reader.onload = () => { const src = reader.result as string insertImageSrc(src, options) } reader.readAsDataURL(file) } return ( <> setDrivePickerOpen(true)}> Image depuis Drive imageInputRef.current?.click()}> Image depuis l'ordinateur { editor .chain() .focus() .insertDocsGraphic( buildInsertGraphicAttrs("draw", { width: 320, height: 240 }) ) .run() openDocsGraphicDrawModal() }} > Dessin editor .chain() .focus() .insertDocsGraphic(buildInsertGraphicAttrs("gradient")) .run() } > Dégradé { insertImageSrc(src, { alt: file.name }) }} /> { const file = event.target.files?.[0] if (file) insertImageFile(file) event.target.value = "" }} /> ) } export function DocsGraphicLayoutMenu({ editor, disabled, }: { editor: Editor | null disabled?: boolean }) { if (!editor) return null const attrs = readSelectedGraphicAttrs(editor) if (!attrs) return null const applyWrap = (wrap: DocsGraphicWrap) => { editor.chain().setDocsGraphicWrap(wrap).run() } const applyPlacement = (placement: DocsGraphicPlacement) => { editor.chain().focus().setDocsGraphicPlacement(placement).run() } const applyFloatSide = (floatSide: DocsGraphicFloatSide) => { editor.chain().focus().setDocsGraphicFloatSide(floatSide).run() } return ( event.preventDefault()} > Habillage texte event.preventDefault()}> {(Object.keys(DOCS_GRAPHIC_WRAP_LABELS) as DocsGraphicWrap[]).map((wrap) => ( applyWrap(wrap)}> {DOCS_GRAPHIC_WRAP_LABELS[wrap]} {attrs.wrap === wrap ? " ✓" : ""} ))} Placement {(Object.keys(DOCS_GRAPHIC_PLACEMENT_LABELS) as DocsGraphicPlacement[]).map( (placement) => ( applyPlacement(placement)}> {DOCS_GRAPHIC_PLACEMENT_LABELS[placement]} {attrs.placement === placement ? " ✓" : ""} ) )} Côté du flottement {(["left", "right", "center"] as const).map((side) => ( applyFloatSide(side)}> {side === "left" ? "Gauche" : side === "right" ? "Droite" : "Centre"} {attrs.floatSide === side ? " ✓" : ""} ))} ) } export function readGraphicToolbarActive(editor: Editor | null): boolean { if (!editor) return false return editor.isActive("docsGraphic") || editor.isActive("docsInlineGraphic") }