diff --git a/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx b/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx index afb66bd5..9b17e267 100644 --- a/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx +++ b/apps/dokploy/components/dashboard/compose/general/compose-file-editor.tsx @@ -1,5 +1,5 @@ import { zodResolver } from "@hookform/resolvers/zod"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; @@ -35,6 +35,7 @@ export const ComposeFileEditor = ({ composeId }: Props) => { ); const { mutateAsync, isLoading } = api.compose.update.useMutation(); + const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); const form = useForm({ defaultValues: { @@ -53,6 +54,12 @@ export const ComposeFileEditor = ({ composeId }: Props) => { } }, [form, form.reset, data]); + useEffect(() => { + if (data?.composeFile !== undefined) { + setHasUnsavedChanges(composeFile !== data.composeFile); + } + }, [composeFile, data?.composeFile]); + const onSubmit = async (data: AddComposeFile) => { const { valid, error } = validateAndFormatYAML(data.composeFile); if (!valid) { @@ -71,6 +78,7 @@ export const ComposeFileEditor = ({ composeId }: Props) => { }) .then(async () => { toast.success("Compose config Updated"); + setHasUnsavedChanges(false); refetch(); await utils.compose.getConvertedCompose.invalidate({ composeId, @@ -99,6 +107,19 @@ export const ComposeFileEditor = ({ composeId }: Props) => { return ( <>
+
+
+

Compose File

+

+ Configure your Docker Compose file for this service. + {hasUnsavedChanges && ( + + (You have unsaved changes) + + )} +

+
+