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( [`server-status-${server}`], fetchApiPost("/server/status", { name: server }), ); export const useServerMetrics = (server) => useQuery( [`server-metrics-${server}`], 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 useServerList = () => useQuery(["server-list"], fetchApi("/server/list")); export const useServerInstances = () => useQuery(["server-instances"], fetchApi("/server/instances"), { refetchInterval: 5000, }); export const useSystemAvailable = () => useQuery(["system-available"], fetchApi("/system/available")); export const useVersionList = () => useQuery(["minecraft-versions"], () => 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]); }; };