|
|
|
@ -1,20 +1,18 @@
|
|
|
|
|
import { useMemo } from "react";
|
|
|
|
|
import { useMutation, useQuery, useQueryClient } from "react-query";
|
|
|
|
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
|
|
|
import { QueryKeys } from "@/apis/queries/keys";
|
|
|
|
|
import api from "@/apis/raw";
|
|
|
|
|
import { Environment } from "@/utilities";
|
|
|
|
|
import { setAuthenticated } from "@/utilities/event";
|
|
|
|
|
|
|
|
|
|
export function useBadges() {
|
|
|
|
|
return useQuery(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Badges],
|
|
|
|
|
() => api.badges.all(),
|
|
|
|
|
{
|
|
|
|
|
refetchOnWindowFocus: "always",
|
|
|
|
|
refetchInterval: 1000 * 60,
|
|
|
|
|
staleTime: 1000 * 10,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Badges],
|
|
|
|
|
queryFn: () => api.badges.all(),
|
|
|
|
|
refetchOnWindowFocus: "always",
|
|
|
|
|
refetchInterval: 1000 * 60,
|
|
|
|
|
staleTime: 1000 * 10,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useFileSystem(
|
|
|
|
@ -22,9 +20,10 @@ export function useFileSystem(
|
|
|
|
|
path: string,
|
|
|
|
|
enabled: boolean,
|
|
|
|
|
) {
|
|
|
|
|
return useQuery(
|
|
|
|
|
[QueryKeys.FileSystem, type, path],
|
|
|
|
|
() => {
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.FileSystem, type, path],
|
|
|
|
|
|
|
|
|
|
queryFn: () => {
|
|
|
|
|
if (type === "bazarr") {
|
|
|
|
|
return api.files.bazarr(path);
|
|
|
|
|
} else if (type === "radarr") {
|
|
|
|
@ -32,53 +31,63 @@ export function useFileSystem(
|
|
|
|
|
} else if (type === "sonarr") {
|
|
|
|
|
return api.files.sonarr(path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return [];
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
enabled,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
enabled,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystemSettings() {
|
|
|
|
|
return useQuery(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Settings],
|
|
|
|
|
() => api.system.settings(),
|
|
|
|
|
{
|
|
|
|
|
staleTime: Infinity,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Settings],
|
|
|
|
|
queryFn: () => api.system.settings(),
|
|
|
|
|
staleTime: Infinity,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSettingsMutation() {
|
|
|
|
|
const client = useQueryClient();
|
|
|
|
|
return useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Settings],
|
|
|
|
|
(data: LooseObject) => api.system.updateSettings(data),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries([QueryKeys.System]);
|
|
|
|
|
client.invalidateQueries([QueryKeys.Series]);
|
|
|
|
|
client.invalidateQueries([QueryKeys.Episodes]);
|
|
|
|
|
client.invalidateQueries([QueryKeys.Movies]);
|
|
|
|
|
client.invalidateQueries([QueryKeys.Wanted]);
|
|
|
|
|
client.invalidateQueries([QueryKeys.Badges]);
|
|
|
|
|
},
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Settings],
|
|
|
|
|
mutationFn: (data: LooseObject) => api.system.updateSettings(data),
|
|
|
|
|
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.System],
|
|
|
|
|
});
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.Series],
|
|
|
|
|
});
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.Episodes],
|
|
|
|
|
});
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.Movies],
|
|
|
|
|
});
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.Wanted],
|
|
|
|
|
});
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.Badges],
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useServerSearch(query: string, enabled: boolean) {
|
|
|
|
|
return useQuery(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Search, query],
|
|
|
|
|
() => api.system.search(query),
|
|
|
|
|
{
|
|
|
|
|
enabled,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Search, query],
|
|
|
|
|
queryFn: () => api.system.search(query),
|
|
|
|
|
enabled,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystemLogs() {
|
|
|
|
|
return useQuery([QueryKeys.System, QueryKeys.Logs], () => api.system.logs(), {
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Logs],
|
|
|
|
|
queryFn: () => api.system.logs(),
|
|
|
|
|
refetchOnWindowFocus: "always",
|
|
|
|
|
refetchInterval: 1000 * 60,
|
|
|
|
|
staleTime: 1000 * 10,
|
|
|
|
@ -87,171 +96,187 @@ export function useSystemLogs() {
|
|
|
|
|
|
|
|
|
|
export function useDeleteLogs() {
|
|
|
|
|
const client = useQueryClient();
|
|
|
|
|
return useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Logs],
|
|
|
|
|
() => api.system.deleteLogs(),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries([QueryKeys.System, QueryKeys.Logs]);
|
|
|
|
|
},
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Logs],
|
|
|
|
|
mutationFn: () => api.system.deleteLogs(),
|
|
|
|
|
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Logs],
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystemAnnouncements() {
|
|
|
|
|
return useQuery(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Announcements],
|
|
|
|
|
() => api.system.announcements(),
|
|
|
|
|
{
|
|
|
|
|
refetchOnWindowFocus: "always",
|
|
|
|
|
refetchInterval: 1000 * 60,
|
|
|
|
|
staleTime: 1000 * 10,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Announcements],
|
|
|
|
|
queryFn: () => api.system.announcements(),
|
|
|
|
|
refetchOnWindowFocus: "always",
|
|
|
|
|
refetchInterval: 1000 * 60,
|
|
|
|
|
staleTime: 1000 * 10,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystemAnnouncementsAddDismiss() {
|
|
|
|
|
const client = useQueryClient();
|
|
|
|
|
return useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Announcements],
|
|
|
|
|
(param: { hash: string }) => {
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Announcements],
|
|
|
|
|
|
|
|
|
|
mutationFn: (param: { hash: string }) => {
|
|
|
|
|
const { hash } = param;
|
|
|
|
|
return api.system.addAnnouncementsDismiss(hash);
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
onSuccess: (_, { hash }) => {
|
|
|
|
|
client.invalidateQueries([QueryKeys.System, QueryKeys.Announcements]);
|
|
|
|
|
client.invalidateQueries([QueryKeys.System, QueryKeys.Badges]);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
onSuccess: (_, { hash }) => {
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Announcements],
|
|
|
|
|
});
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Badges],
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystemTasks() {
|
|
|
|
|
return useQuery(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Tasks],
|
|
|
|
|
() => api.system.tasks(),
|
|
|
|
|
{
|
|
|
|
|
refetchOnWindowFocus: "always",
|
|
|
|
|
refetchInterval: 1000 * 60,
|
|
|
|
|
staleTime: 1000 * 10,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Tasks],
|
|
|
|
|
queryFn: () => api.system.tasks(),
|
|
|
|
|
refetchOnWindowFocus: "always",
|
|
|
|
|
refetchInterval: 1000 * 60,
|
|
|
|
|
staleTime: 1000 * 10,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useRunTask() {
|
|
|
|
|
const client = useQueryClient();
|
|
|
|
|
return useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Tasks],
|
|
|
|
|
(id: string) => api.system.runTask(id),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries([QueryKeys.System, QueryKeys.Tasks]);
|
|
|
|
|
client.invalidateQueries([QueryKeys.System, QueryKeys.Backups]);
|
|
|
|
|
},
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Tasks],
|
|
|
|
|
mutationFn: (id: string) => api.system.runTask(id),
|
|
|
|
|
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Tasks],
|
|
|
|
|
});
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystemBackups() {
|
|
|
|
|
return useQuery([QueryKeys.System, "backups"], () => api.system.backups());
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, "backups"],
|
|
|
|
|
queryFn: () => api.system.backups(),
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useCreateBackups() {
|
|
|
|
|
const client = useQueryClient();
|
|
|
|
|
return useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
() => api.system.createBackups(),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries([QueryKeys.System, QueryKeys.Backups]);
|
|
|
|
|
},
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
mutationFn: () => api.system.createBackups(),
|
|
|
|
|
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useRestoreBackups() {
|
|
|
|
|
const client = useQueryClient();
|
|
|
|
|
return useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
(filename: string) => api.system.restoreBackups(filename),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries([QueryKeys.System, QueryKeys.Backups]);
|
|
|
|
|
},
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
mutationFn: (filename: string) => api.system.restoreBackups(filename),
|
|
|
|
|
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useDeleteBackups() {
|
|
|
|
|
const client = useQueryClient();
|
|
|
|
|
return useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
(filename: string) => api.system.deleteBackups(filename),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries([QueryKeys.System, QueryKeys.Backups]);
|
|
|
|
|
},
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
mutationFn: (filename: string) => api.system.deleteBackups(filename),
|
|
|
|
|
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.invalidateQueries({
|
|
|
|
|
queryKey: [QueryKeys.System, QueryKeys.Backups],
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystemStatus() {
|
|
|
|
|
return useQuery([QueryKeys.System, "status"], () => api.system.status());
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, "status"],
|
|
|
|
|
queryFn: () => api.system.status(),
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystemHealth() {
|
|
|
|
|
return useQuery([QueryKeys.System, "health"], () => api.system.health());
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, "health"],
|
|
|
|
|
queryFn: () => api.system.health(),
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystemReleases() {
|
|
|
|
|
return useQuery([QueryKeys.System, "releases"], () => api.system.releases());
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: [QueryKeys.System, "releases"],
|
|
|
|
|
queryFn: () => api.system.releases(),
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSystem() {
|
|
|
|
|
const client = useQueryClient();
|
|
|
|
|
const { mutate: logout, isLoading: isLoggingOut } = useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Actions],
|
|
|
|
|
() => api.system.logout(),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
setAuthenticated(false);
|
|
|
|
|
client.clear();
|
|
|
|
|
},
|
|
|
|
|
const { mutate: logout, isPending: isLoggingOut } = useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Actions],
|
|
|
|
|
mutationFn: () => api.system.logout(),
|
|
|
|
|
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
setAuthenticated(false);
|
|
|
|
|
client.clear();
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const { mutate: login, isLoading: isLoggingIn } = useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Actions],
|
|
|
|
|
(param: { username: string; password: string }) =>
|
|
|
|
|
const { mutate: login, isPending: isLoggingIn } = useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Actions],
|
|
|
|
|
|
|
|
|
|
mutationFn: (param: { username: string; password: string }) =>
|
|
|
|
|
api.system.login(param.username, param.password),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
// TODO: Hard-coded value
|
|
|
|
|
window.location.replace(Environment.baseUrl);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
// TODO: Hard-coded value
|
|
|
|
|
window.location.replace(Environment.baseUrl);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const { mutate: shutdown, isLoading: isShuttingDown } = useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Actions],
|
|
|
|
|
() => api.system.shutdown(),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.clear();
|
|
|
|
|
},
|
|
|
|
|
const { mutate: shutdown, isPending: isShuttingDown } = useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Actions],
|
|
|
|
|
mutationFn: () => api.system.shutdown(),
|
|
|
|
|
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.clear();
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const { mutate: restart, isPending: isRestarting } = useMutation({
|
|
|
|
|
mutationKey: [QueryKeys.System, QueryKeys.Actions],
|
|
|
|
|
mutationFn: () => api.system.restart(),
|
|
|
|
|
|
|
|
|
|
const { mutate: restart, isLoading: isRestarting } = useMutation(
|
|
|
|
|
[QueryKeys.System, QueryKeys.Actions],
|
|
|
|
|
() => api.system.restart(),
|
|
|
|
|
{
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.clear();
|
|
|
|
|
},
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
client.clear();
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return useMemo(
|
|
|
|
|
() => ({
|
|
|
|
|