fix(environment): scope saved state to application

This commit is contained in:
Hermes Agent 2026-09-02 21:11:02 +03:00
parent f1d2670b77
commit 5fdaf644b1
3 changed files with 49 additions and 5 deletions

View File

@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest";
import {
isSavedApplicationEnvironment,
mergeSavedApplicationEnvironment,
shouldIgnoreApplicationEnvironment,
} from "../../components/dashboard/application/environment/cache";
describe("mergeSavedApplicationEnvironment", () => {
@ -62,3 +63,28 @@ describe("isSavedApplicationEnvironment", () => {
).toBe(false);
});
});
describe("shouldIgnoreApplicationEnvironment", () => {
it("does not carry saved state from application A into application B", () => {
const savedForApplicationA = {
applicationId: "application-a",
env: "A_VALUE=1",
buildArgs: "",
buildSecrets: "",
createEnvFile: true,
};
expect(
shouldIgnoreApplicationEnvironment(
"application-b",
{
env: "B_VALUE=1",
buildArgs: "",
buildSecrets: "",
createEnvFile: true,
},
savedForApplicationA,
),
).toBe(false);
});
});

View File

@ -5,6 +5,10 @@ export type SavedApplicationEnvironment = {
createEnvFile: boolean;
};
export type SavedApplicationEnvironmentState = SavedApplicationEnvironment & {
applicationId: string;
};
export const mergeSavedApplicationEnvironment = <T extends object>(
application: T | undefined,
environment: SavedApplicationEnvironment,
@ -29,3 +33,13 @@ export const isSavedApplicationEnvironment = (
application.buildArgs === environment.buildArgs &&
application.buildSecrets === environment.buildSecrets &&
application.createEnvFile === environment.createEnvFile;
export const shouldIgnoreApplicationEnvironment = (
applicationId: string,
application: Partial<
Record<keyof SavedApplicationEnvironment, string | boolean | null>
>,
savedEnvironment: SavedApplicationEnvironmentState | undefined,
) =>
savedEnvironment?.applicationId === applicationId &&
!isSavedApplicationEnvironment(application, savedEnvironment);

View File

@ -20,7 +20,8 @@ import { api } from "@/utils/api";
import {
isSavedApplicationEnvironment,
mergeSavedApplicationEnvironment,
type SavedApplicationEnvironment,
shouldIgnoreApplicationEnvironment,
type SavedApplicationEnvironmentState,
} from "./cache";
const addEnvironmentSchema = z.object({
@ -40,7 +41,7 @@ export const ShowEnvironment = ({ applicationId }: Props) => {
const { data: permissions } = api.user.getPermissions.useQuery();
const canWrite = permissions?.envVars.write ?? false;
const utils = api.useUtils();
const savedEnvironment = useRef<SavedApplicationEnvironment>();
const savedEnvironment = useRef<SavedApplicationEnvironmentState>();
const { mutateAsync, isPending } =
api.application.saveEnvironment.useMutation();
@ -93,8 +94,11 @@ export const ShowEnvironment = ({ applicationId }: Props) => {
};
if (
savedEnvironment.current &&
!isSavedApplicationEnvironment(data, savedEnvironment.current)
shouldIgnoreApplicationEnvironment(
applicationId,
data,
savedEnvironment.current,
)
) {
return;
}
@ -122,7 +126,7 @@ export const ShowEnvironment = ({ applicationId }: Props) => {
...nextEnvironment,
applicationId,
});
savedEnvironment.current = nextEnvironment;
savedEnvironment.current = { ...nextEnvironment, applicationId };
utils.application.one.setData({ applicationId }, (application) =>
mergeSavedApplicationEnvironment(application, nextEnvironment),
);