75 lines · 2.9 KB
import { useState } from "react";
import { compactInputClass } from "~/ui/Field";
import { adminResumeHosting, adminSuspendHosting } from "~/fns/admin";
import type { getAdminOverview } from "~/fns/admin";
import { useAction } from "~/hooks/use-action";
import { Button } from "~/ui/Button";
import { Callout, ErrorBanner } from "~/ui/Callout";
import { EmptyState } from "~/ui/EmptyState";
import { Panel } from "~/ui/Panel";
import { RelativeTime } from "~/ui/RelativeTime";
import { TextLink } from "~/ui/TextLink";

type Hosting = Awaited<ReturnType<typeof getAdminOverview>>["hosting"];

/** Suspend or resume every Site of an account, and see whether the daily ceiling tripped. */
export function HostingControls({ hosting }: { hosting: Hosting }) {
  const [name, setName] = useState("");
  const suspend = useAction(adminSuspendHosting);
  const resume = useAction(adminResumeHosting);
  return (
    <Panel title="Hosting">
      <div className="space-y-3 p-4 text-sm">
        {hosting.ceilingHit && (
          <Callout tone="danger">Dynamic sites hit today's platform ceiling and answer 503 until midnight UTC.</Callout>
        )}
        <ErrorBanner message={suspend.error ?? resume.error} />
        <form
          className="flex flex-wrap items-center gap-2"
          onSubmit={async (event) => {
            event.preventDefault();
            if (!name.trim() || !window.confirm(`Stop every site of ${name}?`)) return;
            await suspend.run({ data: { name: name.trim() } });
            setName("");
          }}
        >
          <input
            aria-label="Account name"
            className={compactInputClass()}
            placeholder="account name"
            value={name}