2025-06-01 15:43:11 +02:00
|
|
|
import axios, { AxiosError } from "axios";
|
2025-06-01 16:16:18 +02:00
|
|
|
import { useState, useEffect, useCallback } from "react";
|
|
|
|
|
import Cookies from "js-cookie";
|
2025-06-01 15:43:11 +02:00
|
|
|
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 = () => {
|
2025-06-01 16:16:18 +02:00
|
|
|
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);
|
2025-06-01 15:43:11 +02:00
|
|
|
});
|
2025-06-01 16:16:18 +02:00
|
|
|
}, [currentPage, itemPerPage, search]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
loadServers();
|
|
|
|
|
}, [loadServers]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
Cookies.set('servers-itemPerPage', itemPerPage.toString());
|
|
|
|
|
}, [itemPerPage]);
|
2025-06-01 15:43:11 +02:00
|
|
|
|
|
|
|
|
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';
|
|
|
|
|
});
|
|
|
|
|
};
|
2025-06-01 16:16:18 +02:00
|
|
|
|
|
|
|
|
const handlePageChange = (page: number) => setCurrentPage(page);
|
2025-06-01 15:43:11 +02:00
|
|
|
|
|
|
|
|
return {
|
2025-06-01 16:16:18 +02:00
|
|
|
servers,
|
|
|
|
|
loading,
|
|
|
|
|
currentPage,
|
|
|
|
|
itemPerPage,
|
|
|
|
|
total,
|
|
|
|
|
search,
|
|
|
|
|
setSearch,
|
|
|
|
|
handlePageChange,
|
|
|
|
|
setItemPerPage,
|
|
|
|
|
loadServers,
|
|
|
|
|
addServer
|
2025-06-01 15:43:11 +02:00
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default useServers;
|