From 9f5b87bd45252a68d01e706c2adb4926e818b966 Mon Sep 17 00:00:00 2001 From: Rafael Gonzaga Date: Tue, 31 Mar 2026 21:49:44 -0300 Subject: [PATCH 1/3] feat: add route for creating new clients --- src/router/components/AppRoute.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/router/components/AppRoute.tsx b/src/router/components/AppRoute.tsx index d9869e5..dfd242b 100644 --- a/src/router/components/AppRoute.tsx +++ b/src/router/components/AppRoute.tsx @@ -1,4 +1,4 @@ -import { ClientsPage } from "@/modules/clients/pages"; +import { ClientsPage, NewClientPage } from "@/modules/clients/pages"; import { OrdersPage } from "@/modules/orders/pages"; import { NewServicePage, ServicesPage } from "@/modules/services/pages"; import { NotFoundPage } from "@/shared/pages"; @@ -50,6 +50,15 @@ export function AppRoute() { } /> + + + + } + /> + Date: Tue, 31 Mar 2026 21:50:26 -0300 Subject: [PATCH 2/3] chore: update module exports --- src/modules/clients/pages/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/clients/pages/index.tsx b/src/modules/clients/pages/index.tsx index 6b62f00..6b47ce0 100644 --- a/src/modules/clients/pages/index.tsx +++ b/src/modules/clients/pages/index.tsx @@ -1 +1,2 @@ export { ClientsPage } from "./ClientsPage"; +export { NewClientPage } from "./NewClientPage"; From 6ecc92ad82880195df492c4068b1d9715c8cbce2 Mon Sep 17 00:00:00 2001 From: Rafael Gonzaga Date: Tue, 31 Mar 2026 21:50:49 -0300 Subject: [PATCH 3/3] feat: implement new client creation page --- src/modules/clients/pages/NewClientPage.tsx | 202 ++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 src/modules/clients/pages/NewClientPage.tsx diff --git a/src/modules/clients/pages/NewClientPage.tsx b/src/modules/clients/pages/NewClientPage.tsx new file mode 100644 index 0000000..186cc0b --- /dev/null +++ b/src/modules/clients/pages/NewClientPage.tsx @@ -0,0 +1,202 @@ +import { SidebarMenu } from "@/shared/components/Sidebar"; +import { useToast } from "@/shared/hooks"; +import { getPageTitle } from "@/shared/utils"; +import { Ban, Save } from "lucide-react"; +import { useState, type SyntheticEvent, type ChangeEvent } from "react"; +import { Helmet } from "react-helmet-async"; +import { createDocument } from "@/services/firebase/firestore"; +import { InputField } from "@/shared/components/InputField"; +import { Button } from "@/shared/components/Button"; +import { useNavigate } from "react-router-dom"; + +export function NewClientPage() { + const [form, setForm] = useState({ + name: "", + email: "", + phone: "", + company: "", + status: "active", + notes: "", + }); + + const [loading, setLoading] = useState(false); + + const { addToast } = useToast(); + const navigate = useNavigate(); + + const handleChange = (e: ChangeEvent) => { + setForm({ ...form, [e.target.name]: e.target.value }); + }; + + const handleClientCreation = async (e: SyntheticEvent) => { + e.preventDefault(); + setLoading(true); + + try { + const now = new Date().toISOString(); + + const client = { + ...form, + createdAt: now, + updatedAt: now, + }; + + await createDocument("clients", client as never); + + addToast({ + message: "Client created successfully", + variant: "success", + duration: 3000, + }); + + navigate("/clients"); + } catch (err: unknown) { + console.error("Failed to create client", err); + + addToast({ + message: "Failed to create client. Please try again.", + variant: "error", + duration: 3000, + }); + } finally { + setLoading(false); + } + }; + + return ( + <> + + {getPageTitle("New Client")} + + + +
+
+
+
+

New Client

+ +

+ Add a new client to your database. Provide contact details and additional information to manage your + relationships. +

+
+
+ +
+
+
+ +
+ +
+
+ + + +
+
+
+ +
+
+ +
+ +
+ +
+
+ + + +
+ + +