import { useState, useEffect } from "react"; import { Button } from "@components/Button"; import { InputFieldWithLabel } from "@/components/InputField"; import api from "@/api"; import { useLocalAuthModalStore } from "@/hooks/stores"; import { useLocation, useRevalidator } from "react-router-dom"; import { useDeviceUiNavigation } from "@/hooks/useAppNavigation"; export default function SecurityAccessLocalAuthRoute() { const { setModalView } = useLocalAuthModalStore(); const { navigateTo } = useDeviceUiNavigation(); const location = useLocation(); const init = location.state?.init; useEffect(() => { if (!init) { navigateTo(".."); } else { setModalView(init); } }, [init, navigateTo, setModalView]); { /* TODO: Migrate to using URLs instead of the global state. To simplify the refactoring, we'll keep the global state for now. */ } return navigateTo("..")} />; } export function Dialog({ onClose }: { onClose: () => void }) { const { modalView, setModalView } = useLocalAuthModalStore(); const [error, setError] = useState(null); const revalidator = useRevalidator(); const handleCreatePassword = async (password: string, confirmPassword: string) => { if (password === "") { setError("Please enter a password"); return; } if (password !== confirmPassword) { setError("Passwords do not match"); return; } try { const res = await api.POST("/auth/password-local", { password }); if (res.ok) { setModalView("creationSuccess"); // The rest of the app needs to revalidate the device authMode revalidator.revalidate(); } else { const data = await res.json(); setError(data.error || "An error occurred while setting the password"); } } catch (error) { setError("An error occurred while setting the password"); } }; const handleUpdatePassword = async ( oldPassword: string, newPassword: string, confirmNewPassword: string, ) => { if (newPassword !== confirmNewPassword) { setError("Passwords do not match"); return; } if (oldPassword === "") { setError("Please enter your old password"); return; } if (newPassword === "") { setError("Please enter a new password"); return; } try { const res = await api.PUT("/auth/password-local", { oldPassword, newPassword, }); if (res.ok) { setModalView("updateSuccess"); // The rest of the app needs to revalidate the device authMode revalidator.revalidate(); } else { const data = await res.json(); setError(data.error || "An error occurred while changing the password"); } } catch (error) { setError("An error occurred while changing the password"); } }; const handleDeletePassword = async (password: string) => { if (password === "") { setError("Please enter your current password"); return; } try { const res = await api.DELETE("/auth/local-password", { password }); if (res.ok) { setModalView("deleteSuccess"); // The rest of the app needs to revalidate the device authMode revalidator.revalidate(); } else { const data = await res.json(); setError(data.error || "An error occurred while disabling the password"); } } catch (error) { setError("An error occurred while disabling the password"); } }; return (
{modalView === "createPassword" && ( )} {modalView === "deletePassword" && ( )} {modalView === "updatePassword" && ( )} {modalView === "creationSuccess" && ( )} {modalView === "deleteSuccess" && ( )} {modalView === "updateSuccess" && ( )}
); } function CreatePasswordModal({ onSetPassword, onCancel, error, }: { onSetPassword: (password: string, confirmPassword: string) => void; onCancel: () => void; error: string | null; }) { const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); return (
{ e.preventDefault(); }} >

Local Device Protection

Create a password to protect your device from unauthorized local access.

setPassword(e.target.value)} /> setConfirmPassword(e.target.value)} />
{error &&

{error}

}
); } function DeletePasswordModal({ onDeletePassword, onCancel, error, }: { onDeletePassword: (password: string) => void; onCancel: () => void; error: string | null; }) { const [password, setPassword] = useState(""); return (

Disable Local Device Protection

Enter your current password to disable local device protection.

setPassword(e.target.value)} />
{error &&

{error}

}
); } function UpdatePasswordModal({ onUpdatePassword, onCancel, error, }: { onUpdatePassword: ( oldPassword: string, newPassword: string, confirmNewPassword: string, ) => void; onCancel: () => void; error: string | null; }) { const [oldPassword, setOldPassword] = useState(""); const [newPassword, setNewPassword] = useState(""); const [confirmNewPassword, setConfirmNewPassword] = useState(""); return (
{ e.preventDefault(); }} >

Change Local Device Password

Enter your current password and a new password to update your local device protection.

setOldPassword(e.target.value)} /> setNewPassword(e.target.value)} /> setConfirmNewPassword(e.target.value)} />
{error &&

{error}

}
); } function SuccessModal({ headline, description, onClose, }: { headline: string; description: string; onClose: () => void; }) { return (

{headline}

{description}

); }