113 lines
3.5 KiB
JavaScript
113 lines
3.5 KiB
JavaScript
import PocketBase, { getTokenPayload } from "pocketbase";
|
|
|
|
export function pageConfirmVerification(route) {
|
|
const token = route.params?.token || "";
|
|
const tokenPayload = getTokenPayload(token);
|
|
|
|
if (!tokenPayload.email || !tokenPayload.collectionId) {
|
|
app.toasts.error("Invalid or expired verification token.");
|
|
window.location.hash = "#/";
|
|
return;
|
|
}
|
|
|
|
app.store.title = "Confirm verification";
|
|
|
|
const data = store({
|
|
isConfirming: false,
|
|
isConfirmSuccess: false,
|
|
// ---
|
|
isResending: false,
|
|
isResendSuccess: false,
|
|
});
|
|
|
|
confirm();
|
|
|
|
async function confirm() {
|
|
if (data.isConfirming) {
|
|
return;
|
|
}
|
|
|
|
data.isConfirming = true;
|
|
|
|
// init a custom client to avoid interfering with the superuser state
|
|
const client = new PocketBase(app.pb.baseURL);
|
|
|
|
try {
|
|
await client.collection(tokenPayload.collectionId).confirmVerification(token);
|
|
data.isConfirmSuccess = true;
|
|
} catch (err) {
|
|
data.isConfirmSuccess = false;
|
|
}
|
|
|
|
data.isConfirming = false;
|
|
}
|
|
|
|
async function resend() {
|
|
if (data.isResending) {
|
|
return;
|
|
}
|
|
|
|
data.isResending = true;
|
|
|
|
// init a custom client to avoid interfering with the superuser state
|
|
const client = new PocketBase(import.meta.env.PB_BACKEND_URL);
|
|
|
|
try {
|
|
await client.collection(tokenPayload.collectionId).requestVerification(tokenPayload.email);
|
|
data.isResendSuccess = true;
|
|
} catch (err) {
|
|
app.checkApiError(err);
|
|
data.isResendSuccess = false;
|
|
}
|
|
|
|
data.isResending = false;
|
|
}
|
|
|
|
return t.div(
|
|
{
|
|
pbEvent: "pageConfirmVerification",
|
|
className: "wrapper sm m-auto p-b-base",
|
|
},
|
|
t.header(
|
|
{ className: "txt-center m-b-base" },
|
|
t.img({ className: "main-logo", src: () => app.store.mainLogo, ariaHidden: true, alt: "App logo" }),
|
|
t.h5({ className: "m-t-10" }, () => app.store.title),
|
|
),
|
|
() => {
|
|
if (data.isConfirming) {
|
|
return t.div({ className: "block txt-center" }, t.span({ className: "loader" }, "Please wait..."));
|
|
}
|
|
|
|
if (data.isConfirmSuccess) {
|
|
return t.div(
|
|
{ pbEvent: "confirmVerificationSuccessAlert", className: "alert success txt-center" },
|
|
t.p(null, "Successfully verified ", t.strong(null, tokenPayload.email), "."),
|
|
);
|
|
}
|
|
|
|
if (data.isResendSuccess) {
|
|
return t.div(
|
|
{ pbEvent: "confirmVerificationResendAlert", className: "alert success txt-center" },
|
|
t.p(null, "Please check your email for the new verification link."),
|
|
);
|
|
}
|
|
|
|
return [
|
|
t.div(
|
|
{ pbEvent: "confirmVerificationErrorAlert", className: "alert danger txt-center m-b-base" },
|
|
t.p(null, "Invalid or expired verification token."),
|
|
),
|
|
t.button(
|
|
{
|
|
type: "button",
|
|
className: () => `btn transparent lg block ${data.isResending ? "loading" : ""}`,
|
|
disabled: () => data.isResending,
|
|
onclick: () => resend(),
|
|
},
|
|
t.span({ className: "txt" }, "Resend"),
|
|
),
|
|
];
|
|
},
|
|
);
|
|
}
|