Tranga-Website/Website/App.tsx

132 lines
4.6 KiB
TypeScript
Raw Normal View History

import React, {useEffect, useState} from 'react';
2024-10-18 02:10:58 +02:00
import Footer from "./modules/Footer";
import Search from "./modules/Search";
import Header from "./modules/Header";
2024-10-18 19:46:17 +02:00
import MonitorJobsList from "./modules/MonitorJobsList";
import './styles/index.css'
import IFrontendSettings, {LoadFrontendSettings} from "./modules/interfaces/IFrontendSettings";
2024-10-20 20:12:27 +02:00
import {useCookies} from "react-cookie";
2024-10-18 02:10:58 +02:00
export default function App(){
2024-10-20 20:12:27 +02:00
const [, setCookie] = useCookies(['apiUri', 'jobInterval']);
const [connected, setConnected] = React.useState(false);
const [showSearch, setShowSearch] = React.useState(false);
const [frontendSettings, setFrontendSettings] = useState<IFrontendSettings>(LoadFrontendSettings());
2024-10-20 20:12:27 +02:00
const [updateInterval, setUpdateInterval] = React.useState<number>();
const [updateMonitorList, setUpdateMonitorList] = React.useState<Date>(new Date());
2024-10-20 20:12:27 +02:00
const apiUri = frontendSettings.apiUri;
2024-10-19 16:28:49 +02:00
2024-10-18 02:20:22 +02:00
useEffect(() => {
2024-10-20 20:12:27 +02:00
checkConnection(apiUri).then(res => setConnected(res)).catch(() => setConnected(false));
if(updateInterval === undefined){
setUpdateInterval(setInterval(() => {
checkConnection(apiUri).then(res => setConnected(res)).catch(() => setConnected(false));
}, 500));
}else{
clearInterval(updateInterval);
setUpdateInterval(undefined);
}
}, [frontendSettings]);
function ChangeSettings(settings: IFrontendSettings) {
setFrontendSettings(settings);
setCookie('apiUri', settings.apiUri);
setCookie('jobInterval', settings.jobInterval);
}
const UpdateList = () => {setUpdateMonitorList(new Date())}
2024-10-18 02:20:22 +02:00
return(<div>
2024-10-20 20:12:27 +02:00
<Header apiUri={apiUri} backendConnected={connected} settings={frontendSettings} changeSettings={ChangeSettings}/>
{connected
? <>
{showSearch
? <>
<Search apiUri={apiUri} jobInterval={frontendSettings.jobInterval} onJobsChanged={UpdateList} closeSearch={() => setShowSearch(false)} />
<hr/>
</>
: <></>}
<MonitorJobsList updateList={updateMonitorList} apiUri={apiUri} onStartSearch={() => setShowSearch(true)} onJobsChanged={UpdateList} connectedToBackend={connected} />
</>
2024-10-22 18:06:12 +02:00
: <>
<h1>No connection to the Backend.</h1>
<h3>Check the Settings ApiUri.</h3>
</>}
2024-10-20 20:12:27 +02:00
<Footer apiUri={apiUri} connectedToBackend={connected} />
2024-10-18 02:20:22 +02:00
</div>)
2024-10-18 02:10:58 +02:00
}
export function getData(uri: string) : Promise<object> {
2024-10-18 02:10:58 +02:00
return fetch(uri,
{
method: 'GET',
2024-10-18 02:10:58 +02:00
headers : {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
})
.then(function(response){
if(!response.ok) throw new Error("Could not fetch data");
return response.json();
})
.catch(function(err){
console.error(`Error GETting Data ${uri}\n${err}`);
return Promise.reject();
});
}
export function postData(uri: string, content: object) : Promise<object> {
return fetch(uri,
{
method: 'POST',
headers : {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify(content)
})
.then(function(response){
if(!response.ok)
throw new Error("Could not fetch data");
let json = response.json();
return json.then((json) => json).catch(() => null);
})
.catch(function(err){
console.error(`Error POSTing Data ${uri}\n${err}`);
return Promise.reject();
});
}
export function deleteData(uri: string) : Promise<void> {
return fetch(uri,
{
method: 'DELETE',
headers : {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
})
.then(() =>{
return Promise.resolve();
})
.catch(function(err){
console.error(`Error DELETEing Data ${uri}\n${err}`);
return Promise.reject();
2024-10-18 02:10:58 +02:00
});
}
export function isValidUri(uri: string) : boolean{
try {
new URL(uri);
return true;
} catch (err) {
return false;
}
}
2024-10-20 20:12:27 +02:00
export const checkConnection = async (apiUri: string): Promise<boolean> =>{
return getData(`${apiUri}/v2/Ping`).then((result) => {
return result != null;
}).catch(() => Promise.reject());
2024-10-18 02:10:58 +02:00
}