From b3b74396175cab6567bc7d950e7138030873ae41 Mon Sep 17 00:00:00 2001 From: Lorenzo Migliorero Date: Mon, 22 Jul 2024 11:17:59 +0200 Subject: [PATCH] feat: add build-time variables form --- .../application/environment/show.tsx | 183 ++++++------------ components/ui/secrets.tsx | 92 +++++++++ server/api/routers/application.ts | 9 + server/db/schema/application.ts | 7 + 4 files changed, 170 insertions(+), 121 deletions(-) create mode 100644 components/ui/secrets.tsx diff --git a/components/dashboard/application/environment/show.tsx b/components/dashboard/application/environment/show.tsx index 359142c53..fe5853cee 100644 --- a/components/dashboard/application/environment/show.tsx +++ b/components/dashboard/application/environment/show.tsx @@ -1,42 +1,30 @@ -import { CodeEditor } from "@/components/shared/code-editor"; -import { Button } from "@/components/ui/button"; -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@/components/ui/card"; -import { - Form, - FormControl, - FormField, - FormItem, - FormMessage, -} from "@/components/ui/form"; -import { Toggle } from "@/components/ui/toggle"; +import { Form } from "@/components/ui/form"; +import { Secrets } from "@/components/ui/secrets"; import { api } from "@/utils/api"; import { zodResolver } from "@hookform/resolvers/zod"; -import { EyeIcon, EyeOffIcon } from "lucide-react"; -import React, { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; const addEnvironmentSchema = z.object({ - environment: z.string(), + env: z.string(), }); type EnvironmentSchema = z.infer; +const addBuildArgsSchema = z.object({ + buildArgs: z.string(), +}); + +type BuildArgsSchema = z.infer; + interface Props { applicationId: string; } export const ShowEnvironment = ({ applicationId }: Props) => { - const [isEnvVisible, setIsEnvVisible] = useState(true); - const { mutateAsync, isLoading } = - api.application.saveEnvironment.useMutation(); + const saveEnvironmentMutation = api.application.saveEnvironment.useMutation(); + const saveBuildArgsMutation = api.application.saveBuildArgs.useMutation(); const { data, refetch } = api.application.one.useQuery( { @@ -46,26 +34,27 @@ export const ShowEnvironment = ({ applicationId }: Props) => { enabled: !!applicationId, }, ); - const form = useForm({ + + const envForm = useForm({ defaultValues: { - environment: "", + env: data?.env || "", }, resolver: zodResolver(addEnvironmentSchema), }); - useEffect(() => { - if (data) { - form.reset({ - environment: data.env || "", - }); - } - }, [form.reset, data, form]); + const buildArgsForm = useForm({ + defaultValues: { + buildArgs: data?.buildArgs || "", + }, + resolver: zodResolver(addBuildArgsSchema), + }); - const onSubmit = async (data: EnvironmentSchema) => { - mutateAsync({ - env: data.environment, - applicationId, - }) + const onEnvSubmit = async (data: EnvironmentSchema) => { + saveEnvironmentMutation + .mutateAsync({ + env: data.env, + applicationId, + }) .then(async () => { toast.success("Environments Added"); await refetch(); @@ -74,94 +63,46 @@ export const ShowEnvironment = ({ applicationId }: Props) => { toast.error("Error to add environment"); }); }; - useEffect(() => { - if (isEnvVisible) { - if (data?.env) { - const maskedLines = data.env - .split("\n") - .map((line) => "*".repeat(line.length)) - .join("\n"); - form.reset({ - environment: maskedLines, - }); - } else { - form.reset({ - environment: "", - }); - } - } else { - form.reset({ - environment: data?.env || "", + + const onBuildArgsSubmit = async (data: BuildArgsSchema) => { + saveBuildArgsMutation + .mutateAsync({ + buildArgs: data.buildArgs, + applicationId, + }) + .then(async () => { + toast.success("Buildargs Added"); + await refetch(); + }) + .catch(() => { + toast.error("Error to add build-args"); }); - } - }, [form.reset, data, form, isEnvVisible]); + }; return (
- - -
- Environment Settings - - You can add environment variables to your resource. - -
- - - {isEnvVisible ? ( - - ) : ( - - )} - -
- -
- - ( - - - - - - - - )} - /> - -
- -
- - -
-
+
+ + + + +
+ + + +
); }; diff --git a/components/ui/secrets.tsx b/components/ui/secrets.tsx new file mode 100644 index 000000000..acb804e84 --- /dev/null +++ b/components/ui/secrets.tsx @@ -0,0 +1,92 @@ +import { CodeEditor } from "@/components/shared/code-editor"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { + FormControl, + FormField, + FormItem, + FormMessage, +} from "@/components/ui/form"; +import { Toggle } from "@/components/ui/toggle"; +import { EyeIcon, EyeOffIcon } from "lucide-react"; +import { type CSSProperties, useEffect, useState } from "react"; +import { useFormContext } from "react-hook-form"; + +interface Props { + name: string; + title: string; + description: string; + placeholder: string; + isLoading: boolean; +} + +export const Secrets = (props: Props) => { + const [isVisible, setIsVisible] = useState(true); + const form = useFormContext>(); + + return ( + + +
+ {props.title} + {props.description} +
+ + + {isVisible ? ( + + ) : ( + + )} + +
+ + ( + + + + + + + + )} + /> + +
+ +
+
+
+ ); +}; diff --git a/server/api/routers/application.ts b/server/api/routers/application.ts index cb325e5ab..6fd5e2ebd 100644 --- a/server/api/routers/application.ts +++ b/server/api/routers/application.ts @@ -9,6 +9,7 @@ import { apiFindMonitoringStats, apiFindOneApplication, apiReloadApplication, + apiSaveBuildArgs, apiSaveBuildType, apiSaveDockerProvider, apiSaveEnvironmentVariables, @@ -190,6 +191,14 @@ export const applicationRouter = createTRPCRouter({ }); return true; }), + saveBuildArgs: protectedProcedure + .input(apiSaveBuildArgs) + .mutation(async ({ input }) => { + await updateApplication(input.applicationId, { + buildArgs: input.buildArgs, + }); + return true; + }), saveBuildType: protectedProcedure .input(apiSaveBuildType) .mutation(async ({ input }) => { diff --git a/server/db/schema/application.ts b/server/db/schema/application.ts index 5f96b4074..607c52759 100644 --- a/server/db/schema/application.ts +++ b/server/db/schema/application.ts @@ -379,6 +379,13 @@ export const apiSaveEnvironmentVariables = createSchema }) .required(); +export const apiSaveBuildArgs = createSchema + .pick({ + applicationId: true, + buildArgs: true, + }) + .required(); + export const apiFindMonitoringStats = createSchema .pick({ appName: true,