From 35c838df8109eaa041fe7eeb76e250951c65fe24 Mon Sep 17 00:00:00 2001 From: biersoeckli Date: Thu, 24 Oct 2024 13:47:05 +0000 Subject: [PATCH] added env vars --- src/app/project/app/[tabName]/app-tabs.tsx | 50 +++++++++++++ .../project/app/[tabName]/domains/actions.ts | 17 +++++ .../project/app/[tabName]/domains/domains.tsx | 39 ++++++++++ .../app/[tabName]/environment/actions.ts | 17 +++++ .../app/[tabName]/environment/env-edit.tsx | 75 +++++++++++++++++++ .../app/{ => [tabName]}/general/actions.ts | 0 .../general/app-rate-limits.tsx | 3 +- .../{ => [tabName]}/general/app-source.tsx | 3 +- src/app/project/app/[tabName]/page.tsx | 52 +++++++++++++ src/app/project/app/page.tsx | 72 ------------------ src/app/project/page.tsx | 8 +- src/components/custom/page-title.tsx | 15 ++++ src/model/app-extended.model.ts | 11 +++ src/model/env-edit.model.ts | 7 ++ src/server/services/app.service.ts | 15 +++- 15 files changed, 306 insertions(+), 78 deletions(-) create mode 100644 src/app/project/app/[tabName]/app-tabs.tsx create mode 100644 src/app/project/app/[tabName]/domains/actions.ts create mode 100644 src/app/project/app/[tabName]/domains/domains.tsx create mode 100644 src/app/project/app/[tabName]/environment/actions.ts create mode 100644 src/app/project/app/[tabName]/environment/env-edit.tsx rename src/app/project/app/{ => [tabName]}/general/actions.ts (100%) rename src/app/project/app/{ => [tabName]}/general/app-rate-limits.tsx (98%) rename src/app/project/app/{ => [tabName]}/general/app-source.tsx (99%) create mode 100644 src/app/project/app/[tabName]/page.tsx delete mode 100644 src/app/project/app/page.tsx create mode 100644 src/components/custom/page-title.tsx create mode 100644 src/model/app-extended.model.ts create mode 100644 src/model/env-edit.model.ts diff --git a/src/app/project/app/[tabName]/app-tabs.tsx b/src/app/project/app/[tabName]/app-tabs.tsx new file mode 100644 index 0000000..1a9027c --- /dev/null +++ b/src/app/project/app/[tabName]/app-tabs.tsx @@ -0,0 +1,50 @@ +'use client' + +import { useRouter } from "next/navigation"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" +import GeneralAppRateLimits from "./general/app-rate-limits"; +import GeneralAppSource from "./general/app-source"; +import EnvEdit from "./environment/env-edit"; +import { App } from "@prisma/client"; +import DomainsList from "./domains/domains"; +import { AppExtendedModel } from "@/model/app-extended.model"; + +export default function AppTabs({ + app, + tabName +}: { + app: AppExtendedModel; + tabName: string; +}) { + const router = useRouter(); + + const openTab = (tabName: string) => { + router.push(`/project/app/${tabName}?appId=${app.id}`); + } + + return ( + openTab(newTab)} className="space-y-4"> + + Overview + General + Environment + Domains + Storage + Logs + + Domains, Logs, etc. + + + + + + + + + + + storage + logs + + ) +} diff --git a/src/app/project/app/[tabName]/domains/actions.ts b/src/app/project/app/[tabName]/domains/actions.ts new file mode 100644 index 0000000..0fd87a1 --- /dev/null +++ b/src/app/project/app/[tabName]/domains/actions.ts @@ -0,0 +1,17 @@ +'use server' + +import { AppEnvVariablesModel, appEnvVariablesZodModel } from "@/model/env-edit.model"; +import appService from "@/server/services/app.service"; +import { getAuthUserSession, saveFormAction } from "@/server/utils/action-wrapper.utils"; + + +export const saveEnvVariables = async (prevState: any, inputData: AppEnvVariablesModel, appId: string) => + saveFormAction(inputData, appEnvVariablesZodModel, async (validatedData) => { + await getAuthUserSession(); + const existingApp = await appService.getById(appId); + await appService.save({ + ...existingApp, + ...validatedData, + id: appId, + }); + }); \ No newline at end of file diff --git a/src/app/project/app/[tabName]/domains/domains.tsx b/src/app/project/app/[tabName]/domains/domains.tsx new file mode 100644 index 0000000..490ce33 --- /dev/null +++ b/src/app/project/app/[tabName]/domains/domains.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { SubmitButton } from "@/components/custom/submit-button"; +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; +import { FormUtils } from "@/lib/form.utilts"; +import { AppSourceInfoInputModel, appSourceInfoInputZodModel } from "@/model/app-source-info.model"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import { saveEnvVariables } from "./actions"; +import { useFormState } from "react-dom"; +import { ServerActionResult } from "@/model/server-action-error-return.model"; +import { Input } from "@/components/ui/input"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Label } from "@/components/ui/label"; +import { AppRateLimitsModel, appRateLimitsZodModel } from "@/model/app-rate-limits.model"; +import { App } from "@prisma/client"; +import { useEffect } from "react"; +import { toast } from "sonner"; +import { AppEnvVariablesModel, appEnvVariablesZodModel } from "@/model/env-edit.model"; +import { Textarea } from "@/components/ui/textarea"; +import { AppExtendedModel } from "@/model/app-extended.model"; + + +export default function DomainsList({ app }: { + app: AppExtendedModel +}) { + return <> + + + Domains + Add custom domains to your application. If your app has a domain configured, it will be public and accessible via the internet. + + + + + + ; +} \ No newline at end of file diff --git a/src/app/project/app/[tabName]/environment/actions.ts b/src/app/project/app/[tabName]/environment/actions.ts new file mode 100644 index 0000000..0fd87a1 --- /dev/null +++ b/src/app/project/app/[tabName]/environment/actions.ts @@ -0,0 +1,17 @@ +'use server' + +import { AppEnvVariablesModel, appEnvVariablesZodModel } from "@/model/env-edit.model"; +import appService from "@/server/services/app.service"; +import { getAuthUserSession, saveFormAction } from "@/server/utils/action-wrapper.utils"; + + +export const saveEnvVariables = async (prevState: any, inputData: AppEnvVariablesModel, appId: string) => + saveFormAction(inputData, appEnvVariablesZodModel, async (validatedData) => { + await getAuthUserSession(); + const existingApp = await appService.getById(appId); + await appService.save({ + ...existingApp, + ...validatedData, + id: appId, + }); + }); \ No newline at end of file diff --git a/src/app/project/app/[tabName]/environment/env-edit.tsx b/src/app/project/app/[tabName]/environment/env-edit.tsx new file mode 100644 index 0000000..4fe688f --- /dev/null +++ b/src/app/project/app/[tabName]/environment/env-edit.tsx @@ -0,0 +1,75 @@ +'use client'; + +import { SubmitButton } from "@/components/custom/submit-button"; +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; +import { FormUtils } from "@/lib/form.utilts"; +import { AppSourceInfoInputModel, appSourceInfoInputZodModel } from "@/model/app-source-info.model"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import { saveEnvVariables } from "./actions"; +import { useFormState } from "react-dom"; +import { ServerActionResult } from "@/model/server-action-error-return.model"; +import { Input } from "@/components/ui/input"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { Label } from "@/components/ui/label"; +import { AppRateLimitsModel, appRateLimitsZodModel } from "@/model/app-rate-limits.model"; +import { App } from "@prisma/client"; +import { useEffect } from "react"; +import { toast } from "sonner"; +import { AppEnvVariablesModel, appEnvVariablesZodModel } from "@/model/env-edit.model"; +import { Textarea } from "@/components/ui/textarea"; +import { AppExtendedModel } from "@/model/app-extended.model"; + + +export default function EnvEdit({ app }: { + app: AppExtendedModel +}) { + const form = useForm({ + resolver: zodResolver(appEnvVariablesZodModel), + defaultValues: app + }); + + const [state, formAction] = useFormState((state: ServerActionResult, payload: AppEnvVariablesModel) => saveEnvVariables(state, payload, app.id), FormUtils.getInitialFormState()); + useEffect(() => { + if (state.status === 'success') { + toast.success('Env Variables Limits Saved'); + } + FormUtils.mapValidationErrorsToForm(state, form); + }, [state]); + + const sourceTypeField = form.watch(); + return <> + + + Environment Variables + Provide optional environment variables for your application. + +
+ form.handleSubmit((data) => { + return formAction(data); + })()}> + + ( + + Env Variables + +