import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import * as appVersionService from "@/services/app-version.service"; import type { AxiosProgressEvent } from "axios"; import type { Version } from "@/types/file"; const APP_VERSION_QUERY_KEYS = { all: ["app-version"] as const, agentVersion: () => [...APP_VERSION_QUERY_KEYS.all, "agent"] as const, softwareList: () => [...APP_VERSION_QUERY_KEYS.all, "software"] as const, blacklist: () => [...APP_VERSION_QUERY_KEYS.all, "blacklist"] as const, requiredFiles: () => [...APP_VERSION_QUERY_KEYS.all, "required-files"] as const, }; /** * Hook để lấy danh sách phiên bản agent */ export function useGetAgentVersion(enabled = true) { return useQuery({ queryKey: APP_VERSION_QUERY_KEYS.agentVersion(), queryFn: () => appVersionService.getAgentVersion(), enabled, staleTime: 60 * 1000, // 1 minute }); } /** * Hook để lấy danh sách phần mềm */ export function useGetSoftwareList(enabled = true) { return useQuery({ queryKey: APP_VERSION_QUERY_KEYS.softwareList(), queryFn: () => appVersionService.getSoftwareList(), enabled, staleTime: 60 * 1000, }); } /** * Hook để upload file */ export function useUploadSoftware() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: { formData: FormData; onUploadProgress?: (progressEvent: AxiosProgressEvent) => void; }) => appVersionService.uploadSoftware(data.formData, data.onUploadProgress), onSuccess: () => { // Invalidate software list queryClient.invalidateQueries({ queryKey: APP_VERSION_QUERY_KEYS.softwareList(), }); }, }); } /** * Hook để lấy danh sách blacklist */ export function useGetBlacklist(enabled = true) { return useQuery({ queryKey: APP_VERSION_QUERY_KEYS.blacklist(), queryFn: () => appVersionService.getBlacklist(), enabled, staleTime: 60 * 1000, }); } /** * Hook để thêm vào blacklist */ export function useAddBlacklist() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: any) => appVersionService.addBlacklist(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: APP_VERSION_QUERY_KEYS.blacklist(), }); }, }); } /** * Hook để xóa khỏi blacklist */ export function useDeleteBlacklist() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (appId: number) => appVersionService.deleteBlacklist(appId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: APP_VERSION_QUERY_KEYS.blacklist(), }); }, }); } /** * Hook để cập nhật blacklist */ export function useUpdateBlacklist() { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ appId, data }: { appId: string; data: any }) => appVersionService.updateBlacklist(appId, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: APP_VERSION_QUERY_KEYS.blacklist(), }); }, }); } /** * Hook để yêu cầu cập nhật blacklist */ export function useRequestUpdateBlacklist() { return useMutation({ mutationFn: (data: any) => appVersionService.requestUpdateBlacklist(data), }); } /** * Hook để lấy danh sách file bắt buộc */ export function useGetRequiredFiles(enabled = true) { return useQuery({ queryKey: APP_VERSION_QUERY_KEYS.requiredFiles(), queryFn: () => appVersionService.getRequiredFiles(), enabled, staleTime: 60 * 1000, }); } /** * Hook để thêm file bắt buộc */ export function useAddRequiredFile() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: any) => appVersionService.addRequiredFile(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: APP_VERSION_QUERY_KEYS.requiredFiles(), }); }, }); } /** * Hook để xóa file bắt buộc */ export function useDeleteRequiredFile() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: { MsiFileIds: number[] }) => appVersionService.deleteRequiredFile(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: APP_VERSION_QUERY_KEYS.requiredFiles(), }); }, }); } /** * Hook để xóa file */ export function useDeleteFile() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (fileId: number) => appVersionService.deleteFile(fileId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: APP_VERSION_QUERY_KEYS.softwareList(), }); }, }); }