refactor: modularize road management modules

This commit is contained in:
2026-06-17 13:31:25 +05:30
parent 9bb740e446
commit 182d4ac293
41 changed files with 2386 additions and 1894 deletions

View File

@@ -0,0 +1,65 @@
'use client';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useMemo } from 'react';
import { toast } from 'sonner';
import { chainageService, packageService, projectService } from '@/services/api';
import type { Chainage, PaginationParams } from '@/types';
import { segmentKeys } from '../queries/segmentKeys';
interface UseSegmentsQueryParams {
skip: number;
limit: number;
}
export function useSegmentsQuery({ skip, limit }: UseSegmentsQueryParams) {
const listParams = useMemo<PaginationParams>(() => ({ skip, limit }), [limit, skip]);
return useQuery({
queryKey: segmentKeys.list(listParams),
queryFn: () => chainageService.getChainages(listParams),
});
}
export function useProjectOptionsQuery() {
return useQuery({
queryKey: ['projects', 'options'],
queryFn: () => projectService.getProjects({ skip: 0, limit: 1000 }),
});
}
export function useAllPackageOptionsQuery() {
return useQuery({
queryKey: ['packages', 'options'],
queryFn: () => packageService.getPackages({ skip: 0, limit: 1000 }),
});
}
export function usePackagesByProjectQuery(projectId: string, enabled: boolean) {
return useQuery({
queryKey: ['packages', 'by-project', projectId],
queryFn: () => packageService.getPackagesByProject(projectId, { skip: 0, limit: 1000 }),
enabled: enabled && Boolean(projectId),
});
}
export function useDeleteSegmentMutation() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (segment: Chainage) => chainageService.deleteChainage(segment.id),
onSuccess: (_data, segment) => {
toast.success('Segment deleted', {
description: `${segment.segment_name} has been removed from the system.`,
});
queryClient.invalidateQueries({ queryKey: segmentKeys.all });
},
onError: () => {
toast.error('Deletion failed', {
description: 'The segment could not be removed. Please try again.',
});
},
});
}