Skip to content

Commit 6311e91

Browse files
committed
Add events
1 parent 27b0ab3 commit 6311e91

File tree

10 files changed

+104
-15
lines changed

10 files changed

+104
-15
lines changed

packages/checkout/sdk/src/widgets/definitions/events/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ export * from './onramp';
99
export * from './commerce';
1010
export * from './addTokens';
1111
export * from './purchase';
12+
export * from './transfer';
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
export enum TransferEventType {
22
CLOSE_WIDGET = 'close-widget',
3-
CONNECT_SUCCESS = 'connect-success',
3+
REJECTED = 'rejected',
44
SUCCESS = 'success',
55
FAILURE = 'failure',
66
}
77

88
/**
99
* Represents a successful transfer.
1010
*/
11-
export type TransferSuccess = {};
11+
export type TransferSuccess = {
12+
transactionHash: string;
13+
};
1214

1315
/**
1416
* Type representing a transfer failure
@@ -18,3 +20,10 @@ export type TransferFailed = {
1820
reason: string;
1921
timestamp: number;
2022
};
23+
24+
/**
25+
* Type representing a transfer rejected
26+
* @property {string} reason
27+
*/
28+
export type TransferRejected = {
29+
};

packages/checkout/sdk/src/widgets/definitions/events/widgets.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export enum IMTBLWidgetEvents {
1515
IMTBL_COMMERCE_WIDGET_EVENT = 'imtbl-commerce-widget',
1616
IMTBL_ADD_TOKENS_WIDGET_EVENT = 'imtbl-add-tokens-widget',
1717
IMTBL_PURCHASE_WIDGET_EVENT = 'imtbl-purchase-widget',
18-
IMBTL_TRANSFER_WIDGET_EVENT = 'imtbl-transfer-widget',
18+
IMTBL_TRANSFER_WIDGET_EVENT = 'imtbl-transfer-widget',
1919
}
2020

2121
/**

packages/checkout/sdk/src/widgets/definitions/parameters/transfer.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@ export type TransferWidgetParams = {
1212

1313
/** The to address to transfer to */
1414
toAddress?: `0x${string}`;
15+
16+
/** Whether to show the back button */
17+
showBackButton?: boolean;
1518
};

packages/checkout/sdk/src/widgets/definitions/types.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ import {
7575
TransferWidgetConfiguration,
7676
} from './configurations';
7777
import { WrappedBrowserProvider } from '../../types';
78-
import { TransferEventType, TransferFailed, TransferSuccess } from './events/transfer';
78+
import {
79+
TransferEventType, TransferFailed, TransferRejected, TransferSuccess,
80+
} from './events/transfer';
7981

8082
/**
8183
* Enum representing the list of widget types.
@@ -247,6 +249,7 @@ export type WidgetEventData = {
247249
[TransferEventType.CLOSE_WIDGET]: {};
248250
[TransferEventType.SUCCESS]: TransferSuccess;
249251
[TransferEventType.FAILURE]: TransferFailed;
252+
[TransferEventType.REJECTED]: TransferRejected;
250253
} & OrchestrationMapping &
251254
ProviderEventMapping;
252255
};

packages/checkout/widgets-lib/src/widgets/immutable-commerce/CommerceWidget.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ export default function CommerceWidget(props: CommerceWidgetInputs) {
333333
config={widgetsConfig}
334334
{...(view.data.params || {})}
335335
{...(view.data.config || {})}
336+
showBackButton={showBackButton}
336337
/>
337338
)}
338339
</Suspense>

packages/checkout/widgets-lib/src/widgets/transfer/TransferForm.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,24 @@ import { amountInputValidation } from '../../lib/validations/amountInputValidati
2222
import { StrongCheckoutWidgetsConfig } from '../../lib/withDefaultWidgetConfig';
2323
import { TransferFormState, TransferState } from './context';
2424
import { getOptionKey, getFiatAmount, validatePartialAddress } from './functions';
25+
import { sendCloseWidgetEvent } from '../connect/connectWidgetEvents';
2526

2627
export function TransferForm({
2728
config,
2829
viewState,
2930
setViewState,
3031
onSend,
32+
showBackButton,
3133
}: {
3234
config: StrongCheckoutWidgetsConfig;
3335
viewState: TransferFormState;
3436
setViewState: Dispatch<SetStateAction<TransferState>>;
3537
onSend: () => void;
38+
showBackButton: boolean | undefined;
3639
}) {
3740
const { t } = useTranslation();
3841
const { track } = useAnalytics();
39-
const {
40-
eventTargetState: { eventTarget },
41-
} = useContext(EventTargetContext);
42+
const { eventTargetState: { eventTarget } } = useContext(EventTargetContext);
4243
const { cryptoFiatState } = useContext(CryptoFiatContext);
4344

4445
const tokenOptions = useMemo(
@@ -137,12 +138,12 @@ export function TransferForm({
137138
header={(
138139
<HeaderNavigation
139140
title={t('views.TRANSFER.header.title')}
140-
onCloseButtonClick={() => {}}
141-
showBack
141+
onCloseButtonClick={() => sendCloseWidgetEvent(eventTarget)}
142+
showBack={showBackButton}
142143
onBackButtonClick={() => {
143144
orchestrationEvents.sendRequestGoBackEvent(
144145
eventTarget,
145-
IMTBLWidgetEvents.IMBTL_TRANSFER_WIDGET_EVENT,
146+
IMTBLWidgetEvents.IMTBL_TRANSFER_WIDGET_EVENT,
146147
{},
147148
);
148149
}}

packages/checkout/widgets-lib/src/widgets/transfer/TransferWidget.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import { SendingTokens } from './SendingTokens';
2828
import { AwaitingApproval } from './AwaitingApproval';
2929
import { TransferState } from './context';
3030
import { TransferForm } from './TransferForm';
31+
import { sendFailedEvent, sendRejectedEvent, sendSuccessEvent } from './events';
32+
import { EventTargetContext } from '../../context/event-target-context/EventTargetContext';
3133

3234
export type TransferWidgetInputs = TransferWidgetParams & {
3335
config: StrongCheckoutWidgetsConfig;
@@ -38,6 +40,7 @@ const TRANSACTION_CANCELLED_ERROR_CODE = -32003;
3840
function TransferWidgetInner(props: TransferWidgetInputs) {
3941
const { t } = useTranslation();
4042
const { cryptoFiatDispatch } = useContext(CryptoFiatContext);
43+
const { eventTargetState: { eventTarget } } = useContext(EventTargetContext);
4144
const { track } = useAnalytics();
4245

4346
const {
@@ -147,7 +150,13 @@ function TransferWidgetInner(props: TransferWidgetInputs) {
147150
});
148151

149152
const receipt = await txResponse.wait();
150-
if (!receipt) throw new Error('Transaction failed');
153+
if (!receipt) {
154+
sendFailedEvent(eventTarget, 'Transaction failed');
155+
setViewState({ ...viewState, type: 'FORM' }); // TODO: We should be showing a failed view here
156+
return;
157+
}
158+
159+
sendSuccessEvent(eventTarget, receipt.hash);
151160

152161
setViewState({
153162
type: 'COMPLETE',
@@ -182,12 +191,15 @@ function TransferWidgetInner(props: TransferWidgetInputs) {
182191
controlType: 'Event',
183192
extras: { token: viewState.tokenAddress, amount: viewState.amount },
184193
});
194+
sendRejectedEvent(eventTarget, 'Transaction cancelled');
185195
} else {
186196
// eslint-disable-next-line no-console
187197
console.error(e); // TODO: where can we send these?
198+
sendFailedEvent(eventTarget, 'Transaction failed');
199+
setViewState({ ...viewState, type: 'FORM' }); // TODO: We should be showing a failed view here
188200
}
189201
}
190-
}, [viewState]);
202+
}, [viewState, eventTarget]);
191203

192204
switch (viewState.type) {
193205
case 'INITIALISING':
@@ -199,6 +211,7 @@ function TransferWidgetInner(props: TransferWidgetInputs) {
199211
viewState={viewState}
200212
setViewState={setViewState}
201213
onSend={onSend}
214+
showBackButton={props.showBackButton}
202215
/>
203216
);
204217
case 'AWAITING_APPROVAL':
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import {
2+
WidgetEvent,
3+
TransferEventType,
4+
IMTBLWidgetEvents,
5+
WidgetType,
6+
} from '@imtbl/checkout-sdk';
7+
8+
export const sendSuccessEvent = (eventTarget: Window | EventTarget, transactionHash: string) => {
9+
const successEvent = new CustomEvent<WidgetEvent<WidgetType.TRANSFER, TransferEventType.SUCCESS>>(
10+
IMTBLWidgetEvents.IMTBL_TRANSFER_WIDGET_EVENT,
11+
{
12+
detail: {
13+
type: TransferEventType.SUCCESS,
14+
data: {
15+
transactionHash,
16+
},
17+
},
18+
},
19+
);
20+
// eslint-disable-next-line no-console
21+
console.log('transfer success event:', eventTarget, successEvent);
22+
if (eventTarget !== undefined) eventTarget.dispatchEvent(successEvent);
23+
};
24+
25+
export const sendFailedEvent = (eventTarget: Window | EventTarget, reason: string) => {
26+
const failedEvent = new CustomEvent<WidgetEvent<WidgetType.TRANSFER, TransferEventType.FAILURE>>(
27+
IMTBLWidgetEvents.IMTBL_TRANSFER_WIDGET_EVENT,
28+
{
29+
detail: {
30+
type: TransferEventType.FAILURE,
31+
data: {
32+
reason,
33+
timestamp: new Date().getTime(),
34+
},
35+
},
36+
},
37+
);
38+
// eslint-disable-next-line no-console
39+
console.log('transfer failed event:', eventTarget, failedEvent);
40+
if (eventTarget !== undefined) eventTarget.dispatchEvent(failedEvent);
41+
};
42+
43+
export const sendRejectedEvent = (eventTarget: Window | EventTarget, reason: string) => {
44+
const rejectedEvent = new CustomEvent<WidgetEvent<WidgetType.TRANSFER, TransferEventType.REJECTED>>(
45+
IMTBLWidgetEvents.IMTBL_TRANSFER_WIDGET_EVENT,
46+
{
47+
detail: {
48+
type: TransferEventType.REJECTED,
49+
data: {
50+
reason,
51+
timestamp: new Date().getTime(),
52+
},
53+
},
54+
},
55+
);
56+
// eslint-disable-next-line no-console
57+
console.log('transfer rejected event:', eventTarget, rejectedEvent);
58+
if (eventTarget !== undefined) eventTarget.dispatchEvent(rejectedEvent);
59+
};

packages/checkout/widgets-sample-app/src/components/ui/checkout/checkout.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ function CheckoutUI() {
264264
const mount = () => {
265265
unmount();
266266
mounted.current = true;
267+
console.log({params});
267268
widget?.mount("widget-root", params);
268269
};
269270

@@ -276,9 +277,6 @@ function CheckoutUI() {
276277

277278
// create the widget once factory is available
278279
// ignore language or theme changes
279-
const prevWidget = useRef<Widget<typeof WidgetType.IMMUTABLE_COMMERCE> | undefined>(
280-
undefined
281-
);
282280
const widget = useAsyncMemo(async () => {
283281
if (widgetsFactory === undefined) return undefined;
284282
if (renderAfterConnect && !browserProvider) return undefined;
@@ -342,6 +340,7 @@ function CheckoutUI() {
342340
setEventResults((prev) => [...prev, { failure: true, ...data }]);
343341
});
344342
widget.addListener(CommerceEventType.CLOSE, () => {
343+
console.log("CLOSED");
345344
setEventResults((prev) => [...prev, { closed: true }]);
346345
widget.unmount();
347346
});

0 commit comments

Comments
 (0)