From 1d9f0085142c454da345d386c5e583490cf0fe31 Mon Sep 17 00:00:00 2001 From: Aziz FADIL Date: Sun, 27 Oct 2024 15:40:53 -0400 Subject: [PATCH] small fixes --- .../activity/import/hooks/useCsvParser.ts | 77 +++++++++++-------- src/pages/activity/import/import-form.tsx | 4 +- .../activity/import/utils/csvValidation.ts | 2 +- 3 files changed, 47 insertions(+), 36 deletions(-) diff --git a/src/pages/activity/import/hooks/useCsvParser.ts b/src/pages/activity/import/hooks/useCsvParser.ts index 480cf49..5acc846 100644 --- a/src/pages/activity/import/hooks/useCsvParser.ts +++ b/src/pages/activity/import/hooks/useCsvParser.ts @@ -1,6 +1,6 @@ import { useState, useCallback } from 'react'; import Papa from 'papaparse'; -import { ImportFormat } from '@/lib/types'; +import { ImportFormat, ImportMappingData } from '@/lib/types'; import { validateCsvStructure, initializeColumnMapping } from '../utils/csvValidation'; export function useCsvParser() { @@ -21,44 +21,55 @@ export function useCsvParser() { setValidationErrors({}); }; - const parseCsvFile = useCallback((file: File, form: any) => { - resetFileStates(); - setSelectedFile(file); + const parseCsvFile = useCallback( + ( + file: File, + mapping: ImportMappingData, + onUpdateMapping?: (updates: Partial) => void, + ) => { + resetFileStates(); + setSelectedFile(file); - Papa.parse(file, { - complete: (results: Papa.ParseResult) => { - if (results.data && results.data.length > 0) { - setCsvData(results.data); - const headerRow = results.data[0].map((header) => header.trim()); - setHeaders(headerRow); + Papa.parse(file, { + complete: (results) => { + if (results.data && results.data.length > 0) { + setCsvData(results.data); + const headerRow = results.data[0].map((header) => header.trim()); + setHeaders(headerRow); - const isValid = validateCsvStructure(headerRow); + const isValid = validateCsvStructure(headerRow); - if (!isValid) { - setIsValidCsv(false); - setError( - "Oops! The CSV file structure doesn't look quite right. Please make sure your file starts with a header row containing multiple column names.", - ); + if (!isValid) { + setIsValidCsv(false); + setError( + "Oops! The CSV file structure doesn't look quite right. Please make sure your file starts with a header row containing multiple column names.", + ); + } else { + const initialMapping = initializeColumnMapping(headerRow); + if (onUpdateMapping) { + onUpdateMapping({ + fieldMappings: { + ...mapping.fieldMappings, + ...initialMapping, + }, + }); + } + } } else { - const initialMapping = initializeColumnMapping(headerRow); - form.setValue('mapping.columns', { - ...form.getValues('mapping.columns'), - ...initialMapping, - } as Record); + setIsValidCsv(false); + setError('The CSV file appears to be empty.'); } - } else { + setIsLoading(false); + }, + error: (error: any) => { setIsValidCsv(false); - setError('The CSV file appears to be empty.'); - } - setIsLoading(false); - }, - error: (error: any) => { - setIsValidCsv(false); - setError(`Error parsing CSV: ${error.message}`); - setIsLoading(false); - }, - }); - }, []); + setError(`Error parsing CSV: ${error.message}`); + setIsLoading(false); + }, + }); + }, + [], + ); return { csvData, diff --git a/src/pages/activity/import/import-form.tsx b/src/pages/activity/import/import-form.tsx index 8b9da77..49c0dd4 100644 --- a/src/pages/activity/import/import-form.tsx +++ b/src/pages/activity/import/import-form.tsx @@ -92,10 +92,10 @@ export function ActivityImportForm({ (acceptedFiles: File[]) => { const file = acceptedFiles[0]; resetFileStates(); - parseCsvFile(file, mapping); + parseCsvFile(file, mapping, updateMapping); setAccordionValue(''); }, - [parseCsvFile, mapping, resetFileStates], + [parseCsvFile, mapping, resetFileStates, updateMapping], ); const { saveAndCheckImportMutation } = useActivityImportMutations({ diff --git a/src/pages/activity/import/utils/csvValidation.ts b/src/pages/activity/import/utils/csvValidation.ts index f185069..fe4ad86 100644 --- a/src/pages/activity/import/utils/csvValidation.ts +++ b/src/pages/activity/import/utils/csvValidation.ts @@ -199,5 +199,5 @@ export function isCashActivity(activityType: ActivityType): boolean { } export function validateTickerSymbol(symbol: string): boolean { - return tickerRegex.test(symbol); + return tickerRegex.test(symbol.trim()); }