74 lines · 2.8 KB
import { createFileRoute } from "@tanstack/react-router";
import { deleteSecret, listSecrets, setSecret } from "~/fns/settings";
import { useAction } from "~/hooks/use-action";
import { EmptyState } from "~/ui/EmptyState";
import { Panel } from "~/ui/Panel";
import { RelativeTime } from "~/ui/RelativeTime";
import { Button } from "~/ui/Button";
import { TextAreaField, TextField } from "~/ui/Field";
import { ErrorBanner } from "~/ui/Callout";

export const Route = createFileRoute("/$owner/$repo/settings/secrets")({
  loader: ({ params }) => listSecrets({ data: { owner: params.owner, repo: params.repo } }),
  component: SecretsPage,
});

function SecretsPage() {
  const secrets = Route.useLoaderData();
  const params = Route.useParams();
  const set = useAction(setSecret);
  const remove = useAction(deleteSecret);
  return (
    <>
      <Panel title="New secret">
        <form
          className="space-y-3 p-4"
          onSubmit={async (event) => {
            event.preventDefault();
            const element = event.currentTarget;
            const form = new FormData(element);
            const ok = await set.run({
              data: { ...params, name: String(form.get("name") ?? ""), value: String(form.get("value") ?? "") },
            });
            if (ok) element.reset();
          }}
        >
          <ErrorBanner message={set.error} />
          <TextField label="Name" name="name" required placeholder="DEPLOY_TOKEN" />
          <TextAreaField label="Value" name="value" rows={3} required />
          <p className="text-xs text-kumo-subtle">
            Encrypted with AES-GCM in D1. Reference it as {"${{ secrets.NAME }}"}; values are masked in logs and never