import React, { FormEvent, useMemo, useState } from 'react' import IVDialog, { useDialogState } from '~/components/IVDialog' import { ParsedImport, RecordValue } from '../' import IVCheckbox from '~/components/IVCheckbox' import IVButton from '~/components/IVButton' import { RCTResponderProps } from '~/components/RenderIOCall' import { extractColumns } from '@interval/sdk/dist/utils/spreadsheet' import { castValue } from '../helpers' import IconRightArrow from '~/icons/compiled/RightArrow' interface ImporterProps { dialog: ReturnType onClose: (result: Record[] | null) => void input: ParsedImport | null columns: RCTResponderProps<'INPUT_SPREADSHEET'>['columns'] } export default function Importer(props: ImporterProps) { const outputSchema = useMemo( () => extractColumns(props.columns), [props.columns] ) const recordShape = useMemo( () => outputSchema._def.type._def.shape(), [outputSchema] ) const columnNames = useMemo( () => Object.keys(outputSchema._def.type._def.shape()).map(k => k.toString()), [outputSchema] ) const [columnMappings, setColumnMappings] = useState<(number | null)[]>( new Array(columnNames.length).fill(0).map((v, i) => i) ) const inputColumns = (props.input?.meta.fields || []).map((label, value) => ({ label, value, })) const outputColumns = columnNames.map((label, value) => ({ label, value, })) const handleColumnMappingChange = ( outputIndex: number, index: string | number | null ) => { setColumnMappings(prev => { const newMappings = [...prev] newMappings[outputIndex] = index === null ? null : Number(index) return newMappings }) } const processImport = (event?: Event | FormEvent) => { if (event) event.preventDefault() if (!props.input) return const records = props.input.data as Record[] const importResult = records.map((record: Record) => { const newRecord: Record = {} const values = Object.values(record) for (let i = 0; i < columnNames.length; i++) { const colIdx = columnMappings[i] const colName = columnNames[i] const value = colIdx === null ? null : values[colIdx] newRecord[colName] = castValue(value, recordShape[colName]) } return newRecord }) console.debug('Import result:', importResult) props.onClose(importResult) } return (

Imported fields

 

Expected fields

Skip?

{outputColumns.map((fieldName, outputIndex) => (
{fieldName.label}
handleColumnMappingChange( outputIndex, e.target.checked ? null : outputIndex ) } />
))}
props.onClose(null)} label="Cancel" type="button" tabIndex={1} />
) }