import { CellValue, ColumnType, ITypeOptions, Language, MaybeAbsentCellValue, } from '../../types'; import { exhaustiveSwitch } from '../../typeUtils'; import { transformNumberToBoolean } from '../transformNumber'; import { transformStringToBoolean } from '../transformString/transformStringToBoolean'; import { transformCellValueToString } from './transformCellValueToString'; import isNumber from 'lodash/isNumber'; export const transformCellValueToBoolean = < OT extends ColumnType = ColumnType >({ cellValue, typeOptions, opts = {}, }: { cellValue: CellValue; typeOptions: ITypeOptions; opts?: { locale?: Language; }; }) => { if (!cellValue) return false; if (typeof cellValue === 'boolean') return cellValue; switch (typeOptions.type) { case ColumnType.NUMBER: case ColumnType.CURRENCY: case ColumnType.RATING: case ColumnType.AUTO_NUMBER: if (isNumber(cellValue)) { return transformNumberToBoolean(cellValue); } else { return false; } case ColumnType.FORMULA: case ColumnType.PROGRESS: case ColumnType.LONG_TEXT: case ColumnType.PHONE: case ColumnType.ROLLUP: case ColumnType.SELECT: case ColumnType.STATUS: case ColumnType.TEXT: { const stringValue = transformCellValueToString({ cellValue: cellValue, typeOptions: typeOptions, opts, }); if (stringValue === null) return false; return transformStringToBoolean(stringValue); } case ColumnType.LOOKUP: case ColumnType.MULTI_SELECT: case ColumnType.SUBTABLE: { const arrayCellValue = cellValue as CellValue; if (arrayCellValue.length <= 0) return false; const stringValue = transformCellValueToString({ cellValue: arrayCellValue.slice(0, 1) as MaybeAbsentCellValue, typeOptions: typeOptions, opts, }); if (stringValue === null) return false; return transformStringToBoolean(stringValue); } case ColumnType.RECORD_REFERENCE: { const arrayCellValue = cellValue as CellValue< | ColumnType.LOOKUP | ColumnType.MULTI_SELECT | ColumnType.RECORD_REFERENCE >; if (arrayCellValue.length <= 0) return false; const stringValue = transformCellValueToString({ cellValue: arrayCellValue.slice(0, 1) as MaybeAbsentCellValue, typeOptions: typeOptions, opts, }); if (stringValue === null) return false; return transformStringToBoolean(stringValue); } case ColumnType.CHECKBOX: case ColumnType.COLLABORATOR: case ColumnType.DATETIME: case ColumnType.EMAIL: case ColumnType.INTEGRATION_REFERENCE: case ColumnType.MULTI_ATTACHMENT: case ColumnType.CREATED_AT: case ColumnType.CREATED_BY: case ColumnType.NOOP: case ColumnType.UNIQUE_ID: return false; default: const { type } = typeOptions; return exhaustiveSwitch({ switchValue: type, returnValue: false, }); } };