Use DataHandlers for tokens too

This commit is contained in:
Taevas 2025-03-01 17:31:03 +01:00
parent 2363d42c15
commit aecb5051ae
3 changed files with 16 additions and 43 deletions

View file

@ -1,7 +1,7 @@
import React, {useState, useEffect} from "react";
/** Takes care of getting data regularly */
export default function DataHandler<T extends unknown | undefined>(url: string, updateEveryXSeconds: number) {
export default function DataHandler<T extends unknown | undefined>(url: string, updateEveryXSeconds: number, expectData = true) {
const [data, setData]: [T | undefined, React.Dispatch<React.SetStateAction<T | undefined>>] = useState();
const [error, setError] = useState(false);
const [count, setCount] = useState(0);
@ -9,7 +9,9 @@ export default function DataHandler<T extends unknown | undefined>(url: string,
// Try to get and set data
const updateData = async () => {
try {
setData(await fetch(url).then(async r => r.json()));
const response = await fetch(url);
if (!response.ok) {throw "failed";};
setData(expectData ? await response.json() : true);
setError(false);
} catch {
setError(true);

View file

@ -3,37 +3,21 @@ import Info from "../Info.js";
import Osu from "./Osu.js";
import { Ruleset } from "osu-api-v2-js";
import DataHandler from "#Infos/DataHandler.js";
export default function RhythmGames() {
const [token, setToken] = useState(false);
const {data, error} = DataHandler<boolean>("/.netlify/functions/token?service=osu", 60 * 60 * 8, false);
const [websites, setWebsites] = useState([] as React.JSX.Element[]);
const [error, setError] = useState(false);
const getToken = async () => {
await fetch("/.netlify/functions/token?service=osu").then((r) => {
if (r.ok) {
setToken(true);
} else {
setError(true);
}
});
};
useEffect(() => {
getToken().catch(() => {
setError(true);
});
}, []);
useEffect(() => {
if (token) {
if (data) {
const osu = <Osu ruleset={Ruleset.osu} key={"osu"}/>;
const taiko = <Osu ruleset={Ruleset.taiko} key={"taiko"}/>;
const fruits = <Osu ruleset={Ruleset.fruits} key={"fruits"}/>;
const mania = <Osu ruleset={Ruleset.mania} key={"mania"}/>;
setWebsites([osu, taiko, fruits, mania]);
}
}, [token]);
}, [data]);
return (
<Info

View file

@ -1,40 +1,27 @@
import React, {useEffect, useState} from "react";
import Info from "../Info.js";
import Umami from "./Umami.js";
import DataHandler from "#Infos/DataHandler.js";
export default function Website() {
const [token, setToken] = useState(false);
const {data} = DataHandler<boolean>("/.netlify/functions/token?service=umami", 60 * 60 * 8, false);
const [websites, setWebsites] = useState([] as React.JSX.Element[]);
const [error, setError] = useState(false);
const getToken = async () => {
await fetch("/.netlify/functions/token?service=umami").then((r) => {
if (r.ok) {
setToken(true);
} else {
setError(true);
}
});
};
// useEffect(() => {
// setWebsites([<aWebsite key={"awebsite"}/>]);
// }, []);
useEffect(() => {
getToken().catch(() => {
setError(true);
});
}, []);
useEffect(() => {
if (token) {
if (data) {
const umami = <Umami key={"umami"}/>;
setWebsites([umami]);
setWebsites(websites.concat([umami]));
}
}, [token]);
}, [data]);
return (
<Info
type="Website"
websites={websites}
error={error}
/>
);
}