|
1 | 1 | (() => { |
2 | | - const handleClick = (evt, element, capWidget, handlers) => { |
3 | | - const trigger = () => { |
4 | | - handlers.forEach((h) => { |
5 | | - element.addEventListener("click", h); |
6 | | - h.call(element, evt); |
7 | | - }); |
8 | | - |
9 | | - setTimeout(() => { |
10 | | - element.onclick = null; |
11 | | - handlers.forEach((h) => { |
12 | | - return element.removeEventListener("click", h); |
13 | | - }); |
14 | | - element.onclick = (e) => handleClick(e, element, capWidget, handlers); |
15 | | - }, 50); |
16 | | - }; |
17 | | - |
18 | | - element.onclick = null; |
19 | | - |
| 2 | + const showWidget = (element, capWidget) => { |
20 | 3 | const offset = parseInt(element.getAttribute("data-cap-floating-offset")) || 8; |
21 | 4 | const position = element.getAttribute("data-cap-floating-position") || "top"; |
22 | 5 |
|
|
43 | 26 | const triggerRect = element.getBoundingClientRect(); |
44 | 27 | const containerRect = (capWidget.offsetParent ?? document.documentElement).getBoundingClientRect(); |
45 | 28 |
|
46 | | - // Horizontally center the popup under the trigger button. |
47 | 29 | const centeredLeft = triggerRect.left + (triggerRect.width - capWidget.offsetWidth) / 2; |
48 | 30 | const clampedLeft = Math.max(2, Math.min(centeredLeft, window.innerWidth - capWidget.offsetWidth)); |
49 | 31 | capWidget.style.left = `${clampedLeft - containerRect.left}px`; |
50 | 32 |
|
51 | | - // Place the popup above or below the trigger, clamped to the visible area. |
52 | 33 | if (position === "top") { |
53 | 34 | const idealTop = triggerRect.top - capWidget.offsetHeight - offset; |
54 | 35 | const clampedTop = Math.max(0, idealTop); |
|
60 | 41 | } |
61 | 42 |
|
62 | 43 | capWidget.solve(); |
| 44 | + }; |
63 | 45 |
|
64 | | - capWidget.addEventListener("solve", ({ detail }) => { |
65 | | - element.setAttribute("data-cap-token", detail.token); |
66 | | - element.setAttribute("data-cap-progress", "done"); |
67 | | - setTimeout(() => { |
68 | | - trigger(); |
69 | | - }, 500); |
70 | | - |
71 | | - setTimeout(() => { |
72 | | - capWidget.style.transform = "scale(0.98)"; |
73 | | - capWidget.style.opacity = "0"; |
74 | | - capWidget.style.marginTop = "-4px"; |
75 | | - }, 500); |
76 | | - |
77 | | - setTimeout(() => { |
78 | | - capWidget.style.display = "none"; |
79 | | - }, 700); |
80 | | - }); |
| 46 | + const hideWidget = (capWidget) => { |
| 47 | + setTimeout(() => { |
| 48 | + capWidget.style.transform = "scale(0.98)"; |
| 49 | + capWidget.style.opacity = "0"; |
| 50 | + capWidget.style.marginTop = "-4px"; |
| 51 | + }, 500); |
| 52 | + |
| 53 | + setTimeout(() => { |
| 54 | + capWidget.style.display = "none"; |
| 55 | + }, 700); |
81 | 56 | }; |
82 | 57 |
|
83 | 58 | const setupElement = (element) => { |
|
90 | 65 | } |
91 | 66 |
|
92 | 67 | capWidget.style.display = "none"; |
93 | | - const handlers = [element.onclick].filter(Boolean); |
94 | | - |
95 | | - if (typeof getEventListeners === "function") { |
96 | | - handlers.push(...(getEventListeners(element).click || []).map((l) => l.listener)); |
97 | | - } |
98 | | - |
99 | | - if (handlers.length) { |
100 | | - element.onclick = null; |
101 | | - handlers.forEach((h) => { |
102 | | - return element.removeEventListener("click", h); |
103 | | - }); |
104 | | - } |
105 | | - |
106 | | - element.addEventListener("click", (e) => { |
107 | | - e.stopImmediatePropagation(); |
108 | | - e.preventDefault(); |
109 | | - handleClick(e, element, capWidget, handlers); |
110 | | - }); |
| 68 | + let bypass = false; |
| 69 | + |
| 70 | + element.addEventListener( |
| 71 | + "click", |
| 72 | + (e) => { |
| 73 | + if (bypass) { |
| 74 | + bypass = false; |
| 75 | + return; |
| 76 | + } |
| 77 | + |
| 78 | + e.stopImmediatePropagation(); |
| 79 | + e.preventDefault(); |
| 80 | + |
| 81 | + showWidget(element, capWidget); |
| 82 | + |
| 83 | + const onSolve = ({ detail }) => { |
| 84 | + capWidget.removeEventListener("solve", onSolve); |
| 85 | + element.setAttribute("data-cap-token", detail.token); |
| 86 | + element.setAttribute("data-cap-progress", "done"); |
| 87 | + |
| 88 | + setTimeout(() => { |
| 89 | + bypass = true; |
| 90 | + element.click(); |
| 91 | + }, 500); |
| 92 | + |
| 93 | + hideWidget(capWidget); |
| 94 | + }; |
| 95 | + |
| 96 | + capWidget.addEventListener("solve", onSolve); |
| 97 | + }, |
| 98 | + true, |
| 99 | + ); |
111 | 100 | }; |
112 | 101 |
|
113 | 102 | const init = (root) => { |
|
0 commit comments