import * as React from 'react'; import { useState, useMemo, useCallback, useEffect } from 'react'; import { Field, PanelSettings } from '../../../models'; import { PencilIcon } from '@heroicons/react/outline'; import { VsLabel } from '../VscodeComponents'; import { DataBlockRecords, DataBlockForm, DataBlockSelector } from '.'; import { SortEnd } from 'react-sortable-hoc'; import { arrayMoveImmutable } from 'array-move'; export interface IDataBlockFieldProps { label: string; settings: PanelSettings; field: Field; value: any; onSubmit: (data: any) => void; } export const DataBlockField: React.FunctionComponent = ({ label, settings, field, value, onSubmit }: React.PropsWithChildren) => { const [ selectedIndex, setSelectedIndex ] = useState(null); const [ selectedDataType, setSelectedDataType ] = useState(null); const [ selectedSchema, setSelectedSchema ] = useState(null); const onUpdate = useCallback((data: any) => { const dataClone: any[] = Object.assign([], value); if (selectedIndex !== null && selectedIndex !== undefined) { dataClone[selectedIndex] = { ...data, blockType: selectedSchema?.id }; } else { dataClone.push({ ...data, blockType: selectedSchema?.id }); } onSubmit(dataClone); }, [value, selectedIndex, onSubmit, selectedSchema]); const deleteItem = useCallback((index: number) => { const dataClone: any[] = Object.assign([], value); if (!value) { return; } dataClone.splice(index, 1); onSubmit(dataClone); }, [value, selectedIndex, onSubmit]); const onSetDataType = (dataType: string | null) => { setSelectedDataType(dataType); if (!dataType) { setSelectedIndex(null); setSelectedSchema(null); } } const onSort = useCallback(({ oldIndex, newIndex }: SortEnd) => { if (!value || value.length === 0) { return null; } if (selectedIndex !== null && selectedIndex !== undefined) { setSelectedIndex(newIndex); } const newEntries = arrayMoveImmutable(value, oldIndex, newIndex); onSubmit(newEntries); }, [value, selectedIndex]); const model = useMemo(() => (value && selectedIndex !== null && selectedIndex !== undefined) ? value[selectedIndex] : null, [value, selectedIndex]); useEffect(() => { if (selectedIndex !== null && settings?.dataTypes) { const blockType = model["blockType"]; const schema = settings?.dataTypes.find(dataType => dataType.id === blockType); setSelectedSchema(schema); setSelectedDataType(blockType); } }, [selectedIndex, model, settings?.dataTypes]); return (
{label}
setSelectedIndex(null)} /> setSelectedIndex(null)} onSort={onSort} onEdit={(index: number) => setSelectedIndex(index)} onDelete={deleteItem} />
); };