123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- import { Transition } from '@headlessui/react';
- import { Form, Head, Link, usePage } from '@inertiajs/react';
- import ProfileController from '@/actions/App/Http/Controllers/Settings/ProfileController';
- import { DeleteUser } from '@/common/DeleteUser';
- import { HeadingSmall } from '@/common/HeadingSmall';
- import { InputError } from '@/common/InputError';
- import { type BreadcrumbItem, type SharedData } from '@/common/types';
- import AppLayout from '@/pages/layouts/AppLayout';
- import SettingsLayout from '@/pages/layouts/settings/layout';
- import { edit } from '@/routes/profile';
- import { send } from '@/routes/verification';
- import { Button } from '@/shadcn/button';
- import { Input } from '@/shadcn/input';
- import { Label } from '@/shadcn/label';
- const breadcrumbs: BreadcrumbItem[] = [
- {
- title: 'Profile settings',
- href: edit().url,
- },
- ];
- export default function ProfilePage({ mustVerifyEmail, status }: { mustVerifyEmail: boolean; status?: string }) {
- const { auth } = usePage<SharedData>().props;
- return (
- <AppLayout breadcrumbs={breadcrumbs}>
- <Head title="Profile settings" />
- <SettingsLayout>
- <div className="space-y-6">
- <HeadingSmall title="Profile information" description="Update your name and email address" />
- <Form
- {...ProfileController.update.form()}
- options={{
- preserveScroll: true,
- }}
- className="space-y-6"
- >
- {({ processing, recentlySuccessful, errors }) => (
- <>
- <div className="grid gap-2">
- <Label htmlFor="name">Name</Label>
- <Input
- id="name"
- className="mt-1 block w-full"
- defaultValue={auth.user.name}
- name="name"
- required
- autoComplete="name"
- placeholder="Full name"
- />
- <InputError className="mt-2" message={errors.name} />
- </div>
- <div className="grid gap-2">
- <Label htmlFor="email">Email address</Label>
- <Input
- id="email"
- type="email"
- className="mt-1 block w-full"
- defaultValue={auth.user.email}
- name="email"
- required
- autoComplete="username"
- placeholder="Email address"
- />
- <InputError className="mt-2" message={errors.email} />
- </div>
- {mustVerifyEmail && auth.user.email_verified_at === null && (
- <div>
- <p className="-mt-4 text-sm text-muted-foreground">
- Your email address is unverified.{' '}
- <Link
- href={send()}
- as="button"
- className="text-foreground underline decoration-neutral-300 underline-offset-4 transition-colors duration-300 ease-out hover:decoration-current! dark:decoration-neutral-500"
- >
- Click here to resend the verification email.
- </Link>
- </p>
- {status === 'verification-link-sent' && (
- <div className="mt-2 text-sm font-medium text-green-600">
- A new verification link has been sent to your email address.
- </div>
- )}
- </div>
- )}
- <div className="flex items-center gap-4">
- <Button disabled={processing}>Save</Button>
- <Transition
- show={recentlySuccessful}
- enter="transition ease-in-out"
- enterFrom="opacity-0"
- leave="transition ease-in-out"
- leaveTo="opacity-0"
- >
- <p className="text-sm text-neutral-600">Saved</p>
- </Transition>
- </div>
- </>
- )}
- </Form>
- </div>
- <DeleteUser />
- </SettingsLayout>
- </AppLayout>
- );
- }
|