diff --git a/src/components/FieldsWrapper.jsx b/src/components/FieldsWrapper.jsx
new file mode 100644
index 0000000..25b94a4
--- /dev/null
+++ b/src/components/FieldsWrapper.jsx
@@ -0,0 +1,12 @@
+import PropTypes from "prop-types";
+
+function FieldsWrapper({ children, className = "" }) {
+ return
{children}
;
+}
+
+FieldsWrapper.propTypes = {
+ children: PropTypes.node,
+ className: PropTypes.string,
+};
+
+export default FieldsWrapper;
diff --git a/src/components/FormHeader.jsx b/src/components/FormHeader.jsx
index 6ad3d50..b3b5028 100644
--- a/src/components/FormHeader.jsx
+++ b/src/components/FormHeader.jsx
@@ -1,7 +1,7 @@
import PropTypes from "prop-types";
function FormHeader({ text }) {
- return {text}
;
+ return {text}
;
}
FormHeader.propTypes = {
diff --git a/src/components/FormInput.jsx b/src/components/FormInput.jsx
index cc550ea..b028796 100644
--- a/src/components/FormInput.jsx
+++ b/src/components/FormInput.jsx
@@ -2,29 +2,15 @@ import PropTypes from "prop-types";
import { motion, AnimatePresence } from "motion/react";
import clsx from "clsx";
-function FormInput({
- value,
- onChange,
- placeholder,
- valid = true,
- maxLength = 17,
- readOnly = false,
- className = "",
- type = "text",
-}) {
+function FormInput({ props, valid = true, className = "" }) {
return (
{!valid && (
@@ -44,14 +30,9 @@ function FormInput({
}
FormInput.propTypes = {
- value: PropTypes.string.isRequired,
- onChange: PropTypes.func.isRequired,
- readOnly: PropTypes.bool,
- className: PropTypes.string,
- type: PropTypes.string,
- maxLength: PropTypes.number,
+ props: PropTypes.object,
valid: PropTypes.bool,
- placeholder: PropTypes.string,
+ className: PropTypes.string,
};
export default FormInput;
diff --git a/src/components/FormSelect.jsx b/src/components/FormSelect.jsx
index f779b68..ce876f8 100644
--- a/src/components/FormSelect.jsx
+++ b/src/components/FormSelect.jsx
@@ -3,21 +3,20 @@ import { AnimatePresence } from "motion/react";
import clsx from "clsx";
import FieldError from "./FieldError";
-function FormSelect({ value, onChange, options, className, valid = true }) {
+function FormSelect({ props, valid = true, className = "", options }) {
return (
);
}
diff --git a/src/pages/ChargeEdit.jsx b/src/pages/ChargeEdit.jsx
index 404d80b..7cc3322 100644
--- a/src/pages/ChargeEdit.jsx
+++ b/src/pages/ChargeEdit.jsx
@@ -11,6 +11,7 @@ import { lockerService } from "../services/locker.service";
import { AnimatePresence } from "motion/react";
import { Pencil } from "lucide-react";
import Notification from "../components/Notification";
+import FieldsWrapper from "../components/FieldsWrapper";
function ChargeEdit() {
const [chargeDetails, setChargeDetails] = useState({
@@ -141,18 +142,20 @@ function ChargeEdit() {
});
},
readOnly: field.readOnly,
- className: field.readOnly ? "bg-grey/[0.3]" : "",
+
+ type: field.subType,
};
+ const className = field.readOnly ? "bg-grey/[0.3]" : "";
return (
{field.type === "input" ? (
-
+
) : (
-
+
)}
);
@@ -168,9 +171,7 @@ function ChargeEdit() {
)}
-
- {formFields.map(renderField)}
-
+ {formFields.map(renderField)}
-
+
, onClick: () => {} }}
>
setAccountNumber(e.target.value)}
+ props={{
+ type: "text",
+ value: accountNumber,
+ onChange: (e) => setAccountNumber(e.target.value),
+ }}
/>
-
+
diff --git a/src/pages/KeySwap.jsx b/src/pages/KeySwap.jsx
index f7ac568..4fa12e1 100644
--- a/src/pages/KeySwap.jsx
+++ b/src/pages/KeySwap.jsx
@@ -8,9 +8,9 @@ import FormInput from "../components/FormInput";
import FormSelect from "../components/FormSelect";
import Button from "../components/Button";
import { lockerService } from "../services/locker.service";
-import clsx from "clsx";
import FormBox from "../components/FormBox";
import Notification from "../components/Notification";
+import FieldsWrapper from "../components/FieldsWrapper";
function KeySwap() {
const { t } = useTranslation();
@@ -142,19 +142,20 @@ function KeySwap() {
setKeySwapDetails(newLockerDetails);
},
maxLength: field.maxLength,
- className: clsx(!keySwapDetails[`${field.name}Valid`] && "border-error"),
+ type: field.subType,
+ readOnly: field.readOnly,
};
-
+ const valid = keySwapDetails[`${field.name}Valid`];
return (
{field.type === "input" ? (
-
+
) : (
-
+
)}
);
@@ -170,9 +171,7 @@ function KeySwap() {
)}
-
- {formFields.map(renderField)}
-
+ {formFields.map(renderField)}
diff --git a/src/pages/LockerStatus.jsx b/src/pages/LockerStatus.jsx
index 93bb2b1..685830c 100644
--- a/src/pages/LockerStatus.jsx
+++ b/src/pages/LockerStatus.jsx
@@ -4,12 +4,12 @@ import FormInput from "../components/FormInput";
import FormSelect from "../components/FormSelect";
import { useTranslation } from "react-i18next";
import { useState } from "react";
-import clsx from "clsx";
import Button from "../components/Button";
import { lockerService } from "../services/locker.service";
import { useLoading } from "../hooks/useLoading";
import { AnimatePresence } from "motion/react";
import Notification from "../components/Notification";
+import FieldsWrapper from "../components/FieldsWrapper";
function LockerStatus() {
const { t } = useTranslation();
@@ -98,7 +98,6 @@ function LockerStatus() {
const renderField = (field) => {
const commonProps = {
value: lockerDetails[field.name],
- valid: lockerDetails[`${field.name}Valid`],
onChange: (e) => {
const newLockerDetails = { ...lockerDetails };
newLockerDetails[field.name] = e.target.value.toUpperCase();
@@ -106,19 +105,16 @@ function LockerStatus() {
setLockerDetails(newLockerDetails);
},
maxLength: field.maxLength,
- className: clsx(!lockerDetails[`${field.name}Valid`] && "border-error"),
+ type: field.subType,
+ readOnly: field.readOnly,
};
-
+ const valid = lockerDetails[`${field.name}Valid`];
return (
{field.type === "input" ? (
-
+
) : (
-
+
)}
);
@@ -134,9 +130,9 @@ function LockerStatus() {
)}
-
+
{formFields.map(renderField)}
-
+
diff --git a/src/pages/LockersRegistration.jsx b/src/pages/LockersRegistration.jsx
index 74718ae..a66c5b8 100644
--- a/src/pages/LockersRegistration.jsx
+++ b/src/pages/LockersRegistration.jsx
@@ -9,6 +9,8 @@ import Notification from "../components/Notification";
import FormField from "../components/FormField";
import FormInput from "../components/FormInput";
import FormSelect from "../components/FormSelect";
+import FormHeader from "../components/FormHeader";
+import FieldsWrapper from "../components/FieldsWrapper";
function LockersRegistration() {
const location = useLocation();
@@ -116,49 +118,65 @@ function LockersRegistration() {
}
};
- const lockerDetails = lockerValues.map((locker, index) => {
+ const formRow = [
+ {
+ label: "Locker ID",
+ type: "input",
+ subType: "text",
+ name: "id",
+ maxLength: 6,
+ validate: (value) => /^[A-Z]{2}[0-9]{4}$/.test(value),
+ },
+ {
+ label: "Size",
+ type: "select",
+ subType: "text",
+ name: "size",
+ options: [
+ { label: "Small", value: "1" },
+ { label: "Medium", value: "2" },
+ { label: "Large", value: "3" },
+ ],
+ },
+ {
+ label: "Key ID",
+ type: "input",
+ subType: "text",
+ name: "keyId",
+ maxLength: 6,
+ validate: (value) => /^[A-Z]{2}[0-9]{4}$/.test(value),
+ },
+ ];
+ const renderFormRow = (field) => {
+ const commonProps = {
+ value: lockerValues[field.name],
+ onChange: (e) => {
+ const newLockerValues = [...lockerValues];
+ newLockerValues[field.name] = e.target.value;
+ newLockerValues[`${field.name}Valid`] = true;
+ setLockerValues(newLockerValues);
+ },
+ maxLength: field.maxLength,
+ type: field.subType,
+ };
+
+ const valid = lockerValues[`${field.name}Valid`];
+
+ return field.type === "input" ? (
+
+ ) : (
+
+ );
+ };
+
+ const formFields = Array(noOfLockers).fill(formRow);
+ const renderFormFields = (row, index) => {
return (
- {
- const newValues = [...lockerValues];
- newValues[index].id = e.target.value;
- newValues[index].idValid = true;
- setLockerValues(newValues);
- }}
- valid={locker.idValid}
- placeholder={"Locker Id"}
- />
- {
- const newValues = [...lockerValues];
- newValues[index].size = e.target.value;
- newValues[index].sizeValid = true;
- setLockerValues(newValues);
- }}
- valid={locker.sizeValid}
- options={[
- {label: 'Small', value: '1'},
- {label: 'Medium', value: '2'},
- {label: 'Large', value: '3'}
- ]}
- />
- {
- const newValues = [...lockerValues];
- newValues[index].keyId = e.target.value;
- newValues[index].keyIdValid = true;
- setLockerValues(newValues);
- }}
- valid={locker.keyIdValid}
- placeholder={"Locker Key Id"}
- />
+ {row.map(renderFormRow)}
);
- });
+ };
return (
@@ -170,16 +188,11 @@ function LockersRegistration() {
)}
-
- {cabinetId}
-
- {lockerDetails}
- {
- handleSubmit(e);
- }}
- />
+
+
+ {formFields.map(renderFormFields)}
+
+