@blocklet/payment-react 1.20.16 → 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 (102) 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/package.json +3 -3
@@ -0,0 +1,153 @@
1
+ # DonateProvider
2
+
3
+ `DonateProvider` 是一个关键的上下文提供程序,用于管理应用程序中所有与捐赠相关的组件的状态和设置。它负责从后端获取配置、为提高性能而缓存配置,并将其提供给像 `CheckoutDonate` 这样的组件。
4
+
5
+ 要使用任何捐赠功能,您必须用 `DonateProvider` 包装您的组件。此提供程序还必须嵌套在 [`PaymentProvider`](./providers-payment-provider.md) 中,以确保能访问必要的支付上下文和会话信息。
6
+
7
+ ## 工作原理
8
+
9
+ `DonateProvider` 执行以下几个关键功能:
10
+
11
+ 1. **获取设置**:在挂载时,它会调用一个 API 端点来检索与唯一的 `mountLocation` prop 关联的捐赠设置。这些设置决定了子捐赠组件的行为。
12
+ 2. **缓存数据**:为了提高性能并减少网络请求,获取的设置会存储在 `localStorage` 中。缓存会在后续加载时自动使用,并可在需要时手动清除。
13
+ 3. **提供上下文**:它使用 React 的 Context API 将设置和控制函数(`refresh`、`updateSettings`)传递给任何需要它们的后代组件。
14
+ 4. **启用捐赠**:对于管理用户(“owner”或“admin”),如果捐赠实例处于非活动状态但设置了 `enableDonate` prop,提供程序将渲染一个 UI 来激活它。
15
+
16
+ ## Props
17
+
18
+ `DonateProvider` 接受以下 props 来配置其行为:
19
+
20
+ | Prop | Type | Required | Description |
21
+ | ----------------- | ---------------------------------- | :------: | ---------------------------------------------------------------------------------------------------------------------------------------- |
22
+ | `mountLocation` | `string` | 是 | 此特定捐赠实例的唯一字符串标识符。它用作获取、缓存和更新设置的键。 |
23
+ | `description` | `string` | 是 | 一个人类可读的描述,以帮助在系统后端或日志中识别此捐赠实例。 |
24
+ | `children` | `ReactNode` | 是 | 将在提供程序内部渲染的子组件,通常包括 `CheckoutDonate`。 |
25
+ | `defaultSettings` | `DonateConfigSettings` | 否 | 如果在后端找不到设置,则应用此默认设置对象。有关可用选项,请参见下面的类型定义。 |
26
+ | `active` | `boolean` | 否 | 首次创建捐赠实例时,设置其初始活动状态。默认为 `true`。 |
27
+ | `enableDonate` | `boolean` | 否 | 如果为 `true`,则允许管理员用户在捐赠实例当前处于非活动状态时从 UI 中启用它。默认为 `false`。 |
28
+
29
+ ### DonateConfigSettings 类型
30
+
31
+ 这是 `defaultSettings` 对象的结构:
32
+
33
+ ```typescript DonateConfigSettings type
34
+ export interface DonateConfigSettings {
35
+ amount?: {
36
+ presets?: string[]; // 例如 ['1', '5', '10']
37
+ preset?: string; // 默认选择的预设金额
38
+ custom: boolean; // 允许用户输入自定义金额
39
+ minimum?: string; // 最小自定义金额
40
+ maximum?: string; // 最大自定义金额
41
+ };
42
+ btnText?: string; // 主捐赠按钮的文本,例如“捐赠”
43
+ historyType?: 'table' | 'avatar'; // 如何显示支持者列表
44
+ }
45
+ ```
46
+
47
+ ## 使用示例
48
+
49
+ 这是一个在页面上设置捐赠部分的完整示例。它展示了如何使用 `DonateProvider` 和 `PaymentProvider` 包装 `CheckoutDonate`。
50
+
51
+ ```tsx App.tsx icon=logos:react
52
+ import {
53
+ PaymentProvider,
54
+ DonateProvider,
55
+ CheckoutDonate,
56
+ } from '@blocklet/payment-react';
57
+ import { useSessionContext } from './hooks/use-session'; // 您的自定义会话钩子
58
+
59
+ function DonationSection() {
60
+ const { session, connectApi } = useSessionContext();
61
+
62
+ // 如果用户未通过身份验证,则不渲染任何内容或显示登录提示
63
+ if (!session?.user) {
64
+ return <div>请登录以进行捐赠。</div>;
65
+ }
66
+
67
+ return (
68
+ <PaymentProvider session={session} connect={connectApi}>
69
+ <DonateProvider
70
+ mountLocation="support-our-blog-post-123"
71
+ description="为文章《React 入门》捐赠"
72
+ defaultSettings={{
73
+ btnText: '支持作者',
74
+ amount: {
75
+ presets: ['1', '5', '10'],
76
+ custom: true,
77
+ minimum: '1',
78
+ },
79
+ }}>
80
+ <CheckoutDonate
81
+ settings={{
82
+ target: 'post-123', // 捐赠目标的唯一标识符
83
+ title: '支持作者',
84
+ description: '如果您觉得这篇文章有帮助,欢迎请我喝杯咖啡。',
85
+ reference: 'https://your-site.com/posts/123',
86
+ beneficiaries: [
87
+ {
88
+ address: 'z8iZ75n8fWJ2aL1c9a9f4c3b2e1a0d9f8e7d6c5b4a392817',
89
+ share: '100',
90
+ },
91
+ ],
92
+ }}
93
+ />
94
+ </DonateProvider>
95
+ </PaymentProvider>
96
+ );
97
+ }
98
+ ```
99
+
100
+ ## Hooks 和实用工具
101
+
102
+ 该库还导出了几个辅助函数,用于对捐赠上下文和缓存进行高级控制。
103
+
104
+ ### `useDonateContext`
105
+
106
+ 一个 React 钩子,用于从 `DonateProvider` 的任何子组件直接访问捐赠上下文。
107
+
108
+ ```tsx
109
+ import { useDonateContext } from '@blocklet/payment-react';
110
+
111
+ function CustomDonationInfo() {
112
+ const { settings, refresh } = useDonateContext();
113
+
114
+ return (
115
+ <div>
116
+ <p>捐赠功能当前为{settings.active ? '启用' : '禁用'}状态。</p>
117
+ <button onClick={() => refresh(true)}>刷新设置</button>
118
+ </div>
119
+ );
120
+ }
121
+ ```
122
+
123
+ ### `clearDonateCache`
124
+
125
+ 此函数从 `localStorage` 中手动删除特定 `mountLocation` 的缓存设置。当您知道服务器上的设置已更改并希望在下一次组件渲染时强制刷新时,这非常有用。
126
+
127
+ ```javascript
128
+ import { clearDonateCache } from '@blocklet/payment-react';
129
+
130
+ // 当您需要使缓存失效时调用此函数
131
+ clearDonateCache('support-our-blog-post-123');
132
+ ```
133
+
134
+ ### `clearDonateSettings`
135
+
136
+ 此函数向后端 API 发送一个 `DELETE` 请求,以永久删除给定 `mountLocation` 的设置。它还会清除该位置的本地缓存。
137
+
138
+ ```javascript
139
+ import { clearDonateSettings } from '@blocklet/payment-react';
140
+
141
+ async function deleteDonationInstance() {
142
+ try {
143
+ await clearDonateSettings('support-our-blog-post-123');
144
+ console.log('捐赠设置已被删除。');
145
+ } catch (error) {
146
+ console.error('删除设置失败:', error);
147
+ }
148
+ }
149
+ ```
150
+
151
+ 配置好 `DonateProvider` 后,您现在可以实现各种捐赠功能。下一步是探索用于显示捐赠 UI 的主组件。
152
+
153
+ ➡️ 接下来,学习如何使用 [`CheckoutDonate`](./components-checkout-checkout-donate.md) 组件来渲染捐赠小部件。
@@ -0,0 +1,191 @@
1
+ # PaymentProvider
2
+
3
+ `PaymentProvider`は、`@blocklet/payment-react`ライブラリの基盤です。これはコンテキストプロバイダーとして機能し、アプリケーションまたは関連する支払いコンポーネントをラップする必要があります。重要な設定の取得、アプリケーションの状態管理、ヘルパー関数とAPIクライアントのすべての子コンポーネントへの提供を担当します。
4
+
5
+ このライブラリのほぼすべてのコンポーネントとフックは、正しく機能するために`PaymentProvider`内にネストされている必要があります。
6
+
7
+ ## 仕組み
8
+
9
+ このプロバイダーは、マウント時にPayment Kitのバックエンドから設定データを初期化して取得します。このデータは、ユーザーのセッションやその他のユーティリティとともに、`usePaymentContext`フックを介してすべての子孫コンポーネントで利用可能になります。このパターンにより、支払いコンポーネントはプロップのバケツリレー(prop drilling)なしで、常に必要なコンテキストにアクセスできるようになります。
10
+
11
+ ```d2
12
+ direction: down
13
+
14
+ Your-Application: {
15
+ label: "あなたのアプリケーション"
16
+ shape: rectangle
17
+
18
+ PaymentProvider: {
19
+ label: "PaymentProvider"
20
+ style.fill: "#d1e7dd"
21
+ }
22
+
23
+ Payment-Components: {
24
+ label: "支払いコンポーネント\n(例: CheckoutForm)"
25
+ shape: rectangle
26
+ style.fill: "#cfe2ff"
27
+ }
28
+ }
29
+
30
+ Payment-Kit-API: {
31
+ label: "Payment Kit API"
32
+ shape: cylinder
33
+ }
34
+
35
+ Your-Application.PaymentProvider -> Payment-Kit-API: "1. 設定とメソッドを取得"
36
+ Your-Application.PaymentProvider -> Your-Application.Payment-Components: "2. コンテキストを提供 (セッション、設定、APIクライアント)"
37
+ Your-Application.Payment-Components -> Payment-Kit-API: "3. APIコールを作成 (例: チェックアウト作成)"
38
+
39
+ ```
40
+
41
+ ## セットアップと使用法
42
+
43
+ `PaymentProvider`を使用するには、アプリケーションの認証コンテキストから`session`と`connect`オブジェクトを提供する必要があります。このドキュメントでは、アプリの認証ロジックを表すためにカスタムフック`useSessionContext`を使用します。以下は、このようなフックの典型的な実装例です。
44
+
45
+ ```typescript SessionContext.tsx icon=logos:react
46
+ import React, { createContext, useContext } from 'react';
47
+ import { SessionProvider, useSessionContext as useDidSessionContext } from '@arcblock/did-connect-react';
48
+
49
+ // 独自のコンテキストを作成するか、既存のコンテキストを使用できます
50
+ const AppContext = createContext({});
51
+
52
+ export function AppProvider({ children }) {
53
+ return (
54
+ <SessionProvider>
55
+ <AppContext.Provider value={{}}>
56
+ {children}
57
+ </AppContext.Provider>
58
+ </SessionProvider>
59
+ );
60
+ }
61
+
62
+ // このカスタムフックは、sessionとconnectApiをPaymentProviderに提供します
63
+ export function useSessionContext() {
64
+ const { session, connect } = useDidSessionContext();
65
+ return { session, connectApi: connect };
66
+ }
67
+ ```
68
+
69
+ セッション管理を実装したら、メインのアプリケーションコンポーネントを`PaymentProvider`でラップします。
70
+
71
+ ```tsx App.tsx icon=logos:react
72
+ import { PaymentProvider } from '@blocklet/payment-react';
73
+ import { useSessionContext } from './SessionContext'; // あなたのセッションコンテキストフック
74
+ import MyPaymentPage from './MyPaymentPage';
75
+
76
+ function App() {
77
+ const { session, connectApi } = useSessionContext();
78
+
79
+ return (
80
+ <PaymentProvider session={session} connect={connectApi}>
81
+ <MyPaymentPage />
82
+ </PaymentProvider>
83
+ );
84
+ }
85
+
86
+ export default App;
87
+ ```
88
+
89
+ ## Props
90
+
91
+ `PaymentProvider`コンポーネントは、次のpropsを受け入れます。
92
+
93
+ | Prop | Type | Required | Description |
94
+ | --- | --- | --- | --- |
95
+ | `session` | `Session` | はい | 認証コンテキストからのユーザーセッションオブジェクト(例:`@arcblock/did-connect-react`)。 |
96
+ | `connect` | `Connect` | はい | DID Connect操作に使用される、認証コンテキストからの `connect` API関数。 |
97
+ | `children` | `React.ReactNode` | はい | 支払いコンテキストにアクセスできるようになる子コンポーネント。 |
98
+ | `baseUrl` | `string` | いいえ | Payment Kit blockletのベースURL。異なるオリジン(クロスオリジン)から支払いコンポーネントを統合する場合にのみ必要です。 |
99
+ | `authToken` | `string` | いいえ | APIリクエスト用の特定の認証トークン。提供された場合、セッションベースの認証の代わりに使用されます。 |
100
+
101
+
102
+ ## コンテキストの値
103
+
104
+ `PaymentProvider`内のコンポーネントは、`usePaymentContext`フックを使用して次の値にアクセスできます。
105
+
106
+ ```typescript MyComponent.tsx icon=logos:react
107
+ import { usePaymentContext } from '@blocklet/payment-react';
108
+
109
+ function MyComponent() {
110
+ const { settings, livemode, setLivemode } = usePaymentContext();
111
+
112
+ return (
113
+ <div>
114
+ <p>Base Currency: {settings.baseCurrency?.name}</p>
115
+ <p>Mode: {livemode ? 'Live' : 'Test'}</p>
116
+ <button onClick={() => setLivemode(!livemode)}>Toggle Mode</button>
117
+ </div>
118
+ );
119
+ }
120
+ ```
121
+
122
+ 利用可能なコンテキスト値の完全なリストは次のとおりです。
123
+
124
+ | Key | Type | Description |
125
+ | --- | --- | --- |
126
+ | `session` | `object` | 認証済みユーザーのセッション。ユーザー詳細を含みます。 |
127
+ | `connect` | `function` | DID Walletとの対話を開始するための `connect` 関数。 |
128
+ | `livemode` | `boolean` | コンテキストがライブモード(`true`)かテストモード(`false`)かを示します。 |
129
+ | `setLivemode` | `(livemode: boolean) => void` | ライブモードとテストモードを切り替えるための関数。これにより、設定の再取得がトリガーされます。 |
130
+ | `settings` | `Settings` | バックエンドから取得した `paymentMethods` と `baseCurrency` の設定を含むオブジェクト。 |
131
+ | `refresh` | `(forceRefresh?: boolean) => void` | 設定データを手動で再取得するための関数。 |
132
+ | `getCurrency` | `(id: string) => TPaymentCurrency` | IDによって特定の通貨の詳細を取得するためのヘルパー関数。 |
133
+ | `getMethod` | `(id: string) => TPaymentMethodExpanded` | IDによって特定の支払い方法の詳細を取得するためのヘルパー関数。 |
134
+ | `api` | `AxiosInstance` | Payment Kitバックエンドに対して認証済みAPIコールを行うための、事前設定済みのAxiosインスタンス。 |
135
+ | `prefix` | `string` | blockletのURLプレフィックス。 |
136
+ | `payable` | `boolean` | 支払いアクションの可用性を制御するために使用できる状態。 |
137
+ | `setPayable` | `(status: boolean) => void` | `payable` ステータスを更新するための関数。 |
138
+
139
+
140
+ ## 高度なシナリオ
141
+
142
+ ### クロスオリジン統合
143
+
144
+ アプリケーションとPayment Kit blockletが異なるドメインでホストされている場合は、`baseUrl` propを使用する必要があります。これにより、`PaymentProvider`はPayment Kit APIを正しく特定し、通信できるようになります。
145
+
146
+ ```tsx CrossOriginApp.tsx icon=logos:react
147
+ import { PaymentProvider } from '@blocklet/payment-react';
148
+ import { useSessionContext } from './SessionContext';
149
+
150
+ function CrossOriginApp() {
151
+ const { session, connectApi } = useSessionContext();
152
+
153
+ return (
154
+ <PaymentProvider
155
+ session={session}
156
+ connect={connectApi}
157
+ baseUrl="https://payment-kit.another-domain.com"
158
+ >
159
+ {/* あなたの支払いコンポーネント */}
160
+ </PaymentProvider>
161
+ );
162
+ }
163
+ ```
164
+
165
+ ### カスタム認証トークン
166
+
167
+ デフォルトのセッションベース認証の代わりに特定のAPIトークンを使用する必要があるシナリオ(例:サーバー間通信や特定のアクセス権の付与)では、`authToken` propを渡すことができます。
168
+
169
+ ```tsx TokenAuthApp.tsx icon=logos:react
170
+ import { PaymentProvider } from '@blocklet/payment-react';
171
+ import { useSessionContext } from './SessionContext';
172
+
173
+ function TokenAuthApp() {
174
+ const { session, connectApi } = useSessionContext();
175
+ const myCustomAuthToken = 'sk_xxxxxx'; // あなたの秘密トークン
176
+
177
+ return (
178
+ <PaymentProvider
179
+ session={session}
180
+ connect={connectApi}
181
+ authToken={myCustomAuthToken}
182
+ >
183
+ {/* コンポーネントはAPIコールに提供されたauthTokenを使用します */}
184
+ </PaymentProvider>
185
+ );
186
+ }
187
+ ```
188
+
189
+ ---
190
+
191
+ `PaymentProvider`のセットアップが完了したら、支払いコンポーネントをアプリケーションに統合する準備が整いました。次のステップとして、[CheckoutForm](./components-checkout-checkout-form.md)コンポーネントを使用して支払いフローを作成する方法を確認することをお勧めします。
@@ -0,0 +1,191 @@
1
+ # PaymentProvider
2
+
3
+ `PaymentProvider` 是 `@blocklet/payment-react` 函式庫的基石。它作為一個上下文提供者,必須包裝您的應用程式或相關的支付元件。它負責取得必要的設定、管理應用程式狀態,並為其所有子元件提供輔助函式和 API 客戶端。
4
+
5
+ 此函式庫中幾乎每個元件和掛鉤都需要嵌套在 `PaymentProvider` 內才能正常運作。
6
+
7
+ ## 運作方式
8
+
9
+ 該提供者在掛載時會初始化並從 Payment Kit 後端取得設定資料。這些資料,連同使用者的 session 和其他工具,會透過 `usePaymentContext` 掛鉤提供給任何後代元件。這種模式確保您的支付元件始終能夠存取必要的上下文,而無需透過屬性傳遞。
10
+
11
+ ```d2
12
+ direction: down
13
+
14
+ Your-Application: {
15
+ label: "您的應用程式"
16
+ shape: rectangle
17
+
18
+ PaymentProvider: {
19
+ label: "PaymentProvider"
20
+ style.fill: "#d1e7dd"
21
+ }
22
+
23
+ Payment-Components: {
24
+ label: "支付元件\n(例如 CheckoutForm)"
25
+ shape: rectangle
26
+ style.fill: "#cfe2ff"
27
+ }
28
+ }
29
+
30
+ Payment-Kit-API: {
31
+ label: "Payment Kit API"
32
+ shape: cylinder
33
+ }
34
+
35
+ Your-Application.PaymentProvider -> Payment-Kit-API: "1. 取得設定與方法"
36
+ Your-Application.PaymentProvider -> Your-Application.Payment-Components: "2. 提供上下文 (session、設定、API 客戶端)"
37
+ Your-Application.Payment-Components -> Payment-Kit-API: "3. 發起 API 呼叫 (例如建立結帳)"
38
+
39
+ ```
40
+
41
+ ## 設定與使用
42
+
43
+ 若要使用 `PaymentProvider`,您需要從應用程式的驗證上下文中為其提供 `session` 和 `connect` 物件。在整個文件中,我們將使用一個自訂掛鉤 `useSessionContext` 來代表您應用程式的驗證邏輯。以下是此類掛鉤的典型實作:
44
+
45
+ ```typescript SessionContext.tsx icon=logos:react
46
+ import React, { createContext, useContext } from 'react';
47
+ import { SessionProvider, useSessionContext as useDidSessionContext } from '@arcblock/did-connect-react';
48
+
49
+ // 您可以建立自己的上下文或使用現有的上下文
50
+ const AppContext = createContext({});
51
+
52
+ export function AppProvider({ children }) {
53
+ return (
54
+ <SessionProvider>
55
+ <AppContext.Provider value={{}}>
56
+ {children}
57
+ </AppContext.Provider>
58
+ </SessionProvider>
59
+ );
60
+ }
61
+
62
+ // 這個自訂掛鉤為 PaymentProvider 提供 session 和 connectApi
63
+ export function useSessionContext() {
64
+ const { session, connect } = useDidSessionContext();
65
+ return { session, connectApi: connect };
66
+ }
67
+ ```
68
+
69
+ 一旦您的 session 管理就緒,就用 `PaymentProvider` 包裝您的主應用程式元件。
70
+
71
+ ```tsx App.tsx icon=logos:react
72
+ import { PaymentProvider } from '@blocklet/payment-react';
73
+ import { useSessionContext } from './SessionContext'; // 您的 session 上下文掛鉤
74
+ import MyPaymentPage from './MyPaymentPage';
75
+
76
+ function App() {
77
+ const { session, connectApi } = useSessionContext();
78
+
79
+ return (
80
+ <PaymentProvider session={session} connect={connectApi}>
81
+ <MyPaymentPage />
82
+ </PaymentProvider>
83
+ );
84
+ }
85
+
86
+ export default App;
87
+ ```
88
+
89
+ ## Props
90
+
91
+ `PaymentProvider` 元件接受以下 props:
92
+
93
+ | Prop | Type | Required | Description |
94
+ | --- | --- | --- | --- |
95
+ | `session` | `Session` | 是 | 來自您的驗證上下文的使用者 session 物件 (例如 `@arcblock/did-connect-react`)。 |
96
+ | `connect` | `Connect` | 是 | 來自您的驗證上下文的 `connect` API 函式,用於 DID Connect 操作。 |
97
+ | `children` | `React.ReactNode` | 是 | 將有權存取支付上下文的子元件。 |
98
+ | `baseUrl` | `string` | 否 | Payment Kit blocklet 的基礎 URL。僅在從不同來源 (跨來源) 整合支付元件時才需要。 |
99
+ | `authToken` | `string` | 否 | 用於 API 請求的特定驗證令牌。如果提供,它將取代基於 session 的驗證。 |
100
+
101
+
102
+ ## 上下文值
103
+
104
+ `PaymentProvider` 內的元件可以使用 `usePaymentContext` 掛鉤存取以下值。
105
+
106
+ ```typescript MyComponent.tsx icon=logos:react
107
+ import { usePaymentContext } from '@blocklet/payment-react';
108
+
109
+ function MyComponent() {
110
+ const { settings, livemode, setLivemode } = usePaymentContext();
111
+
112
+ return (
113
+ <div>
114
+ <p>基礎貨幣: {settings.baseCurrency?.name}</p>
115
+ <p>模式: {livemode ? '正式' : '測試'}</p>
116
+ <button onClick={() => setLivemode(!livemode)}>切換模式</button>
117
+ </div>
118
+ );
119
+ }
120
+ ```
121
+
122
+ 以下是可用上下文值的完整列表:
123
+
124
+ | Key | Type | Description |
125
+ | --- | --- | --- |
126
+ | `session` | `object` | 經過驗證的使用者 session,包含使用者詳細資訊。 |
127
+ | `connect` | `function` | 用於啟動 DID Wallet 互動的 `connect` 函式。 |
128
+ | `livemode` | `boolean` | 表示上下文是處於正式 (`true`) 模式還是測試 (`false`) 模式。 |
129
+ | `setLivemode` | `(livemode: boolean) => void` | 一個在正式和測試模式之間切換的函式。這將觸發重新取得設定。 |
130
+ | `settings` | `Settings` | 一個包含從後端取得的 `paymentMethods` 和 `baseCurrency` 設定的物件。 |
131
+ | `refresh` | `(forceRefresh?: boolean) => void` | 一個手動觸發重新取得設定資料的函式。 |
132
+ | `getCurrency` | `(id: string) => TPaymentCurrency` | 一個輔助函式,可透過 ID 取得特定貨幣的詳細資訊。 |
133
+ | `getMethod` | `(id: string) => TPaymentMethodExpanded` | 一個輔助函式,可透過 ID 取得特定支付方式的詳細資訊。 |
134
+ | `api` | `AxiosInstance` | 一個預先設定的 Axios 實例,用於向 Payment Kit 後端發出經過驗證的 API 呼叫。 |
135
+ | `prefix` | `string` | blocklet 的 URL 前綴。 |
136
+ | `payable` | `boolean` | 一個可用於控制支付操作可用性的狀態。 |
137
+ | `setPayable` | `(status: boolean) => void` | 一個更新 `payable` 狀態的函式。 |
138
+
139
+
140
+ ## 進階情境
141
+
142
+ ### 跨來源整合
143
+
144
+ 如果您的應用程式和 Payment Kit blocklet 託管在不同的網域上,您必須使用 `baseUrl` prop。這讓 `PaymentProvider` 能夠正確地定位並與 Payment Kit API 通訊。
145
+
146
+ ```tsx CrossOriginApp.tsx icon=logos:react
147
+ import { PaymentProvider } from '@blocklet/payment-react';
148
+ import { useSessionContext } from './SessionContext';
149
+
150
+ function CrossOriginApp() {
151
+ const { session, connectApi } = useSessionContext();
152
+
153
+ return (
154
+ <PaymentProvider
155
+ session={session}
156
+ connect={connectApi}
157
+ baseUrl="https://payment-kit.another-domain.com"
158
+ >
159
+ {/* 您的支付元件 */}
160
+ </PaymentProvider>
161
+ );
162
+ }
163
+ ```
164
+
165
+ ### 自訂驗證令牌
166
+
167
+ 在您需要使用特定的 API 令牌而不是預設的基於 session 的驗證的情境下 (例如,用於伺服器對伺服器通訊或特定的存取授權),您可以傳遞 `authToken` prop。
168
+
169
+ ```tsx TokenAuthApp.tsx icon=logos:react
170
+ import { PaymentProvider } from '@blocklet/payment-react';
171
+ import { useSessionContext } from './SessionContext';
172
+
173
+ function TokenAuthApp() {
174
+ const { session, connectApi } = useSessionContext();
175
+ const myCustomAuthToken = 'sk_xxxxxx'; // 您的秘密令牌
176
+
177
+ return (
178
+ <PaymentProvider
179
+ session={session}
180
+ connect={connectApi}
181
+ authToken={myCustomAuthToken}
182
+ >
183
+ {/* 元件將使用提供的 authToken 進行 API 呼叫 */}
184
+ </PaymentProvider>
185
+ );
186
+ }
187
+ ```
188
+
189
+ ---
190
+
191
+ 設定好 `PaymentProvider` 後,您現在可以開始將支付元件整合到您的應用程式中。一個好的下一步是探索如何使用 [CheckoutForm](./components-checkout-checkout-form.md) 元件來建立支付流程。