Files
Mav-Mobile-UI/src/components/SettingForms/NPED/NPEDFields.tsx

133 lines
4.1 KiB
TypeScript
Raw Normal View History

2025-08-18 16:04:03 +01:00
import { Form, Formik, Field } from "formik";
import FormGroup from "../components/FormGroup";
2025-08-29 10:07:59 +01:00
import type { NPEDErrorValues, NPEDFieldType } from "../../../types/types";
import { useNPEDAuth } from "../../../hooks/useNPEDAuth";
import { toast } from "sonner";
2025-09-16 14:20:38 +01:00
import { faEyeSlash, faEye } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { useState } from "react";
2025-08-18 16:04:03 +01:00
const NPEDFields = () => {
2025-09-16 14:20:38 +01:00
const [showPwd, setShowPwd] = useState(false);
2025-08-29 14:55:37 +01:00
const { signIn, user, signOut } = useNPEDAuth();
2025-09-12 13:28:14 +01:00
2025-08-29 14:55:37 +01:00
const initialValues = user
? {
username: user?.propUsername?.value,
password: user?.propPassword?.value,
clientId: user?.propClientID?.value,
2025-08-29 14:55:37 +01:00
frontId: "NPED",
rearId: "NPED",
}
: {
username: "",
password: "",
clientId: "",
frontId: "NPED",
rearId: "NPED",
};
2025-08-18 16:04:03 +01:00
const handleSubmit = (values: NPEDFieldType) => {
2025-08-29 10:07:59 +01:00
const valuesToSend = {
...values,
};
signIn(valuesToSend);
};
const validateValues = (values: NPEDFieldType) => {
const errors: NPEDErrorValues = {};
if (!values.username) errors.username = "Required";
if (!values.password) errors.password = "Required";
if (!values.clientId) errors.clientId = "Required";
return errors;
2025-08-18 16:04:03 +01:00
};
2025-08-29 14:55:37 +01:00
const handleLogoutClick = () => {
signOut();
toast.warning("logged out of NPED");
2025-08-29 14:55:37 +01:00
};
2025-08-18 16:04:03 +01:00
return (
2025-08-29 10:07:59 +01:00
<Formik
initialValues={initialValues}
onSubmit={handleSubmit}
validate={validateValues}
2025-09-16 14:20:38 +01:00
enableReinitialize
2025-08-29 10:07:59 +01:00
>
{({ errors, touched }) => (
2025-09-26 13:58:14 +01:00
<Form className="flex flex-col space-y-5 px-2">
2025-08-29 10:07:59 +01:00
<FormGroup>
<label htmlFor="username">Username</label>
{touched.username && errors.username && (
<small className="absolute right-0 -top-5 text-red-500">
{errors.username}
</small>
)}
<Field
name="username"
type="text"
id="username"
placeholder="NPED username"
className="p-1.5 border border-gray-400 rounded-lg"
/>
</FormGroup>
<FormGroup>
<label htmlFor="password">Password</label>
{touched.password && errors.password && (
<small className="absolute right-0 -top-5 text-red-500">
{errors.password}
</small>
)}
<Field
name="password"
2025-09-16 14:20:38 +01:00
type={showPwd ? "text" : "password"}
2025-08-29 10:07:59 +01:00
id="password"
placeholder="NPED Password"
className="p-1.5 border border-gray-400 rounded-lg"
/>
2025-09-16 14:20:38 +01:00
<FontAwesomeIcon
type="button"
className="absolute right-5 end-0"
onClick={() => setShowPwd((s) => !s)}
icon={showPwd ? faEyeSlash : faEye}
/>
2025-08-29 10:07:59 +01:00
</FormGroup>
<FormGroup>
<label htmlFor="clientId">Client ID</label>
{touched.clientId && errors.clientId && (
<small className="absolute right-0 -top-5 text-red-500">
{errors.clientId}
</small>
)}
<Field
name="clientId"
type="text"
id="clientId"
placeholder="NPED client ID"
className="p-1.5 border border-gray-400 rounded-lg"
/>
</FormGroup>
2025-08-29 14:55:37 +01:00
{!user?.propClientID?.value ? (
<button
type="submit"
className="w-1/4 text-white bg-green-700 hover:bg-green-800 font-small rounded-lg text-sm px-2 py-2.5 hover:cursor-pointer"
>
Login
</button>
) : (
<button
type="button"
className="w-1/4 border-red-700 bg-red-800 text-white font-small rounded-lg text-sm px-2 py-2.5 hover:cursor-pointer"
onClick={handleLogoutClick}
>
Logout
</button>
)}
2025-08-29 10:07:59 +01:00
</Form>
)}
2025-08-18 16:04:03 +01:00
</Formik>
);
};
export default NPEDFields;