import { useEffect, useState } from 'preact/hooks';
import Importer, {
CsvImporterStateBuilder,
ImporterDefinition,
ImporterState,
} from 'hello-csv/preact';
import Content from '../Content';
import DocumentContainer from '../DocumentContainer';
import example1 from '../../assets/datasets/example-1.csv?url';
export default function EmployeeImporter() {
const [ready, setReady] = useState(false);
const [initialState, setInitialState] = useState<ImporterState | undefined>(
undefined
);
const onComplete = async (
data: ImporterState,
onProgress: (progress: number) => void
) => {
await new Promise((resolve) => setTimeout(resolve, 200));
onProgress(20);
await new Promise((resolve) => setTimeout(resolve, 200));
onProgress(50);
await new Promise((resolve) => setTimeout(resolve, 200));
onProgress(100);
console.log(data);
setReady(true);
};
const importerDefinition: ImporterDefinition = {
allowManualDataEntry: true,
maxFileSizeInBytes: 10 * 1024 * 1024, // 10MB
sheets: [
{
id: 'employees',
label: 'Employees',
columns: [
{
label: 'Employee ID',
id: 'employee.id',
type: 'number',
validators: [
{ validate: 'required' },
{
validate: 'unique',
error: 'This employee ID is not unique',
},
{
validate: 'is_integer',
error: 'This value must be a number',
},
],
},
{
label: 'Email',
id: 'email',
type: 'string',
validators: [
{ validate: 'required' },
{ validate: 'unique', error: 'This email is not unique' },
{
validate: 'email',
error: 'This email is not valid',
},
],
},
{
label: 'Phone Number',
id: 'phone_number',
type: 'string',
validators: [
{ validate: 'required' },
{ validate: 'phone_number' },
],
},
{
label: 'Address',
id: 'address',
type: 'string',
validators: [{ validate: 'required' }],
},
{ label: 'City', id: 'city', type: 'string' },
{
label: 'State',
id: 'state',
type: 'string',
transformers: [{ transformer: 'state_code' }],
},
{
label: 'Zip Code',
id: 'zip_code',
type: 'string',
validators: [{ validate: 'required' }, { validate: 'postal_code' }],
},
{
label: 'Full address',
id: 'full_address',
type: 'calculated',
typeArguments: {
getValue: (row) =>
`${row.address}, ${row.city}, ${row.state} ${row.zip_code}`,
},
},
],
},
],
onDataColumnsMapped: (dataColumns) => {
return dataColumns;
},
onComplete,
preventUploadOnValidationErrors: true,
persistenceConfig: {
enabled: true,
},
};
useEffect(() => {
const run = async () => {
const stateBuilder = new CsvImporterStateBuilder(importerDefinition);
const csvContent = `employee_id,email,phone_number,address,city,state,zip_code
1234567,john.smith@company.com,555-123-4567,123 Main Street,Seattle,WA,98101
2345678,emma.wilson@company.com,555-234-5678,456 Oak Avenue,Portland,OR,97201`;
const file = new File([csvContent], 'example-1.csv', {
type: 'text/csv',
});
await stateBuilder.uploadFile(file);
await stateBuilder.confirmMappings();
setInitialState(stateBuilder.getState());
};
run();
}, []);
if (initialState == null) {
return <div>Loading...</div>;
}
return (
<>
<div className="mt-4 flex max-h-[800px] rounded-lg border border-gray-200 bg-white px-2 py-6 sm:px-8">
<Importer {...importerDefinition} initialState={initialState} />
</div>
{ready && (
<div>
<h4>Check the console for the output!</h4>
</div>
)}
</>
);
}