"use client"; import { useState, useTransition } from "react"; import { useRouter } from "next/navigation"; import { toast } from "sonner"; import { CheckCircleIcon, PencilIcon, XCircleIcon } from "lucide-react"; import { Item, ItemContent, ItemHeader, ItemTitle } from "@/components/ui/item"; import { Button } from "@/components/ui/button"; import { cancelFridaySideOp, markSideOpReady, } from "@/app/(frontend)/intelligence/missions/actions"; import { CreateSideOpDialog, type SideOpDialogInitial, type SideOpDialogOption, } from "./CreateSideOpDialog"; interface SideOpControlsProps { initial: SideOpDialogInitial; status: string; maps: SideOpDialogOption[]; campaigns: SideOpDialogOption[]; modLists: SideOpDialogOption[]; } export function SideOpControls({ initial, status, maps, campaigns, modLists, }: SideOpControlsProps) { const router = useRouter(); const [editOpen, setEditOpen] = useState(false); const [confirmingCancel, setConfirmingCancel] = useState(false); const [isPending, startTransition] = useTransition(); const isTerminal = status === "Completed" || status === "Cancelled"; const canMarkReady = ["Concept", "Planning", "Scheduled"].includes(status); function handleMarkReady() { startTransition(async () => { const result = await markSideOpReady(initial.missionId); if (!result.success) { toast.error(result.error ?? "Failed to mark the side operation as Ready."); return; } toast.success("Side operation marked as Ready. Roll-call can now be posted."); router.refresh(); }); } function handleCancel() { if (!confirmingCancel) { setConfirmingCancel(true); return; } startTransition(async () => { const result = await cancelFridaySideOp(initial.missionId); if (!result.success) { toast.error(result.error ?? "Failed to cancel the side operation."); setConfirmingCancel(false); return; } toast.success("Side operation cancelled. Discord roll-call will be updated."); setConfirmingCancel(false); router.refresh(); }); } if (isTerminal) { return null; } return ( Side Operation Controls
{canMarkReady && ( )}

Marking the operation Ready locks in the details so the Discord roll-call can be posted and the mission hooks delivered. Editing covers details, campaign, and narrative. Cancelling frees your scheduling slot and updates the Discord embed.

router.refresh()} />
); }