import { useWallStore } from '../store/wall'; // 确保导入正确的路径 import clsx from 'clsx'; import { X } from 'lucide-react'; // 导入 Close 图标 import { Editor } from '@/pages/editor'; import { useEffect, useState } from 'react'; import { useStore, useStoreApi } from '@xyflow/react'; import { BlankNoteText } from '../constants'; import { message } from '@/modules/message'; import { useShallow } from 'zustand/react/shallow'; import { isMac } from '../utils/is-mac'; const Drawer = () => { const { open, setOpen, selectedNode, setSelectedNode, editValue, setEditValue, hasEdited, setHasEdited } = useWallStore( useShallow((state) => ({ open: state.open, setOpen: state.setOpen, selectedNode: state.selectedNode, setSelectedNode: state.setSelectedNode, editValue: state.editValue, setEditValue: state.setEditValue, hasEdited: state.hasEdited, setHasEdited: state.setHasEdited, })), ); const store = useStore((state) => state); const storeApi = useStoreApi(); const [mounted, setMounted] = useState(false); useEffect(() => { if (open && selectedNode) { setEditValue(selectedNode?.data.html, true); } }, [open, selectedNode]); useEffect(() => { setMounted(true); return () => { setOpen(false); setHasEdited(false); setSelectedNode(null); }; }, []); const listener = async (e: KeyboardEvent) => { if (e.key === 'Escape') { setOpen(false); } const systemKey = e.metaKey || e.ctrlKey; // mac command+s windows ctrl+s if (systemKey && e.key === 's') { onSave(); e.preventDefault(); e.stopPropagation(); } }; useEffect(() => { window.addEventListener('keydown', listener); return () => { window.removeEventListener('keydown', listener); }; }, []); useEffect(() => { console.log('editValue', editValue, open, mounted); if (!open && mounted) { console.log('hasEdited', hasEdited); if (hasEdited) { onSave(); } } }, [open, hasEdited, mounted]); const onSave = () => { const wallStore = useWallStore.getState(); const selectedNode = wallStore.selectedNode; const _editValue = wallStore.editValue; if (selectedNode && _editValue) { selectedNode.data.html = _editValue; const newNodes = storeApi.getState().nodes.map((node) => (node.id === selectedNode.id ? selectedNode : node)); storeApi.setState({ nodes: newNodes }); if (wallStore.id) { message.success('保存到服务器成功', { closeOnClick: true, }); } else { message.success('保存到本地成功', { closeOnClick: true, }); } wallStore.saveNodes(newNodes, { showMessage: false }); } }; let html = selectedNode?.data?.html || ''; if (html === BlankNoteText) { html = ''; } return (