Files
EmployeeManagementSystem/src/hooks/useEmployees.ts

90 lines
2.3 KiB
TypeScript

import { useCallback, useEffect, useState } from "react";
import { api } from "../services/api";
import type { User } from "../types";
export const useEmployees = (
filters?: { role?: string; departmentId?: number },
) => {
const [employees, setEmployees] = useState<User[]>([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const fetchEmployees = useCallback(async () => {
setLoading(true);
setError(null);
try {
const data = await api.getUsers(filters);
setEmployees(data);
} catch (err: never) {
setError(err.message || "Failed to fetch employees");
console.error("Failed to fetch employees:", err);
} finally {
setLoading(false);
}
}, [filters]);
useEffect(() => {
fetchEmployees();
}, [fetchEmployees]);
const createEmployee = async (data: Omit<User, "id">) => {
setLoading(true);
setError(null);
try {
const newEmployee = await api.createUser(data);
await fetchEmployees(); // Refresh list
return newEmployee;
} catch (err: never) {
setError(err.message || "Failed to create employee");
console.error("Failed to create employee:", err);
throw err;
} finally {
setLoading(false);
}
};
const updateEmployee = async (
id: number,
data: Partial<Omit<User, "id">>,
) => {
setLoading(true);
setError(null);
try {
const updated = await api.updateUser(id, data);
await fetchEmployees(); // Refresh list
return updated;
} catch (err: never) {
setError(err.message || "Failed to update employee");
console.error("Failed to update employee:", err);
throw err;
} finally {
setLoading(false);
}
};
const deleteEmployee = async (id: number) => {
setLoading(true);
setError(null);
try {
await api.deleteUser(id);
await fetchEmployees(); // Refresh list
} catch (err: never) {
setError(err.message || "Failed to delete employee");
console.error("Failed to delete employee:", err);
throw err;
} finally {
setLoading(false);
}
};
return {
employees,
loading,
error,
refresh: fetchEmployees,
createEmployee,
updateEmployee,
deleteEmployee,
};
};