@daimo/pay
Version:
Seamless crypto payments. Onboard users from any chain, any coin into your app with one click.
175 lines (170 loc) • 5.95 kB
JavaScript
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
import { useState, useEffect } from 'react';
import { useDaimoPay } from '../../../hooks/useDaimoPay.js';
import { usePayContext } from '../../../hooks/usePayContext.js';
import { PageContent, ModalContent, ModalH1, ModalBody } from '../../Common/Modal/styles.js';
import { ExternalPaymentOptions, shouldShowExternalQRCodeOnDesktop } from '@daimo/pay-common';
import { ExternalLinkIcon } from '../../../assets/icons.js';
import useIsMobile from '../../../hooks/useIsMobile.js';
import useLocales from '../../../hooks/useLocales.js';
import styled from '../../../styles/styled/index.js';
import Button from '../../Common/Button/index.js';
import ConnectWithQRCode from '../../DaimoPayModal/ConnectWithQRCode.js';
import ExternalPaymentSpinner from '../../Spinners/ExternalPaymentSpinner/index.js';
const WaitingExternal = () => {
const context = usePayContext();
const { triggerResize, paymentState } = context;
const { isMobile } = useIsMobile();
const locales = useLocales();
const { selectedExternalOption, payWithExternal, paymentWaitingMessage } = paymentState;
useDaimoPay();
let isCoinbase = false;
let isBinance = false;
if (selectedExternalOption) {
isCoinbase = selectedExternalOption.id === ExternalPaymentOptions.Coinbase;
isBinance = selectedExternalOption.id === ExternalPaymentOptions.Binance;
}
const [externalURL, setExternalURL] = useState(null);
const [isRegenerating, setIsRegenerating] = useState(false);
useEffect(() => {
if (!selectedExternalOption) return;
payWithExternal(selectedExternalOption.id).then((url) => {
setExternalURL(url);
if (!shouldShowExternalQRCodeOnDesktop(selectedExternalOption.id)) {
openExternalWindow(url);
}
});
}, [selectedExternalOption]);
const openExternalWindow = (url) => {
if (!isCoinbase || isMobile) {
window.open(url, "_blank");
} else {
let width = 500;
let height = 700;
const left = Math.max(
0,
Math.floor((window.innerWidth - width) / 2) + window.screenX
);
const top = Math.max(
0,
Math.floor((window.innerHeight - height) / 2) + window.screenY
);
window.open(
url,
"popupWindow",
`width=${width},height=${height},left=${left},top=${top},scrollbars=yes`
);
}
};
const regenerateOrder = async () => {
if (!selectedExternalOption) return;
setIsRegenerating(true);
setExternalURL(null);
try {
payWithExternal(selectedExternalOption.id).then((url) => {
setExternalURL(url);
setIsRegenerating(false);
});
} catch (error) {
console.error("failed to regenerate order:", error);
}
};
const waitingMessageLength = paymentWaitingMessage?.length;
useEffect(() => {
triggerResize();
}, [waitingMessageLength, externalURL]);
if (!selectedExternalOption) {
return /* @__PURE__ */ jsx(PageContent, {});
}
return shouldShowExternalQRCodeOnDesktop(selectedExternalOption.id) && !isMobile ? /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx(ConnectWithQRCode, { externalUrl: externalURL ?? "" }),
isBinance && paymentWaitingMessage && !isRegenerating && /* @__PURE__ */ jsx(RegenerateContainer, { children: /* @__PURE__ */ jsx(
RegenerateLink,
{
as: "button",
onClick: regenerateOrder,
disabled: isRegenerating,
children: /* @__PURE__ */ jsxs("span", { children: [
locales.notWorking,
" ",
/* @__PURE__ */ jsx(Underline, { children: locales.regenerateOrder })
] })
}
) })
] }) : /* @__PURE__ */ jsxs(PageContent, { children: [
/* @__PURE__ */ jsx(
ExternalPaymentSpinner,
{
logoURI: selectedExternalOption.logoURI,
logoShape: selectedExternalOption.logoShape
}
),
/* @__PURE__ */ jsxs(ModalContent, { style: { marginLeft: 24, marginRight: 24 }, children: [
/* @__PURE__ */ jsx(ModalH1, { children: locales.waitingForPayment }),
paymentWaitingMessage && /* @__PURE__ */ jsx(ModalBody, { style: { marginTop: 12, marginBottom: 12 }, children: paymentWaitingMessage })
] }),
/* @__PURE__ */ jsx(
Button,
{
icon: /* @__PURE__ */ jsx(ExternalLinkIcon, {}),
onClick: () => {
if (externalURL) {
openExternalWindow(externalURL);
}
},
children: selectedExternalOption.cta
}
),
isBinance && paymentWaitingMessage && /* @__PURE__ */ jsx(RegenerateContainer, { children: /* @__PURE__ */ jsx(
RegenerateLink,
{
as: "button",
onClick: regenerateOrder,
disabled: isRegenerating,
children: /* @__PURE__ */ jsx("span", { children: isRegenerating ? /* @__PURE__ */ jsx(Fragment, { children: locales.generatingNewOrder }) : /* @__PURE__ */ jsxs(Fragment, { children: [
locales.notWorking,
" ",
/* @__PURE__ */ jsx(Underline, { children: locales.regenerateOrder })
] }) })
}
) })
] });
};
const RegenerateContainer = styled.div`
text-align: center;
margin-top: 16px;
margin-bottom: -4px;
`;
const RegenerateLink = styled.a`
appearance: none;
user-select: none;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 10px;
height: 42px;
padding: 0 16px;
border-radius: 6px;
border: none;
background: none;
color: var(--ck-body-color-muted);
text-decoration-color: var(--ck-body-color-muted);
font-size: 15px;
line-height: 18px;
font-weight: 400;
cursor: pointer;
&:disabled {
opacity: 0.6;
cursor: not-allowed;
}
span {
opacity: 1;
transition: opacity 300ms ease;
}
`;
const Underline = styled.span`
text-underline-offset: 2px;
text-decoration: underline;
`;
export { WaitingExternal as default };
//# sourceMappingURL=index.js.map