@sundaeswap/wallet-lite 0.0.84 → 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 (28) hide show
  1. package/dist/cjs/classes/WalletObserver.class.js +31 -32
  2. package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
  3. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js +1 -1
  4. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  5. package/dist/cjs/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js +28 -30
  6. package/dist/cjs/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js.map +1 -1
  7. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +126 -109
  8. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  9. package/dist/esm/classes/WalletObserver.class.js +14 -14
  10. package/dist/esm/classes/WalletObserver.class.js.map +1 -1
  11. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js +1 -1
  12. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  13. package/dist/esm/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js +23 -13
  14. package/dist/esm/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.js.map +1 -1
  15. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +7 -6
  16. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  17. package/dist/types/classes/WalletObserver.class.d.ts +2 -2
  18. package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
  19. package/dist/types/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.d.ts.map +1 -1
  20. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +2 -1
  21. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
  22. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  23. package/package.json +1 -1
  24. package/src/classes/WalletObserver.class.ts +19 -16
  25. package/src/classes/__tests__/WalletObserver.test.ts +4 -0
  26. package/src/react-components/WalletObserverProvider/WalletObserverProvider.tsx +1 -1
  27. package/src/react-components/WalletObserverProvider/hooks/useProviderWalletObserverRef.ts +23 -13
  28. package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +107 -102
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sundaeswap/wallet-lite",
3
- "version": "0.0.84",
3
+ "version": "0.0.85",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -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
  }
@@ -177,16 +176,11 @@ export class WalletObserver<
177
176
  ...result,
178
177
  activeWallet: this.activeWallet!,
179
178
  });
180
- this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END, {
181
- ...result,
182
- activeWallet: this.activeWallet!,
183
- });
184
179
  this._performingSync = false;
185
180
  return result;
186
181
  } catch (e) {
187
182
  this._performingSync = false;
188
183
  this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END);
189
- this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);
190
184
  throw e;
191
185
  }
192
186
  };
@@ -285,9 +279,11 @@ export class WalletObserver<
285
279
  * 10 seconds before throw an error.
286
280
  *
287
281
  * @param {string} extension The name of the extension to enable.
288
- * @return {Promise<void>}
282
+ * @return {Promise<IWalletObserverSync<AssetMetadata> | Error>}
289
283
  */
290
- connectWallet = async (extension: string): Promise<void> => {
284
+ connectWallet = async (
285
+ extension: string,
286
+ ): Promise<IWalletObserverSync<AssetMetadata> | Error> => {
291
287
  const start = performance.now();
292
288
  this.dispatch(EWalletObserverEvents.CONNECT_WALLET_START);
293
289
 
@@ -312,23 +308,24 @@ export class WalletObserver<
312
308
  }
313
309
 
314
310
  if (!extensionObject) {
311
+ this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);
315
312
  throw new Error("Wallet extension not found in the global context.");
316
313
  }
317
314
 
318
- const api = await this.syncApi(extension);
319
-
320
315
  this.activeWallet = extension;
321
- if (this._options.persistence && api) {
322
- const addresses = await this.getUsedAddresses();
323
- if (addresses instanceof Error) {
324
- 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 =
325
322
  "Could not get a list of used addresses from the wallet when trying to save the connection.";
326
- throw addresses;
323
+ throw data.usedAddresses;
327
324
  }
328
325
 
329
326
  const seed: IWalletObserverSeed = {
330
327
  activeWallet: extension,
331
- mainAddress: addresses[0],
328
+ mainAddress: data.usedAddresses[0],
332
329
  };
333
330
 
334
331
  window.localStorage.setItem(
@@ -337,10 +334,16 @@ export class WalletObserver<
337
334
  );
338
335
  }
339
336
 
337
+ this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END, {
338
+ ...data,
339
+ activeWallet: extension,
340
+ });
340
341
  const end = performance.now();
341
342
  if (this._options.debug) {
342
343
  console.log(`connectWallet: ${end - start}ms`);
343
344
  }
345
+
346
+ return data;
344
347
  };
345
348
 
346
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(
@@ -49,32 +49,42 @@ export const useProviderWalletObserverRef = (
49
49
  return;
50
50
  }
51
51
 
52
- const setConnectingStart = async () => {
53
- setConnecting(() => true);
54
- await hooks?.onConnectWalletStart?.();
52
+ const setConnectingStart = () => {
53
+ (async () => {
54
+ setConnecting(() => true);
55
+ await hooks?.onConnectWalletStart?.();
56
+ })().catch(console.error);
55
57
  };
56
- const setConnectingEnd = async (
58
+ const setConnectingEnd = (
57
59
  data?: IWalletObserverSync<IAssetAmountMetadata> & {
58
60
  activeWallet: string;
59
61
  },
60
62
  ) => {
61
- setConnecting(() => false);
62
- await hooks?.onConnectWalletEnd?.(data);
63
+ (async () => {
64
+ setConnecting(() => false);
65
+ await hooks?.onConnectWalletEnd?.(data);
66
+ })().catch(console.error);
63
67
  };
64
- const setSyncingStart = async () => {
65
- setSyncing(() => true);
66
- await hooks?.onSyncWalletStart?.();
68
+ const setSyncingStart = () => {
69
+ (async () => {
70
+ setSyncing(() => true);
71
+ await hooks?.onSyncWalletStart?.();
72
+ })().catch(console.error);
67
73
  };
68
- const setSyncingEnd = async (
74
+ const setSyncingEnd = (
69
75
  data?: IWalletObserverSync<IAssetAmountMetadata> & {
70
76
  activeWallet: string;
71
77
  },
72
78
  ) => {
73
- await hooks?.onSyncWalletEnd?.(data);
74
- setSyncing(() => false);
79
+ (async () => {
80
+ await hooks?.onSyncWalletEnd?.(data);
81
+ setSyncing(() => false);
82
+ })().catch(console.error);
75
83
  };
76
84
  const onDisconnect = () => {
77
- hooks?.onDisconnectWallet?.();
85
+ (async () => {
86
+ hooks?.onDisconnectWallet?.();
87
+ })().catch(console.error);
78
88
  };
79
89
 
80
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