/** * Indicates the Json types, incldue `undefind` cause of * Sometimes we allow some typing property is optional. */ export type Json = undefined | null | boolean | number | string | Json[] | { [prop: string]: Json; }; /** * 跨 `webview` 异步调用任何webview的数据内容, 并获取返回的回调结果 * Note: 注意当使用sendCrossWebviewCall通知其他webview执行H5注册的回调的时候, 如果当前webview需要退出, 则务必使用sendCrossWebviewCall的needClose 来控制 * 不能在sendCrossWebviewCall 通过使用needClose=false, 来执行通知, 同时执行webviewback()主动关闭当前webview这样操作可能会存在时机问题导致执行结果不符合预期. */ export type FabricCrossWebviewCallOptions = { /** * 返回的页面数,如果 delta 大于现有页面数,则返回到首页, 可以通过 `getCurrentPages()`返回所有的栈 * e.g. A->B->C->D (当前焦点webview为D) * delta为正值(+1)表示当前webview往前面(D->A)的webview通讯, delta为负值(-1),表示当前webview往后面(A->D)的webview通讯. * @default +1 */ delta: number; /** * 当前delta为正的时候并且超出了所有的webview栈个数, 我们处理方式, 如果needClose=true我们是关闭所有, 但是有的业务场景希望, 这个时候只关闭当前webview * 可以通过这个设置为返回 `1` */ overflowDelta?: number; /** * 当且仅当delta为正的值的时候, 往前面的webview通讯的时候才有是否关闭通讯webview之间的其他webview (D -> A), 默认关闭B,C * @default true */ needClose?: boolean; /** * 被调用的webview栈的web注册好的方法名字 */ method: string; /** * 传递给被调用webview栈的web注册方法的数据内容 */ data: T; }; export type FabricWebviewCrossWebviewCallApi = (options: FabricCrossWebviewCallOptions) => void; export type FabricWebviewGetCurrentPagesOptions = { /** * 是否计算webview栈中穿插native页面 * @default true */ includeNativePage?: boolean; }; export type FabricWebviewGetCurrentPagesApi = (options?: FabricWebviewGetCurrentPagesOptions) => number; export type FabricWebviewHideNavbarApi = () => void; export type FabricWebviewLocationToOptions = { /** * 让指定网页地址在当前webview容器跳转, 并指定是否产生浏览器栈, 默认产生 replace: false */ url: string; /** * 是否提供当前浏览器的栈, 类似location.replace的能力. * @default false */ replace?: boolean; }; export type FabricWebviewLocationToApi = (options: FabricWebviewLocationToOptions) => void; export type FabricWebviewNavigateBackOptions = { /** * 返回的页面数,如果 delta 大于现有页面数,则返回到首页。 * @default 1 */ delta: number; /** * 是否计算webview栈中穿插native页面 * @default true */ includeNativePage?: boolean; }; export type FabricWebviewNavgateBackApi = (options?: FabricWebviewNavigateBackOptions) => void; export type FabricWebviewNavigateToOptions = { /** * 需要跳转的应用内非 tabBar 的页面的路径 (代码包路径), 路径后可以带参数。 * 参数与路径之间使用 ? 分隔,参数键与参数值用 = 相连,不同参数用 & 分隔; * 如 'path?key=value&key2=value2' */ url: string; /** * 是否保留加载webview的动画加载器, true: 保持动画不关闭,手动关闭; false: 资源加载完毕后自动关闭 * @default false */ keepIndicator?: boolean; /** * 是否禁用手势返回, IOS支持, 部分安卓华为机器也有其类似功能, URL协议启动webview默认都是不禁用gestureBack能力的. * @default true */ disableGestureBack?: boolean; /** * 不透明度 * @default 0.5 */ overlayOpacity?: number; /** * 点击透明遮罩是否关闭当前webview * @default false */ overlayClickClose?: boolean; /** * 全屏webview还是半屏webview * Note: 半屏webview不支持自定义, 大小有native 写死, `half`模式只支持iOS(单独启一个容器栈, 而不是一个webview, android 暂不支持.) */ screen?: "full" | "half" | T; /** * 动画方向从下往上top, 动画方向从右往左left, 从左往右只支持全屏, 从上往下支持全屏+半屏+自定义高度 */ direction?: "top" | "left"; }; export type FabricWebviewNavigateToApi = (options: FabricWebviewNavigateToOptions) => void; export type FabricWebviewRedirectToOptions = { /** * 需要跳转的应用内非 tabBar 的页面的路径 (代码包路径), 路径后可以带参数。 * 参数与路径之间使用 ? 分隔,参数键与参数值用 = 相连,不同参数用 & 分隔;如 'path?key=value&key2=value2' */ url: string; /** * 是否保留加载webview的动画加载器, true: 保持动画不关闭,手动关闭; false: 资源加载完毕后自动关闭 * @default false */ keepIndicator?: boolean; /** * 不透明度 * @default 0.5 */ overlayOpacity?: number; /** * 点击透明遮罩是否关闭当前webview * @default false */ overlayClickClose?: boolean; /** * 全屏webview还是半屏webview * Note: 半屏webview不支持自定义, 大小有native 写死, `half`模式只支持iOS(单独启一个容器栈, 而不是一个webview, android 暂不支持.) */ screen?: "full" | "half" | T; /** * 动画方向从下往上top, 动画方向从右往左left, 从左往右只支持全屏, 从上往下支持全屏+半屏+自定义高度 */ direction?: "top" | "left"; }; export type FabricWebviewRedirectToApi = (options: FabricWebviewRedirectToOptions) => void; /** * 关闭所有页面,打开到应用内的某个页面 */ export type FabricWebviewRelaunchOptions = { /** * 需要跳转的应用内页面路径,路径后可以带参数。 * 参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如 'path?key=value&key2=value2' */ url: string; /** * 是否保留加载webview的动画加载器, true: 保持动画不关闭,手动关闭; false: 资源加载完毕后自动关闭 * @default false */ keepIndicator?: boolean; /** * 不透明度 * @default 0.5 */ overlayOpacity?: number; /** * 点击透明遮罩是否关闭当前webview * @default false */ overlayClickClose?: boolean; /** * 全屏webview还是半屏webview * Note: 半屏webview不支持自定义, 大小有native 写死, `half`模式只支持iOS(单独启一个容器栈, 而不是一个webview, android 暂不支持.) */ screen?: "full" | "half" | T; /** * 动画方向从下往上top, 动画方向从右往左left, 从左往右只支持全屏, 从上往下支持全屏+半屏+自定义高度 */ direction?: "top" | "left"; }; export type FabricWebviewRelaunchApi = (options: FabricWebviewRelaunchOptions) => void; /** * 注册当前webview的onShow, onHide * 考虑场景 WebviewA->webviewB, webviewB 退出 WebviewA, webviewA 再次打开WebviewB. * 1. 启动webviewA, A 执行onload, 当A 打开 B, 则A执行onHide, B执行onLoad * 2. B返回 A, B执行onDestroy, A执行onShow, A再此打开B, A执行onHide, B执行onLoad. * 3. 直到A再返回, A执行onDestory * 4. 进入后台执行onHide, 后台进入前台执行onShow */ export type FabricWebviewSubscriptionOptions = { /** * webview处于激活状态的时候执行. 第一次打开不执行onShow只执行onLoad */ onShow?: (() => void) | (() => Promise); /** * 当前webview实例处于非激活态(切换到后台、手机熄屏、页面前进等) */ onHide?: (() => void) | (() => Promise); /** * 页面第一次加载完毕后执行,首次执行, 每次webview只执行一次 */ onLoad?: (() => void) | (() => Promise); /** * 切换到后台时触发 */ onBackground?: (() => void) | (() => Promise); /** * iOS特有, 当未禁用backGesture的时候, 可以尝试调用backGesture功能. * 注意此处的callback 不要做网络请求, 以及其他异步耗时较长的逻辑 * Note *通常此处用来调用 `sendCrossWebviewCall(delta值需要手动减1, 因为动画结束栈已经退出)`* * @returns */ onIosBackGesture?: (() => void) | (() => Promise); /** * 用户触发截屏时触发(Android需要在APP启动时检查文件路径读取权限,有权限再初始化截屏监听) */ onScreenShot?: ((res?: { webviewActive: boolean; }) => void) | (() => Promise); }; export type FabricWebviewSubscriptionApi = (options: FabricWebviewSubscriptionOptions) => { off: () => void; }; export type FabricWebviewSwitchTabOptions = { /** * 需要跳转的 tabBar 页面的索引值 `0,1,2,3,4` */ index: number; /** * 是否要清理掉当前tab中已启动的栈列表, Android所有tab共享一个栈, always会清掉, 此配置只针对IOS * @default true */ cleanStacks?: boolean; }; export type FabricWebviewSwitchTabApi = (options: FabricWebviewSwitchTabOptions) => void; export type FabricWebviewApi = { /** * 跨 `webview` 异步调用任何webview的数据内容, 并获取返回的回调结果 */ sendCrossWebviewCall: FabricWebviewCrossWebviewCallApi; /** * 获取当前webview页面栈。数组中第一个元素为首页,最后一个元素为当前页面 */ getCurrentPages: FabricWebviewGetCurrentPagesApi; /** * 关闭当前页面,返回上一页面或多级页面。可通过获取当前的页面栈, 决定需要返回几层 */ navigateBack: FabricWebviewNavgateBackApi; /** * 保留当前页面,打开新的webview页面, 但是不能跳到 tabbar 页面。 * 使用 navigateBack 可以返回到原页面。 */ navigateTo: FabricWebviewNavigateToApi; /** * 关闭当前页面,打开新的webview页面。但是不允许跳转到 tabbar 页面 */ redirectTo: FabricWebviewRedirectToApi; /** * 保留当前webview窗口,刷新打开下一个指定的网页, 并且自动强制重置navbar的所有配置(自动重新获取新的URL地址的document.title) * 并且让默认的back按钮支持栈会退, 再到webview退出, 如果新页面自定义配置了navbar, 新Navbar行为能力与 `setNavbar`配置能力为准. */ locationTo: FabricWebviewLocationToApi; /** * 关闭所有页面,打开到应用内的某个页面, 保留当前tabbar, 停留的页面如果有. */ reLaunch: FabricWebviewRelaunchApi; /** * 跳转到 tabBar 页面,并关闭其他所有非 tabBar webview页面 */ switchTab: FabricWebviewSwitchTabApi; /** * 订阅webview状态, 目前支持onShow, onHide, onLoad, onBackground, onIosBackGesture. */ subscription: FabricWebviewSubscriptionApi; /** * 隐藏navbar */ hideNavbar: FabricWebviewHideNavbarApi; }; export declare const fabricWebview: FabricWebviewApi; export {};