53 lines
1.2 KiB
TypeScript
53 lines
1.2 KiB
TypeScript
|
|
import { useNavigate } from "react-router-dom";
|
||
|
|
|
||
|
|
import { payCart } from "@api/cart";
|
||
|
|
|
||
|
|
const MINUTE = 1000 * 60;
|
||
|
|
|
||
|
|
export const useAfterpay = () => {
|
||
|
|
const navigate = useNavigate();
|
||
|
|
|
||
|
|
const checkPayment = () => {
|
||
|
|
const redirectUrl = new URL(window.location.href);
|
||
|
|
redirectUrl.searchParams.set("afterpay", "false");
|
||
|
|
navigate(redirectUrl);
|
||
|
|
|
||
|
|
const payCartPendingRequestDeadline = localStorage.getItem(
|
||
|
|
"payCartPendingRequestDeadline",
|
||
|
|
);
|
||
|
|
const deadline = payCartPendingRequestDeadline
|
||
|
|
? Number(payCartPendingRequestDeadline)
|
||
|
|
: Date.now() + 20 * MINUTE;
|
||
|
|
|
||
|
|
localStorage.setItem("payCartPendingRequestDeadline", deadline.toString());
|
||
|
|
|
||
|
|
let tryCount = 0;
|
||
|
|
tryPayCart();
|
||
|
|
|
||
|
|
async function tryPayCart() {
|
||
|
|
tryCount += 1;
|
||
|
|
|
||
|
|
const [, payCartError] = await payCart();
|
||
|
|
|
||
|
|
if (!payCartError || Date.now() > deadline) {
|
||
|
|
localStorage.removeItem("payCartPendingRequestDeadline");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
setTimeout(tryPayCart, tryCount > 5 ? MINUTE / 2 : MINUTE / 6);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
const checkParams = () => {
|
||
|
|
const afterpay = new URLSearchParams(window.location.search).get(
|
||
|
|
"afterpay",
|
||
|
|
);
|
||
|
|
|
||
|
|
if (afterpay) {
|
||
|
|
checkPayment();
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
setInterval(checkParams, 5000);
|
||
|
|
};
|