aboutsummaryrefslogtreecommitdiff
path: root/jb-ui
diff options
context:
space:
mode:
Diffstat (limited to 'jb-ui')
-rw-r--r--jb-ui/src/JBApp.tsx11
-rw-r--r--jb-ui/src/pages/CashoutConfirmation.tsx41
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;