Skip to content

Commit

Permalink
0.0.424 minilinks.emitter.on('select.before' | 'select' | 'useQuery.m…
Browse files Browse the repository at this point in the history
…ount' | 'useQuery.unmount' | 'useQuery' | 'useSubscription.mount' | 'useSubscription.unmount' | 'useSubscription', ({ minilinks, name, query, options, error?, localData? }) => void)
  • Loading branch information
ivansglazunov committed Aug 9, 2024
1 parent 999be34 commit 4397535
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 10 deletions.
12 changes: 6 additions & 6 deletions imports/client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2427,7 +2427,7 @@ export function useDeepQuery<Table extends 'links'|'numbers'|'strings'|'objects'
const _deep = useDeep();
const deep = options?.deep || _deep;
useMemo(() => {
deep.emitter.emit('useQuery.mount', { deep, query, options });
deep.emitter.emit('useQuery.mount', { name: miniName, deep, query, options });
}, []);
const prevRef = useRef({ query, options });
const { query: q, options: o } = useMemo(() => {
Expand Down Expand Up @@ -2466,7 +2466,7 @@ export function useDeepQuery<Table extends 'links'|'numbers'|'strings'|'objects'
toReturn.plainLinks = plainLinks;
useMemo(() => {
deep.emitter.emit('useQuery', {
deep, query, options: o,
name: miniName, deep, query, options: o,
remoteQuery: wq,
loading: result.loading,
remoteData: result.data,
Expand All @@ -2475,7 +2475,7 @@ export function useDeepQuery<Table extends 'links'|'numbers'|'strings'|'objects'
});
return () => {
deep.emitter.emit('useQuery.unmount', {
deep, query, options: o,
name: miniName, deep, query, options: o,
remoteQuery: wq,
loading: result.loading,
remoteData: result.data,
Expand All @@ -2496,7 +2496,7 @@ export function useDeepSubscription<Table extends 'links'|'numbers'|'strings'|'o
const _deep = useDeep();
const deep = options?.deep || _deep;
useMemo(() => {
deep.emitter.emit('useSubscription.mount', { deep, query, options });
deep.emitter.emit('useSubscription.mount', { name: miniName, deep, query, options });
}, []);
const prevRef = useRef({ query, options });
const { query: q, options: o } = useMemo(() => {
Expand Down Expand Up @@ -2537,7 +2537,7 @@ export function useDeepSubscription<Table extends 'links'|'numbers'|'strings'|'o
toReturn.plainLinks = plainLinks;
useMemo(() => {
deep.emitter.emit('useSubscription', {
deep, query, options: o,
name: miniName, deep, query, options: o,
remoteQuery: wq,
loading: result.loading,
remoteData: result.data,
Expand All @@ -2546,7 +2546,7 @@ export function useDeepSubscription<Table extends 'links'|'numbers'|'strings'|'o
});
return () => {
deep.emitter.emit('useSubscription.unmount', {
deep, query, options: o,
name: miniName, deep, query, options: o,
remoteQuery: wq,
loading: result.loading,
remoteData: result.data,
Expand Down
52 changes: 49 additions & 3 deletions imports/minilinks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { QueryLink } from './client_types.js';
import { useDebounceCallback } from '@react-hook/debounce';
import { Observable } from '@apollo/client/index.js';
import get from 'get-value';
import { _ids, DeepClient, DeepClientPathItem, DeepClientStartItem } from './client.js';
import { _ids, DeepClient, DeepClientPathItem, DeepClientStartItem, random } from './client.js';
import { Traveler } from './traveler.js';

const debug = Debug('deeplinks:minilinks');
Expand Down Expand Up @@ -329,13 +329,19 @@ export class MinilinkCollection<MGO extends MinilinksGeneratorOptions = typeof M
emitter: EventEmitter;

query<A>(query: QueryLink | Id, options?: MinilinksQueryOptions<A>): A extends string ? any : Links<Id, L> {
this.emitter.emit('select.before', {
minilinks: this, query, options
});
const result: Links<Id, L> = minilinksQuery<L>(query, this) as Links<Id, L>;
if (options?.aggregate === 'count') return result?.length as any;
if (options?.aggregate === 'avg') return _mean(result?.map(l => l?.value?.value)) as any;
if (options?.aggregate === 'sum') return _sum(result?.map(l => l?.value?.value)) as any;
if (options?.aggregate === 'min') return _min(result?.map(l => l?.value?.value)) as any;
if (options?.aggregate === 'max') return _max(result?.map(l => l?.value?.value)) as any;
this._traveled(result);
this.emitter.emit('select', {
minilinks: this, query, options, localData: result,
});
return result;
}
select(query: QueryLink | Id, options?: MinilinksQueryOptions): Links<Id, L> | any {
Expand Down Expand Up @@ -441,6 +447,9 @@ export class MinilinkCollection<MGO extends MinilinksGeneratorOptions = typeof M
*/
subscribe(query: QueryLink | Id, options?: MinilinksQueryOptions): Observable<Links<Id, L> | any> {
const ml = this;
this.emitter.emit('subscribe.before', {
minilinks: this, query, options,
});
return new Observable((observer) => {
let prev = ml.query(query, options);
let t;
Expand All @@ -451,6 +460,9 @@ export class MinilinkCollection<MGO extends MinilinksGeneratorOptions = typeof M
const data = ml.query(query, options);
if (!_isEqual(prev, data)) {
prev = data;
this.emitter.emit('subscribe', {
minilinks: this, query, options, localData: data,
});
observer.next(data);
}
}, 300);
Expand Down Expand Up @@ -1026,14 +1038,35 @@ export function useMinilinksApply<L extends Link<Id>>(ml, name: string, data?: L
* Recalculates when query changes. (Take query into useMemo!).
*/
export function useMinilinksQuery<L extends Link<Id>>(ml, query: QueryLink | Id, options?: MinilinksQueryOptions) {
return useMemo(() => ml.query(query, options), [ml, query]);
const miniName = useMemo(() => random(), []);
useMemo(() => {
ml.emitter.emit('useQuery.mount', { minilinks: ml, query, options });
}, []);
const results = useMemo(() => ml.query(query, options), [ml, query]);
useMemo(() => {
ml.emitter.emit('useQuery', {
minilinks: ml, query, options,
localData: results,
});
return () => {
ml.emitter.emit('useQuery.unmount', {
minilinks: ml, query, options,
localData: results,
});
};
}, [results]);
return results;
};

/**
* React hook. Returns reactiviely links from minilinks, by query in deeplinks dialect.
* Recalculates when data in minilinks changes. (Take query into useMemo!).
*/
export function useMinilinksSubscription<L extends Link<Id>>(ml, query: QueryLink | Id, options?: MinilinksQueryOptions) {
const miniName = useMemo(() => random(), []);
useMemo(() => {
ml.emitter.emit('useSubscription.mount', { minilinks: ml, query, options });
}, []);
const [d, setD] = useState();
const sRef = useRef<any>();
const qPrevRef = useRef<any>(query);
Expand All @@ -1055,7 +1088,20 @@ export function useMinilinksSubscription<L extends Link<Id>>(ml, query: QueryLin
sub.unsubscribe();
}
}, [q]);
return d || ml.query(q);
let results = d || (ml ? ml.query(q) : []);
useMemo(() => {
ml.emitter.emit('useSubscription', {
minilinks: ml, query, options,
localData: results,
});
return () => {
ml.emitter.emit('useSubscription.unmount', {
minilinks: ml, query, options,
localData: results,
});
};
}, [results]);
return results;
};

export function useMinilinksGenerator(
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@deep-foundation/deeplinks",
"version": "0.0.422",
"version": "0.0.424",
"license": "Unlicense",
"type": "module",
"scripts": {
Expand Down

0 comments on commit 4397535

Please sign in to comment.