From 09db1a34114bb008e4b392c21b1d2a7ce33a23a9 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 9 Jun 2026 08:14:43 +0530 Subject: [PATCH] feat: Enhance AddMember feature with form validation and state management using react-hook-form --- src/App.css | 2 +- src/Component/ui/DropDown.tsx | 14 +++++-- src/Component/ui/Input.tsx | 1 + src/Component/ui/Url.tsx | 2 +- .../v1/Component/AddMemberHeader.tsx | 15 +++---- .../v1/Component/Administrative_MetaData.tsx | 2 +- .../v1/Component/Community_Involment.tsx | 31 ++++++++++++-- .../AddMember/v1/Component/InterestBox.tsx | 4 +- .../v1/Component/MemberShip_Status.tsx | 26 ++++++++---- .../AddMember/v1/Component/SkillChip.tsx | 2 +- .../AddMember/v1/Page/AddMemberPage.tsx | 33 +++++++++++---- .../v1/Sections/PersonalInfoCard.tsx | 33 ++++++++++----- .../v1/Sections/ProfessionalDetails.tsx | 42 ++++++++++++++----- .../AddMember/v1/Type/AddMember.Type.ts | 25 +++++++++++ .../v1/Validator/AddMember.Validator.ts | 40 ++++++++++++++++++ .../AddMember/v1/hook/useAddMember.ts | 26 ++++++++++++ 16 files changed, 240 insertions(+), 58 deletions(-) create mode 100644 src/features/AddMember/v1/Type/AddMember.Type.ts create mode 100644 src/features/AddMember/v1/Validator/AddMember.Validator.ts create mode 100644 src/features/AddMember/v1/hook/useAddMember.ts diff --git a/src/App.css b/src/App.css index dcd5ee2..fe7b0a8 100644 --- a/src/App.css +++ b/src/App.css @@ -147,7 +147,7 @@ body { --cd-surface-2: #f1f5f9; --cd-surface-3: #eef2f7; --cd-border: #d8e1ee; - --cd-border-subtle: #e9eef6; + --cd-border-subtle: rgb(165, 166, 167); --cd-text: #1e293b; --cd-text-2: #53657d; --cd-text-muted: #8392a8; diff --git a/src/Component/ui/DropDown.tsx b/src/Component/ui/DropDown.tsx index 96e0857..ff9fe84 100644 --- a/src/Component/ui/DropDown.tsx +++ b/src/Component/ui/DropDown.tsx @@ -5,6 +5,7 @@ import { useTheme } from "@/theme"; type DropDownProps = { options: string[]; label?: string; + error?: string; onSelect: (option: string) => void; className?: string; value?: string; @@ -20,6 +21,7 @@ const DropDown: React.FC = ({ value, placeholder = "Select an option", disabled = false, + error, }) => { const { theme } = useTheme(); const [open, setOpen] = useState(false); @@ -69,7 +71,7 @@ const DropDown: React.FC = ({ className="w-full rounded-lg px-3 py-2 text-left flex justify-between items-center text-sm transition-all duration-150 disabled:cursor-not-allowed disabled:opacity-60" style={{ backgroundColor: theme.bg.surface, - border: `1px solid ${theme.border.default}`, + border: `1px solid ${error ? "var(--cd-danger)" : "var(--cd-border)"}`, color: selected ? theme.text.primary : theme.text.muted, }} > @@ -80,12 +82,12 @@ const DropDown: React.FC = ({ /> - {open && options.length > 0 && ( + {!error && open && options.length > 0 && ( = ({ ))} )} + + {error && ( + + {error} + + )} ); }; diff --git a/src/Component/ui/Input.tsx b/src/Component/ui/Input.tsx index 629f819..edf845e 100644 --- a/src/Component/ui/Input.tsx +++ b/src/Component/ui/Input.tsx @@ -6,6 +6,7 @@ type InputType = "text" | "email" | "password" | "number" | "url" | "tel" | "tim type InputProps = { label?: string; name: string; + placeholder?: string; value?: string | number; type?: InputType; diff --git a/src/Component/ui/Url.tsx b/src/Component/ui/Url.tsx index eb806d7..e120bd8 100644 --- a/src/Component/ui/Url.tsx +++ b/src/Component/ui/Url.tsx @@ -2,7 +2,7 @@ import React from "react"; interface UrlProps { protocol?: string; - domain: string; + domain: string | undefined; themeMode?: "light" | "dark"; className?: string; style?: React.CSSProperties; diff --git a/src/features/AddMember/v1/Component/AddMemberHeader.tsx b/src/features/AddMember/v1/Component/AddMemberHeader.tsx index 2f0b3e3..cdae618 100644 --- a/src/features/AddMember/v1/Component/AddMemberHeader.tsx +++ b/src/features/AddMember/v1/Component/AddMemberHeader.tsx @@ -3,7 +3,12 @@ import { Link } from "react-router"; import Button from "../../../../Component/ui/Button"; import { memo } from "react"; -const AddMemberHeader = () => { +type AddMemberHeaderProps = { + onCreate: () => void; + onDiscard: () => void; +}; + +const AddMemberHeader = ({ onCreate, onDiscard }: AddMemberHeaderProps) => { return ( { - alert("Discard Draft clicked")} - /> - alert("Create Member clicked")} /> + + ); diff --git a/src/features/AddMember/v1/Component/Administrative_MetaData.tsx b/src/features/AddMember/v1/Component/Administrative_MetaData.tsx index 724e009..36ccf86 100644 --- a/src/features/AddMember/v1/Component/Administrative_MetaData.tsx +++ b/src/features/AddMember/v1/Component/Administrative_MetaData.tsx @@ -14,7 +14,7 @@ const Administrative_MetaData = () => { Administrative Metadata
+ {error} +
Membership Status
{errors.membershipStatus.message}
Primary Role