import { AxiosInstance } from "axios" import { ActionGroup, ActionInfo, DataTable, UserInfoContext, actionIdentifierContext, api, apiAuthenticatedContext} from "./common" import React, { Context, Dispatch, createContext, useContext, useEffect, useState } from "react" import { TableRow, TableCell, Chip } from "@mui/material" import { ImageInfo, ServerInfo } from "./interfaces" import { JSONSchema7 } from "json-schema" import { CREATE_SERVER_ACTION, Permission, SERVER_ACTIONS } from "./actions" export async function loadServers(api: AxiosInstance): Promise<{ status: number, data: ServerInfo[] }> { let response = await api.get('/servers') return { status: response.status, data: response.data } } const serverActionsContext: Context = createContext([] as ActionInfo[]) function ServerItem(props: { server_info: ServerInfo }) { const actions = useContext(serverActionsContext) const [serverPermissions, setServerPermissions] = useState(null as null|number) const user = useContext(UserInfoContext) let permissions = 0 console.log(user) if (props.server_info.OwnerId === user?.Username){ permissions |= Permission.Admin }else{ if (serverPermissions === null){ api.get(`/servers/${props.server_info.Id}/permissions`).then((event)=>{setServerPermissions(event.data)}) }else{ permissions |= serverPermissions } if (user){ permissions |= user.Permissions } } const name = `${props.server_info.OwnerId}'s ${props.server_info.Image.Name} ${props.server_info.Image.Version} Server` if (props.server_info.Ports === null) { props.server_info.Ports = [] } return ( {props.server_info.Nickname} {props.server_info.OwnerId} {props.server_info.Image.Name} {props.server_info.Image.Version} {props.server_info.Domain} {props.server_info.Ports.map((port, index, array) => { return })} ) } export default function ServersBoard() { const [servers, setServers]: [ServerInfo[], Dispatch] = useState([] as ServerInfo[]); const [apiAuthenticated, setApiAuthenticated] = useContext(apiAuthenticatedContext) function handleServers() { if (!apiAuthenticated) { return } let servers_promised = loadServers(api) servers_promised.then((response) => { setServers(response.data) }) .catch( (error) => { console.log('Failed to get servers: ' + error); if (error.response) { if (error.response.status === 401) { setApiAuthenticated(false) } else if (error.response.status === 403) { setApiAuthenticated(false) } } } ) } useEffect(() => { handleServers() const interval = setInterval(() => { handleServers() }, 5000 ); return () => { clearInterval(interval) } }, [apiAuthenticated]) return ( { servers.sort((s1: ServerInfo, s2: ServerInfo) => { return s1.Id < s2.Id ? 0 : 1 }).map( (value: ServerInfo, index: number, array) => { return } ) } ); }