@blocklet/payment-react 1.20.15 → 1.20.17

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 (114) hide show
  1. package/.aigne/doc-smith/config.yaml +7 -1
  2. package/.aigne/doc-smith/upload-cache.yaml +441 -0
  3. package/docs/components-business-auto-topup.ja.md +187 -0
  4. package/docs/components-business-auto-topup.zh-TW.md +187 -0
  5. package/docs/components-business-auto-topup.zh.md +187 -0
  6. package/docs/components-business-overdue-invoice-payment.ja.md +196 -0
  7. package/docs/components-business-overdue-invoice-payment.zh-TW.md +197 -0
  8. package/docs/components-business-overdue-invoice-payment.zh.md +197 -0
  9. package/docs/components-business-resume-subscription.ja.md +190 -0
  10. package/docs/components-business-resume-subscription.zh-TW.md +190 -0
  11. package/docs/components-business-resume-subscription.zh.md +190 -0
  12. package/docs/components-business.ja.md +21 -0
  13. package/docs/components-business.zh-TW.md +21 -0
  14. package/docs/components-business.zh.md +21 -0
  15. package/docs/components-checkout-checkout-donate.ja.md +259 -0
  16. package/docs/components-checkout-checkout-donate.zh-TW.md +259 -0
  17. package/docs/components-checkout-checkout-donate.zh.md +259 -0
  18. package/docs/components-checkout-checkout-form.ja.md +163 -0
  19. package/docs/components-checkout-checkout-form.zh-TW.md +163 -0
  20. package/docs/components-checkout-checkout-form.zh.md +163 -0
  21. package/docs/components-checkout-checkout-table.ja.md +148 -0
  22. package/docs/components-checkout-checkout-table.zh-TW.md +148 -0
  23. package/docs/components-checkout-checkout-table.zh.md +149 -0
  24. package/docs/components-checkout.ja.md +65 -0
  25. package/docs/components-checkout.zh-TW.md +65 -0
  26. package/docs/components-checkout.zh.md +65 -0
  27. package/docs/components-history-credit-grants-list.ja.md +73 -0
  28. package/docs/components-history-credit-grants-list.zh-TW.md +73 -0
  29. package/docs/components-history-credit-grants-list.zh.md +73 -0
  30. package/docs/components-history-credit-transactions-list.ja.md +106 -0
  31. package/docs/components-history-credit-transactions-list.zh-TW.md +106 -0
  32. package/docs/components-history-credit-transactions-list.zh.md +106 -0
  33. package/docs/components-history-invoice-list.ja.md +110 -0
  34. package/docs/components-history-invoice-list.zh-TW.md +110 -0
  35. package/docs/components-history-invoice-list.zh.md +110 -0
  36. package/docs/components-history-payment-list.ja.md +44 -0
  37. package/docs/components-history-payment-list.zh-TW.md +44 -0
  38. package/docs/components-history-payment-list.zh.md +44 -0
  39. package/docs/components-history.ja.md +67 -0
  40. package/docs/components-history.zh-TW.md +67 -0
  41. package/docs/components-history.zh.md +67 -0
  42. package/docs/components-ui-form-elements-address-form.ja.md +121 -0
  43. package/docs/components-ui-form-elements-address-form.zh-TW.md +121 -0
  44. package/docs/components-ui-form-elements-address-form.zh.md +121 -0
  45. package/docs/components-ui-form-elements-country-select.ja.md +126 -0
  46. package/docs/components-ui-form-elements-country-select.zh-TW.md +126 -0
  47. package/docs/components-ui-form-elements-country-select.zh.md +126 -0
  48. package/docs/components-ui-form-elements-currency-selector.ja.md +108 -0
  49. package/docs/components-ui-form-elements-currency-selector.zh-TW.md +108 -0
  50. package/docs/components-ui-form-elements-currency-selector.zh.md +108 -0
  51. package/docs/components-ui-form-elements-phone-input.ja.md +138 -0
  52. package/docs/components-ui-form-elements-phone-input.zh-TW.md +138 -0
  53. package/docs/components-ui-form-elements-phone-input.zh.md +139 -0
  54. package/docs/components-ui-form-elements.ja.md +91 -0
  55. package/docs/components-ui-form-elements.zh-TW.md +91 -0
  56. package/docs/components-ui-form-elements.zh.md +91 -0
  57. package/docs/components-ui-payment-summary.ja.md +109 -0
  58. package/docs/components-ui-payment-summary.zh-TW.md +109 -0
  59. package/docs/components-ui-payment-summary.zh.md +109 -0
  60. package/docs/components-ui-pricing-table.ja.md +140 -0
  61. package/docs/components-ui-pricing-table.zh-TW.md +140 -0
  62. package/docs/components-ui-pricing-table.zh.md +140 -0
  63. package/docs/components-ui.ja.md +71 -0
  64. package/docs/components-ui.zh-TW.md +71 -0
  65. package/docs/components-ui.zh.md +71 -0
  66. package/docs/components.ja.md +122 -0
  67. package/docs/components.zh-TW.md +122 -0
  68. package/docs/components.zh.md +122 -0
  69. package/docs/getting-started.ja.md +84 -0
  70. package/docs/getting-started.zh-TW.md +84 -0
  71. package/docs/getting-started.zh.md +84 -0
  72. package/docs/guides-theming.ja.md +213 -0
  73. package/docs/guides-theming.zh-TW.md +213 -0
  74. package/docs/guides-theming.zh.md +213 -0
  75. package/docs/guides-utilities.ja.md +197 -0
  76. package/docs/guides-utilities.zh-TW.md +197 -0
  77. package/docs/guides-utilities.zh.md +197 -0
  78. package/docs/guides.ja.md +18 -0
  79. package/docs/guides.zh-TW.md +18 -0
  80. package/docs/guides.zh.md +18 -0
  81. package/docs/hooks-use-mobile.ja.md +84 -0
  82. package/docs/hooks-use-mobile.zh-TW.md +84 -0
  83. package/docs/hooks-use-mobile.zh.md +84 -0
  84. package/docs/hooks-use-subscription.ja.md +111 -0
  85. package/docs/hooks-use-subscription.zh-TW.md +111 -0
  86. package/docs/hooks-use-subscription.zh.md +110 -0
  87. package/docs/hooks.ja.md +14 -0
  88. package/docs/hooks.zh-TW.md +14 -0
  89. package/docs/hooks.zh.md +14 -0
  90. package/docs/overview.ja.md +80 -0
  91. package/docs/overview.zh-TW.md +80 -0
  92. package/docs/overview.zh.md +80 -0
  93. package/docs/providers-donate-provider.ja.md +153 -0
  94. package/docs/providers-donate-provider.zh-TW.md +153 -0
  95. package/docs/providers-donate-provider.zh.md +153 -0
  96. package/docs/providers-payment-provider.ja.md +191 -0
  97. package/docs/providers-payment-provider.zh-TW.md +191 -0
  98. package/docs/providers-payment-provider.zh.md +191 -0
  99. package/docs/providers.ja.md +42 -0
  100. package/docs/providers.zh-TW.md +42 -0
  101. package/docs/providers.zh.md +42 -0
  102. package/es/locales/en.js +13 -3
  103. package/es/locales/zh.js +13 -3
  104. package/es/payment/product-item.js +123 -20
  105. package/es/payment/success.js +2 -2
  106. package/lib/locales/en.js +13 -3
  107. package/lib/locales/zh.js +13 -3
  108. package/lib/payment/product-item.js +136 -32
  109. package/lib/payment/success.js +2 -2
  110. package/package.json +5 -5
  111. package/src/locales/en.tsx +18 -3
  112. package/src/locales/zh.tsx +17 -3
  113. package/src/payment/product-item.tsx +140 -19
  114. package/src/payment/success.tsx +2 -2
@@ -0,0 +1,84 @@
1
+ # useMobile
2
+
3
+ `useMobile` フックは、アプリケーションがモバイルサイズのデバイスで表示されているかどうかを検出するための便利なユーティリティです。Material-UIのブレークポイントシステムを活用することで、Reactロジック内で直接レスポンシブなレイアウトやコンポーネントを作成するのに役立ちます。
4
+
5
+ ## 仕組み
6
+
7
+ 内部では、`useMobile`はMaterial-UIの`useTheme`と`useMediaQuery`フックを使用します。現在の画面幅をテーマで定義されたブレークポイントと比較し、ビューポートが「モバイル」に該当するかどうかを判断します。
8
+
9
+ ## 基本的な使用法
10
+
11
+ 以下は、`useMobile`フックを使用してコンテンツを条件付きでレンダリングする簡単な例です。
12
+
13
+ ```tsx ResponsiveComponent.tsx icon=logos:react
14
+ import { useMobile } from '@blocklet/payment-react';
15
+ import { Typography, Box } from '@mui/material';
16
+
17
+ function ResponsiveComponent() {
18
+ const { isMobile, mobileSize } = useMobile();
19
+
20
+ return (
21
+ <Box p={2}>
22
+ <Typography variant="h5">
23
+ Responsive Content
24
+ </Typography>
25
+ {
26
+ isMobile ? (
27
+ <Typography>
28
+ This is the mobile view. The screen is {mobileSize} or smaller.
29
+ </Typography>
30
+ ) : (
31
+ <Typography>
32
+ This is the desktop view. The screen is wider than {mobileSize}.
33
+ </Typography>
34
+ )
35
+ }
36
+ </Box>
37
+ );
38
+ }
39
+
40
+ export default ResponsiveComponent;
41
+ ```
42
+
43
+ ## パラメータ
44
+
45
+ `useMobile`フックは、ブレークポイントをカスタマイズするためのオプションのパラメータを受け付けます。
46
+
47
+ | 名前 | 型 | 説明 |
48
+ | :--- | :--- | :--- |
49
+ | `mobilePoint` | `'md' \| 'sm' \| 'lg' \| 'xl' \| 'xs'` | モバイルの閾値と見なすブレークポイントです。画面幅がこのポイント以下の場合、`isMobile`フラグはtrueになります。デフォルトは`'md'`です。 |
50
+
51
+ ### ブレークポイントのカスタマイズ
52
+
53
+ 異なる値を渡すことで、ブレークポイントを簡単に変更できます。
54
+
55
+ ```tsx CustomBreakpoint.tsx icon=logos:react
56
+ import { useMobile } from '@blocklet/payment-react';
57
+ import { Typography } from '@mui/material';
58
+
59
+ function CustomBreakpointComponent() {
60
+ // 'sm' (small) 以下の画面をモバイルと見なす
61
+ const { isMobile } = useMobile('sm');
62
+
63
+ return (
64
+ <div>
65
+ {isMobile ? (
66
+ <Typography>Display for small screens</Typography>
67
+ ) : (
68
+ <Typography>Display for medium and larger screens</Typography>
69
+ )}
70
+ </div>
71
+ );
72
+ }
73
+
74
+ export default CustomBreakpointComponent;
75
+ ```
76
+
77
+ ## 戻り値
78
+
79
+ このフックは、以下のプロパティを持つオブジェクトを返します。
80
+
81
+ | キー | 型 | 説明 |
82
+ | :--- | :--- | :--- |
83
+ | `isMobile` | `boolean` | 現在のビューポートの幅が指定された`mobilePoint`ブレークポイント以下の場合は`true`、それ以外の場合は`false`です。 |
84
+ | `mobileSize` | `string` | `mobilePoint`ブレークポイントのピクセル幅を表す文字列です (例: `"900px"`)。 |
@@ -0,0 +1,84 @@
1
+ # useMobile
2
+
3
+ `useMobile` hook 是一個方便的實用工具,用於偵測應用程式是否在行動裝置尺寸的裝置上檢視。它利用 Material-UI 的中斷點系統,幫助您直接在 React 邏輯中建立響應式佈局和元件。
4
+
5
+ ## 運作方式
6
+
7
+ `useMobile` 內部使用 Material-UI 的 `useTheme` 和 `useMediaQuery` hook。它會根據主題定義的中斷點檢查目前的螢幕寬度,以確定視窗是否符合「行動裝置」的條件。
8
+
9
+ ## 基本用法
10
+
11
+ 以下是如何使用 `useMobile` hook 來條件式渲染內容的簡單範例。
12
+
13
+ ```tsx ResponsiveComponent.tsx icon=logos:react
14
+ import { useMobile } from '@blocklet/payment-react';
15
+ import { Typography, Box } from '@mui/material';
16
+
17
+ function ResponsiveComponent() {
18
+ const { isMobile, mobileSize } = useMobile();
19
+
20
+ return (
21
+ <Box p={2}>
22
+ <Typography variant="h5">
23
+ 響應式內容
24
+ </Typography>
25
+ {
26
+ isMobile ? (
27
+ <Typography>
28
+ 這是行動裝置檢視。螢幕尺寸為 {mobileSize} 或更小。
29
+ </Typography>
30
+ ) : (
31
+ <Typography>
32
+ 這是桌面檢視。螢幕寬度大於 {mobileSize}。
33
+ </Typography>
34
+ )
35
+ }
36
+ </Box>
37
+ );
38
+ }
39
+
40
+ export default ResponsiveComponent;
41
+ ```
42
+
43
+ ## 參數
44
+
45
+ `useMobile` hook 接受一個可選參數來自訂中斷點。
46
+
47
+ | Name | Type | Description |
48
+ | :--- | :--- | :--- |
49
+ | `mobilePoint` | `'md' \| 'sm' \| 'lg' \| 'xl' \| 'xs'` | 要視為行動裝置閾值的中斷點。如果螢幕寬度在此點或以下,`isMobile` 旗標將為 true。預設為 `'md'`。 |
50
+
51
+ ### 自訂中斷點
52
+
53
+ 您可以透過傳遞不同的值來輕鬆更改中斷點。
54
+
55
+ ```tsx CustomBreakpoint.tsx icon=logos:react
56
+ import { useMobile } from '@blocklet/payment-react';
57
+ import { Typography } from '@mui/material';
58
+
59
+ function CustomBreakpointComponent() {
60
+ // 將 'sm' (小) 及以下的螢幕視為行動裝置
61
+ const { isMobile } = useMobile('sm');
62
+
63
+ return (
64
+ <div>
65
+ {isMobile ? (
66
+ <Typography>在小螢幕上顯示</Typography>
67
+ ) : (
68
+ <Typography>在中型及更大螢幕上顯示</Typography>
69
+ )}
70
+ </div>
71
+ );
72
+ }
73
+
74
+ export default CustomBreakpointComponent;
75
+ ```
76
+
77
+ ## 回傳值
78
+
79
+ 此 hook 回傳一個包含以下屬性的物件:
80
+
81
+ | Key | Type | Description |
82
+ | :--- | :--- | :--- |
83
+ | `isMobile` | `boolean` | 如果目前的視窗寬度小於或等於指定的 `mobilePoint` 中斷點,則為 `true`,否則為 `false`。 |
84
+ | `mobileSize` | `string` | 一個字串,表示 `mobilePoint` 中斷點的像素寬度(例如:`"900px"`)。 |
@@ -0,0 +1,84 @@
1
+ # useMobile
2
+
3
+ `useMobile` hook 是一个方便的实用程序,用于检测应用程序是否在移动尺寸的设备上查看。它通过利用 Material-UI 的断点系统,帮助您直接在 React 逻辑中创建响应式布局和组件。
4
+
5
+ ## 工作原理
6
+
7
+ 在内部,`useMobile` 使用了 Material-UI 的 `useTheme` 和 `useMediaQuery` hook。它会根据主题中定义的断点检查当前屏幕宽度,以确定视口是否符合“移动设备”的标准。
8
+
9
+ ## 基本用法
10
+
11
+ 以下是一个如何使用 `useMobile` hook 来条件性渲染内容的简单示例。
12
+
13
+ ```tsx ResponsiveComponent.tsx icon=logos:react
14
+ import { useMobile } from '@blocklet/payment-react';
15
+ import { Typography, Box } from '@mui/material';
16
+
17
+ function ResponsiveComponent() {
18
+ const { isMobile, mobileSize } = useMobile();
19
+
20
+ return (
21
+ <Box p={2}>
22
+ <Typography variant="h5">
23
+ 响应式内容
24
+ </Typography>
25
+ {
26
+ isMobile ? (
27
+ <Typography>
28
+ 这是移动视图。屏幕尺寸为 {mobileSize} 或更小。
29
+ </Typography>
30
+ ) : (
31
+ <Typography>
32
+ 这是桌面视图。屏幕宽度大于 {mobileSize}。
33
+ </Typography>
34
+ )
35
+ }
36
+ </Box>
37
+ );
38
+ }
39
+
40
+ export default ResponsiveComponent;
41
+ ```
42
+
43
+ ## 参数
44
+
45
+ `useMobile` hook 接受一个可选参数来自定义断点。
46
+
47
+ | Name | Type | Description |
48
+ | :--- | :--- | :--- |
49
+ | `mobilePoint` | `'md' \| 'sm' \| 'lg' \| 'xl' \| 'xs'` | 作为移动设备阈值的断点。如果屏幕宽度小于或等于此断点,`isMobile` 标志将为 true。默认为 `'md'`。 |
50
+
51
+ ### 自定义断点
52
+
53
+ 您可以通过传递不同的值来轻松更改断点。
54
+
55
+ ```tsx CustomBreakpoint.tsx icon=logos:react
56
+ import { useMobile } from '@blocklet/payment-react';
57
+ import { Typography } from '@mui/material';
58
+
59
+ function CustomBreakpointComponent() {
60
+ // 将 'sm' (小) 尺寸及以下的屏幕视为移动设备
61
+ const { isMobile } = useMobile('sm');
62
+
63
+ return (
64
+ <div>
65
+ {isMobile ? (
66
+ <Typography>为小屏幕显示</Typography>
67
+ ) : (
68
+ <Typography>为中等及更大屏幕显示</Typography>
69
+ )}
70
+ </div>
71
+ );
72
+ }
73
+
74
+ export default CustomBreakpointComponent;
75
+ ```
76
+
77
+ ## 返回值
78
+
79
+ 该 hook 返回一个包含以下属性的对象:
80
+
81
+ | Key | Type | Description |
82
+ | :--- | :--- | :--- |
83
+ | `isMobile` | `boolean` | 如果当前视口宽度小于或等于指定的 `mobilePoint` 断点,则为 `true`,否则为 `false`。 |
84
+ | `mobileSize` | `string` | 一个表示 `mobilePoint` 断点像素宽度的字符串(例如 `“900px”`)。 |
@@ -0,0 +1,111 @@
1
+ # useSubscription
2
+
3
+ `useSubscription` フックは、WebSocket を使用して決済サービスからのリアルタイムイベントを購読する簡単な方法を提供します。接続、サブスクリプション、クリーンアップロジックを処理するため、開発者は `invoice.paid` のようなイベントに対するアプリケーションの反応に集中できます。
4
+
5
+ これは、ユーザーがページを更新することなく、バックエンドイベントに応じてUIを即座に更新する必要がある、動的なユーザーエクスペリエンスを作成するために不可欠です。
6
+
7
+ ## 仕組み
8
+
9
+ このフックは、WebSocket 接続管理の複雑さを抽象化します。コンポーネントが `useSubscription` を使用すると、リレーサービスへの永続的な接続が確立されます。次に、指定された特定の `channel` を購読します。フックは自動的にチャネルに名前空間を適用し、`relay:<app-id>:<your-channel>` という形式で最終的なチャネル名を構築します。
10
+
11
+ バックエンドサービスがそのチャネルにイベントを公開すると、フックのサブスクリプションオブジェクトがイベントを発行し、コンポーネントはそれをリッスンできます。
12
+
13
+ ```d2
14
+ direction: down
15
+
16
+ react-component: {
17
+ label: "React コンポーネント"
18
+ shape: rectangle
19
+ }
20
+
21
+ use-subscription-hook: {
22
+ label: "useSubscription フック"
23
+ shape: rectangle
24
+ }
25
+
26
+ websocket-server: {
27
+ label: "WebSocket サーバー"
28
+ shape: rectangle
29
+ }
30
+
31
+ backend-service: {
32
+ label: "バックエンドサービス"
33
+ shape: rectangle
34
+ }
35
+
36
+ react-component -> use-subscription-hook: "1. チャネルIDで呼び出し"
37
+ use-subscription-hook -> websocket-server: "2. 接続&名前空間付きチャネルを購読"
38
+ backend-service -> websocket-server: "3. イベントを公開(例:'invoice.paid')"
39
+ websocket-server -> use-subscription-hook: "4. イベントをクライアントにプッシュ"
40
+ use-subscription-hook -> react-component: "5. イベントをリスナーに発行"
41
+ react-component -> react-component: "6. UIを更新"
42
+ ```
43
+
44
+ ## パラメータ
45
+
46
+ このフックは、単一の文字列引数を取ります。
47
+
48
+ | パラメータ | タイプ | 説明 | 必須 |
49
+ | :-------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------ | :------- |
50
+ | `channel` | `string` | リッスンしたいイベントストリームの一意の識別子。**重要**: この文字列には `/`、`.`、`:` などの区切り文字を含めないでください。 | はい |
51
+
52
+ ## 戻り値
53
+
54
+ このフックは、基盤となる `@arcblock/ws` クライアントライブラリから `subscription` オブジェクトを返します。接続が確立されるまでの間、このオブジェクトは最初に `null` である場合があります。
55
+
56
+ 接続が成功すると、返されたオブジェクトはイベントリスナーを管理するための以下のメソッドを提供します:
57
+
58
+ - `subscription.on(eventName, handler)`: イベントリスナーをアタッチします。
59
+ - `subscription.off(eventName, handler)`: イベントリスナーを削除します。
60
+
61
+ ## 使用例
62
+
63
+ 以下は、請求書のステータスをリアルタイムで追跡するコンポーネントの例です。バックエンドが請求書のチャネルで `invoice.paid` イベントをブロードキャストすると、コンポーネントのUIが自動的に更新されます。
64
+
65
+ ```tsx Real-time Invoice Status Tracker icon=logos:react
66
+ import { useSubscription } from '@blocklet/payment-react';
67
+ import React, { useState, useEffect } from 'react';
68
+
69
+ /**
70
+ * 請求書のステータスを表示し、'invoice.paid' イベントを受信したときに
71
+ * リアルタイムで更新するコンポーネント。
72
+ */
73
+ function InvoiceStatusTracker({ invoiceId }) {
74
+ const [status, setStatus] = useState('pending');
75
+ // この請求書専用のチャネルを購読する
76
+ const subscription = useSubscription(invoiceId);
77
+
78
+ useEffect(() => {
79
+ // subscription オブジェクトは WebSocket 接続が確立された後に利用可能になります。
80
+ if (subscription) {
81
+ const handlePaymentSuccess = (eventData) => {
82
+ console.log(`チャネル ${invoiceId} の 'invoice.paid' イベントを受信しました:`, eventData);
83
+ // イベントに基づいてコンポーネントの状態を更新する
84
+ setStatus('paid');
85
+ };
86
+
87
+ // 'invoice.paid' イベントのリスナーをアタッチする
88
+ subscription.on('invoice.paid', handlePaymentSuccess);
89
+
90
+ // コンポーネントがアンマウントされるとき、または subscription オブジェクトが変更されたときに
91
+ // メモリリークを防ぐためにイベントリスナーをクリーンアップすることが重要です。
92
+ return () => {
93
+ subscription.off('invoice.paid', handlePaymentSuccess);
94
+ };
95
+ }
96
+ // この effect は、subscription オブジェクト自体が変更された場合に再実行されるべきです。
97
+ }, [subscription, invoiceId]);
98
+
99
+ return (
100
+ <div>
101
+ <h2>Invoice Status</h2>
102
+ <p>ID: {invoiceId}</p>
103
+ <p>ステータス: <strong>{status.toUpperCase()}</strong></p>
104
+ {status === 'pending' && <p>支払い確認を待っています...</p>}
105
+ {status === 'paid' && <p>支払いが確認されました!請求書は決済済みです。</p>}
106
+ </div>
107
+ );
108
+ }
109
+
110
+ export default InvoiceStatusTracker;
111
+ ```
@@ -0,0 +1,111 @@
1
+ # useSubscription
2
+
3
+ `useSubscription` hook 提供了一種使用 WebSockets 從支付服務訂閱即時事件的簡單方法。它處理連線、訂閱和清理邏輯,讓您可以專注於應用程式如何對 `invoice.paid` 之類的事件做出反應。
4
+
5
+ 這對於創建動態使用者體驗至關重要,其中 UI 需要即時回應後端事件,而無需使用者刷新頁面。
6
+
7
+ ## 運作方式
8
+
9
+ 此 hook 抽象化了管理 WebSocket 連線的複雜性。當元件使用 `useSubscription` 時,它會建立一個到中繼服務的持久連線。然後它會訂閱您提供的特定 `channel`。此 hook 會自動為您對頻道進行命名空間處理,建構一個格式為 `relay:<app-id>:<your-channel>` 的最終頻道名稱。
10
+
11
+ 當後端服務向該頻道發布事件時,此 hook 的訂閱物件會發出該事件,您的元件可以監聽該事件。
12
+
13
+ ```d2
14
+ direction: down
15
+
16
+ react-component: {
17
+ label: "React Component"
18
+ shape: rectangle
19
+ }
20
+
21
+ use-subscription-hook: {
22
+ label: "useSubscription Hook"
23
+ shape: rectangle
24
+ }
25
+
26
+ websocket-server: {
27
+ label: "WebSocket Server"
28
+ shape: rectangle
29
+ }
30
+
31
+ backend-service: {
32
+ label: "Backend Service"
33
+ shape: rectangle
34
+ }
35
+
36
+ react-component -> use-subscription-hook: "1. Call with channel ID"
37
+ use-subscription-hook -> websocket-server: "2. Connect & Subscribe to namespaced channel"
38
+ backend-service -> websocket-server: "3. Publish event (e.g., 'invoice.paid')"
39
+ websocket-server -> use-subscription-hook: "4. Push event to client"
40
+ use-subscription-hook -> react-component: "5. Emit event to listener"
41
+ react-component -> react-component: "6. Update UI"
42
+ ```
43
+
44
+ ## 參數
45
+
46
+ 此 hook 接受一個字串參數。
47
+
48
+ | 參數 | 類型 | 描述 | 必要 |
49
+ | :-------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------ | :------- |
50
+ | `channel` | `string` | 您想要監聽的事件流的唯一識別碼。**重要提示**:此字串不得包含 `/`、`.` 或 `:` 等分隔符。 | 是 |
51
+
52
+ ## 返回值
53
+
54
+ 此 hook 從底層的 `@arcblock/ws` 客戶端函式庫返回一個 `subscription` 物件。在建立連線期間,此物件最初可能為 `null`。
55
+
56
+ 一旦連線成功,返回的物件提供了管理事件監聽器的方法:
57
+
58
+ - `subscription.on(eventName, handler)`:附加一個事件監聽器。
59
+ - `subscription.off(eventName, handler)`:移除一個事件監聽器。
60
+
61
+
62
+ ## 範例用法
63
+
64
+ 這是一個即時追蹤發票狀態的元件範例。當後端在發票的頻道上廣播 `invoice.paid` 事件時,元件的 UI 會自動更新。
65
+
66
+ ```tsx Real-time Invoice Status Tracker icon=logos:react
67
+ import { useSubscription } from '@blocklet/payment-react';
68
+ import React, { useState, useEffect } from 'react';
69
+
70
+ /**
71
+ * 一個顯示發票狀態的元件,並在收到 'invoice.paid' 事件時即時更新。
72
+ */
73
+ function InvoiceStatusTracker({ invoiceId }) {
74
+ const [status, setStatus] = useState('pending');
75
+ // 訂閱此發票專用的頻道
76
+ const subscription = useSubscription(invoiceId);
77
+
78
+ useEffect(() => {
79
+ // WebSocket 連線建立後,subscription 物件才會可用。
80
+ if (subscription) {
81
+ const handlePaymentSuccess = (eventData) => {
82
+ console.log(`收到頻道 ${invoiceId} 的 'invoice.paid' 事件:`, eventData);
83
+ // 根據事件更新元件的狀態
84
+ setStatus('paid');
85
+ };
86
+
87
+ // 附加 'invoice.paid' 事件的監聽器
88
+ subscription.on('invoice.paid', handlePaymentSuccess);
89
+
90
+ // 在元件卸載時清理事件監聽器至關重要
91
+ // 或在 subscription 物件變更時,以防止記憶體洩漏。
92
+ return () => {
93
+ subscription.off('invoice.paid', handlePaymentSuccess);
94
+ };
95
+ }
96
+ // 如果 subscription 物件本身發生變化,此 effect 應該重新執行。
97
+ }, [subscription, invoiceId]);
98
+
99
+ return (
100
+ <div>
101
+ <h2>發票狀態</h2>
102
+ <p>ID:{invoiceId}</p>
103
+ <p>狀態:<strong>{status.toUpperCase()}</strong></p>
104
+ {status === 'pending' && <p>等待付款確認...</p>}
105
+ {status === 'paid' && <p>付款已確認!您的發票已結清。</p>}
106
+ </div>
107
+ );
108
+ }
109
+
110
+ export default InvoiceStatusTracker;
111
+ ```
@@ -0,0 +1,110 @@
1
+ # useSubscription
2
+
3
+ `useSubscription` Hook 提供了一种使用 WebSocket 从支付服务订阅实时事件的简单方法。它处理连接、订阅和清理逻辑,让您可以专注于应用程序如何响应像 `invoice.paid` 这样的事件。
4
+
5
+ 这对于创建动态用户体验至关重要,在这种体验中,UI 需要根据后端事件立即更新,而无需用户刷新页面。
6
+
7
+ ## 工作原理
8
+
9
+ 该 Hook 抽象了管理 WebSocket 连接的复杂性。当组件使用 `useSubscription` 时,它会与中继服务建立持久连接。然后,它会订阅您提供的特定 `channel`。该 Hook 会自动为您对通道进行命名空间化,构造一个格式为 `relay:<app-id>:<your-channel>` 的最终通道名称。
10
+
11
+ 当后端服务向该通道发布事件时,Hook 的订阅对象会发出该事件,您的组件可以监听该事件。
12
+
13
+ ```d2
14
+ direction: down
15
+
16
+ react-component: {
17
+ label: "React 组件"
18
+ shape: rectangle
19
+ }
20
+
21
+ use-subscription-hook: {
22
+ label: "useSubscription Hook"
23
+ shape: rectangle
24
+ }
25
+
26
+ websocket-server: {
27
+ label: "WebSocket 服务器"
28
+ shape: rectangle
29
+ }
30
+
31
+ backend-service: {
32
+ label: "后端服务"
33
+ shape: rectangle
34
+ }
35
+
36
+ react-component -> use-subscription-hook: "1. 使用 channel ID 调用"
37
+ use-subscription-hook -> websocket-server: "2. 连接并订阅命名空间化的 channel"
38
+ backend-service -> websocket-server: "3. 发布事件(例如 'invoice.paid')"
39
+ websocket-server -> use-subscription-hook: "4. 将事件推送至客户端"
40
+ use-subscription-hook -> react-component: "5. 向监听器发出事件"
41
+ react-component -> react-component: "6. 更新 UI"
42
+ ```
43
+
44
+ ## 参数
45
+
46
+ 该 Hook 接受一个字符串参数。
47
+
48
+ | 参数 | 类型 | 描述 | 是否必需 |
49
+ | :-------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------ | :------- |
50
+ | `channel` | `string` | 您想要监听的事件流的唯一标识符。**重要提示**:此字符串不得包含 `/`、`.` 或 `:` 等分隔符。 | 是 |
51
+
52
+ ## 返回值
53
+
54
+ 该 Hook 从底层的 `@arcblock/ws` 客户端库返回一个 `subscription` 对象。在建立连接期间,此对象最初可能为 `null`。
55
+
56
+ 一旦连接成功,返回的对象将提供管理事件监听器的方法:
57
+
58
+ - `subscription.on(eventName, handler)`: 附加一个事件监听器。
59
+ - `subscription.off(eventName, handler)`: 移除一个事件监听器。
60
+
61
+
62
+ ## 使用示例
63
+
64
+ 以下是一个实时跟踪发票状态的组件示例。当后端在发票的通道上广播 `invoice.paid` 事件时,组件的 UI 会自动更新。
65
+
66
+ ```tsx Real-time Invoice Status Tracker icon=logos:react
67
+ import { useSubscription } from '@blocklet/payment-react';
68
+ import React, { useState, useEffect } from 'react';
69
+
70
+ /**
71
+ * 一个显示发票状态并在收到 'invoice.paid' 事件时实时更新的组件。
72
+ */
73
+ function InvoiceStatusTracker({ invoiceId }) {
74
+ const [status, setStatus] = useState('pending');
75
+ // 订阅专用于此发票的通道
76
+ const subscription = useSubscription(invoiceId);
77
+
78
+ useEffect(() => {
79
+ // WebSocket 连接建立后,subscription 对象才可用。
80
+ if (subscription) {
81
+ const handlePaymentSuccess = (eventData) => {
82
+ console.log(`收到通道 ${invoiceId} 的 'invoice.paid' 事件:`, eventData);
83
+ // 根据事件更新组件的状态
84
+ setStatus('paid');
85
+ };
86
+
87
+ // 附加 'invoice.paid' 事件的监听器
88
+ subscription.on('invoice.paid', handlePaymentSuccess);
89
+
90
+ // 在组件卸载或 subscription 对象更改时清理事件监听器至关重要,以防止内存泄漏。
91
+ return () => {
92
+ subscription.off('invoice.paid', handlePaymentSuccess);
93
+ };
94
+ }
95
+ // 如果 subscription 对象本身发生变化,此 effect 应重新运行。
96
+ }, [subscription, invoiceId]);
97
+
98
+ return (
99
+ <div>
100
+ <h2>Invoice Status</h2>
101
+ <p>ID: {invoiceId}</p>
102
+ <p>Status: <strong>{status.toUpperCase()}</strong></p>
103
+ {status === 'pending' && <p>Waiting for payment confirmation...</p>}
104
+ {status === 'paid' && <p>Payment confirmed! Your invoice is settled.</p>}
105
+ </div>
106
+ );
107
+ }
108
+
109
+ export default InvoiceStatusTracker;
110
+ ```
@@ -0,0 +1,14 @@
1
+ # フック
2
+
3
+ `@blocklet/payment-react` ライブラリは、リアルタイムイベントの処理やさまざまな画面サイズへの適応など、一般的なロジックをカプセル化して簡素化するための一連のカスタムReactフックを提供します。これらのフックを使用すると、最小限の定型コードで高度な機能をコンポーネントに簡単に統合できます。
4
+
5
+ 利用可能なフックを調べて、アプリケーションのインタラクティブ性と応答性を向上させましょう。
6
+
7
+ <x-cards>
8
+ <x-card data-title="useSubscription" data-icon="lucide:webhook" data-href="/hooks/use-subscription">
9
+ 'invoice.paid' のような決済サービスからのリアルタイムイベントを購読して、動的で応答性の高いユーザーエクスペリエンスを作成します。
10
+ </x-card>
11
+ <x-card data-title="useMobile" data-icon="lucide:smartphone" data-href="/hooks/use-mobile">
12
+ アプリケーションがモバイルデバイスで表示されているかどうかを検出するためのユーティリティフックで、応答性が高くモバイルフレンドリーなUIの構築に役立ちます。
13
+ </x-card>
14
+ </x-cards>
@@ -0,0 +1,14 @@
1
+ # Hooks
2
+
3
+ `@blocklet/payment-react` 函式庫提供了一組自訂的 React hooks,用以封裝和簡化常見的邏輯,例如處理即時事件或適應不同的螢幕尺寸。這些 hooks 讓您可以輕鬆地將進階功能整合到您的元件中,只需最少的樣板程式碼。
4
+
5
+ 探索可用的 hooks,以增強您應用程式的互動性和響應能力。
6
+
7
+ <x-cards>
8
+ <x-card data-title="useSubscription" data-icon="lucide:webhook" data-href="/hooks/use-subscription">
9
+ 訂閱來自支付服務的即時事件,例如 'invoice.paid',以創造動態且響應迅速的使用者體驗。
10
+ </x-card>
11
+ <x-card data-title="useMobile" data-icon="lucide:smartphone" data-href="/hooks/use-mobile">
12
+ 一個用於偵測應用程式是否在行動裝置上檢視的實用 hook,協助您建構響應式且對行動裝置友善的使用者介面。
13
+ </x-card>
14
+ </x-cards>
@@ -0,0 +1,14 @@
1
+ # Hooks
2
+
3
+ `@blocklet/payment-react` 库提供了一组自定义 React hooks,用于封装和简化通用逻辑,例如处理实时事件或适应不同的屏幕尺寸。这些 hooks 允许您用最少的样板代码轻松地将高级功能集成到您的组件中。
4
+
5
+ 探索可用的 hooks 以增强应用程序的交互性和响应性。
6
+
7
+ <x-cards>
8
+ <x-card data-title="useSubscription" data-icon="lucide:webhook" data-href="/hooks/use-subscription">
9
+ 订阅来自支付服务的实时事件(例如 'invoice.paid'),以创建动态和响应式的用户体验。
10
+ </x-card>
11
+ <x-card data-title="useMobile" data-icon="lucide:smartphone" data-href="/hooks/use-mobile">
12
+ 一个用于检测应用程序是否在移动设备上查看的实用程序 hook,可帮助您构建响应式和移动友好的 UI。
13
+ </x-card>
14
+ </x-cards>