@hlw-uni/mp-vue 2.1.70 → 2.1.97

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 (86) hide show
  1. package/README.md +230 -386
  2. package/dist/app.d.ts +1 -1
  3. package/dist/core/index.d.ts +3 -0
  4. package/dist/core/{theme.d.ts → theme/index.d.ts} +6 -1
  5. package/dist/hlw.d.ts +1 -10
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.js +834 -804
  8. package/dist/index.mjs +836 -806
  9. package/dist/utils/ad/index.d.ts +61 -0
  10. package/dist/{composables/utils → utils/common}/index.d.ts +1 -24
  11. package/dist/{composables → utils}/device/index.d.ts +7 -8
  12. package/dist/utils/index.d.ts +5 -0
  13. package/dist/{composables → utils}/navigator/index.d.ts +14 -30
  14. package/dist/{composables → utils}/request/client.d.ts +2 -8
  15. package/dist/{composables → utils}/request/index.d.ts +1 -1
  16. package/dist/{composables → utils}/request/service.d.ts +2 -2
  17. package/package.json +1 -1
  18. package/src/app.ts +2 -2
  19. package/src/components/hlw-add-mini/README.md +56 -9
  20. package/src/components/hlw-add-mini/index.vue +12 -9
  21. package/src/components/hlw-avatar-upload/index.vue +103 -0
  22. package/src/components/hlw-back-top/index.vue +1 -1
  23. package/src/components/hlw-button/index.vue +5 -16
  24. package/src/components/hlw-canvas/index.vue +7 -7
  25. package/src/components/hlw-cell/index.vue +1 -1
  26. package/src/components/{hlw-custom/hlw-custom.vue → hlw-custom-service/hlw-custom-service.vue} +27 -15
  27. package/src/components/hlw-empty/index.vue +14 -0
  28. package/src/components/hlw-header/index.vue +1 -1
  29. package/src/components/hlw-menu/index.vue +40 -37
  30. package/src/components/hlw-nav-bar/index.vue +23 -8
  31. package/src/components/hlw-nickname/index.vue +185 -0
  32. package/src/components/hlw-notice-bar/index.vue +23 -0
  33. package/src/components/hlw-page/index.vue +19 -1
  34. package/src/components/hlw-paging/index.vue +36 -0
  35. package/src/components/hlw-popup/index.vue +23 -0
  36. package/src/components/hlw-reward-ad/index.vue +133 -0
  37. package/src/components/hlw-search/index.vue +25 -0
  38. package/src/components/hlw-sheet/index.vue +1 -1
  39. package/src/components/hlw-status-bar/index.vue +113 -0
  40. package/src/components/hlw-tag/index.vue +22 -0
  41. package/src/core/index.ts +3 -0
  42. package/src/{composables → core}/msg/index.ts +0 -1
  43. package/src/{composables → core}/refs/index.ts +0 -1
  44. package/src/core/theme/index.ts +115 -0
  45. package/src/hlw.ts +1 -21
  46. package/src/index.ts +3 -11
  47. package/src/utils/ad/README.md +114 -0
  48. package/src/utils/ad/index.ts +234 -0
  49. package/src/{composables/utils → utils/common}/index.ts +1 -27
  50. package/src/{composables → utils}/device/index.ts +13 -21
  51. package/src/utils/index.ts +5 -0
  52. package/src/{composables → utils}/navigator/index.ts +30 -31
  53. package/src/{composables → utils}/request/client.ts +3 -11
  54. package/src/{composables → utils}/request/index.ts +1 -1
  55. package/src/{composables → utils}/request/service.ts +5 -6
  56. package/src/{composables → utils}/request/types.ts +0 -1
  57. package/dist/composables/ad/index.d.ts +0 -42
  58. package/dist/composables/index.d.ts +0 -11
  59. package/src/composables/ad/README.md +0 -58
  60. package/src/composables/ad/index.ts +0 -227
  61. package/src/composables/device/README.md +0 -50
  62. package/src/composables/index.ts +0 -38
  63. package/src/composables/msg/README.md +0 -79
  64. package/src/composables/navigator/README.md +0 -71
  65. package/src/composables/refs/README.md +0 -40
  66. package/src/composables/request/README.md +0 -124
  67. package/src/composables/share/README.md +0 -53
  68. package/src/composables/utils/README.md +0 -81
  69. package/src/core/theme.ts +0 -62
  70. /package/dist/{composables → core}/msg/index.d.ts +0 -0
  71. /package/dist/{composables → core}/refs/index.d.ts +0 -0
  72. /package/dist/{composables → core}/share/index.d.ts +0 -0
  73. /package/dist/{composables → utils}/request/adapters/alist.d.ts +0 -0
  74. /package/dist/{composables → utils}/request/adapters/base.d.ts +0 -0
  75. /package/dist/{composables → utils}/request/adapters/cos.d.ts +0 -0
  76. /package/dist/{composables → utils}/request/adapters/index.d.ts +0 -0
  77. /package/dist/{composables → utils}/request/adapters/oss.d.ts +0 -0
  78. /package/dist/{composables → utils}/request/adapters/qiniu.d.ts +0 -0
  79. /package/dist/{composables → utils}/request/types.d.ts +0 -0
  80. /package/src/{composables → core}/share/index.ts +0 -0
  81. /package/src/{composables → utils}/request/adapters/alist.ts +0 -0
  82. /package/src/{composables → utils}/request/adapters/base.ts +0 -0
  83. /package/src/{composables → utils}/request/adapters/cos.ts +0 -0
  84. /package/src/{composables → utils}/request/adapters/index.ts +0 -0
  85. /package/src/{composables → utils}/request/adapters/oss.ts +0 -0
  86. /package/src/{composables → utils}/request/adapters/qiniu.ts +0 -0
@@ -0,0 +1,114 @@
1
+ # 广告模块 (Ad Utility & Component)
2
+
3
+ 提供微信小程序**插屏广告 (Interstitial Ad)** 与 **激励视频广告 (Rewarded Video Ad)** 的注册、预加载与展示播放能力,并提供了开箱即用的高层封装组件 `<hlw-reward-ad>`。
4
+
5
+ ---
6
+
7
+ ## 1. 推荐:高层组件 `<hlw-reward-ad>`
8
+
9
+ 组件内部全面封装并接管了激励视频广告的完整生命周期管理:
10
+ * **自动预加载**:组件挂载或广告 ID(`unitId`)变更时,在后台自动完成首帧广告的静默加载。
11
+ * **Loading 状态处理**:拉起广告时自动弹出全局模态 Loading,防止穿透及多重点击。
12
+ * **智能断点续看 (中途退出拦截)**:当用户中途关闭广告时,组件内会自动拦截并弹出二级确认对话框(“继续观看”与“取消”),选择继续将自动递归重新拉起播放。
13
+ * **关闭后自动滚加载**:当一次广告播放流关闭(完成或中途取消)后,组件立即在后台重新静默预加载下一个广告,保证下一次秒开。
14
+
15
+ ### 引入组件 (easycom / 直接引用)
16
+
17
+ ```html
18
+ <template>
19
+ <hlw-reward-ad :unit-id="rewardUnitId" @onHandle="handleRewardAd">
20
+ <hlw-button type="primary" round>点击观看广告获取金币</hlw-button>
21
+ </hlw-reward-ad>
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ import { ref } from "vue";
26
+ import type { AdRes } from "@hlw-uni/mp-vue";
27
+
28
+ const rewardUnitId = ref("adunit-xxx");
29
+
30
+ function handleRewardAd(res: AdRes) {
31
+ if (res.success && res.isEnded) {
32
+ // 用户已成功并且完整看完激励视频广告
33
+ hlw.$msg.success("观看完成,奖励已发放!");
34
+ } else if (res.err) {
35
+ // 播放出错
36
+ hlw.$msg.toast("广告播放失败,请稍后重试");
37
+ } else {
38
+ // 用户主动中途退出并拒绝继续观看,或其它拉起失败情况
39
+ hlw.$msg.toast("播放中途退出或拉起失败");
40
+ }
41
+ }
42
+ </script>
43
+ ```
44
+
45
+ ---
46
+
47
+ ## 2. 底层接口 (Low-Level APIs)
48
+
49
+ 在不需要使用标准 UI 组件而需要通过代码细粒度控盘的自定义场景下,可以直接导入并调用底层方法。
50
+
51
+ ```ts
52
+ import {
53
+ setPopupAd,
54
+ showPopupAd,
55
+ setRewardAd,
56
+ showRewardAd,
57
+ confirmRewardAd
58
+ } from "@hlw-uni/mp-vue";
59
+ ```
60
+
61
+ ### 插屏广告 (Interstitial Ad)
62
+
63
+ ```ts
64
+ // 1. 初始化并注册插屏广告单元,提供可选的关闭回调
65
+ setPopupAd("adunit-popup-id", (success) => {
66
+ console.log("插屏广告被关闭,是否播放成功:", success);
67
+ });
68
+
69
+ // 2. 延迟拉起展示插屏广告 (默认延迟 3000 毫秒展示)
70
+ await showPopupAd(1000);
71
+ ```
72
+
73
+ ### 激励视频广告 (Rewarded Video Ad)
74
+
75
+ ```ts
76
+ // 1. 注册并预加载激励视频广告单元
77
+ await setRewardAd("adunit-reward-id");
78
+
79
+ // 2. 立即拉起播放广告
80
+ const res = await showRewardAd();
81
+
82
+ if (res.success && res.isEnded) {
83
+ // 成功发放奖励
84
+ } else {
85
+ // 处理退出或报错
86
+ }
87
+ ```
88
+
89
+ ---
90
+
91
+ ## 3. API 列表
92
+
93
+ | 方法名 | 参数 | 返回值 | 说明 |
94
+ | :--- | :--- | :--- | :--- |
95
+ | `setPopupAd(adId, done?)` | `adId: string, done?: (ok: boolean) => void` | `boolean` | 创建/拉取缓存的插屏广告实例。 |
96
+ | `showPopupAd(delay?)` | `delay?: number` | `Promise<boolean>` | 延迟展示已配置的插屏广告(默认 3000ms)。 |
97
+ | `setRewardAd(adId, done?)` | `adId: string, done?: (res: AdRes) => void` | `Promise<AdRes>` | 预加载激励视频广告实例,并在 `onClose` 事件回调中自动加入重新静默预加载功能。 |
98
+ | `showRewardAd(onShowSuccess?)` | `onShowSuccess?: () => void` | `Promise<AdRes>` | 立即拉起展示激励视频,拉起失败时自动执行 `load()` 并二次重试。 |
99
+ | `confirmRewardAd()` | 无 | `Promise<boolean>` | 内置的通用二级确认模态框,内置灰色取消文字(`#999999`)与蓝色确认文字(`#3b82f6`)。 |
100
+
101
+ ---
102
+
103
+ ## 4. 类型定义
104
+
105
+ ```typescript
106
+ export interface AdRes {
107
+ /** 广告是否正常加载或成功展示完成 */
108
+ success: boolean;
109
+ /** 激励视频是否完全播放完毕 (仅激励视频有此属性) */
110
+ isEnded: boolean;
111
+ /** 加载或展示失败时的错误对象 */
112
+ err?: any;
113
+ }
114
+ ```
@@ -0,0 +1,234 @@
1
+ /**
2
+ * 小程序广告工具。
3
+ * 提供插屏广告 (Interstitial Ad) 与激励视频广告 (Rewarded Video Ad) 的注册、缓存与展示能力。
4
+ */
5
+
6
+ declare const uni: any;
7
+
8
+ /**
9
+ * 广告播放/加载结果数据结构。
10
+ */
11
+ export interface AdRes {
12
+ /** 广告是否正常加载或成功展示完成 */
13
+ success: boolean;
14
+ /** 激励视频是否完全播放完毕 (仅激励视频有此属性) */
15
+ isEnded: boolean;
16
+ /** 加载或展示失败时的错误对象 */
17
+ err?: any;
18
+ }
19
+
20
+ // 缓存不同 Unit ID 的广告实例,防止重复创建导致内存泄露或回调叠加
21
+ const adInstances = new Map<string, any>();
22
+
23
+ // 当前激活的广告单元 ID 与回调函数句柄
24
+ let activePopupId = "";
25
+ let activeRewardId = "";
26
+
27
+ let popupCallback: ((ok: boolean) => void) | undefined;
28
+ let rewardCallback: ((res: AdRes) => void) | undefined;
29
+
30
+ let rewardPromise: Promise<AdRes> | null = null;
31
+ let rewardResolve: ((res: AdRes) => void) | null = null;
32
+
33
+ /**
34
+ * 统一触发激励视频广告结束回调并销毁当前的 Promise 句柄
35
+ */
36
+ function resolveReward(res: AdRes) {
37
+ rewardCallback?.(res);
38
+ rewardResolve?.(res);
39
+ rewardResolve = null;
40
+ rewardPromise = null;
41
+ }
42
+
43
+ /**
44
+ * 配置/预加载插屏广告
45
+ *
46
+ * @param adId 广告单元 ID
47
+ * @param done 广告关闭后的回调(可选)
48
+ * @returns 是否配置成功
49
+ */
50
+ export function setPopupAd(adId: string, done?: (ok: boolean) => void): boolean {
51
+ popupCallback = done;
52
+ if (!adId || !uni.createInterstitialAd) return false;
53
+
54
+ activePopupId = adId;
55
+ if (!adInstances.has(adId)) {
56
+ try {
57
+ const ad = uni.createInterstitialAd({ adUnitId: adId });
58
+ ad.onLoad?.(() => console.log(`[Ad] Interstitial loaded: ${adId}`));
59
+ ad.onError?.((err: any) => {
60
+ console.error("[Ad] Interstitial load error:", err);
61
+ if (activePopupId === adId) popupCallback?.(false);
62
+ });
63
+ ad.onClose?.(() => {
64
+ if (activePopupId === adId) popupCallback?.(true);
65
+ });
66
+ adInstances.set(adId, ad);
67
+ } catch (e) {
68
+ console.error("[Ad] Interstitial creation failed:", e);
69
+ return false;
70
+ }
71
+ }
72
+ return true;
73
+ }
74
+
75
+ /**
76
+ * 延迟展示已配置的插屏广告
77
+ *
78
+ * @param delay 延迟毫秒数,默认 3000ms
79
+ * @returns 返回 Promise,指示是否成功显示且被关闭
80
+ */
81
+ export function showPopupAd(delay = 3000): Promise<boolean> {
82
+ return new Promise((resolve) => {
83
+ const ad = adInstances.get(activePopupId);
84
+ if (!ad) {
85
+ resolve(false);
86
+ return;
87
+ }
88
+
89
+ const originalDone = popupCallback;
90
+ popupCallback = (ok: boolean) => {
91
+ originalDone?.(ok);
92
+ resolve(ok);
93
+ };
94
+
95
+ setTimeout(
96
+ () => {
97
+ ad.show().catch((err: any) => {
98
+ console.error("[Ad] Interstitial show error:", err);
99
+ popupCallback?.(false);
100
+ });
101
+ },
102
+ Math.max(0, delay),
103
+ );
104
+ });
105
+ }
106
+
107
+ /**
108
+ * 配置/预加载激励视频广告
109
+ *
110
+ * @param adId 广告单元 ID
111
+ * @param done 播放结束的回调(可选)
112
+ * @returns 返回 Promise<AdRes>
113
+ */
114
+ export function setRewardAd(adId: string, done?: (res: AdRes) => void): Promise<AdRes> {
115
+ rewardCallback = done;
116
+ rewardPromise = new Promise((resolve) => {
117
+ rewardResolve = resolve;
118
+ });
119
+
120
+ if (!adId || !uni.createRewardedVideoAd) {
121
+ resolveReward({ success: false, isEnded: false });
122
+ return rewardPromise;
123
+ }
124
+
125
+ activeRewardId = adId;
126
+ if (!adInstances.has(adId)) {
127
+ try {
128
+ const ad = uni.createRewardedVideoAd({ adUnitId: adId });
129
+ ad.onLoad?.(() => console.log(`[Ad] Rewarded video loaded: ${adId}`));
130
+ ad.onError?.((err: any) => {
131
+ console.error("[Ad] Rewarded video load error:", err);
132
+ if (activeRewardId === adId) {
133
+ resolveReward({ success: false, isEnded: false, err });
134
+ }
135
+ });
136
+ ad.onClose?.((res: { isEnded?: boolean }) => {
137
+ if (activeRewardId === adId) {
138
+ const ended = !!res?.isEnded;
139
+ resolveReward({ success: ended, isEnded: ended });
140
+ // 播放结束后立即在后台静默预加载下一个广告,以保证后续拉起流畅且支持重试逻辑
141
+ ad.load().catch((err: any) => {
142
+ console.warn("[Ad] Silent preload after close failed:", err);
143
+ });
144
+ }
145
+ });
146
+ adInstances.set(adId, ad);
147
+ } catch (e) {
148
+ console.error("[Ad] Rewarded video creation failed:", e);
149
+ resolveReward({ success: false, isEnded: false, err: e });
150
+ }
151
+ }
152
+ return rewardPromise;
153
+ }
154
+
155
+ /**
156
+ * 立即播放已加载的激励视频广告
157
+ *
158
+ * @param onShowSuccess 广告成功拉起播放时的回调(常用于关闭 Loading 等待提示)
159
+ * @returns 返回 Promise<AdRes>,指示广告是否正常播放完毕
160
+ */
161
+ export function showRewardAd(onShowSuccess?: () => void): Promise<AdRes> {
162
+ const ad = adInstances.get(activeRewardId);
163
+ if (!ad) {
164
+ return Promise.resolve({ success: false, isEnded: false });
165
+ }
166
+
167
+ const current =
168
+ rewardPromise ||
169
+ new Promise<AdRes>((resolve) => {
170
+ rewardResolve = resolve;
171
+ });
172
+ rewardPromise = current;
173
+
174
+ ad.show()
175
+ .then(() => {
176
+ onShowSuccess?.();
177
+ })
178
+ .catch(() => {
179
+ ad.load()
180
+ .then(() => {
181
+ ad.show()
182
+ .then(() => {
183
+ onShowSuccess?.();
184
+ })
185
+ .catch((err: any) => {
186
+ console.error("[Ad] Rewarded video show error:", err);
187
+ resolveReward({ success: false, isEnded: false, err });
188
+ });
189
+ })
190
+ .catch((err: any) => {
191
+ console.error("[Ad] Rewarded video load error:", err);
192
+ resolveReward({ success: false, isEnded: false, err });
193
+ });
194
+ });
195
+
196
+ return current;
197
+ }
198
+
199
+ /**
200
+ * 弹窗提示需要看完广告才有奖励。
201
+ * 提供“继续观看”和“取消”按钮。
202
+ * @returns 返回 Promise<boolean>,用户点击“继续”返回 true,点击“取消”返回 false
203
+ */
204
+ export function confirmRewardAd(): Promise<boolean> {
205
+ return new Promise((resolve) => {
206
+ uni.showModal({
207
+ title: "提示",
208
+ content: "需要看完广告才有奖励哦",
209
+ cancelText: "取消",
210
+ confirmText: "继续观看",
211
+ cancelColor: "#999999",
212
+ confirmColor: "#3b82f6",
213
+ success: (res: any) => {
214
+ resolve(!!res.confirm);
215
+ },
216
+ fail: () => {
217
+ resolve(false);
218
+ },
219
+ });
220
+ });
221
+ }
222
+
223
+ /**
224
+ * @deprecated 推荐直接从库导入独立函数使用 (例如:import { showRewardAd } from '@hlw-uni/mp-vue')
225
+ */
226
+ export function useHlwAd() {
227
+ return {
228
+ setPopupAd,
229
+ showPopupAd,
230
+ setRewardAd,
231
+ showRewardAd,
232
+ confirmRewardAd,
233
+ };
234
+ }
@@ -44,7 +44,7 @@ export function withQuery(url: string, qs: string): string {
44
44
  }
45
45
 
46
46
  /**
47
- * 将键值对对象转换为 URL 编码的 Query String。
47
+ * 将键值对对象转换为 URL 编码 of Query String。
48
48
  * 会自动过滤值为 `undefined` 或 `null` 的键。
49
49
  * @param data 需要转换的键值对数据对象
50
50
  * @returns 格式化后的 Query String 字符串
@@ -275,29 +275,3 @@ export async function saveVideoUrl(url: string, progress?: (value: number) => vo
275
275
  return false;
276
276
  }
277
277
  }
278
-
279
- /**
280
- * 获取系统通用工具方法的 hook。
281
- *
282
- * @example
283
- * ```ts
284
- * const { copy, saveImageUrl } = useUtils();
285
- * copy('hello');
286
- * ```
287
- */
288
- export function useUtils() {
289
- return {
290
- withQuery,
291
- toQuery,
292
- signText,
293
- toNumber,
294
- toBoolean,
295
- copy,
296
- paste,
297
- saveImage,
298
- saveVideoFile,
299
- download,
300
- saveImageUrl,
301
- saveVideoUrl,
302
- };
303
- }
@@ -1,8 +1,8 @@
1
1
  /**
2
- * useDevice - 设备信息与接口 query
2
+ * 设备信息与接口 query
3
3
  * 提供一致的、缓存后的多端设备系统信息接口。
4
4
  */
5
- import { toQuery } from "../utils";
5
+ import { toQuery } from "../common";
6
6
 
7
7
  /**
8
8
  * 完整设备系统信息接口,包含小程序环境与宿主系统的关键元数据。
@@ -18,7 +18,7 @@ export interface DeviceInfo {
18
18
  app_version_code: string;
19
19
  /** 小程序来源渠道 */
20
20
  app_channel: string;
21
- /** 设备品牌。如:apple、huawei */
21
+ /** 设备 brand。如:apple、huawei */
22
22
  device_brand: string;
23
23
  /** 设备型号 */
24
24
  device_model: string;
@@ -167,14 +167,6 @@ function getAppid(device: Record<string, unknown>) {
167
167
  }
168
168
  }
169
169
 
170
- /**
171
- * 读取或延迟初始化缓存的设备信息。
172
- */
173
- function getDevice() {
174
- deviceCache ??= collectDevice();
175
- return deviceCache;
176
- }
177
-
178
170
  /**
179
171
  * 抽取供接口调用的缩略版设备 query 字段。
180
172
  */
@@ -203,17 +195,18 @@ function getQueryInfo(info: DeviceInfo): DeviceQueryInfo {
203
195
  }
204
196
 
205
197
  /**
206
- * 访问当前设备配置信息的 hooks。
207
- *
208
- * @returns 包含 `info` (原始数据) 和 `query` (用于 HTTP 报头/URL query 的 urlencoded 字符串)
198
+ * 获取缓存后的设备信息数据。
209
199
  */
210
- export function useDevice() {
211
- const info = getDevice();
200
+ export function getDevice(): DeviceInfo {
201
+ deviceCache ??= collectDevice();
202
+ return deviceCache;
203
+ }
212
204
 
213
- return {
214
- info,
215
- query: toQuery(getQueryInfo(info)),
216
- };
205
+ /**
206
+ * 获取接口请求专用的设备信息 query 字符串。
207
+ */
208
+ export function getDeviceQuery(): string {
209
+ return toQuery(getQueryInfo(getDevice()));
217
210
  }
218
211
 
219
212
  /**
@@ -222,4 +215,3 @@ export function useDevice() {
222
215
  export function clearDeviceCache(): void {
223
216
  deviceCache = null;
224
217
  }
225
-
@@ -0,0 +1,5 @@
1
+ export * from "./ad";
2
+ export * from "./common";
3
+ export * from "./navigator";
4
+ export * from "./device";
5
+ export * from "./request";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * useNavigate - uni-app 路由跳转工具
2
+ * uni-app 路由跳转工具
3
3
  * 封装并统一原生的页面跳转、重定向、Switch Tab、返回、以及打开外部小程序或 WebView 等方法。
4
4
  */
5
5
 
@@ -60,7 +60,7 @@ function failHandler(target: string, options: NavigateOptions = {}) {
60
60
  * @param url 跳转目标路径或小程序 AppId
61
61
  * @param options 额外的控制参数
62
62
  */
63
- function navigate(type: NavigateType = "navigateTo", url = "", options: NavigateOptions = {}) {
63
+ export function navigate(type: NavigateType = "navigateTo", url = "", options: NavigateOptions = {}) {
64
64
  if (type === "navigateBack") {
65
65
  uni.navigateBack({ delta: options.delta || 1, fail: failHandler("返回上一页", options) });
66
66
  return;
@@ -113,36 +113,35 @@ function navigate(type: NavigateType = "navigateTo", url = "", options: Navigate
113
113
  return;
114
114
  }
115
115
 
116
- uni.navigateTo({ url, fail: onFail });
116
+ uni.navigateTo({ url, animationType: "none", fail: onFail });
117
117
  }
118
118
 
119
- /**
120
- * 路由跳转工具 hooks。
121
- *
122
- * @example
123
- * ```ts
124
- * const router = useNavigate();
125
- * router.to('/pages/index/index');
126
- * router.back();
127
- * router.miniProgram('app-id');
128
- * ```
129
- */
130
- export function useNavigate() {
131
- return {
132
- /** 核心底层路由分发函数 */
133
- navigate,
134
- /** 保留当前页面,跳转到应用内的某个页面 */
135
- to: (url: string, options?: NavigateOptions) => navigate("navigateTo", url, options),
136
- /** 关闭当前页面,跳转到应用内的某个页面 */
137
- redirect: (url: string, options?: NavigateOptions) => navigate("redirectTo", url, options),
138
- /** 跳转到 switchTab 页面,并关闭其他所有非 tabBar 页面 */
139
- tab: (url: string, options?: NavigateOptions) => navigate("switchTab", url, options),
140
- /** 关闭所有页面,打开到应用内的某个页面 */
141
- reLaunch: (url: string, options?: NavigateOptions) => navigate("reLaunch", url, options),
142
- /** 关闭当前页面,返回上一页面或多级页面 */
143
- back: (delta = 1, options: NavigateOptions = {}) => navigate("navigateBack", "", { ...options, delta }),
144
- /** 打开另一个小程序 */
145
- miniProgram: (appId: string, options?: NavigateOptions) => navigate("miniprogram", appId, options),
146
- };
119
+ /** 保留当前页面,跳转到应用内的某个页面 */
120
+ export function navigateTo(url: string, options?: NavigateOptions) {
121
+ return navigate("navigateTo", url, options);
147
122
  }
148
123
 
124
+ /** 关闭当前页面,跳转到应用内的某个页面 */
125
+ export function redirectTo(url: string, options?: NavigateOptions) {
126
+ return navigate("redirectTo", url, options);
127
+ }
128
+
129
+ /** 跳转到 switchTab 页面,并关闭其他所有非 tabBar 页面 */
130
+ export function switchTab(url: string, options?: NavigateOptions) {
131
+ return navigate("switchTab", url, options);
132
+ }
133
+
134
+ /** 关闭所有页面,打开到应用内的某个页面 */
135
+ export function reLaunch(url: string, options?: NavigateOptions) {
136
+ return navigate("reLaunch", url, options);
137
+ }
138
+
139
+ /** 关闭当前页面,返回上一页面或多级页面 */
140
+ export function navigateBack(delta = 1, options: NavigateOptions = {}) {
141
+ return navigate("navigateBack", "", { ...options, delta });
142
+ }
143
+
144
+ /** 打开另一个小程序 */
145
+ export function navigateToMiniProgram(appId: string, options?: NavigateOptions) {
146
+ return navigate("miniprogram", appId, options);
147
+ }
@@ -214,7 +214,7 @@ class UniRequestClient implements RequestClient {
214
214
  filePath: config.filePath,
215
215
  fileName,
216
216
  credentials: config.credentials,
217
- });
217
+ });
218
218
 
219
219
  return new Promise((resolve, reject) => {
220
220
  uni.uploadFile({
@@ -311,17 +311,9 @@ function isAbsolute(url: string): boolean {
311
311
  const requestClient = new UniRequestClient();
312
312
 
313
313
  /**
314
- * 获取全局请求客户端单例。
315
- *
316
- * @example
317
- * ```ts
318
- * const http = useRequest();
319
- * http.setBaseURL('https://api.example.com');
320
- * ```
314
+ * 全局请求客户端单例。
321
315
  */
322
- export function useRequest(): RequestClient {
323
- return requestClient;
324
- }
316
+ export const request: RequestClient = requestClient;
325
317
 
326
318
  /**
327
319
  * 文件上传 composable。
@@ -1,4 +1,4 @@
1
- export { useRequest, useUpload } from "./client";
1
+ export { request, useUpload } from "./client";
2
2
  export { BaseService, ServiceNamespace, ServicePrefix, PluginService } from "./service";
3
3
  export type { RequestClient } from "./client";
4
4
  export type {
@@ -1,4 +1,4 @@
1
- import { useRequest } from "./client";
1
+ import { request } from "./client";
2
2
  import type { ApiResponse, RequestConfig } from "./types";
3
3
 
4
4
  /**
@@ -52,9 +52,9 @@ export class BaseService {
52
52
  * @returns 响应结果 Promise
53
53
  */
54
54
  request<T = unknown>(options: ServiceRequestConfig): Promise<ApiResponse<T>> {
55
- return useRequest().request<T>({
55
+ return request.request<T>({
56
56
  ...options,
57
- url: useRequest().resolveServiceUrl(this.namespace ?? "", options.url, this.servicePrefix ?? ""),
57
+ url: request.resolveServiceUrl(this.namespace ?? "", options.url, this.servicePrefix ?? ""),
58
58
  });
59
59
  }
60
60
 
@@ -70,7 +70,7 @@ export class BaseService {
70
70
  /**
71
71
  * 快捷发送 POST 请求。
72
72
  * @param url 请求相对路径
73
- * @param data 请求携带的 body
73
+ * @param data 请求携带 the body
74
74
  */
75
75
  post<T = unknown>(url: string, data?: unknown): Promise<ApiResponse<T>> {
76
76
  return this.request<T>({ url, method: "POST", data });
@@ -79,7 +79,7 @@ export class BaseService {
79
79
  /**
80
80
  * 快捷发送 PUT 请求。
81
81
  * @param url 请求相对路径
82
- * @param data 请求携带的 body
82
+ * @param data 请求携带 the body
83
83
  */
84
84
  put<T = unknown>(url: string, data?: unknown): Promise<ApiResponse<T>> {
85
85
  return this.request<T>({ url, method: "PUT", data });
@@ -130,4 +130,3 @@ export function PluginService(target: any) {
130
130
  configurable: true
131
131
  });
132
132
  }
133
-
@@ -90,4 +90,3 @@ export interface UploadResult {
90
90
  /** 上传成功后云端资源的可访问 URL 或文件路径 */
91
91
  data: string;
92
92
  }
93
-
@@ -1,42 +0,0 @@
1
- /**
2
- * 小程序广告工具。
3
- * 提供插屏广告 (Interstitial Ad) 与激励视频广告 (Rewarded Video Ad) 的注册、缓存与展示能力。
4
- */
5
- /**
6
- * 广告播放/加载结果数据结构。
7
- */
8
- export interface AdRes {
9
- /** 广告是否正常加载或成功展示完成 */
10
- ok: boolean;
11
- /** 激励视频是否完全播放完毕 (仅激励视频有此属性) */
12
- isEnded?: boolean;
13
- /** 加载或展示失败时的错误对象 */
14
- err?: unknown;
15
- }
16
- type AdDone = (res: AdRes) => void;
17
- /**
18
- * 小程序广告 Composables。
19
- *
20
- * @example
21
- * ```ts
22
- * const { setAdPopup, showAdPopup, setAdReward, showAdReward } = useHlwAd();
23
- *
24
- * // 1. 插屏广告
25
- * setAdPopup('ad-unit-id');
26
- * await showAdPopup();
27
- *
28
- * // 2. 激励视频
29
- * await setAdReward('ad-unit-id');
30
- * const res = await showAdReward();
31
- * if (res.ok && res.isEnded) {
32
- * // 发放奖励
33
- * }
34
- * ```
35
- */
36
- export declare function useHlwAd(): {
37
- setAdPopup: (adId: string, done?: ((ok: boolean) => void) | undefined) => boolean;
38
- showAdPopup: (delay?: number) => Promise<boolean>;
39
- setAdReward: (adId: string, done?: AdDone) => Promise<AdRes>;
40
- showAdReward: () => Promise<AdRes>;
41
- };
42
- export {};
@@ -1,11 +0,0 @@
1
- /**
2
- * Composables 统一导出
3
- */
4
- export * from './request';
5
- export { useMsg, type HlwMsg, type ToastOptions, type ModalOptions, type ToastIcon } from './msg';
6
- export { useDevice, clearDeviceCache, type DeviceInfo, type DeviceQueryInfo, } from './device';
7
- export { useRefs } from './refs';
8
- export { useShare, type ShareConfig, } from './share';
9
- export { useHlwAd, type AdRes } from './ad';
10
- export { useUtils, withQuery, toQuery, signText, toNumber, toBoolean, copy, paste, auth, saveImage, saveVideoFile, download, saveImageUrl, saveVideoUrl, type DownloadOpt, type DownloadRes, } from './utils';
11
- export { useNavigate, type NavigateType, type NavigateOptions } from './navigator';