@avail-project/widgets 0.0.1

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 (143) hide show
  1. package/README.md +34 -0
  2. package/dist/common/components/ErrorBoundary.d.ts +44 -0
  3. package/dist/common/components/ErrorBoundary.d.ts.map +1 -0
  4. package/dist/common/components/ErrorBoundary.js +65 -0
  5. package/dist/common/hooks/useDebouncedCallback.d.ts +13 -0
  6. package/dist/common/hooks/useDebouncedCallback.d.ts.map +1 -0
  7. package/dist/common/hooks/useDebouncedCallback.js +42 -0
  8. package/dist/common/hooks/useDebouncedValue.d.ts +5 -0
  9. package/dist/common/hooks/useDebouncedValue.d.ts.map +1 -0
  10. package/dist/common/hooks/useDebouncedValue.js +15 -0
  11. package/dist/common/hooks/useInterval.d.ts +11 -0
  12. package/dist/common/hooks/useInterval.d.ts.map +1 -0
  13. package/dist/common/hooks/useInterval.js +25 -0
  14. package/dist/common/hooks/useLatest.d.ts +12 -0
  15. package/dist/common/hooks/useLatest.d.ts.map +1 -0
  16. package/dist/common/hooks/useLatest.js +19 -0
  17. package/dist/common/hooks/useNexusError.d.ts +20 -0
  18. package/dist/common/hooks/useNexusError.d.ts.map +1 -0
  19. package/dist/common/hooks/useNexusError.js +120 -0
  20. package/dist/common/hooks/usePolling.d.ts +7 -0
  21. package/dist/common/hooks/usePolling.d.ts.map +1 -0
  22. package/dist/common/hooks/usePolling.js +29 -0
  23. package/dist/common/hooks/useStableCallback.d.ts +6 -0
  24. package/dist/common/hooks/useStableCallback.d.ts.map +1 -0
  25. package/dist/common/hooks/useStableCallback.js +13 -0
  26. package/dist/common/hooks/useStopwatch.d.ts +17 -0
  27. package/dist/common/hooks/useStopwatch.d.ts.map +1 -0
  28. package/dist/common/hooks/useStopwatch.js +44 -0
  29. package/dist/common/hooks/useTransactionExecution.d.ts +62 -0
  30. package/dist/common/hooks/useTransactionExecution.d.ts.map +1 -0
  31. package/dist/common/hooks/useTransactionExecution.js +273 -0
  32. package/dist/common/hooks/useTransactionFlow.d.ts +71 -0
  33. package/dist/common/hooks/useTransactionFlow.d.ts.map +1 -0
  34. package/dist/common/hooks/useTransactionFlow.js +435 -0
  35. package/dist/common/index.d.ts +17 -0
  36. package/dist/common/index.d.ts.map +1 -0
  37. package/dist/common/index.js +16 -0
  38. package/dist/common/tx/steps.d.ts +19 -0
  39. package/dist/common/tx/steps.d.ts.map +1 -0
  40. package/dist/common/tx/steps.js +89 -0
  41. package/dist/common/tx/types.d.ts +11 -0
  42. package/dist/common/tx/types.d.ts.map +1 -0
  43. package/dist/common/tx/types.js +19 -0
  44. package/dist/common/tx/useTransactionSteps.d.ts +21 -0
  45. package/dist/common/tx/useTransactionSteps.d.ts.map +1 -0
  46. package/dist/common/tx/useTransactionSteps.js +40 -0
  47. package/dist/common/types/transaction-flow.d.ts +48 -0
  48. package/dist/common/types/transaction-flow.d.ts.map +1 -0
  49. package/dist/common/types/transaction-flow.js +2 -0
  50. package/dist/common/utils/constant.d.ts +99 -0
  51. package/dist/common/utils/constant.d.ts.map +1 -0
  52. package/dist/common/utils/constant.js +370 -0
  53. package/dist/common/utils/token-pricing.d.ts +33 -0
  54. package/dist/common/utils/token-pricing.d.ts.map +1 -0
  55. package/dist/common/utils/token-pricing.js +255 -0
  56. package/dist/common/utils/transaction-flow.d.ts +35 -0
  57. package/dist/common/utils/transaction-flow.d.ts.map +1 -0
  58. package/dist/common/utils/transaction-flow.js +65 -0
  59. package/dist/index.d.ts +5 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +2 -0
  62. package/dist/lib/utils.d.ts +4 -0
  63. package/dist/lib/utils.d.ts.map +1 -0
  64. package/dist/lib/utils.js +8 -0
  65. package/dist/nexus/NexusProvider.d.ts +50 -0
  66. package/dist/nexus/NexusProvider.d.ts.map +1 -0
  67. package/dist/nexus/NexusProvider.js +572 -0
  68. package/dist/nexus-widget/components/address-identicon.d.ts +5 -0
  69. package/dist/nexus-widget/components/address-identicon.d.ts.map +1 -0
  70. package/dist/nexus-widget/components/address-identicon.js +39 -0
  71. package/dist/nexus-widget/components/amount-input-unified.d.ts +18 -0
  72. package/dist/nexus-widget/components/amount-input-unified.d.ts.map +1 -0
  73. package/dist/nexus-widget/components/amount-input-unified.js +88 -0
  74. package/dist/nexus-widget/components/deposit-idle-form.d.ts +29 -0
  75. package/dist/nexus-widget/components/deposit-idle-form.d.ts.map +1 -0
  76. package/dist/nexus-widget/components/deposit-idle-form.js +506 -0
  77. package/dist/nexus-widget/components/nexus-widget-progress-screen.d.ts +36 -0
  78. package/dist/nexus-widget/components/nexus-widget-progress-screen.d.ts.map +1 -0
  79. package/dist/nexus-widget/components/nexus-widget-progress-screen.js +737 -0
  80. package/dist/nexus-widget/components/pay-using-selector.d.ts +9 -0
  81. package/dist/nexus-widget/components/pay-using-selector.d.ts.map +1 -0
  82. package/dist/nexus-widget/components/pay-using-selector.js +37 -0
  83. package/dist/nexus-widget/components/pay-with-sources.d.ts +11 -0
  84. package/dist/nexus-widget/components/pay-with-sources.d.ts.map +1 -0
  85. package/dist/nexus-widget/components/pay-with-sources.js +266 -0
  86. package/dist/nexus-widget/components/receive-asset-selector.d.ts +28 -0
  87. package/dist/nexus-widget/components/receive-asset-selector.d.ts.map +1 -0
  88. package/dist/nexus-widget/components/receive-asset-selector.js +1178 -0
  89. package/dist/nexus-widget/components/recipient-input.d.ts +10 -0
  90. package/dist/nexus-widget/components/recipient-input.d.ts.map +1 -0
  91. package/dist/nexus-widget/components/recipient-input.js +44 -0
  92. package/dist/nexus-widget/components/send-idle-form.d.ts +29 -0
  93. package/dist/nexus-widget/components/send-idle-form.d.ts.map +1 -0
  94. package/dist/nexus-widget/components/send-idle-form.js +548 -0
  95. package/dist/nexus-widget/components/status-alerts.d.ts +7 -0
  96. package/dist/nexus-widget/components/status-alerts.d.ts.map +1 -0
  97. package/dist/nexus-widget/components/status-alerts.js +17 -0
  98. package/dist/nexus-widget/components/swap-asset-selector.d.ts +74 -0
  99. package/dist/nexus-widget/components/swap-asset-selector.d.ts.map +1 -0
  100. package/dist/nexus-widget/components/swap-asset-selector.js +1910 -0
  101. package/dist/nexus-widget/components/swap-idle-form.d.ts +29 -0
  102. package/dist/nexus-widget/components/swap-idle-form.d.ts.map +1 -0
  103. package/dist/nexus-widget/components/swap-idle-form.js +1289 -0
  104. package/dist/nexus-widget/components/swap-intent-preview.d.ts +95 -0
  105. package/dist/nexus-widget/components/swap-intent-preview.d.ts.map +1 -0
  106. package/dist/nexus-widget/components/swap-intent-preview.js +1050 -0
  107. package/dist/nexus-widget/nexus-widget.d.ts +4 -0
  108. package/dist/nexus-widget/nexus-widget.d.ts.map +1 -0
  109. package/dist/nexus-widget/nexus-widget.js +7819 -0
  110. package/dist/nexus-widget/sdk-types.d.ts +13 -0
  111. package/dist/nexus-widget/sdk-types.d.ts.map +1 -0
  112. package/dist/nexus-widget/sdk-types.js +1 -0
  113. package/dist/nexus-widget/theme.d.ts +156 -0
  114. package/dist/nexus-widget/theme.d.ts.map +1 -0
  115. package/dist/nexus-widget/theme.js +159 -0
  116. package/dist/nexus-widget/types.d.ts +141 -0
  117. package/dist/nexus-widget/types.d.ts.map +1 -0
  118. package/dist/nexus-widget/types.js +1 -0
  119. package/dist/nexus-widget/utils/citrea-tokens.d.ts +82 -0
  120. package/dist/nexus-widget/utils/citrea-tokens.d.ts.map +1 -0
  121. package/dist/nexus-widget/utils/citrea-tokens.js +136 -0
  122. package/dist/nexus-widget/utils/deposit-source-selection.d.ts +55 -0
  123. package/dist/nexus-widget/utils/deposit-source-selection.d.ts.map +1 -0
  124. package/dist/nexus-widget/utils/deposit-source-selection.js +219 -0
  125. package/dist/swaps/components/stacked-token-icons.d.ts +15 -0
  126. package/dist/swaps/components/stacked-token-icons.d.ts.map +1 -0
  127. package/dist/swaps/components/stacked-token-icons.js +38 -0
  128. package/dist/swaps/components/step-flow.d.ts +32 -0
  129. package/dist/swaps/components/step-flow.d.ts.map +1 -0
  130. package/dist/swaps/components/step-flow.js +54 -0
  131. package/dist/swaps/components/token-icon.d.ts +11 -0
  132. package/dist/swaps/components/token-icon.d.ts.map +1 -0
  133. package/dist/swaps/components/token-icon.js +16 -0
  134. package/dist/swaps/components/transaction-progress.d.ts +43 -0
  135. package/dist/swaps/components/transaction-progress.d.ts.map +1 -0
  136. package/dist/swaps/components/transaction-progress.js +94 -0
  137. package/dist/ui/button.d.ts +11 -0
  138. package/dist/ui/button.d.ts.map +1 -0
  139. package/dist/ui/button.js +34 -0
  140. package/dist/ui/dialog.d.ts +17 -0
  141. package/dist/ui/dialog.d.ts.map +1 -0
  142. package/dist/ui/dialog.js +47 -0
  143. package/package.json +60 -0
@@ -0,0 +1,62 @@
1
+ import { type NexusClient, type OnAllowanceHookData, type OnIntentHookData } from "@avail-project/nexus-core";
2
+ import { type Dispatch, type RefObject, type SetStateAction } from "react";
3
+ import { type TransactionStatus } from "../tx/types";
4
+ import { type SourceSelectionValidation, type TransactionFlowExecutor, type TransactionFlowInputs, type BridgeStepType } from "../types/transaction-flow";
5
+ interface NexusErrorInfo {
6
+ code: string;
7
+ message: string;
8
+ context?: unknown;
9
+ details?: unknown;
10
+ }
11
+ type NexusErrorHandler = (error: unknown) => NexusErrorInfo;
12
+ interface UseTransactionExecutionProps {
13
+ operationName: "bridge" | "transfer";
14
+ nexusSDK: NexusClient | null;
15
+ intent: RefObject<OnIntentHookData | null>;
16
+ allowance: RefObject<OnAllowanceHookData | null>;
17
+ inputs: TransactionFlowInputs;
18
+ configuredMaxAmount?: string;
19
+ allAvailableSourceChainIds: number[];
20
+ sourceChainsForSdk?: number[];
21
+ sourceSelectionKey: string;
22
+ sourceSelection: SourceSelectionValidation;
23
+ loading: boolean;
24
+ txError: string | null;
25
+ areInputsValid: boolean;
26
+ executeTransaction: TransactionFlowExecutor;
27
+ getMaxForCurrentSelection: () => Promise<string | undefined>;
28
+ onStepsList: (steps: BridgeStepType[]) => void;
29
+ onStepComplete: (step: BridgeStepType) => void;
30
+ resetSteps: () => void;
31
+ setStatus: (status: TransactionStatus) => void;
32
+ resetInputs: () => void;
33
+ setRefreshing: Dispatch<SetStateAction<boolean>>;
34
+ setIsDialogOpen: Dispatch<SetStateAction<boolean>>;
35
+ setTxError: Dispatch<SetStateAction<string | null>>;
36
+ setLastExplorerUrl: Dispatch<SetStateAction<string>>;
37
+ setSelectedSourceChains: Dispatch<SetStateAction<number[] | null>>;
38
+ setAppliedSourceSelectionKey: Dispatch<SetStateAction<string>>;
39
+ stopwatch: {
40
+ start: () => void;
41
+ stop: () => void;
42
+ reset: () => void;
43
+ };
44
+ handleNexusError: NexusErrorHandler;
45
+ onStart?: () => void;
46
+ onComplete?: (explorerUrl?: string) => void;
47
+ onError?: (message: string) => void;
48
+ fetchBalance: () => Promise<void>;
49
+ notifyHistoryRefresh?: () => void;
50
+ }
51
+ export declare function useTransactionExecution({ operationName, nexusSDK, intent, allowance, inputs, configuredMaxAmount, allAvailableSourceChainIds, sourceChainsForSdk, sourceSelectionKey, sourceSelection, loading, txError, areInputsValid, executeTransaction, getMaxForCurrentSelection, onStepsList, onStepComplete, resetSteps, setStatus, resetInputs, setRefreshing, setIsDialogOpen, setTxError, setLastExplorerUrl, setSelectedSourceChains, setAppliedSourceSelectionKey, stopwatch, handleNexusError, onStart, onComplete, onError, fetchBalance, notifyHistoryRefresh, }: UseTransactionExecutionProps): {
52
+ refreshIntent: (options?: {
53
+ reportError?: boolean;
54
+ }) => Promise<boolean>;
55
+ handleTransaction: () => Promise<void>;
56
+ startTransaction: () => void;
57
+ commitAmount: () => Promise<void>;
58
+ reset: () => void;
59
+ invalidatePendingExecution: () => void;
60
+ };
61
+ export {};
62
+ //# sourceMappingURL=useTransactionExecution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTransactionExecution.d.ts","sourceRoot":"","sources":["../../../.build-src/common/hooks/useTransactionExecution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,273 @@
1
+ import {} from "@avail-project/nexus-core";
2
+ import { useCallback, useRef, } from "react";
3
+ import {} from "../tx/types";
4
+ import {} from "../types/transaction-flow";
5
+ export function useTransactionExecution({ operationName, nexusSDK, intent, allowance, inputs, configuredMaxAmount, allAvailableSourceChainIds, sourceChainsForSdk, sourceSelectionKey, sourceSelection, loading, txError, areInputsValid, executeTransaction, getMaxForCurrentSelection, onStepsList, onStepComplete, resetSteps, setStatus, resetInputs, setRefreshing, setIsDialogOpen, setTxError, setLastExplorerUrl, setSelectedSourceChains, setAppliedSourceSelectionKey, stopwatch, handleNexusError, onStart, onComplete, onError, fetchBalance, notifyHistoryRefresh, }) {
6
+ const commitLockRef = useRef(false);
7
+ const runIdRef = useRef(0);
8
+ const refreshIntent = async (options) => {
9
+ if (!intent.current)
10
+ return false;
11
+ const activeRunId = runIdRef.current;
12
+ setRefreshing(true);
13
+ try {
14
+ const updated = await intent.current.refresh(sourceChainsForSdk);
15
+ if (activeRunId !== runIdRef.current)
16
+ return false;
17
+ if (updated) {
18
+ intent.current.intent = updated;
19
+ }
20
+ setAppliedSourceSelectionKey(sourceSelectionKey);
21
+ return true;
22
+ }
23
+ catch (error) {
24
+ if (activeRunId !== runIdRef.current)
25
+ return false;
26
+ console.error("Transaction failed:", error);
27
+ if (options?.reportError) {
28
+ const message = "Unable to refresh source selection. Please try again.";
29
+ setTxError(message);
30
+ onError?.(message);
31
+ }
32
+ return false;
33
+ }
34
+ finally {
35
+ if (activeRunId === runIdRef.current) {
36
+ setRefreshing(false);
37
+ }
38
+ }
39
+ };
40
+ const onSuccess = async (explorerUrl) => {
41
+ stopwatch.stop();
42
+ setStatus("success");
43
+ onComplete?.(explorerUrl);
44
+ intent.current = null;
45
+ allowance.current = null;
46
+ resetInputs();
47
+ setRefreshing(false);
48
+ setSelectedSourceChains(null);
49
+ setAppliedSourceSelectionKey("ALL");
50
+ await fetchBalance();
51
+ notifyHistoryRefresh?.();
52
+ };
53
+ const handleTransaction = async () => {
54
+ if (commitLockRef.current)
55
+ return;
56
+ commitLockRef.current = true;
57
+ const currentRunId = ++runIdRef.current;
58
+ let didEnterExecutingState = false;
59
+ const cleanupSupersededExecution = () => {
60
+ if (!didEnterExecutingState)
61
+ return;
62
+ setRefreshing(false);
63
+ setIsDialogOpen(false);
64
+ setLastExplorerUrl("");
65
+ stopwatch.stop();
66
+ stopwatch.reset();
67
+ resetSteps();
68
+ setStatus("idle");
69
+ };
70
+ try {
71
+ if (!inputs?.amount ||
72
+ !inputs?.recipient ||
73
+ !inputs?.chain ||
74
+ !inputs?.token) {
75
+ console.error("Missing required inputs");
76
+ return;
77
+ }
78
+ if (!nexusSDK) {
79
+ const message = "Nexus SDK not initialized";
80
+ setTxError(message);
81
+ onError?.(message);
82
+ return;
83
+ }
84
+ if (allAvailableSourceChainIds.length === 0) {
85
+ const message = "No eligible source chains available for the selected token and destination.";
86
+ setTxError(message);
87
+ onError?.(message);
88
+ setStatus("error");
89
+ return;
90
+ }
91
+ const parsedAmount = Number(inputs.amount);
92
+ if (!Number.isFinite(parsedAmount) || parsedAmount <= 0) {
93
+ const message = "Enter a valid amount greater than 0.";
94
+ setTxError(message);
95
+ onError?.(message);
96
+ setStatus("error");
97
+ return;
98
+ }
99
+ const amountBigInt = nexusSDK.convertTokenReadableAmountToBigInt(inputs.amount, inputs.token, inputs.chain);
100
+ if (configuredMaxAmount) {
101
+ const configuredMaxRaw = nexusSDK.convertTokenReadableAmountToBigInt(configuredMaxAmount, inputs.token, inputs.chain);
102
+ if (amountBigInt > configuredMaxRaw) {
103
+ const message = `Amount exceeds maximum limit of ${configuredMaxAmount} ${inputs.token}.`;
104
+ setTxError(message);
105
+ onError?.(message);
106
+ setStatus("error");
107
+ return;
108
+ }
109
+ }
110
+ const maxForCurrentSelection = await getMaxForCurrentSelection();
111
+ if (currentRunId !== runIdRef.current)
112
+ return;
113
+ if (!maxForCurrentSelection) {
114
+ const message = `Unable to determine max ${operationName} amount for selected sources. Please try again.`;
115
+ setTxError(message);
116
+ onError?.(message);
117
+ setStatus("error");
118
+ return;
119
+ }
120
+ const maxForSelectionRaw = nexusSDK.convertTokenReadableAmountToBigInt(maxForCurrentSelection, inputs.token, inputs.chain);
121
+ if (amountBigInt > maxForSelectionRaw) {
122
+ const message = `Selected sources can provide up to ${maxForCurrentSelection} ${inputs.token}. Reduce amount or enable more sources.`;
123
+ setTxError(message);
124
+ onError?.(message);
125
+ setStatus("error");
126
+ return;
127
+ }
128
+ setStatus("executing");
129
+ didEnterExecutingState = true;
130
+ setTxError(null);
131
+ onStart?.();
132
+ setLastExplorerUrl("");
133
+ setAppliedSourceSelectionKey(sourceSelectionKey);
134
+ const onEvent = (event) => {
135
+ if (currentRunId !== runIdRef.current)
136
+ return;
137
+ if (event.type === "plan_preview" || event.type === "plan_confirmed") {
138
+ const steps = event.plan.steps.map((step) => ({
139
+ ...step,
140
+ type: step.type.toUpperCase(),
141
+ typeID: step.type.toUpperCase(),
142
+ completed: false,
143
+ }));
144
+ onStepsList(steps);
145
+ }
146
+ if (event.type === "plan_progress") {
147
+ if (event.stepType === "request_signing" &&
148
+ event.state === "completed") {
149
+ stopwatch.start();
150
+ }
151
+ const completed = event.state === "completed" ||
152
+ event.state === "confirmed" ||
153
+ event.state === "submitted";
154
+ if (completed) {
155
+ onStepComplete({
156
+ ...event.step,
157
+ type: event.stepType.toUpperCase(),
158
+ typeID: event.stepType.toUpperCase(),
159
+ completed: true,
160
+ });
161
+ }
162
+ }
163
+ };
164
+ const transactionResult = await executeTransaction({
165
+ token: inputs.token,
166
+ amount: amountBigInt,
167
+ toChainId: inputs.chain,
168
+ recipient: inputs.recipient,
169
+ sourceChains: sourceChainsForSdk,
170
+ onEvent,
171
+ });
172
+ if (currentRunId !== runIdRef.current) {
173
+ cleanupSupersededExecution();
174
+ return;
175
+ }
176
+ if (!transactionResult) {
177
+ throw new Error("Transaction rejected by user");
178
+ }
179
+ setLastExplorerUrl(transactionResult.explorerUrl);
180
+ await onSuccess(transactionResult.explorerUrl);
181
+ }
182
+ catch (error) {
183
+ if (currentRunId !== runIdRef.current) {
184
+ cleanupSupersededExecution();
185
+ return;
186
+ }
187
+ const { message, code, context, details } = handleNexusError(error);
188
+ console.error(`Fast ${operationName} transaction failed:`, {
189
+ code,
190
+ message,
191
+ context,
192
+ details,
193
+ });
194
+ intent.current?.deny();
195
+ intent.current = null;
196
+ allowance.current = null;
197
+ setTxError(message);
198
+ onError?.(message);
199
+ setIsDialogOpen(false);
200
+ setSelectedSourceChains(null);
201
+ setRefreshing(false);
202
+ stopwatch.stop();
203
+ stopwatch.reset();
204
+ resetSteps();
205
+ void fetchBalance();
206
+ setStatus("error");
207
+ }
208
+ finally {
209
+ commitLockRef.current = false;
210
+ }
211
+ };
212
+ const reset = () => {
213
+ runIdRef.current += 1;
214
+ intent.current?.deny();
215
+ intent.current = null;
216
+ allowance.current = null;
217
+ resetInputs();
218
+ setStatus("idle");
219
+ setRefreshing(false);
220
+ setSelectedSourceChains(null);
221
+ setAppliedSourceSelectionKey("ALL");
222
+ setLastExplorerUrl("");
223
+ stopwatch.stop();
224
+ stopwatch.reset();
225
+ resetSteps();
226
+ };
227
+ const startTransaction = () => {
228
+ if (!intent.current)
229
+ return;
230
+ if (allAvailableSourceChainIds.length === 0) {
231
+ const message = "No eligible source chains available for the selected token and destination.";
232
+ setTxError(message);
233
+ onError?.(message);
234
+ return;
235
+ }
236
+ if (sourceSelection.isBelowRequired && inputs?.token) {
237
+ const message = `Selected sources are not enough. Add ${sourceSelection.missingToProceed} ${inputs.token} more to make this transaction.`;
238
+ setTxError(message);
239
+ onError?.(message);
240
+ return;
241
+ }
242
+ void (async () => {
243
+ const refreshed = await refreshIntent({ reportError: true });
244
+ if (!refreshed || !intent.current)
245
+ return;
246
+ intent.current.allow();
247
+ setIsDialogOpen(true);
248
+ setTxError(null);
249
+ })();
250
+ };
251
+ const commitAmount = async () => {
252
+ if (intent.current || loading || txError || !areInputsValid)
253
+ return;
254
+ await handleTransaction();
255
+ };
256
+ const invalidatePendingExecution = useCallback(() => {
257
+ runIdRef.current += 1;
258
+ if (intent.current) {
259
+ intent.current.deny();
260
+ intent.current = null;
261
+ }
262
+ setRefreshing(false);
263
+ setAppliedSourceSelectionKey("ALL");
264
+ }, [intent, setAppliedSourceSelectionKey, setRefreshing]);
265
+ return {
266
+ refreshIntent,
267
+ handleTransaction,
268
+ startTransaction,
269
+ commitAmount,
270
+ reset,
271
+ invalidatePendingExecution,
272
+ };
273
+ }
@@ -0,0 +1,71 @@
1
+ import { type NexusNetwork, type NexusClient, type OnAllowanceHookData, type OnIntentHookData, type TokenBalance } from "@avail-project/nexus-core";
2
+ import { type RefObject } from "react";
3
+ import { type Address } from "viem";
4
+ import { type TransactionStatus } from "../tx/types";
5
+ import { type SourceCoverageState, type TransactionFlowExecutor, type TransactionFlowInputs, type TransactionFlowPrefill, type TransactionFlowType, type BridgeStepType } from "../types/transaction-flow";
6
+ interface BaseTransactionFlowProps {
7
+ type: TransactionFlowType;
8
+ network: NexusNetwork;
9
+ nexusSDK: NexusClient | null;
10
+ intent: RefObject<OnIntentHookData | null>;
11
+ allowance: RefObject<OnAllowanceHookData | null>;
12
+ bridgableBalance: TokenBalance[] | null;
13
+ prefill?: TransactionFlowPrefill;
14
+ onComplete?: (explorerUrl?: string) => void;
15
+ onStart?: () => void;
16
+ onError?: (message: string) => void;
17
+ fetchBalance: () => Promise<void>;
18
+ maxAmount?: string | number;
19
+ isSourceMenuOpen?: boolean;
20
+ notifyHistoryRefresh?: () => void;
21
+ executeTransaction: TransactionFlowExecutor;
22
+ }
23
+ export interface UseTransactionFlowProps extends BaseTransactionFlowProps {
24
+ connectedAddress?: Address;
25
+ }
26
+ export declare function useTransactionFlow(props: UseTransactionFlowProps): {
27
+ inputs: TransactionFlowInputs;
28
+ setInputs: (next: TransactionFlowInputs | Partial<TransactionFlowInputs>) => void;
29
+ timer: number;
30
+ setIsDialogOpen: import("react").Dispatch<import("react").SetStateAction<boolean>>;
31
+ setTxError: import("react").Dispatch<import("react").SetStateAction<string | null>>;
32
+ loading: boolean;
33
+ refreshing: boolean;
34
+ isDialogOpen: boolean;
35
+ txError: string | null;
36
+ handleTransaction: () => Promise<void>;
37
+ reset: () => void;
38
+ filteredBridgableBalance: {
39
+ breakdown: any;
40
+ balance: string;
41
+ value: string;
42
+ chainBalances: import("@avail-project/nexus-core").ChainBalance[];
43
+ currencyId?: number;
44
+ decimals: number;
45
+ logo: string;
46
+ name: string;
47
+ symbol: string;
48
+ } | undefined;
49
+ startTransaction: () => void;
50
+ commitAmount: () => Promise<void>;
51
+ lastExplorerUrl: string;
52
+ steps: import("..").GenericStep<BridgeStepType>[];
53
+ status: TransactionStatus;
54
+ availableSources: any;
55
+ selectedSourceChains: any;
56
+ toggleSourceChain: (chainId: number) => void;
57
+ isSourceSelectionInsufficient: boolean;
58
+ isSourceSelectionBelowSafetyBuffer: boolean;
59
+ isSourceSelectionReadyForAccept: boolean;
60
+ sourceCoverageState: SourceCoverageState;
61
+ sourceCoveragePercent: number;
62
+ missingToProceed: string;
63
+ missingToSafety: string;
64
+ selectedTotal: string;
65
+ requiredTotal: string;
66
+ requiredSafetyTotal: string;
67
+ maxAvailableAmount: string | undefined;
68
+ isInputsValid: boolean;
69
+ };
70
+ export {};
71
+ //# sourceMappingURL=useTransactionFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTransactionFlow.d.ts","sourceRoot":"","sources":["../../../.build-src/common/hooks/useTransactionFlow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,MAAM,CAAC;AAO3D,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAUnC,UAAU,wBAAwB;IAChC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAC3C,SAAS,EAAE,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACjD,gBAAgB,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,kBAAkB,EAAE,uBAAuB,CAAC;CAC7C;AAED,MAAM,WAAW,uBAAwB,SAAQ,wBAAwB;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAYD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB;;sBAmDvD,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCA6KlD,MAAM;;;;;;;;;;;;;EA6SnB"}