g1t/apps/web/app/routes/settings/emails.tsx

38 lines1,537 bytesCodeBlame
1import type { Route } from "./+types/emails";
2import { page } from "../../lib/meta";
3import { assertSameOrigin, requireUser } from "../../lib/session.server";
4import { EmailsSection } from "../../components/emails-section";
5import { EMAIL_INTENTS, emailAction, loadEmails } from "../../lib/emails.server";
6import { githubSignIn } from "../../lib/github.server";
7
8export function meta(args: Route.MetaArgs) {
9 return page(args, { title: "Emails · Settings · g1t" });
10}
11
12export async function loader({ request, context }: Route.LoaderArgs) {
13 const user = requireUser(context, request);
14 const [emails, github] = await Promise.all([loadEmails(user), githubSignIn.account(user).catch(() => null)]);
15 // Whether a sensitive change can be confirmed with a password.
16 return { emails: emails.emails, hasPassword: github?.hasPassword ?? true };
17}
18
19export async function action({ request, context }: Route.ActionArgs) {
20 assertSameOrigin(request);
21 const user = requireUser(context, request);
22 const form = await request.formData();
23 // Sensitive changes may first ask for the password (lib/emails.server.ts).
24 if ((EMAIL_INTENTS as readonly string[]).includes(String(form.get("intent")))) {
25 return { emailAction: await emailAction(user, form, request) };
26 }
27 return null;
28}
29
30export default function EmailSettings({ loaderData, actionData }: Route.ComponentProps) {
31 return (
32 <EmailsSection
33 data={loaderData.emails}
34 actionData={actionData?.emailAction}
35 hasPassword={loaderData.hasPassword}
36 />
37 );
38}