import { zodResolver } from '@hookform/resolvers/zod' import { Eye, EyeOff } from 'lucide-react' import { useState } from 'react' import { useForm, useWatch } from 'react-hook-form' import { toast } from 'sonner' import { Button, CardContent, Dialog, DialogContent, DialogFooter, DialogHeader, DialogSection, DialogTitle, Form, FormControl, FormField, Input, } from 'ui' import { Input as InputWithActions } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' import PasswordConditionsHelper from '@/components/interfaces/SignIn/PasswordConditionsHelper' import { IdentityProviderIcon } from '@/components/ui/ProviderIcon' import { useSetPasswordMutation } from '@/data/profile/profile-set-password-mutation' import { getProviderDisplay } from '@/lib/external-identity-providers' import { passwordValidation } from '@/lib/password-validation' const FORM_ID = 'add-password-form' const EMAIL_INPUT_ID = 'add-password-email' const FormSchema = z.object({ password: passwordValidation }) type FormValues = z.infer const defaultValues: FormValues = { password: '' } /** * Offers a user without an email identity (OAuth-only account) a way to create one by setting a * password. * * Auth creates the email identity for the user's current email when the password is * saved. */ export const AddPasswordRow = ({ email }: { email: string }) => { const [isDialogOpen, setIsDialogOpen] = useState(false) const providerDisplay = getProviderDisplay('email') return ( <>

{providerDisplay.displayName}

{email}

Add password setIsDialogOpen(false)} /> ) } const AddPasswordForm = ({ email, onClose }: { email: string; onClose: () => void }) => { const [passwordHidden, setPasswordHidden] = useState(true) const form = useForm({ resolver: zodResolver(FormSchema), defaultValues, mode: 'onChange', }) const password = useWatch({ control: form.control, name: 'password' }) const { mutate: setPassword, isPending } = useSetPasswordMutation({ onSuccess: () => { toast.success('Password added successfully') onClose() }, }) const onSubmit = (values: FormValues) => setPassword({ password: values.password }) return (
( : } aria-label={passwordHidden ? 'Show password' : 'Hide Password'} variant="default" className="w-7" onClick={() => setPasswordHidden((prev) => !prev)} /> } {...field} /> )} />
) }