From 27cf5c9d3f45ca03076a15e702b1d210b280fc28 Mon Sep 17 00:00:00 2001 From: "santasri.pachhal" Date: Tue, 23 Jun 2026 12:56:23 +0530 Subject: [PATCH] feat(clients): align client form with first and last name API fields --- next-env.d.ts | 2 +- .../clients/components/ClientColumns.tsx | 6 +- .../clients/components/ClientSheet.tsx | 95 ++++++++++++------- .../(modules)/clients/hooks/useClientForm.ts | 40 ++++---- .../clients/hooks/useClientMutations.ts | 3 +- .../segment/components/SegmentDialog.tsx | 6 +- .../(modules)/segment/hooks/useSegmentForm.ts | 12 +-- .../tenants/components/TenantSheet.tsx | 10 +- .../components/TicketDetailHeader.tsx | 13 ++- .../components/TicketRepairReportCard.tsx | 4 + src/components/ui/sparkle-button.tsx | 34 +++++++ src/components/videoPlayerSection.tsx | 2 +- src/services/api/client.service.ts | 6 +- src/types/analysis.ts | 4 +- src/types/client.ts | 9 +- src/types/ticket/detail.ts | 1 + 16 files changed, 162 insertions(+), 85 deletions(-) create mode 100644 src/components/ui/sparkle-button.tsx diff --git a/next-env.d.ts b/next-env.d.ts index c4b7818..9edff1c 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/src/app/(modules)/clients/components/ClientColumns.tsx b/src/app/(modules)/clients/components/ClientColumns.tsx index 9f405cd..b75cfc5 100644 --- a/src/app/(modules)/clients/components/ClientColumns.tsx +++ b/src/app/(modules)/clients/components/ClientColumns.tsx @@ -19,10 +19,12 @@ export function useClientColumns(): ColumnDef[] { return useMemo(() => { return [ { - accessorKey: 'name', + accessorKey: 'first_name', header: 'Client', cell: ({ row }) => ( - {row.original.name} + + {`${row.original.first_name} ${row.original.last_name}`.trim()} + ), }, { diff --git a/src/app/(modules)/clients/components/ClientSheet.tsx b/src/app/(modules)/clients/components/ClientSheet.tsx index 453dc1b..82a5254 100644 --- a/src/app/(modules)/clients/components/ClientSheet.tsx +++ b/src/app/(modules)/clients/components/ClientSheet.tsx @@ -40,7 +40,12 @@ export function ClientSheet({ canSubmit, isSaving, }: ClientSheetProps) { - const nameErrorMessage = isSubmitted ? errors.name?.message : undefined; + const firstNameErrorMessage = isSubmitted + ? errors.first_name?.message + : undefined; + const lastNameErrorMessage = isSubmitted + ? errors.last_name?.message + : undefined; const emailErrorMessage = isSubmitted ? errors.email?.message : undefined; const landlineErrorMessage = isSubmitted ? errors.landline_number?.message @@ -68,23 +73,43 @@ export function ClientSheet({ -
+
+ + + +
+ +
-
-
- - - -
+ + + +
- + - +
@@ -172,7 +203,7 @@ export function ClientSheet({ > @@ -187,7 +218,7 @@ export function ClientSheet({ diff --git a/src/app/(modules)/clients/hooks/useClientForm.ts b/src/app/(modules)/clients/hooks/useClientForm.ts index 831df40..080c2fd 100644 --- a/src/app/(modules)/clients/hooks/useClientForm.ts +++ b/src/app/(modules)/clients/hooks/useClientForm.ts @@ -9,37 +9,32 @@ import { z } from 'zod'; import type { Client } from '@/types'; import { useSaveClientMutation } from './useClientMutations'; -const phoneSchema = z - .string() - .trim() - .min(1, 'Phone number is required') - .regex(/^\+(?:[0-9] ?|-){6,18}[0-9]$/, 'Please enter a valid phone number'); - +const requiredText = (message: string) => z.string().trim().min(1, message); const optionalTaxIdSchema = z.string().trim(); const clientFormSchema = z.object({ id: z.number().optional(), - name: z.string().trim().min(1, 'Client name is required'), - email: z.string().trim().min(1, 'Email is required').email('Invalid email'), - landline_number: phoneSchema, - address: z.string().trim().min(1, 'Address is required'), + first_name: requiredText('First name is required'), + last_name: requiredText('Last name is required'), + email: requiredText('Email is required').email('Invalid email'), + landline_number: requiredText('Landline number is required'), + address: requiredText('Address is required'), gst: optionalTaxIdSchema, pan: optionalTaxIdSchema, tan: optionalTaxIdSchema, - contact_name: z.string().trim().min(1, 'Contact name is required'), - contact_phone_number: phoneSchema, - contact_email: z - .string() - .trim() - .min(1, 'Contact email is required') - .email('Invalid contact email'), + contact_name: requiredText('Contact name is required'), + contact_phone_number: requiredText('Contact phone number is required'), + contact_email: requiredText('Contact email is required').email( + 'Invalid contact email', + ), is_active: z.boolean(), }); export type ClientFormValues = z.infer; const defaultValues: ClientFormValues = { - name: '', + first_name: '', + last_name: '', email: '', landline_number: '', address: '', @@ -73,7 +68,8 @@ export function useClientForm({ onSaved }: { onSaved: () => void }) { }); const clientId = useWatch({ control, name: 'id' }); - const name = useWatch({ control, name: 'name' }) || ''; + const firstName = useWatch({ control, name: 'first_name' }) || ''; + const lastName = useWatch({ control, name: 'last_name' }) || ''; const email = useWatch({ control, name: 'email' }) || ''; const landlineNumber = useWatch({ control, name: 'landline_number' }) || ''; const address = useWatch({ control, name: 'address' }) || ''; @@ -82,7 +78,8 @@ export function useClientForm({ onSaved }: { onSaved: () => void }) { useWatch({ control, name: 'contact_phone_number' }) || ''; const contactEmail = useWatch({ control, name: 'contact_email' }) || ''; const canSubmit = - name.trim().length > 0 && + firstName.trim().length > 0 && + lastName.trim().length > 0 && email.trim().length > 0 && landlineNumber.trim().length > 0 && address.trim().length > 0 && @@ -111,7 +108,8 @@ export function useClientForm({ onSaved }: { onSaved: () => void }) { (client: Client) => { reset({ id: client.id, - name: client.name || '', + first_name: client.first_name || '', + last_name: client.last_name || '', email: client.email || '', landline_number: client.landline_number || '', address: client.address || '', diff --git a/src/app/(modules)/clients/hooks/useClientMutations.ts b/src/app/(modules)/clients/hooks/useClientMutations.ts index 4d771aa..b01260c 100644 --- a/src/app/(modules)/clients/hooks/useClientMutations.ts +++ b/src/app/(modules)/clients/hooks/useClientMutations.ts @@ -20,7 +20,8 @@ export function useSaveClientMutation({ onSaved }: { onSaved: () => void }) { mutationFn: (values: ClientFormValues) => clientService.saveClient({ id: values.id, - name: values.name.trim(), + first_name: values.first_name.trim(), + last_name: values.last_name.trim(), email: values.email.trim(), landline_number: values.landline_number.trim(), address: values.address.trim(), diff --git a/src/app/(modules)/segment/components/SegmentDialog.tsx b/src/app/(modules)/segment/components/SegmentDialog.tsx index 6695b82..d3159ee 100644 --- a/src/app/(modules)/segment/components/SegmentDialog.tsx +++ b/src/app/(modules)/segment/components/SegmentDialog.tsx @@ -83,7 +83,11 @@ export function SegmentDialog({ - +
diff --git a/src/app/(modules)/segment/hooks/useSegmentForm.ts b/src/app/(modules)/segment/hooks/useSegmentForm.ts index 8ad718a..ce4895d 100644 --- a/src/app/(modules)/segment/hooks/useSegmentForm.ts +++ b/src/app/(modules)/segment/hooks/useSegmentForm.ts @@ -141,17 +141,7 @@ export function useSegmentForm({ onSaved }: { onSaved: () => void }) { }, }); - const onSubmit = handleSubmit( - (values) => saveMutation.mutate(values), - (formErrors) => { - const firstMessage = Object.values(formErrors).find( - (error) => error?.message, - )?.message; - if (firstMessage) { - toast.error(String(firstMessage)); - } - }, - ); + const onSubmit = handleSubmit((values) => saveMutation.mutate(values)); const openCreate = useCallback(() => { reset(defaultValues); diff --git a/src/app/(modules)/tenants/components/TenantSheet.tsx b/src/app/(modules)/tenants/components/TenantSheet.tsx index 99fcf47..63461af 100644 --- a/src/app/(modules)/tenants/components/TenantSheet.tsx +++ b/src/app/(modules)/tenants/components/TenantSheet.tsx @@ -128,7 +128,11 @@ export function TenantSheet({
- +