'use client'; import { useState } from 'react'; import { FormProvider, useForm, useWatch } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import clsx from 'clsx'; 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 IOperationCreateDTO, type IOperationPosition, OperationType, schemaOperationCreate } from '../../backend/types'; import { useOperationCreate } from '../../backend/useOperationCreate'; import { describeOperationType, labelOperationType } from '../../labels'; import { type IOperationSchema } from '../../models/oss'; import { calculateInsertPosition } from '../../models/ossAPI'; import { TabInputOperation } from './TabInputOperation'; import { TabSynthesisOperation } from './TabSynthesisOperation'; export interface DlgCreateOperationProps { oss: IOperationSchema; positions: IOperationPosition[]; initialInputs: number[]; defaultX: number; defaultY: number; onCreate?: (newID: number) => void; } export enum TabID { INPUT = 0, SYNTHESIS = 1 } export function DlgCreateOperation() { const { operationCreate } = useOperationCreate(); const { oss, positions, initialInputs, onCreate, defaultX, defaultY } = useDialogsStore( state => state.props as DlgCreateOperationProps ); const methods = useForm({ resolver: zodResolver(schemaOperationCreate), defaultValues: { item_data: { operation_type: initialInputs.length === 0 ? OperationType.INPUT : OperationType.SYNTHESIS, result: null, position_x: defaultX, position_y: defaultY, alias: '', title: '', comment: '' }, arguments: initialInputs, create_schema: false, positions: positions }, 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 && !oss.items.some(operation => operation.alias === alias); function onSubmit(data: IOperationCreateDTO) { const target = calculateInsertPosition(oss, data.item_data.operation_type, data.arguments, positions, { x: defaultX, y: defaultY }); data.item_data.position_x = target.x; data.item_data.position_y = target.y; void operationCreate({ itemID: 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-[40rem] px-6 h-[32rem]' helpTopic={HelpTopic.CC_OSS} > ); }