Skip to content

Commit c2b984e

Browse files
authored
[WT-1419] Update swap and bridge web components to allow attribute changes (#860)
1 parent d82ac63 commit c2b984e

File tree

8 files changed

+98
-12
lines changed

8 files changed

+98
-12
lines changed

packages/checkout/widgets-lib/src/lib/testUtils.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@ export const cyIntercept = (overrides?: {
167167
...defaultTokensConfig,
168168
...overrides?.tokenConfigOverrides && overrides.tokenConfigOverrides,
169169
});
170+
cy.intercept('https://cdn.segment.com/v1/projects/b69BcXnFXdaiFC6MqRQiHvjcPrTxftZl/settings', {
171+
writeKey: 'segment-mock-write-key',
172+
});
173+
cy.intercept('https://cdn.segment.com/v1/projects//settings', {
174+
writeKey: 'segment-mock-write-key',
175+
});
170176
cy.intercept(
171177
`${checkoutApi}/fiat/coins/all*`,
172178
overrides?.cryptoFiatOverrides?.coins || [

packages/checkout/widgets-lib/src/widgets/ImmutableWebComponent.cy.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import { WalletProviderName } from '@imtbl/checkout-sdk';
66
import { ExternalProvider, Web3Provider } from '@ethersproject/providers';
77
import { ImmutableConnect } from './connect/ConnectWebComponent';
88
import { ImmutableBridge } from './bridge/BridgeWebComponent';
9-
import { cySmartGet } from '../lib/testUtils';
9+
import { cyIntercept, cySmartGet } from '../lib/testUtils';
1010

1111
describe('ImmutableWebComponent', () => {
1212
before(() => {
13+
cyIntercept();
1314
window.customElements.define('imtbl-connect', ImmutableConnect);
1415
});
1516

@@ -35,6 +36,10 @@ describe('BridgeWebComponent with Passport', () => {
3536
window.customElements.define('imtbl-bridge', ImmutableBridge);
3637
});
3738

39+
beforeEach(() => {
40+
cyIntercept();
41+
});
42+
3843
it('should show BridgeComingSoon screen when mounting bridge widget with passport provider', () => {
3944
const reference = createRef<ImmutableBridge>();
4045
const testPassportProvider = {
@@ -56,10 +61,20 @@ describe('BridgeWebComponent with Passport', () => {
5661

5762
it('should show BridgeComingSoon screen when mounting bridge widget with passport walletProvider', () => {
5863
const reference = createRef<ImmutableBridge>();
59-
64+
const testPassportInstance = {
65+
connectEvm: cy.stub().returns({
66+
isPassport: true,
67+
request: cy.stub(),
68+
}),
69+
} as any as Passport;
6070
mount(
61-
<imtbl-bridge ref={reference} walletProvider={WalletProviderName.PASSPORT} />,
62-
);
71+
<imtbl-bridge ref={reference} />,
72+
).then(() => {
73+
(document.getElementsByTagName('imtbl-bridge')[0] as ImmutableBridge)?.addPassportOption(testPassportInstance);
74+
}).then(() => {
75+
reference.current?.setAttribute('walletProvider', WalletProviderName.PASSPORT);
76+
});
77+
6378
cySmartGet('bridge-coming-soon').should('be.visible');
6479
});
6580
});

packages/checkout/widgets-lib/src/widgets/ImmutableWebComponent.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@ export abstract class ImmutableWebComponent extends HTMLElement {
3333
if (name === 'widgetconfig') {
3434
this.widgetConfig = this.parseWidgetConfig(newValue);
3535
this.updateCheckout();
36-
} else {
37-
this[name] = (newValue as string)?.toLowerCase();
3836
}
39-
this.renderWidget();
4037
}
4138

4239
updateCheckout() {

packages/checkout/widgets-lib/src/widgets/bridge/BridgeWebComponent.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ export class ImmutableBridge extends ImmutableWebComponent {
2020

2121
walletProvider: WalletProviderName | undefined = undefined;
2222

23+
static get observedAttributes(): string[] {
24+
const baseObservedAttributes = super.observedAttributes;
25+
return [...baseObservedAttributes, 'amount', 'fromcontractaddress', 'walletprovider'];
26+
}
27+
2328
connectedCallback() {
2429
super.connectedCallback();
2530
this.fromContractAddress = this.getAttribute('fromContractAddress')?.toLowerCase() ?? '';
@@ -31,6 +36,22 @@ export class ImmutableBridge extends ImmutableWebComponent {
3136
this.renderWidget();
3237
}
3338

39+
attributeChangedCallback(name: string, oldValue: any, newValue: any): void {
40+
super.attributeChangedCallback(name, oldValue, newValue);
41+
42+
if (name === 'amount') {
43+
this.amount = newValue;
44+
}
45+
if (name === 'fromcontractaddress') {
46+
this.fromContractAddress = newValue;
47+
}
48+
if (name === 'walletprovider') {
49+
this.walletProvider = newValue.toLowerCase() as WalletProviderName;
50+
}
51+
52+
this.renderWidget();
53+
}
54+
3455
validateInputs(): void {
3556
if (!isValidWalletProvider(this.walletProvider)) {
3657
// eslint-disable-next-line no-console

packages/checkout/widgets-lib/src/widgets/connect/ConnectWebComponent.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ export class ImmutableConnect extends ImmutableWebComponent {
1010
this.renderWidget();
1111
}
1212

13+
attributeChangedCallback(name: string, oldValue: any, newValue: any): void {
14+
super.attributeChangedCallback(name, oldValue, newValue);
15+
16+
this.renderWidget();
17+
}
18+
1319
validateInputs(): void {
1420
// not implemented as nothing to validate for ConnectWidget
1521
}

packages/checkout/widgets-lib/src/widgets/on-ramp/OnRampWebComponent.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ import { ConnectTargetLayer, getL1ChainId, getL2ChainId } from '../../lib';
1010
import { CustomAnalyticsProvider } from '../../context/analytics-provider/CustomAnalyticsProvider';
1111

1212
export class ImmutableOnRamp extends ImmutableWebComponent {
13-
static get observedAttributes(): string[] {
14-
const baseObservedAttributes = super.observedAttributes;
15-
return [...baseObservedAttributes, 'amount', 'contractaddress'];
16-
}
17-
1813
amount = '';
1914

2015
walletProvider?: WalletProviderName;
2116

2217
contractAddress = '';
2318

19+
static get observedAttributes(): string[] {
20+
const baseObservedAttributes = super.observedAttributes;
21+
return [...baseObservedAttributes, 'amount', 'contractaddress', 'walletprovider'];
22+
}
23+
2424
connectedCallback() {
2525
super.connectedCallback();
2626
this.amount = this.getAttribute('amount') ?? '';
@@ -38,6 +38,9 @@ export class ImmutableOnRamp extends ImmutableWebComponent {
3838
if (name === 'contractaddress') {
3939
this.contractAddress = newValue;
4040
}
41+
if (name === 'walletprovider') {
42+
this.walletProvider = newValue.toLowerCase() as WalletProviderName;
43+
}
4144

4245
this.renderWidget();
4346
}

packages/checkout/widgets-lib/src/widgets/swap/SwapWebComponent.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ export class ImmutableSwap extends ImmutableWebComponent {
2121

2222
toContractAddress = '';
2323

24+
static get observedAttributes(): string[] {
25+
const baseObservedAttributes = super.observedAttributes;
26+
return [...baseObservedAttributes, 'amount', 'fromcontractaddress', 'tocontractaddress', 'walletprovider'];
27+
}
28+
2429
connectedCallback() {
2530
super.connectedCallback();
2631
this.walletProvider = this.getAttribute(
@@ -32,6 +37,24 @@ export class ImmutableSwap extends ImmutableWebComponent {
3237
this.renderWidget();
3338
}
3439

40+
attributeChangedCallback(name: string, oldValue: any, newValue: any): void {
41+
super.attributeChangedCallback(name, oldValue, newValue);
42+
if (name === 'amount') {
43+
this.amount = newValue;
44+
}
45+
if (name === 'fromcontractaddress') {
46+
this.fromContractAddress = newValue;
47+
}
48+
if (name === 'tocontractaddress') {
49+
this.toContractAddress = newValue;
50+
}
51+
if (name === 'walletprovider') {
52+
this.walletProvider = newValue.toLowerCase() as WalletProviderName;
53+
}
54+
55+
this.renderWidget();
56+
}
57+
3558
validateInputs(): void {
3659
if (!isValidWalletProvider(this.walletProvider)) {
3760
// eslint-disable-next-line no-console

packages/checkout/widgets-lib/src/widgets/wallet/WalletWebComponent.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,27 @@ import { CustomAnalyticsProvider } from '../../context/analytics-provider/Custom
1515
export class ImmutableWallet extends ImmutableWebComponent {
1616
walletProvider: WalletProviderName | undefined = undefined;
1717

18+
static get observedAttributes(): string[] {
19+
const baseObservedAttributes = super.observedAttributes;
20+
return [...baseObservedAttributes, 'walletprovider'];
21+
}
22+
1823
connectedCallback() {
1924
super.connectedCallback();
2025
this.walletProvider = this.getAttribute('walletProvider')?.toLowerCase() as WalletProviderName;
2126
this.renderWidget();
2227
}
2328

29+
attributeChangedCallback(name: string, oldValue: any, newValue: any): void {
30+
super.attributeChangedCallback(name, oldValue, newValue);
31+
32+
if (name === 'walletprovider') {
33+
this.walletProvider = newValue.toLowerCase() as WalletProviderName;
34+
}
35+
36+
this.renderWidget();
37+
}
38+
2439
validateInputs(): void {
2540
if (!isValidWalletProvider(this.walletProvider)) {
2641
// eslint-disable-next-line no-console

0 commit comments

Comments
 (0)