| import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
| import * as api from "@/api/services";
|
| import type { BookingStatus, KycStatus } from "@/api/types";
|
|
|
| const keys = {
|
| dashboard: ["dashboard"] as const,
|
| workers: (kyc?: KycStatus) => ["workers", kyc ?? "all"] as const,
|
| customers: ["customers"] as const,
|
| categories: ["categories"] as const,
|
| bookings: (status?: BookingStatus) => ["bookings", status ?? "all"] as const,
|
| reviews: ["reviews"] as const,
|
| };
|
|
|
|
|
| export const useDashboard = () =>
|
| useQuery({ queryKey: keys.dashboard, queryFn: api.fetchDashboard });
|
|
|
|
|
| export const useWorkers = (kyc?: KycStatus) =>
|
| useQuery({ queryKey: keys.workers(kyc), queryFn: () => api.fetchWorkers(kyc) });
|
|
|
| export function useVerifyWorker() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: ({ userId, approve }: { userId: number; approve: boolean }) =>
|
| api.verifyWorker(userId, approve),
|
| onSuccess: () => {
|
| qc.invalidateQueries({ queryKey: ["workers"] });
|
| qc.invalidateQueries({ queryKey: keys.dashboard });
|
| },
|
| });
|
| }
|
|
|
| export function useSuspendWorker() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: ({ userId, suspend }: { userId: number; suspend: boolean }) =>
|
| api.suspendWorker(userId, suspend),
|
| onSuccess: () => qc.invalidateQueries({ queryKey: ["workers"] }),
|
| });
|
| }
|
|
|
|
|
| export const useCustomers = () =>
|
| useQuery({ queryKey: keys.customers, queryFn: api.fetchCustomers });
|
|
|
| export function useBlockUser() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: ({ userId, suspend }: { userId: number; suspend: boolean }) =>
|
| api.blockUser(userId, suspend),
|
| onSuccess: () => qc.invalidateQueries({ queryKey: keys.customers }),
|
| });
|
| }
|
|
|
| export function useDeleteUser() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: (userId: number) => api.deleteUser(userId),
|
| onSuccess: () => {
|
| qc.invalidateQueries({ queryKey: keys.customers });
|
| qc.invalidateQueries({ queryKey: keys.dashboard });
|
| },
|
| });
|
| }
|
|
|
|
|
| export const useCategories = () =>
|
| useQuery({ queryKey: keys.categories, queryFn: api.fetchCategories });
|
|
|
| export function useCreateCategory() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: api.createCategory,
|
| onSuccess: () => qc.invalidateQueries({ queryKey: keys.categories }),
|
| });
|
| }
|
|
|
| export function useUpdateCategory() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: ({
|
| id,
|
| data,
|
| }: {
|
| id: number;
|
| data: { name?: string; icon?: string; is_active?: boolean };
|
| }) => api.updateCategory(id, data),
|
| onSuccess: () => qc.invalidateQueries({ queryKey: keys.categories }),
|
| });
|
| }
|
|
|
| export function useDeleteCategory() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: (id: number) => api.deleteCategory(id),
|
| onSuccess: () => qc.invalidateQueries({ queryKey: keys.categories }),
|
| });
|
| }
|
|
|
|
|
| export const useBookings = (status?: BookingStatus) =>
|
| useQuery({ queryKey: keys.bookings(status), queryFn: () => api.fetchBookings(status) });
|
|
|
| export function useUpdateBookingStatus() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: ({
|
| id,
|
| status,
|
| amount,
|
| }: {
|
| id: number;
|
| status: BookingStatus;
|
| amount?: number;
|
| }) => api.updateBookingStatus(id, status, amount),
|
| onSuccess: () => {
|
| qc.invalidateQueries({ queryKey: ["bookings"] });
|
| qc.invalidateQueries({ queryKey: keys.dashboard });
|
| },
|
| });
|
| }
|
|
|
| export function useApproveJob() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: ({ id, amount }: { id: number; amount: number }) =>
|
| api.approveJob(id, amount),
|
| onSuccess: () => {
|
| qc.invalidateQueries({ queryKey: ["bookings"] });
|
| qc.invalidateQueries({ queryKey: keys.dashboard });
|
| },
|
| });
|
| }
|
|
|
| export function useRejectJob() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: (id: number) => api.rejectJob(id),
|
| onSuccess: () => qc.invalidateQueries({ queryKey: ["bookings"] }),
|
| });
|
| }
|
|
|
| export function useAssignWorker() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: ({ bookingId, workerId }: { bookingId: number; workerId: number }) =>
|
| api.assignWorker(bookingId, workerId),
|
| onSuccess: () => qc.invalidateQueries({ queryKey: ["bookings"] }),
|
| });
|
| }
|
|
|
|
|
| export const useReviews = () =>
|
| useQuery({ queryKey: keys.reviews, queryFn: api.fetchReviews });
|
|
|
| export function useHideReview() {
|
| const qc = useQueryClient();
|
| return useMutation({
|
| mutationFn: ({ id, suspend }: { id: number; suspend: boolean }) =>
|
| api.hideReview(id, suspend),
|
| onSuccess: () => qc.invalidateQueries({ queryKey: keys.reviews }),
|
| });
|
| }
|
|
|