import { useState,useCallback } from 'react'; import { ReactFlow, addEdge, Controls, Background } from '@xyflow/react'; import '@xyflow/react/dist/style.css'; import { FiUser, FiMail, FiCheckCircle, FiList } from 'react-icons/fi'; import { FaShuffle } from 'react-icons/fa6'; const initialNodes = [ { id: '1', type: 'input', data: { label: (
Customer signs up for product updates
), }, position: { x: 250, y: 100 }, }, { id: '2', data: { label: 'Add Note' }, position: { x: 250, y: 250 }, }, ]; // nội dung tabbar const tabBarOptions = [ { label: 'Send email', id: '3', type: '', html: (
Send email
), position: { x: 250, y: 200 }, }, { label: 'Replied to conversation?', id: '4', type: '', html: (
Replied to conversation?
), position: { x: 250, y: 290 }, }, { label: 'Send survey', id: '5', type: 'output', html: (
Send survey
), position: { x: 100, y: 400 }, }, { label: 'Contact Exists', id: '6', type: 'output', html: (
Contact Exists
), position: { x: 400, y: 400 }, }, ]; // Nội dung cho mỗi node const nodeContents = { '2': ` `, '1': ` `, '3': ` `, '5': ` `, '4': ` ` }; const NoteFlow = () => { const [nodes, setNodes] = useState(initialNodes); const [edges, setEdges] = useState([ { id: 'e1-2', source: '1', target: '2' }, // Kết nối node "Add Note" với node mặc định ban đầu ]); const [showTabBar, setShowTabBar] = useState(false); const [lastNodeId, setLastNodeId] = useState('1'); const [selectedNodeId, setSelectedNodeId] = useState(null); // Theo dõi node đã chọn const [nodeToDelete, setNodeToDelete] = useState(null); const [showPopup, setShowPopup] = useState(false); const [selectedNodeContent, setSelectedNodeContent] = useState(''); const handleAddNoteClick = () => { setShowTabBar(true); }; const handleTabClick = (option) => { setShowTabBar(false); if (selectedNodeId === option.id) { alert('Node này đã được thêm. Vui lòng chọn một node khác.'); return; } const newNode = { id: option.id, data: { label: option.html }, position: { x: option.position.x, y: option.position.y }, }; const addNoteNode = nodes.find((node) => node.id === '2'); // Xóa node "Add Note" nếu chọn "Replied to conversation?" if (option.id === '4') { setNodes((nds) => nds.filter((node) => node.id !== '2')); // Thêm node "Replied to conversation?" const repliedNode = { id: '4', data: { label: option.html }, position: { x: option.position.x, y: option.position.y }, }; // Thêm các nhánh "Send survey" và "Contact Exists" const yesNode = { id: '5', type: 'output', data: { label: (
Send survey
), }, position: { x: option.position.x - 150, y: option.position.y + 150 }, }; const noNode = { id: '6', type: 'output', data: { label: (
Contact Exists
), }, position: { x: option.position.x + 150, y: option.position.y + 150 }, }; setNodes((nds) => [...nds, repliedNode, yesNode, noNode]); setEdges((eds) => [ ...eds, { id: 'e4-5', source: '4', target: '5', label: 'yes', animated: false }, { id: 'e4-6', source: '4', target: '6', label: 'no', animated: false }, { id: `e${lastNodeId}-4`, source: lastNodeId, target: '4' }, // Kết nối node hiện tại với "Replied to conversation?" ]); } else { if (addNoteNode) { // Di chuyển node "Add Note" xuống dưới node mới setNodes((nds) => nds.map((node) => node.id === '2' ? { ...node, position: { x: option.position.x, y: option.position.y + 150 } } : node ) ); } // Thêm node mới vào danh sách node setNodes((nds) => [...nds, newNode]); // Kết nối node mới với node hiện tại setEdges((eds) => addEdge({ id: `e${lastNodeId}-${option.id}`, source: lastNodeId, target: option.id }, eds)); // Kết nối node "Add Note" cũ với node mới if (addNoteNode) { setEdges((eds) => addEdge({ id: `e${option.id}-2`, source: option.id, target: '2' }, eds)); } // Cập nhật lastNodeId setLastNodeId(option.id); } // Cập nhật selectedNodeId với ID của node được chọn setSelectedNodeId(option.id); }; const onNodeClick = (event, node) => { if (node.id === '2') { // Check if the clicked node is "Add Note" setShowTabBar(true); } }; const onNodeContextMenu = useCallback((event, node) => { event.preventDefault(); // Ngăn không cho menu chuột phải mặc định hiện ra setNodeToDelete(node); }, []); const handleNodeDelete = () => { if (nodeToDelete) { setNodes((nds) => nds.filter((node) => node.id !== nodeToDelete.id)); setEdges((eds) => eds.filter((edge) => edge.source !== nodeToDelete.id && edge.target !== nodeToDelete.id)); setNodeToDelete(null); } }; const onNodeDoubleClick = (event, node) => { const content = nodeContents[node.id]; setSelectedNodeContent(content); setShowPopup(true); } const hideenPopup = () => { setShowPopup(false); } return (
{showTabBar && (
{tabBarOptions.map((option) => (
handleTabClick(option)} style={{ padding: '10px', cursor: selectedNodeId === option.id ? 'not-allowed' : 'pointer', opacity: selectedNodeId === option.id ? 0.5 : 1, // Làm mờ các node đã chọn borderBottom: '1px solid #ddd', }} > {option.label}
))}
)} {nodeToDelete && (
)} {showPopup && ( <>
)}
); }; export default NoteFlow;