atom.io 0.33.20 → 0.33.21

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.
@@ -16,7 +16,7 @@ function useJSON(token, key) {
16
16
  //#endregion
17
17
  //#region src/react/use-loadable.ts
18
18
  function useLoadable(...params) {
19
- let loadable;
19
+ let state;
20
20
  let fallback;
21
21
  const [token] = params;
22
22
  let key;
@@ -27,7 +27,7 @@ function useLoadable(...params) {
27
27
  case `readonly_pure_selector`:
28
28
  case `writable_held_selector`:
29
29
  case `writable_pure_selector`:
30
- loadable = useO$1(token);
30
+ state = useO$1(token);
31
31
  fallback = params[1];
32
32
  break;
33
33
  case `atom_family`:
@@ -37,23 +37,34 @@ function useLoadable(...params) {
37
37
  case `writable_held_selector_family`:
38
38
  case `writable_pure_selector_family`:
39
39
  key = params[1];
40
- loadable = useO$1(token, key);
40
+ state = useO$1(token, key);
41
41
  fallback = params[2];
42
42
  }
43
- const lastLoadedRef = React.useRef(fallback ?? (loadable instanceof Promise ? `LOADING` : loadable));
43
+ const wrapperRef = React.useRef({
44
+ loading: false,
45
+ value: null
46
+ });
47
+ const lastLoadedRef = React.useRef(fallback ?? (state instanceof Promise ? `LOADING` : state));
44
48
  const { current: lastLoaded } = lastLoadedRef;
45
- if (loadable instanceof Promise) {
49
+ let { current: wrapper } = wrapperRef;
50
+ if (state instanceof Promise) {
46
51
  if (lastLoaded === `LOADING`) return `LOADING`;
47
- return {
52
+ wrapper = wrapperRef.current = {
48
53
  loading: true,
49
54
  value: lastLoaded
50
55
  };
56
+ } else {
57
+ lastLoadedRef.current = state;
58
+ if (wrapper.loading === true) wrapper = wrapperRef.current = {
59
+ loading: false,
60
+ value: state
61
+ };
62
+ else {
63
+ wrapper.loading = false;
64
+ wrapper.value = state;
65
+ }
51
66
  }
52
- lastLoadedRef.current = loadable;
53
- return {
54
- loading: false,
55
- value: loadable
56
- };
67
+ return wrapper;
57
68
  }
58
69
 
59
70
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["token:\n\t\t| MutableAtomFamilyToken<any, Serializable, Key>\n\t\t| MutableAtomToken<any, Serializable>","key?: Key","React","stateToken: ReadableToken<any>","loadable: ReadableToken<any>","fallback: unknown","key: Canonical","useO","token: TimelineToken<any>","React"],"sources":["../../src/react/use-json.ts","../../src/react/use-loadable.ts","../../src/react/use-tl.ts"],"sourcesContent":["import type {\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableToken,\n} from \"atom.io\"\nimport { findInStore, getJsonToken } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport * as React from \"react\"\n\nimport { StoreContext } from \"./store-context\"\nimport { useO } from \"./use-o\"\n\nexport function useJSON<Serializable extends Json.Serializable>(\n\ttoken: MutableAtomToken<any, Serializable>,\n): Serializable\n\nexport function useJSON<\n\tSerializable extends Json.Serializable,\n\tKey extends Canonical,\n>(token: MutableAtomFamilyToken<any, Serializable, Key>, key: Key): Serializable\n\nexport function useJSON<\n\tSerializable extends Json.Serializable,\n\tKey extends Canonical,\n>(\n\ttoken:\n\t\t| MutableAtomFamilyToken<any, Serializable, Key>\n\t\t| MutableAtomToken<any, Serializable>,\n\tkey?: Key,\n): Serializable {\n\tconst store = React.useContext(StoreContext)\n\tconst stateToken: ReadableToken<any> =\n\t\ttoken.type === `mutable_atom_family`\n\t\t\t? findInStore(store, token, key as Key)\n\t\t\t: token\n\tconst jsonToken = getJsonToken(store, stateToken)\n\treturn useO(jsonToken)\n}\n","/** biome-ignore-all lint/correctness/useHookAtTopLevel: params are used in an invariant way */\nimport type { Loadable, ReadableFamilyToken, ReadableToken } from \"atom.io\"\nimport type { Canonical } from \"atom.io/json\"\nimport { useO } from \"atom.io/react\"\nimport React from \"react\"\n\nexport function useLoadable<T>(\n\ttoken: ReadableToken<Loadable<T>>,\n): `LOADING` | { loading: boolean; value: T }\n\nexport function useLoadable<T, K extends Canonical>(\n\ttoken: ReadableFamilyToken<Loadable<T>, K>,\n\tkey: K,\n): `LOADING` | { loading: boolean; value: T }\n\nexport function useLoadable<T, F extends T>(\n\ttoken: ReadableToken<Loadable<T>>,\n\tfallback: F,\n): { loading: boolean; value: T }\n\nexport function useLoadable<T, K extends Canonical, F extends T>(\n\ttoken: ReadableFamilyToken<Loadable<T>, K>,\n\tkey: K,\n\tfallback: F,\n): { loading: boolean; value: T }\n\nexport function useLoadable(\n\t...params:\n\t\t| readonly [ReadableFamilyToken<any, Canonical>, Canonical, unknown]\n\t\t| readonly [ReadableFamilyToken<any, Canonical>, Canonical]\n\t\t| readonly [ReadableToken<any>, unknown]\n\t\t| readonly [ReadableToken<any>]\n): `LOADING` | { loading: boolean; value: unknown } {\n\tlet loadable: ReadableToken<any>\n\tlet fallback: unknown\n\n\tconst [token] = params\n\tlet key: Canonical\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `mutable_atom`:\n\t\tcase `readonly_held_selector`:\n\t\tcase `readonly_pure_selector`:\n\t\tcase `writable_held_selector`:\n\t\tcase `writable_pure_selector`:\n\t\t\tloadable = useO(token)\n\t\t\tfallback = params[1]\n\t\t\tbreak\n\t\tcase `atom_family`:\n\t\tcase `mutable_atom_family`:\n\t\tcase `readonly_held_selector_family`:\n\t\tcase `readonly_pure_selector_family`:\n\t\tcase `writable_held_selector_family`:\n\t\tcase `writable_pure_selector_family`:\n\t\t\tkey = params[1] as Canonical\n\t\t\tloadable = useO(token, key)\n\t\t\tfallback = params[2]\n\t}\n\n\tconst lastLoadedRef = React.useRef(\n\t\tfallback ?? (loadable instanceof Promise ? `LOADING` : loadable),\n\t)\n\tconst { current: lastLoaded } = lastLoadedRef\n\tif (loadable instanceof Promise) {\n\t\tif (lastLoaded === `LOADING`) {\n\t\t\treturn `LOADING`\n\t\t}\n\t\treturn {\n\t\t\tloading: true,\n\t\t\tvalue: lastLoaded,\n\t\t}\n\t}\n\n\tlastLoadedRef.current = loadable\n\treturn {\n\t\tloading: false,\n\t\tvalue: loadable,\n\t}\n}\n","import type { TimelineToken } from \"atom.io\"\nimport { redo, undo } from \"atom.io\"\nimport { subscribeToTimeline, withdraw } from \"atom.io/internal\"\nimport * as React from \"react\"\n\nimport { StoreContext } from \"./store-context\"\n\nexport type TimelineMeta = {\n\tat: number\n\tlength: number\n\tundo: () => void\n\tredo: () => void\n}\n\nexport function useTL(token: TimelineToken<any>): TimelineMeta {\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\tconst timeline = withdraw(store, token)\n\tconst tokenRef = React.useRef(token)\n\tconst rebuildMeta = () => {\n\t\treturn {\n\t\t\tat: timeline.at,\n\t\t\tlength: timeline.history.length,\n\t\t\tundo: () => {\n\t\t\t\tundo(token)\n\t\t\t},\n\t\t\tredo: () => {\n\t\t\t\tredo(token)\n\t\t\t},\n\t\t}\n\t}\n\tconst meta = React.useRef<TimelineMeta>(rebuildMeta())\n\tconst retrieve = () => {\n\t\tif (\n\t\t\tmeta.current.at !== timeline?.at ||\n\t\t\tmeta.current.length !== timeline?.history.length ||\n\t\t\ttokenRef.current !== token\n\t\t) {\n\t\t\ttokenRef.current = token\n\t\t\tmeta.current = rebuildMeta()\n\t\t}\n\t\treturn meta.current\n\t}\n\treturn React.useSyncExternalStore<TimelineMeta>(\n\t\t(dispatch) => subscribeToTimeline(store, token, `use-tl:${id}`, dispatch),\n\t\tretrieve,\n\t\tretrieve,\n\t)\n}\n"],"mappings":";;;;;;;;AAqBA,SAAgB,QAIfA,OAGAC,KACe;CACf,MAAM,QAAQC,QAAM,WAAW,aAAa;CAC5C,MAAMC,aACL,MAAM,SAAS,CAAC,mBAAmB,CAAC,GACjC,YAAY,OAAO,OAAO,IAAW,GACrC;CACJ,MAAM,YAAY,aAAa,OAAO,WAAW;AACjD,QAAO,KAAK,UAAU;AACtB;;;;ACXD,SAAgB,YACf,GAAG,QAKgD;CACnD,IAAIC;CACJ,IAAIC;CAEJ,MAAM,CAAC,MAAM,GAAG;CAChB,IAAIC;AACJ,SAAQ,MAAM,MAAd;EACC,KAAK,CAAC,IAAI,CAAC;EACX,KAAK,CAAC,YAAY,CAAC;EACnB,KAAK,CAAC,sBAAsB,CAAC;EAC7B,KAAK,CAAC,sBAAsB,CAAC;EAC7B,KAAK,CAAC,sBAAsB,CAAC;EAC7B,KAAK,CAAC,sBAAsB,CAAC;GAC5B,WAAWC,OAAK,MAAM;GACtB,WAAW,OAAO;AAClB;EACD,KAAK,CAAC,WAAW,CAAC;EAClB,KAAK,CAAC,mBAAmB,CAAC;EAC1B,KAAK,CAAC,6BAA6B,CAAC;EACpC,KAAK,CAAC,6BAA6B,CAAC;EACpC,KAAK,CAAC,6BAA6B,CAAC;EACpC,KAAK,CAAC,6BAA6B,CAAC;GACnC,MAAM,OAAO;GACb,WAAWA,OAAK,OAAO,IAAI;GAC3B,WAAW,OAAO;CACnB;CAED,MAAM,gBAAgB,MAAM,OAC3B,aAAa,oBAAoB,UAAU,CAAC,OAAO,CAAC,GAAG,UACvD;CACD,MAAM,EAAE,SAAS,YAAY,GAAG;AAChC,KAAI,oBAAoB,SAAS;AAChC,MAAI,eAAe,CAAC,OAAO,CAAC,CAC3B,QAAO,CAAC,OAAO,CAAC;AAEjB,SAAO;GACN,SAAS;GACT,OAAO;EACP;CACD;CAED,cAAc,UAAU;AACxB,QAAO;EACN,SAAS;EACT,OAAO;CACP;AACD;;;;AChED,SAAgB,MAAMC,OAAyC;CAC9D,MAAM,QAAQC,QAAM,WAAW,aAAa;CAC5C,MAAM,KAAKA,QAAM,OAAO;CACxB,MAAM,WAAW,SAAS,OAAO,MAAM;CACvC,MAAM,WAAWA,QAAM,OAAO,MAAM;CACpC,MAAM,cAAc,MAAM;AACzB,SAAO;GACN,IAAI,SAAS;GACb,QAAQ,SAAS,QAAQ;GACzB,MAAM,MAAM;IACX,KAAK,MAAM;GACX;GACD,MAAM,MAAM;IACX,KAAK,MAAM;GACX;EACD;CACD;CACD,MAAM,OAAOA,QAAM,OAAqB,aAAa,CAAC;CACtD,MAAM,WAAW,MAAM;AACtB,MACC,KAAK,QAAQ,OAAO,UAAU,MAC9B,KAAK,QAAQ,WAAW,UAAU,QAAQ,UAC1C,SAAS,YAAY,OACpB;GACD,SAAS,UAAU;GACnB,KAAK,UAAU,aAAa;EAC5B;AACD,SAAO,KAAK;CACZ;AACD,QAAOA,QAAM,qBACZ,CAAC,aAAa,oBAAoB,OAAO,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EACzE,UACA,SACA;AACD"}
1
+ {"version":3,"file":"index.js","names":["token:\n\t\t| MutableAtomFamilyToken<any, Serializable, Key>\n\t\t| MutableAtomToken<any, Serializable>","key?: Key","React","stateToken: ReadableToken<any>","state: unknown","fallback: unknown","key: Canonical","useO","token: TimelineToken<any>","React"],"sources":["../../src/react/use-json.ts","../../src/react/use-loadable.ts","../../src/react/use-tl.ts"],"sourcesContent":["import type {\n\tMutableAtomFamilyToken,\n\tMutableAtomToken,\n\tReadableToken,\n} from \"atom.io\"\nimport { findInStore, getJsonToken } from \"atom.io/internal\"\nimport type { Canonical, Json } from \"atom.io/json\"\nimport * as React from \"react\"\n\nimport { StoreContext } from \"./store-context\"\nimport { useO } from \"./use-o\"\n\nexport function useJSON<Serializable extends Json.Serializable>(\n\ttoken: MutableAtomToken<any, Serializable>,\n): Serializable\n\nexport function useJSON<\n\tSerializable extends Json.Serializable,\n\tKey extends Canonical,\n>(token: MutableAtomFamilyToken<any, Serializable, Key>, key: Key): Serializable\n\nexport function useJSON<\n\tSerializable extends Json.Serializable,\n\tKey extends Canonical,\n>(\n\ttoken:\n\t\t| MutableAtomFamilyToken<any, Serializable, Key>\n\t\t| MutableAtomToken<any, Serializable>,\n\tkey?: Key,\n): Serializable {\n\tconst store = React.useContext(StoreContext)\n\tconst stateToken: ReadableToken<any> =\n\t\ttoken.type === `mutable_atom_family`\n\t\t\t? findInStore(store, token, key as Key)\n\t\t\t: token\n\tconst jsonToken = getJsonToken(store, stateToken)\n\treturn useO(jsonToken)\n}\n","/** biome-ignore-all lint/correctness/useHookAtTopLevel: params are used in an invariant way */\nimport type { Loadable, ReadableFamilyToken, ReadableToken } from \"atom.io\"\nimport type { Canonical } from \"atom.io/json\"\nimport { useO } from \"atom.io/react\"\nimport React from \"react\"\n\nexport function useLoadable<T>(\n\ttoken: ReadableToken<Loadable<T>>,\n): `LOADING` | { loading: boolean; value: T }\n\nexport function useLoadable<T, K extends Canonical>(\n\ttoken: ReadableFamilyToken<Loadable<T>, K>,\n\tkey: K,\n): `LOADING` | { loading: boolean; value: T }\n\nexport function useLoadable<T, F extends T>(\n\ttoken: ReadableToken<Loadable<T>>,\n\tfallback: F,\n): { loading: boolean; value: T }\n\nexport function useLoadable<T, K extends Canonical, F extends T>(\n\ttoken: ReadableFamilyToken<Loadable<T>, K>,\n\tkey: K,\n\tfallback: F,\n): { loading: boolean; value: T }\n\nexport function useLoadable(\n\t...params:\n\t\t| readonly [ReadableFamilyToken<any, Canonical>, Canonical, unknown]\n\t\t| readonly [ReadableFamilyToken<any, Canonical>, Canonical]\n\t\t| readonly [ReadableToken<any>, unknown]\n\t\t| readonly [ReadableToken<any>]\n): `LOADING` | { loading: boolean; value: unknown } {\n\tlet state: unknown\n\tlet fallback: unknown\n\n\tconst [token] = params\n\tlet key: Canonical\n\tswitch (token.type) {\n\t\tcase `atom`:\n\t\tcase `mutable_atom`:\n\t\tcase `readonly_held_selector`:\n\t\tcase `readonly_pure_selector`:\n\t\tcase `writable_held_selector`:\n\t\tcase `writable_pure_selector`:\n\t\t\tstate = useO(token)\n\t\t\tfallback = params[1]\n\t\t\tbreak\n\t\tcase `atom_family`:\n\t\tcase `mutable_atom_family`:\n\t\tcase `readonly_held_selector_family`:\n\t\tcase `readonly_pure_selector_family`:\n\t\tcase `writable_held_selector_family`:\n\t\tcase `writable_pure_selector_family`:\n\t\t\tkey = params[1] as Canonical\n\t\t\tstate = useO(token, key)\n\t\t\tfallback = params[2]\n\t}\n\n\tconst wrapperRef = React.useRef({ loading: false, value: null as unknown })\n\tconst lastLoadedRef = React.useRef(\n\t\tfallback ?? (state instanceof Promise ? `LOADING` : state),\n\t)\n\n\tconst { current: lastLoaded } = lastLoadedRef\n\tlet { current: wrapper } = wrapperRef\n\n\tif (state instanceof Promise) {\n\t\tif (lastLoaded === `LOADING`) {\n\t\t\treturn `LOADING`\n\t\t}\n\t\twrapper = wrapperRef.current = { loading: true, value: lastLoaded }\n\t} else {\n\t\tlastLoadedRef.current = state\n\t\tif (wrapper.loading === true) {\n\t\t\twrapper = wrapperRef.current = { loading: false, value: state }\n\t\t} else {\n\t\t\twrapper.loading = false\n\t\t\twrapper.value = state\n\t\t}\n\t}\n\n\treturn wrapper\n}\n","import type { TimelineToken } from \"atom.io\"\nimport { redo, undo } from \"atom.io\"\nimport { subscribeToTimeline, withdraw } from \"atom.io/internal\"\nimport * as React from \"react\"\n\nimport { StoreContext } from \"./store-context\"\n\nexport type TimelineMeta = {\n\tat: number\n\tlength: number\n\tundo: () => void\n\tredo: () => void\n}\n\nexport function useTL(token: TimelineToken<any>): TimelineMeta {\n\tconst store = React.useContext(StoreContext)\n\tconst id = React.useId()\n\tconst timeline = withdraw(store, token)\n\tconst tokenRef = React.useRef(token)\n\tconst rebuildMeta = () => {\n\t\treturn {\n\t\t\tat: timeline.at,\n\t\t\tlength: timeline.history.length,\n\t\t\tundo: () => {\n\t\t\t\tundo(token)\n\t\t\t},\n\t\t\tredo: () => {\n\t\t\t\tredo(token)\n\t\t\t},\n\t\t}\n\t}\n\tconst meta = React.useRef<TimelineMeta>(rebuildMeta())\n\tconst retrieve = () => {\n\t\tif (\n\t\t\tmeta.current.at !== timeline?.at ||\n\t\t\tmeta.current.length !== timeline?.history.length ||\n\t\t\ttokenRef.current !== token\n\t\t) {\n\t\t\ttokenRef.current = token\n\t\t\tmeta.current = rebuildMeta()\n\t\t}\n\t\treturn meta.current\n\t}\n\treturn React.useSyncExternalStore<TimelineMeta>(\n\t\t(dispatch) => subscribeToTimeline(store, token, `use-tl:${id}`, dispatch),\n\t\tretrieve,\n\t\tretrieve,\n\t)\n}\n"],"mappings":";;;;;;;;AAqBA,SAAgB,QAIfA,OAGAC,KACe;CACf,MAAM,QAAQC,QAAM,WAAW,aAAa;CAC5C,MAAMC,aACL,MAAM,SAAS,CAAC,mBAAmB,CAAC,GACjC,YAAY,OAAO,OAAO,IAAW,GACrC;CACJ,MAAM,YAAY,aAAa,OAAO,WAAW;AACjD,QAAO,KAAK,UAAU;AACtB;;;;ACXD,SAAgB,YACf,GAAG,QAKgD;CACnD,IAAIC;CACJ,IAAIC;CAEJ,MAAM,CAAC,MAAM,GAAG;CAChB,IAAIC;AACJ,SAAQ,MAAM,MAAd;EACC,KAAK,CAAC,IAAI,CAAC;EACX,KAAK,CAAC,YAAY,CAAC;EACnB,KAAK,CAAC,sBAAsB,CAAC;EAC7B,KAAK,CAAC,sBAAsB,CAAC;EAC7B,KAAK,CAAC,sBAAsB,CAAC;EAC7B,KAAK,CAAC,sBAAsB,CAAC;GAC5B,QAAQC,OAAK,MAAM;GACnB,WAAW,OAAO;AAClB;EACD,KAAK,CAAC,WAAW,CAAC;EAClB,KAAK,CAAC,mBAAmB,CAAC;EAC1B,KAAK,CAAC,6BAA6B,CAAC;EACpC,KAAK,CAAC,6BAA6B,CAAC;EACpC,KAAK,CAAC,6BAA6B,CAAC;EACpC,KAAK,CAAC,6BAA6B,CAAC;GACnC,MAAM,OAAO;GACb,QAAQA,OAAK,OAAO,IAAI;GACxB,WAAW,OAAO;CACnB;CAED,MAAM,aAAa,MAAM,OAAO;EAAE,SAAS;EAAO,OAAO;CAAiB,EAAC;CAC3E,MAAM,gBAAgB,MAAM,OAC3B,aAAa,iBAAiB,UAAU,CAAC,OAAO,CAAC,GAAG,OACpD;CAED,MAAM,EAAE,SAAS,YAAY,GAAG;CAChC,IAAI,EAAE,SAAS,SAAS,GAAG;AAE3B,KAAI,iBAAiB,SAAS;AAC7B,MAAI,eAAe,CAAC,OAAO,CAAC,CAC3B,QAAO,CAAC,OAAO,CAAC;EAEjB,UAAU,WAAW,UAAU;GAAE,SAAS;GAAM,OAAO;EAAY;CACnE,OAAM;EACN,cAAc,UAAU;AACxB,MAAI,QAAQ,YAAY,MACvB,UAAU,WAAW,UAAU;GAAE,SAAS;GAAO,OAAO;EAAO;OACzD;GACN,QAAQ,UAAU;GAClB,QAAQ,QAAQ;EAChB;CACD;AAED,QAAO;AACP;;;;ACrED,SAAgB,MAAMC,OAAyC;CAC9D,MAAM,QAAQC,QAAM,WAAW,aAAa;CAC5C,MAAM,KAAKA,QAAM,OAAO;CACxB,MAAM,WAAW,SAAS,OAAO,MAAM;CACvC,MAAM,WAAWA,QAAM,OAAO,MAAM;CACpC,MAAM,cAAc,MAAM;AACzB,SAAO;GACN,IAAI,SAAS;GACb,QAAQ,SAAS,QAAQ;GACzB,MAAM,MAAM;IACX,KAAK,MAAM;GACX;GACD,MAAM,MAAM;IACX,KAAK,MAAM;GACX;EACD;CACD;CACD,MAAM,OAAOA,QAAM,OAAqB,aAAa,CAAC;CACtD,MAAM,WAAW,MAAM;AACtB,MACC,KAAK,QAAQ,OAAO,UAAU,MAC9B,KAAK,QAAQ,WAAW,UAAU,QAAQ,UAC1C,SAAS,YAAY,OACpB;GACD,SAAS,UAAU;GACnB,KAAK,UAAU,aAAa;EAC5B;AACD,SAAO,KAAK;CACZ;AACD,QAAOA,QAAM,qBACZ,CAAC,aAAa,oBAAoB,OAAO,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EACzE,UACA,SACA;AACD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atom.io",
3
- "version": "0.33.20",
3
+ "version": "0.33.21",
4
4
  "description": "Composable and testable reactive data library.",
5
5
  "homepage": "https://atom.io.fyi",
6
6
  "sideEffects": false,
@@ -83,7 +83,7 @@
83
83
  "eslint": "9.32.0",
84
84
  "happy-dom": "18.0.1",
85
85
  "http-proxy": "1.18.1",
86
- "motion": "12.23.11",
86
+ "motion": "12.23.12",
87
87
  "npmlog": "7.0.1",
88
88
  "nyc": "17.1.0",
89
89
  "postgres": "3.4.7",
@@ -33,6 +33,7 @@ export function cacheValue<T>(
33
33
  if (currentValue instanceof Future) {
34
34
  const future = currentValue
35
35
  if (value instanceof Promise) {
36
+ future.use(value)
36
37
  return future
37
38
  }
38
39
  target.valueMap.set(key, value)
@@ -31,7 +31,7 @@ export function useLoadable(
31
31
  | readonly [ReadableToken<any>, unknown]
32
32
  | readonly [ReadableToken<any>]
33
33
  ): `LOADING` | { loading: boolean; value: unknown } {
34
- let loadable: ReadableToken<any>
34
+ let state: unknown
35
35
  let fallback: unknown
36
36
 
37
37
  const [token] = params
@@ -43,7 +43,7 @@ export function useLoadable(
43
43
  case `readonly_pure_selector`:
44
44
  case `writable_held_selector`:
45
45
  case `writable_pure_selector`:
46
- loadable = useO(token)
46
+ state = useO(token)
47
47
  fallback = params[1]
48
48
  break
49
49
  case `atom_family`:
@@ -53,27 +53,32 @@ export function useLoadable(
53
53
  case `writable_held_selector_family`:
54
54
  case `writable_pure_selector_family`:
55
55
  key = params[1] as Canonical
56
- loadable = useO(token, key)
56
+ state = useO(token, key)
57
57
  fallback = params[2]
58
58
  }
59
59
 
60
+ const wrapperRef = React.useRef({ loading: false, value: null as unknown })
60
61
  const lastLoadedRef = React.useRef(
61
- fallback ?? (loadable instanceof Promise ? `LOADING` : loadable),
62
+ fallback ?? (state instanceof Promise ? `LOADING` : state),
62
63
  )
64
+
63
65
  const { current: lastLoaded } = lastLoadedRef
64
- if (loadable instanceof Promise) {
66
+ let { current: wrapper } = wrapperRef
67
+
68
+ if (state instanceof Promise) {
65
69
  if (lastLoaded === `LOADING`) {
66
70
  return `LOADING`
67
71
  }
68
- return {
69
- loading: true,
70
- value: lastLoaded,
72
+ wrapper = wrapperRef.current = { loading: true, value: lastLoaded }
73
+ } else {
74
+ lastLoadedRef.current = state
75
+ if (wrapper.loading === true) {
76
+ wrapper = wrapperRef.current = { loading: false, value: state }
77
+ } else {
78
+ wrapper.loading = false
79
+ wrapper.value = state
71
80
  }
72
81
  }
73
82
 
74
- lastLoadedRef.current = loadable
75
- return {
76
- loading: false,
77
- value: loadable,
78
- }
83
+ return wrapper
79
84
  }