import { NodeViewContent, NodeViewProps, NodeViewWrapper } from "@tiptap/react"; import { ActionIcon, CopyButton, Group, Select, Tooltip } from "@mantine/core"; import { useEffect, useState } from "react"; import { IconCheck, IconCopy } from "@tabler/icons-react"; import classes from "./code-block.module.css"; import React from "react"; import { Suspense } from "react"; import { useTranslation } from "react-i18next"; const MermaidView = React.lazy( () => import("@/features/editor/components/code-block/mermaid-view.tsx"), ); export default function CodeBlockView(props: NodeViewProps) { const { t } = useTranslation(); const { node, updateAttributes, extension, editor, getPos } = props; const { language } = node.attrs; const [languageValue, setLanguageValue] = useState( language || null, ); const [isSelected, setIsSelected] = useState(false); useEffect(() => { const updateSelection = () => { const { state } = editor; const { from, to } = state.selection; // Check if the selection intersects with the node's range const isNodeSelected = (from >= getPos() && from < getPos() + node.nodeSize) || (to > getPos() && to <= getPos() + node.nodeSize); setIsSelected(isNodeSelected); }; editor.on("selectionUpdate", updateSelection); return () => { editor.off("selectionUpdate", updateSelection); }; }, [editor, getPos(), node.nodeSize]); function changeLanguage(language: string) { setLanguageValue(language); updateAttributes({ language: language, }); } return (