@latticexyz/react 2.0.0-transaction-context-324984c5 → 2.0.0

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.
package/CHANGELOG.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # Change Log
2
2
 
3
- ## 2.0.0-transaction-context-324984c5
3
+ ## 2.0.0
4
4
 
5
5
  ### Major Changes
6
6
 
7
- - e3de1a33: Removes `useRow` and `useRows` hooks, previously powered by `store-cache`, which is now deprecated. Please use `recs` and the corresponding `useEntityQuery` and `useComponentValue` hooks. We'll have more hooks soon for SQL.js sync backends.
7
+ - e3de1a338: Removes `useRow` and `useRows` hooks, previously powered by `store-cache`, which is now deprecated. Please use `recs` and the corresponding `useEntityQuery` and `useComponentValue` hooks. We'll have more hooks soon for SQL.js sync backends.
8
8
 
9
9
  ### Minor Changes
10
10
 
11
- - 939916bc: Adds a `usePromise` hook that returns a [native `PromiseSettledResult` object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled).
11
+ - 939916bcd: Adds a `usePromise` hook that returns a [native `PromiseSettledResult` object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled).
12
12
 
13
13
  ```tsx
14
14
  const promise = fetch(url);
@@ -29,107 +29,144 @@
29
29
 
30
30
  ### Patch Changes
31
31
 
32
- - 59054203: TS packages now generate their respective `.d.ts` type definition files for better compatibility when using MUD with `moduleResolution` set to `bundler` or `node16` and fixes issues around missing type declarations for dependent packages.
33
- - 9ef3f9a7: Fixed an issue where `useComponentValue` would not detect a change and re-render if the component value was immediately removed.
34
- - Updated dependencies [7ce82b6f]
35
- - Updated dependencies [d8c8f66b]
36
- - Updated dependencies [c6c13f2e]
37
- - Updated dependencies [1b86eac0]
38
- - Updated dependencies [a35c05ea]
39
- - Updated dependencies [c963b46c]
40
- - Updated dependencies [05b3e888]
41
- - Updated dependencies [ce7125a1]
42
- - Updated dependencies [aea67c58]
43
- - Updated dependencies [07dd6f32]
44
- - Updated dependencies [c14f8bf1]
45
- - Updated dependencies [90e4161b]
46
- - Updated dependencies [aabd3076]
47
- - Updated dependencies [331dbfdc]
48
- - Updated dependencies [1d60930d]
49
- - Updated dependencies [f9f9609e]
50
- - Updated dependencies [904fd7d4]
51
- - Updated dependencies [e6c03a87]
52
- - Updated dependencies [1077c7f5]
53
- - Updated dependencies [b9e562d8]
54
- - Updated dependencies [759514d8]
55
- - Updated dependencies [952cd534]
56
- - Updated dependencies [d5094a24]
57
- - Updated dependencies [a2588116]
58
- - Updated dependencies [c4d5eb4e]
59
- - Updated dependencies [f62c767e]
60
- - Updated dependencies [de151fec]
61
- - Updated dependencies [37c228c6]
62
- - Updated dependencies [ae340b2b]
63
- - Updated dependencies [1bf2e908]
64
- - Updated dependencies [211be2a1]
65
- - Updated dependencies [0f3e2e02]
66
- - Updated dependencies [d0878928]
67
- - Updated dependencies [5c965a91]
68
- - Updated dependencies [f99e8898]
69
- - Updated dependencies [d5b73b12]
70
- - Updated dependencies [433078c5]
71
- - Updated dependencies [b2d2aa71]
72
- - Updated dependencies [83583a50]
73
- - Updated dependencies [5e723b90]
74
- - Updated dependencies [6573e38e]
75
- - Updated dependencies [afaf2f5f]
76
- - Updated dependencies [37c228c6]
77
- - Updated dependencies [37c228c6]
78
- - Updated dependencies [44a5432a]
79
- - Updated dependencies [6e66c5b7]
80
- - Updated dependencies [8d51a034]
81
- - Updated dependencies [1e2ad78e]
82
- - Updated dependencies [65c9546c]
83
- - Updated dependencies [48909d15]
84
- - Updated dependencies [7b28d32e]
85
- - Updated dependencies [59054203]
86
- - Updated dependencies [48c51b52]
87
- - Updated dependencies [9f8b84e7]
88
- - Updated dependencies [66cc35a8]
89
- - Updated dependencies [672d05ca]
90
- - Updated dependencies [55a05fd7]
91
- - Updated dependencies [63831a26]
92
- - Updated dependencies [6db95ce1]
93
- - Updated dependencies [5d737cf2]
94
- - Updated dependencies [a7b30c79]
95
- - Updated dependencies [92de5998]
96
- - Updated dependencies [22ee4470]
97
- - Updated dependencies [ad4ac445]
98
- - Updated dependencies [be313068]
99
- - Updated dependencies [ac508bf1]
100
- - Updated dependencies [bb91edaa]
101
- - Updated dependencies [5ac4c97f]
102
- - Updated dependencies [bfcb293d]
103
- - Updated dependencies [1890f1a0]
104
- - Updated dependencies [e4817174]
105
- - Updated dependencies [9b43029c]
106
- - Updated dependencies [37c228c6]
107
- - Updated dependencies [55ab88a6]
108
- - Updated dependencies [37c228c6]
109
- - Updated dependencies [53522998]
110
- - Updated dependencies [af639a26]
111
- - Updated dependencies [5e723b90]
112
- - Updated dependencies [99ab9cd6]
113
- - Updated dependencies [0d12db8c]
114
- - Updated dependencies [c049c23f]
115
- - Updated dependencies [80dd6992]
116
- - Updated dependencies [60cfd089]
117
- - Updated dependencies [24a6cd53]
118
- - Updated dependencies [37c228c6]
119
- - Updated dependencies [708b49c5]
120
- - Updated dependencies [3ac68ade]
121
- - Updated dependencies [22ba7b67]
122
- - Updated dependencies [5e71e1cb]
123
- - Updated dependencies [5c52bee0]
124
- - Updated dependencies [8025c350]
125
- - Updated dependencies [745485cd]
126
- - Updated dependencies [afdba793]
127
- - Updated dependencies [37c228c6]
128
- - Updated dependencies [cea754dd]
129
- - Updated dependencies [cc2c8da0]
130
- - Updated dependencies [103f635e]
131
- - @latticexyz/store@2.0.0-transaction-context-324984c5
132
- - @latticexyz/recs@2.0.0-transaction-context-324984c5
32
+ - 01e46d99: Removed some unused files, namely `curry` in `@latticexyz/common` and `useDeprecatedComputedValue` from `@latticexyz/react`.
33
+ - 590542030: TS packages now generate their respective `.d.ts` type definition files for better compatibility when using MUD with `moduleResolution` set to `bundler` or `node16` and fixes issues around missing type declarations for dependent packages.
34
+ - 9ef3f9a7c: Fixed an issue where `useComponentValue` would not detect a change and re-render if the component value was immediately removed.
35
+ - Updated dependencies [7ce82b6fc]
36
+ - Updated dependencies [d8c8f66bf]
37
+ - Updated dependencies [c6c13f2ea]
38
+ - Updated dependencies [1b86eac05]
39
+ - Updated dependencies [a35c05ea9]
40
+ - Updated dependencies [c9ee5e4a]
41
+ - Updated dependencies [c963b46c7]
42
+ - Updated dependencies [05b3e8882]
43
+ - Updated dependencies [ce7125a1b]
44
+ - Updated dependencies [aea67c580]
45
+ - Updated dependencies [07dd6f32c]
46
+ - Updated dependencies [c14f8bf1e]
47
+ - Updated dependencies [90e4161bb]
48
+ - Updated dependencies [aabd30767]
49
+ - Updated dependencies [331dbfdcb]
50
+ - Updated dependencies [1d60930d6]
51
+ - Updated dependencies [f9f9609ef]
52
+ - Updated dependencies [904fd7d4e]
53
+ - Updated dependencies [e6c03a87a]
54
+ - Updated dependencies [1077c7f53]
55
+ - Updated dependencies [2c920de7]
56
+ - Updated dependencies [b9e562d8f]
57
+ - Updated dependencies [44236041f]
58
+ - Updated dependencies [759514d8b]
59
+ - Updated dependencies [952cd5344]
60
+ - Updated dependencies [d5094a242]
61
+ - Updated dependencies [a25881160]
62
+ - Updated dependencies [c4d5eb4e4]
63
+ - Updated dependencies [f62c767e7]
64
+ - Updated dependencies [9aa5e786]
65
+ - Updated dependencies [de151fec0]
66
+ - Updated dependencies [37c228c63]
67
+ - Updated dependencies [c991c71a]
68
+ - Updated dependencies [ae340b2bf]
69
+ - Updated dependencies [1bf2e9087]
70
+ - Updated dependencies [211be2a1e]
71
+ - Updated dependencies [0f3e2e02b]
72
+ - Updated dependencies [d08789282]
73
+ - Updated dependencies [5c965a919]
74
+ - Updated dependencies [f99e88987]
75
+ - Updated dependencies [d5b73b126]
76
+ - Updated dependencies [190fdd11]
77
+ - Updated dependencies [433078c54]
78
+ - Updated dependencies [b2d2aa715]
79
+ - Updated dependencies [83583a505]
80
+ - Updated dependencies [5e723b90e]
81
+ - Updated dependencies [6573e38e9]
82
+ - Updated dependencies [afaf2f5ff]
83
+ - Updated dependencies [37c228c63]
84
+ - Updated dependencies [37c228c63]
85
+ - Updated dependencies [44a5432ac]
86
+ - Updated dependencies [6e66c5b74]
87
+ - Updated dependencies [8d51a0348]
88
+ - Updated dependencies [1e2ad78e2]
89
+ - Updated dependencies [65c9546c4]
90
+ - Updated dependencies [48909d151]
91
+ - Updated dependencies [7b28d32e5]
92
+ - Updated dependencies [590542030]
93
+ - Updated dependencies [48c51b52a]
94
+ - Updated dependencies [9f8b84e73]
95
+ - Updated dependencies [66cc35a8c]
96
+ - Updated dependencies [672d05ca1]
97
+ - Updated dependencies [55a05fd7a]
98
+ - Updated dependencies [63831a264]
99
+ - Updated dependencies [6db95ce15]
100
+ - Updated dependencies [8193136a9]
101
+ - Updated dependencies [5d737cf2e]
102
+ - Updated dependencies [a7b30c79b]
103
+ - Updated dependencies [92de59982]
104
+ - Updated dependencies [22ee44700]
105
+ - Updated dependencies [ad4ac4459]
106
+ - Updated dependencies [be313068b]
107
+ - Updated dependencies [ac508bf18]
108
+ - Updated dependencies [93390d89]
109
+ - Updated dependencies [bb91edaa0]
110
+ - Updated dependencies [144c0d8d]
111
+ - Updated dependencies [5ac4c97f4]
112
+ - Updated dependencies [bfcb293d1]
113
+ - Updated dependencies [1890f1a06]
114
+ - Updated dependencies [e48171741]
115
+ - Updated dependencies [9b43029c3]
116
+ - Updated dependencies [37c228c63]
117
+ - Updated dependencies [55ab88a60]
118
+ - Updated dependencies [c58da9ad]
119
+ - Updated dependencies [37c228c63]
120
+ - Updated dependencies [535229984]
121
+ - Updated dependencies [af639a264]
122
+ - Updated dependencies [5e723b90e]
123
+ - Updated dependencies [99ab9cd6f]
124
+ - Updated dependencies [0d12db8c2]
125
+ - Updated dependencies [c049c23f4]
126
+ - Updated dependencies [80dd6992e]
127
+ - Updated dependencies [60cfd089f]
128
+ - Updated dependencies [24a6cd536]
129
+ - Updated dependencies [37c228c63]
130
+ - Updated dependencies [708b49c50]
131
+ - Updated dependencies [3ac68ade6]
132
+ - Updated dependencies [22ba7b675]
133
+ - Updated dependencies [3042f86e]
134
+ - Updated dependencies [5e71e1cb5]
135
+ - Updated dependencies [d7b1c588a]
136
+ - Updated dependencies [5c52bee09]
137
+ - Updated dependencies [8025c3505]
138
+ - Updated dependencies [745485cda]
139
+ - Updated dependencies [afdba793f]
140
+ - Updated dependencies [37c228c63]
141
+ - Updated dependencies [3e7d83d0]
142
+ - Updated dependencies [cea754dde]
143
+ - Updated dependencies [cc2c8da00]
144
+ - Updated dependencies [252a1852]
145
+ - Updated dependencies [103f635eb]
146
+ - @latticexyz/store@2.0.0
147
+ - @latticexyz/recs@2.0.0
148
+
149
+ ## 2.0.0-next.18
150
+
151
+ ### Patch Changes
152
+
153
+ - 01e46d99: Removed some unused files, namely `curry` in `@latticexyz/common` and `useDeprecatedComputedValue` from `@latticexyz/react`.
154
+ - Updated dependencies [c9ee5e4a]
155
+ - Updated dependencies [2c920de7]
156
+ - Updated dependencies [44236041]
157
+ - Updated dependencies [9aa5e786]
158
+ - Updated dependencies [c991c71a]
159
+ - Updated dependencies [190fdd11]
160
+ - Updated dependencies [8193136a9]
161
+ - Updated dependencies [93390d89]
162
+ - Updated dependencies [144c0d8d]
163
+ - Updated dependencies [c58da9ad]
164
+ - Updated dependencies [3042f86e]
165
+ - Updated dependencies [d7b1c588a]
166
+ - Updated dependencies [3e7d83d0]
167
+ - Updated dependencies [252a1852]
168
+ - @latticexyz/store@2.0.0-next.18
169
+ - @latticexyz/recs@2.0.0-next.18
133
170
 
134
171
  ## 2.0.0-next.17
135
172
 
package/dist/index.d.ts CHANGED
@@ -1,16 +1,10 @@
1
1
  import * as _latticexyz_recs from '@latticexyz/recs';
2
2
  import { Schema, Component, Entity, ComponentValue, QueryFragment } from '@latticexyz/recs';
3
- import { IComputedValue } from 'mobx';
4
3
  import { Observable } from 'rxjs';
5
4
 
6
5
  declare function useComponentValue<S extends Schema>(component: Component<S>, entity: Entity | undefined, defaultValue: ComponentValue<S>): ComponentValue<S>;
7
6
  declare function useComponentValue<S extends Schema>(component: Component<S>, entity: Entity | undefined): ComponentValue<S> | undefined;
8
7
 
9
- /** @deprecated See https://github.com/latticexyz/mud/issues/339 */
10
- declare const useDeprecatedComputedValue: <T>(computedValue: IComputedValue<T> & {
11
- observe_: any;
12
- }) => T;
13
-
14
8
  /**
15
9
  * Returns all matching entities for a given entity query,
16
10
  * and triggers a re-render as new query results come in.
@@ -33,4 +27,4 @@ type UsePromiseResult<T> = PromiseSettledResult<Awaited<T>> | {
33
27
  };
34
28
  declare function usePromise<T>(promise: PromiseLike<T> | null | undefined): UsePromiseResult<T>;
35
29
 
36
- export { UsePromiseResult, useComponentValue, useDeprecatedComputedValue, useEntityQuery, useObservableValue, usePromise };
30
+ export { UsePromiseResult, useComponentValue, useEntityQuery, useObservableValue, usePromise };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{defineQuery as b,getComponentValue as f,Has as d,isComponentUpdate as S}from"@latticexyz/recs";import{useEffect as C,useState as T}from"react";function H(e,t,n){let[s,u]=T(t!=null?f(e,t):void 0);return C(()=>{if(u(t!=null?f(e,t):void 0),t==null)return;let o=b([d(e)],{runOnInit:!0}).update$.subscribe(r=>{if(S(r,e)&&r.entity===t){let[a]=r.value;u(a)}});return()=>o.unsubscribe()},[e,t]),s??n}import{useEffect as x,useState as V}from"react";var z=e=>{let[t,n]=V(e.get());return x(()=>{let s=e.observe_(()=>n(e.get()));return()=>s()},[e]),t};import{defineQuery as h}from"@latticexyz/recs";import{useEffect as y,useMemo as O,useState as R}from"react";import{useEffect as g,useState as v}from"react";import E from"fast-deep-equal";var m=e=>{let[t,n]=v(e);return g(()=>{E(e,t)||n(e)},[e]),t};import P from"fast-deep-equal";import{distinctUntilChanged as q,map as Q}from"rxjs";function te(e,t){let n=t?.updateOnValueChange??!0,s=m(e),u=O(()=>h(s,{runOnInit:!0}),[s]),[l,o]=R([...u.matching]);return y(()=>{o([...u.matching]);let r=u.update$.pipe(Q(()=>[...u.matching]));n||(r=r.pipe(q((i,c)=>P(i,c))));let a=r.subscribe(i=>o(i));return()=>a.unsubscribe()},[u,n]),l}import{useEffect as I,useState as U}from"react";function se(e,t){let[n,s]=U(t);return I(()=>{let u=e.subscribe(s);return()=>u.unsubscribe()},[e]),n}import{useEffect as p,useRef as D,useState as F}from"react";function ae(e){let t=D(e),[n,s]=F(e==null?{status:"idle"}:{status:"pending"});return p(()=>{e!==t.current&&(t.current=e,s(e==null?{status:"idle"}:{status:"pending"}))},[e]),p(()=>{e!=null&&Promise.allSettled([e]).then(([u])=>{e===t.current&&s(u)})},[e]),n}export{H as useComponentValue,z as useDeprecatedComputedValue,te as useEntityQuery,se as useObservableValue,ae as usePromise};
1
+ import{defineQuery as d,getComponentValue as f,Has as b,isComponentUpdate as S}from"@latticexyz/recs";import{useEffect as V,useState as x}from"react";function A(e,t,u){let[s,n]=x(t!=null?f(e,t):void 0);return V(()=>{if(n(t!=null?f(e,t):void 0),t==null)return;let r=d([b(e)],{runOnInit:!0}).update$.subscribe(o=>{if(S(o,e)&&o.entity===t){let[i]=o.value;n(i)}});return()=>r.unsubscribe()},[e,t]),s??u}import{defineQuery as E}from"@latticexyz/recs";import{useEffect as h,useMemo as v,useState as O}from"react";import{useEffect as C,useState as T}from"react";import g from"fast-deep-equal";var m=e=>{let[t,u]=T(e);return C(()=>{g(e,t)||u(e)},[e]),t};import y from"fast-deep-equal";import{distinctUntilChanged as R,map as P}from"rxjs";function X(e,t){let u=t?.updateOnValueChange??!0,s=m(e),n=v(()=>E(s,{runOnInit:!0}),[s]),[l,r]=O([...n.matching]);return h(()=>{r([...n.matching]);let o=n.update$.pipe(P(()=>[...n.matching]));u||(o=o.pipe(R((a,c)=>y(a,c))));let i=o.subscribe(a=>r(a));return()=>i.unsubscribe()},[n,u]),l}import{useEffect as q,useState as Q}from"react";function _(e,t){let[u,s]=Q(t);return q(()=>{let n=e.subscribe(s);return()=>n.unsubscribe()},[e]),u}import{useEffect as p,useRef as U,useState as F}from"react";function ne(e){let t=U(e),[u,s]=F(e==null?{status:"idle"}:{status:"pending"});return p(()=>{e!==t.current&&(t.current=e,s(e==null?{status:"idle"}:{status:"pending"}))},[e]),p(()=>{e!=null&&Promise.allSettled([e]).then(([n])=>{e===t.current&&s(n)})},[e]),u}export{A as useComponentValue,X as useEntityQuery,_ as useObservableValue,ne as usePromise};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useComponentValue.ts","../src/useDeprecatedComputedValue.ts","../src/useEntityQuery.ts","../src/utils/useDeepMemo.ts","../src/useObservableValue.ts","../src/usePromise.ts"],"sourcesContent":["import {\n Component,\n ComponentValue,\n defineQuery,\n Entity,\n getComponentValue,\n Has,\n isComponentUpdate,\n Schema,\n} from \"@latticexyz/recs\";\nimport { useEffect, useState } from \"react\";\n\nexport function useComponentValue<S extends Schema>(\n component: Component<S>,\n entity: Entity | undefined,\n defaultValue: ComponentValue<S>\n): ComponentValue<S>;\n\nexport function useComponentValue<S extends Schema>(\n component: Component<S>,\n entity: Entity | undefined\n): ComponentValue<S> | undefined;\n\nexport function useComponentValue<S extends Schema>(\n component: Component<S>,\n entity: Entity | undefined,\n defaultValue?: ComponentValue<S>\n) {\n const [value, setValue] = useState(entity != null ? getComponentValue(component, entity) : undefined);\n\n useEffect(() => {\n // component or entity changed, update state to latest value\n setValue(entity != null ? getComponentValue(component, entity) : undefined);\n if (entity == null) return;\n\n const queryResult = defineQuery([Has(component)], { runOnInit: true });\n const subscription = queryResult.update$.subscribe((update) => {\n if (isComponentUpdate(update, component) && update.entity === entity) {\n const [nextValue] = update.value;\n setValue(nextValue);\n }\n });\n return () => subscription.unsubscribe();\n }, [component, entity]);\n\n return value ?? defaultValue;\n}\n","import { IComputedValue } from \"mobx\";\nimport { useEffect, useState } from \"react\";\n\n/** @deprecated See https://github.com/latticexyz/mud/issues/339 */\nexport const useDeprecatedComputedValue = <T>(computedValue: IComputedValue<T> & { observe_: any }) => {\n const [value, setValue] = useState<T>(computedValue.get());\n\n useEffect(() => {\n const unsubscribe = computedValue.observe_(() => setValue(computedValue.get()));\n return () => unsubscribe();\n }, [computedValue]);\n\n return value;\n};\n","import { defineQuery, QueryFragment } from \"@latticexyz/recs\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useDeepMemo } from \"./utils/useDeepMemo\";\nimport isEqual from \"fast-deep-equal\";\nimport { distinctUntilChanged, map } from \"rxjs\";\n\n// This does a little more rendering than is necessary when arguments change,\n// but at least it's giving correct results now. Will optimize later!\n\n/**\n * Returns all matching entities for a given entity query,\n * and triggers a re-render as new query results come in.\n *\n * @param fragments Query fragments to match against, executed from left to right.\n * @param options.updateOnValueChange False - re-renders only on entity array changes. True (default) - also on component value changes.\n * @returns Set of entities matching the query fragments.\n */\nexport function useEntityQuery(fragments: QueryFragment[], options?: { updateOnValueChange?: boolean }) {\n const updateOnValueChange = options?.updateOnValueChange ?? true;\n\n const stableFragments = useDeepMemo(fragments);\n const query = useMemo(() => defineQuery(stableFragments, { runOnInit: true }), [stableFragments]);\n const [entities, setEntities] = useState([...query.matching]);\n\n useEffect(() => {\n setEntities([...query.matching]);\n let observable = query.update$.pipe(map(() => [...query.matching]));\n if (!updateOnValueChange) {\n // re-render only on entity array changes\n observable = observable.pipe(distinctUntilChanged((a, b) => isEqual(a, b)));\n }\n const subscription = observable.subscribe((entities) => setEntities(entities));\n return () => subscription.unsubscribe();\n }, [query, updateOnValueChange]);\n\n return entities;\n}\n","import { useEffect, useState } from \"react\";\nimport isEqual from \"fast-deep-equal\";\n\nexport const useDeepMemo = <T>(currentValue: T): T => {\n const [stableValue, setStableValue] = useState(currentValue);\n\n useEffect(() => {\n if (!isEqual(currentValue, stableValue)) {\n setStableValue(currentValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentValue]);\n\n return stableValue;\n};\n","import { useEffect, useState } from \"react\";\nimport { Observable } from \"rxjs\";\n\nexport function useObservableValue<T>(observable: Observable<T>, defaultValue: T): T;\n\nexport function useObservableValue<T>(observable: Observable<T>): T | undefined;\n\nexport function useObservableValue<T>(observable: Observable<T>, defaultValue?: T) {\n const [value, setValue] = useState(defaultValue);\n\n useEffect(() => {\n const subscription = observable.subscribe(setValue);\n return () => subscription.unsubscribe();\n }, [observable]);\n\n return value;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n// TODO: narrow type so `null`/`undefined` always return `{status: \"idle\"}`?\n\nexport type UsePromiseResult<T> = PromiseSettledResult<Awaited<T>> | { status: \"pending\" } | { status: \"idle\" };\n\nexport function usePromise<T>(promise: PromiseLike<T> | null | undefined) {\n const promiseRef = useRef(promise);\n const [result, setResult] = useState<UsePromiseResult<T>>(\n promise == null ? { status: \"idle\" } : { status: \"pending\" }\n );\n\n useEffect(() => {\n if (promise !== promiseRef.current) {\n promiseRef.current = promise;\n setResult(promise == null ? { status: \"idle\" } : { status: \"pending\" });\n }\n }, [promise]);\n\n useEffect(() => {\n if (promise == null) return;\n // TODO: do we need to check if result is already populated?\n Promise.allSettled([promise]).then(([settled]) => {\n if (promise === promiseRef.current) {\n setResult(settled);\n }\n });\n }, [promise]);\n\n return result;\n}\n"],"mappings":"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","names":["defineQuery","getComponentValue","Has","isComponentUpdate","useEffect","useState","useComponentValue","component","entity","defaultValue","value","setValue","subscription","update","nextValue","useEffect","useState","useDeprecatedComputedValue","computedValue","value","setValue","unsubscribe","defineQuery","useEffect","useMemo","useState","useEffect","useState","isEqual","useDeepMemo","currentValue","stableValue","setStableValue","isEqual","distinctUntilChanged","map","useEntityQuery","fragments","options","updateOnValueChange","stableFragments","useDeepMemo","query","useMemo","defineQuery","entities","setEntities","useState","useEffect","observable","a","b","subscription","useEffect","useState","useObservableValue","observable","defaultValue","value","setValue","subscription","useEffect","useRef","useState","usePromise","promise","promiseRef","result","setResult","settled"]}
1
+ {"version":3,"sources":["../src/useComponentValue.ts","../src/useEntityQuery.ts","../src/utils/useDeepMemo.ts","../src/useObservableValue.ts","../src/usePromise.ts"],"sourcesContent":["import {\n Component,\n ComponentValue,\n defineQuery,\n Entity,\n getComponentValue,\n Has,\n isComponentUpdate,\n Schema,\n} from \"@latticexyz/recs\";\nimport { useEffect, useState } from \"react\";\n\nexport function useComponentValue<S extends Schema>(\n component: Component<S>,\n entity: Entity | undefined,\n defaultValue: ComponentValue<S>,\n): ComponentValue<S>;\n\nexport function useComponentValue<S extends Schema>(\n component: Component<S>,\n entity: Entity | undefined,\n): ComponentValue<S> | undefined;\n\nexport function useComponentValue<S extends Schema>(\n component: Component<S>,\n entity: Entity | undefined,\n defaultValue?: ComponentValue<S>,\n) {\n const [value, setValue] = useState(entity != null ? getComponentValue(component, entity) : undefined);\n\n useEffect(() => {\n // component or entity changed, update state to latest value\n setValue(entity != null ? getComponentValue(component, entity) : undefined);\n if (entity == null) return;\n\n const queryResult = defineQuery([Has(component)], { runOnInit: true });\n const subscription = queryResult.update$.subscribe((update) => {\n if (isComponentUpdate(update, component) && update.entity === entity) {\n const [nextValue] = update.value;\n setValue(nextValue);\n }\n });\n return () => subscription.unsubscribe();\n }, [component, entity]);\n\n return value ?? defaultValue;\n}\n","import { defineQuery, QueryFragment } from \"@latticexyz/recs\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useDeepMemo } from \"./utils/useDeepMemo\";\nimport isEqual from \"fast-deep-equal\";\nimport { distinctUntilChanged, map } from \"rxjs\";\n\n// This does a little more rendering than is necessary when arguments change,\n// but at least it's giving correct results now. Will optimize later!\n\n/**\n * Returns all matching entities for a given entity query,\n * and triggers a re-render as new query results come in.\n *\n * @param fragments Query fragments to match against, executed from left to right.\n * @param options.updateOnValueChange False - re-renders only on entity array changes. True (default) - also on component value changes.\n * @returns Set of entities matching the query fragments.\n */\nexport function useEntityQuery(fragments: QueryFragment[], options?: { updateOnValueChange?: boolean }) {\n const updateOnValueChange = options?.updateOnValueChange ?? true;\n\n const stableFragments = useDeepMemo(fragments);\n const query = useMemo(() => defineQuery(stableFragments, { runOnInit: true }), [stableFragments]);\n const [entities, setEntities] = useState([...query.matching]);\n\n useEffect(() => {\n setEntities([...query.matching]);\n let observable = query.update$.pipe(map(() => [...query.matching]));\n if (!updateOnValueChange) {\n // re-render only on entity array changes\n observable = observable.pipe(distinctUntilChanged((a, b) => isEqual(a, b)));\n }\n const subscription = observable.subscribe((entities) => setEntities(entities));\n return () => subscription.unsubscribe();\n }, [query, updateOnValueChange]);\n\n return entities;\n}\n","import { useEffect, useState } from \"react\";\nimport isEqual from \"fast-deep-equal\";\n\nexport const useDeepMemo = <T>(currentValue: T): T => {\n const [stableValue, setStableValue] = useState(currentValue);\n\n useEffect(() => {\n if (!isEqual(currentValue, stableValue)) {\n setStableValue(currentValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentValue]);\n\n return stableValue;\n};\n","import { useEffect, useState } from \"react\";\nimport { Observable } from \"rxjs\";\n\nexport function useObservableValue<T>(observable: Observable<T>, defaultValue: T): T;\n\nexport function useObservableValue<T>(observable: Observable<T>): T | undefined;\n\nexport function useObservableValue<T>(observable: Observable<T>, defaultValue?: T) {\n const [value, setValue] = useState(defaultValue);\n\n useEffect(() => {\n const subscription = observable.subscribe(setValue);\n return () => subscription.unsubscribe();\n }, [observable]);\n\n return value;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n// TODO: narrow type so `null`/`undefined` always return `{status: \"idle\"}`?\n\nexport type UsePromiseResult<T> = PromiseSettledResult<Awaited<T>> | { status: \"pending\" } | { status: \"idle\" };\n\nexport function usePromise<T>(promise: PromiseLike<T> | null | undefined) {\n const promiseRef = useRef(promise);\n const [result, setResult] = useState<UsePromiseResult<T>>(\n promise == null ? { status: \"idle\" } : { status: \"pending\" },\n );\n\n useEffect(() => {\n if (promise !== promiseRef.current) {\n promiseRef.current = promise;\n setResult(promise == null ? { status: \"idle\" } : { status: \"pending\" });\n }\n }, [promise]);\n\n useEffect(() => {\n if (promise == null) return;\n // TODO: do we need to check if result is already populated?\n Promise.allSettled([promise]).then(([settled]) => {\n if (promise === promiseRef.current) {\n setResult(settled);\n }\n });\n }, [promise]);\n\n return result;\n}\n"],"mappings":"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","names":["defineQuery","getComponentValue","Has","isComponentUpdate","useEffect","useState","useComponentValue","component","entity","defaultValue","value","setValue","subscription","update","nextValue","defineQuery","useEffect","useMemo","useState","useEffect","useState","isEqual","useDeepMemo","currentValue","stableValue","setStableValue","isEqual","distinctUntilChanged","map","useEntityQuery","fragments","options","updateOnValueChange","stableFragments","useDeepMemo","query","useMemo","defineQuery","entities","setEntities","useState","useEffect","observable","b","subscription","useEffect","useState","useObservableValue","observable","defaultValue","value","setValue","subscription","useEffect","useRef","useState","usePromise","promise","promiseRef","result","setResult","settled"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/react",
3
- "version": "2.0.0-transaction-context-324984c5",
3
+ "version": "2.0.0",
4
4
  "description": "React tools for MUD client.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -18,8 +18,8 @@
18
18
  "mobx": "^6.7.0",
19
19
  "react": "^18.2.0",
20
20
  "rxjs": "7.5.5",
21
- "@latticexyz/recs": "2.0.0-transaction-context-324984c5",
22
- "@latticexyz/store": "2.0.0-transaction-context-324984c5"
21
+ "@latticexyz/recs": "2.0.0",
22
+ "@latticexyz/store": "2.0.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@testing-library/react-hooks": "^8.0.1",
@@ -33,7 +33,6 @@
33
33
  "vite": "^4.3.6",
34
34
  "vitest": "0.34.6"
35
35
  },
36
- "gitHead": "914a1e0ae4a573d685841ca2ea921435057deb8f",
37
36
  "scripts": {
38
37
  "build": "pnpm run build:js",
39
38
  "build:js": "tsup",
package/src/index.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  export * from "./useComponentValue";
2
- export * from "./useDeprecatedComputedValue";
3
2
  export * from "./useEntityQuery";
4
3
  export * from "./useObservableValue";
5
4
  export * from "./usePromise";
@@ -13,18 +13,18 @@ import { useEffect, useState } from "react";
13
13
  export function useComponentValue<S extends Schema>(
14
14
  component: Component<S>,
15
15
  entity: Entity | undefined,
16
- defaultValue: ComponentValue<S>
16
+ defaultValue: ComponentValue<S>,
17
17
  ): ComponentValue<S>;
18
18
 
19
19
  export function useComponentValue<S extends Schema>(
20
20
  component: Component<S>,
21
- entity: Entity | undefined
21
+ entity: Entity | undefined,
22
22
  ): ComponentValue<S> | undefined;
23
23
 
24
24
  export function useComponentValue<S extends Schema>(
25
25
  component: Component<S>,
26
26
  entity: Entity | undefined,
27
- defaultValue?: ComponentValue<S>
27
+ defaultValue?: ComponentValue<S>,
28
28
  ) {
29
29
  const [value, setValue] = useState(entity != null ? getComponentValue(component, entity) : undefined);
30
30
 
@@ -36,7 +36,7 @@ describe("useEntityQuery", () => {
36
36
 
37
37
  const { result } = renderHook(() => useEntityQuery([Has(Position)], { updateOnValueChange: false }));
38
38
  const { result: resultOnValueChange } = renderHook(() =>
39
- useEntityQuery([Has(Position)], { updateOnValueChange: true })
39
+ useEntityQuery([Has(Position)], { updateOnValueChange: true }),
40
40
  );
41
41
 
42
42
  expect(result.current.length).toBe(2);
@@ -80,7 +80,7 @@ describe("useEntityQuery", () => {
80
80
 
81
81
  const { result } = renderHook(() => useEntityQuery([Has(Position)], { updateOnValueChange: false }));
82
82
  const { result: resultOnValueChange } = renderHook(() =>
83
- useEntityQuery([Has(Position)], { updateOnValueChange: true })
83
+ useEntityQuery([Has(Position)], { updateOnValueChange: true }),
84
84
  );
85
85
 
86
86
  expect(result.all).toHaveLength(2);
package/src/usePromise.ts CHANGED
@@ -7,7 +7,7 @@ export type UsePromiseResult<T> = PromiseSettledResult<Awaited<T>> | { status: "
7
7
  export function usePromise<T>(promise: PromiseLike<T> | null | undefined) {
8
8
  const promiseRef = useRef(promise);
9
9
  const [result, setResult] = useState<UsePromiseResult<T>>(
10
- promise == null ? { status: "idle" } : { status: "pending" }
10
+ promise == null ? { status: "idle" } : { status: "pending" },
11
11
  );
12
12
 
13
13
  useEffect(() => {
@@ -1,14 +0,0 @@
1
- import { IComputedValue } from "mobx";
2
- import { useEffect, useState } from "react";
3
-
4
- /** @deprecated See https://github.com/latticexyz/mud/issues/339 */
5
- export const useDeprecatedComputedValue = <T>(computedValue: IComputedValue<T> & { observe_: any }) => {
6
- const [value, setValue] = useState<T>(computedValue.get());
7
-
8
- useEffect(() => {
9
- const unsubscribe = computedValue.observe_(() => setValue(computedValue.get()));
10
- return () => unsubscribe();
11
- }, [computedValue]);
12
-
13
- return value;
14
- };