import { useEffect, useRef } from "react";
import { ReactEditor } from "slate-react";
import { useRefFunction } from "../../Hooks/useRefFunction";
/**
 * 把外部受控的 `value` 同步到底层 MarkdownEditor。
 *
 * 单一职责：仅处理「外部 value → 编辑器内容」的单向同步及其防御逻辑。
 *
 * 防御策略：
 * 1. **来源守卫**：若 `props.value` 与 `lastEditorValueRef` 相等，说明该 value
 *    本就是编辑器自己刚刚 emit 出去再回流的，无需写回。
 * 2. **聚焦守卫**：若编辑器正处于聚焦状态（用户正在敲键），父级因 debounce/批
 *    更新而迟到的 stale `props.value` 一旦写入，会触发 `ReactEditor.deselect()`
 *    抛 `InvalidStateError`（"Failed to execute 'collapseToEnd' on 'Selection'"）
 *    导致整棵树白屏。此时直接跳过写回。
 *
 * `store.ts` 中 `_safeDeselect` 是兜底防御；不调用 `setMDContent` 才是干净修复。
 */ export var useEditorValueSync = function useEditorValueSync(param) {
    var value = param.value, markdownEditorRef = param.markdownEditorRef;
    /**
   * 记录编辑器自身最近一次 emit 的 value。
   * 当 `props.value === lastEditorValueRef.current` 时，
   * 说明该次 props 变更只是受控回流，编辑器内部已经是最新状态。
   */ var lastEditorValueRef = useRef(undefined);
    var onEditorChange = useRefFunction(function(next) {
        lastEditorValueRef.current = next;
    });
    useEffect(function() {
        var _markdownEditorRef_current_markdownEditorRef, _markdownEditorRef_current, _markdownEditorRef_current_store, _markdownEditorRef_current1;
        if (!markdownEditorRef.current) return;
        // Guard 1：来自编辑器自身的回流，跳过。
        if (value === lastEditorValueRef.current) return;
        // Guard 2：编辑器聚焦中（用户正在打字），跳过 stale 写回。
        var slateEditor = (_markdownEditorRef_current = markdownEditorRef.current) === null || _markdownEditorRef_current === void 0 ? void 0 : (_markdownEditorRef_current_markdownEditorRef = _markdownEditorRef_current.markdownEditorRef) === null || _markdownEditorRef_current_markdownEditorRef === void 0 ? void 0 : _markdownEditorRef_current_markdownEditorRef.current;
        if (slateEditor) {
            try {
                if (ReactEditor.isFocused(slateEditor)) return;
            } catch (unused) {
            // 编辑器正在被销毁时 ReactEditor.isFocused 可能抛错，忽略。
            }
        }
        (_markdownEditorRef_current1 = markdownEditorRef.current) === null || _markdownEditorRef_current1 === void 0 ? void 0 : (_markdownEditorRef_current_store = _markdownEditorRef_current1.store) === null || _markdownEditorRef_current_store === void 0 ? void 0 : _markdownEditorRef_current_store.setMDContent(value !== null && value !== void 0 ? value : '');
    // markdownEditorRef 本身是稳定的容器引用，无需作为依赖。
    // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [
        value
    ]);
    return {
        onEditorChange: onEditorChange
    };
};
