diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsx index 80976d41fc..efe848bdce 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.environment-variables/route.tsx @@ -28,6 +28,7 @@ import { Fieldset } from "~/components/primitives/Fieldset"; import { FormButtons } from "~/components/primitives/FormButtons"; import { FormError } from "~/components/primitives/FormError"; import { Header2 } from "~/components/primitives/Headers"; +import { Hint } from "~/components/primitives/Hint"; import { InfoPanel } from "~/components/primitives/InfoPanel"; import { Input } from "~/components/primitives/Input"; import { InputGroup } from "~/components/primitives/InputGroup"; @@ -68,7 +69,6 @@ import { EnvironmentVariablesRepository } from "~/v3/environmentVariables/enviro import { DeleteEnvironmentVariableValue, EditEnvironmentVariableValue, - EnvironmentVariable, } from "~/v3/environmentVariables/repository"; export const meta: MetaFunction = () => { @@ -404,6 +404,7 @@ function EditEnvironmentVariablePanel({ revealAll: boolean; }) { const [isOpen, setIsOpen] = useState(false); + const [isSecret, setIsSecret] = useState(variable.isSecret); const fetcher = useFetcher(); const lastSubmission = fetcher.data as any; @@ -437,6 +438,7 @@ function EditEnvironmentVariablePanel({ Edit environment variable + + + Secret value} + checked={isSecret} + disabled={variable.isSecret} + className="-ml-2 inline-flex w-fit" + onCheckedChange={setIsSecret} + /> + + {variable.isSecret + ? "This variable is secret and cannot be changed back." + : "Once enabled, the value will be hidden and cannot be revealed again."} + + + { const project = await this.prismaClient.project.findFirst({ @@ -426,6 +427,20 @@ export class EnvironmentVariablesRepository implements Repository { await secretStore.setSecret<{ secret: string }>(key, { secret: options.value, }); + + if (options.isSecret) { + await tx.environmentVariableValue.update({ + where: { + variableId_environmentId: { + variableId: environmentVariable.id, + environmentId: options.environmentId, + }, + }, + data: { + isSecret: true, + }, + }); + } }); return { diff --git a/apps/webapp/app/v3/environmentVariables/repository.ts b/apps/webapp/app/v3/environmentVariables/repository.ts index 521e22f7a2..a379c34055 100644 --- a/apps/webapp/app/v3/environmentVariables/repository.ts +++ b/apps/webapp/app/v3/environmentVariables/repository.ts @@ -51,6 +51,7 @@ export const EditEnvironmentVariableValue = z.object({ id: z.string(), environmentId: z.string(), value: z.string(), + isSecret: z.preprocess((val) => val === "true" || val === true, z.boolean()).optional(), }); export type EditEnvironmentVariableValue = z.infer;