Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import {
ProviderInstanceId,
ThreadId,
type ServerProvider,
type AcpRegistryConfigurableProvider,
} from "@t3tools/contracts";
import { expect, it, vi } from "vite-plus/test";
import { userEvent } from "vite-plus/test/browser";

import { act, render } from "../../../test/render";

Expand Down Expand Up @@ -169,3 +171,38 @@ it("rechecks task access after confirming deletion", async () => {
await screen.click("Delete");
expect(commands.delete).not.toHaveBeenCalled();
});

it.each(["Save", "Disable"])("keeps other provider edits through a %s refetch", async (action) => {
setup();
const providers: AcpRegistryConfigurableProvider[] = ["google", "other"].map((providerId) => ({
providerId,
supported: ["openai"],
required: false,
current: { apiType: "openai", baseUrl: "https://api.example.test/v1" },
}));
const response = { _tag: "Success" as const, value: { providers } };
commands.listProviders.mockResolvedValue(response);
await using screen = await renderSection();
await screen.click("List providers");
const input = (label: string) =>
screen.container.querySelector<HTMLInputElement>(`[aria-label="${label}"]`)!;
await userEvent.fill(input("other base URL"), "https://other.example.test/v1");
await userEvent.fill(input("other write-only headers JSON"), '{"X-Test":"unsaved"}');
await userEvent.fill(input("google write-only headers JSON"), '{"X-Test":"saved"}');

let resolveReload!: (value: typeof response) => void;
const reload = new Promise<typeof response>((resolve) => {
resolveReload = resolve;
});
commands.listProviders.mockReturnValueOnce(reload);
await screen.click(action);
await userEvent.fill(input("other base URL"), "https://newer.example.test/v1");
await act(async () => resolveReload(response));

expect(input("other base URL").value).toBe("https://newer.example.test/v1");
expect(input("other write-only headers JSON").value).toBe('{"X-Test":"unsaved"}');
expect(input("google write-only headers JSON").value).toBe("");
await screen.click("Refresh");
expect(input("other base URL").value).toBe("https://api.example.test/v1");
expect(input("other write-only headers JSON").value).toBe("");
});
12 changes: 7 additions & 5 deletions apps/web/src/components/settings/AcpSessionManagementSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ export function AcpSessionManagementSection(props: {
reportFailure("Could not delete ACP session", result);
};

const loadProviders = async () => {
const loadProviders = async (resetProviderId?: string) => {
if (projectId === null || loadingProviders) return;
setLoadingProviders(true);
const result = await listProviders({
Expand All @@ -221,11 +221,13 @@ export function AcpSessionManagementSection(props: {
setLoadingProviders(false);
if (result._tag === "Success") {
setProviders(result.value.providers);
setProviderDrafts(
setProviderDrafts((current) =>
Object.fromEntries(
result.value.providers.map((provider) => [
provider.providerId,
{
(resetProviderId !== undefined && provider.providerId !== resetProviderId
? current[provider.providerId]
: undefined) ?? {
Comment thread
maria-rcks marked this conversation as resolved.
Resolved
apiType: provider.current?.apiType ?? provider.supported[0] ?? "",
baseUrl: provider.current?.baseUrl ?? "",
headers: "",
Expand Down Expand Up @@ -272,7 +274,7 @@ export function AcpSessionManagementSection(props: {
setSavingProviderId(null);
if (result._tag === "Success") {
toastManager.add({ type: "success", title: "ACP provider configured" });
await loadProviders();
await loadProviders(provider.providerId);
return;
}
reportFailure("Could not configure ACP provider", result);
Expand All @@ -293,7 +295,7 @@ export function AcpSessionManagementSection(props: {
setSavingProviderId(null);
if (result._tag === "Success") {
toastManager.add({ type: "success", title: "ACP provider disabled" });
await loadProviders();
await loadProviders(provider.providerId);
return;
}
reportFailure("Could not disable ACP provider", result);
Expand Down
Loading