import { isDef, isNumber, isPlainObject, isPromise, isObj } from './validator'; import { canIUseGroupSetData, canIUseNextTick, getSystemInfoSync, } from './version'; export { isDef } from './validator'; export { getSystemInfoSync } from './version'; export function range(num: number, min: number, max: number) { return Math.min(Math.max(num, min), max); } export function nextTick(cb: (...args: any[]) => void) { if (canIUseNextTick()) { wx.nextTick(cb); } else { setTimeout(() => { cb(); }, 1000 / 30); } } export function addUnit(value?: string | number): string | undefined { if (!isDef(value)) { return undefined; } value = String(value); return isNumber(value) ? `${value}px` : value; } export function requestAnimationFrame(cb: () => void) { const systemInfo = getSystemInfoSync(); if (systemInfo.platform === 'devtools') { return setTimeout(() => { cb(); }, 1000 / 30); } return wx .createSelectorQuery() .selectViewport() .boundingClientRect() .exec(() => { cb(); }); } export function pickExclude(obj: unknown, keys: string[]) { if (!isPlainObject(obj)) { return {}; } return Object.keys(obj).reduce((prev, key) => { if (!keys.includes(key)) { prev[key] = obj[key]; } return prev; }, {}); } export function getRect( context: WechatMiniprogram.Component.TrivialInstance, selector: string ) { return new Promise( (resolve) => { wx.createSelectorQuery() .in(context) .select(selector) .boundingClientRect() .exec((rect = []) => resolve(rect[0])); } ); } export function getAllRect( context: WechatMiniprogram.Component.TrivialInstance, selector: string ) { return new Promise( (resolve) => { wx.createSelectorQuery() .in(context) .selectAll(selector) .boundingClientRect() .exec((rect = []) => resolve(rect[0])); } ); } export function groupSetData( context: WechatMiniprogram.Component.TrivialInstance, cb: () => void ) { if (canIUseGroupSetData()) { context.groupSetData(cb); } else { cb(); } } export function toPromise(promiseLike: Promise | unknown) { if (isPromise(promiseLike)) { return promiseLike; } return Promise.resolve(promiseLike); } export function getCurrentPage() { const pages = getCurrentPages(); return pages[pages.length - 1] as T & WechatMiniprogram.Page.TrivialInstance; } export function deepClone | null | undefined>( obj: T ): T { if (!isDef(obj)) { return obj; } if (Array.isArray(obj)) { return obj.map((item) => deepClone(item)) as unknown as T; } if (isObj(obj)) { const to = {} as Record; Object.keys(obj).forEach((key: string) => { // @ts-ignore to[key] = deepClone(obj[key]); }); return to as T; } return obj; }