90 lines
2.3 KiB
TypeScript
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,
|
|
};
|
|
};
|