import { Tooltip, TooltipTrigger, TooltipPopup } from "../ui/tooltip"; import type { EnvironmentId, PullRequestRef, PullRequestStackMembership } from "@t3tools/contracts"; import { LayersIcon } from "lucide-react"; import { useState } from "react"; import { usePullRequestStack } from "~/state/usePullRequestStack"; import { Menu, MenuTrigger, MenuPopup, MenuGroup, MenuGroupLabel, MenuItem } from "../ui/menu"; import { PullRequestStackLayers } from "./PullRequestStackLayers"; import { PullRequestStackHeader } from "./PullRequestStackHeader"; /** Mounted only while the menu is open, so list rows do not each fetch a stack. */ function StackBody({ environmentId, reference, onSelect, stackNumber, }: { environmentId: EnvironmentId; reference: PullRequestRef; onSelect: (reference: PullRequestRef) => void; stackNumber: number; }) { const query = usePullRequestStack(environmentId, reference); if (query.data !== null) { return ( <> {query.error ? Retry stack refresh : null} ); } return ( <> {query.error ?? (query.isPending ? "Loading stack…" : "This pull request is no longer in a stack.")} ); } export function PullRequestStackPopover({ environmentId, reference, membership, onSelect, }: { environmentId: EnvironmentId; reference: PullRequestRef; membership: PullRequestStackMembership; onSelect: (reference: PullRequestRef) => void; }) { const [open, setOpen] = useState(false); return ( } aria-label={`Stack ${membership.number}, layer ${membership.position} of ${membership.size}`} onClick={(event) => event.stopPropagation()} onKeyDown={(event) => event.stopPropagation()} > {membership.position}/{membership.size} } /> View stack #{membership.number}, layer {membership.position} of {membership.size} event.stopPropagation()} onKeyDown={(event) => event.stopPropagation()} > {open ? ( { setOpen(false); onSelect(target); }} /> ) : null} ); }