import 'core-js/features/promise'; import 'core-js/features/url'; import 'core-js/features/array/includes'; import 'core-js/features/object/assign'; import 'proxy-polyfill'; import { TinyEmitter } from 'tiny-emitter'; import { ContainerMethod, ContainerRect, DisableMentionCards, FileType, InvokeMethod, MouseMovePayload, ReadyState, PerformanceEntry, DeviceMode, GenerateUrlHandler, APIAdaptor, RequestContext, ShowToastOptions, Credentials } from 'shimo-js-sdk-shared'; import { Document, DocumentPro, Presentation, Spreadsheet, Table, Form, Flowchart } from '.'; import { EmptyPageOptions } from './types/EmptyPage'; import { BaseEditor } from './types/BaseEditor'; export interface HeaderBarsCommandDefinition { id: string; section?: string; order?: number; label?: string; visible?: boolean; disabled?: boolean; type?: 'action' | 'structural'; renderType?: string; src?: string; onClick?: () => void | Promise; } export interface HeaderBarsCommandState extends HeaderBarsCommandDefinition { type: 'action' | 'structural'; } export interface HeaderBarsCommandRef { readonly id: string; visible: boolean; disabled: boolean; onCommandClick?: () => void | Promise; getState: () => HeaderBarsCommandState | undefined; } export interface HeaderBarsFacade { visible: boolean; getVisible: () => Promise; setVisible: (visible: boolean) => Promise; addCommand: (command: HeaderBarsCommandDefinition, posCommand: string, pos?: 'before' | 'after') => Promise; getCommand: (id: string) => HeaderBarsCommandRef; listViewCommands: () => Promise; setTitleDraft: (title: string) => Promise; confirmTitleChange: (title: string) => Promise; } export declare const MessageEvent: typeof InvokeMethod; export declare class OfficeSDK extends TinyEmitter { /** * 编辑器页面对应的 iframe 元素。需要注意调整父元素大小来控制 iframe 大小。 */ element: HTMLIFrameElement; readonly uuid: string; readonly userUuid?: string; /** * 传统文档编辑器实例 * @deprecated - 用 `sdk.getEditor()` 替代 */ documentPro?: DocumentPro.Editor; /** * 轻文档编辑器实例 * @deprecated - 用 `sdk.getEditor()` 替代 */ document?: Document.Editor; /** * 表格编辑器实例 * @deprecated - 用 `sdk.getEditor()` 替代 */ spreadsheet?: Spreadsheet.Editor; /** * 专业幻灯片编辑器实例 * @deprecated - 用 `sdk.getEditor()` 替代 */ presentation?: Presentation.Editor; /** * 应用表格编辑器实例 * @deprecated - 用 `sdk.getEditor()` 替代 */ table?: Table.Editor; /** * 表单编辑器实例 * @deprecated - 用 `sdk.getEditor()` 替代 */ form?: Form.Editor; /** * 图谱编辑器实例 * @deprecated - 用 `sdk.getEditor()` 替代 */ flowchart?: Flowchart.Editor; readonly headerBars: HeaderBarsFacade; private _fileType; private readonly messageHandler; /** * 内部 event emitter,比如用来中转 editor 事件 */ private readonly emitter; private channel; private readonly connectOptions; private _readyState; private editor; private readonly startParams; private collaborators; private readonly apiAdaptor; private readonly apiAdaptorContext; private readonly handledMessageCache; /** * 消息过期时间,单位毫秒,默认 5 分钟 */ private readonly messageExpires; /** * SDK 服务器的地址 */ private readonly endpoint; private readonly sameOrigin; private headerBarsVisible; private readonly headerBarsCommands; private readonly headerBarsCommandOverrides; private readonly headerBarsCommandRefs; private readonly onViewportResize; /** * 归一化后的缺省页配置,构造时一次算完,后续仅读取。 */ private readonly normalizedEmptyPage; private readonly preloadAckTimeoutMs; private readonly preloadDoneTimeoutMs; private readonly preloadReadyTimeoutMs; constructor(options: OfficeSDKOptions); get fileType(): FileType; get readyState(): ReadyState; getEditor(): T; /** * 更新鉴权 signature 和 token * @deprecated - 用 `OfficeSDKOptions.getCredentials()` 替代 */ setCredentials(payload: { signature: string; token: string; }): Promise; /** * 设置石墨的鉴权 signature。用于实时更新鉴权信息,优化用户出现因长时间放置,鉴权失败而引起的体验问题。 * @deprecated - 用 `sdk.setCredentials()` 替代 */ setSignature(signature: string): Promise; /** * 设置您系统的鉴权 token。用于实时更新鉴权信息,优化用户出现因长时间放置,鉴权失败而引起的体验问题。 * @deprecated - 用 `sdk.setCredentials()` 替代 */ setToken(token: string): Promise; /** * 获取性能信息片段列表,由于性能标记是分段的、异步的,因此每次调用时获取的列表有可能不一致 */ getPerformanceEntries(): Promise; disconnect(): void; /** * 初始化 SDK,返回 Promise,当 ReadState 变为 Ready 或 Failed 时,Promise 将被 resolve。 * Promise resovled 不代表编辑器已经完整加载完毕,只代表 SDK 已经准备好了。 * 同时 Promise 一直 pending 也不代表编辑器加载失败,只代表无法通过 SDK 和编辑器交互。 * 比如受浏览器限制无法发出 postMessage() 时,Promise 将会一直 pending。 */ init(): Promise; private initIframe; private runPreloadHandshake; private initChannel; /** * 初始化处理编辑器需要容器返回数据的方法 */ private bindContainerMethodHandlers; private initHeaderBarsFacade; private invokeHeaderBars; private syncHeaderBarsCommands; private applyHeaderBarsChanged; private syncHeaderBarsVisible; private setHeaderBarsVisible; private getHeaderBarsCommandRef; private initEditor; private shouldHandleMessage; private getContainerRect; private updateCollaborators; } /** * 需要容器提供给编辑器使用的方法 */ export interface ContainerMethods { /** * 获取容器尺寸等信息 */ [ContainerMethod.GetContainerRect]?: () => ContainerRect; /** * 处理石墨文档内点击链接事件 */ [ContainerMethod.OpenLink]?: ( /** * 目标链接 */ url: string, /** * 意义和 window.open 的第二个参数一样,属于石墨建议的值,具体是否需要使用请接入方自行判断。 */ target?: string) => void; /** * 生成插入到石墨文档中的链接,用于处理 @ 文件等功能需要插入的链接 */ [ContainerMethod.GenerateUrl]?: GenerateUrlHandler; /** * 用于移动端处理 @ 点击事件 */ [ContainerMethod.MentionClickHandlerForMobile]?: (payload: MouseMovePayload) => void; /** * 用于从客户业务 URL 中获取对应的文件 ID,供编辑器使用。 */ [ContainerMethod.GetFileInfoFromUrl]?: (url: string) => Promise<{ /** * 文件 ID */ fileId: string; } | undefined>; /** * 用于显示客户自定义toast。 */ [ContainerMethod.ShowToast]?: (options: ShowToastOptions) => Promise; /** * 通知用户执行自定义操作,操作由用户自定义按钮触发 */ [ContainerMethod.HandleCustomTask]?: (taskId: string) => Promise; /** * 请求容器获取鉴权信息 * @returns {Credentials} 鉴权信息 */ [ContainerMethod.GetCredentials]: () => Promise; } export declare enum Event { /** * SDK 初始化事件,用于内部逻辑 */ SDKInit = "SDKInit", /** * 错误事件,包含编辑器抛出的错误 */ Error = "error", /** * OfficeSDK 状态变化事件 */ ReadyState = "readyState", /** * 编辑器真正完成"首屏渲染"的信号。 * * 由 iframe 内编辑器在自身渲染稳定后通过 channel 发送,SDK 侧转发为本事件。 * 宿主可按需监听它来区分 SDK Ready 与编辑器视觉首屏完成。 */ EditorRendered = "editorRendered", /** * 编辑器事件 */ EditorEvent = "editorEvent" } /** * iframe 内侧用来上报"编辑器已完成首屏渲染"的 channel 事件名。 * * 与 `InvokeMethod.ReadyState` 的枚举值保持在同一命名空间,但不入 shared 包, * 以免跨端版本耦合。iframe 侧约定写字符串即可。 */ export declare const EDITOR_RENDERED_EVENT = "editorRendered"; export interface Message { uuid?: string; event: string; body: any; error?: Error; } export interface MessageEventPayload { event: InvokeMethod; data: unknown[]; } export interface ContainerMethodPayload { method: ContainerMethod; args: unknown[]; } export interface ReadyStateEvent { state: ReadyState; fileType: FileType; error?: Error | string; } /** * 事件回调函数 */ export type EventCallback = (...args: any[]) => any; /** * SDK toast 文案配置,值仅允许字符串或嵌套对象。 */ export interface SDKToastOptions { [key: string]: string | SDKToastOptions | undefined; } /** * iframe 内置加载页配置,只支持可序列化字段。 */ export interface LoadingOptions { /** * 自定义加载页 Logo。传字符串时作为图片 URL / dataURL 使用; * 传 false 时隐藏 Logo;不传时使用 iframe 内默认石墨 Logo。 */ logo?: string | false; /** * 自定义加载页提示文案。不传时使用 iframe 内默认文案。 */ tip?: string; } /** * OfficeSDK 初始化参数 */ export interface OfficeSDKOptions extends Omit { /** * 石墨 SDK 服务器地址 */ endpoint: string; /** * 您要打开的文档 ID */ fileId: string; /** * 用于石墨 SDK 鉴权用的签名 */ signature: string; /** * iframe 挂载的目标容器 */ container: HTMLElement; /** * 用于您系统鉴权使用的 token */ token: string; /** * 刷新鉴权信息的间隔时间,单位为毫秒 */ refreshCredentialsInterval: number; /** * 添加到 iframe URLSearchParams 的参数列表 */ params?: { [key: string]: string; }; /** * 当前打开模式。`preview` 用于预览态,其余场景默认按 `edit` 处理。 */ mode?: 'edit' | 'preview'; /** * 石墨 SDK URL 参数 url?smParams={params},用于传递石墨 SDK 内部需要的参数。 */ smParams?: string | Record | Array>; /** * 指定石墨 SDK 编辑器界面语言,添加到 iframe URLSearchParams 的参数列表。 * 若未指定,则 iframe 使用服务器设置的默认语言。 * * 目前支持的语言取值: * 1. zh-CN(简体中文) * 2. en(英文) * 3. ja(日文) * 4. ar-SA(阿拉伯语) * 5. ru-RU(俄语) */ lang?: 'zh-CN' | 'en' | 'ja' | 'ar-SA' | 'ru-RU'; /** * 是否禁用提及的浮动卡片组件 */ disableMentionCards?: DisableMentionCards; /** * 用于覆盖编辑器内部分 toast 文案。 * 支持套件类型:form、documentPro、presentation、spreadsheet、table(仅对支持 ui 配置的套件生效)。 * 当前已文档化支持字段:ui.toast.tips.edit.noPermission。 * 其他字段暂不作为稳定公共 API 承诺。 */ ui?: { toast?: SDKToastOptions; }; /** * 用于控制 iframe feature policy (https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Feature-Policy) 。 * 会覆盖默认的 policy,因此使用时需要注意把需要的 policy 写完整。 */ allowPolicy?: string; /** * 是否开启调试模式,true 会通过 console 打印一些信息 */ debug?: boolean; /** * 编辑器插件配置,不是所有类型的套件都支持,以套件是否提供 PluginOptions 为准 */ plugins?: Spreadsheet.PluginOptions | Table.PluginOptions; /** * iframe postMessage 的目标 origin,默认是当前页面的 location.origin。 * @deprecated */ targetOrigin?: string; /** * 使用什么设备类型模式,会直接影响功能和样式,不传值或空字符串则默认用 user-agent 自动判断。受版本限制,不是所有类型都支持。 */ deviceMode?: DeviceMode; /** * 是否禁用默认的签名组件,以支持自定义签名组件。受版本限制,部分版本的特定类型文档才支持。 */ disableSignatureComponent?: boolean; /** * 控制 headerbar 组件是否展示,false 表示隐藏。 */ headerBarsVisible?: boolean; /** * 是否显示内置的加载动画,只在静态资源加载到编辑器渲染这个阶段显示 */ showLoadingEffect?: boolean; /** * 是否启用 iframe 内置默认加载页,默认 false。 * 隐藏后接入方可自定义外部 loading。 */ showLoading?: boolean; /** * iframe 内置加载页配置。仅在 `showLoading === true` * 或 `showLoadingEffect === true` 时透传给 iframe。 */ loadingOptions?: LoadingOptions; /** * 用于在编辑器发起 API 请求时,对请求参数进行修改的函数。详细用法见文档。 */ apiAdaptor?: APIAdaptor; /** * 用于在编辑器发起 API 请求时,对请求参数进行修改的函数时传入的上下文数据。 */ apiAdaptorContext?: RequestContext; /** * 用于判断通信消息过期时间,过期后的消息会被抛弃,默认 5 分钟。 */ messageExpires?: number; /** * 加密后的用户id */ userUuid?: string; /** * 缺省页(Empty Page)配置。 * - 不传或传 `true`:启用默认缺省页能力(有内置图片与默认文案,**无按钮**) * - 传 `false`:完全关闭 * - 传对象:精细控制启用的 scene、token 过期策略,以及每个 scene 的 * 文案/按钮自定义(`overrides`)。默认不渲染任何按钮,宿主需要按钮时必须 * 在 `overrides[scene].primary/secondary` 里显式配置 label,点击统一触发 * `emptyPageAction` 事件由宿主处理。 * * 相关事件:`emptyPageShown` / `emptyPageAction` / `emptyPageHidden`。 * 详见 `./types/EmptyPage.ts`。 */ emptyPage?: boolean | EmptyPageOptions; }