>>(
'/Case/getAll',
- { params: { organizationId, page, pageSize } }
+ { params: { page, pageSize } }
);
return withTotalPages(response.data);
};
diff --git a/src/features/cases/components/CaseDetailsModal.tsx b/src/features/cases/components/CaseDetailsModal.tsx
index c29ffb7..c097bd4 100644
--- a/src/features/cases/components/CaseDetailsModal.tsx
+++ b/src/features/cases/components/CaseDetailsModal.tsx
@@ -1,8 +1,8 @@
import '../styles/case-details-modal.css';
-import type { GetCaseDto } from '../types/case.types';
+import type { CaseDto } from '../types/case.types';
interface Props {
- caseItem: GetCaseDto;
+ caseItem: CaseDto;
onEdit: () => void;
onClose: () => void;
}
@@ -86,10 +86,10 @@ export default function CaseDetailsModal({ caseItem, onEdit, onClose }: Props) {
Petitioners
{caseItem.petitioners?.length > 0 ? (
- {caseItem.petitioners.map((name) => (
-
+ {caseItem.petitioners.map(p => (
+
- {name}
+ {p.name}
))}
diff --git a/src/features/cases/components/case-list/CaseList.tsx b/src/features/cases/components/case-list/CaseList.tsx
index e8c5b7a..88ec4af 100644
--- a/src/features/cases/components/case-list/CaseList.tsx
+++ b/src/features/cases/components/case-list/CaseList.tsx
@@ -1,5 +1,4 @@
import { useState, useCallback } from 'react';
-
import CasePageHeader from './CasePageHeader';
import CaseStatsBar from './CaseStatsBar';
import CaseFilterTabs from './CaseFilterTabs';
@@ -8,7 +7,6 @@ import CaseTable from './CaseTable';
import CaseDrawer from '../case-drawer/CaseDrawer';
import CreateCaseModal from '../create-case/CreateCaseModal';
import CaseDetailsModal from '../CaseDetailsModal';
-
import { useGetAllCases, useSearchCases, useDeleteCase } from '../../hooks/useCases';
import { useCaseModal } from '../../hooks/useCaseModal';
import type { CaseDto, SearchParams } from '../../types/case.types'; // ✅ CaseDto only, no GetCaseDto
diff --git a/src/features/cases/hooks/useCases.ts b/src/features/cases/hooks/useCases.ts
index b1e3d7b..35b2aef 100644
--- a/src/features/cases/hooks/useCases.ts
+++ b/src/features/cases/hooks/useCases.ts
@@ -4,25 +4,22 @@ import { createCase, deleteCase, getCases, searchCases } from '../api/case-api';
import { usePetitioners } from '../../petitioners/hooks/usePetitioners';
import { useGetDepartments } from '../../departments/hooks/useDepartments';
import { useGetCourts } from '../../courts/hooks/useCourts';
-import { useAuthStore } from '../../../store/authStore';
+import { toastService } from '../../../lib/toast.service'
+
// ── Query Key Factory ─────────────────────────────────────────────
export const caseKeys = {
all: () => ['cases'] as const,
- list: (orgId: string, page: number, size: number) => ['cases', 'list', orgId, page, size] as const,
+ list: (page: number, size: number) => ['cases', 'list', page, size] as const,
search: (params: SearchParams) => ['cases', 'search', params] as const,
};
// ── Cases ─────────────────────────────────────────────────────────
export const useGetAllCases = (page: number = 1, pageSize: number = 10) => {
- const { user } = useAuthStore();
- const orgId = user?.organizationId ?? '';
-
return useQuery({
- queryKey: caseKeys.list(orgId, page, pageSize),
- queryFn: () => getCases(orgId, page, pageSize),
- enabled: !!orgId,
+ queryKey: caseKeys.list(page, pageSize),
+ queryFn: () => getCases(page, pageSize),
});
};
@@ -37,14 +34,19 @@ export const useSearchCases = (params: SearchParams) => {
export const useCreateCase = () => {
const qc = useQueryClient();
- const { user } = useAuthStore();
+ // const { user } = useAuthStore();
return useMutation({
mutationFn: (data: CreateCaseDto) => createCase({
...data,
- organizationId: user?.organizationId ?? data.organizationId,
}),
- onSuccess: () => qc.invalidateQueries({ queryKey: caseKeys.all() }),
+ onSuccess: (response) => {
+ toastService.success(response.message);
+ qc.invalidateQueries({ queryKey: caseKeys.all() });
+ },
+ onError: (error: unknown) => {
+ toastService.error(error);
+ }
});
};
diff --git a/src/features/documents/hooks/useDocuments.ts b/src/features/documents/hooks/useDocuments.ts
index b5e506c..1628d8b 100644
--- a/src/features/documents/hooks/useDocuments.ts
+++ b/src/features/documents/hooks/useDocuments.ts
@@ -1,6 +1,7 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { documentsApi } from '../api/documents'
import type { UploadDocumentDto } from '../types'
+import { toastService } from '../../../lib/toast.service'
const DOCUMENT_KEYS = {
byCase: (caseId: string) => ['documents', 'case', caseId],
@@ -29,17 +30,15 @@ export function useUploadDocument(caseId: string) {
return useMutation({
mutationFn: (dto: UploadDocumentDto) => documentsApi.upload(dto),
onSuccess: (response) => {
- alert(response?.message);
-
+ toastService.success(response.message);
queryClient.invalidateQueries({
queryKey: DOCUMENT_KEYS.byCase(caseId),
});
},
-
- onError: (error: any) => {
- alert(error.message);
- },
- });
+ onError: (error: unknown) => {
+ toastService.error(error);
+ }
+ })
}
export function useDeleteDocument(caseId: string) {
@@ -47,10 +46,14 @@ export function useDeleteDocument(caseId: string) {
return useMutation({
mutationFn: (id: string) => documentsApi.delete(id),
- onSuccess: () => {
+ onSuccess: (response) => {
+ toastService.success(response.message);
queryClient.invalidateQueries({
queryKey: DOCUMENT_KEYS.byCase(caseId),
})
},
+ onError: (error: unknown) => {
+ toastService.error(error);
+ }
})
}
\ No newline at end of file
diff --git a/src/features/followup/hooks/useFollowups.ts b/src/features/followup/hooks/useFollowups.ts
index 2237577..4f4416e 100644
--- a/src/features/followup/hooks/useFollowups.ts
+++ b/src/features/followup/hooks/useFollowups.ts
@@ -1,8 +1,7 @@
-// hooks/useFollowups.ts
-
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { followupApi } from '../api/followupApi'
import type { CreateFollowUpDto, UpdateFollowUpDto, FollowUpPageParams } from '../types/followup.types'
+import { toastService } from '../../../lib/toast.service'
export const followupKeys = {
all: ['followups'] as const,
@@ -30,9 +29,13 @@ export const useCreateFollowUp = () => {
const qc = useQueryClient()
return useMutation({
mutationFn: (data: CreateFollowUpDto) => followupApi.create(data),
- onSuccess: () => {
+ onSuccess: (response) => {
+ toastService.success(response.message);
qc.invalidateQueries({ queryKey: followupKeys.all })
},
+ onError: (error: unknown) => {
+ toastService.error(error);
+ }
})
}
@@ -50,8 +53,12 @@ export const useDeleteFollowUp = () => {
const qc = useQueryClient()
return useMutation({
mutationFn: (id: string) => followupApi.delete(id),
- onSuccess: () => {
+ onSuccess: (response) => {
+ toastService.success(response.message);
qc.invalidateQueries({ queryKey: followupKeys.all })
},
- })
+ onError: (error: unknown) => {
+ toastService.error(error);
+ }
+ });
}
\ No newline at end of file
diff --git a/src/lib/toast.service.ts b/src/lib/toast.service.ts
new file mode 100644
index 0000000..a91ad3e
--- /dev/null
+++ b/src/lib/toast.service.ts
@@ -0,0 +1,29 @@
+import toast from 'react-hot-toast';
+import axios from 'axios';
+
+const success = (message: string) =>
+ toast.success(message, {
+ style: {
+ background: '#22c55e',
+ color: '#fff',
+ fontWeight: '500',
+ },
+ iconTheme: { primary: '#fff', secondary: '#22c55e' },
+ });
+
+const error = (error: unknown) => {
+ const msg = axios.isAxiosError(error)
+ ? error.response?.data?.message ?? 'Something went wrong'
+ : 'Something went wrong';
+
+ toast.error(msg, {
+ style: {
+ background: '#ef4444',
+ color: '#fff',
+ fontWeight: '500',
+ },
+ iconTheme: { primary: '#fff', secondary: '#ef4444' },
+ });
+};
+
+export const toastService = { success, error };
\ No newline at end of file