diff --git a/src/app/configure-tasks-app/ui/TemplateDetails.tsx b/src/app/configure-tasks-app/ui/TemplateDetails.tsx index ceadd79e1..cb1c7f681 100644 --- a/src/app/configure-tasks-app/ui/TemplateDetails.tsx +++ b/src/app/configure-tasks-app/ui/TemplateDetails.tsx @@ -51,6 +51,7 @@ export default function TemplateDetails({ const [updateDetail, setUpdateDetail] = useState('') const { activeTemplate, targetTemplateId, taskName } = useSelector(selectCreateTemplate) const [isUserTyping, setIsUserTyping] = useState(false) + const [isDescriptionFocused, setIsDescriptionFocused] = useState(false) const [activeUploads, setActiveUploads] = useState(0) const { showConfirmDeleteModal } = useSelector(selectTaskDetails) @@ -61,7 +62,7 @@ export default function TemplateDetails({ const didMount = useRef(false) useEffect(() => { - if (!isUserTyping && activeUploads === 0) { + if (!isUserTyping && !isDescriptionFocused && activeUploads === 0) { const currentTemplate = activeTemplate?.id === template_id ? activeTemplate : template if (currentTemplate) { setUpdateTitle(currentTemplate.title || '') @@ -69,7 +70,7 @@ export default function TemplateDetails({ } } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [activeTemplate?.title, activeTemplate?.body, template_id, activeUploads, template]) + }, [activeTemplate?.title, activeTemplate?.body, template_id, activeUploads, template, isDescriptionFocused]) const _titleUpdateDebounced = async (title: string) => updateTemplateTitle(title) const { @@ -300,8 +301,12 @@ export default function TemplateDetails({ content={updateDetail} onFocus={() => { lastFocusedRef.current = 'description' + setIsDescriptionFocused(true) + }} + onBlur={() => { + setIsDescriptionFocused(false) + flushDetailsUpdateDebounced() }} - onBlur={flushDetailsUpdateDebounced} getContent={(content: string) => { if (updateDetail !== '') { handleDetailChange(content) diff --git a/src/app/detail/ui/TaskEditor.tsx b/src/app/detail/ui/TaskEditor.tsx index 38954468b..09a856b19 100644 --- a/src/app/detail/ui/TaskEditor.tsx +++ b/src/app/detail/ui/TaskEditor.tsx @@ -53,6 +53,7 @@ export const TaskEditor = ({ const { showConfirmDeleteModal, openImage } = useSelector(selectTaskDetails) const { activeTask } = useSelector(selectTaskBoard) const [isUserTyping, setIsUserTyping] = useState(false) + const [isEditorFocused, setIsEditorFocused] = useState(false) const [activeUploads, setActiveUploads] = useState(0) const handleImagePreview = (e: MouseEvent) => { @@ -76,14 +77,14 @@ export const TaskEditor = ({ const didMount = useRef(false) useEffect(() => { - if (!isUserTyping && activeUploads === 0) { + if (!isUserTyping && !isEditorFocused && activeUploads === 0) { const currentTask = activeTask?.id === task_id ? activeTask : task if (currentTask) { setUpdateTitle(currentTask.title || '') setUpdateDetail(currentTask.body ?? '') } } - }, [activeTask?.title, activeTask?.body, task_id, activeUploads, task]) + }, [activeTask?.title, activeTask?.body, task_id, activeUploads, task, isEditorFocused]) const _titleUpdateDebounced = async (title: string) => updateTaskTitle(title) @@ -218,7 +219,11 @@ export const TaskEditor = ({ handleDetailChange(content) } }} - onBlur={flushDetailsUpdateDebounced} + onFocus={() => setIsEditorFocused(true)} + onBlur={() => { + setIsEditorFocused(false) + flushDetailsUpdateDebounced() + }} readonly={!isEditable} editorClass="tapwrite-task-editor" placeholder="Add description..."