NAM-APJATEL/src/features/users/api/users.ts

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);
// });
// },
});
};