128 lines
3.6 KiB
TypeScript
128 lines
3.6 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
import { apiClient, ApiResponse } from '../../../lib/api-client';
|
|
// import { toast } from 'react-hot-toast';
|
|
|
|
// Tipe untuk model User
|
|
export interface User {
|
|
id: string;
|
|
name: string;
|
|
email: string;
|
|
role: string;
|
|
created_at: string;
|
|
updated_at: string;
|
|
}
|
|
|
|
// Fungsi untuk mendapatkan daftar pengguna
|
|
export const getUsers = async (): Promise<User[]> => {
|
|
const response = await apiClient.get<ApiResponse<User[]>>('/users');
|
|
return response.data.data || [];
|
|
};
|
|
|
|
// Hook untuk query daftar pengguna
|
|
export const useUsers = () => {
|
|
return useQuery({
|
|
queryKey: ['users'],
|
|
queryFn: getUsers,
|
|
});
|
|
};
|
|
|
|
// Fungsi untuk mendapatkan detail pengguna
|
|
export const getUser = async (id: string): Promise<User> => {
|
|
const response = await apiClient.get<ApiResponse<User>>(`/users/${id}`);
|
|
if (!response.data.data) {
|
|
throw new Error('User not found');
|
|
}
|
|
return response.data.data;
|
|
};
|
|
|
|
// Hook untuk query detail pengguna
|
|
export const useUser = (id: string) => {
|
|
return useQuery({
|
|
queryKey: ['users', id],
|
|
queryFn: () => getUser(id),
|
|
enabled: !!id,
|
|
});
|
|
};
|
|
|
|
// Interface untuk data pembuatan atau pembaruan pengguna
|
|
export interface UserFormData {
|
|
name: string;
|
|
email: string;
|
|
password?: string;
|
|
role: string;
|
|
}
|
|
|
|
// Fungsi untuk membuat pengguna baru
|
|
export const createUser = async (userData: UserFormData): Promise<User> => {
|
|
const response = await apiClient.post<ApiResponse<User>>('/users', userData);
|
|
return response.data.data!;
|
|
};
|
|
|
|
// Hook untuk mutasi pembuatan pengguna
|
|
export const useCreateUser = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: createUser,
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['users'] });
|
|
// toast.success('Pengguna berhasil dibuat');
|
|
},
|
|
// onError: (error: unknown) => {
|
|
// const errors = extractApiErrors(error);
|
|
// Object.values(errors).forEach((message) => {
|
|
// // toast.error(message);
|
|
// });
|
|
// },
|
|
});
|
|
};
|
|
|
|
// Fungsi untuk memperbarui pengguna
|
|
export const updateUser = async ({ id, data }: { id: string; data: UserFormData }): Promise<User> => {
|
|
const response = await apiClient.put<ApiResponse<User>>(`/users/${id}`, data);
|
|
return response.data.data!;
|
|
};
|
|
|
|
// Hook untuk mutasi pembaruan pengguna
|
|
export const useUpdateUser = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: updateUser,
|
|
onSuccess: (data) => {
|
|
queryClient.invalidateQueries({ queryKey: ['users'] });
|
|
queryClient.invalidateQueries({ queryKey: ['users', data.id] });
|
|
// toast.success('Pengguna berhasil diperbarui');
|
|
},
|
|
// onError: (error: unknown) => {
|
|
// const errors = extractApiErrors(error);
|
|
// Object.values(errors).forEach((message) => {
|
|
// // toast.error(message);
|
|
// });
|
|
// },
|
|
});
|
|
};
|
|
|
|
// Fungsi untuk menghapus pengguna
|
|
export const deleteUser = async (id: string): Promise<void> => {
|
|
await apiClient.delete<ApiResponse<null>>(`/users/${id}`);
|
|
};
|
|
|
|
// Hook untuk mutasi penghapusan pengguna
|
|
export const useDeleteUser = () => {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: deleteUser,
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['users'] });
|
|
// toast.success('Pengguna berhasil dihapus');
|
|
},
|
|
// onError: (error: unknown) => {
|
|
// const errors = extractApiErrors(error);
|
|
// Object.values(errors).forEach((message) => {
|
|
// // toast.error(message);
|
|
// });
|
|
// },
|
|
});
|
|
}; |