Use @deleteEdge on campaign detail delete mutation

@deleteRecord wiped the campaign from the Relay store but left the
cached AccessReviewCampaignsTabQuery connection holding an edge
pointing to the now-missing record. Re-opening the access-reviews
tab made Relay surface a missing-data error and the org error
boundary rendered "Unexpected error :(".

Switch to @deleteEdge with the campaigns connection id so the edge
is removed alongside the deletion, matching the pattern already used
by audit and statement-of-applicability detail pages.

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
This commit is contained in:
Aurélien Sibiril
2026-05-11 11:55:34 +02:00
parent 0f1d893668
commit 51ff8ecc14

View File

@@ -45,7 +45,7 @@ import * as Popover from "@radix-ui/react-popover";
import { useEffect, useMemo, useRef, useState } from "react"; import { useEffect, useMemo, useRef, useState } from "react";
import { type PreloadedQuery, useMutation, usePreloadedQuery, useRelayEnvironment } from "react-relay"; import { type PreloadedQuery, useMutation, usePreloadedQuery, useRelayEnvironment } from "react-relay";
import { useNavigate } from "react-router"; import { useNavigate } from "react-router";
import { fetchQuery, graphql } from "relay-runtime"; import { ConnectionHandler, fetchQuery, graphql } from "relay-runtime";
import type { AccessEntryDecision, CampaignDetailPageBulkDecisionMutation } from "#/__generated__/core/CampaignDetailPageBulkDecisionMutation.graphql"; import type { AccessEntryDecision, CampaignDetailPageBulkDecisionMutation } from "#/__generated__/core/CampaignDetailPageBulkDecisionMutation.graphql";
import type { AccessEntryFlag, CampaignDetailPageBulkFlagMutation } from "#/__generated__/core/CampaignDetailPageBulkFlagMutation.graphql"; import type { AccessEntryFlag, CampaignDetailPageBulkFlagMutation } from "#/__generated__/core/CampaignDetailPageBulkFlagMutation.graphql";
@@ -101,9 +101,10 @@ const closeCampaignMutation = graphql`
const deleteCampaignMutation = graphql` const deleteCampaignMutation = graphql`
mutation CampaignDetailPageDeleteMutation( mutation CampaignDetailPageDeleteMutation(
$input: DeleteAccessReviewCampaignInput! $input: DeleteAccessReviewCampaignInput!
$connections: [ID!]!
) { ) {
deleteAccessReviewCampaign(input: $input) { deleteAccessReviewCampaign(input: $input) {
deletedAccessReviewCampaignId @deleteRecord deletedAccessReviewCampaignId @deleteEdge(connections: $connections)
} }
} }
`; `;
@@ -283,12 +284,19 @@ export default function CampaignDetailPage({ queryRef }: Props) {
}; };
const handleDelete = () => { const handleDelete = () => {
const connections = [
ConnectionHandler.getConnectionID(
organizationId,
"AccessReviewCampaignsTab_accessReviewCampaigns",
),
];
confirm( confirm(
() => () =>
new Promise<void>((resolve) => { new Promise<void>((resolve) => {
deleteCampaign({ deleteCampaign({
variables: { variables: {
input: { accessReviewCampaignId: campaign.id }, input: { accessReviewCampaignId: campaign.id },
connections,
}, },
onCompleted(_, errors) { onCompleted(_, errors) {
if (errors?.length) { if (errors?.length) {