3.4 KiB
3.4 KiB
Form Editor Initial Data Fix
Masalah yang Ditemukan
CustomEditor tidak menampilkan initial data yang diset melalui setValue dari react-hook-form karena:
- Timing Issue:
setValuedipanggil sebelum editor selesai di-mount - Tidak ada state management untuk initial data di CustomEditor
- Tidak ada useEffect untuk watch perubahan props
Solusi yang Diterapkan
1. CustomEditor Diperbaiki ✅
- Menambahkan:
useEffectuntuk watch perubahaninitialDataprop - Menambahkan:
editorRef.current.setContent()ketika props berubah - Mempertahankan: Pendekatan minimal yang sudah bekerja
2. FormEditor Dibuat ✅ (New)
- File baru:
components/editor/form-editor.js - Fitur: State management untuk initial data
- Fitur: Watch perubahan props dengan lebih baik
- Fitur: Editor ready state management
3. Form Diperbarui ✅
- Menggunakan: FormEditor sebagai pengganti CustomEditor
- Import: Dynamic import untuk FormEditor
- Mempertahankan: Interface yang sama
Kode yang Diperbaiki
CustomEditor (Diperbaiki):
// Watch for changes in initialData prop and update editor content
useEffect(() => {
if (editorRef.current && props.initialData) {
editorRef.current.setContent(props.initialData);
}
}, [props.initialData]);
FormEditor (Baru):
const [isEditorReady, setIsEditorReady] = useState(false);
const [initialData, setInitialData] = useState(props.initialData || '');
// Watch for changes in initialData prop
useEffect(() => {
if (props.initialData !== initialData) {
setInitialData(props.initialData || '');
// Update editor content if editor is ready
if (isEditorReady && editorRef.current) {
editorRef.current.setContent(props.initialData || '');
}
}
}, [props.initialData, initialData, isEditorReady]);
Form Update:
const CustomEditor = dynamic(
() => {
return import("@/components/editor/form-editor");
},
{ ssr: false }
);
Cara Kerja Solusi
1. Timing Management:
- FormEditor menggunakan state
isEditorReadyuntuk memastikan editor sudah siap useEffecthanya update content ketika editor sudah ready
2. Props Watching:
useEffectwatch perubahanprops.initialData- Ketika props berubah, update internal state dan editor content
3. State Management:
- Internal state
initialDatauntuk tracking perubahan - Mencegah infinite loop dengan comparison
Keunggulan FormEditor
- Better Initial Data Handling - Menangani setValue dengan benar
- State Management - Internal state untuk tracking
- Ready State - Memastikan editor sudah siap sebelum update
- Props Watching - Watch perubahan props secara efektif
- No Cursor Jumping - Menggunakan pendekatan minimal yang sudah bekerja
Cara Menggunakan
Di Form:
<Controller
control={control}
name="description"
render={({ field: { onChange, value } }) => (
<CustomEditor onChange={onChange} initialData={value} />
)}
/>
setValue akan bekerja:
setValue("description", details.htmlDescription);
Kesimpulan
Masalah initial data di form sudah diperbaiki dengan:
- CustomEditor yang diperbaiki dengan useEffect
- FormEditor baru yang lebih robust
- Form yang menggunakan FormEditor
Sekarang setValue akan bekerja dengan benar dan initial data akan ditampilkan di editor!