diff --git a/packages/uni-api/src/helpers/api.ts b/packages/uni-api/src/helpers/api.ts index bd1a21b45e36729cdcaa9943da964b2d0c901963..3c986f298797aa7874a7c73c2354edb28e95d51d 100644 --- a/packages/uni-api/src/helpers/api.ts +++ b/packages/uni-api/src/helpers/api.ts @@ -1,6 +1,6 @@ import { ProtocolOptions } from '../protocols/type' -export function createApi any>( +export function createApi( fn: T, validate?: ProtocolOptions | ProtocolOptions[] ) { diff --git a/packages/uni-api/src/index.ts b/packages/uni-api/src/index.ts index 111ef0c1ce01aeb369b128ab88b601c202d6cc06..7e2445aa4df0574abe02c759917c203a5955fb98 100644 --- a/packages/uni-api/src/index.ts +++ b/packages/uni-api/src/index.ts @@ -3,7 +3,6 @@ export * from './service/base/upx2px' export * from './service/base/interceptor' export * from './service/ui/createIntersectionObserver' -export * from './service/ui/createSelectorQuery' // protocols export * from './protocols/base/canIUse' diff --git a/packages/uni-api/src/service/base/base64.ts b/packages/uni-api/src/service/base/base64.ts index ba95b2440d5d9fe0791a3cdd7e37d8988d5511cc..90f2924f1d662db7956903bf6f3ed2c57dbbeb64 100644 --- a/packages/uni-api/src/service/base/base64.ts +++ b/packages/uni-api/src/service/base/base64.ts @@ -8,10 +8,16 @@ import { ArrayBufferToBase64Protocol } from '../../protocols/base/base64' -export const base64ToArrayBuffer = createApi((base64: string) => { - return decode(base64) as ArrayBuffer -}, Base64ToArrayBufferProtocol) +export const base64ToArrayBuffer = createApi( + base64 => { + return decode(base64) as ArrayBuffer + }, + Base64ToArrayBufferProtocol +) -export const arrayBufferToBase64 = createApi((arrayBuffer: ArrayBuffer) => { - return encode(arrayBuffer) as string -}, ArrayBufferToBase64Protocol) +export const arrayBufferToBase64 = createApi( + arrayBuffer => { + return encode(arrayBuffer) as string + }, + ArrayBufferToBase64Protocol +) diff --git a/packages/uni-api/src/service/base/upx2px.ts b/packages/uni-api/src/service/base/upx2px.ts index 427f733a18ab05636fe203310881a114132c14cc..87829587030b1c534cd17d72ff6d2f930fd0b66a 100644 --- a/packages/uni-api/src/service/base/upx2px.ts +++ b/packages/uni-api/src/service/base/upx2px.ts @@ -14,8 +14,8 @@ function checkDeviceWidth() { isIOS = platform === 'ios' } -export const upx2px = createApi( - (number: number, newDeviceWidth: number | undefined) => { +export const upx2px = createApi( + (number, newDeviceWidth?: number) => { if (deviceWidth === 0) { checkDeviceWidth() } diff --git a/packages/uni-api/src/service/ui/createIntersectionObserver.ts b/packages/uni-api/src/service/ui/createIntersectionObserver.ts index 391badaecf421ed92b6bdc6e48f37281cc25bc56..cb4a0053a0801c04b214a14c21d5bf8d61547d30 100644 --- a/packages/uni-api/src/service/ui/createIntersectionObserver.ts +++ b/packages/uni-api/src/service/ui/createIntersectionObserver.ts @@ -1,3 +1,128 @@ +import { extend } from '@vue/shared' + import { createApi } from '../../helpers/api' +import { getCurrentPageVm } from '../utils' + +const defaultOptions = { + thresholds: [0], + initialRatio: 0, + observeAll: false +} + +interface Margins { + bottom?: number + left?: number + right?: number + top?: number +} + +interface RelativeInfo { + selector: string + margins: Margins +} + +type ObserveResultCallback = (result: UniApp.ObserveResult) => void + +interface requestComponentObserver { + reqId: number + reqEnd: boolean + res: UniApp.ObserveResult +} + +let reqComponentObserverId = 1 + +const reqComponentObserverCallbacks: Record = {} + +UniServiceJSBridge.subscribe( + 'requestComponentObserver', + ({ reqId, reqEnd, res }: requestComponentObserver) => { + const callback = reqComponentObserverCallbacks[reqId] + if (callback) { + if (reqEnd) { + return delete reqComponentObserverCallbacks[reqId] + } + callback(res) + } + } +) + +class ServiceIntersectionObserver { + private _reqId?: number + private _options: UniApp.CreateIntersectionObserverOptions + private _component: any + private _pageId: number + + private _relativeInfo: RelativeInfo[] + + constructor( + component: any, + options: UniApp.CreateIntersectionObserverOptions + ) { + this._pageId = component.$page.id + this._component = component._$id || component // app-plus 平台传输_$id + this._options = extend({}, defaultOptions, options || {}) + this._relativeInfo = [] + } + + relativeTo(selector: string, margins: Margins) { + if (this._reqId) { + throw new Error( + 'Relative nodes cannot be added after "observe" call in IntersectionObserver' + ) + } + this._relativeInfo.push({ + selector, + margins + }) + return this + } + + relativeToViewport(margins: Margins) { + return this.relativeTo((null as unknown) as string, margins) + } + + observe(selector: string, callback: ObserveResultCallback) { + if (typeof callback !== 'function') { + return + } + if (this._reqId) { + throw new Error( + '"observe" call can be only called once in IntersectionObserver' + ) + } + + this._reqId = reqComponentObserverId++ + reqComponentObserverCallbacks[this._reqId] = callback + + UniServiceJSBridge.publishHandler( + 'addIntersectionObserver', + { + selector, + reqId: this._reqId, + component: this._component, + options: this._options, + relativeInfo: this._relativeInfo + }, + this._pageId + ) + } + + disconnect() { + UniServiceJSBridge.publishHandler( + 'removeIntersectionObserver', + { + reqId: this._reqId + }, + this._pageId + ) + } +} -export const createIntersectionObserver = createApi(() => {}) +export const createIntersectionObserver = createApi< + typeof uni.createIntersectionObserver +>((context?, options?) => { + if (!context) { + context = getCurrentPageVm() + } + return new ServiceIntersectionObserver(context, options) +}) diff --git a/packages/uni-api/src/service/ui/createSelectorQuery.ts b/packages/uni-api/src/service/ui/createSelectorQuery.ts deleted file mode 100644 index 01a2771cbf5fd579c61c0e21caf19d01972b2a74..0000000000000000000000000000000000000000 --- a/packages/uni-api/src/service/ui/createSelectorQuery.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createApi } from '../../helpers/api' - -export const createSelectorQuery = createApi(() => {}) diff --git a/packages/uni-api/src/service/utils.ts b/packages/uni-api/src/service/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5b995c348d6fe9b14bf40b12f89cf979d1aa2fe --- /dev/null +++ b/packages/uni-api/src/service/utils.ts @@ -0,0 +1,6 @@ +export function getCurrentPageVm() { + const pages = getCurrentPages() + const len = pages.length + const page = pages[len - 1] + return page && (page as any).$vm +} diff --git a/packages/uni-h5/dist/uni-h5.esm.js b/packages/uni-h5/dist/uni-h5.esm.js index 43d20d758db024f8e4b611fc1ee9c66b8a1d47de..0f9e34ecf9c8df7e3f4cb6c574874b5a66dde0a3 100644 --- a/packages/uni-h5/dist/uni-h5.esm.js +++ b/packages/uni-h5/dist/uni-h5.esm.js @@ -1414,9 +1414,76 @@ const promiseInterceptor = { }); } }; -const createIntersectionObserver$1 = /* @__PURE__ */ createApi(() => { +function getCurrentPageVm() { + const pages = getCurrentPages(); + const len = pages.length; + const page = pages[len - 1]; + return page && page.$vm; +} +const defaultOptions = { + thresholds: [0], + initialRatio: 0, + observeAll: false +}; +let reqComponentObserverId = 1; +const reqComponentObserverCallbacks = {}; +UniServiceJSBridge.subscribe("requestComponentObserver", ({reqId, reqEnd, res}) => { + const callback = reqComponentObserverCallbacks[reqId]; + if (callback) { + if (reqEnd) { + return delete reqComponentObserverCallbacks[reqId]; + } + callback(res); + } }); -const createSelectorQuery$1 = /* @__PURE__ */ createApi(() => { +class ServiceIntersectionObserver { + constructor(component, options) { + this._pageId = component.$page.id; + this._component = component._$id || component; + this._options = extend({}, defaultOptions, options || {}); + this._relativeInfo = []; + } + relativeTo(selector, margins) { + if (this._reqId) { + throw new Error('Relative nodes cannot be added after "observe" call in IntersectionObserver'); + } + this._relativeInfo.push({ + selector, + margins + }); + return this; + } + relativeToViewport(margins) { + return this.relativeTo(null, margins); + } + observe(selector, callback) { + if (typeof callback !== "function") { + return; + } + if (this._reqId) { + throw new Error('"observe" call can be only called once in IntersectionObserver'); + } + this._reqId = reqComponentObserverId++; + reqComponentObserverCallbacks[this._reqId] = callback; + UniServiceJSBridge.publishHandler("addIntersectionObserver", { + selector, + reqId: this._reqId, + component: this._component, + options: this._options, + relativeInfo: this._relativeInfo + }, this._pageId); + } + disconnect() { + UniServiceJSBridge.publishHandler("removeIntersectionObserver", { + reqId: this._reqId + }, this._pageId); + } +} +const createIntersectionObserver$1 = /* @__PURE__ */ createApi((context, options) => { + if (!context) { + context = getCurrentPageVm(); + } + return new ServiceIntersectionObserver(context, options); }); const CanIUseProtocol = [ { @@ -1459,11 +1526,8 @@ const canIUse = /* @__PURE__ */ createApi((schema) => { } return true; }, CanIUseProtocol); -const makePhoneCall = /* @__PURE__ */ createApi(({phoneNumber}) => { - window.location.href = `tel:${phoneNumber}`; - return { - errMsg: "makePhoneCall:ok" - }; +const makePhoneCall = /* @__PURE__ */ createApi((option) => { + window.location.href = `tel:${option.phoneNumber}`; }, MakePhoneCallProtocol); const ua = navigator.userAgent; const isAndroid = /android/i.test(ua); @@ -1574,7 +1638,6 @@ const getSystemInfo = /* @__PURE__ */ createApi(() => { }); const openDocument = /* @__PURE__ */ createApi((option) => { window.open(option.filePath); - return true; }, OpenDocumentProtocol); const navigateBack = /* @__PURE__ */ createApi(() => { }); @@ -1594,7 +1657,6 @@ var api = /* @__PURE__ */ Object.freeze({ promiseInterceptor, arrayBufferToBase64, base64ToArrayBuffer, - createSelectorQuery: createSelectorQuery$1, createIntersectionObserver: createIntersectionObserver$1, canIUse, makePhoneCall, @@ -2730,4 +2792,4 @@ function render$a(_ctx, _cache, $props, $setup, $data, $options) { ; script$a.render = render$a; script$a.__file = "packages/uni-h5/src/framework/components/async-loading/index.vue"; -export {script$9 as AsyncErrorComponent, script$a as AsyncLoadingComponent, script$8 as PageComponent, addInterceptor, arrayBufferToBase64, base64ToArrayBuffer, canIUse, createIntersectionObserver$1 as createIntersectionObserver, createSelectorQuery$1 as createSelectorQuery, getApp, getCurrentPages$1 as getCurrentPages, getSystemInfo, getSystemInfoSync, makePhoneCall, navigateBack, navigateTo, openDocument, index as plugin, promiseInterceptor, reLaunch, redirectTo, removeInterceptor, switchTab, uni$1 as uni, upx2px}; +export {script$9 as AsyncErrorComponent, script$a as AsyncLoadingComponent, script$8 as PageComponent, addInterceptor, arrayBufferToBase64, base64ToArrayBuffer, canIUse, createIntersectionObserver$1 as createIntersectionObserver, getApp, getCurrentPages$1 as getCurrentPages, getSystemInfo, getSystemInfoSync, makePhoneCall, navigateBack, navigateTo, openDocument, index as plugin, promiseInterceptor, reLaunch, redirectTo, removeInterceptor, switchTab, uni$1 as uni, upx2px}; diff --git a/packages/uni-h5/src/service/api/base/canIUse.ts b/packages/uni-h5/src/service/api/base/canIUse.ts index cda96d07af30ed444eee2f6e14f2b20e3698324a..ce6535e0dc8261113e248e101ac628b4cd43e9dd 100644 --- a/packages/uni-h5/src/service/api/base/canIUse.ts +++ b/packages/uni-h5/src/service/api/base/canIUse.ts @@ -12,7 +12,7 @@ const SCHEMA_CSS = { 'css.constant': cssSupports('top:constant(a)') } -export const canIUse = createApi((schema: string) => { +export const canIUse = createApi((schema: string) => { if (hasOwn(SCHEMA_CSS, schema)) { return SCHEMA_CSS[schema] } diff --git a/packages/uni-h5/src/service/api/device/getSystemInfo.ts b/packages/uni-h5/src/service/api/device/getSystemInfo.ts index 30afaa5bd55e2276bc79504ebc989004a0a7bf96..2eca6cda57627efa195d84a123d5d7e76c220c50 100644 --- a/packages/uni-h5/src/service/api/device/getSystemInfo.ts +++ b/packages/uni-h5/src/service/api/device/getSystemInfo.ts @@ -2,6 +2,6 @@ import { createApi } from '@dcloudio/uni-api' import { getSystemInfoSync } from './getSystemInfoSync' -export const getSystemInfo = createApi(() => { +export const getSystemInfo = createApi(() => { return getSystemInfoSync() }) diff --git a/packages/uni-h5/src/service/api/device/getSystemInfoSync.ts b/packages/uni-h5/src/service/api/device/getSystemInfoSync.ts index 918529c05e1fca9bec2894e4feee556e9369a12e..be41999b054126d1ef40fedd699a8aab720dc293 100644 --- a/packages/uni-h5/src/service/api/device/getSystemInfoSync.ts +++ b/packages/uni-h5/src/service/api/device/getSystemInfoSync.ts @@ -16,7 +16,7 @@ const isIOS = /iphone|ipad|ipod/i.test(ua) /** * 获取系统信息-同步 */ -export const getSystemInfoSync = createApi(() => { +export const getSystemInfoSync = createApi(() => { var screen = window.screen var pixelRatio = window.devicePixelRatio // 横屏时 iOS 获取的屏幕宽高颠倒,进行纠正 @@ -133,5 +133,5 @@ export const getSystemInfoSync = createApi(() => { bottom: safeAreaInsets.bottom, left: safeAreaInsets.left } - } + } as UniApp.GetSystemInfoResult }) diff --git a/packages/uni-h5/src/service/api/device/makePhoneCall.ts b/packages/uni-h5/src/service/api/device/makePhoneCall.ts index 0faa270811e79a6fc98be9b72d360e94fc02961b..368452ea8a42155e0dc1fdd4d19ff5c9ccb77903 100644 --- a/packages/uni-h5/src/service/api/device/makePhoneCall.ts +++ b/packages/uni-h5/src/service/api/device/makePhoneCall.ts @@ -1,11 +1,5 @@ import { createApi, MakePhoneCallProtocol } from '@dcloudio/uni-api' -export const makePhoneCall = createApi( - ({ phoneNumber }: { phoneNumber: string }) => { - window.location.href = `tel:${phoneNumber}` - return { - errMsg: 'makePhoneCall:ok' - } - }, - MakePhoneCallProtocol -) +export const makePhoneCall = createApi(option => { + window.location.href = `tel:${option.phoneNumber}` +}, MakePhoneCallProtocol) diff --git a/packages/uni-h5/src/service/api/file/openDocument.ts b/packages/uni-h5/src/service/api/file/openDocument.ts index d7a5076230db1d77d687f80529375bfa0c7dc9af..b7483df7821f267ccae43eb9d269515c5432387f 100644 --- a/packages/uni-h5/src/service/api/file/openDocument.ts +++ b/packages/uni-h5/src/service/api/file/openDocument.ts @@ -1,9 +1,5 @@ import { createApi, OpenDocumentProtocol } from '@dcloudio/uni-api' -interface OpenDocumentOption { - filePath: string -} -export const openDocument = createApi((option: OpenDocumentOption) => { +export const openDocument = createApi(option => { window.open(option.filePath) - return true }, OpenDocumentProtocol) diff --git a/packages/uni-h5/src/service/api/index.ts b/packages/uni-h5/src/service/api/index.ts index a1b5b903fa72de98de49f264c093a8bd7e9c2012..3a311192682d3e60c3a50693c6d8aeff743c52dd 100644 --- a/packages/uni-h5/src/service/api/index.ts +++ b/packages/uni-h5/src/service/api/index.ts @@ -19,6 +19,5 @@ export { promiseInterceptor, arrayBufferToBase64, base64ToArrayBuffer, - createSelectorQuery, createIntersectionObserver } from '@dcloudio/uni-api' diff --git a/packages/uni-h5/src/service/api/route/navigateBack.ts b/packages/uni-h5/src/service/api/route/navigateBack.ts index 55de23fbef73ddb5c674f7d62cd084894db8c282..6cc4755e983b7fbefc61c0aba74b969375d9c0ab 100644 --- a/packages/uni-h5/src/service/api/route/navigateBack.ts +++ b/packages/uni-h5/src/service/api/route/navigateBack.ts @@ -1,3 +1,3 @@ import { createApi } from '@dcloudio/uni-api' -export const navigateBack = createApi(() => {}) +export const navigateBack = createApi(() => {}) diff --git a/packages/uni-h5/src/service/api/route/navigateTo.ts b/packages/uni-h5/src/service/api/route/navigateTo.ts index d9dde8b44f907eb3264f2934adc18be1aee4542a..43ded7807075f95c6b40d2909e6eee594a236f7f 100644 --- a/packages/uni-h5/src/service/api/route/navigateTo.ts +++ b/packages/uni-h5/src/service/api/route/navigateTo.ts @@ -1,3 +1,3 @@ import { createApi } from '@dcloudio/uni-api' -export const navigateTo = createApi(() => {}) +export const navigateTo = createApi(() => {})