fix(site/src/pages/AgentsPage): use raw API for provider delete cascade

This commit is contained in:
Tracy Johnson
2026-05-29 20:18:05 +00:00
parent b71457fc5f
commit cc5c9b4b71
6 changed files with 32 additions and 17 deletions
@@ -1,5 +1,6 @@
import type { FC } from "react";
import { useMutation, useQuery, useQueryClient } from "react-query";
import { API } from "#/api/api";
import {
chatModelConfigs,
chatModels,
@@ -84,6 +85,9 @@ const AgentSettingsModelsPage: FC = () => {
onUpdateModel={(modelConfigId, req) =>
updateModelMutation.mutateAsync({ modelConfigId, req })
}
onCascadeUpdateModel={(modelConfigId, req) =>
API.experimental.updateChatModelConfig(modelConfigId, req)
}
onDeleteModel={(id) => deleteModelMutation.mutateAsync(id)}
isCreatingModel={createModelMutation.isPending}
isUpdatingModel={updateModelMutation.isPending}
@@ -1,5 +1,6 @@
import type { FC } from "react";
import { useMutation, useQuery, useQueryClient } from "react-query";
import { API } from "#/api/api";
import {
chatModelConfigs,
chatModels,
@@ -84,6 +85,9 @@ const AgentSettingsProvidersPage: FC = () => {
onUpdateModel={(modelConfigId, req) =>
updateModelMutation.mutateAsync({ modelConfigId, req })
}
onCascadeUpdateModel={(modelConfigId, req) =>
API.experimental.updateChatModelConfig(modelConfigId, req)
}
onDeleteModel={(id) => deleteModelMutation.mutateAsync(id)}
isCreatingModel={createModelMutation.isPending}
isUpdatingModel={updateModelMutation.isPending}
@@ -246,6 +246,7 @@ const meta: Meta<typeof ChatModelAdminPanel> = {
providerMutationError: null,
onCreateModel: fn(async () => ({})),
onUpdateModel: fn(async () => ({})),
onCascadeUpdateModel: fn(async () => ({})),
onDeleteModel: fn(async () => undefined),
isCreatingModel: false,
isUpdatingModel: false,
@@ -2380,7 +2381,7 @@ export const ProviderDeleteWaitingForModels: Story = {
await body.findByRole("button", { name: "Delete provider" }),
).toBeDisabled();
expect(args.onDeleteProvider).not.toHaveBeenCalled();
expect(args.onUpdateModel).not.toHaveBeenCalled();
expect(args.onCascadeUpdateModel).not.toHaveBeenCalled();
},
};
@@ -2476,19 +2477,19 @@ export const ProviderDeleteConfirmed: Story = {
);
await waitFor(() => {
expect(args.onUpdateModel).toHaveBeenCalledTimes(3);
expect(args.onCascadeUpdateModel).toHaveBeenCalledTimes(3);
});
expect(args.onUpdateModel).toHaveBeenNthCalledWith(
expect(args.onCascadeUpdateModel).toHaveBeenNthCalledWith(
1,
"model-anthropic-fallback",
{ is_default: true },
);
expect(args.onUpdateModel).toHaveBeenNthCalledWith(
expect(args.onCascadeUpdateModel).toHaveBeenNthCalledWith(
2,
"model-openai-default",
{ enabled: false },
);
expect(args.onUpdateModel).toHaveBeenNthCalledWith(
expect(args.onCascadeUpdateModel).toHaveBeenNthCalledWith(
3,
"model-openai-secondary",
{ enabled: false },
@@ -2503,7 +2504,7 @@ export const ProviderDeleteConfirmed: Story = {
export const ProviderDeleteCascadeFailure: Story = {
args: {
...providerDeleteCascadeArgs,
onUpdateModel: fn(async (id: string) => {
onCascadeUpdateModel: fn(async (id: string) => {
if (id === "model-openai-default") {
throw new Error("Failed to disable model.");
}
@@ -2520,13 +2521,14 @@ export const ProviderDeleteCascadeFailure: Story = {
);
await waitFor(() => {
expect(args.onUpdateModel).toHaveBeenCalledWith(
expect(args.onCascadeUpdateModel).toHaveBeenCalledWith(
"model-anthropic-fallback",
{ is_default: true },
);
expect(args.onUpdateModel).toHaveBeenCalledWith("model-openai-default", {
enabled: false,
});
expect(args.onCascadeUpdateModel).toHaveBeenCalledWith(
"model-openai-default",
{ enabled: false },
);
});
expect(args.onDeleteProvider).not.toHaveBeenCalled();
await expect(await body.findByRole("dialog")).toBeInTheDocument();
@@ -259,6 +259,10 @@ interface ChatModelAdminPanelProps {
modelConfigId: string,
req: TypesGen.UpdateChatModelConfigRequest,
) => Promise<unknown>;
onCascadeUpdateModel: (
modelConfigId: string,
req: TypesGen.UpdateChatModelConfigRequest,
) => Promise<unknown>;
onDeleteModel: (modelConfigId: string) => Promise<void>;
isCreatingModel: boolean;
isUpdatingModel: boolean;
@@ -285,6 +289,7 @@ export const ChatModelAdminPanel: FC<ChatModelAdminPanelProps> = ({
providerMutationError,
onCreateModel,
onUpdateModel,
onCascadeUpdateModel,
onDeleteModel,
isCreatingModel,
isUpdatingModel,
@@ -327,7 +332,7 @@ export const ChatModelAdminPanel: FC<ChatModelAdminPanelProps> = ({
onCreateProvider={onCreateProvider}
onUpdateProvider={onUpdateProvider}
onDeleteProvider={onDeleteProvider}
onUpdateModel={onUpdateModel}
onCascadeUpdateModel={onCascadeUpdateModel}
allModelConfigs={modelConfigs}
/>
) : (
@@ -51,7 +51,7 @@ interface ProviderFormProps {
req: TypesGen.UpdateChatProviderConfigRequest,
) => Promise<unknown>;
onDeleteProvider: (providerConfigId: string) => Promise<void>;
onUpdateModel: (
onCascadeUpdateModel: (
modelConfigId: string,
req: TypesGen.UpdateChatModelConfigRequest,
) => Promise<unknown>;
@@ -67,7 +67,7 @@ export const ProviderForm: FC<ProviderFormProps> = ({
onCreateProvider,
onUpdateProvider,
onDeleteProvider,
onUpdateModel,
onCascadeUpdateModel,
allModelConfigs,
onBack,
}) => {
@@ -423,7 +423,7 @@ export const ProviderForm: FC<ProviderFormProps> = ({
await cascadeDisableProviderModels({
associatedModels: providerState.modelConfigs,
allModels: allModelConfigs,
updateModelConfig: onUpdateModel,
updateModelConfig: onCascadeUpdateModel,
});
} catch (error) {
toast.error(
@@ -82,7 +82,7 @@ interface ProvidersSectionProps {
req: UpdateChatProviderConfigRequest,
) => Promise<unknown>;
onDeleteProvider: (providerConfigId: string) => Promise<void>;
onUpdateModel: (
onCascadeUpdateModel: (
modelConfigId: string,
req: UpdateChatModelConfigRequest,
) => Promise<unknown>;
@@ -99,7 +99,7 @@ export const ProvidersSection: FC<ProvidersSectionProps> = ({
onCreateProvider,
onUpdateProvider,
onDeleteProvider,
onUpdateModel,
onCascadeUpdateModel,
allModelConfigs,
}) => {
const [searchParams, setSearchParams] = useSearchParams();
@@ -210,7 +210,7 @@ export const ProvidersSection: FC<ProvidersSectionProps> = ({
}
}}
onBack={clearProviderView}
onUpdateModel={onUpdateModel}
onCascadeUpdateModel={onCascadeUpdateModel}
allModelConfigs={allModelConfigs}
/>
);