diff --git a/frontend/src/main-page/settings/ChangePasswordModal.tsx b/frontend/src/main-page/settings/ChangePasswordModal.tsx new file mode 100644 index 0000000..744aad4 --- /dev/null +++ b/frontend/src/main-page/settings/ChangePasswordModal.tsx @@ -0,0 +1,136 @@ +import { useState } from "react"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faXmark } from "@fortawesome/free-solid-svg-icons"; +import { + PasswordField, + PasswordRequirements, + isPasswordValid, +} from "../../sign-up"; + +export type ChangePasswordFormValues = { + currentPassword: string; + newPassword: string; +}; + +type ChangePasswordModalProps = { + isOpen: boolean; + onClose: () => void; + onSubmit?: (values: ChangePasswordFormValues) => void; + error?: string | null; +}; + +export default function ChangePasswordModal({ + isOpen, + onClose, + onSubmit, + error = null, +}: ChangePasswordModalProps) { + const [currentPassword, setCurrentPassword] = useState(""); + const [newPassword, setNewPassword] = useState(""); + const [reEnterPassword, setReEnterPassword] = useState(""); + + if (!isOpen) return null; + + const newPasswordValid = isPasswordValid(newPassword); + const passwordsMatch = newPassword !== "" && newPassword === reEnterPassword; + const passwordsDontMatch = + reEnterPassword !== "" && newPassword !== reEnterPassword; + const allFilled = + currentPassword.trim() !== "" && + newPassword !== "" && + reEnterPassword !== ""; + const canSave = + allFilled && newPasswordValid && passwordsMatch; + + const handleClose = () => { + setCurrentPassword(""); + setNewPassword(""); + setReEnterPassword(""); + onClose(); + }; + + const handleSave = () => { + if (!canSave) return; + onSubmit?.({ + currentPassword: currentPassword.trim(), + newPassword, + }); + handleClose(); + }; + + return ( +
{field.label}
-- {field.value} -
-{field.label}
++ {field.value} +
+