'use client'; import { useState } from 'react'; import { FormProvider, useForm, useWatch } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { HelpTopic } from '@/features/help'; import { ModalForm } from '@/components/modal'; import { TabLabel, TabList, TabPanel, Tabs } from '@/components/tabs'; import { useDialogsStore } from '@/stores/dialogs'; import { type ICreateOperationDTO, OperationType, schemaCreateOperation } from '../../backend/types'; import { useCreateOperation } from '../../backend/use-create-operation'; import { describeOperationType, labelOperationType } from '../../labels'; import { type LayoutManager, OPERATION_NODE_HEIGHT, OPERATION_NODE_WIDTH } from '../../models/oss-layout-api'; import { TabInputOperation } from './tab-input-operation'; import { TabSynthesisOperation } from './tab-synthesis-operation'; export interface DlgCreateOperationProps { manager: LayoutManager; initialParent: number | null; initialInputs: number[]; defaultX: number; defaultY: number; onCreate?: (newID: number) => void; } export const TabID = { INPUT: 0, SYNTHESIS: 1 } as const; export type TabID = (typeof TabID)[keyof typeof TabID]; export function DlgCreateOperation() { const { createOperation } = useCreateOperation(); const { manager, initialInputs, initialParent, onCreate, defaultX, defaultY } = useDialogsStore( state => state.props as DlgCreateOperationProps ); const methods = useForm({ resolver: zodResolver(schemaCreateOperation), defaultValues: { item_data: { operation_type: initialInputs.length === 0 ? OperationType.INPUT : OperationType.SYNTHESIS, alias: '', title: '', description: '', result: null, parent: initialParent }, position_x: defaultX, position_y: defaultY, arguments: initialInputs, width: OPERATION_NODE_WIDTH, height: OPERATION_NODE_HEIGHT, create_schema: false, layout: manager.layout }, mode: 'onChange' }); const alias = useWatch({ control: methods.control, name: 'item_data.alias' }); const [activeTab, setActiveTab] = useState(initialInputs.length === 0 ? TabID.INPUT : TabID.SYNTHESIS); const isValid = !!alias && !manager.oss.operations.some(operation => operation.alias === alias); function onSubmit(data: ICreateOperationDTO) { const target = manager.newOperationPosition(data); data.position_x = target.x; data.position_y = target.y; data.layout = manager.layout; void createOperation({ itemID: manager.oss.id, data: data }).then(response => onCreate?.(response.new_operation.id) ); } function handleSelectTab(newTab: TabID, last: TabID) { if (last === newTab) { return; } if (newTab === TabID.INPUT) { methods.setValue('item_data.operation_type', OperationType.INPUT); methods.setValue('item_data.result', null); methods.setValue('arguments', []); } else { methods.setValue('item_data.operation_type', OperationType.SYNTHESIS); methods.setValue('arguments', initialInputs); } setActiveTab(newTab); } return ( void methods.handleSubmit(onSubmit)(event)} className='w-180 px-6 h-128' helpTopic={HelpTopic.CC_OSS} > handleSelectTab(index as TabID, last as TabID)} > ); }