diff --git a/components/editor/custom-editor.js b/components/editor/custom-editor.js index 4467c0e7..f91d2126 100644 --- a/components/editor/custom-editor.js +++ b/components/editor/custom-editor.js @@ -5,6 +5,7 @@ function CustomEditor(props) { const editorRef = useRef(null); const [isEditorReady, setIsEditorReady] = useState(false); const [currentContent, setCurrentContent] = useState(props.initialData || ""); + const isUserTypingRef = useRef(false); // Handle editor initialization const handleInit = useCallback((evt, editor) => { @@ -12,23 +13,29 @@ function CustomEditor(props) { setIsEditorReady(true); // Set initial content immediately when editor is ready - if (currentContent) { - editor.setContent(currentContent); + if (props.initialData) { + editor.setContent(props.initialData); + setCurrentContent(props.initialData); } // Simple onChange handler editor.on('change', () => { + isUserTypingRef.current = true; // Mark that user is typing const content = editor.getContent(); setCurrentContent(content); if (props.onChange) { props.onChange(content); } + // Reset typing flag after a short delay + setTimeout(() => { + isUserTypingRef.current = false; + }, 100); }); - }, [currentContent, props.onChange]); + }, [props.initialData, props.onChange]); - // Watch for changes in initialData prop + // Watch for changes in initialData prop (from external sources like setValue) useEffect(() => { - if (props.initialData !== currentContent) { + if (props.initialData !== currentContent && !isUserTypingRef.current) { setCurrentContent(props.initialData || ""); // Update editor content if editor is ready @@ -36,14 +43,15 @@ function CustomEditor(props) { editorRef.current.setContent(props.initialData || ""); } } - }, [props.initialData, currentContent, isEditorReady]); + }, [props.initialData, isEditorReady]); // Removed currentContent from dependency - // Handle initial data when editor becomes ready + // Handle initial data when editor becomes ready (only for initialization) useEffect(() => { - if (isEditorReady && currentContent && editorRef.current) { - editorRef.current.setContent(currentContent); + if (isEditorReady && props.initialData && editorRef.current && !isUserTypingRef.current) { + editorRef.current.setContent(props.initialData); + setCurrentContent(props.initialData); } - }, [isEditorReady, currentContent]); + }, [isEditorReady]); // Only depend on isEditorReady, not currentContent return ( 0) { - const tagsMerge = [...tags, response?.data?.data] + // Extract tag names from the response objects + const apiTags = response?.data?.data?.map((tag: any) => tag.tagName || tag.name || tag); + // Merge with existing tags, ensuring uniqueness + const tagsMerge = Array.from(new Set([...tags, ...apiTags])); setTags(tagsMerge); } } catch (error) { @@ -316,16 +319,16 @@ export default function FormConvertSPIT() { setValue("contentCreator", details.contentCreator || ""); setValue("contentRewriteDescription", details.contentRewriteDescription || ""); - // Set category + // Set category and load category tags if (details.categoryId) { setSelectedCategoryId(details.categoryId); await loadTags(details.categoryId); } - // Set tags + // Set content tags and merge with category tags if (details.contentTag) { - const initialTags = details.contentTag.split(",").map((tag: string) => tag.trim()); - setTags(initialTags); + const contentTags = details.contentTag.split(",").map((tag: string) => tag.trim()); + setTags(prev => [...new Set([...prev, ...contentTags])]); } } catch (error) { console.error("Failed to load detail:", error);