CoreControl/hooks/useServers.ts
2025-06-01 16:16:18 +02:00

88 lines
2.3 KiB
TypeScript

import axios, { AxiosError } from "axios";
import { useState, useEffect, useCallback } from "react";
import Cookies from "js-cookie";
interface Server {
id: number;
networkId: number;
name: string;
description?: string;
icon?: string;
ipv4Address?: string;
osDetails?: string;
cpuDetails?: string;
gpuDetails?: string;
memoryDetails?: string;
storageDetails?: string;
monitoring: boolean;
monitoringUrl?: string;
managementUrl?: string;
applications?: any[];
virtualMachines?: any[];
}
interface AddServer {
networkId: number;
name: string;
description?: string;
icon?: string;
}
const useServers = () => {
const [servers, setServers] = useState<Server[]>([]);
const [loading, setLoading] = useState(false);
const [currentPage, setCurrentPage] = useState(1);
const [itemPerPage, setItemPerPage] = useState(() => {
const savedValue = Cookies.get('servers-itemPerPage');
return savedValue ? parseInt(savedValue, 10) : 5;
});
const [total, setTotal] = useState(0);
const [search, setSearch] = useState("");
const loadServers = useCallback(() => {
setLoading(true);
axios.get('/api/servers/get_all', {
params: { currentPage, itemPerPage, search }
}).then((response) => {
setServers(response.data.servers);
setTotal(response.data.total);
setLoading(false);
});
}, [currentPage, itemPerPage, search]);
useEffect(() => {
loadServers();
}, [loadServers]);
useEffect(() => {
Cookies.set('servers-itemPerPage', itemPerPage.toString());
}, [itemPerPage]);
const addServer = (server: AddServer): Promise<Server> | string => {
return axios.post('/api/servers/add', server)
.then((response) => {
return response.data.server;
})
.catch(err => {
throw err.response?.data?.error || 'Failed to add server';
});
};
const handlePageChange = (page: number) => setCurrentPage(page);
return {
servers,
loading,
currentPage,
itemPerPage,
total,
search,
setSearch,
handlePageChange,
setItemPerPage,
loadServers,
addServer
};
};
export default useServers;