Files
Zero/apps/mail/app/(routes)/settings/security/page.tsx
Adam 277f476575 cleanup on isle zero (#1699)
Ran oxc (https://oxc.rs/docs/guide/usage/linter.html#vscode-extension) and fixed all the issues that came up, set it up to run as a PR check and added steps to the README.md asking users to use it.

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **New Features**
  * Introduced JavaScript linting using oxlint in development guidelines and CI workflow for improved code quality.
  * Added oxlint configuration and dependencies to the project.

* **Bug Fixes**
  * Improved error logging in various components and utilities for better debugging.
  * Enhanced React list rendering by updating keys to use unique values instead of array indices, reducing rendering issues.
  * Replaced browser alerts with toast notifications for a smoother user experience.

* **Refactor**
  * Simplified component logic and state management by removing unused code, imports, props, and components across multiple files.
  * Updated function and component signatures for clarity and maintainability.
  * Improved efficiency of certain operations by switching from arrays to sets for membership checks.

* **Chores**
  * Cleaned up and reorganized import statements throughout the codebase.
  * Removed deprecated files, components, and middleware to streamline the codebase.

* **Documentation**
  * Updated contribution guidelines to include linting requirements for code submissions.

* **Style**
  * Minor formatting and readability improvements in JSX and code structure.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-07-10 10:59:40 -07:00

107 lines
3.7 KiB
TypeScript

import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
FormLabel,
} from '@/components/ui/form';
import { SettingsCard } from '@/components/settings/settings-card';
import { zodResolver } from '@hookform/resolvers/zod';
import { Switch } from '@/components/ui/switch';
import { Button } from '@/components/ui/button';
import { m } from '@/paraglide/messages';
import { useForm } from 'react-hook-form';
import { useState } from 'react';
import * as z from 'zod';
const formSchema = z.object({
twoFactorAuth: z.boolean(),
loginNotifications: z.boolean(),
});
export default function SecurityPage() {
const [isSaving, setIsSaving] = useState(false);
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
twoFactorAuth: false,
loginNotifications: true,
},
});
function onSubmit(values: z.infer<typeof formSchema>) {
setIsSaving(true);
// TODO: Save settings in user's account
setTimeout(() => {
console.log(values);
setIsSaving(false);
}, 1000);
}
return (
<div className="grid gap-6">
<SettingsCard
title={m['pages.settings.security.title']()}
description={m['pages.settings.security.description']()}
footer={
<div className="flex gap-4">
<Button variant="destructive">{m['pages.settings.security.deleteAccount']()}</Button>
<Button type="submit" form="security-form" disabled={isSaving}>
{isSaving ? m['common.actions.saving']() : m['common.actions.saveChanges']()}
</Button>
</div>
}
>
<Form {...form}>
<form id="security-form" onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
<div className="flex w-full flex-col items-center gap-5 md:flex-row">
<FormField
control={form.control}
name="twoFactorAuth"
render={({ field }) => (
<FormItem className="bg-popover flex w-full flex-row items-center justify-between rounded-lg border p-4 md:w-auto">
<div className="space-y-0.5">
<FormLabel className="text-base">
{m['pages.settings.security.twoFactorAuth']()}
</FormLabel>
<FormDescription>
{m['pages.settings.security.twoFactorAuthDescription']()}
</FormDescription>
</div>
<FormControl className="ml-4">
<Switch checked={field.value} onCheckedChange={field.onChange} />
</FormControl>
</FormItem>
)}
/>
<FormField
control={form.control}
name="loginNotifications"
render={({ field }) => (
<FormItem className="bg-popover flex w-full flex-row items-center justify-between rounded-lg border p-4 md:w-auto">
<div className="space-y-0.5">
<FormLabel className="text-base">
{m['pages.settings.security.loginNotifications']()}
</FormLabel>
<FormDescription>
{m['pages.settings.security.loginNotificationsDescription']()}
</FormDescription>
</div>
<FormControl className="ml-4">
<Switch checked={field.value} onCheckedChange={field.onChange} />
</FormControl>
</FormItem>
)}
/>
</div>
</form>
</Form>
</SettingsCard>
</div>
);
}