muya 2.4.5 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- import{useCallback as l,useLayoutEffect as A,useReducer as v,useRef as D}from"react";import{DEFAULT_PAGE_SIZE as O}from"./table";const I=1e4;function _(u,g={},k=[]){const{select:p,pageSize:P=O}=g,e=D(),[,w]=v(n=>n+1,0),t=D(new Map),S=D(),b=l(()=>{const{select:n,...o}=g;S.current=u.search({select:(c,s)=>({doc:c,meta:s}),...o})},[u,...k]),f=l(()=>{e.current=[],t.current.clear(),b()},[b]),m=l(async n=>{e.current===void 0&&(e.current=[]),n===!0&&f();const{current:o}=S;if(!o)return!0;let c=!1;for(let s=0;s<P;s++){const r=await o.next();if(r.done){S.current=void 0,c=!0;break}if(t.current.has(r.value.meta.key)){s+=-1;continue}e.current.push(p?p(r.value.doc):r.value.doc),t.current.set(r.value.meta.key,e.current.length-1)}return c},[]),y=l(async()=>{const n=await m(!1);return w(),n},[m]);A(()=>{const n=u.subscribe(async o=>{const{mutations:c,removedAll:s}=o;if(s&&f(),!c)return;const r=e.current?.length??0;let h=r,x=!1;for(const i of c){const{key:a,op:q}=i;switch(q){case"insert":{h+=1;break}case"delete":{if(e.current&&t.current.has(a)){const d=t.current.get(a);if(d===void 0)break;e.current.splice(d,1),t.current.delete(a),x=!0}break}case"update":{if(e.current&&t.current.has(a)){const d=t.current.get(a);if(d===void 0)break;e.current[d]=await u.get(a,p),x=!0}break}}}const L=r!==h;if(L||x){if(L){await m(!0);let i=0;for(;(e.current?.length??0)<h&&i<I;)await m(!1),i++;i===I&&console.warn("Reached maximum iterations in fillNextPage loop. Possible duplicate or data issue.")}w()}});return()=>{n()}},[u]),A(()=>{b(),e.current=void 0,t.current.clear(),y()},k);const T=l(async()=>{f(),await y()},[y,f]);return[e.current,{nextPage:y,reset:T,keysIndex:t.current}]}export{_ as useSqliteValue};
1
+ import{useCallback as f,useLayoutEffect as A,useReducer as R,useRef as x}from"react";import{DEFAULT_PAGE_SIZE as v}from"./table";const I=1e4;function _(u,D={},g=[]){const{select:p,pageSize:P=v}=D,e=x(),[,k]=R(n=>n+1,0),t=x(new Map),S=x(),w=f(()=>{const{select:n,...o}=D;S.current=u.search({select:(c,s)=>({doc:c,meta:s}),...o})},[u,...g]),i=f(()=>{e.current=[],t.current.clear(),w()},[w]),m=f(async n=>{e.current===void 0&&(e.current=[]),n===!0&&i();const{current:o}=S;if(!o)return!0;let c=!1;for(let s=0;s<P;s++){const r=await o.next();if(r.done){S.current=void 0,c=!0;break}if(t.current.has(r.value.meta.key)){s+=-1;continue}e.current.push(p?p(r.value.doc):r.value.doc),t.current.set(r.value.meta.key,e.current.length-1)}return c},[]),y=f(async()=>{const n=await m(!1);return k(),n},[m]);A(()=>{const n=u.subscribe(async o=>{const{mutations:c,removedAll:s}=o;if(s&&i(),!c)return;const r=e.current?.length??0;let b=r,h=!1;for(const l of c){const{key:a,op:q}=l;switch(q){case"insert":{b+=1;break}case"delete":{if(e.current&&t.current.has(a)){const d=t.current.get(a);if(d===void 0)break;e.current.splice(d,1),t.current.delete(a),e.current=[...e.current],h=!0}break}case"update":{if(e.current&&t.current.has(a)){const d=t.current.get(a);if(d===void 0)break;e.current[d]=await u.get(a,p),e.current=[...e.current],h=!0}break}}}const L=r!==b;if(L||h){if(L){await m(!0);let l=0;for(;(e.current?.length??0)<b&&l<I;)await m(!1),l++;l===I&&console.warn("Reached maximum iterations in fillNextPage loop. Possible duplicate or data issue.")}k()}});return()=>{n()}},[u]),A(()=>{i(),y()},g);const T=f(async()=>{i(),await y()},[y,i]);return[e.current,{nextPage:y,reset:T,keysIndex:t.current}]}export{_ as useSqliteValue};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "muya",
3
- "version": "2.4.5",
3
+ "version": "2.4.6",
4
4
  "author": "samuel.gjabel@gmail.com",
5
5
  "repository": "https://github.com/samuelgjabel/muya",
6
6
  "main": "cjs/index.js",
@@ -17,6 +17,7 @@ export interface SqLiteActions {
17
17
  */
18
18
  readonly reset: () => Promise<void>
19
19
  readonly keysIndex: Map<Key, number>
20
+ readonly isResetting?: boolean
20
21
  }
21
22
 
22
23
  export interface UseSearchOptions<Document extends DocType, Selected = Document> extends SqlSeachOptions<Document> {
@@ -123,6 +124,7 @@ export function useSqliteValue<Document extends DocType, Selected = Document>(
123
124
  if (index === undefined) break
124
125
  itemsRef.current.splice(index, 1)
125
126
  keysIndex.current.delete(key)
127
+ itemsRef.current = [...itemsRef.current]
126
128
  hasUpdate = true
127
129
  }
128
130
  break
@@ -132,6 +134,7 @@ export function useSqliteValue<Document extends DocType, Selected = Document>(
132
134
  const index = keysIndex.current.get(key)
133
135
  if (index === undefined) break
134
136
  itemsRef.current[index] = (await state.get(key, select)) as Selected
137
+ itemsRef.current = [...itemsRef.current]
135
138
  hasUpdate = true
136
139
  }
137
140
  break
@@ -167,9 +170,7 @@ export function useSqliteValue<Document extends DocType, Selected = Document>(
167
170
  }, [state])
168
171
 
169
172
  useLayoutEffect(() => {
170
- updateIterator()
171
- itemsRef.current = undefined
172
- keysIndex.current.clear()
173
+ reset()
173
174
  nextPage()
174
175
  // eslint-disable-next-line react-hooks/exhaustive-deps
175
176
  }, deps)
@@ -13,6 +13,7 @@ export interface SqLiteActions {
13
13
  */
14
14
  readonly reset: () => Promise<void>;
15
15
  readonly keysIndex: Map<Key, number>;
16
+ readonly isResetting?: boolean;
16
17
  }
17
18
  export interface UseSearchOptions<Document extends DocType, Selected = Document> extends SqlSeachOptions<Document> {
18
19
  /**