154 lines · 5.7 KB
import { useState } from "react";
import { requestReviewers } from "~/fns/reviews";
import { dismissReview, rerequestPullReview } from "~/fns/pull-review";
import { usePull } from "~/hooks/use-pull";
import { useAction } from "~/hooks/use-action";
import { useViewer } from "~/hooks/use-viewer";
import { Avatar, Badge } from "./ui/Primitives";
import { Button } from "./ui/Button";
import { ErrorBanner, inputClass } from "./ui/Field";
import { cn } from "~/utils/cn";

const REVIEW_TONE = { approved: "green", changes_requested: "red", dismissed: "neutral" } as const;

function toneOf(state: string) {
  return state in REVIEW_TONE ? REVIEW_TONE[state as keyof typeof REVIEW_TONE] : "neutral";
}

function DismissForm({ onDismiss, pending }: { onDismiss: (reason: string) => void; pending: boolean }) {
  const [reason, setReason] = useState("");
  return (
    <form
      className="flex gap-1"
      onSubmit={(event) => {
        event.preventDefault();
        if (reason.trim()) onDismiss(reason);
      }}
    >
      <label className="sr-only" htmlFor="dismiss-reason">
        Reason
      </label>
      <input
        id="dismiss-reason"
        value={reason}
        onChange={(event) => setReason(event.target.value)}
        placeholder="Reason for dismissal"
        className={cn(inputClass, "h-7 text-xs")}
      />
      <Button type="submit" size="sm" pending={pending}>
        Dismiss
      </Button>