import { useSyncExternalStore } from "react"; import { RequestBuilder, System } from "System"; import { FlatNoteStore, NoteStore, StoreSnapshot } from "System/NoteCollection"; import { unwrap } from "Util"; const useRequestBuilder = >( type: { new (): TStore }, rb: RequestBuilder | null, debounced?: number ) => { const subscribe = (onChanged: () => void) => { const store = System.Query(type, rb); let t: ReturnType | undefined; const release = store.hook(() => { if (!t) { t = setTimeout(() => { clearTimeout(t); t = undefined; onChanged(); }, debounced ?? 500); } }); return () => { if (rb?.id) { System.CancelQuery(rb.id); } release(); }; }; const emptyStore = { data: undefined, store: new FlatNoteStore(), } as StoreSnapshot; const getState = (): StoreSnapshot => { if (rb?.id) { const feed = System.GetFeed(rb.id); if (feed) { return unwrap(feed).snapshot as StoreSnapshot; } } return emptyStore; }; return useSyncExternalStore>( v => subscribe(v), () => getState() ); }; export default useRequestBuilder;