@sundaeswap/wallet-lite 0.0.83 → 0.0.85

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 (39) hide show
  1. package/dist/cjs/@types/events.js.map +1 -1
  2. package/dist/cjs/classes/WalletObserver.class.js +36 -31
  3. package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
  4. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js +1 -1
  5. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  6. package/dist/cjs/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js +30 -32
  7. package/dist/cjs/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js.map +1 -1
  8. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +126 -109
  9. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  10. package/dist/cjs/react-components/contexts/observer/types.js.map +1 -1
  11. package/dist/esm/@types/events.js.map +1 -1
  12. package/dist/esm/classes/WalletObserver.class.js +18 -12
  13. package/dist/esm/classes/WalletObserver.class.js.map +1 -1
  14. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js +1 -1
  15. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  16. package/dist/esm/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js +23 -13
  17. package/dist/esm/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js.map +1 -1
  18. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +7 -6
  19. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  20. package/dist/esm/react-components/contexts/observer/types.js.map +1 -1
  21. package/dist/types/@types/events.d.ts +6 -2
  22. package/dist/types/@types/events.d.ts.map +1 -1
  23. package/dist/types/classes/WalletObserver.class.d.ts +2 -2
  24. package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
  25. package/dist/types/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.d.ts +2 -1
  26. package/dist/types/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.d.ts.map +1 -1
  27. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +2 -1
  28. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
  29. package/dist/types/react-components/contexts/observer/types.d.ts +6 -2
  30. package/dist/types/react-components/contexts/observer/types.d.ts.map +1 -1
  31. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  32. package/package.json +1 -1
  33. package/src/@types/events.ts +2 -2
  34. package/src/classes/WalletObserver.class.ts +23 -14
  35. package/src/classes/__tests__/WalletObserver.test.ts +4 -0
  36. package/src/react-components/WalletObserverProvider/WalletObserverProvider.tsx +1 -1
  37. package/src/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.ts +36 -14
  38. package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +107 -102
  39. package/src/react-components/contexts/observer/types.ts +2 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sundaeswap/wallet-lite",
3
- "version": "0.0.83",
3
+ "version": "0.0.85",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -25,11 +25,11 @@ export interface IWalletObserverEventValues<
25
25
  [EWalletObserverEvents.SYNCING_WALLET_START]: undefined;
26
26
  [EWalletObserverEvents.SYNCING_WALLET_END]:
27
27
  | undefined
28
- | IWalletObserverSync<T>;
28
+ | (IWalletObserverSync<T> & { activeWallet: string });
29
29
  [EWalletObserverEvents.CONNECT_WALLET_START]: undefined;
30
30
  [EWalletObserverEvents.CONNECT_WALLET_END]:
31
31
  | undefined
32
- | IWalletObserverSync<T>;
32
+ | (IWalletObserverSync<T> & { activeWallet: string });
33
33
  [EWalletObserverEvents.GET_BALANCE_MAP_START]: undefined;
34
34
  [EWalletObserverEvents.GET_BALANCE_MAP_END]: {
35
35
  balanceMap: WalletBalanceMap<T>;
@@ -136,7 +136,6 @@ export class WalletObserver<
136
136
 
137
137
  if (newNetwork instanceof Error) {
138
138
  this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END);
139
- this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);
140
139
  this._performingSync = false;
141
140
  throw newNetwork;
142
141
  }
@@ -173,14 +172,15 @@ export class WalletObserver<
173
172
  console.log(`sync: ${end - start}ms`);
174
173
  }
175
174
 
176
- this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END, result);
177
- this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END, result);
175
+ this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END, {
176
+ ...result,
177
+ activeWallet: this.activeWallet!,
178
+ });
178
179
  this._performingSync = false;
179
180
  return result;
180
181
  } catch (e) {
181
182
  this._performingSync = false;
182
183
  this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END);
183
- this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);
184
184
  throw e;
185
185
  }
186
186
  };
@@ -279,9 +279,11 @@ export class WalletObserver<
279
279
  * 10 seconds before throw an error.
280
280
  *
281
281
  * @param {string} extension The name of the extension to enable.
282
- * @return {Promise<void>}
282
+ * @return {Promise<IWalletObserverSync<AssetMetadata> | Error>}
283
283
  */
284
- connectWallet = async (extension: string): Promise<void> => {
284
+ connectWallet = async (
285
+ extension: string,
286
+ ): Promise<IWalletObserverSync<AssetMetadata> | Error> => {
285
287
  const start = performance.now();
286
288
  this.dispatch(EWalletObserverEvents.CONNECT_WALLET_START);
287
289
 
@@ -306,23 +308,24 @@ export class WalletObserver<
306
308
  }
307
309
 
308
310
  if (!extensionObject) {
311
+ this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);
309
312
  throw new Error("Wallet extension not found in the global context.");
310
313
  }
311
314
 
312
- const api = await this.syncApi(extension);
313
-
314
315
  this.activeWallet = extension;
315
- if (this._options.persistence && api) {
316
- const addresses = await this.getUsedAddresses();
317
- if (addresses instanceof Error) {
318
- addresses.cause =
316
+ await this.syncApi(extension);
317
+ const data = await this.sync();
318
+
319
+ if (this._options.persistence) {
320
+ if (data.usedAddresses instanceof Error) {
321
+ data.usedAddresses.cause =
319
322
  "Could not get a list of used addresses from the wallet when trying to save the connection.";
320
- throw addresses;
323
+ throw data.usedAddresses;
321
324
  }
322
325
 
323
326
  const seed: IWalletObserverSeed = {
324
327
  activeWallet: extension,
325
- mainAddress: addresses[0],
328
+ mainAddress: data.usedAddresses[0],
326
329
  };
327
330
 
328
331
  window.localStorage.setItem(
@@ -331,10 +334,16 @@ export class WalletObserver<
331
334
  );
332
335
  }
333
336
 
337
+ this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END, {
338
+ ...data,
339
+ activeWallet: extension,
340
+ });
334
341
  const end = performance.now();
335
342
  if (this._options.debug) {
336
343
  console.log(`connectWallet: ${end - start}ms`);
337
344
  }
345
+
346
+ return data;
338
347
  };
339
348
 
340
349
  getCip45Instance = async () => {
@@ -241,6 +241,10 @@ describe("WalletObserver", async () => {
241
241
  ).toBeNull();
242
242
  expect(spiedDispatch).toHaveBeenNthCalledWith(
243
243
  7,
244
+ EWalletObserverEvents.SYNCING_WALLET_START,
245
+ );
246
+ expect(spiedDispatch).toHaveBeenNthCalledWith(
247
+ 11,
244
248
  EWalletObserverEvents.DISCONNECT,
245
249
  );
246
250
  expect(spiedOnGetPeerConnect).not.toHaveBeenCalled();
@@ -27,7 +27,7 @@ const WalletObserverProvider: FC<
27
27
  syncingWallet,
28
28
  ready,
29
29
  eventListenersAttached,
30
- } = useProviderWalletObserverRef(options?.observerOptions);
30
+ } = useProviderWalletObserverRef(options?.observerOptions, options?.hooks);
31
31
  const state = useWalletObserverState(observerRef.current);
32
32
 
33
33
  useProviderRefreshInterval(
@@ -1,7 +1,11 @@
1
1
  import { MutableRefObject, useEffect, useMemo, useRef, useState } from "react";
2
2
 
3
+ import { IAssetAmountMetadata } from "@sundaeswap/asset";
3
4
  import { EWalletObserverEvents } from "../../../@types/events.js";
4
- import { TWalletObserverOptions } from "../../../@types/observer.js";
5
+ import {
6
+ IWalletObserverSync,
7
+ TWalletObserverOptions,
8
+ } from "../../../@types/observer.js";
5
9
  import { WalletObserver } from "../../../classes/WalletObserver.class.js";
6
10
  import { TWalletProviderHooks } from "../../contexts/observer/index.js";
7
11
 
@@ -45,24 +49,42 @@ export const useProviderWalletObserverRef = (
45
49
  return;
46
50
  }
47
51
 
48
- const setConnectingStart = async () => {
49
- setConnecting(() => true);
50
- await hooks?.onConnectWalletStart?.();
52
+ const setConnectingStart = () => {
53
+ (async () => {
54
+ setConnecting(() => true);
55
+ await hooks?.onConnectWalletStart?.();
56
+ })().catch(console.error);
51
57
  };
52
- const setConnectingEnd = async () => {
53
- setConnecting(() => false);
54
- await hooks?.onConnectWalletEnd?.();
58
+ const setConnectingEnd = (
59
+ data?: IWalletObserverSync<IAssetAmountMetadata> & {
60
+ activeWallet: string;
61
+ },
62
+ ) => {
63
+ (async () => {
64
+ setConnecting(() => false);
65
+ await hooks?.onConnectWalletEnd?.(data);
66
+ })().catch(console.error);
55
67
  };
56
- const setSyncingStart = async () => {
57
- setSyncing(() => true);
58
- await hooks?.onSyncWalletStart?.();
68
+ const setSyncingStart = () => {
69
+ (async () => {
70
+ setSyncing(() => true);
71
+ await hooks?.onSyncWalletStart?.();
72
+ })().catch(console.error);
59
73
  };
60
- const setSyncingEnd = async () => {
61
- await hooks?.onSyncWalletEnd?.();
62
- setSyncing(() => false);
74
+ const setSyncingEnd = (
75
+ data?: IWalletObserverSync<IAssetAmountMetadata> & {
76
+ activeWallet: string;
77
+ },
78
+ ) => {
79
+ (async () => {
80
+ await hooks?.onSyncWalletEnd?.(data);
81
+ setSyncing(() => false);
82
+ })().catch(console.error);
63
83
  };
64
84
  const onDisconnect = () => {
65
- hooks?.onDisconnectWallet?.();
85
+ (async () => {
86
+ hooks?.onDisconnectWallet?.();
87
+ })().catch(console.error);
66
88
  };
67
89
 
68
90
  observerRef.current.addEventListener(
@@ -2,6 +2,7 @@ import type { TransactionUnspentOutput } from "@cardano-sdk/core/dist/cjs/Serial
2
2
  import { AssetAmount, IAssetAmountMetadata } from "@sundaeswap/asset";
3
3
  import { useCallback, useEffect, useState, useTransition } from "react";
4
4
 
5
+ import { IWalletObserverSync } from "src/@types/observer.js";
5
6
  import { WalletBalanceMap } from "../../../classes/WalletBalanceMap.class.js";
6
7
  import { WalletObserver } from "../../../classes/WalletObserver.class.js";
7
8
  import { ADA_ASSET_ID } from "../../../constants.js";
@@ -66,127 +67,131 @@ export const useWalletObserverState = <
66
67
  setSwitching(() => true);
67
68
  }
68
69
 
69
- await observer.connectWallet(wallet);
70
- await syncWallet();
70
+ const data = await observer.connectWallet(wallet);
71
+ await syncWallet(data instanceof Error ? undefined : data);
71
72
  setSwitching(() => false);
72
73
  return observer.api;
73
74
  },
74
75
  [observer, setSwitching],
75
76
  );
76
77
 
77
- const syncWallet = useCallback(async () => {
78
- if (observer.isSyncing() || !observer.hasActiveConnection()) {
79
- return;
80
- }
81
-
82
- const newWallet = observer.activeWallet;
83
- if (!newWallet) {
84
- disconnect();
85
- return;
86
- }
87
-
88
- setIsCip45(newWallet.includes("p2p"));
89
- setActiveWallet((prevWallet) =>
90
- newWallet === prevWallet ? prevWallet : newWallet,
91
- );
92
-
93
- try {
94
- const freshData = await observer.sync();
95
-
96
- startTransition(() => {
97
- const newBalanceMap = freshData.balanceMap;
98
- if (newBalanceMap instanceof WalletBalanceMap) {
99
- const newAdaBalance = newBalanceMap.get(ADA_ASSET_ID);
100
- if (newAdaBalance) {
101
- setAdaBalance((prevBalance) =>
102
- prevBalance.amount === newAdaBalance.amount
103
- ? prevBalance
104
- : newAdaBalance,
78
+ const syncWallet = useCallback(
79
+ async (importedData?: IWalletObserverSync<AssetMetadata> | undefined) => {
80
+ if (observer.isSyncing() || !observer.hasActiveConnection()) {
81
+ return;
82
+ }
83
+
84
+ const newWallet = observer.activeWallet;
85
+ if (!newWallet) {
86
+ disconnect();
87
+ return;
88
+ }
89
+
90
+ setIsCip45(newWallet.includes("p2p"));
91
+ setActiveWallet((prevWallet) =>
92
+ newWallet === prevWallet ? prevWallet : newWallet,
93
+ );
94
+
95
+ try {
96
+ const freshData = importedData || (await observer.sync());
97
+
98
+ startTransition(() => {
99
+ const newBalanceMap = freshData.balanceMap;
100
+ if (newBalanceMap instanceof WalletBalanceMap) {
101
+ const newAdaBalance = newBalanceMap.get(ADA_ASSET_ID);
102
+ if (newAdaBalance) {
103
+ setAdaBalance((prevBalance) =>
104
+ prevBalance.amount === newAdaBalance.amount
105
+ ? prevBalance
106
+ : newAdaBalance,
107
+ );
108
+
109
+ setBalance((prevBalance) =>
110
+ areAssetMapsEqual(prevBalance, newBalanceMap)
111
+ ? prevBalance
112
+ : newBalanceMap,
113
+ );
114
+ }
115
+ }
116
+
117
+ const newUsedAddresses = freshData.usedAddresses;
118
+ if (newUsedAddresses instanceof Array) {
119
+ setUsedAddresses((prevValue) => {
120
+ return JSON.stringify(prevValue) ===
121
+ JSON.stringify(newUsedAddresses)
122
+ ? prevValue
123
+ : newUsedAddresses;
124
+ });
125
+ }
126
+
127
+ const newUnusedAddresses = freshData.unusedAddresses;
128
+ if (newUnusedAddresses instanceof Array) {
129
+ setUnusedAddresses((prevValue) =>
130
+ JSON.stringify(prevValue) === JSON.stringify(newUnusedAddresses)
131
+ ? prevValue
132
+ : newUnusedAddresses,
105
133
  );
134
+ }
106
135
 
107
- setBalance((prevBalance) =>
108
- areAssetMapsEqual(prevBalance, newBalanceMap)
109
- ? prevBalance
110
- : newBalanceMap,
136
+ const newNetwork = freshData.network;
137
+ if (typeof newNetwork === "number") {
138
+ setNetwork((prevValue) =>
139
+ prevValue === newNetwork ? prevValue : newNetwork,
111
140
  );
112
141
  }
113
- }
114
-
115
- const newUsedAddresses = freshData.usedAddresses;
116
- if (newUsedAddresses instanceof Array) {
117
- setUsedAddresses((prevValue) => {
118
- return JSON.stringify(prevValue) ===
119
- JSON.stringify(newUsedAddresses)
120
- ? prevValue
121
- : newUsedAddresses;
122
- });
123
- }
124
-
125
- const newUnusedAddresses = freshData.unusedAddresses;
126
- if (newUnusedAddresses instanceof Array) {
127
- setUnusedAddresses((prevValue) =>
128
- JSON.stringify(prevValue) === JSON.stringify(newUnusedAddresses)
129
- ? prevValue
130
- : newUnusedAddresses,
131
- );
132
- }
133
-
134
- const newNetwork = freshData.network;
135
- if (typeof newNetwork === "number") {
136
- setNetwork((prevValue) =>
137
- prevValue === newNetwork ? prevValue : newNetwork,
138
- );
139
- }
140
-
141
- const newUtxos = freshData.utxos;
142
- if (newUtxos instanceof Array) {
143
- setUtxos((prevValue) => {
144
- const prevValueRep = prevValue?.map((v) => v.toCbor());
145
- const newValueRep = newUtxos?.map((v) => v.toCbor());
146
- if (prevValueRep !== newValueRep) {
147
- return newUtxos;
148
- }
149
142
 
150
- return prevValue;
151
- });
152
- }
153
-
154
- const newCollateral = freshData.collateral;
155
- if (newCollateral instanceof Array) {
156
- setCollateral((prevValue) => {
157
- const prevValueRep = prevValue?.map((v) => v.toCbor());
158
- const newValueRep = newCollateral?.map((v) => v.toCbor());
159
- if (prevValueRep !== newValueRep) {
160
- return newCollateral;
161
- }
143
+ const newUtxos = freshData.utxos;
144
+ if (newUtxos instanceof Array) {
145
+ setUtxos((prevValue) => {
146
+ const prevValueRep = prevValue?.map((v) => v.toCbor());
147
+ const newValueRep = newUtxos?.map((v) => v.toCbor());
148
+ if (prevValueRep !== newValueRep) {
149
+ return newUtxos;
150
+ }
151
+
152
+ return prevValue;
153
+ });
154
+ }
155
+
156
+ const newCollateral = freshData.collateral;
157
+ if (newCollateral instanceof Array) {
158
+ setCollateral((prevValue) => {
159
+ const prevValueRep = prevValue?.map((v) => v.toCbor());
160
+ const newValueRep = newCollateral?.map((v) => v.toCbor());
161
+ if (prevValueRep !== newValueRep) {
162
+ return newCollateral;
163
+ }
164
+
165
+ return prevValue;
166
+ });
167
+ }
162
168
 
163
- return prevValue;
164
- });
165
- }
166
-
167
- const newFeeAddress = freshData.feeAddress;
168
- if (typeof newFeeAddress === "string") {
169
- setFeeAddress((prevValue) =>
170
- prevValue === newFeeAddress ? prevValue : newFeeAddress,
171
- );
172
- }
173
- });
174
- } catch (e) {
175
- setErrorSyncing(true);
176
- (e as Error).cause =
177
- "The wallet threw an error while the app was trying to sync with it. Please try again or contact your wallet provider.";
178
- throw e;
179
- }
180
- }, [observer, disconnect]);
169
+ const newFeeAddress = freshData.feeAddress;
170
+ if (typeof newFeeAddress === "string") {
171
+ setFeeAddress((prevValue) =>
172
+ prevValue === newFeeAddress ? prevValue : newFeeAddress,
173
+ );
174
+ }
175
+ });
176
+ } catch (e) {
177
+ setErrorSyncing(true);
178
+ (e as Error).cause =
179
+ "The wallet threw an error while the app was trying to sync with it. Please try again or contact your wallet provider.";
180
+ throw e;
181
+ }
182
+ },
183
+ [observer, disconnect],
184
+ );
181
185
 
182
186
  /**
183
187
  * Ensure the wallet syncs on connect and disconnect.
184
188
  */
185
189
  useEffect(() => {
186
- window.addEventListener("focus", syncWallet);
190
+ const func = () => syncWallet();
191
+ window.addEventListener("focus", func);
187
192
 
188
193
  return () => {
189
- window.addEventListener("focus", syncWallet);
194
+ window.addEventListener("focus", func);
190
195
  };
191
196
  }, [syncWallet]);
192
197
 
@@ -18,11 +18,11 @@ export type TWalletProviderHooks<
18
18
  > = {
19
19
  onSyncWalletStart?: () => Promise<void>;
20
20
  onSyncWalletEnd?: (
21
- data?: IWalletObserverSync<AssetMetadata>,
21
+ data?: IWalletObserverSync<AssetMetadata> & { activeWallet: string },
22
22
  ) => Promise<void>;
23
23
  onConnectWalletStart?: () => Promise<void>;
24
24
  onConnectWalletEnd?: (
25
- data?: IWalletObserverSync<AssetMetadata>,
25
+ data?: IWalletObserverSync<AssetMetadata> & { activeWallet: string },
26
26
  ) => Promise<void>;
27
27
  onDisconnectWallet?: () => Promise<void>;
28
28
  };