@sundaeswap/wallet-lite 0.1.1 → 0.1.3

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 (102) hide show
  1. package/dist/cjs/classes/ReadOnlyProvider.Blockfrost.class.js +22 -12
  2. package/dist/cjs/classes/ReadOnlyProvider.Blockfrost.class.js.map +1 -1
  3. package/dist/cjs/classes/WalletObserver.class.js +105 -17
  4. package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
  5. package/dist/cjs/react-components/RenderWallet.js +2 -1
  6. package/dist/cjs/react-components/RenderWallet.js.map +1 -1
  7. package/dist/cjs/react-components/RenderWalletHandles.js +2 -1
  8. package/dist/cjs/react-components/RenderWalletHandles.js.map +1 -1
  9. package/dist/cjs/react-components/RenderWalletPeerConnect.js +2 -1
  10. package/dist/cjs/react-components/RenderWalletPeerConnect.js.map +1 -1
  11. package/dist/cjs/react-components/RenderWalletState.js +2 -1
  12. package/dist/cjs/react-components/RenderWalletState.js.map +1 -1
  13. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js +60 -3
  14. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  15. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useDerivedState.js +3 -1
  16. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useDerivedState.js.map +1 -1
  17. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.js +24 -4
  18. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.js.map +1 -1
  19. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +38 -36
  20. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  21. package/dist/cjs/react-components/contexts/observer/context.js +40 -1
  22. package/dist/cjs/react-components/contexts/observer/context.js.map +1 -1
  23. package/dist/cjs/react-components/contexts/observer/types.js.map +1 -1
  24. package/dist/cjs/react-components/hooks/useWalletData.js +6 -5
  25. package/dist/cjs/react-components/hooks/useWalletData.js.map +1 -1
  26. package/dist/cjs/react-components/hooks/useWalletHandles.js +11 -7
  27. package/dist/cjs/react-components/hooks/useWalletHandles.js.map +1 -1
  28. package/dist/cjs/react-components/hooks/useWalletLoadingState.js +6 -7
  29. package/dist/cjs/react-components/hooks/useWalletLoadingState.js.map +1 -1
  30. package/dist/cjs/react-components/hooks/useWalletPeerConnect.js +18 -12
  31. package/dist/cjs/react-components/hooks/useWalletPeerConnect.js.map +1 -1
  32. package/dist/esm/classes/ReadOnlyProvider.Blockfrost.class.js +11 -6
  33. package/dist/esm/classes/ReadOnlyProvider.Blockfrost.class.js.map +1 -1
  34. package/dist/esm/classes/WalletObserver.class.js +79 -1
  35. package/dist/esm/classes/WalletObserver.class.js.map +1 -1
  36. package/dist/esm/react-components/RenderWallet.js +3 -2
  37. package/dist/esm/react-components/RenderWallet.js.map +1 -1
  38. package/dist/esm/react-components/RenderWalletHandles.js +3 -2
  39. package/dist/esm/react-components/RenderWalletHandles.js.map +1 -1
  40. package/dist/esm/react-components/RenderWalletPeerConnect.js +3 -2
  41. package/dist/esm/react-components/RenderWalletPeerConnect.js.map +1 -1
  42. package/dist/esm/react-components/RenderWalletState.js +3 -2
  43. package/dist/esm/react-components/RenderWalletState.js.map +1 -1
  44. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js +55 -4
  45. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  46. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useDerivedState.js +1 -1
  47. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useDerivedState.js.map +1 -1
  48. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.js +2 -2
  49. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.js.map +1 -1
  50. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +4 -4
  51. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  52. package/dist/esm/react-components/contexts/observer/context.js +36 -0
  53. package/dist/esm/react-components/contexts/observer/context.js.map +1 -1
  54. package/dist/esm/react-components/contexts/observer/types.js.map +1 -1
  55. package/dist/esm/react-components/hooks/useWalletData.js +7 -5
  56. package/dist/esm/react-components/hooks/useWalletData.js.map +1 -1
  57. package/dist/esm/react-components/hooks/useWalletHandles.js +11 -5
  58. package/dist/esm/react-components/hooks/useWalletHandles.js.map +1 -1
  59. package/dist/esm/react-components/hooks/useWalletLoadingState.js +7 -9
  60. package/dist/esm/react-components/hooks/useWalletLoadingState.js.map +1 -1
  61. package/dist/esm/react-components/hooks/useWalletPeerConnect.js +14 -11
  62. package/dist/esm/react-components/hooks/useWalletPeerConnect.js.map +1 -1
  63. package/dist/types/classes/ReadOnlyProvider.Blockfrost.class.d.ts.map +1 -1
  64. package/dist/types/classes/WalletObserver.class.d.ts +11 -0
  65. package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
  66. package/dist/types/react-components/RenderWallet.d.ts +0 -6
  67. package/dist/types/react-components/RenderWallet.d.ts.map +1 -1
  68. package/dist/types/react-components/RenderWalletHandles.d.ts +0 -5
  69. package/dist/types/react-components/RenderWalletHandles.d.ts.map +1 -1
  70. package/dist/types/react-components/RenderWalletPeerConnect.d.ts +0 -5
  71. package/dist/types/react-components/RenderWalletPeerConnect.d.ts.map +1 -1
  72. package/dist/types/react-components/RenderWalletState.d.ts +1 -7
  73. package/dist/types/react-components/RenderWalletState.d.ts.map +1 -1
  74. package/dist/types/react-components/WalletObserverProvider/WalletObserverProvider.d.ts.map +1 -1
  75. package/dist/types/react-components/WalletObserverProvider/hooks/effects/useDerivedState.d.ts.map +1 -1
  76. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
  77. package/dist/types/react-components/contexts/observer/context.d.ts +16 -1
  78. package/dist/types/react-components/contexts/observer/context.d.ts.map +1 -1
  79. package/dist/types/react-components/contexts/observer/types.d.ts +48 -1
  80. package/dist/types/react-components/contexts/observer/types.d.ts.map +1 -1
  81. package/dist/types/react-components/hooks/useWalletHandles.d.ts.map +1 -1
  82. package/dist/types/react-components/hooks/useWalletLoadingState.d.ts +1 -2
  83. package/dist/types/react-components/hooks/useWalletLoadingState.d.ts.map +1 -1
  84. package/dist/types/react-components/hooks/useWalletPeerConnect.d.ts.map +1 -1
  85. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  86. package/package.json +3 -3
  87. package/src/classes/ReadOnlyProvider.Blockfrost.class.ts +22 -8
  88. package/src/classes/WalletObserver.class.ts +97 -1
  89. package/src/react-components/RenderWallet.tsx +4 -2
  90. package/src/react-components/RenderWalletHandles.tsx +6 -2
  91. package/src/react-components/RenderWalletPeerConnect.tsx +6 -2
  92. package/src/react-components/RenderWalletState.tsx +8 -4
  93. package/src/react-components/WalletObserverProvider/WalletObserverProvider.tsx +92 -4
  94. package/src/react-components/WalletObserverProvider/hooks/effects/useDerivedState.ts +5 -2
  95. package/src/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.ts +2 -2
  96. package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +67 -37
  97. package/src/react-components/contexts/observer/context.ts +71 -1
  98. package/src/react-components/contexts/observer/types.ts +57 -1
  99. package/src/react-components/hooks/useWalletData.ts +5 -5
  100. package/src/react-components/hooks/useWalletHandles.ts +13 -8
  101. package/src/react-components/hooks/useWalletLoadingState.ts +13 -11
  102. package/src/react-components/hooks/useWalletPeerConnect.tsx +20 -11
@@ -1,7 +1,12 @@
1
1
  import { IAssetAmountMetadata } from "@sundaeswap/asset";
2
2
  import { createContext, useContext } from "react";
3
3
 
4
- import { IWalletObserverState } from "./types.js";
4
+ import {
5
+ IWalletObserverActionsContext,
6
+ IWalletObserverConnectionContext,
7
+ IWalletObserverState,
8
+ IWalletObserverWalletDataContext,
9
+ } from "./types.js";
5
10
 
6
11
  /**
7
12
  * Context instance.
@@ -29,3 +34,68 @@ export function useWalletObserverContext<
29
34
 
30
35
  return context;
31
36
  }
37
+
38
+ /**
39
+ * Focused context for stable actions and observer ref.
40
+ */
41
+ export const WalletActionsContext = createContext<
42
+ IWalletObserverActionsContext | undefined
43
+ >(undefined);
44
+
45
+ /**
46
+ * Focused context for connection and loading state.
47
+ */
48
+ export const WalletConnectionContext = createContext<
49
+ IWalletObserverConnectionContext | undefined
50
+ >(undefined);
51
+
52
+ /**
53
+ * Focused context for wallet data that changes every sync.
54
+ */
55
+ export const WalletDataContext = createContext<
56
+ IWalletObserverWalletDataContext | undefined
57
+ >(undefined);
58
+
59
+ export function useWalletActionsContext<
60
+ AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,
61
+ >(): IWalletObserverActionsContext<AssetMetadata> {
62
+ const context = useContext(
63
+ WalletActionsContext,
64
+ ) as unknown as IWalletObserverActionsContext<AssetMetadata>;
65
+
66
+ if (!context) {
67
+ throw new Error(
68
+ "useWalletActionsContext must be used within a WalletObserverProvider",
69
+ );
70
+ }
71
+
72
+ return context;
73
+ }
74
+
75
+ export function useWalletConnectionContext(): IWalletObserverConnectionContext {
76
+ const context = useContext(WalletConnectionContext);
77
+
78
+ if (!context) {
79
+ throw new Error(
80
+ "useWalletConnectionContext must be used within a WalletObserverProvider",
81
+ );
82
+ }
83
+
84
+ return context;
85
+ }
86
+
87
+ export function useWalletDataContext<
88
+ AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,
89
+ >(): IWalletObserverWalletDataContext<AssetMetadata> {
90
+ const context = useContext(
91
+ WalletDataContext,
92
+ ) as unknown as IWalletObserverWalletDataContext<AssetMetadata>;
93
+
94
+ if (!context) {
95
+ throw new Error(
96
+ "useWalletDataContext must be used within a WalletObserverProvider",
97
+ );
98
+ }
99
+
100
+ return context;
101
+ }
@@ -1,12 +1,14 @@
1
1
  import type { IHandle } from "@koralabs/adahandle-sdk";
2
- import type { IAssetAmountMetadata } from "@sundaeswap/asset";
2
+ import type { AssetAmount, IAssetAmountMetadata } from "@sundaeswap/asset";
3
3
  import type { MutableRefObject } from "react";
4
4
 
5
5
  import type {
6
6
  IWalletObserverSync,
7
7
  TWalletObserverOptions,
8
8
  } from "../../../@types/observer.js";
9
+ import type { WalletBalanceMap } from "../../../classes/WalletBalanceMap.class.js";
9
10
  import type { WalletObserver } from "../../../classes/WalletObserver.class.js";
11
+ import type { TransactionUnspentOutput } from "@cardano-sdk/core/dist/cjs/Serialization/TransactionUnspentOutput.js";
10
12
  import { useDerivedState } from "../../WalletObserverProvider/hooks/effects/useDerivedState.js";
11
13
  import { useWalletObserverState } from "../../WalletObserverProvider/hooks/useWalletObserverState.js";
12
14
 
@@ -71,6 +73,60 @@ export interface IWalletObserverState<
71
73
  };
72
74
  }
73
75
 
76
+ /**
77
+ * Focused context: stable callbacks and observer reference.
78
+ * Rarely changes — only if the observer instance is recreated.
79
+ */
80
+ export interface IWalletObserverActionsContext<
81
+ AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,
82
+ > {
83
+ observer: WalletObserver<AssetMetadata>;
84
+ observerRef: MutableRefObject<WalletObserver<AssetMetadata>>;
85
+ connectWallet: (wallet: string) => Promise<unknown>;
86
+ disconnect: () => void;
87
+ syncWallet: (
88
+ importedData?: IWalletObserverSync<AssetMetadata>,
89
+ ) => Promise<void>;
90
+ resyncMetadata: () => Promise<void>;
91
+ }
92
+
93
+ /**
94
+ * Focused context: connection and loading state.
95
+ * Changes on connect/disconnect and sync start/end.
96
+ */
97
+ export interface IWalletObserverConnectionContext {
98
+ activeWallet: string | undefined;
99
+ ready: boolean;
100
+ connectingWallet: boolean;
101
+ syncingWallet: boolean;
102
+ network: number | undefined;
103
+ isCip45: boolean;
104
+ switching: boolean;
105
+ isReadOnlyMode: boolean;
106
+ willAutoConnect: boolean;
107
+ errorSyncing: boolean;
108
+ mainAddress: string | undefined;
109
+ stakeAddress: string | undefined;
110
+ }
111
+
112
+ /**
113
+ * Focused context: wallet data that changes every sync cycle.
114
+ */
115
+ export interface IWalletObserverWalletDataContext<
116
+ AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,
117
+ > {
118
+ balance: WalletBalanceMap<AssetMetadata>;
119
+ adaBalance: AssetAmount<AssetMetadata>;
120
+ usedAddresses: string[];
121
+ unusedAddresses: string[];
122
+ changeAddress: string | undefined;
123
+ feeAddress: string | undefined;
124
+ utxos: TransactionUnspentOutput[] | undefined;
125
+ collateral: TransactionUnspentOutput[] | undefined;
126
+ isPending: boolean;
127
+ refreshInterval: number | false;
128
+ }
129
+
74
130
  /**
75
131
  * A generic to extend the default IHandle type that comes
76
132
  * back from the Kora Lab's API, and merged with the metadata
@@ -2,7 +2,7 @@ import { IAssetAmountMetadata } from "@sundaeswap/asset";
2
2
  import { useCallback, useMemo, useState } from "react";
3
3
 
4
4
  import { DataSignError } from "@cardano-sdk/dapp-connector";
5
- import { useWalletObserver } from "./useWalletObserver";
5
+ import { useWalletActionsContext } from "../contexts/observer/context.js";
6
6
 
7
7
  export interface ISignedData {
8
8
  payload: string;
@@ -22,14 +22,14 @@ export interface ISignDataParams<T = object | string> {
22
22
  export const useWalletData = <
23
23
  AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,
24
24
  >() => {
25
- const state = useWalletObserver<AssetMetadata>();
25
+ const { observer } = useWalletActionsContext<AssetMetadata>();
26
26
  const [signedData, setSignedData] = useState<ISignedData>();
27
27
  const [isSigningData, setIsSigningData] = useState(false);
28
28
  const [error, setError] = useState<DataSignError>();
29
29
 
30
30
  const signData = useCallback(
31
31
  async (params: ISignDataParams) => {
32
- if (!state.observer.api) {
32
+ if (!observer.api) {
33
33
  return;
34
34
  }
35
35
 
@@ -46,7 +46,7 @@ export const useWalletData = <
46
46
  setIsSigningData(true);
47
47
 
48
48
  try {
49
- const response = await state.observer.api.signData(
49
+ const response = await observer.api.signData(
50
50
  Cardano.Address.fromBech32(params.signingAddress).toBytes(),
51
51
  Buffer.from(
52
52
  typeof params.payload === "string"
@@ -83,7 +83,7 @@ export const useWalletData = <
83
83
  setError(e as DataSignError);
84
84
  }
85
85
  },
86
- [state.observer.api],
86
+ [observer.api],
87
87
  );
88
88
 
89
89
  return useMemo(
@@ -5,20 +5,25 @@ import { useMemo } from "react";
5
5
  import { WalletAssetMap } from "../../classes/WalletAssetMap.class.js";
6
6
  import { getHandleMetadata } from "../../utils/handles.js";
7
7
  import { THandleMetadata } from "../contexts/observer/types.js";
8
- import { useWalletObserver } from "./useWalletObserver.js";
8
+ import {
9
+ useWalletConnectionContext,
10
+ useWalletDataContext,
11
+ } from "../contexts/observer/context.js";
9
12
 
10
13
  export const useWalletHandles = <
11
14
  AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,
12
15
  >() => {
13
- const state = useWalletObserver<AssetMetadata>();
16
+ const { balance } = useWalletDataContext<AssetMetadata>();
17
+ const { mainAddress, network } = useWalletConnectionContext();
18
+
14
19
  const memoizedHandleDep = useMemo(
15
- () => [...state.balance.getHandles().keys()],
16
- [state.balance],
20
+ () => [...balance.getHandles().keys()],
21
+ [balance],
17
22
  );
18
23
 
19
24
  const queryKey = useMemo(
20
- () => [memoizedHandleDep, state.mainAddress, state.network],
21
- [memoizedHandleDep, state.mainAddress, state.network],
25
+ () => [memoizedHandleDep, mainAddress, network],
26
+ [memoizedHandleDep, mainAddress, network],
22
27
  );
23
28
  const { data: handles, isLoading } = useQuery<
24
29
  WalletAssetMap<THandleMetadata<AssetMetadata>> | undefined
@@ -26,8 +31,8 @@ export const useWalletHandles = <
26
31
  queryKey,
27
32
  queryFn: async () => {
28
33
  const result = await getHandleMetadata(
29
- state.balance.getHandles(),
30
- state.network || 0,
34
+ balance.getHandles(),
35
+ network || 0,
31
36
  );
32
37
 
33
38
  return result;
@@ -1,21 +1,23 @@
1
- import { IAssetAmountMetadata } from "@sundaeswap/asset";
2
1
  import { useMemo } from "react";
3
2
 
4
- import { useWalletObserverContext } from "../contexts/observer/context.js";
3
+ import { useWalletConnectionContext } from "../contexts/observer/context.js";
5
4
 
6
- export const useWalletLoadingState = <
7
- AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,
8
- >() => {
9
- const { state } = useWalletObserverContext<AssetMetadata>();
5
+ export const useWalletLoadingState = () => {
6
+ const connection = useWalletConnectionContext();
10
7
 
11
8
  const result = useMemo(
12
9
  () => ({
13
- connectingWallet: state.connectingWallet,
14
- syncingWallet: state.syncingWallet,
15
- switchingWallet: state.switching,
16
- ready: state.ready,
10
+ connectingWallet: connection.connectingWallet,
11
+ syncingWallet: connection.syncingWallet,
12
+ switchingWallet: connection.switching,
13
+ ready: connection.ready,
17
14
  }),
18
- [state.ready, state.syncingWallet, state.connectingWallet, state.switching],
15
+ [
16
+ connection.ready,
17
+ connection.syncingWallet,
18
+ connection.connectingWallet,
19
+ connection.switching,
20
+ ],
19
21
  );
20
22
 
21
23
  return result;
@@ -2,18 +2,19 @@ import { IAssetAmountMetadata } from "@sundaeswap/asset";
2
2
  import {
3
3
  MutableRefObject,
4
4
  useEffect,
5
+ useMemo,
5
6
  useRef,
6
7
  useState,
7
8
  useTransition,
8
9
  } from "react";
9
10
 
10
11
  import { TGetPeerConnectInstance } from "../../@types/observer.js";
11
- import { useWalletObserver } from "./useWalletObserver.js";
12
+ import { useWalletActionsContext } from "../contexts/observer/context.js";
12
13
 
13
14
  export const useWalletPeerConnect = <
14
15
  AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,
15
16
  >() => {
16
- const state = useWalletObserver<AssetMetadata>();
17
+ const { observer } = useWalletActionsContext<AssetMetadata>();
17
18
  const [isPending, startTransition] = useTransition();
18
19
  const [peerConnect, setPeerConnect] =
19
20
  useState<ReturnType<TGetPeerConnectInstance>>();
@@ -21,11 +22,11 @@ export const useWalletPeerConnect = <
21
22
  const qrCode = useRef<HTMLDivElement>(null);
22
23
 
23
24
  useEffect(() => {
24
- if (!state.observer) {
25
+ if (!observer) {
25
26
  return;
26
27
  }
27
28
 
28
- state.observer.getCip45Instance().then((res) => {
29
+ observer.getCip45Instance().then((res) => {
29
30
  startTransition(() => {
30
31
  try {
31
32
  setPeerConnect(res);
@@ -34,7 +35,7 @@ export const useWalletPeerConnect = <
34
35
  }
35
36
  });
36
37
  });
37
- }, [state.observer, setPeerConnect, setError]);
38
+ }, [observer]);
38
39
 
39
40
  useEffect(() => {
40
41
  if (peerConnect && qrCode.current) {
@@ -42,10 +43,18 @@ export const useWalletPeerConnect = <
42
43
  }
43
44
  }, [peerConnect, qrCode]);
44
45
 
45
- return {
46
- peerConnect,
47
- QRCodeElement: <div ref={qrCode as MutableRefObject<HTMLDivElement>} />,
48
- error,
49
- isLoading: isPending,
50
- };
46
+ const qrCodeElement = useMemo(
47
+ () => <div ref={qrCode as MutableRefObject<HTMLDivElement>} />,
48
+ [],
49
+ );
50
+
51
+ return useMemo(
52
+ () => ({
53
+ peerConnect,
54
+ QRCodeElement: qrCodeElement,
55
+ error,
56
+ isLoading: isPending,
57
+ }),
58
+ [peerConnect, qrCodeElement, error, isPending],
59
+ );
51
60
  };