167 lines
4.6 KiB
TypeScript
167 lines
4.6 KiB
TypeScript
import { useState, useEffect, useCallback } from 'react';
|
|
import inspectionService, {
|
|
type Inspection,
|
|
type InspectionListParams,
|
|
type CreateInspectionData,
|
|
} from '../services/inspectionService';
|
|
|
|
interface UseInspectionListResult {
|
|
inspections: Inspection[];
|
|
loading: boolean;
|
|
error: string | null;
|
|
totalCount: number;
|
|
refetch: () => void;
|
|
}
|
|
|
|
interface UseInspectionDetailsResult {
|
|
inspection: Inspection | null;
|
|
loading: boolean;
|
|
error: string | null;
|
|
refetch: () => void;
|
|
}
|
|
|
|
interface UseInspectionMutationsResult {
|
|
createInspection: (data: CreateInspectionData) => Promise<Inspection>;
|
|
updateInspection: (name: string, data: Partial<CreateInspectionData>) => Promise<Inspection>;
|
|
deleteInspection: (name: string) => Promise<void>;
|
|
loading: boolean;
|
|
error: string | null;
|
|
}
|
|
|
|
// Hook for fetching inspection list
|
|
export function useInspectionList(params: InspectionListParams = {}): UseInspectionListResult {
|
|
const [inspections, setInspections] = useState<Inspection[]>([]);
|
|
const [loading, setLoading] = useState(true);
|
|
const [error, setError] = useState<string | null>(null);
|
|
const [totalCount, setTotalCount] = useState(0);
|
|
|
|
const fetchInspections = useCallback(async () => {
|
|
try {
|
|
setLoading(true);
|
|
setError(null);
|
|
|
|
// Fetch inspections and count in parallel
|
|
const [listResponse, count] = await Promise.all([
|
|
inspectionService.getInspections(params),
|
|
inspectionService.getInspectionCount(params.filters || {})
|
|
]);
|
|
|
|
setInspections(listResponse.data);
|
|
setTotalCount(count);
|
|
} catch (err) {
|
|
const errorMessage = err instanceof Error ? err.message : 'Failed to fetch inspections';
|
|
setError(errorMessage);
|
|
console.error('Error fetching inspections:', err);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, [JSON.stringify(params)]);
|
|
|
|
useEffect(() => {
|
|
fetchInspections();
|
|
}, [fetchInspections]);
|
|
|
|
return {
|
|
inspections,
|
|
loading,
|
|
error,
|
|
totalCount,
|
|
refetch: fetchInspections
|
|
};
|
|
}
|
|
|
|
// Hook for fetching single inspection details
|
|
export function useInspectionDetails(name: string | null): UseInspectionDetailsResult {
|
|
const [inspection, setInspection] = useState<Inspection | null>(null);
|
|
const [loading, setLoading] = useState(true);
|
|
const [error, setError] = useState<string | null>(null);
|
|
|
|
const fetchInspection = useCallback(async () => {
|
|
if (!name) {
|
|
setLoading(false);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
setLoading(true);
|
|
setError(null);
|
|
const data = await inspectionService.getInspection(name);
|
|
setInspection(data);
|
|
} catch (err) {
|
|
const errorMessage = err instanceof Error ? err.message : 'Failed to fetch inspection';
|
|
setError(errorMessage);
|
|
console.error('Error fetching inspection:', err);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, [name]);
|
|
|
|
useEffect(() => {
|
|
fetchInspection();
|
|
}, [fetchInspection]);
|
|
|
|
return {
|
|
inspection,
|
|
loading,
|
|
error,
|
|
refetch: fetchInspection
|
|
};
|
|
}
|
|
|
|
// Hook for inspection mutations (create, update, delete)
|
|
export function useInspectionMutations(): UseInspectionMutationsResult {
|
|
const [loading, setLoading] = useState(false);
|
|
const [error, setError] = useState<string | null>(null);
|
|
|
|
const createInspection = async (data: CreateInspectionData): Promise<Inspection> => {
|
|
try {
|
|
setLoading(true);
|
|
setError(null);
|
|
const result = await inspectionService.createInspection(data);
|
|
return result;
|
|
} catch (err) {
|
|
const errorMessage = err instanceof Error ? err.message : 'Failed to create inspection';
|
|
setError(errorMessage);
|
|
throw err;
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
const updateInspection = async (name: string, data: Partial<CreateInspectionData>): Promise<Inspection> => {
|
|
try {
|
|
setLoading(true);
|
|
setError(null);
|
|
const result = await inspectionService.updateInspection(name, data);
|
|
return result;
|
|
} catch (err) {
|
|
const errorMessage = err instanceof Error ? err.message : 'Failed to update inspection';
|
|
setError(errorMessage);
|
|
throw err;
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
const deleteInspection = async (name: string): Promise<void> => {
|
|
try {
|
|
setLoading(true);
|
|
setError(null);
|
|
await inspectionService.deleteInspection(name);
|
|
} catch (err) {
|
|
const errorMessage = err instanceof Error ? err.message : 'Failed to delete inspection';
|
|
setError(errorMessage);
|
|
throw err;
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
return {
|
|
createInspection,
|
|
updateInspection,
|
|
deleteInspection,
|
|
loading,
|
|
error
|
|
};
|
|
} |