import { memo } from 'react'; import { Handle, Position, NodeProps } from '@xyflow/react'; import { LineNode as LineNodeData } from '../../types/dialogue'; import { useValidation } from '../../hooks/useValidation'; import { useDialogueStore } from '../../store/dialogueStore'; import { MAIN_CHARACTER } from '../../constants/characters'; import styles from './nodes.module.css'; export const LineNode = memo(({ data, selected }: NodeProps & { data: LineNodeData }) => { const { hasError, hasWarning } = useValidation(); const startId = useDialogueStore(s => { const id = s.selectedDialogueId; return s.file?.dialogues.find(d => d.id === id)?.start; }); const isMain = data.speaker === MAIN_CHARACTER; const isStart = data.id === startId; const error = hasError(data.id); const warning = !error && hasWarning(data.id); const triggers = [ data.chatBubble && `💬 ${data.chatBubble}`, data.questUnlock && `🔓 quest`, data.objectiveComplete && `✅ obj`, data.objectiveVisible && `👁 obj`, data.questFail && `❌ quest`, data.questComplete && `🏁 quest`, data.luaCallback && `⚡ lua`, ].filter(Boolean); return (