Skip to content

Commit c8f2817

Browse files
authored
fix(WidgetPreview): prevent controller already set crash on edit (#701)
1 parent 6247fab commit c8f2817

1 file changed

Lines changed: 33 additions & 37 deletions

File tree

frontend/app/components/widget/WidgetPreview.tsx

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,46 @@ export const WidgetPreview = ({
1818
const widgetRef = useRef<WidgetComponent>(null)
1919

2020
useEffect(() => {
21-
const loadWidgetElement = async () => {
22-
if (!customElements.get('wm-payment-widget')) {
21+
const name = 'wm-payment-widget'
22+
const load = async () => {
23+
if (!customElements.get(name)) {
2324
// dynamic import - ensure component only runs on the client side and not on SSR
2425
const { PaymentWidget } = await import('@tools/components/widget/index')
25-
if (!customElements.get('wm-payment-widget')) {
26-
customElements.define('wm-payment-widget', PaymentWidget)
26+
if (!customElements.get(name)) {
27+
customElements.define(name, PaymentWidget)
2728
}
2829
}
30+
31+
const el = document.querySelector(name)!
32+
el.setController({
33+
isPreviewMode: true,
34+
getWallet: NO_OP_CONTROLLER.getWallet,
35+
async fetchQuote(request) {
36+
await sleep(500)
37+
return NO_OP_CONTROLLER.fetchQuote(request)
38+
},
39+
async initiatePayment(request) {
40+
await sleep(500)
41+
return NO_OP_CONTROLLER.initiatePayment(request)
42+
},
43+
async *getStatus() {
44+
const outgoingPaymentId = 'https://example.com/outgoing-payments/id'
45+
yield { type: 'PENDING_GRANT_INTERACTION' }
46+
await sleep(2000)
47+
yield { type: 'OUTGOING_PAYMENT_CREATED', outgoingPaymentId }
48+
await sleep(2000)
49+
yield {
50+
type: 'OUTGOING_PAYMENT_DONE',
51+
result: 'success',
52+
outgoingPaymentId,
53+
}
54+
},
55+
})
56+
2957
setIsLoaded(true)
3058
}
3159

32-
loadWidgetElement()
60+
load()
3361
}, [])
3462

3563
const widgetConfig = useMemo(() => {
@@ -41,34 +69,6 @@ export const WidgetPreview = ({
4169
}
4270
}, [profile, serviceUrls, opWallet])
4371

44-
useEffect(() => {
45-
if (!isLoaded) return
46-
widgetRef.current?.setController({
47-
isPreviewMode: true,
48-
getWallet: NO_OP_CONTROLLER.getWallet,
49-
async fetchQuote(request) {
50-
await sleep(500)
51-
return NO_OP_CONTROLLER.fetchQuote(request)
52-
},
53-
async initiatePayment(request) {
54-
await sleep(500)
55-
return NO_OP_CONTROLLER.initiatePayment(request)
56-
},
57-
async *getStatus() {
58-
const outgoingPaymentId = 'https://example.com/outgoing-payments/id'
59-
yield { type: 'PENDING_GRANT_INTERACTION' }
60-
await sleep(2000)
61-
yield { type: 'OUTGOING_PAYMENT_CREATED', outgoingPaymentId }
62-
await sleep(2000)
63-
yield {
64-
type: 'OUTGOING_PAYMENT_DONE',
65-
result: 'success',
66-
outgoingPaymentId,
67-
}
68-
},
69-
})
70-
}, [widgetRef.current, isLoaded])
71-
7272
useEffect(() => {
7373
if (widgetRef.current && isLoaded) {
7474
const widget = widgetRef.current
@@ -77,10 +77,6 @@ export const WidgetPreview = ({
7777
}
7878
}, [widgetConfig, isLoaded])
7979

80-
if (!isLoaded) {
81-
return <div>Loading widget...</div>
82-
}
83-
8480
return (
8581
<div
8682
style={{

0 commit comments

Comments
 (0)