diff options
Diffstat (limited to 'jb-ui/src')
| -rw-r--r-- | jb-ui/src/JBApp.tsx | 11 | ||||
| -rw-r--r-- | jb-ui/src/pages/CashoutConfirmation.tsx | 41 |
2 files changed, 49 insertions, 3 deletions
diff --git a/jb-ui/src/JBApp.tsx b/jb-ui/src/JBApp.tsx index 083e52d..67b8dfc 100644 --- a/jb-ui/src/JBApp.tsx +++ b/jb-ui/src/JBApp.tsx @@ -32,6 +32,7 @@ import { addCashoutMethods } from "@/models/cashoutMethodsSlice"; import { addEvent } from "@/models/grlEventsSlice"; import { addStatsData } from "@/models/grlStatsSlice"; +import CashoutConfirmation from "@/pages/CashoutConfirmation"; import MagicLink from "@/pages/MagicLink"; import MagicAMTLink from "@/pages/MagicAMTLink"; import Result from "@/pages/Result"; @@ -110,7 +111,7 @@ function QueryParamProcessor() { const response = res.data as UserLedgerWallets; if (response.displayed_balances) { - setUserDisplayedWalletBalance(response.displayed_balances[0]); + dispatch(setUserDisplayedWalletBalance(response.displayed_balances[0])); } const userWallet = response.wallets?.find( @@ -118,7 +119,7 @@ function QueryParamProcessor() { w.account_type === UserLedgerWalletAccountTypeEnum.UserWallet, ); if (userWallet) { - setUserWallet(userWallet); + dispatch(setUserWallet(userWallet)); } const userAttemptCreditWallet = response.wallets?.find( @@ -127,7 +128,7 @@ function QueryParamProcessor() { UserLedgerWalletAccountTypeEnum.UserAttemptCredit, ); if (userAttemptCreditWallet) { - setUserAttemptCreditWallet(userAttemptCreditWallet); + dispatch(setUserAttemptCreditWallet(userAttemptCreditWallet)); } }); } @@ -276,6 +277,10 @@ function JBApp() { <Route path="/" element={<Work />} /> <Route path="/auth/magic-link/" element={<MagicLink />} /> <Route path="/auth/link-amt/" element={<MagicAMTLink />} /> + <Route + path="/wallet/cashout/confirm/" + element={<CashoutConfirmation />} + /> <Route path="/preview/" element={<Transfer />} /> <Route path="/work/" element={<Transfer />} /> diff --git a/jb-ui/src/pages/CashoutConfirmation.tsx b/jb-ui/src/pages/CashoutConfirmation.tsx new file mode 100644 index 0000000..6964672 --- /dev/null +++ b/jb-ui/src/pages/CashoutConfirmation.tsx @@ -0,0 +1,41 @@ +import { useEffect, useRef, useState } from "react"; + +type ConfirmationState = "working" | "confirmed" | "failed" | "missing"; + +const CashoutConfirmation = function () { + const started = useRef(false); + const [state, setState] = useState<ConfirmationState>("working"); + + useEffect(() => { + if (started.current) return; + started.current = true; + + const params = new URLSearchParams(window.location.search); + const token = params.get("token"); + if (!token) { + setState("missing"); + return; + } + + window.history.replaceState({}, "", window.location.pathname); + + void fetch("/wallet/cashout/confirm/", { + method: "POST", + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ token }), + }) + .then((response) => { + if (!response.ok) throw new Error("Cashout confirmation failed"); + setState("confirmed"); + }) + .catch(() => setState("failed")); + }, []); + + if (state === "missing") return <p>This cashout link is missing its token.</p>; + if (state === "failed") return <p>This cashout link is invalid or has expired.</p>; + if (state === "confirmed") return <p>Your cashout has been confirmed.</p>; + return <p>Confirming your cashout…</p>; +}; + +export default CashoutConfirmation; |
