From 966ba99fad667f7ee8a95ddcfe4ea6550edbb2eb Mon Sep 17 00:00:00 2001 From: John Wesley Date: Tue, 16 Jul 2024 13:28:46 -0400 Subject: [PATCH] Add warning for outdated servers and for "No API" servers --- src/components/Chip.tsx | 9 ++++++- src/components/ui/tooltip.tsx | 34 +++++++++++++++++++++++++ src/initdata.js | 48 ++++++++++++++++++++++++++++++++++- src/routes/releases.tsx | 6 +++++ src/routes/servers.tsx | 44 +++++++++++++++++++++++++++++--- 5 files changed, 136 insertions(+), 5 deletions(-) create mode 100644 src/components/ui/tooltip.tsx create mode 100644 src/routes/releases.tsx diff --git a/src/components/Chip.tsx b/src/components/Chip.tsx index b7d1315..f5dc333 100644 --- a/src/components/Chip.tsx +++ b/src/components/Chip.tsx @@ -4,10 +4,17 @@ import { Dynamic } from 'solid-js/web'; const Chip: ParentComponent<{ icon?: (props: ComponentProps<'svg'>) => JSX.Element; title?: string; + class?: string; + classList?: { + [k: string]: boolean | undefined; + }; }> = (props) => { return ( diff --git a/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..becfefa --- /dev/null +++ b/src/components/ui/tooltip.tsx @@ -0,0 +1,34 @@ +import { splitProps, ValidComponent, type Component } from "solid-js" + +import { PolymorphicProps } from "@kobalte/core/polymorphic" +import * as TooltipPrimitive from "@kobalte/core/tooltip" + +import { cn } from "~/lib/utils" + +const TooltipTrigger = TooltipPrimitive.Trigger + +const Tooltip: Component = (props) => { + return +} + +type TooltipContentProps = + TooltipPrimitive.TooltipContentProps & { class?: string | undefined } + +const TooltipContent = ( + props: PolymorphicProps> +) => { + const [local, others] = splitProps(props as TooltipContentProps, ["class"]) + return ( + + + + ) +} + +export { Tooltip, TooltipTrigger, TooltipContent } diff --git a/src/initdata.js b/src/initdata.js index 1a1b234..4eaac72 100644 --- a/src/initdata.js +++ b/src/initdata.js @@ -3,6 +3,28 @@ import fs from 'node:fs/promises'; await fs.rm('./.output/data', { recursive: true, force: true }); await fs.mkdir('./.output/data', { recursive: true }); +/** @returns {Promise>} */ +const fetchReleases = async () => { + const releasesJson = await ( + await fetch( + 'https://api.github.com/repos/mbinOrg/mbin/releases?per_page=100', + ) + ).json(); + + /** @type {Array} */ + const output = releasesJson.map((v) => ({ + version: v.tag_name.substring(1), + publishedAt: v.published_at, + githubUrl: v.html_url, + body: v.body, + })); + + return output.sort((a, b) => a.publishedAt - b.publishedAt); +}; + +const releases = await fetchReleases(); +fs.writeFile('./.output/data/releases.json', JSON.stringify(releases), 'utf8'); + /** * @returns {Promise} */ @@ -119,10 +141,34 @@ const fetchServerInfo = async (domain) => { ); } + const version = jsonNodeInfo.software.version; + + // A server is considered outdated if a newer version has been available for more than 30 days. + const releaseIndex = releases.findIndex((v) => v.version === version); + console.log( + releaseIndex, + version, + releases[releaseIndex].version, + releases[releaseIndex].publishedAt, + ); + if (releaseIndex > 0) { + console.log( + Date.now() - Date.parse(releases[releaseIndex - 1].publishedAt), + releases[releaseIndex - 1].publishedAt, + Date.now() - Date.parse(releases[releaseIndex - 1].publishedAt) > + 1000 * 60 * 60 * 24 * 30, + ); + } + const versionOutdated = + releaseIndex > 0 && + Date.now() - Date.parse(releases[releaseIndex - 1].publishedAt) > + 1000 * 60 * 60 * 24 * 30; + /** @type {import('./routes/servers').Server} */ const output = { domain: domain, - version: jsonNodeInfo.software.version, + version: version, + versionOutdated: versionOutdated, name: jsonNodeInfo.metadata.nodeName, description: jsonNodeInfo.metadata.nodeDescription, openRegistrations: jsonNodeInfo.openRegistrations, diff --git a/src/routes/releases.tsx b/src/routes/releases.tsx new file mode 100644 index 0000000..ee008be --- /dev/null +++ b/src/routes/releases.tsx @@ -0,0 +1,6 @@ +export interface Release { + version: string; + publishedAt: string; + githubUrl: string; + body: string; +} diff --git a/src/routes/servers.tsx b/src/routes/servers.tsx index 21fd5f3..d383ac3 100644 --- a/src/routes/servers.tsx +++ b/src/routes/servers.tsx @@ -23,6 +23,7 @@ import MaterialSymbolsPerson from '~icons/material-symbols/person'; import MaterialSymbolsPersonCheck from '~icons/material-symbols/person-check'; import MaterialSymbolsNews from '~icons/material-symbols/news'; import MaterialSymbolsComment from '~icons/material-symbols/comment'; +import MaterialSymbolsWarning from '~icons/material-symbols/warning'; import { Select, SelectContent, @@ -32,12 +33,18 @@ import { } from '~/components/ui/select'; import { Checkbox } from '~/components/ui/checkbox'; import { Label } from '~/components/ui/label'; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '~/components/ui/tooltip'; const servers = serversJson as Server[]; export interface Server { domain: string; version: string; + versionOutdated: boolean; name: string; description: string; openRegistrations: boolean; @@ -179,7 +186,39 @@ export default function ServersPage() { {(server) => { const StatChips = () => ( <> - Mbin {server.version} + + Mbin {server.version} + + + + + + + This server is using an outdated version. Please ask the + server admin to upgrade or use a different server. + + + + + + + + + No API + + + + + This server's api is inaccessible and will not work with + apps. Please ask the server admin to fix the issue or use + a different server. + + + {languageNames.of(server.api!.defaultLang)} @@ -262,8 +301,7 @@ export default function ServersPage() { when={server.api} fallback={
- No information available. This server's api is - inaccessible and it's not recommended to use. + No information available due to inaccessible api.
} >