

class ReactUtils {
    /**
     * 改变react input的值
     * @param {*} inputDom react input dom元素
     * @param {*} newText 新的值
     */
    changeReactInputValue(inputDom,newText){
        let lastValue = inputDom.value;
        inputDom.value = newText;
        let event = new Event('input', { bubbles: true });
        event.simulated = true;
	let tracker = inputDom._valueTracker;
	if (tracker) {
  	tracker.setValue(lastValue);
	}
	inputDom.dispatchEvent(event);
}

/**
 * 修改react的input框的值，vue的没有测试
 * @param inputEl 输入框元素
 * @param newText 新的文本
 */
  setReactInputValue(inputEl, newText) {
    //1. 聚焦元素（模拟用户点击）
    inputEl.focus();
    //2. 使用setter方式修改值
    Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set.call(inputEl, newText);
    //3. 创建并触发input事件（让React检测到变化）
    const inputEvent = new Event('input', {bubbles: true, cancelable: true});
    inputEl.dispatchEvent(inputEvent);
    //4. 创建并触发change事件（确保所有监听器触发）
    const changeEvent = new Event('change', {bubbles: true});
    // await new Promise(resolve => setTimeout(resolve, time));
    inputEl.dispatchEvent(changeEvent);
    //5. 移除焦点（模拟用户完成操作）
    inputEl.blur();
    }
    
    /**
     * 强制给 React 输入框赋值 (增强版)
     */
    setReactValue(element, value) {
        if (!element || element.value == value) return; // 弱类型比较，防止 "10" != 10

        const lastValue = element.value;
        element.value = value;
        
        const tracker = element._valueTracker;
        if (tracker) {
            tracker.setValue(lastValue);
        }

        element.dispatchEvent(new Event('click', { bubbles: true }));
        element.dispatchEvent(new Event('focus', { bubbles: true }));
        element.dispatchEvent(new Event('input', { bubbles: true }));
        element.dispatchEvent(new Event('change', { bubbles: true }));
        element.dispatchEvent(new Event('blur', { bubbles: true }));
    }
}


window.reactUtils = new ReactUtils();
