import { UseFormReturn } from 'react-hook-form' import Panel from 'components/ui/Panel' import { PasswordStrengthBar } from 'components/ui/PasswordStrengthBar' import { passwordStrength } from 'lib/password-strength' import { generateStrongPassword } from 'lib/project' import { FormControl_Shadcn_, FormField_Shadcn_ } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { DATABASE_PASSWORD_REGEX } from './ProjectCreation.constants' import { CreateProjectForm } from './ProjectCreation.schema' import { SpecialSymbolsCallout } from './SpecialSymbolsCallout' interface DatabasePasswordInputProps { form: UseFormReturn } const updatePasswordStrength = async (form: UseFormReturn, value: string) => { try { const { warning, message, strength } = await passwordStrength(value) form.setValue('dbPassStrength', strength, { shouldValidate: false, shouldDirty: false }) form.setValue('dbPassStrengthMessage', message ?? '', { shouldValidate: false, shouldDirty: false, }) form.setValue('dbPassStrengthWarning', warning ?? '', { shouldValidate: false, shouldDirty: false, }) form.trigger('dbPass') } catch (error) { console.error(error) } } export const DatabasePasswordInput = ({ form }: DatabasePasswordInputProps) => { // [Refactor] DB Password could be a common component used in multiple pages with repeated logic async function generatePassword() { const password = generateStrongPassword() form.setValue('dbPass', password) updatePasswordStrength(form, password) } return ( { const isInvalidDatabasePassword = field.value.length > 0 && !field.value.match(DATABASE_PASSWORD_REGEX) return ( {isInvalidDatabasePassword && } } > 0} type="password" placeholder="Type in a strong password" {...field} autoComplete="off" onChange={async (event) => { const newValue = event.target.value field.onChange(event) updatePasswordStrength(form, newValue) }} /> ) }} /> ) }