import React from "react"; import { DesignerContext, DesignerContextValue } from "../context"; import type { ComponentInfo } from "../type"; import "./design-wrapper.scss"; /** 设计模式包裹层的组件类型名,注册在 DesignComponentView 的组件类型表中 */ export declare const DESIGN_COMPONENT_WRAPPER_TYPE = "DesignComponentWrapper"; /** 拖拽传输数据的标识名:组件库面板写入,设计区包裹层读取(与 node-shop-v2 store-design 一致) */ export declare const COMPONENT_TRANSFER_DATA_NAME = "component"; /** 从拖拽数据中读取组件信息,数据缺失或格式不对返回 undefined */ export declare function readComponentInfoFromDataTransfer(dataTransfer: DataTransfer): ComponentInfo | undefined; interface DesignComponentWrapperProps { /** 被包裹组件解析后的 React 元素(由解析器传入) */ children?: React.ReactNode; /** 被包裹组件的显示名(包裹时从组件数据计算,用于悬浮标签) */ displayName?: string; /** 被包裹组件是否处于选中状态(包裹时从 selected 标记取得) */ childSelected?: boolean; [key: string]: any; buttons?: React.ReactNode; } /** * 设计模式包裹层:包裹页面的顶层子组件,提供 * 悬浮操作栏(上移/下移/选择/删除)、选中高亮,以及组件库面板拖放的插入位置指示 * (悬停上半部插入之前、下半部插入之后)。 * 操作通过 DesignerContext 中 Designer 提供的方法执行,与属性面板选中状态双向同步。 * 参考 node-shop-v2 store-design 的 ComponentWrapper 交互。 */ export declare class DesignComponentWrapper extends React.Component { static contextType: React.Context; context: React.ContextType; constructor(props: DesignComponentWrapperProps); /** * 子组件 ref 在 commit 阶段才挂载(runtime-parser 把实例按 id 暴露到全局), * 因此只在 commit 之后(componentDidMount/Update)读取 getComponent 判定是否显示刷新按钮, * 渲染阶段沿用上一次 state,避免重挂载/重渲染时 ref 瞬间未就绪导致按钮闪烁或消失。 */ private syncReloadable; componentDidMount(): void; componentDidUpdate(): void; /** 被包裹组件的 id:从解析后的子元素 props 中取得 */ private get childId(); private selectComponent; private moveComponent; private removeComponent; /** * 被包裹组件实例具备 reload 方法时,点击操作栏刷新按钮调用它重新加载数据。 * 防重复点击:reloading 期间直接忽略,并把按钮置为 disabled 且显示旋转动画; * reload 可能返回 Promise(异步)或同步完成,统一在完成后恢复按钮。 * safetyTimer 兜底:reload 未返回 Promise 或长时间不 resolve 时,强制在 5s 后恢复,避免按钮卡死。 */ private reload; private onDragOver; private onDragLeave; private onDrop; render(): React.ReactNode; } export {};