← back to Homesonspec

apps/admin/src/app/review/ReviewActions.tsx

49 lines

"use client";

import { useRouter } from "next/navigation";
import { useState } from "react";

export default function ReviewActions({
  reviewItemId,
  stagedRecordId,
}: {
  reviewItemId: string;
  stagedRecordId: string;
}) {
  const router = useRouter();
  const [busy, setBusy] = useState(false);
  const [error, setError] = useState<string | null>(null);

  const act = async (action: "approve" | "reject") => {
    setBusy(true);
    setError(null);
    const res = await fetch("/api/review", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ reviewItemId, stagedRecordId, action }),
    });
    setBusy(false);
    if (!res.ok) {
      setError((await res.json().catch(() => null))?.error ?? "action failed");
      return;
    }
    router.refresh();
  };

  return (
    <div className="mt-3 flex items-center gap-3">
      <button onClick={() => act("approve")} disabled={busy}
        className="rounded bg-emerald-700 px-4 py-1.5 text-sm font-medium text-white hover:bg-emerald-800 disabled:opacity-50"
        data-testid="review-approve">
        Approve & publish
      </button>
      <button onClick={() => act("reject")} disabled={busy}
        className="rounded bg-red-700 px-4 py-1.5 text-sm font-medium text-white hover:bg-red-800 disabled:opacity-50"
        data-testid="review-reject">
        Reject
      </button>
      {error && <span className="text-sm text-red-600">{error}</span>}
    </div>
  );
}