import { standardSchemaResolver as zodResolver } from "@hookform/resolvers/standard-schema"; import { EyeIcon, EyeOffIcon } from "lucide-react"; import { type CSSProperties, useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; 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 { api } from "@/utils/api"; import type { ServiceType } from "../advanced/show-resources"; const addEnvironmentSchema = z.object({ environment: z.string(), }); type EnvironmentSchema = z.infer; interface Props { id: string; type: Exclude; } export const ShowEnvironment = ({ id, type }: Props) => { const { data: permissions } = api.user.getPermissions.useQuery(); const canWrite = permissions?.envVars.write ?? false; const queryMap = { postgres: () => api.postgres.one.useQuery({ postgresId: id }, { enabled: !!id }), redis: () => api.redis.one.useQuery({ redisId: id }, { enabled: !!id }), mysql: () => api.mysql.one.useQuery({ mysqlId: id }, { enabled: !!id }), mariadb: () => api.mariadb.one.useQuery({ mariadbId: id }, { enabled: !!id }), mongo: () => api.mongo.one.useQuery({ mongoId: id }, { enabled: !!id }), compose: () => api.compose.one.useQuery({ composeId: id }, { enabled: !!id }), }; const { data, refetch } = queryMap[type] ? queryMap[type]() : api.mongo.one.useQuery({ mongoId: id }, { enabled: !!id }); const [isEnvVisible, setIsEnvVisible] = useState(true); const mutationMap = { postgres: () => api.postgres.update.useMutation(), redis: () => api.redis.update.useMutation(), mysql: () => api.mysql.update.useMutation(), mariadb: () => api.mariadb.update.useMutation(), mongo: () => api.mongo.update.useMutation(), compose: () => api.compose.update.useMutation(), }; const { mutateAsync, isPending } = mutationMap[type] ? mutationMap[type]() : api.mongo.update.useMutation(); const form = useForm({ defaultValues: { environment: "", }, resolver: zodResolver(addEnvironmentSchema), }); // Watch form value const currentEnvironment = form.watch("environment"); const hasChanges = currentEnvironment !== (data?.env || ""); useEffect(() => { if (data) { form.reset({ environment: data.env || "", }); } }, [data, form]); const onSubmit = async (formData: EnvironmentSchema) => { mutateAsync({ mongoId: id || "", postgresId: id || "", redisId: id || "", mysqlId: id || "", mariadbId: id || "", composeId: id || "", env: formData.environment, }) .then(async () => { toast.success("Environments Added"); await refetch(); }) .catch(() => { toast.error("Error adding environment"); }); }; const handleCancel = () => { form.reset({ environment: data?.env || "", }); }; // Add keyboard shortcut for Ctrl+S/Cmd+S useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key === "s" && !isPending) { e.preventDefault(); form.handleSubmit(onSubmit)(); } }; document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("keydown", handleKeyDown); }; }, [form, onSubmit, isPending]); return (
Environment Settings You can add environment variables to your resource. {hasChanges && ( (You have unsaved changes) )}
{isEnvVisible ? ( ) : ( )}
( )} /> {canWrite && (
{hasChanges && ( )}
)}
); };