From 46314d2772114e6947ad8a82158813d229e87eed Mon Sep 17 00:00:00 2001 From: andreas-unleash Date: Thu, 10 Aug 2023 16:13:24 +0300 Subject: [PATCH] fix: Remove lastSeenAt from useCollaborateData.tsx staleness check (#4461) Remove the lastSeenAt property when checking for stale data --------- Signed-off-by: andreas-unleash --- .../FeatureStrategy/featureStrategy.utils.ts | 8 +-- frontend/src/utils/deepOmit.test.ts | 49 +++++++++++++++++++ frontend/src/utils/deepOmit.ts | 23 +++++++++ 3 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 frontend/src/utils/deepOmit.test.ts create mode 100644 frontend/src/utils/deepOmit.ts diff --git a/frontend/src/component/feature/FeatureStrategy/featureStrategy.utils.ts b/frontend/src/component/feature/FeatureStrategy/featureStrategy.utils.ts index 2f731af41b..57ba62b8c4 100644 --- a/frontend/src/component/feature/FeatureStrategy/featureStrategy.utils.ts +++ b/frontend/src/component/feature/FeatureStrategy/featureStrategy.utils.ts @@ -1,8 +1,10 @@ import { IFeatureToggle } from 'interfaces/featureToggle'; +import { deepOmit, DeepOmit } from '../../../utils/deepOmit'; -export const comparisonModerator = (data: IFeatureToggle) => { +export const comparisonModerator = ( + data: IFeatureToggle +): DeepOmit => { const tempData = { ...data }; - delete tempData.lastSeenAt; - return tempData; + return deepOmit(tempData, 'lastSeenAt'); }; diff --git a/frontend/src/utils/deepOmit.test.ts b/frontend/src/utils/deepOmit.test.ts new file mode 100644 index 0000000000..7dfceb8e1c --- /dev/null +++ b/frontend/src/utils/deepOmit.test.ts @@ -0,0 +1,49 @@ +import { deepOmit } from './deepOmit'; + +test('should omit all instances of a given field', () => { + const input = { + name: 'some-name', + color: 'blue', + children: { + name: 'some-name', + color: 'blue', + children: { + name: 'some-name', + color: 'blue', + children: { + name: 'some-name', + color: 'blue', + children: {}, + }, + }, + }, + }; + + expect(deepOmit(input, 'name')).toEqual({ + color: 'blue', + children: { + color: 'blue', + children: { + color: 'blue', + children: { + color: 'blue', + children: {}, + }, + }, + }, + }); + + expect(deepOmit(input, 'color')).toEqual({ + name: 'some-name', + children: { + name: 'some-name', + children: { + name: 'some-name', + children: { + name: 'some-name', + children: {}, + }, + }, + }, + }); +}); diff --git a/frontend/src/utils/deepOmit.ts b/frontend/src/utils/deepOmit.ts new file mode 100644 index 0000000000..6c97deb484 --- /dev/null +++ b/frontend/src/utils/deepOmit.ts @@ -0,0 +1,23 @@ +export type DeepOmit = T extends Record + ? { [P in Exclude]: DeepOmit } + : T; + +export function deepOmit( + obj: T, + keyToOmit: K +): DeepOmit { + if (Array.isArray(obj)) { + return obj.map(item => + deepOmit(item, keyToOmit) + ) as unknown as DeepOmit; + } else if (typeof obj === 'object' && obj !== null) { + const result: Partial> = {}; + for (const [key, value] of Object.entries(obj)) { + if (key !== keyToOmit) { + result[key as Exclude] = deepOmit(value, keyToOmit); + } + } + return result as DeepOmit; + } + return obj as DeepOmit; +}