import { useQuery, useQueryClient } from "@tanstack/react-query"; const fetchApi = (subPath) => async () => fetch(`/api${subPath}`).then((res) => res.json()); const fetchApiPost = (subPath, json) => async () => fetch(`/api${subPath}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(json), }).then((res) => res.json()); export const useServerStatus = (server) => useQuery({ queryKey: [`server-status-${server}`], queryFn: fetchApiPost("/server/status", { name: server }), }); export const useServerMetrics = (server) => useQuery({ queryKey: [`server-metrics-${server}`], queryFn: fetchApiPost("/server/metrics", { name: server }), refetchInterval: 10000, }); export const useStartServer = (server) => postJsonApi("/server/start", { name: server }, "server-instances"); export const useStopServer = (server) => postJsonApi("/server/stop", { name: server }, "server-instances"); export const useDeleteServer = (server) => postJsonApi("/server/delete", { name: server }, "server-instances", "DELETE"); export const useCreateServer = (spec) => postJsonApi("/server/create", spec, "server-list"); export const getServerFiles = async (server, dir) => fetchApiPost("/files/list", { name: server, dir })(); export const useInvalidator = () => { const qc = useQueryClient(); return (q) => qc.invalidateQueries([q]); }; export const useServerList = () => useQuery({ queryKey: ["server-list"], queryFn: fetchApi("/server/list") }); export const useServerInstances = () => useQuery({ queryKey: ["server-instances"], queryFn: fetchApi("/server/instances"), refetchInterval: 5000, }); export const useSystemAvailable = () => useQuery({ queryKey: ["system-available"], queryFn: fetchApi("/system/available"), }); export const useVersionList = () => useQuery({ queryKey: ["minecraft-versions"], queryFn: () => fetch( "https://piston-meta.mojang.com/mc/game/version_manifest.json", ).then((r) => r.json()), }); const postJsonApi = (subPath, body, invalidate, method = "POST") => { const qc = useQueryClient(); return async () => { const res = await fetch(`/api${subPath}`, { method, headers: { "Content-Type": "application/json", }, body: JSON.stringify(body), }); qc.invalidateQueries([invalidate]); return res.json(); }; };