@xiao-ying/miniapp-hooks 1.1.0 → 1.2.0

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.
package/README.md CHANGED
@@ -10,8 +10,10 @@ pnpm add @xiao-ying/miniapp-hooks @xiao-ying/miniapp-sdk react
10
10
 
11
11
  ## Hook 列表
12
12
 
13
+ - `useAppearance()`:订阅宿主 appearance 变化,返回 `{ themeSeedColor }`。
14
+ - `useThemeSeedColor()`:订阅宿主主题 seed color,返回 `#rrggbb` 字符串;旧引擎或缺字段时回退小应蓝 `#4da3ff`。
13
15
  - `useBrightness()`:订阅原生/浏览器亮度变化,返回 `{ brightness, isDark }`。
14
- - `useForeground()`:订阅前后台变化,返回 `{ isForeground }`。
16
+ - `useForeground()`:订阅宿主提供的前后台提示(soft hint),返回 `{ isForeground }`。
15
17
  - `useMediaQuery()`:暴露注入的 `mediaQuery`(安全区、DPR、尺寸)。
16
18
  - `useStorage(key, options?)`:与 `xy.onStorageChange` 同步,提供 `value`、`loading`、`error` 以及 `setValue/remove/refresh`。
17
19
  - `useShare(input?)`:注册分享处理器,自动补齐默认 path/title。
@@ -26,16 +28,18 @@ pnpm add @xiao-ying/miniapp-hooks @xiao-ying/miniapp-sdk react
26
28
  ## 快速示例
27
29
 
28
30
  ```tsx
29
- import { useBrightness, useStorage } from '@xiao-ying/miniapp-hooks'
31
+ import { useBrightness, useStorage, useThemeSeedColor } from '@xiao-ying/miniapp-hooks'
30
32
 
31
33
  const Preferences = () => {
32
34
  const { brightness, isDark } = useBrightness()
35
+ const themeSeedColor = useThemeSeedColor()
33
36
  const theme = isDark ? 'dark' : 'light'
34
37
  const storage = useStorage<string>('nickname', { defaultValue: '游客' })
35
38
 
36
39
  return (
37
40
  <div data-theme={theme}>
38
41
  <p>当前模式: {brightness}</p>
42
+ <p>主题色: {themeSeedColor}</p>
39
43
  <input
40
44
  value={storage.value ?? ''}
41
45
  onChange={(e) => storage.setValue(e.target.value)}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { useAppearance, useThemeSeedColor } from './use-appearance.js';
1
2
  export { useBrightness } from './use-brightness.js';
2
3
  export { useForeground } from './use-foreground.js';
3
4
  export { useMediaQuery, type UseMediaQueryResult } from './use-media-query.js';
@@ -7,5 +8,5 @@ export { useHapticFeedback, type UseHapticFeedbackOptions } from './use-haptic-f
7
8
  export { useSdkError, type UseSdkErrorOptions, type UseSdkErrorResult, type UseSdkErrorFilter } from './use-sdk-error.js';
8
9
  export { useHapticFeedback as useHapticPress } from './use-haptic-feedback.js';
9
10
  export { useAuthState } from './use-auth-state.js';
10
- export type { XYSdk, XYMediaQuery, XYSafeAreaInsets, XYViewportSize, XYBrightnessEvent, XYStorageEvent, XyShareData, XyShareHandlerPayload, MaybePromise } from '@xiao-ying/miniapp-sdk';
11
+ export type { XYSdk, XYMediaQuery, XYSafeAreaInsets, XYViewportSize, XYBrightnessEvent, XYAppearance, XYAppearanceEvent, XYStorageEvent, XyShareData, XyShareHandlerPayload, MaybePromise } from '@xiao-ying/miniapp-sdk';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAC3F,OAAO,EACL,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,iBAAiB,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,YAAY,EACV,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,YAAY,EACb,MAAM,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAC3F,OAAO,EACL,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,iBAAiB,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,YAAY,EACV,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,YAAY,EACb,MAAM,wBAAwB,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  'use client';
2
+ export { useAppearance, useThemeSeedColor } from './use-appearance.js';
2
3
  export { useBrightness } from './use-brightness.js';
3
4
  export { useForeground } from './use-foreground.js';
4
5
  export { useMediaQuery } from './use-media-query.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EACL,aAAa,EAEd,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,UAAU,EAGX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAiC,MAAM,0BAA0B,CAAA;AAC3F,OAAO,EACL,WAAW,EAIZ,MAAM,oBAAoB,CAAA;AAC3B,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EACL,aAAa,EAEd,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,UAAU,EAGX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAiC,MAAM,0BAA0B,CAAA;AAC3F,OAAO,EACL,WAAW,EAIZ,MAAM,oBAAoB,CAAA;AAC3B,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { type XYAppearance } from '@xiao-ying/miniapp-sdk';
2
+ /**
3
+ * 订阅宿主外观配置变化并返回当前 appearance。
4
+ *
5
+ * @returns `XYAppearance`,当前只包含 `{ themeSeedColor }`。
6
+ *
7
+ * @example
8
+ * const { themeSeedColor } = useAppearance()
9
+ */
10
+ export declare const useAppearance: () => XYAppearance;
11
+ /**
12
+ * 订阅宿主主题 seed color 变化。
13
+ *
14
+ * @returns 当前主题 seed color,格式为 `#rrggbb`。
15
+ *
16
+ * @example
17
+ * const themeSeedColor = useThemeSeedColor()
18
+ */
19
+ export declare const useThemeSeedColor: () => string;
20
+ //# sourceMappingURL=use-appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-appearance.d.ts","sourceRoot":"","sources":["../src/use-appearance.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAUvF;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAO,YAyBhC,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,QAAO,MAAwC,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { useEffect, useMemo, useState } from 'react';
2
+ import { DEFAULT_XY_THEME_SEED_COLOR } from '@xiao-ying/miniapp-sdk';
3
+ const readAppearance = () => {
4
+ try {
5
+ return xy.appearance();
6
+ }
7
+ catch (_) {
8
+ return { themeSeedColor: DEFAULT_XY_THEME_SEED_COLOR };
9
+ }
10
+ };
11
+ /**
12
+ * 订阅宿主外观配置变化并返回当前 appearance。
13
+ *
14
+ * @returns `XYAppearance`,当前只包含 `{ themeSeedColor }`。
15
+ *
16
+ * @example
17
+ * const { themeSeedColor } = useAppearance()
18
+ */
19
+ export const useAppearance = () => {
20
+ const [appearance, setAppearance] = useState(() => readAppearance());
21
+ useEffect(() => {
22
+ if (typeof xy.onAppearanceChange !== 'function') {
23
+ return;
24
+ }
25
+ const unsubscribe = xy.onAppearanceChange((event) => {
26
+ setAppearance(event.appearance);
27
+ });
28
+ return () => {
29
+ if (typeof unsubscribe === 'function') {
30
+ unsubscribe();
31
+ }
32
+ };
33
+ }, []);
34
+ return useMemo(() => ({
35
+ themeSeedColor: appearance.themeSeedColor
36
+ }), [appearance.themeSeedColor]);
37
+ };
38
+ /**
39
+ * 订阅宿主主题 seed color 变化。
40
+ *
41
+ * @returns 当前主题 seed color,格式为 `#rrggbb`。
42
+ *
43
+ * @example
44
+ * const themeSeedColor = useThemeSeedColor()
45
+ */
46
+ export const useThemeSeedColor = () => useAppearance().themeSeedColor;
47
+ //# sourceMappingURL=use-appearance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-appearance.js","sourceRoot":"","sources":["../src/use-appearance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EAAE,2BAA2B,EAAqB,MAAM,wBAAwB,CAAA;AAEvF,MAAM,cAAc,GAAG,GAAiB,EAAE;IACxC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,UAAU,EAAE,CAAA;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAA;IACxD,CAAC;AACH,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAiB,EAAE;IAC9C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAe,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,CAAA;IAElF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;YAChD,OAAM;QACR,CAAC;QAED,MAAM,WAAW,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;YAClD,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE,CAAC;gBACtC,WAAW,EAAE,CAAA;YACf,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,cAAc,EAAE,UAAU,CAAC,cAAc;KAC1C,CAAC,EACF,CAAC,UAAU,CAAC,cAAc,CAAC,CAC5B,CAAA;AACH,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAW,EAAE,CAAC,aAAa,EAAE,CAAC,cAAc,CAAA"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 订阅前后台状态变化并返回当前前台状态。
2
+ * 订阅宿主提供的前后台提示并返回当前前台状态。
3
3
  *
4
4
  * @returns `{ isForeground }`。
5
5
  *
@@ -1,6 +1,6 @@
1
1
  import { useEffect, useMemo, useState } from 'react';
2
2
  /**
3
- * 订阅前后台状态变化并返回当前前台状态。
3
+ * 订阅宿主提供的前后台提示并返回当前前台状态。
4
4
  *
5
5
  * @returns `{ isForeground }`。
6
6
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xiao-ying/miniapp-hooks",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "React hooks for @xiao-ying/miniapp-sdk to build reactive miniapp UIs",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -27,13 +27,13 @@
27
27
  },
28
28
  "peerDependencies": {
29
29
  "react": "^18.0.0 || ^19.0.0",
30
- "@xiao-ying/miniapp-sdk": "^1.1.0"
30
+ "@xiao-ying/miniapp-sdk": "^1.3.2"
31
31
  },
32
32
  "devDependencies": {
33
- "@types/react": "^19.2.5",
34
- "react": "^19.2.0",
33
+ "@types/react": "^19.2.14",
34
+ "react": "^19.2.5",
35
35
  "typescript": "^5.9.3",
36
- "@xiao-ying/miniapp-sdk": "^1.1.0"
36
+ "@xiao-ying/miniapp-sdk": "^1.3.2"
37
37
  },
38
38
  "scripts": {
39
39
  "build": "node ../scripts/clean-dist.mjs && tsc -p tsconfig.json",
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  'use client'
2
2
 
3
+ export { useAppearance, useThemeSeedColor } from './use-appearance.js'
3
4
  export { useBrightness } from './use-brightness.js'
4
5
  export { useForeground } from './use-foreground.js'
5
6
  export {
@@ -29,6 +30,8 @@ export type {
29
30
  XYSafeAreaInsets,
30
31
  XYViewportSize,
31
32
  XYBrightnessEvent,
33
+ XYAppearance,
34
+ XYAppearanceEvent,
32
35
  XYStorageEvent,
33
36
  XyShareData,
34
37
  XyShareHandlerPayload,
@@ -0,0 +1,55 @@
1
+ import { useEffect, useMemo, useState } from 'react'
2
+ import { DEFAULT_XY_THEME_SEED_COLOR, type XYAppearance } from '@xiao-ying/miniapp-sdk'
3
+
4
+ const readAppearance = (): XYAppearance => {
5
+ try {
6
+ return xy.appearance()
7
+ } catch (_) {
8
+ return { themeSeedColor: DEFAULT_XY_THEME_SEED_COLOR }
9
+ }
10
+ }
11
+
12
+ /**
13
+ * 订阅宿主外观配置变化并返回当前 appearance。
14
+ *
15
+ * @returns `XYAppearance`,当前只包含 `{ themeSeedColor }`。
16
+ *
17
+ * @example
18
+ * const { themeSeedColor } = useAppearance()
19
+ */
20
+ export const useAppearance = (): XYAppearance => {
21
+ const [appearance, setAppearance] = useState<XYAppearance>(() => readAppearance())
22
+
23
+ useEffect(() => {
24
+ if (typeof xy.onAppearanceChange !== 'function') {
25
+ return
26
+ }
27
+
28
+ const unsubscribe = xy.onAppearanceChange((event) => {
29
+ setAppearance(event.appearance)
30
+ })
31
+
32
+ return () => {
33
+ if (typeof unsubscribe === 'function') {
34
+ unsubscribe()
35
+ }
36
+ }
37
+ }, [])
38
+
39
+ return useMemo(
40
+ () => ({
41
+ themeSeedColor: appearance.themeSeedColor
42
+ }),
43
+ [appearance.themeSeedColor]
44
+ )
45
+ }
46
+
47
+ /**
48
+ * 订阅宿主主题 seed color 变化。
49
+ *
50
+ * @returns 当前主题 seed color,格式为 `#rrggbb`。
51
+ *
52
+ * @example
53
+ * const themeSeedColor = useThemeSeedColor()
54
+ */
55
+ export const useThemeSeedColor = (): string => useAppearance().themeSeedColor
@@ -1,6 +1,6 @@
1
1
  import { useEffect, useMemo, useState } from 'react'
2
2
  /**
3
- * 订阅前后台状态变化并返回当前前台状态。
3
+ * 订阅宿主提供的前后台提示并返回当前前台状态。
4
4
  *
5
5
  * @returns `{ isForeground }`。
6
6
  *