'use client'; import clsx from 'clsx'; import { useLayoutEffect, useMemo, useState } from 'react'; import { TabList, TabPanel, Tabs } from 'react-tabs'; import BadgeHelp from '@/components/info/BadgeHelp'; import Modal from '@/components/ui/Modal'; import Overlay from '@/components/ui/Overlay'; import TabLabel from '@/components/ui/TabLabel'; import { useLibrary } from '@/context/LibraryContext'; import { LibraryItemID } from '@/models/library'; import { HelpTopic, Position2D } from '@/models/miscellaneous'; import { IOperationCreateData, IOperationPosition, IOperationSchema, OperationID, OperationType } from '@/models/oss'; import { PARAMETER } from '@/utils/constants'; import { describeOperationType, labelOperationType } from '@/utils/labels'; import TabInputOperation from './TabInputOperation'; import TabSynthesisOperation from './TabSynthesisOperation'; interface DlgCreateOperationProps { hideWindow: () => void; oss: IOperationSchema; positions: IOperationPosition[]; insertPosition: Position2D; onCreate: (data: IOperationCreateData) => void; } export enum TabID { INPUT = 0, SYNTHESIS = 1 } function DlgCreateOperation({ hideWindow, oss, insertPosition, positions, onCreate }: DlgCreateOperationProps) { const library = useLibrary(); const [activeTab, setActiveTab] = useState(TabID.INPUT); const [alias, setAlias] = useState(''); const [title, setTitle] = useState(''); const [comment, setComment] = useState(''); const [inputs, setInputs] = useState([]); const [attachedID, setAttachedID] = useState(undefined); const [syncText, setSyncText] = useState(true); const [createSchema, setCreateSchema] = useState(false); const isValid = useMemo( () => (alias !== '' && activeTab === TabID.INPUT) || inputs.length != 1, [alias, activeTab, inputs] ); useLayoutEffect(() => { if (attachedID) { const schema = library.items.find(value => value.id === attachedID); if (schema) { setAlias(schema.alias); setTitle(schema.title); setComment(schema.comment); } } }, [attachedID, library]); const handleSubmit = () => { const data: IOperationCreateData = { item_data: { position_x: insertPosition.x, position_y: insertPosition.y, alias: alias, title: title, comment: comment, sync_text: activeTab === TabID.INPUT ? syncText : true, operation_type: activeTab === TabID.INPUT ? OperationType.INPUT : OperationType.SYNTHESIS, result: activeTab === TabID.INPUT ? attachedID ?? null : null }, positions: positions, arguments: activeTab === TabID.INPUT ? undefined : inputs.length > 0 ? inputs : undefined, create_schema: createSchema }; onCreate(data); }; const inputPanel = useMemo( () => ( ), [alias, comment, title, attachedID, syncText, oss, createSchema] ); const synthesisPanel = useMemo( () => ( ), [oss, alias, comment, title, inputs] ); return ( {inputPanel} {synthesisPanel} ); } export default DlgCreateOperation;