Mostly renaming objects to avoid conflicts (it was painful because names were too generic so you could cmd+replace easily) Also refactoring `useBuildAvailableFieldsForImport`
31 lines
903 B
TypeScript
31 lines
903 B
TypeScript
import { SpreadsheetImportFields } from '@/spreadsheet-import/types';
|
|
import lavenstein from 'js-levenshtein';
|
|
|
|
type AutoMatchAccumulator<T> = {
|
|
distance: number;
|
|
value: T;
|
|
};
|
|
|
|
export const findMatch = <T extends string>(
|
|
header: string,
|
|
fields: SpreadsheetImportFields<T>,
|
|
autoMapDistance: number,
|
|
): T | undefined => {
|
|
const smallestValue = fields.reduce<AutoMatchAccumulator<T>>((acc, field) => {
|
|
const distance = Math.min(
|
|
...[
|
|
lavenstein(field.key, header),
|
|
...(field.alternateMatches?.map((alternate) =>
|
|
lavenstein(alternate, header),
|
|
) || []),
|
|
],
|
|
);
|
|
return distance < acc.distance || acc.distance === undefined
|
|
? ({ value: field.key, distance } as AutoMatchAccumulator<T>)
|
|
: acc;
|
|
}, {} as AutoMatchAccumulator<T>);
|
|
return smallestValue.distance <= autoMapDistance
|
|
? smallestValue.value
|
|
: undefined;
|
|
};
|