@tarojs/plugin-platform-harmony-ets 4.0.0-beta.6 → 4.0.0-beta.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/apis/base/system.ts +53 -20
  2. package/dist/apis/canvas/index.ts +10 -1
  3. package/dist/apis/device/clipboard.ts +9 -0
  4. package/dist/apis/framework/index.ts +1 -5
  5. package/dist/apis/index.ts +27 -17
  6. package/dist/apis/network/request.ts +5 -5
  7. package/dist/apis/route/index.ts +15 -0
  8. package/dist/apis/storage/index.ts +148 -80
  9. package/dist/apis/ui/animation/animation.ts +71 -28
  10. package/dist/apis/ui/background.ts +2 -1
  11. package/dist/apis/ui/interaction/index.ts +42 -59
  12. package/dist/apis/ui/navigation-bar/index.ts +1 -1
  13. package/dist/apis/ui/scroll/index.ts +1 -1
  14. package/dist/apis/utils/index.ts +1 -1
  15. package/dist/apis/wxml/IntersectionObserver.ts +18 -10
  16. package/dist/apis/wxml/index.ts +2 -0
  17. package/dist/apis/wxml/selectorQuery.ts +25 -12
  18. package/dist/components-harmony-ets/button.ets +48 -34
  19. package/dist/components-harmony-ets/canvas.ets +51 -0
  20. package/dist/components-harmony-ets/checkbox.ets +69 -61
  21. package/dist/components-harmony-ets/form.ets +51 -29
  22. package/dist/components-harmony-ets/icon.ets +31 -19
  23. package/dist/components-harmony-ets/image.ets +34 -14
  24. package/dist/components-harmony-ets/index.ets +92 -0
  25. package/dist/components-harmony-ets/innerHtml.ets +11 -6
  26. package/dist/components-harmony-ets/input.ets +42 -40
  27. package/dist/components-harmony-ets/label.ets +69 -42
  28. package/dist/components-harmony-ets/listView.ets +26 -0
  29. package/dist/components-harmony-ets/movableArea.ets +126 -0
  30. package/dist/components-harmony-ets/movableView.ets +73 -0
  31. package/dist/components-harmony-ets/navigationBar.ets +65 -0
  32. package/dist/components-harmony-ets/pageMeta.ets +94 -0
  33. package/dist/components-harmony-ets/picker.ets +42 -38
  34. package/dist/components-harmony-ets/progress.ets +52 -0
  35. package/dist/components-harmony-ets/pseudo.ets +80 -0
  36. package/dist/components-harmony-ets/radio.ets +71 -64
  37. package/dist/components-harmony-ets/richText.ets +14 -30
  38. package/dist/components-harmony-ets/scrollList.ets +94 -0
  39. package/dist/components-harmony-ets/scrollView.ets +61 -57
  40. package/dist/components-harmony-ets/slider.ets +15 -14
  41. package/dist/components-harmony-ets/stickySection.ets +42 -0
  42. package/dist/components-harmony-ets/style.ets +372 -130
  43. package/dist/components-harmony-ets/swiper.ets +61 -20
  44. package/dist/components-harmony-ets/switch.ets +30 -28
  45. package/dist/components-harmony-ets/{index.ts → tag.ts} +6 -0
  46. package/dist/components-harmony-ets/text.ets +159 -51
  47. package/dist/components-harmony-ets/textArea.ets +35 -34
  48. package/dist/components-harmony-ets/utils/AttributeManager.ets +1 -1
  49. package/dist/components-harmony-ets/utils/DynamicCenter.ts +1 -1
  50. package/dist/components-harmony-ets/utils/flexManager.ets +47 -19
  51. package/dist/components-harmony-ets/utils/helper.ets +18 -5
  52. package/dist/components-harmony-ets/utils/htmlParser/HarmonyHTMLParser.ts +1 -2
  53. package/dist/components-harmony-ets/utils/htmlParser/index.ts +1 -1
  54. package/dist/components-harmony-ets/utils/index.ts +54 -50
  55. package/dist/components-harmony-ets/utils/styles.ets +170 -93
  56. package/dist/components-harmony-ets/video.ets +34 -20
  57. package/dist/components-harmony-ets/view.ets +63 -52
  58. package/dist/components-harmony-ets/webView.ets +40 -34
  59. package/dist/index.d.ts +152 -0
  60. package/dist/index.js +82 -39
  61. package/dist/index.js.map +1 -1
  62. package/dist/runtime-ets/bom/document.ts +6 -4
  63. package/dist/runtime-ets/bom/getComputedStyle.ts +2 -2
  64. package/dist/runtime-ets/bom/window.ts +7 -0
  65. package/dist/runtime-ets/current.ts +3 -0
  66. package/dist/runtime-ets/dom/bind.ts +30 -13
  67. package/dist/runtime-ets/dom/cssNesting.ts +411 -0
  68. package/dist/runtime-ets/dom/cssStyleDeclaration.ts +27 -41
  69. package/dist/runtime-ets/dom/document.ts +22 -8
  70. package/dist/runtime-ets/dom/element/canvas.ts +136 -0
  71. package/dist/runtime-ets/dom/element/element.ts +334 -58
  72. package/dist/runtime-ets/dom/element/form.ts +23 -26
  73. package/dist/runtime-ets/dom/element/index.ts +25 -2
  74. package/dist/runtime-ets/dom/element/movableArea.ts +12 -0
  75. package/dist/runtime-ets/dom/element/movableView.ts +193 -0
  76. package/dist/runtime-ets/dom/element/normal.ts +35 -8
  77. package/dist/runtime-ets/dom/element/progress.ts +12 -0
  78. package/dist/runtime-ets/dom/element/scrollView.ts +1 -0
  79. package/dist/runtime-ets/dom/element/text.ts +1 -8
  80. package/dist/runtime-ets/dom/element/video.ts +5 -3
  81. package/dist/runtime-ets/dom/element/webView.ts +11 -3
  82. package/dist/runtime-ets/dom/event.ts +0 -1
  83. package/dist/runtime-ets/dom/eventTarget.ts +0 -3
  84. package/dist/runtime-ets/dom/node.ts +46 -28
  85. package/dist/runtime-ets/dom/stylesheet/covertWeb2Hm.ts +416 -235
  86. package/dist/runtime-ets/dom/stylesheet/index.ts +28 -308
  87. package/dist/runtime-ets/dom/stylesheet/type.ts +49 -9
  88. package/dist/runtime-ets/dom/stylesheet/util.ts +33 -27
  89. package/dist/runtime-ets/index.ts +2 -2
  90. package/dist/runtime-ets/interface/event.ts +1 -1
  91. package/dist/runtime-ets/utils/index.ts +67 -11
  92. package/dist/runtime-ets/utils/info.ts +1 -1
  93. package/dist/runtime-framework/react/app.ts +7 -2
  94. package/dist/runtime-framework/react/index.ts +0 -2
  95. package/dist/runtime-framework/react/native-page.ts +32 -14
  96. package/dist/runtime-framework/react/page.ts +3 -8
  97. package/dist/runtime-framework/solid/app.ts +25 -45
  98. package/dist/runtime-framework/solid/connect.ts +21 -3
  99. package/dist/runtime-framework/solid/hooks.ts +16 -11
  100. package/dist/runtime-framework/solid/index.ts +6 -2
  101. package/dist/runtime-framework/solid/page.ts +84 -30
  102. package/dist/runtime-framework/solid/reconciler/props.ts +65 -20
  103. package/dist/runtime-framework/solid/reconciler/render.ts +16 -6
  104. package/dist/runtime-framework/solid/reconciler/use.ts +0 -1
  105. package/dist/runtime-framework/solid/utils/index.ts +0 -2
  106. package/dist/runtime-utils.d.ts +827 -0
  107. package/dist/runtime-utils.js +411 -200
  108. package/dist/runtime-utils.js.map +1 -1
  109. package/dist/runtime.d.ts +1 -0
  110. package/dist/runtime.js +411 -200
  111. package/dist/runtime.js.map +1 -1
  112. package/index.js +3 -1
  113. package/package.json +13 -13
  114. package/static/media/cancel.svg +1 -1
  115. package/static/media/circle.svg +1 -1
  116. package/static/media/clear.svg +1 -1
  117. package/static/media/download.svg +1 -1
  118. package/static/media/info.svg +1 -1
  119. package/static/media/info_circle.svg +1 -1
  120. package/static/media/search.svg +1 -1
  121. package/static/media/success.svg +1 -1
  122. package/static/media/success_no_circle.svg +1 -1
  123. package/static/media/warn.svg +1 -1
  124. package/types/harmony.d.ts +4 -0
  125. package/types/index.d.ts +4 -0
  126. /package/dist/runtime-framework/solid/{contant.ts → constant.ts} +0 -0
@@ -1,24 +1,56 @@
1
+ import ConfigurationConstant from '@ohos.app.ability.ConfigurationConstant'
1
2
  // 设备信息,从 API Version 6 开始支持
2
3
  import deviceInfo from '@ohos.deviceInfo'
3
4
  // 显示设备属性,从 API Version 7 开始支持
4
5
  import _display from '@ohos.display'
5
6
  // 从 API Version 7 开始支持
6
7
  import i18n from '@ohos.i18n'
7
- // 设备信息 从API Version 6开始,该接口不再维护,推荐使用新接口'@ohos.deviceInfo'进行设备信息查询
8
- import deviceMethod from '@system.device'
8
+ import { Current, window } from '@tarojs/runtime'
9
9
 
10
10
  import { callAsyncFail, callAsyncSuccess } from '../utils'
11
11
 
12
12
  import type Taro from '@tarojs/taro/types'
13
13
 
14
- const display = _display.getDefaultDisplaySync()
14
+ let display
15
+ let navigationIndicatorRect
16
+ let safeArea: TaroGeneral.SafeAreaResult | null = null
17
+ let statusBarHeight
18
+ let windowRect
15
19
 
16
- let device
20
+ (Current as any).contextPromise.then((context) => {
21
+ const win = window.__ohos.getLastWindow(context)
22
+ win.then(mainWindow => {
23
+ const topRect = mainWindow.getWindowAvoidArea(window.__ohos.AvoidAreaType.TYPE_SYSTEM).topRect
24
+ navigationIndicatorRect = mainWindow.getWindowAvoidArea(window.__ohos.AvoidAreaType.TYPE_NAVIGATION_INDICATOR).bottomRect
25
+ statusBarHeight = topRect.top + topRect.height
26
+ windowRect = mainWindow.getWindowProperties().windowRect
17
27
 
18
- deviceMethod.getInfo({
19
- success: data => {
20
- device = data
21
- }
28
+ try {
29
+ display = _display.getDefaultDisplaySync()
30
+ // @ts-ignore
31
+ display.getCutoutInfo((err, { boundingRects = [], waterfallDisplayAreaRects = {} }: _display.CutoutInfo = {}) => {
32
+ if (err?.code) {
33
+ console.error('Failed to get cutout info', JSON.stringify(err))
34
+ return
35
+ }
36
+
37
+ const top = Math.max(...boundingRects.map(rect => rect.top + rect.height), waterfallDisplayAreaRects.top?.top + waterfallDisplayAreaRects.top?.height, statusBarHeight)
38
+ const bottom = Math.min(display.height - waterfallDisplayAreaRects.bottom?.top, navigationIndicatorRect?.top)
39
+ const left = waterfallDisplayAreaRects.left?.left + waterfallDisplayAreaRects.left?.width
40
+ const right = display.width - waterfallDisplayAreaRects.right?.left
41
+ safeArea = {
42
+ top,
43
+ bottom,
44
+ left,
45
+ right,
46
+ height: bottom - top,
47
+ width: right - left,
48
+ }
49
+ })
50
+ } catch (e) {
51
+ console.error('Failed to get display', e)
52
+ }
53
+ })
22
54
  })
23
55
 
24
56
  /* 同步版本 */
@@ -32,7 +64,7 @@ export const getSystemInfoSync: typeof Taro.getSystemInfoSync = function () {
32
64
  res.cameraAuthorized = null // 允许使用摄像头的开关 boolean
33
65
  res.enableDebug = null // 是否已打开调试 boolean
34
66
  res.fontSizeSetting = null // 用户字体大小(单位px) number
35
- res.language = i18n && i18n.getSystemLanguage && i18n.getSystemLanguage() // string
67
+ res.language = i18n?.getSystemLanguage?.() // string
36
68
  res.locationAuthorized = null // 定位的开关 boolean
37
69
  res.locationEnabled = null // 地理位置的系统开关 boolean
38
70
  res.microphoneAuthorized = null // 麦克风的开关 boolean
@@ -43,17 +75,18 @@ export const getSystemInfoSync: typeof Taro.getSystemInfoSync = function () {
43
75
  res.notificationSoundAuthorized = false // 通知带有声音的开关(仅 iOS 有效)boolean
44
76
  res.phoneCalendarAuthorized = null // 使用日历的开关 boolean
45
77
  res.wifiEnabled = false // Wi-Fi 的系统开关 boolean
46
- res.pixelRatio = null // 设备像素比,number
47
- res.platform = 'android' // 客户端平台 string
48
- res.safeArea = null // 在竖屏正方向下的安全区域 General.SafeAreaResult
49
- res.screenHeight = display && display.height // 屏幕高度,单位px number
50
- res.screenWidth = display && display.width // 屏幕宽度,单位px number
51
- res.statusBarHeight = null // 状态栏的高度,单位px number
52
- res.system = deviceInfo && deviceInfo.osFullName // 操作系统及版本 string
53
- res.theme = null // 系统当前主题,取值为light或dark 'light' | 'dark'
54
- res.windowWidth = device && device.windowWidth // 可使用窗口宽度,单位px number
55
- res.windowHeight = device && device.windowHeight // 可使用窗口高度,单位px number
56
- res.version = deviceInfo && deviceInfo.displayVersion // 版本号 string
78
+ res.pixelRatio = display && display.densityPixels // 设备像素比,number
79
+ res.platform = 'harmony' // 客户端平台 string
80
+ res.safeArea = safeArea // 在竖屏正方向下的安全区域 General.SafeAreaResult
81
+ res.screenHeight = display?.height // 屏幕高度,单位px number
82
+ res.screenWidth = display?.width // 屏幕宽度,单位px number
83
+ res.statusBarHeight = statusBarHeight // 状态栏的高度,单位px number
84
+ res.system = deviceInfo?.osFullName // 操作系统及版本 string
85
+ // Note: 更新配置时才能记录
86
+ res.theme = AppStorage.get('__TARO_APP_CONFIG')?.colorMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK ? 'dark' : 'light' // 系统当前主题,取值为light或dark 'light' | 'dark'
87
+ res.windowHeight = windowRect?.height // 可使用窗口高度,单位px number
88
+ res.windowWidth = windowRect?.width // 可使用窗口宽度,单位px number
89
+ res.version = deviceInfo?.displayVersion // 版本号 string
57
90
 
58
91
  return res
59
92
  }
@@ -1,12 +1,21 @@
1
+ import { eventSource } from '@tarojs/runtime'
2
+
1
3
  import { temporarilyNotSupport } from '../utils'
2
4
 
5
+ // @ts-ignore
6
+ import type { TaroCanvasElement } from '@tarojs/runtime'
3
7
  // 画布
4
8
 
5
9
  /** 创建离屏 canvas 实例 */
6
10
  export const createOffscreenCanvas = /* @__PURE__ */ temporarilyNotSupport('createOffscreenCanvas')
7
11
 
8
12
  /** 创建 canvas 的绘图上下文 CanvasContext 对象 */
9
- export const createCanvasContext = /* @__PURE__ */ temporarilyNotSupport('createOffscreenCanvas')
13
+ // export const createCanvasContext = /* @__PURE__ */ temporarilyNotSupport('createOffscreenCanvas')
14
+ export const createCanvasContext = (canvasId: string) => {
15
+ const dom = eventSource.get(`canvasId-${canvasId}`)
16
+ // return dom as TaroCanvasElement
17
+ if (dom) return (dom as unknown as TaroCanvasElement).context
18
+ }
10
19
 
11
20
  /** 把当前画布指定区域的内容导出生成指定大小的图片 */
12
21
  export const canvasToTempFilePath = /* @__PURE__ */ temporarilyNotSupport('createOffscreenCanvas')
@@ -1,5 +1,6 @@
1
1
  // 从 API Version 6 开始支持
2
2
  import pasteboard from '@ohos.pasteboard'
3
+ import promptAction from '@ohos.promptAction'
3
4
  import { isString } from '@tarojs/shared'
4
5
 
5
6
  import { callAsyncFail, getParameterError, object2String } from '../utils'
@@ -38,6 +39,14 @@ export const setClipboardData: typeof Taro.setClipboardData = function (options)
38
39
  }
39
40
  callAsyncFail(reject, res, options)
40
41
  } else {
42
+
43
+ promptAction.showToast({
44
+ message: '内容已复制',
45
+ duration: 1500,
46
+ bottom: '50%',
47
+ showMode: 1 // 设置弹窗显示模式,显示在应用之上。
48
+ })
49
+
41
50
  return handle.success({
42
51
  data,
43
52
  }, { resolve, reject })
@@ -1,5 +1,3 @@
1
- import { Current } from '@tarojs/runtime'
2
-
3
1
  import { temporarilyNotSupport } from '../utils'
4
2
 
5
3
  export const ENV_TYPE = {
@@ -19,12 +17,10 @@ export function getEnv () {
19
17
  return ENV_TYPE.HARMONY
20
18
  }
21
19
 
22
- export { Current }
23
-
24
20
  // TODO
25
21
  export const getCurrentPages = () => []
26
22
 
27
- export const getCurrentInstance = () => Current
23
+ export { Current, getCurrentInstance } from '@tarojs/runtime'
28
24
 
29
25
  export const requirePlugin = temporarilyNotSupport('requirePlugin')
30
26
 
@@ -33,7 +33,7 @@ const defaultUnitPrecision = 5
33
33
  const defaultTargetUnit = 'vp'
34
34
 
35
35
  export function getApp () {
36
- return Current.app
36
+ return Current.app || {}
37
37
  }
38
38
 
39
39
  export function initPxTransform ({
@@ -58,20 +58,25 @@ export function initPxTransform ({
58
58
 
59
59
  const display = _display.getDefaultDisplaySync()
60
60
 
61
+ let displayWidth = display.width
62
+ let ratioCache: number | false = false
61
63
  let designWidthFunc: (input: number) => number
64
+ let designWidth = defaultDesignWidth
62
65
  function getRatio (value: number) {
63
- const config = (Current as any).taro?.config || {}
64
- if (!isFunction(designWidthFunc)) {
65
- designWidthFunc = isFunction(config.designWidth)
66
- ? config.designWidth
67
- : () => config.designWidth
68
- }
69
- const designWidth = designWidthFunc(value) || defaultDesignWidth
70
- const deviceRatio = config.deviceRatio || defaultDesignRatio
71
- if (!(designWidth in deviceRatio)) {
72
- throw new Error(`deviceRatio 配置中不存在 ${designWidth} 的设置!`)
66
+ // Note: 提前调用 display 可能无法获取正确值
67
+ if (ratioCache === false || displayWidth !== display.width) {
68
+ const config = (Current as any).taro?.config || {}
69
+ if (!isFunction(designWidthFunc)) {
70
+ designWidthFunc = isFunction(config.designWidth)
71
+ ? config.designWidth
72
+ : () => config.designWidth
73
+ designWidth = designWidthFunc(value) || defaultDesignWidth
74
+ }
75
+ displayWidth = display.width
76
+ ratioCache = Math.min(display.width, display.height) / designWidth
73
77
  }
74
- return Math.min(display.width, display.height) / designWidth / deviceRatio[designWidth]
78
+
79
+ return ratioCache
75
80
  }
76
81
 
77
82
  // Note: 设置为 style 单位时会自动完成设计稿转换,设计开发者调用 API 时也许抹平差异,例如 pageScrollTo[option.offsetTop]
@@ -79,6 +84,9 @@ export function pxTransformHelper (size: number, unit?: string, isNumber = false
79
84
  const config = (Current as any).taro?.config || {}
80
85
  const targetUnit = unit || config.targetUnit || defaultTargetUnit
81
86
 
87
+ if (targetUnit === 'PX') {
88
+ return px2vp(size * display.scaledDensity) + 'vp'
89
+ }
82
90
  const ratio = getRatio(size)
83
91
  let val = size * ratio
84
92
 
@@ -92,19 +100,19 @@ export function pxTransformHelper (size: number, unit?: string, isNumber = false
92
100
  return isNumber ? val : val + targetUnit
93
101
  }
94
102
 
95
- export function pxTransform (size: number): number {
103
+ export function pxTransform (size: number): number | string {
96
104
  const config = (Current as any).taro?.config || {}
97
105
  const targetUnit = config.targetUnit || defaultTargetUnit
98
106
 
99
- let val = size
107
+ const val = size
100
108
  switch (targetUnit) {
101
109
  case 'vp':
102
- val = px2vp(size)
103
- break
110
+ return pxTransformHelper(size, 'px')
111
+ // return `${size}lpx`
104
112
  default:
105
113
  // NOTE: 鸿蒙环境下 style 会自动完成设计稿转换,无需在方法内二次调整
106
114
  }
107
- return val + config.targetUnit
115
+ return val + targetUnit
108
116
  }
109
117
 
110
118
  export function canIUseWebp () {
@@ -120,5 +128,7 @@ export function getAppInfo () {
120
128
  }
121
129
  }
122
130
 
131
+ initNativeApi(taro)
132
+
123
133
  export * from './apis'
124
134
  export default taro
@@ -6,7 +6,7 @@
6
6
  // ✅ RequestTask.onHeadersReceived
7
7
 
8
8
  import http from '@ohos.net.http'
9
- import { isString, isUndefined } from '@tarojs/shared'
9
+ import { isString } from '@tarojs/shared'
10
10
 
11
11
  import { callAsyncFail, callAsyncSuccess, validateParams } from '../utils'
12
12
 
@@ -59,10 +59,10 @@ export const request: typeof Taro.request = function (options) {
59
59
  }
60
60
 
61
61
  // 检查 Header 是否有 Referer
62
- if (isUndefined(header.Referer)) {
63
- const error = { errMsg: 'request fail parameter error: the header doesn‘t support Referer property' }
64
- callAsyncFail(reject, error, options)
65
- }
62
+ // if (isUndefined(header.Referer)) {
63
+ // const error = { errMsg: 'request fail parameter error: the header doesn‘t support Referer property' }
64
+ // callAsyncFail(reject, error, options)
65
+ // }
66
66
 
67
67
  // 检查 method 是否正确
68
68
  if (method) {
@@ -16,6 +16,21 @@ function parseURL (raw = ''): [string, Record<string, unknown>] {
16
16
  const [urlStr, queryStr = ''] = raw.split('?')
17
17
  const query: Record<string, unknown> = queryToJson(queryStr)
18
18
  let url = urlStr.replace(/^\//, '')
19
+
20
+ // 处理相对路径
21
+ if (url.indexOf('.') === 0) {
22
+ const page = router.getState()
23
+ const parts = page.path.split('/')
24
+ parts.pop()
25
+ url.split('/').forEach((item) => {
26
+ if (item === '.') {
27
+ return
28
+ }
29
+ item === '..' ? parts.pop() : parts.push(item)
30
+ })
31
+ url = parts.join('/')
32
+ }
33
+
19
34
  if (isTabPage(url)) {
20
35
  query.$page = url
21
36
  url = TARO_TABBAR_PAGE_PATH
@@ -3,114 +3,181 @@
3
3
  * https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/js-apis-data-preferences-0000001427745052-V3
4
4
  */
5
5
  import bundleManager from '@ohos.bundle.bundleManager'
6
- import dataPreferences from '@ohos.data.preferences'
7
- import hilog from '@ohos.hilog'
6
+ import distributedKVStore from '@ohos.data.distributedKVStore'
8
7
  import { Current } from '@tarojs/runtime'
9
8
 
10
- import { callAsyncFail, callAsyncSuccess, temporarilyNotSupport, validateParams } from '../utils'
9
+ import { temporarilyNotSupport, validateParams } from '../utils'
10
+ import { MethodHandler } from '../utils/handler'
11
11
 
12
12
  import type Taro from '@tarojs/taro/types'
13
13
 
14
- const preferencesPromise = (Current as any).contextPromise
15
- .then((context) => {
16
- return bundleManager
17
- .getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
18
- .then(data => {
19
- return dataPreferences
20
- .getPreferences(context, `${data.appInfo.uid}Store`)
21
- })
22
- })
23
- .catch((error) => {
24
- hilog.error(0x0000, 'TaroFailedTag', 'Failed to load the storage. Cause: %{public}s', error.code ? JSON.stringify(error) : error.message || error)
25
- })
14
+ let context
15
+ let kvManager: distributedKVStore.KVManager
16
+ let kvStore: distributedKVStore.SingleKVStore
17
+ let kvStorePromise: Promise<void>
18
+
19
+ (Current as any).contextPromise.then((ctx) => {
20
+ context = ctx
21
+ const kvManagerConfig: distributedKVStore.KVManagerConfig = {
22
+ context: context,
23
+ bundleName: 'com.example.taro'
24
+ }
26
25
 
27
- async function getItem (key: string): Promise<{ result: boolean, data?: number | string | boolean }> {
28
26
  try {
29
- const preferences = await preferencesPromise
30
- const item = await preferences.get(key, null)
27
+ // 创建KVManager实例
28
+ kvManager = distributedKVStore.createKVManager(kvManagerConfig)
29
+ // 继续创建获取数据库
30
+ const options: distributedKVStore.Options = {
31
+ createIfMissing: true,
32
+ encrypt: false,
33
+ backup: false,
34
+ autoSync: false,
35
+ // kvStoreType不填时,默认创建多设备协同数据库
36
+ kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
37
+ // 多设备协同数据库:kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION,
38
+ securityLevel: distributedKVStore.SecurityLevel.S1
39
+ }
31
40
 
32
- return { result: true, data: item }
33
- } catch (error) {
34
- return { result: false }
41
+ const data = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
42
+ kvStorePromise = new Promise(resolve => {
43
+ kvManager.getKVStore<distributedKVStore.SingleKVStore>(`${data.appInfo.uid}Store`, options, (err, store: distributedKVStore.SingleKVStore) => {
44
+ if (err) {
45
+ console.error(`Failed to get KVStore: Code:${err.code},message:${err.message}`)
46
+ return
47
+ }
48
+ kvStore = store
49
+ // 请确保获取到键值数据库实例后,再进行相关数据操作
50
+ resolve()
51
+ })
52
+ })
53
+ } catch (e) {
54
+ console.error(`Failed to create KVManager. Code:${e.code},message:${e.message}`)
35
55
  }
36
- }
56
+
57
+ return context
58
+ })
37
59
 
38
60
  const storageSchema = {
39
61
  key: 'String'
40
62
  }
41
63
 
64
+ function checkContextExist (api: string, isAsync = false) {
65
+ if (!context) {
66
+ const message = `${api} 调用失败,Taro 不支持过早地调用 ${api},请确保页面已经渲染完成再调用此 API`
67
+ if (isAsync) {
68
+ return {
69
+ isExist: false,
70
+ error: Promise.reject(new Error(message))
71
+ }
72
+ } else {
73
+ console.warn(message)
74
+
75
+ return {
76
+ isExist: false,
77
+ }
78
+ }
79
+ }
80
+
81
+ return {
82
+ isExist: true,
83
+ }
84
+ }
85
+
42
86
  export function getStorage<T = any> (options: Taro.getStorage.Option<T>) {
87
+ const name = 'getStorage'
88
+ const { isExist, error } = checkContextExist(name, true)
89
+
90
+ if (!isExist) {
91
+ return error
92
+ }
93
+
94
+ const { key, success, fail, complete } = options || {}
95
+ const handle = new MethodHandler<{data: any}>({ name, success, fail, complete })
96
+
43
97
  return new Promise((resolve, reject) => {
44
- try {
45
- validateParams('getStorage', options, storageSchema)
46
- } catch (error) {
47
- const res = { errMsg: error.message }
48
- return callAsyncFail(reject, res, options)
49
- }
50
- getItem(options.key).then(({ result, data }) => {
51
- const res: Record<string, any> = { errMsg: 'getStorage:ok' }
52
-
53
- if (result) {
54
- res.data = data
55
- callAsyncSuccess(resolve, res, options)
56
- } else {
57
- res.errMsg = 'getStorage:fail data not found'
58
- callAsyncFail(reject, res, options)
98
+ kvStorePromise.then(() => {
99
+ try {
100
+ validateParams(name, options, storageSchema)
101
+ } catch (error) {
102
+ const res = { errMsg: error.message }
103
+ return handle.fail(res, { resolve, reject })
59
104
  }
105
+
106
+ kvStore = kvStore as distributedKVStore.SingleKVStore
107
+ kvStore.get(key, (err, data) => {
108
+ if (err) {
109
+ handle.fail({ errMsg: `Failed to get data. Code:${err.code},message:${err.message}` }, { resolve, reject })
110
+ return
111
+ }
112
+
113
+ handle.success({ data }, { resolve, reject })
114
+ })
60
115
  })
61
116
  })
62
117
  }
63
118
 
64
119
  export function setStorage (options: Taro.setStorage.Option) {
65
- return new Promise((resolve, reject) => {
66
- try {
67
- validateParams('setStorage', options, storageSchema)
68
- } catch (error) {
69
- const res = { errMsg: error.message }
70
- return callAsyncFail(reject, res, options)
71
- }
120
+ const name = 'setStorage'
121
+ const { isExist, error } = checkContextExist(name, true)
72
122
 
73
- const { key, data } = options
74
- const res = { errMsg: 'setStorage:ok' }
123
+ if (!isExist) {
124
+ return error
125
+ }
75
126
 
76
- preferencesPromise.then(async (preferences) => {
77
- await preferences.put(key, data)
78
- await preferences.flush()
127
+ const { key, data, success, fail, complete } = options || {}
128
+ const handle = new MethodHandler({ name, success, fail, complete })
79
129
 
80
- callAsyncSuccess(resolve, res, options)
130
+ return new Promise((resolve, reject) => {
131
+ kvStorePromise.then(() => {
132
+ try {
133
+ validateParams(name, options, storageSchema)
134
+ } catch (error) {
135
+ const res = { errMsg: error.message }
136
+ return handle.fail(res, { resolve, reject })
137
+ }
138
+
139
+ kvStore = kvStore as distributedKVStore.SingleKVStore
140
+ kvStore.put(key, data, (err) => {
141
+ if (err) {
142
+ handle.fail({ errMsg: `Failed to put data. Code:${err.code},message:${err.message}` }, { resolve, reject })
143
+ return
144
+ }
145
+
146
+ handle.success({}, { resolve, reject })
147
+ })
81
148
  })
82
149
  })
83
150
  }
84
151
 
85
152
  export function removeStorage (options: Taro.removeStorage.Option) {
86
- return new Promise((resolve, reject) => {
87
- try {
88
- validateParams('removeStorage', options, storageSchema)
89
- } catch (error) {
90
- const res = { errMsg: error.message }
91
- return callAsyncFail(reject, res, options)
92
- }
153
+ const name = 'removeStorage'
154
+ const { isExist, error } = checkContextExist(name, true)
93
155
 
94
- const { key } = options
95
-
96
- preferencesPromise.then(async (preferences) => {
97
- await preferences.delete(key)
98
- await preferences.flush()
99
-
100
- const res = { errMsg: 'removeStorage:ok' }
101
- callAsyncSuccess(resolve, res, options)
102
- })
103
- })
104
- }
156
+ if (!isExist) {
157
+ return error
158
+ }
105
159
 
106
- export function clearStorage (options: Taro.clearStorage.Option) {
107
- return new Promise(resolve => {
108
- preferencesPromise.then(async (preferences) => {
109
- await preferences.clear()
110
- await preferences.flush()
160
+ const { key, success, fail, complete } = options || {}
161
+ const handle = new MethodHandler({ name, success, fail, complete })
111
162
 
112
- const res = { errMsg: 'clearStorage:ok' }
113
- callAsyncSuccess(resolve, res, options)
163
+ return new Promise((resolve, reject) => {
164
+ kvStorePromise.then(() => {
165
+ try {
166
+ validateParams(name, options, storageSchema)
167
+ } catch (error) {
168
+ const res = { errMsg: error.message }
169
+ return handle.fail(res, { resolve, reject })
170
+ }
171
+
172
+ kvStore = kvStore as distributedKVStore.SingleKVStore
173
+ kvStore.delete(key, (err) => {
174
+ if (err) {
175
+ handle.fail({ errMsg: `Failed to delete data. Code:${err.code},message:${err.message}` }, { resolve, reject })
176
+ return
177
+ }
178
+
179
+ handle.success({}, { resolve, reject })
180
+ })
114
181
  })
115
182
  })
116
183
  }
@@ -118,11 +185,6 @@ export function clearStorage (options: Taro.clearStorage.Option) {
118
185
  export const getStorageInfoSync = temporarilyNotSupport('getStorageInfoSync')
119
186
  export const getStorageInfo = temporarilyNotSupport('getStorageInfo')
120
187
 
121
- export const getStorageSync = temporarilyNotSupport('getStorageSync', 'getStorage')
122
- export const setStorageSync = temporarilyNotSupport('setStorageSync', 'setStorage')
123
- export const clearStorageSync = temporarilyNotSupport('clearStorageSync', 'clearStorage')
124
- export const removeStorageSync = temporarilyNotSupport('removeStorageSync', 'removeStorage')
125
-
126
188
  export const createBufferURL = /* @__PURE__ */ temporarilyNotSupport('createBufferURL')
127
189
  export const revokeBufferURL = /* @__PURE__ */ temporarilyNotSupport('revokeBufferURL')
128
190
 
@@ -131,5 +193,11 @@ export const batchSetStorage = /* @__PURE__ */ temporarilyNotSupport('batchSetSt
131
193
  export const batchGetStorageSync = /* @__PURE__ */ temporarilyNotSupport('batchGetStorageSync')
132
194
  export const batchGetStorage = /* @__PURE__ */ temporarilyNotSupport('batchGetStorage')
133
195
 
196
+ export const clearStorage = temporarilyNotSupport('clearStorage')
197
+ export const getStorageSync = temporarilyNotSupport('getStorageSync', 'getStorage')
198
+ export const setStorageSync = temporarilyNotSupport('setStorageSync', 'setStorage')
199
+ export const clearStorageSync = temporarilyNotSupport('clearStorageSync', 'clearStorage')
200
+ export const removeStorageSync = temporarilyNotSupport('removeStorageSync', 'removeStorage')
201
+
134
202
  export * from './background-fetch'
135
203
  export * from './cache-manager'