From 6da653cb152a89be09e40b3af561a8a5e9e4ecec Mon Sep 17 00:00:00 2001 From: AmirReza Jamali Date: Tue, 25 Nov 2025 14:11:00 +0330 Subject: [PATCH] feat(inquiries): Add status change functionality to inquiries - Add useChangeInquiryStatus hook for managing inquiry status mutations - Add STATUS endpoint to inquiries API endpoints configuration - Add changeInquiryStatus method to inquiries service with error handling - Add TChangeInquiryStatusCredentials type with validation schema - Include description, reason, and status fields in status change credentials - Invalidate inquiries query cache on successful status update - Display success toast notification after status change completes --- src/hooks/queries/useInquiryQueries.ts | 18 ++++++++++++++++ src/lib/api/endpoints.ts | 5 +++-- src/lib/api/services/inquiries-service.ts | 25 +++++++++++++++++++++-- src/lib/api/types/TInquiries.ts | 10 ++++++++- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/hooks/queries/useInquiryQueries.ts b/src/hooks/queries/useInquiryQueries.ts index 29a72a1..600980d 100644 --- a/src/hooks/queries/useInquiryQueries.ts +++ b/src/hooks/queries/useInquiryQueries.ts @@ -31,3 +31,21 @@ export const useDeleteInquiry = (successCallback?: () => void) => { }, }); }; +export const useChangeInquiryStatus = (successCallback?: () => void) => { + const queryClient = useQueryClient(); + const mutationKey = useMemo( + () => [API_ENDPOINTS.INQUIRIES.BASE(), "UPDATE INQUIRY STATUS"], + [], + ); + return useMutation({ + mutationKey, + mutationFn: inquiriesService.changeInquiryStatus, + onSuccess: (response) => { + toast.success(response.message); + successCallback?.() + queryClient.invalidateQueries({ + queryKey: [API_ENDPOINTS.INQUIRIES.BASE()], + }); + }, + }); +}; diff --git a/src/lib/api/endpoints.ts b/src/lib/api/endpoints.ts index b776bb2..2bed196 100644 --- a/src/lib/api/endpoints.ts +++ b/src/lib/api/endpoints.ts @@ -66,6 +66,7 @@ export const API_ENDPOINTS = { }, INQUIRIES: { - BASE: (id?: string) => (id ? `inquiries/${id}` : "inquiries"), - } + BASE: (id?: string) => (id ? `inquiries/${id}` : "inquiries"), + STATUS: (id: string) => `inquiries/${id}/status`, + }, } as const; diff --git a/src/lib/api/services/inquiries-service.ts b/src/lib/api/services/inquiries-service.ts index 4b3b23c..f5649a0 100644 --- a/src/lib/api/services/inquiries-service.ts +++ b/src/lib/api/services/inquiries-service.ts @@ -1,6 +1,6 @@ import api from "../axios"; import { API_ENDPOINTS } from "../endpoints"; -import { TInquiriesResponse } from "../types"; +import { TChangeInquiryStatusCredentials, TInquiriesResponse } from "../types"; export const inquiriesService = { getInquiries: async ( @@ -17,7 +17,28 @@ export const inquiriesService = { try { return (await api.delete(API_ENDPOINTS.INQUIRIES.BASE(id))).data; } catch (error) { - console.error("ERROR caught in inquiries service => deleteInquiry", error); + console.error( + "ERROR caught in inquiries service => deleteInquiry", + error, + ); + throw error; + } + }, + changeInquiryStatus: async ({ + credentials, + id, + }: { + credentials: TChangeInquiryStatusCredentials; + id: string; + }) => { + try { + return (await api.put(API_ENDPOINTS.INQUIRIES.STATUS(id), credentials)) + .data; + } catch (error) { + console.error( + "ERROR caught in inquiries service => changeInquiryStatus", + error, + ); throw error; } }, diff --git a/src/lib/api/types/TInquiries.ts b/src/lib/api/types/TInquiries.ts index 8cacf6d..2abdac6 100644 --- a/src/lib/api/types/TInquiries.ts +++ b/src/lib/api/types/TInquiries.ts @@ -1,6 +1,11 @@ +import { INQUIRY_STATUS } from "@/constants/enums"; import { z } from "zod"; import { createApiResponseSchema } from "./Factory"; - +const changeInquiryStatusCredentials = z.object({ + description: z.string(), + reason: z.string(), + status: z.enum(INQUIRY_STATUS), +}); const inquiriesSchema = z.object({ company_name: z.string(), created_at: z.number(), @@ -22,5 +27,8 @@ const inquiriesSchema = z.object({ export const inquiriesListResponse = createApiResponseSchema( z.object({ inquiries: z.array(inquiriesSchema) }), ); +export type TChangeInquiryStatusCredentials = z.infer< + typeof changeInquiryStatusCredentials +>; export type TInquiries = z.infer; export type TInquiriesResponse = z.infer;