import { useState,useCallback } from 'react'; import {ReactFlow, addEdge, Controls, Background, MarkerType } 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 initialNode = { id: '1', type: 'input', data: { label: (
Customer signs up for product updates
) }, position: { x: 250, y: 100 }, }; const tabBarOptions = [ { label: 'Send email', id: '2', type: '', html: (
Send email
), position: { x: 250, y: 200 }, }, { label: 'Replied to conversation?', id: '3', type: '', html: (
Replied to conversation?
), position: { x: 250, y: 290 }, }, { label: 'Send survey', id: '4', type: 'output', html: (
Send survey
), position: { x: 100, y: 400 }, }, { label: 'Contact Exists', id: '5', type: 'output', html: (
Contact Exits
), position: { x: 400, y: 400 }, }, ]; // Nội dung popup cho mỗi node const nodeContents = { '2': ` `, '1': ` `, '3': ` `, '5': ` `, '4': ` ` }; const NoteFlow = () => { const [nodes, setNodes] = useState([initialNode]); const [edges, setEdges] = useState([]); const [showTabBar, setShowTabBar] = useState(false); const [lastNodeId, setLastNodeId] = useState('1'); const [showAdditionalOptions, setShowAdditionalOptions] = useState(false); const [selectedNodeContent, setSelectedNodeContent] = useState(''); const [showPopup, setShowPopup] = useState(false); const [nodeToDelete, setNodeToDelete] = useState(null); const handleAddNoteClick = () => { setShowTabBar(true); }; const handleTabClick = (option) => { setShowTabBar(false); const newNode = { id: option.id, data: { label: option.html }, position: { x: option.position.x, y: option.position.y }, }; setNodes((nds) => [...nds, newNode]); setEdges((eds) => addEdge({ id: `e${lastNodeId}-${option.id}`, source: lastNodeId, target: option.id, animated: false }, eds)); setLastNodeId(option.id); if (option.id === '3') { const yesNode = { id: '4', type: 'output', data: { label: (
Send survey
) }, position: { x: 100, y: 400 }, }; const noNode = { id: '5', type: 'output', data: { label: (
Contact Exits
) }, position: { x: 400, y: 400 }, }; setNodes((nds) => [...nds, yesNode, noNode]); setEdges((eds) => [ ...eds, { id: 'e3-4', source: '3', target: '4', label: 'yes', animated: false,}, { id: 'e3-5', source: '3', target: '5', label: 'no', animated: false}, ]); } }; const handleAdditionalOptionClick = (option) => { setShowAdditionalOptions(false); const surveyNode = { id: option.id, data: { label: 'Send survey' }, position: { x: 100, y: 150 * (nodes.length + 1) }, }; const contactExistsNode = { id: '5', data: { label: 'Contact Exists' }, position: { x: 400, y: 150 * (nodes.length + 1) }, }; setNodes((nds) => [...nds, surveyNode, contactExistsNode]); setEdges((eds) => [ ...eds, { id: `e${lastNodeId}-${option.id}`, source: lastNodeId, target: option.id, label: 'yes', animated: true }, { id: `e${option.id}-5`, source: option.id, target: '5', label: 'no', animated: true }, ]); }; const onNodeClick = (event, node) => { const content = nodeContents[node.id]; setSelectedNodeContent(content); setShowPopup(true); }; const hideenPopup = () => { setShowPopup(false); } const onConnect = (params) => setEdges((eds) => addEdge(params, eds)); 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); } }; return (
{showTabBar && (
{tabBarOptions.map((option) => (
handleTabClick(option)} style={{ padding: '10px', cursor: 'pointer', borderBottom: '1px solid #ddd', }} > {option.label}
))}
)} {showAdditionalOptions && (
{additionalOptions.map((option) => (
handleAdditionalOptionClick(option)} style={{ padding: '10px', cursor: 'pointer', borderBottom: '1px solid #ddd', }} > {option.label}
))}
)} {showPopup && ( <>
)} {nodeToDelete && (
)}
); }; export default NoteFlow;