From 009509fc7d83e854d48618492d6226aadd826419 Mon Sep 17 00:00:00 2001 From: Ivan S Glazunov Date: Tue, 8 Oct 2024 19:07:40 +0300 Subject: [PATCH] 0.0.615 --- imports/client.tsx | 30 ++++++++++++++++++++---------- imports/minilinks.tsx | 7 ++++++- package.json | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/imports/client.tsx b/imports/client.tsx index eadc5585..345f071a 100644 --- a/imports/client.tsx +++ b/imports/client.tsx @@ -2373,12 +2373,16 @@ export class DeepClient = Link> implements DeepClientInst const o = { remote: true, count: false, sort: true, ...options }; const query = this.searchQuery(value, o); let results; - if (o.remote) { + if (o.skip) { + results = { data: [] }; + } if (o.remote) { results = await this.select(query, { apply: o.apply, ...(o.count ? { aggregate: 'count' } : {}) }); } else { results = { data: this.minilinks.select(query, { ...(o.count ? { aggregate: 'count' } : {}) }), query }; } - if (o.sort) { + if (o.skip) { + results.ids = {}; + } if (o.sort) { const sorted = sort(results.data, value); results.data = sorted.data; results.ids = sorted.ids; @@ -2729,16 +2733,16 @@ export function useDeepQuery { @@ -2856,23 +2860,29 @@ export function sort(links, value) { }; } +const defaultEmptyResults = { ids: {}, data: [] }; export function useSearch(value: string, options: DeepSearchOptions = {}) { const deep = useDeep(); - const o = useMemo(() => ({ skip: false, remote: true, count: false, sort: true, ...options }), [options]); + const prevOptionsRef = useRef(); + const o = useMemo(() => { + const newPrev = { skip: false, remote: true, count: false, sort: true, ...options }; + if (!isEqual(prevOptionsRef.current, newPrev)) prevOptionsRef.current = newPrev; + return prevOptionsRef.current; + }, [options]); const query = useMemo(() => this.searchQuery(value, o), [value, o]); const qo = useMemo(() => ({ ...(o.count ? { aggregate: 'count' } : {}), skip: o.skip }), [o.count, o.skip]); const useHook = useMemo(() => o.remote ? o.subscription ? deep.useSubscription : deep.useQuery : deep.useLocalQuery, [o.remote, o.subscription]); const { _q, _o } = useDebouncedInput(query, qo, options?.debounce); const _results: any = useHook(_q, _o as any); - const results = o.remote ? _results : { data: _results }; + const results = useMemo(() => o.remote ? _results : { data: _results }, [_results]); if (o.sort) { - const sorted = useMemo(() => sort(results.data, value), [results.data]); + const sorted = useMemo(() => o.skip ? defaultEmptyResults : sort(results.data, value), [results.data]); results.data = sorted.data; results.ids = sorted.ids; } else { results.ids = useMemo(() => { const ids = {}; - if (results?.data?.length) for (let i = 0; i < results.data.length; i++) ids[results?.data?.[i]?.id] = results?.data?.[i]; + if (o.skip && results?.data?.length) for (let i = 0; i < results.data.length; i++) ids[results?.data?.[i]?.id] = results?.data?.[i]; return ids; }, [results.data]); } diff --git a/imports/minilinks.tsx b/imports/minilinks.tsx index 47a7c54f..1053bd6b 100644 --- a/imports/minilinks.tsx +++ b/imports/minilinks.tsx @@ -1029,6 +1029,7 @@ export function useMinilinksHandle>(ml, handler: (event, oldL }, []); }; +const defaultMinilinksApplyResult = { errors: [], anomalies: [], data: [], plainLinks: [] }; export function useMinilinksApply>(ml, name: string, data?: Links | MinilinksApplyInput): { errors?: MinilinkError[]; anomalies?: MinilinkError[]; @@ -1041,7 +1042,11 @@ export function useMinilinksApply>(ml, name: string, data?: L if (ml) ml.apply(Array.isArray(data) ? [] : { ...data, data: [] }, strictName); }; }, []); - if (ml) return ml.apply(data, strictName); + const results = useMemo(() => { + if (ml) return ml.apply(data, strictName); + return defaultMinilinksApplyResult; + }, [data]); + return results; } /** diff --git a/package.json b/package.json index 0f59150a..43f8981f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@deep-foundation/deeplinks", - "version": "0.0.614", + "version": "0.0.615", "license": "Unlicense", "type": "module", "main": "import.js",