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([]); 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 | 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;