dgate 2.1.0

DGate API Gateway - High-performance API gateway with JavaScript module support
Documentation
// create a component that fetches the latest release from a Github repository
// using this url: https://api.github.com/repos/dgate-io/dgate/releases/latest

import { Text } from "@chakra-ui/react";
import { Spinner } from "@chakra-ui/spinner";
import React, { PropsWithChildren, useEffect } from "react";
import { useState } from "react";

interface Release {
    url:              string;
    assets_url:       string;
    upload_url:       string;
    html_url:         string;
    id:               number;
    tag_name:         string;
    name:             string;
    draft:            boolean;
    prerelease:       boolean;
    created_at:       string;
    published_at:     string;
    assets?:           ReleaseAsset[];
    tarball_url:      string;
    zipball_url:      string;
}

interface ReleaseAsset {
    url:                  string;
    id:                   number;
    name:                 string;
    label:                string;
    content_type:         string;
    state:                string;
    size:                 number;
    download_count:       number;
    created_at:           string;
    updated_at:           string;
    browser_download_url: string;
}

type Props = { };

function GithubReleaseFetcher({ children }: PropsWithChildren<Props>) {
    const [release, setRelease] = useState<Release | null>(null);
    const [retry, setRetry] = useState(0)

    useEffect(() => {
        if (release || retry > 10) return;
        fetch("https://api.github.com/repos/dgate-io/dgate/releases/latest", {
            headers: { "X-GitHub-Api-Version":"2022-11-28" },
        })
            .then((response) => response.json())
            .then((data) => setRelease(data as Release))
            .catch((error) => {
                console.error(error);
                setTimeout(() => setRetry(retry + 1), 3000)
            });
    }, [retry]);

    if (retry > 10) {
        return null;
    }

    return (release) ? (
        <div>
            {children}
            <h3 title={release.name}>Latest release: {release.tag_name} (<span title={release.published_at}>{prettyTime(release.published_at)}</span>)</h3>
            <ul>
                {release?.assets?.filter(asset => asset.name.startsWith("dgate_")).map((asset) => (
                    <li key={asset.id}>
                        <a href={asset.browser_download_url}>{asset.name}</a>
                    </li>
                ))}
            </ul>
        </div>
    ) : <h1 className="box-progress" data-text="Loading">Loading...</h1>;
}

function prettyTime(time: string) {
    var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")),
      diff = (((new Date()).getTime() - date.getTime()) / 1000),
      day_diff = Math.floor(diff / 86400);
    
    // return date for anything greater than a day
    if ( isNaN(day_diff) || day_diff < 0 || day_diff > 0 )
      return date.getDate() + " " + date.toDateString().split(" ")[1];

    return day_diff == 0 && (
        diff < 60 && "just now" ||
        diff < 120 && "1 minute ago" ||
        diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
        diff < 7200 && "1 hour ago" ||
        diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
      day_diff == 1 && "Yesterday" ||
      day_diff < 7 && day_diff + " days ago" ||
      day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
}

export default GithubReleaseFetcher