diff --git a/packages/nc-gui/composables/useUserSorts.ts b/packages/nc-gui/composables/useUserSorts.ts index aa09f0dccc..73c021baeb 100644 --- a/packages/nc-gui/composables/useUserSorts.ts +++ b/packages/nc-gui/composables/useUserSorts.ts @@ -2,7 +2,6 @@ import rfdc from 'rfdc' import { OrgUserRoles, ProjectRoles, WorkspaceUserRoles } from 'nocodb-sdk' import type { UsersSortType } from '~/lib' import { useGlobal } from '#imports' -import { isValidObjectType } from '~/helpers/parsers/parserHelpers' /** * Hook for managing user sorts and sort configurations. @@ -43,16 +42,17 @@ export function useUserSorts(roleType: 'Workspace' | 'Org' | 'Project') { const storedConfig = localStorage.getItem(userSortConfigKey) const sortConfig = storedConfig ? JSON.parse(storedConfig) : ({} as Record) - if (isValidObjectType(sortConfig, {} as Record)) { - sorts.value = sortConfig + if (sortConfig && isValidSortConfig(sortConfig)) { + sorts.value = sortConfig // Load user-specific sort configurations or default configurations sorts.value = user.value?.id ? sortConfig[user.value.id] || {} : sortConfig[defaultUserId] || {} } else { + // remove sortConfig from localStorage if it's invalid + localStorage.removeItem(userSortConfigKey) sorts.value = {} } - } catch (error) { - console.error('Error while retrieving sort configuration from local storage:', error) + } catch { // Set sorts to an empty obj in case of an error sorts.value = {} } @@ -150,5 +150,26 @@ export function useUserSorts(roleType: 'Workspace' | 'Org' | 'Project') { return sortedData } + /** + * Checks if the provided sort configuration has the expected structure. + * @param sortConfig - The sort configuration to validate. + * @param expectedStructure - The expected structure for the sort configuration. + * Defaults to { field: 'email', direction: 'asc' }. + * @returns `true` if the sort configuration is valid, otherwise `false`. + */ + function isValidSortConfig( + sortConfig: Record, + expectedStructure: UsersSortType = { field: 'email', direction: 'asc' }, + ): boolean { + // Check if the sortConfig has the expected keys + for (const key in sortConfig) { + const isValidConfig = Object.keys(sortConfig[key]).every((key) => + Object.prototype.hasOwnProperty.call(expectedStructure, key), + ) + if (!isValidConfig) return false + } + return true + } + return { sorts, sortDirection, loadSorts, saveOrUpdate, handleGetSortsData } } diff --git a/packages/nc-gui/helpers/parsers/parserHelpers.ts b/packages/nc-gui/helpers/parsers/parserHelpers.ts index f2c391c020..b629fe4192 100644 --- a/packages/nc-gui/helpers/parsers/parserHelpers.ts +++ b/packages/nc-gui/helpers/parsers/parserHelpers.ts @@ -225,36 +225,3 @@ export const extractNextDefaultName = (namesData: string[], defaultName: string, ? `${defaultName}${splitOperator}${extractedSortedNumbers[extractedSortedNumbers.length - 1] + 1}` : `${defaultName}${splitOperator}1` } - -/** - * Validates whether an object matches the expected type. - * - * @param obj - The object to be validated. - * @param expectedType - The expected type of the object. - * @returns `true` if the object matches the expected type, `false` otherwise. - * - * @template T - The type representing the expected structure of the object. - * - * @example - * // Define a type representing the expected structure. - * interface MyType { - * id: number; - * name: string; - * } - * - * // Object to validate - * const objToValidate = { - * id: 1, - * name: 'John Doe', - * }; - * - * // Check if the object matches the expected type. - * const isValid = isValidObjectType(objToValidate, {} as MyType); - * console.log(isValid); // Should print true - */ -export const isValidObjectType = >(obj: Record, expectedType: T): boolean => { - // Check if the obj has the expected keys and values - return Object.entries(expectedType).every(([key, expectedValue]) => { - return Object.prototype.hasOwnProperty.call(obj, key) && typeof obj[key] === typeof expectedValue - }) -}