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);
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;