diff --git a/apps/web/core/components/editor/rich-text/description-input/root.tsx b/apps/web/core/components/editor/rich-text/description-input/root.tsx index 188a1f046f3..b2adb24661f 100644 --- a/apps/web/core/components/editor/rich-text/description-input/root.tsx +++ b/apps/web/core/components/editor/rich-text/description-input/root.tsx @@ -119,6 +119,8 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props) }); // ref to track if there are unsaved changes const hasUnsavedChanges = useRef(false); + // ref to track last saved content (to skip onChange when content hasn't actually changed) + const lastSavedContent = useRef(initialValue?.trim() === "" ? "
" : (initialValue ?? "")); // store hooks const { getWorkspaceBySlug } = useWorkspace(); const { uploadEditorAsset, duplicateEditorAsset } = useEditorAsset(); @@ -139,6 +141,8 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props) const handleDescriptionFormSubmit = useCallback( async (formData: TFormData) => { await onSubmit(formData.description_html, formData.isMigrationUpdate); + // Update lastSavedContent after successful save + lastSavedContent.current = formData.description_html; }, [onSubmit] ); @@ -146,14 +150,17 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props) // reset form values useEffect(() => { if (!entityId) return; + const normalizedValue = initialValue?.trim() === "" ? "" : (initialValue ?? ""); + // Update last saved content when entity/initialValue changes + lastSavedContent.current = normalizedValue; reset({ id: entityId, - description_html: initialValue?.trim() === "" ? "" : (initialValue ?? ""), + description_html: normalizedValue, isMigrationUpdate: false, }); setLocalDescription({ id: entityId, - description_html: initialValue?.trim() === "" ? "" : (initialValue ?? ""), + description_html: normalizedValue, isMigrationUpdate: false, }); // Reset unsaved changes flag when form is reset @@ -219,6 +226,8 @@ export const DescriptionInput = observer(function DescriptionInput(props: Props) projectId={projectId} dragDropEnabled onChange={(_description, description_html, options) => { + // Skip if content hasn't actually changed (handles editor normalization on init) + if (description_html === lastSavedContent.current) return; setIsSubmitting("submitting"); onChange(description_html); setValue("isMigrationUpdate", options?.isMigrationUpdate ?? false);