@sundaeswap/wallet-lite 0.0.33 → 0.0.35

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.
Files changed (86) hide show
  1. package/dist/cjs/classes/WalletObserver.class.js +13 -22
  2. package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
  3. package/dist/cjs/react-components/RenderWallet.js +18 -3
  4. package/dist/cjs/react-components/RenderWallet.js.map +1 -1
  5. package/dist/cjs/react-components/RenderWalletHandles.js +18 -3
  6. package/dist/cjs/react-components/RenderWalletHandles.js.map +1 -1
  7. package/dist/cjs/react-components/RenderWalletPeerConnect.js +14 -3
  8. package/dist/cjs/react-components/RenderWalletPeerConnect.js.map +1 -1
  9. package/dist/cjs/react-components/RenderWalletState.js +17 -3
  10. package/dist/cjs/react-components/RenderWalletState.js.map +1 -1
  11. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js +7 -0
  12. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  13. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +63 -49
  14. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  15. package/dist/cjs/react-components/contexts/observer/types.js.map +1 -1
  16. package/dist/cjs/react-components/hooks/useWalletHandles.js +111 -107
  17. package/dist/cjs/react-components/hooks/useWalletHandles.js.map +1 -1
  18. package/dist/cjs/react-components/hooks/useWalletLoadingState.js +13 -5
  19. package/dist/cjs/react-components/hooks/useWalletLoadingState.js.map +1 -1
  20. package/dist/cjs/react-components/hooks/useWalletObserver.js +3 -1
  21. package/dist/cjs/react-components/hooks/useWalletObserver.js.map +1 -1
  22. package/dist/cjs/react-components/hooks/useWalletPeerConnect.js +13 -4
  23. package/dist/cjs/react-components/hooks/useWalletPeerConnect.js.map +1 -1
  24. package/dist/cjs/utils/getLibs.js +18 -35
  25. package/dist/cjs/utils/getLibs.js.map +1 -1
  26. package/dist/esm/classes/WalletObserver.class.js +9 -29
  27. package/dist/esm/classes/WalletObserver.class.js.map +1 -1
  28. package/dist/esm/react-components/RenderWallet.js +19 -4
  29. package/dist/esm/react-components/RenderWallet.js.map +1 -1
  30. package/dist/esm/react-components/RenderWalletHandles.js +21 -6
  31. package/dist/esm/react-components/RenderWalletHandles.js.map +1 -1
  32. package/dist/esm/react-components/RenderWalletPeerConnect.js +16 -5
  33. package/dist/esm/react-components/RenderWalletPeerConnect.js.map +1 -1
  34. package/dist/esm/react-components/RenderWalletState.js +19 -6
  35. package/dist/esm/react-components/RenderWalletState.js.map +1 -1
  36. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js +8 -1
  37. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  38. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +34 -29
  39. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  40. package/dist/esm/react-components/contexts/observer/types.js.map +1 -1
  41. package/dist/esm/react-components/hooks/useWalletHandles.js +46 -51
  42. package/dist/esm/react-components/hooks/useWalletHandles.js.map +1 -1
  43. package/dist/esm/react-components/hooks/useWalletLoadingState.js +5 -5
  44. package/dist/esm/react-components/hooks/useWalletLoadingState.js.map +1 -1
  45. package/dist/esm/react-components/hooks/useWalletObserver.js +3 -1
  46. package/dist/esm/react-components/hooks/useWalletObserver.js.map +1 -1
  47. package/dist/esm/react-components/hooks/useWalletPeerConnect.js +13 -3
  48. package/dist/esm/react-components/hooks/useWalletPeerConnect.js.map +1 -1
  49. package/dist/esm/utils/getLibs.js +12 -20
  50. package/dist/esm/utils/getLibs.js.map +1 -1
  51. package/dist/types/classes/WalletObserver.class.d.ts +2 -2
  52. package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
  53. package/dist/types/react-components/RenderWallet.d.ts +3 -1
  54. package/dist/types/react-components/RenderWallet.d.ts.map +1 -1
  55. package/dist/types/react-components/RenderWalletHandles.d.ts +3 -1
  56. package/dist/types/react-components/RenderWalletHandles.d.ts.map +1 -1
  57. package/dist/types/react-components/RenderWalletPeerConnect.d.ts +3 -1
  58. package/dist/types/react-components/RenderWalletPeerConnect.d.ts.map +1 -1
  59. package/dist/types/react-components/RenderWalletState.d.ts +3 -1
  60. package/dist/types/react-components/RenderWalletState.d.ts.map +1 -1
  61. package/dist/types/react-components/WalletObserverProvider/WalletObserverProvider.d.ts.map +1 -1
  62. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +9 -8
  63. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
  64. package/dist/types/react-components/contexts/observer/types.d.ts +9 -31
  65. package/dist/types/react-components/contexts/observer/types.d.ts.map +1 -1
  66. package/dist/types/react-components/hooks/useWalletHandles.d.ts.map +1 -1
  67. package/dist/types/react-components/hooks/useWalletObserver.d.ts.map +1 -1
  68. package/dist/types/react-components/hooks/useWalletPeerConnect.d.ts +1 -0
  69. package/dist/types/react-components/hooks/useWalletPeerConnect.d.ts.map +1 -1
  70. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  71. package/dist/types/utils/getLibs.d.ts +2 -6
  72. package/dist/types/utils/getLibs.d.ts.map +1 -1
  73. package/package.json +1 -1
  74. package/src/classes/WalletObserver.class.ts +11 -23
  75. package/src/react-components/RenderWallet.tsx +21 -3
  76. package/src/react-components/RenderWalletHandles.tsx +20 -2
  77. package/src/react-components/RenderWalletPeerConnect.tsx +16 -3
  78. package/src/react-components/RenderWalletState.tsx +24 -8
  79. package/src/react-components/WalletObserverProvider/WalletObserverProvider.tsx +14 -1
  80. package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +70 -59
  81. package/src/react-components/contexts/observer/types.ts +13 -38
  82. package/src/react-components/hooks/useWalletHandles.ts +82 -76
  83. package/src/react-components/hooks/useWalletLoadingState.ts +5 -5
  84. package/src/react-components/hooks/useWalletObserver.ts +2 -0
  85. package/src/react-components/hooks/useWalletPeerConnect.tsx +18 -5
  86. package/src/utils/getLibs.ts +12 -11
@@ -2,10 +2,6 @@ export declare const getCardanoCore: () => Promise<{
2
2
  Serialization: typeof import("@cardano-sdk/core/dist/cjs/Serialization");
3
3
  Cardano: typeof import("@cardano-sdk/core/dist/cjs/Cardano");
4
4
  }>;
5
- export declare const getCardanoUtil: () => Promise<{
6
- typedHex: <T>(value: string, length?: number | undefined) => T;
7
- }>;
8
- export declare const getPeerConnect: () => Promise<{
9
- DAppPeerConnect: typeof import("@fabianbormann/cardano-peer-connect").DAppPeerConnect;
10
- }>;
5
+ export declare const getCardanoUtil: () => Promise<(<T>(value: string, length?: number | undefined) => T)>;
6
+ export declare const getPeerConnect: () => Promise<typeof import("@fabianbormann/cardano-peer-connect").DAppPeerConnect>;
11
7
  //# sourceMappingURL=getLibs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getLibs.d.ts","sourceRoot":"","sources":["../../../src/utils/getLibs.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;EAM1B,CAAC;AAEF,eAAO,MAAM,cAAc;;EAG1B,CAAC;AAEF,eAAO,MAAM,cAAc;;EAK1B,CAAC"}
1
+ {"version":3,"file":"getLibs.d.ts","sourceRoot":"","sources":["../../../src/utils/getLibs.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;EAO1B,CAAC;AAEF,eAAO,MAAM,cAAc,uEAI1B,CAAC;AAEF,eAAO,MAAM,cAAc,qFAI1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sundaeswap/wallet-lite",
3
- "version": "0.0.33",
3
+ "version": "0.0.35",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -111,18 +111,6 @@ export class WalletObserver<
111
111
  if (!this._options.persistence) {
112
112
  return;
113
113
  }
114
-
115
- const savedWallet = window.localStorage.getItem(
116
- WalletObserver.PERSISTENCE_CACHE_KEY
117
- );
118
-
119
- if (!savedWallet) {
120
- return;
121
- }
122
-
123
- // Init connection
124
- const seed: IWalletObserverSeed = JSON.parse(savedWallet);
125
- this.connectWallet(seed.activeWallet);
126
114
  }
127
115
 
128
116
  /**
@@ -135,9 +123,9 @@ export class WalletObserver<
135
123
  * In the event that a promise will not resolve due to external issues,
136
124
  * after 7 seconds, a timeout function will fire that resets the API and tries again.
137
125
  *
138
- * @returns {Promise<IWalletObserverSync>} - A promise that resolves to the wallet sync data.
126
+ * @returns {Promise<IWalletObserverSync<AssetMetadata>>} - A promise that resolves to the wallet sync data.
139
127
  */
140
- sync = async (): Promise<IWalletObserverSync> => {
128
+ sync = async (): Promise<IWalletObserverSync<AssetMetadata>> => {
141
129
  if (!this.api) {
142
130
  throw new Error(
143
131
  "Attempted to perform a sync operation without a connected wallet."
@@ -187,13 +175,13 @@ export class WalletObserver<
187
175
  network: newNetwork,
188
176
  };
189
177
 
190
- this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END, result);
191
- this._performingSync = false;
192
-
193
178
  const end = performance.now();
194
179
  if (this._options.debug) {
195
180
  console.log(`sync: ${end - start}ms`);
196
181
  }
182
+
183
+ this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END, result);
184
+ this._performingSync = false;
197
185
  return result;
198
186
  } catch (e) {
199
187
  this._performingSync = false;
@@ -350,7 +338,7 @@ export class WalletObserver<
350
338
  getCip45Instance = async () => {
351
339
  const start = performance.now();
352
340
  if (!this.peerConnectInstance) {
353
- const { DAppPeerConnect } = await getPeerConnect();
341
+ const DAppPeerConnect = await getPeerConnect();
354
342
  this.peerConnectInstance = new DAppPeerConnect(
355
343
  this._options.peerConnectArgs
356
344
  );
@@ -410,7 +398,7 @@ export class WalletObserver<
410
398
  const start = performance.now();
411
399
 
412
400
  this.dispatch(EWalletObserverEvents.GET_BALANCE_MAP_START);
413
- const [cbor, { Serialization }, { typedHex }] = await Promise.all([
401
+ const [cbor, { Serialization }, typedHex] = await Promise.all([
414
402
  this.api.getBalance(),
415
403
  getCardanoCore(),
416
404
  getCardanoUtil(),
@@ -487,7 +475,7 @@ export class WalletObserver<
487
475
 
488
476
  const start = performance.now();
489
477
 
490
- const [cbor, { Cardano }, { typedHex }] = await Promise.all([
478
+ const [cbor, { Cardano }, typedHex] = await Promise.all([
491
479
  this.api.getUsedAddresses(),
492
480
  getCardanoCore(),
493
481
  getCardanoUtil(),
@@ -518,7 +506,7 @@ export class WalletObserver<
518
506
 
519
507
  const start = performance.now();
520
508
 
521
- const [cbor, { Cardano }, { typedHex }] = await Promise.all([
509
+ const [cbor, { Cardano }, typedHex] = await Promise.all([
522
510
  this.api.getUnusedAddresses(),
523
511
  getCardanoCore(),
524
512
  getCardanoUtil(),
@@ -547,7 +535,7 @@ export class WalletObserver<
547
535
 
548
536
  const start = performance.now();
549
537
 
550
- const [cbor, { Serialization }, { typedHex }] = await Promise.all([
538
+ const [cbor, { Serialization }, typedHex] = await Promise.all([
551
539
  this.api.getUtxos(),
552
540
  getCardanoCore(),
553
541
  getCardanoUtil(),
@@ -583,7 +571,7 @@ export class WalletObserver<
583
571
 
584
572
  const start = performance.now();
585
573
 
586
- const [cbor, { Serialization }, { typedHex }] = await Promise.all([
574
+ const [cbor, { Serialization }, typedHex] = await Promise.all([
587
575
  (async () => {
588
576
  const funcCall =
589
577
  this.api?.getCollateral ||
@@ -1,6 +1,7 @@
1
1
  import { IAssetAmountMetadata } from "@sundaeswap/asset";
2
- import { FC, ReactNode } from "react";
2
+ import { FC, ReactElement, ReactNode, Suspense } from "react";
3
3
 
4
+ import { ErrorBoundary } from "react-error-boundary";
4
5
  import { useWalletObserver } from "./hooks/useWalletObserver.js";
5
6
 
6
7
  export type TRenderWalletFunctionState<
@@ -13,6 +14,8 @@ export type TRenderWalletFunction = (
13
14
 
14
15
  export interface IRenderWalletProps {
15
16
  render: TRenderWalletFunction;
17
+ loader?: ReactNode;
18
+ fallback?: ReactElement;
16
19
  }
17
20
 
18
21
  /**
@@ -21,8 +24,23 @@ export interface IRenderWalletProps {
21
24
  * compose on this and include state for Handles, PeerConnect (CIP-45),
22
25
  * and syncing state (RenderWalletState).
23
26
  */
24
- export const RenderWallet: FC<IRenderWalletProps> = ({ render }) => {
27
+ export const RenderWallet: FC<IRenderWalletProps> = ({
28
+ render,
29
+ loader,
30
+ fallback,
31
+ }) => {
25
32
  const state = useWalletObserver();
26
33
 
27
- return <>{render(state)}</>;
34
+ return (
35
+ <ErrorBoundary
36
+ fallback={fallback || <p>Error.</p>}
37
+ onError={(error) => {
38
+ if (state.observer.getOptions().debug) {
39
+ console.log(error.message, error.stack);
40
+ }
41
+ }}
42
+ >
43
+ <Suspense fallback={loader}>{render(state)}</Suspense>
44
+ </ErrorBoundary>
45
+ );
28
46
  };
@@ -1,6 +1,7 @@
1
1
  import { IAssetAmountMetadata } from "@sundaeswap/asset";
2
- import { FC, ReactNode } from "react";
2
+ import { FC, ReactElement, ReactNode, Suspense } from "react";
3
3
 
4
+ import { ErrorBoundary } from "react-error-boundary";
4
5
  import { useWalletHandles } from "./hooks/useWalletHandles.js";
5
6
  import { useWalletObserver } from "./hooks/useWalletObserver.js";
6
7
 
@@ -15,6 +16,8 @@ export type TRenderWalletHandlesFunction = (
15
16
 
16
17
  export interface IRenderWalletHandlesProps {
17
18
  render: TRenderWalletHandlesFunction;
19
+ loader?: ReactNode;
20
+ fallback?: ReactElement;
18
21
  }
19
22
 
20
23
  /**
@@ -24,9 +27,24 @@ export interface IRenderWalletHandlesProps {
24
27
  */
25
28
  export const RenderWalletHandles: FC<IRenderWalletHandlesProps> = ({
26
29
  render,
30
+ loader,
31
+ fallback,
27
32
  }) => {
28
33
  const state = useWalletObserver();
29
34
  const handleData = useWalletHandles();
30
35
 
31
- return <>{render({ ...state, ...handleData })}</>;
36
+ return (
37
+ <ErrorBoundary
38
+ fallback={fallback || <p>Error.</p>}
39
+ onError={(error) => {
40
+ if (state.observer.getOptions().debug) {
41
+ console.log(error.message, error.stack);
42
+ }
43
+ }}
44
+ >
45
+ <Suspense fallback={loader}>
46
+ {render({ ...state, ...handleData })}
47
+ </Suspense>
48
+ </ErrorBoundary>
49
+ );
32
50
  };
@@ -1,5 +1,5 @@
1
1
  import { IAssetAmountMetadata } from "@sundaeswap/asset";
2
- import { FC, ReactNode } from "react";
2
+ import { FC, ReactElement, ReactNode, Suspense } from "react";
3
3
  import { ErrorBoundary } from "react-error-boundary";
4
4
 
5
5
  import { useWalletObserver } from "./hooks/useWalletObserver.js";
@@ -16,6 +16,8 @@ export type TRenderWalletPeerConnectFunction = (
16
16
 
17
17
  export interface IRenderWalletPeerConnectProps {
18
18
  render: TRenderWalletPeerConnectFunction;
19
+ loader?: ReactNode;
20
+ fallback?: ReactElement;
19
21
  }
20
22
 
21
23
  /**
@@ -25,6 +27,8 @@ export interface IRenderWalletPeerConnectProps {
25
27
  */
26
28
  export const RenderWalletPeerConnect: FC<IRenderWalletPeerConnectProps> = ({
27
29
  render,
30
+ loader,
31
+ fallback,
28
32
  }) => {
29
33
  const state = useWalletObserver();
30
34
  const peerConnectState = useWalletPeerConnect();
@@ -34,8 +38,17 @@ export const RenderWalletPeerConnect: FC<IRenderWalletPeerConnectProps> = ({
34
38
  }
35
39
 
36
40
  return (
37
- <ErrorBoundary fallback={<p>{peerConnectState.error}</p>}>
38
- {render({ ...state, ...peerConnectState })}
41
+ <ErrorBoundary
42
+ fallback={fallback || <p>{peerConnectState.error}</p>}
43
+ onError={(error) => {
44
+ if (state.observer.getOptions().debug) {
45
+ console.log(error.message, error.stack);
46
+ }
47
+ }}
48
+ >
49
+ <Suspense fallback={loader}>
50
+ {render({ ...state, ...peerConnectState })}
51
+ </Suspense>
39
52
  </ErrorBoundary>
40
53
  );
41
54
  };
@@ -1,6 +1,7 @@
1
1
  import { IAssetAmountMetadata } from "@sundaeswap/asset";
2
- import { FC, ReactNode } from "react";
2
+ import { FC, ReactElement, ReactNode, Suspense } from "react";
3
3
 
4
+ import { ErrorBoundary } from "react-error-boundary";
4
5
  import { useWalletLoadingState } from "./hooks/useWalletLoadingState.js";
5
6
  import { useWalletObserver } from "./hooks/useWalletObserver.js";
6
7
 
@@ -15,6 +16,8 @@ export type TRenderWalletStateFunction = (
15
16
 
16
17
  export interface IRenderWalletStateProps {
17
18
  render: TRenderWalletStateFunction;
19
+ loader?: ReactNode;
20
+ fallback?: ReactElement;
18
21
  }
19
22
 
20
23
  /**
@@ -23,16 +26,29 @@ export interface IRenderWalletStateProps {
23
26
  * a sync or connection operation. Useful for displaying
24
27
  * internal operation states of the wallet.
25
28
  */
26
- export const RenderWalletState: FC<IRenderWalletStateProps> = ({ render }) => {
29
+ export const RenderWalletState: FC<IRenderWalletStateProps> = ({
30
+ render,
31
+ loader,
32
+ fallback = null,
33
+ }) => {
27
34
  const state = useWalletObserver();
28
35
  const loadingState = useWalletLoadingState();
29
36
 
30
37
  return (
31
- <>
32
- {render({
33
- ...state,
34
- ...loadingState,
35
- })}
36
- </>
38
+ <ErrorBoundary
39
+ fallback={fallback}
40
+ onError={(error) => {
41
+ if (state.observer.getOptions().debug) {
42
+ console.log(error.message, error.stack);
43
+ }
44
+ }}
45
+ >
46
+ <Suspense fallback={loader}>
47
+ {render({
48
+ ...state,
49
+ ...loadingState,
50
+ })}
51
+ </Suspense>
52
+ </ErrorBoundary>
37
53
  );
38
54
  };
@@ -1,5 +1,7 @@
1
- import { FC, PropsWithChildren, useMemo } from "react";
1
+ import { FC, PropsWithChildren, useEffect, useMemo } from "react";
2
2
 
3
+ import { TSupportedWalletExtensions } from "../../@types/observer.js";
4
+ import { WalletObserver } from "../../classes/WalletObserver.class.js";
3
5
  import {
4
6
  IWalletObserverProviderProps,
5
7
  IWalletObserverState,
@@ -49,6 +51,17 @@ const WalletObserverProvider: FC<
49
51
  [options, state, derivedState]
50
52
  );
51
53
 
54
+ useEffect(() => {
55
+ const wallet: TSupportedWalletExtensions | null =
56
+ window.localStorage.getItem(
57
+ WalletObserver.PERSISTENCE_CACHE_KEY
58
+ ) as TSupportedWalletExtensions;
59
+
60
+ if (wallet) {
61
+ state.connectWallet(JSON.parse(wallet).activeWallet);
62
+ }
63
+ }, []);
64
+
52
65
  return (
53
66
  <WalletObserverContext.Provider value={contextValue}>
54
67
  {children}
@@ -1,6 +1,6 @@
1
1
  import type { TransactionUnspentOutput } from "@cardano-sdk/core/dist/cjs/Serialization/index.js";
2
- import { AssetAmount } from "@sundaeswap/asset";
3
- import { useCallback, useState } from "react";
2
+ import { AssetAmount, IAssetAmountMetadata } from "@sundaeswap/asset";
3
+ import { useCallback, useState, useTransition } from "react";
4
4
 
5
5
  import {
6
6
  TAssetAmountMap,
@@ -18,17 +18,21 @@ import { THandleMetadata } from "../../contexts/observer/index.js";
18
18
  *
19
19
  * @param {WalletObserver} observer
20
20
  */
21
- export const useWalletObserverState = (observer: WalletObserver) => {
21
+ export const useWalletObserverState = <
22
+ AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata
23
+ >(
24
+ observer: WalletObserver<AssetMetadata>
25
+ ) => {
22
26
  const [activeWallet, setActiveWallet] =
23
27
  useState<TSupportedWalletExtensions>();
24
28
  const [adaBalance, setAdaBalance] = useState<AssetAmount>(
25
- new AssetAmount(0n)
29
+ new AssetAmount<AssetMetadata>(0n)
26
30
  );
27
31
  const [handleMetadata, setHandleMetadata] = useState<
28
- TAssetAmountMap<THandleMetadata>
29
- >(new WalletAssetMap());
30
- const [balance, setBalance] = useState<WalletBalanceMap>(
31
- new WalletBalanceMap(observer)
32
+ TAssetAmountMap<THandleMetadata<AssetMetadata>>
33
+ >(new WalletAssetMap<THandleMetadata<AssetMetadata>>());
34
+ const [balance, setBalance] = useState<WalletBalanceMap<AssetMetadata>>(
35
+ new WalletBalanceMap<AssetMetadata>(observer)
32
36
  );
33
37
  const [network, setNetwork] = useState<number | undefined>();
34
38
  const [usedAddresses, setUsedAddresses] = useState<string[]>([]);
@@ -37,6 +41,7 @@ export const useWalletObserverState = (observer: WalletObserver) => {
37
41
  const [collateral, setCollateral] = useState<TransactionUnspentOutput[]>();
38
42
  const [isCip45, setIsCip45] = useState(false);
39
43
  const [switching, setSwitching] = useState(false);
44
+ const [isPending, startTransition] = useTransition();
40
45
 
41
46
  const disconnect = useCallback(() => {
42
47
  // Reset observer state.
@@ -68,72 +73,77 @@ export const useWalletObserverState = (observer: WalletObserver) => {
68
73
 
69
74
  const freshData = await observer.sync();
70
75
 
71
- setActiveWallet((prevWallet) =>
72
- newWallet === prevWallet ? prevWallet : newWallet
73
- );
76
+ startTransition(() => {
77
+ setActiveWallet((prevWallet) =>
78
+ newWallet === prevWallet ? prevWallet : newWallet
79
+ );
80
+
81
+ const newAdaBalance = freshData.balanceMap.get(
82
+ WalletObserver.ADA_ASSET_ID
83
+ );
84
+ if (newAdaBalance) {
85
+ setAdaBalance((prevBalance) =>
86
+ prevBalance.amount === newAdaBalance.amount
87
+ ? prevBalance
88
+ : newAdaBalance
89
+ );
90
+ }
74
91
 
75
- const newAdaBalance = freshData.balanceMap.get(WalletObserver.ADA_ASSET_ID);
76
- if (newAdaBalance) {
77
- setAdaBalance((prevBalance) =>
78
- prevBalance.amount === newAdaBalance.amount
92
+ setBalance((prevBalance) =>
93
+ areAssetMapsEqual(prevBalance, freshData.balanceMap)
79
94
  ? prevBalance
80
- : newAdaBalance
95
+ : freshData.balanceMap
81
96
  );
82
- }
83
97
 
84
- setBalance((prevBalance) =>
85
- areAssetMapsEqual(prevBalance, freshData.balanceMap)
86
- ? prevBalance
87
- : freshData.balanceMap
88
- );
89
-
90
- setUsedAddresses((prevValue) =>
91
- JSON.stringify(prevValue) === JSON.stringify(freshData.usedAddresses)
92
- ? prevValue
93
- : freshData.usedAddresses
94
- );
95
-
96
- setUnusedAddresses((prevValue) =>
97
- JSON.stringify(prevValue) === JSON.stringify(freshData.unusedAddresses)
98
- ? prevValue
99
- : freshData.unusedAddresses
100
- );
101
-
102
- setNetwork((prevValue) =>
103
- prevValue === freshData.network ? prevValue : freshData.network
104
- );
105
-
106
- setUtxos((prevValue) => {
107
- const prevValueRep = prevValue?.map((v) => v.toCbor());
108
- const newValueRep = freshData.utxos?.map((v) => v.toCbor());
109
- if (prevValueRep !== newValueRep) {
110
- return freshData.utxos;
111
- }
98
+ setUsedAddresses((prevValue) =>
99
+ JSON.stringify(prevValue) === JSON.stringify(freshData.usedAddresses)
100
+ ? prevValue
101
+ : freshData.usedAddresses
102
+ );
112
103
 
113
- return prevValue;
114
- });
104
+ setUnusedAddresses((prevValue) =>
105
+ JSON.stringify(prevValue) === JSON.stringify(freshData.unusedAddresses)
106
+ ? prevValue
107
+ : freshData.unusedAddresses
108
+ );
115
109
 
116
- setCollateral((prevValue) => {
117
- const prevValueRep = prevValue?.map((v) => v.toCbor());
118
- const newValueRep = freshData.utxos?.map((v) => v.toCbor());
119
- if (prevValueRep !== newValueRep) {
120
- return freshData.utxos;
121
- }
110
+ setNetwork((prevValue) =>
111
+ prevValue === freshData.network ? prevValue : freshData.network
112
+ );
122
113
 
123
- return prevValue;
124
- });
114
+ setUtxos((prevValue) => {
115
+ const prevValueRep = prevValue?.map((v) => v.toCbor());
116
+ const newValueRep = freshData.utxos?.map((v) => v.toCbor());
117
+ if (prevValueRep !== newValueRep) {
118
+ return freshData.utxos;
119
+ }
125
120
 
126
- setIsCip45(newWallet.includes("p2p"));
121
+ return prevValue;
122
+ });
123
+
124
+ setCollateral((prevValue) => {
125
+ const prevValueRep = prevValue?.map((v) => v.toCbor());
126
+ const newValueRep = freshData.utxos?.map((v) => v.toCbor());
127
+ if (prevValueRep !== newValueRep) {
128
+ return freshData.utxos;
129
+ }
130
+
131
+ return prevValue;
132
+ });
133
+
134
+ setIsCip45(newWallet.includes("p2p"));
135
+ });
127
136
  }, [observer, disconnect]);
128
137
 
129
138
  const connectWallet = useCallback(
130
139
  async (wallet: TSupportedWalletExtensions) => {
131
140
  if (observer.hasActiveConnection() && wallet !== observer.activeWallet) {
132
- setSwitching(true);
141
+ setSwitching(() => true);
133
142
  }
134
143
 
135
- await observer.connectWallet(wallet).then(syncWallet);
136
- setSwitching(false);
144
+ await observer.connectWallet(wallet);
145
+ await syncWallet();
146
+ setSwitching(() => false);
137
147
  },
138
148
  [observer, setSwitching]
139
149
  );
@@ -164,5 +174,6 @@ export const useWalletObserverState = (observer: WalletObserver) => {
164
174
  connectWallet,
165
175
  switching,
166
176
  setSwitching,
177
+ isPending,
167
178
  };
168
179
  };
@@ -1,14 +1,11 @@
1
- import type { TransactionUnspentOutput } from "@cardano-sdk/core/dist/cjs/Serialization/index.js";
2
1
  import type { IHandle } from "@koralabs/adahandle-sdk";
3
- import type { AssetAmount, IAssetAmountMetadata } from "@sundaeswap/asset";
4
- import type { Dispatch, MutableRefObject, SetStateAction } from "react";
2
+ import type { IAssetAmountMetadata } from "@sundaeswap/asset";
3
+ import type { MutableRefObject } from "react";
5
4
 
6
- import type {
7
- TSupportedWalletExtensions,
8
- TWalletObserverOptions,
9
- } from "../../../@types/observer.js";
10
- import { WalletBalanceMap } from "../../../classes/WalletBalanceMap.class.js";
5
+ import type { TWalletObserverOptions } from "../../../@types/observer.js";
11
6
  import type { WalletObserver } from "../../../classes/WalletObserver.class.js";
7
+ import { useDerivedState } from "../../WalletObserverProvider/hooks/effects/useDerivedState.js";
8
+ import { useWalletObserverState } from "../../WalletObserverProvider/hooks/useWalletObserverState.js";
12
9
 
13
10
  /**
14
11
  * Available hooks to apply at various events.
@@ -48,36 +45,11 @@ export interface IWalletObserverState<
48
45
  > {
49
46
  observerRef: MutableRefObject<WalletObserver<AssetMetadata>>;
50
47
  refreshInterval: number | false;
51
- state: {
52
- isCip45: boolean;
53
- setIsCip45: Dispatch<SetStateAction<boolean>>;
54
- activeWallet?: TSupportedWalletExtensions;
55
- setActiveWallet: Dispatch<
56
- SetStateAction<TSupportedWalletExtensions | undefined>
57
- >;
58
- adaBalance: AssetAmount<AssetMetadata>;
59
- balance: WalletBalanceMap<AssetMetadata>;
60
- utxos?: TransactionUnspentOutput[];
61
- setUtxos: Dispatch<SetStateAction<TransactionUnspentOutput[] | undefined>>;
62
- collateral?: TransactionUnspentOutput[];
63
- setCollateral: Dispatch<
64
- SetStateAction<TransactionUnspentOutput[] | undefined>
65
- >;
66
- setBalance: Dispatch<SetStateAction<WalletBalanceMap<AssetMetadata>>>;
67
- observer: WalletObserver;
68
- mainAddress?: string;
69
- stakeAddress?: string;
70
- network?: number;
71
- setNetwork: Dispatch<SetStateAction<number | undefined>>;
72
- unusedAddresses: string[];
73
- setUnusedAddresses: Dispatch<SetStateAction<string[]>>;
74
- usedAddresses: string[];
75
- setUsedAddresses: Dispatch<SetStateAction<string[]>>;
76
- switching: boolean;
77
- syncWallet: () => Promise<void>;
78
- disconnect: () => void;
79
- connectWallet: (wallet: TSupportedWalletExtensions) => Promise<void>;
80
- };
48
+ state: ReturnType<typeof useWalletObserverState<AssetMetadata>> &
49
+ ReturnType<typeof useDerivedState> & {
50
+ isPending: boolean;
51
+ observer: WalletObserver<AssetMetadata>;
52
+ };
81
53
  }
82
54
 
83
55
  /**
@@ -97,6 +69,9 @@ export type TUseWalletObserverState<
97
69
  > = Omit<
98
70
  IWalletObserverState<AssetMetadata>["state"],
99
71
  | "setActiveWallet"
72
+ | "setAdaBalance"
73
+ | "setHandles"
74
+ | "setSwitching"
100
75
  | "setBalance"
101
76
  | "setNetwork"
102
77
  | "setUnusedAddresses"