From d5330e5ea12e82a4d8292f55a093cf813c267f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 20 Mar 2023 13:01:06 +0100 Subject: [PATCH] distinctUntilChanged --- .../registry/extension.registry.ts | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-api/registry/extension.registry.ts b/src/Umbraco.Web.UI.Client/libs/extensions-api/registry/extension.registry.ts index 0b97e9bf68..ef6361daf6 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-api/registry/extension.registry.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-api/registry/extension.registry.ts @@ -8,7 +8,10 @@ import type { } from '../../models'; import { UmbContextToken } from '@umbraco-cms/context-api'; -function ExtensionMemoization(previousValue: Array, currentValue: Array): boolean { +function ExtensionArrayMemoization( + previousValue: Array, + currentValue: Array +): boolean { // If length is different, data is different: if (previousValue.length !== currentValue.length) { return true; @@ -20,6 +23,16 @@ function ExtensionMemoization(previousValue: Array< return false; } +function ExtensionSingleMemoization( + previousValue: T | undefined, + currentValue: T | undefined +): boolean { + if (previousValue && currentValue) { + return previousValue.alias !== currentValue.alias; + } + return previousValue !== currentValue; +} + export class UmbExtensionRegistry { // TODO: Use UniqueBehaviorSubject, as we don't want someone to edit data of extensions. private _extensions = new BehaviorSubject>([]); @@ -83,25 +96,25 @@ export class UmbExtensionRegistry { private _kindsOfType(type: Key) { return this.kinds.pipe( map((kinds) => kinds.filter((kind) => kind.matchType === type)), - distinctUntilChanged(ExtensionMemoization) + distinctUntilChanged(ExtensionArrayMemoization) ); } private _extensionsOfType(type: Key) { return this.extensions.pipe( map((exts) => exts.filter((ext) => ext.type === type)), - distinctUntilChanged(ExtensionMemoization) + distinctUntilChanged(ExtensionArrayMemoization) ); } private _kindsOfTypes(types: string[]) { return this.kinds.pipe( map((kinds) => kinds.filter((kind) => types.indexOf(kind.matchType) !== -1)), - distinctUntilChanged(ExtensionMemoization) + distinctUntilChanged(ExtensionArrayMemoization) ); } private _extensionsOfTypes(types: string[]): Observable> { return this.extensions.pipe( map((exts) => exts.filter((ext) => types.indexOf(ext.type) !== -1)), - distinctUntilChanged(ExtensionMemoization) + distinctUntilChanged(ExtensionArrayMemoization) ) as Observable>; } @@ -115,17 +128,11 @@ export class UmbExtensionRegistry { map(([ext, kinds]) => { // TODO: Deep merge? return ext ? { ...kinds.find((kind) => kind.matchKind === ext.kind)?.manifest, ...ext } : undefined; - }) + }), + distinctUntilChanged(ExtensionSingleMemoization) ) as Observable; } - /* - , - distinctUntilChanged((previousStates?: T, currentStates?: T) => - previousStates && currentStates ? (previousStates as any).alias === (currentStates as any).alias : false - ) - */ - extensionsOfType>(type: Key) { return this._extensionsOfType(type).pipe( withLatestFrom(this._kindsOfType(type)), @@ -136,10 +143,9 @@ export class UmbExtensionRegistry { return { ...kinds.find((kind) => kind.matchKind === ext.kind)?.manifest, ...ext }; }) .sort((a, b) => (b.weight || 0) - (a.weight || 0)) - ) + ), + distinctUntilChanged(ExtensionArrayMemoization) ) as Observable>; - // - // TODO: DisctinctUntilChanged by using aliases? } extensionsOfTypes(types: string[]): Observable> { @@ -152,10 +158,9 @@ export class UmbExtensionRegistry { return { ...kinds.find((kind) => kind.matchKind === ext.kind)?.manifest, ...ext }; }) .sort((a, b) => (b.weight || 0) - (a.weight || 0)) - ) + ), + distinctUntilChanged(ExtensionArrayMemoization) ) as Observable>; - // - // TODO: DisctinctUntilChanged by using aliases? } }