117 lines · 4.5 KB
import { createFileRoute, useNavigate } from "@tanstack/react-router";
import { z } from "zod";
import { deleteOwnerValue, getOwnerActionsConfig, listActionsOwners, setOwnerValue } from "~/fns/action-config";
import { useAction } from "~/hooks/use-action";
import { ConfigValueList } from "~/components/ConfigValueList";
import { SelectField, TextField } from "~/ui/Field";
import { Heading } from "~/ui/Heading";

const VISIBILITY = [
  { value: "all", label: "All repositories" },
  { value: "private", label: "Private repositories" },
  { value: "selected", label: "Selected repositories" },
] as const;

const visibilitySchema = z.enum(["all", "private", "selected"]);

export const Route = createFileRoute("/settings/actions")({
  validateSearch: z.object({ owner: z.string().optional() }),
  loaderDeps: ({ search }) => search,
  loader: async ({ deps }) => {
    const owners = await listActionsOwners();
    const owner = deps.owner && owners.includes(deps.owner) ? deps.owner : owners[0];
    return { owners, config: await getOwnerActionsConfig({ data: { owner } }) };
  },
  component: OwnerActionsPage,
});

function describe(visibility: string, repos: string[]): string {
  if (visibility === "selected") return repos.length ? `Repos: ${repos.join(", ")}` : "No repositories";
  return visibility === "private" ? "Private repositories" : "All repositories";
}

function AccessFields({ repos, listId }: { repos: string[]; listId: string }) {
  return (
    <div className="grid gap-3 md:grid-cols-[1fr_2fr]">
      <SelectField label="Repository access" name="visibility" options={VISIBILITY} defaultValue="all" />
      <TextField
        label="Selected repositories"
        name="repos"
        list={listId}