import type { RefComponentMountAdapter } from '../types/refComponentMount'; import { defaultDomMountAdapter } from './defaultDomMountAdapter'; import { createBrowserRequiredError } from '../env'; import { mergeNativeAdapter, resolveNativeRefComponentMount, clearNativeRefComponentMount, } from './nativeRuntimeAdapter'; /** 声明不支持命令式挂载时的占位适配器 */ const unsupportedMountAdapter: RefComponentMountAdapter = { id: 'native-unsupported', mount() { return Promise.reject(new Error( '[use-modal-ref] refComponentMount is null on mergeNativeAdapter — ' + 'imperative mount is not supported in this environment.', )); }, }; /** * 注册全局命令式挂载(兼容 API,等价于 mergeNativeAdapter({ refComponentMount }))。 * @param adapter - 自定义挂载适配器 * @returns 当前生效的适配器 */ function mergeRefComponentMount(adapter: RefComponentMountAdapter): RefComponentMountAdapter { mergeNativeAdapter({ refComponentMount: adapter }); return adapter; } /** * 解析本次挂载应使用的适配器:单次 override > native > 默认 DOM。 * @param override - 单次调用传入的适配器 * @returns 挂载适配器 */ function getRefComponentMountAdapter( override?: RefComponentMountAdapter, ): RefComponentMountAdapter { if (override) { return override; } const native = resolveNativeRefComponentMount(); if (native.kind === 'adapter') { return native.adapter; } if (native.kind === 'none') { return unsupportedMountAdapter; } return defaultDomMountAdapter; } /** * 是否使用内置 DOM 适配器(无 override 且无 native 注入时)。 * @param override - 单次调用传入的适配器 * @returns 是否为默认 DOM 实现 */ function isDefaultDomMountAdapter(override?: RefComponentMountAdapter): boolean { return getRefComponentMountAdapter(override) === defaultDomMountAdapter; } /** * 重置全局挂载适配器(兼容 API)。 */ function resetRefComponentMountAdapter(): void { clearNativeRefComponentMount(); } /** * 无 DOM 时构造命令式 API 环境错误。 * @param apiName - API 名称 * @returns Error */ function createImperativeMountEnvironmentError(apiName: string): Error { const native = resolveNativeRefComponentMount(); if (native.kind === 'none') { return new Error( `[use-modal-ref] ${apiName} is not supported — refComponentMount is null on mergeNativeAdapter.`, ); } return createBrowserRequiredError(apiName); } export { mergeRefComponentMount, getRefComponentMountAdapter, isDefaultDomMountAdapter, resetRefComponentMountAdapter, defaultDomMountAdapter, createImperativeMountEnvironmentError, unsupportedMountAdapter, };