odd-box 0.1.7-preview

dead simple reverse proxy server
import "./style.css";
import Button from "../../components/button/button";
import toast from "react-hot-toast";
import useSiteStatus from "../../hooks/use-site-status";
import useSiteMutations from "../../hooks/use-site-mutations";
import {
  BasicProcState,
  InProcessSiteConfig,
  RemoteSiteConfig,
} from "../../generated-api";

const stateToButtonText = {
  [BasicProcState.Running]: "Stop site",
  [BasicProcState.Stopped]: "Start site",
  [BasicProcState.Faulty]: "Start site",
  [BasicProcState.Stopping]: "Start site",
  [BasicProcState.Starting]: "Stop site",
  [BasicProcState.Remote]: "Remote",
};

const SiteOverview = ({
  hostedProcess,
  remoteSite,
}: {
  hostedProcess?: InProcessSiteConfig;
  remoteSite?: RemoteSiteConfig;
}) => {
  const { startSite, stopSite } = useSiteMutations();
  const siteStatus = useSiteStatus();
  const thisSiteStatus = hostedProcess
    ? siteStatus.data?.find((x) => x.hostname === hostedProcess.host_name)
        ?.state
    : remoteSite
      ? siteStatus.data?.find((x) => x.hostname === remoteSite.host_name)?.state
      : BasicProcState.Remote;

  return (
    <>
      <div
        style={{
          fontSize: ".8rem",
          display: "flex",
          flexDirection: "column",
          gap: "10px",
          maxWidth: "750px",
        }}
      >
        <div
          className="pb-2 select-none flex items-center justify-between border-b border-gray-500"
          title={`${thisSiteStatus}`}
        >
          <p style={{ textTransform: "uppercase", fontWeight: "bold" }}>
            status:
          </p>
          <p style={{ display: "flex", alignItems: "center", gap: "5px" }}>
            {thisSiteStatus}
          </p>
        </div>

        <div style={{ marginTop: "10px" }}>
          {thisSiteStatus !== BasicProcState.Remote && (
            <Button
              style={{ maxWidth: "max-content" }}
              disabled={startSite.isPending || stopSite.isPending}
              dangerButton={thisSiteStatus === BasicProcState.Running}
              onClick={async () => {
                if (!hostedProcess) {
                  return;
                }

                if (thisSiteStatus === BasicProcState.Running) {
                  toast.promise(
                    stopSite.mutateAsync({ hostname: hostedProcess.host_name }),
                    {
                      loading: "Stopping site..",
                      success: "Site stopped!",
                      error: (e) => `Failed to stop site: ${e}`,
                    }
                  );
                } else {
                  toast.promise(
                    startSite.mutateAsync({
                      hostname: hostedProcess.host_name,
                    }),
                    {
                      loading: "Starting site..",
                      success: "Site started!",
                      error: (e) => `Failed to start site: ${e}`,
                    }
                  );
                }
              }}
            >
              {stateToButtonText[thisSiteStatus!]}
            </Button>
          )}
        </div>
      </div>
    </>
  );
};

export default SiteOverview;