@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.
- package/.aigne/doc-smith/config.yaml +7 -1
- package/.aigne/doc-smith/upload-cache.yaml +441 -0
- package/docs/components-business-auto-topup.ja.md +187 -0
- package/docs/components-business-auto-topup.zh-TW.md +187 -0
- package/docs/components-business-auto-topup.zh.md +187 -0
- package/docs/components-business-overdue-invoice-payment.ja.md +196 -0
- package/docs/components-business-overdue-invoice-payment.zh-TW.md +197 -0
- package/docs/components-business-overdue-invoice-payment.zh.md +197 -0
- package/docs/components-business-resume-subscription.ja.md +190 -0
- package/docs/components-business-resume-subscription.zh-TW.md +190 -0
- package/docs/components-business-resume-subscription.zh.md +190 -0
- package/docs/components-business.ja.md +21 -0
- package/docs/components-business.zh-TW.md +21 -0
- package/docs/components-business.zh.md +21 -0
- package/docs/components-checkout-checkout-donate.ja.md +259 -0
- package/docs/components-checkout-checkout-donate.zh-TW.md +259 -0
- package/docs/components-checkout-checkout-donate.zh.md +259 -0
- package/docs/components-checkout-checkout-form.ja.md +163 -0
- package/docs/components-checkout-checkout-form.zh-TW.md +163 -0
- package/docs/components-checkout-checkout-form.zh.md +163 -0
- package/docs/components-checkout-checkout-table.ja.md +148 -0
- package/docs/components-checkout-checkout-table.zh-TW.md +148 -0
- package/docs/components-checkout-checkout-table.zh.md +149 -0
- package/docs/components-checkout.ja.md +65 -0
- package/docs/components-checkout.zh-TW.md +65 -0
- package/docs/components-checkout.zh.md +65 -0
- package/docs/components-history-credit-grants-list.ja.md +73 -0
- package/docs/components-history-credit-grants-list.zh-TW.md +73 -0
- package/docs/components-history-credit-grants-list.zh.md +73 -0
- package/docs/components-history-credit-transactions-list.ja.md +106 -0
- package/docs/components-history-credit-transactions-list.zh-TW.md +106 -0
- package/docs/components-history-credit-transactions-list.zh.md +106 -0
- package/docs/components-history-invoice-list.ja.md +110 -0
- package/docs/components-history-invoice-list.zh-TW.md +110 -0
- package/docs/components-history-invoice-list.zh.md +110 -0
- package/docs/components-history-payment-list.ja.md +44 -0
- package/docs/components-history-payment-list.zh-TW.md +44 -0
- package/docs/components-history-payment-list.zh.md +44 -0
- package/docs/components-history.ja.md +67 -0
- package/docs/components-history.zh-TW.md +67 -0
- package/docs/components-history.zh.md +67 -0
- package/docs/components-ui-form-elements-address-form.ja.md +121 -0
- package/docs/components-ui-form-elements-address-form.zh-TW.md +121 -0
- package/docs/components-ui-form-elements-address-form.zh.md +121 -0
- package/docs/components-ui-form-elements-country-select.ja.md +126 -0
- package/docs/components-ui-form-elements-country-select.zh-TW.md +126 -0
- package/docs/components-ui-form-elements-country-select.zh.md +126 -0
- package/docs/components-ui-form-elements-currency-selector.ja.md +108 -0
- package/docs/components-ui-form-elements-currency-selector.zh-TW.md +108 -0
- package/docs/components-ui-form-elements-currency-selector.zh.md +108 -0
- package/docs/components-ui-form-elements-phone-input.ja.md +138 -0
- package/docs/components-ui-form-elements-phone-input.zh-TW.md +138 -0
- package/docs/components-ui-form-elements-phone-input.zh.md +139 -0
- package/docs/components-ui-form-elements.ja.md +91 -0
- package/docs/components-ui-form-elements.zh-TW.md +91 -0
- package/docs/components-ui-form-elements.zh.md +91 -0
- package/docs/components-ui-payment-summary.ja.md +109 -0
- package/docs/components-ui-payment-summary.zh-TW.md +109 -0
- package/docs/components-ui-payment-summary.zh.md +109 -0
- package/docs/components-ui-pricing-table.ja.md +140 -0
- package/docs/components-ui-pricing-table.zh-TW.md +140 -0
- package/docs/components-ui-pricing-table.zh.md +140 -0
- package/docs/components-ui.ja.md +71 -0
- package/docs/components-ui.zh-TW.md +71 -0
- package/docs/components-ui.zh.md +71 -0
- package/docs/components.ja.md +122 -0
- package/docs/components.zh-TW.md +122 -0
- package/docs/components.zh.md +122 -0
- package/docs/getting-started.ja.md +84 -0
- package/docs/getting-started.zh-TW.md +84 -0
- package/docs/getting-started.zh.md +84 -0
- package/docs/guides-theming.ja.md +213 -0
- package/docs/guides-theming.zh-TW.md +213 -0
- package/docs/guides-theming.zh.md +213 -0
- package/docs/guides-utilities.ja.md +197 -0
- package/docs/guides-utilities.zh-TW.md +197 -0
- package/docs/guides-utilities.zh.md +197 -0
- package/docs/guides.ja.md +18 -0
- package/docs/guides.zh-TW.md +18 -0
- package/docs/guides.zh.md +18 -0
- package/docs/hooks-use-mobile.ja.md +84 -0
- package/docs/hooks-use-mobile.zh-TW.md +84 -0
- package/docs/hooks-use-mobile.zh.md +84 -0
- package/docs/hooks-use-subscription.ja.md +111 -0
- package/docs/hooks-use-subscription.zh-TW.md +111 -0
- package/docs/hooks-use-subscription.zh.md +110 -0
- package/docs/hooks.ja.md +14 -0
- package/docs/hooks.zh-TW.md +14 -0
- package/docs/hooks.zh.md +14 -0
- package/docs/overview.ja.md +80 -0
- package/docs/overview.zh-TW.md +80 -0
- package/docs/overview.zh.md +80 -0
- package/docs/providers-donate-provider.ja.md +153 -0
- package/docs/providers-donate-provider.zh-TW.md +153 -0
- package/docs/providers-donate-provider.zh.md +153 -0
- package/docs/providers-payment-provider.ja.md +191 -0
- package/docs/providers-payment-provider.zh-TW.md +191 -0
- package/docs/providers-payment-provider.zh.md +191 -0
- package/docs/providers.ja.md +42 -0
- package/docs/providers.zh-TW.md +42 -0
- package/docs/providers.zh.md +42 -0
- package/package.json +3 -3
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# CheckoutDonate
|
|
2
|
+
|
|
3
|
+
`CheckoutDonate`コンポーネントは、アプリケーションに寄付機能を追加するための、柔軟で統合しやすいソリューションを提供します。チェックアウトダイアログを開くシンプルなボタンから、完全に制御可能なカスタムUIまで、さまざまな表示モードをサポートしています。
|
|
4
|
+
|
|
5
|
+
このコンポーネントが正しく機能するためには、`PaymentProvider`と`DonateProvider`の両方でラップする必要があります。`DonateProvider`は、アプリケーションの特定のスコープ内における寄付インスタンスの設定と状態を管理します。
|
|
6
|
+
|
|
7
|
+
## 仕組み
|
|
8
|
+
|
|
9
|
+
寄付のフローは`DonateProvider`と`CheckoutDonate`の組み合わせによって調整されます。以下にその概要を示します。
|
|
10
|
+
|
|
11
|
+
```d2 How It Works icon=graph-ql:diagram
|
|
12
|
+
direction: down
|
|
13
|
+
|
|
14
|
+
user: {
|
|
15
|
+
shape: c4-person
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
app: {
|
|
19
|
+
label: "あなたのReactアプリ"
|
|
20
|
+
|
|
21
|
+
checkout-donate: {
|
|
22
|
+
label: "CheckoutDonate"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
checkout-form: {
|
|
26
|
+
label: "CheckoutForm (ダイアログ内)"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
payment-api: {
|
|
31
|
+
label: "決済バックエンドAPI"
|
|
32
|
+
shape: cylinder
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# Initial Load
|
|
36
|
+
app.checkout-donate -> payment-api: "設定と支援者を取得"
|
|
37
|
+
|
|
38
|
+
# Donation Flow
|
|
39
|
+
user -> app.checkout-donate: "1. 寄付をクリック"
|
|
40
|
+
app.checkout-donate -> app.checkout-form: "2. CheckoutFormを含むダイアログを開く"
|
|
41
|
+
app.checkout-form -> payment-api: "3. 支払いを処理"
|
|
42
|
+
payment-api -> app.checkout-form: "4. 成功を返す"
|
|
43
|
+
app.checkout-form -> app.checkout-donate: "5. onPaidコールバックをトリガー"
|
|
44
|
+
app.checkout-donate -> payment-api: "6. 支援者リストを再取得"
|
|
45
|
+
payment-api -> app.checkout-donate: "7. 更新された支援者を返す"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
1. **初期化**:`DonateProvider`は、一意の`mountLocation`によって識別されるバックエンドから、寄付設定(プリセット金額、ボタンテキストなど)を取得してキャッシュします。
|
|
49
|
+
2. **レンダリング**:`CheckoutDonate`は、取得した設定と自身のpropsに基づいて、ボタンまたはカスタムUIをレンダリングします。
|
|
50
|
+
3. **インタラクション**:ユーザーが寄付を開始すると、`CheckoutDonate`は寄付用に事前設定された`CheckoutForm`を含むダイアログを開きます。
|
|
51
|
+
4. **支払い**:ユーザーは`CheckoutForm`を通じて支払いを完了します。
|
|
52
|
+
5. **確認**:支払いが成功すると、`onPaid`コールバックがトリガーされ、コンポーネントは自動的に支援者リストを更新します。
|
|
53
|
+
|
|
54
|
+
## Providerのセットアップ
|
|
55
|
+
|
|
56
|
+
`CheckoutDonate`を使用する前に、コンポーネントツリーを`PaymentProvider`と`DonateProvider`でラップする必要があります。
|
|
57
|
+
|
|
58
|
+
```tsx Provider Setup Example icon=logos:react
|
|
59
|
+
import {
|
|
60
|
+
PaymentProvider,
|
|
61
|
+
DonateProvider,
|
|
62
|
+
CheckoutDonate,
|
|
63
|
+
} from '@blocklet/payment-react';
|
|
64
|
+
import { useSessionContext } from '../hooks/session-context'; // あなたのセッションコンテキストフック
|
|
65
|
+
|
|
66
|
+
function DonationPage() {
|
|
67
|
+
const { session, connect } = useSessionContext();
|
|
68
|
+
|
|
69
|
+
// プロバイダーをレンダリングする前にセッションがロードされていることを確認
|
|
70
|
+
if (!session) {
|
|
71
|
+
return <div>読み込み中...</div>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<PaymentProvider session={session} connect={connect}>
|
|
76
|
+
<DonateProvider
|
|
77
|
+
mountLocation="unique-page-identifier" // この寄付コンテキストのための一意のキー
|
|
78
|
+
description="私の素晴らしいブログ投稿への寄付"
|
|
79
|
+
defaultSettings={{
|
|
80
|
+
btnText: '私を支援する',
|
|
81
|
+
}}>
|
|
82
|
+
{/* ここにCheckoutDonateコンポーネントを配置します */}
|
|
83
|
+
<CheckoutDonate
|
|
84
|
+
settings={{
|
|
85
|
+
target: "post-123",
|
|
86
|
+
title: "著者を支援",
|
|
87
|
+
description: "この記事が役に立ったと思ったら、ぜひコーヒーを一杯おごってください",
|
|
88
|
+
reference: "https://your-site.com/posts/123",
|
|
89
|
+
beneficiaries: [
|
|
90
|
+
{
|
|
91
|
+
address: "z2qa...",
|
|
92
|
+
share: "100",
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
}}
|
|
96
|
+
/>
|
|
97
|
+
</DonateProvider>
|
|
98
|
+
</PaymentProvider>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
詳細は[`DonateProvider`](./providers-donate-provider.md)のドキュメントを参照してください。
|
|
104
|
+
|
|
105
|
+
## コンポーネントのProps
|
|
106
|
+
|
|
107
|
+
### `DonateProps`
|
|
108
|
+
|
|
109
|
+
| Prop | Type | Description |
|
|
110
|
+
| --- | --- | --- |
|
|
111
|
+
| `settings` | `CheckoutDonateSettings` | **必須。** この特定の寄付インスタンスの設定。 |
|
|
112
|
+
| `onPaid` | `(session) => void` | 任意。支払いが成功した後に実行されるコールバック関数。 |
|
|
113
|
+
| `onError` | `(error) => void` | 任意。エラーが発生した場合に実行されるコールバック関数。 |
|
|
114
|
+
| `mode` | `'default' \| 'inline' \| 'custom'` | 任意。レンダリングモード。デフォルトは`'default'`です。 |
|
|
115
|
+
| `livemode` | `boolean` | 任意。`PaymentProvider`からの`livemode`を上書きします。 |
|
|
116
|
+
| `timeout` | `number` | 任意。支払い後にダイアログを閉じるまでの待機時間(ミリ秒)。デフォルトは`5000`です。 |
|
|
117
|
+
| `theme` | `'default' \| 'inherit' \| object` | 任意。テーマのカスタマイズオプション。[テーマ設定](./guides-theming.md)ガイドを参照してください。 |
|
|
118
|
+
| `children` | `(openDialog, donateTotalAmount, supporters, loading, donateSettings) => React.ReactNode` | 任意。`mode="custom"`の場合にのみ使用されるレンダープロップ関数。 |
|
|
119
|
+
|
|
120
|
+
### `CheckoutDonateSettings`
|
|
121
|
+
|
|
122
|
+
このオブジェクトは`settings` propに渡され、寄付の核心的な詳細を定義します。
|
|
123
|
+
|
|
124
|
+
| Property | Type | Description |
|
|
125
|
+
| --- | --- | --- |
|
|
126
|
+
| `target` | `string` | **必須。** 寄付対象の一意の識別子(例:投稿ID、プロジェクト名)。 |
|
|
127
|
+
| `title` | `string` | **必須。** 寄付ダイアログの上部に表示されるタイトル。 |
|
|
128
|
+
| `description` | `string` | **必須。** 寄付ダイアログに表示される短い説明。 |
|
|
129
|
+
| `reference` | `string` | **必須。** 参照用として使用される、寄付に関連するURL。 |
|
|
130
|
+
| `beneficiaries` | `PaymentBeneficiary[]` | **必須。** 資金を受け取る人を定義するオブジェクトの配列。各オブジェクトには`address`(受取人のDID)と`share`(パーセンテージ)が必要です。 |
|
|
131
|
+
| `amount` | `object` | 任意。寄付金額を設定します。`presets`(例:`['1', '5', '10']`)、デフォルトの`preset`、`minimum`、`maximum`、および`custom`金額が許可されるかどうかを含みます。 |
|
|
132
|
+
| `appearance` | `object` | 任意。`button`(テキスト、アイコン、バリアント)や`history`の表示(`'avatar'`または`'table'`)を含む、ルックアンドフィールをカスタマイズします。 |
|
|
133
|
+
|
|
134
|
+
## 使用例
|
|
135
|
+
|
|
136
|
+
### デフォルトモード
|
|
137
|
+
|
|
138
|
+
これは`CheckoutDonate`を使用する最も簡単な方法です。寄付ダイアログを開くボタンと、最近の支援者の概要をレンダリングします。
|
|
139
|
+
|
|
140
|
+
```tsx Default Donation Button icon=logos:react
|
|
141
|
+
import {
|
|
142
|
+
PaymentProvider,
|
|
143
|
+
DonateProvider,
|
|
144
|
+
CheckoutDonate,
|
|
145
|
+
} from '@blocklet/payment-react';
|
|
146
|
+
import { useSessionContext } from '../hooks/session-context';
|
|
147
|
+
|
|
148
|
+
function App() {
|
|
149
|
+
const { session, connect } = useSessionContext();
|
|
150
|
+
|
|
151
|
+
if (!session) {
|
|
152
|
+
return <div>セッションを読み込み中...</div>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return (
|
|
156
|
+
<PaymentProvider session={session} connect={connect}>
|
|
157
|
+
<DonateProvider
|
|
158
|
+
mountLocation="blog-post-123"
|
|
159
|
+
description="ブログ投稿123への寄付"
|
|
160
|
+
defaultSettings={{
|
|
161
|
+
btnText: 'コーヒーをおごる',
|
|
162
|
+
historyType: 'avatar',
|
|
163
|
+
}}>
|
|
164
|
+
<CheckoutDonate
|
|
165
|
+
settings={{
|
|
166
|
+
target: 'post-123',
|
|
167
|
+
title: '著者を支援',
|
|
168
|
+
description: 'この記事が役に立ったと思ったら、少額の寄付をご検討ください。',
|
|
169
|
+
reference: 'https://example.com/posts/123',
|
|
170
|
+
beneficiaries: [
|
|
171
|
+
{
|
|
172
|
+
address: 'z2qa...gCLd', // 著者のDIDアドレス
|
|
173
|
+
share: '100',
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
}}
|
|
177
|
+
onPaid={() => {
|
|
178
|
+
console.log('寄付が成功しました!');
|
|
179
|
+
}}
|
|
180
|
+
/>
|
|
181
|
+
</DonateProvider>
|
|
182
|
+
</PaymentProvider>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### カスタムUIモード
|
|
188
|
+
|
|
189
|
+
ユーザーインターフェースを完全に制御するには、`mode="custom"`を使用し、`children`としてレンダープロップを提供します。この関数は、集まった総額や支援者リストを含む寄付の状態へのアクセスを提供し、完全にカスタムな表示を構築することができます。
|
|
190
|
+
|
|
191
|
+
```tsx Custom Donation UI icon=logos:react
|
|
192
|
+
import {
|
|
193
|
+
PaymentProvider,
|
|
194
|
+
DonateProvider,
|
|
195
|
+
CheckoutDonate,
|
|
196
|
+
} from '@blocklet/payment-react';
|
|
197
|
+
import { useSessionContext } from '../hooks/session-context';
|
|
198
|
+
import { CircularProgress, Button } from '@mui/material';
|
|
199
|
+
|
|
200
|
+
function CustomDonationDisplay() {
|
|
201
|
+
const { session, connect } = useSessionContext();
|
|
202
|
+
|
|
203
|
+
if (!session) {
|
|
204
|
+
return <div>セッションを読み込み中...</div>;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const donateSettings = {
|
|
208
|
+
target: 'post-123',
|
|
209
|
+
title: '著者を支援',
|
|
210
|
+
description: 'この記事が役に立ったと思ったら、少額の寄付をご検討ください。',
|
|
211
|
+
reference: 'https://example.com/posts/123',
|
|
212
|
+
beneficiaries: [
|
|
213
|
+
{
|
|
214
|
+
address: 'z2qa...gCLd', // 著者のDIDアドレス
|
|
215
|
+
share: '100',
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<PaymentProvider session={session} connect={connect}>
|
|
222
|
+
<DonateProvider
|
|
223
|
+
mountLocation="blog-post-123"
|
|
224
|
+
description="ブログ投稿123への寄付">
|
|
225
|
+
<CheckoutDonate mode="custom" settings={donateSettings}>
|
|
226
|
+
{(openDonate, totalAmount, supporters, loading, settings) => (
|
|
227
|
+
<div style={{ border: '1px solid #ccc', padding: '16px', borderRadius: '8px' }}>
|
|
228
|
+
<h2>私たちの支援者</h2>
|
|
229
|
+
<p>寄付総額:<strong>{totalAmount}</strong></p>
|
|
230
|
+
<Button variant="contained" onClick={openDonate}>
|
|
231
|
+
{settings?.appearance?.button?.text || '今すぐ寄付'}
|
|
232
|
+
</Button>
|
|
233
|
+
{loading ? (
|
|
234
|
+
<CircularProgress style={{ marginTop: '16px' }} />
|
|
235
|
+
) : (
|
|
236
|
+
<ul style={{ listStyle: 'none', padding: 0, marginTop: '16px' }}>
|
|
237
|
+
{(supporters.supporters || []).map((supporter) => (
|
|
238
|
+
<li key={supporter.id}>
|
|
239
|
+
<span>{supporter.customer?.name}</span>
|
|
240
|
+
</li>
|
|
241
|
+
))}
|
|
242
|
+
</ul>
|
|
243
|
+
)}
|
|
244
|
+
</div>
|
|
245
|
+
)}
|
|
246
|
+
</CheckoutDonate>
|
|
247
|
+
</DonateProvider>
|
|
248
|
+
</PaymentProvider>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
`children`関数は、以下の引数を受け取ります:
|
|
254
|
+
|
|
255
|
+
- `openDonate`:手動で寄付ダイアログをトリガーする関数。
|
|
256
|
+
- `totalAmount`:寄付された総額のフォーマット済み文字列(例:`"125.00 T"`)。
|
|
257
|
+
- `supporters`:`supporters`配列と通貨情報を含む`DonateHistory`オブジェクト。
|
|
258
|
+
- `loading`:支援者データが取得中かどうかを示すブール値。
|
|
259
|
+
- `settings`:`DonateProvider`とpropsからマージされた、解決済みの寄付設定。
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# CheckoutDonate
|
|
2
|
+
|
|
3
|
+
`CheckoutDonate` 元件提供了一個彈性且易於整合的解決方案,可為您的應用程式增加捐贈功能。它支援多種顯示模式,從開啟結帳對話方塊的簡單按鈕到由您完全控制的自訂 UI。
|
|
4
|
+
|
|
5
|
+
此元件必須同時被 `PaymentProvider` 和 `DonateProvider` 包裹才能正常運作。`DonateProvider` 負責管理應用程式特定範圍內捐贈實例的設定和狀態。
|
|
6
|
+
|
|
7
|
+
## 運作方式
|
|
8
|
+
|
|
9
|
+
捐贈流程由 `DonateProvider` 和 `CheckoutDonate` 共同協調。以下是高層次的概述:
|
|
10
|
+
|
|
11
|
+
```d2 How It Works icon=graph-ql:diagram
|
|
12
|
+
direction: down
|
|
13
|
+
|
|
14
|
+
user: {
|
|
15
|
+
shape: c4-person
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
app: {
|
|
19
|
+
label: "您的 React 應用程式"
|
|
20
|
+
|
|
21
|
+
checkout-donate: {
|
|
22
|
+
label: "CheckoutDonate"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
checkout-form: {
|
|
26
|
+
label: "CheckoutForm (在對話方塊中)"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
payment-api: {
|
|
31
|
+
label: "支付後端 API"
|
|
32
|
+
shape: cylinder
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# 初始載入
|
|
36
|
+
app.checkout-donate -> payment-api: "獲取設定和支持者"
|
|
37
|
+
|
|
38
|
+
# 捐贈流程
|
|
39
|
+
user -> app.checkout-donate: "1. 點擊捐贈"
|
|
40
|
+
app.checkout-donate -> app.checkout-form: "2. 開啟帶有 CheckoutForm 的對話方塊"
|
|
41
|
+
app.checkout-form -> payment-api: "3. 處理支付"
|
|
42
|
+
payment-api -> app.checkout-form: "4. 回傳成功"
|
|
43
|
+
app.checkout-form -> app.checkout-donate: "5. 觸發 onPaid 回呼"
|
|
44
|
+
app.checkout-donate -> payment-api: "6. 重新獲取支持者列表"
|
|
45
|
+
payment-api -> app.checkout-donate: "7. 回傳更新後的支持者"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
1. **初始化**:`DonateProvider` 從後端獲取並快取捐贈設定(如預設金額、按鈕文字),並透過唯一的 `mountLocation` 進行識別。
|
|
49
|
+
2. **渲染**:`CheckoutDonate` 根據檢索到的設定及其 props 渲染按鈕或自訂 UI。
|
|
50
|
+
3. **互動**:當使用者發起捐贈時,`CheckoutDonate` 會開啟一個包含為該捐贈預先設定好的 `CheckoutForm` 的對話方塊。
|
|
51
|
+
4. **支付**:使用者透過 `CheckoutForm` 完成支付。
|
|
52
|
+
5. **確認**:成功支付後,會觸發 `onPaid` 回呼,且元件會自動刷新支持者列表。
|
|
53
|
+
|
|
54
|
+
## Provider 設定
|
|
55
|
+
|
|
56
|
+
在使用 `CheckoutDonate` 之前,您必須用 `PaymentProvider` 和 `DonateProvider` 包裹您的元件樹。
|
|
57
|
+
|
|
58
|
+
```tsx Provider Setup Example icon=logos:react
|
|
59
|
+
import {
|
|
60
|
+
PaymentProvider,
|
|
61
|
+
DonateProvider,
|
|
62
|
+
CheckoutDonate,
|
|
63
|
+
} from '@blocklet/payment-react';
|
|
64
|
+
import { useSessionContext } from '../hooks/session-context'; // 您的 session context hook
|
|
65
|
+
|
|
66
|
+
function DonationPage() {
|
|
67
|
+
const { session, connect } = useSessionContext();
|
|
68
|
+
|
|
69
|
+
// 確保在渲染 provider 之前載入 session
|
|
70
|
+
if (!session) {
|
|
71
|
+
return <div>Loading...</div>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<PaymentProvider session={session} connect={connect}>
|
|
76
|
+
<DonateProvider
|
|
77
|
+
mountLocation="unique-page-identifier" // 此捐贈情境的唯一金鑰
|
|
78
|
+
description="給我很棒的部落格文章的捐贈"
|
|
79
|
+
defaultSettings={{
|
|
80
|
+
btnText: '支持我',
|
|
81
|
+
}}>
|
|
82
|
+
{/* 您的 CheckoutDonate 元件放在這裡 */}
|
|
83
|
+
<CheckoutDonate
|
|
84
|
+
settings={{
|
|
85
|
+
target: "post-123",
|
|
86
|
+
title: "支持作者",
|
|
87
|
+
description: "如果您覺得這篇文章有幫助,歡迎請我喝杯咖啡",
|
|
88
|
+
reference: "https://your-site.com/posts/123",
|
|
89
|
+
beneficiaries: [
|
|
90
|
+
{
|
|
91
|
+
address: "z2qa...",
|
|
92
|
+
share: "100",
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
}}
|
|
96
|
+
/>
|
|
97
|
+
</DonateProvider>
|
|
98
|
+
</PaymentProvider>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
更多詳情,請參閱 [`DonateProvider`](./providers-donate-provider.md) 文件。
|
|
104
|
+
|
|
105
|
+
## 元件 Props
|
|
106
|
+
|
|
107
|
+
### `DonateProps`
|
|
108
|
+
|
|
109
|
+
| Prop | Type | Description |
|
|
110
|
+
| --- | --- | --- |
|
|
111
|
+
| `settings` | `CheckoutDonateSettings` | **必填。** 此特定捐贈實例的設定。 |
|
|
112
|
+
| `onPaid` | `(session) => void` | 選填。成功支付後執行的回呼函式。 |
|
|
113
|
+
| `onError` | `(error) => void` | 選填。發生錯誤時執行的回呼函式。 |
|
|
114
|
+
| `mode` | `'default' \| 'inline' \| 'custom'` | 選填。渲染模式。預設為 `'default'`。 |
|
|
115
|
+
| `livemode` | `boolean` | 選填。覆寫來自 `PaymentProvider` 的 `livemode`。 |
|
|
116
|
+
| `timeout` | `number` | 選填。支付後關閉對話方塊前等待的毫秒數。預設為 `5000`。 |
|
|
117
|
+
| `theme` | `'default' \| 'inherit' \| object` | 選填。主題自訂選項。請參閱 [主題設定](./guides-theming.md) 指南。 |
|
|
118
|
+
| `children` | `(openDialog, donateTotalAmount, supporters, loading, donateSettings) => React.ReactNode` | 選填。僅在 `mode="custom"` 時使用的 render prop 函式。 |
|
|
119
|
+
|
|
120
|
+
### `CheckoutDonateSettings`
|
|
121
|
+
|
|
122
|
+
此物件被傳遞給 `settings` prop,並定義了捐贈的核心細節。
|
|
123
|
+
|
|
124
|
+
| Property | Type | Description |
|
|
125
|
+
| --- | --- | --- |
|
|
126
|
+
| `target` | `string` | **必填。** 捐贈目標的唯一識別碼(例如,文章 ID、專案名稱)。 |
|
|
127
|
+
| `title` | `string` | **必填。** 顯示在捐贈對話方塊頂部的標題。 |
|
|
128
|
+
| `description` | `string` | **必填。** 顯示在捐贈對話方塊中的簡短描述。 |
|
|
129
|
+
| `reference` | `string` | **必填。** 與捐贈相關的 URL,用於參考。 |
|
|
130
|
+
| `beneficiaries` | `PaymentBeneficiary[]` | **必填。** 一個物件陣列,定義資金接收者。每個物件都需要 `address`(收款人的 DID)和 `share`(百分比)。 |
|
|
131
|
+
| `amount` | `object` | 選填。設定捐贈金額,包括 `presets`(例如 `['1', '5', '10']`)、預設的 `preset`、`minimum`、`maximum` 以及是否允許 `custom` 金額。 |
|
|
132
|
+
| `appearance` | `object` | 選填。自訂外觀和風格,包括 `button`(文字、圖示、樣式)和 `history` 顯示(`'avatar'` 或 `'table'`)。 |
|
|
133
|
+
|
|
134
|
+
## 使用範例
|
|
135
|
+
|
|
136
|
+
### 預設模式
|
|
137
|
+
|
|
138
|
+
這是使用 `CheckoutDonate` 最簡單的方式。它會渲染一個按鈕,該按鈕會開啟一個捐贈對話方塊,並附上近期支持者的摘要。
|
|
139
|
+
|
|
140
|
+
```tsx Default Donation Button icon=logos:react
|
|
141
|
+
import {
|
|
142
|
+
PaymentProvider,
|
|
143
|
+
DonateProvider,
|
|
144
|
+
CheckoutDonate,
|
|
145
|
+
} from '@blocklet/payment-react';
|
|
146
|
+
import { useSessionContext } from '../hooks/session-context';
|
|
147
|
+
|
|
148
|
+
function App() {
|
|
149
|
+
const { session, connect } = useSessionContext();
|
|
150
|
+
|
|
151
|
+
if (!session) {
|
|
152
|
+
return <div>Loading session...</div>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return (
|
|
156
|
+
<PaymentProvider session={session} connect={connect}>
|
|
157
|
+
<DonateProvider
|
|
158
|
+
mountLocation="blog-post-123"
|
|
159
|
+
description="給部落格文章 123 的捐贈"
|
|
160
|
+
defaultSettings={{
|
|
161
|
+
btnText: '請我喝杯咖啡',
|
|
162
|
+
historyType: 'avatar',
|
|
163
|
+
}}>
|
|
164
|
+
<CheckoutDonate
|
|
165
|
+
settings={{
|
|
166
|
+
target: 'post-123',
|
|
167
|
+
title: '支持作者',
|
|
168
|
+
description: '如果您覺得這篇文章有幫助,請考慮小額捐款。',
|
|
169
|
+
reference: 'https://example.com/posts/123',
|
|
170
|
+
beneficiaries: [
|
|
171
|
+
{
|
|
172
|
+
address: 'z2qa...gCLd', // 作者的 DID 地址
|
|
173
|
+
share: '100',
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
}}
|
|
177
|
+
onPaid={() => {
|
|
178
|
+
console.log('捐贈成功!');
|
|
179
|
+
}}
|
|
180
|
+
/>
|
|
181
|
+
</DonateProvider>
|
|
182
|
+
</PaymentProvider>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 自訂 UI 模式
|
|
188
|
+
|
|
189
|
+
若要完全控制使用者介面,請使用 `mode="custom"` 並提供一個 render prop 作為 `children`。此函式讓您能存取捐贈狀態,包括募集的總金額和支持者列表,從而讓您能夠建立完全自訂的顯示方式。
|
|
190
|
+
|
|
191
|
+
```tsx Custom Donation UI icon=logos:react
|
|
192
|
+
import {
|
|
193
|
+
PaymentProvider,
|
|
194
|
+
DonateProvider,
|
|
195
|
+
CheckoutDonate,
|
|
196
|
+
} from '@blocklet/payment-react';
|
|
197
|
+
import { useSessionContext } from '../hooks/session-context';
|
|
198
|
+
import { CircularProgress, Button } from '@mui/material';
|
|
199
|
+
|
|
200
|
+
function CustomDonationDisplay() {
|
|
201
|
+
const { session, connect } = useSessionContext();
|
|
202
|
+
|
|
203
|
+
if (!session) {
|
|
204
|
+
return <div>Loading session...</div>;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const donateSettings = {
|
|
208
|
+
target: 'post-123',
|
|
209
|
+
title: '支持作者',
|
|
210
|
+
description: '如果您覺得這篇文章有幫助,請考慮小額捐款。',
|
|
211
|
+
reference: 'https://example.com/posts/123',
|
|
212
|
+
beneficiaries: [
|
|
213
|
+
{
|
|
214
|
+
address: 'z2qa...gCLd', // 作者的 DID 地址
|
|
215
|
+
share: '100',
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<PaymentProvider session={session} connect={connect}>
|
|
222
|
+
<DonateProvider
|
|
223
|
+
mountLocation="blog-post-123"
|
|
224
|
+
description="給部落格文章 123 的捐贈">
|
|
225
|
+
<CheckoutDonate mode="custom" settings={donateSettings}>
|
|
226
|
+
{(openDonate, totalAmount, supporters, loading, settings) => (
|
|
227
|
+
<div style={{ border: '1px solid #ccc', padding: '16px', borderRadius: '8px' }}>
|
|
228
|
+
<h2>我們的支持者</h2>
|
|
229
|
+
<p>總捐贈金額:<strong>{totalAmount}</strong></p>
|
|
230
|
+
<Button variant="contained" onClick={openDonate}>
|
|
231
|
+
{settings?.appearance?.button?.text || '立即捐贈'}
|
|
232
|
+
</Button>
|
|
233
|
+
{loading ? (
|
|
234
|
+
<CircularProgress style={{ marginTop: '16px' }} />
|
|
235
|
+
) : (
|
|
236
|
+
<ul style={{ listStyle: 'none', padding: 0, marginTop: '16px' }}>
|
|
237
|
+
{(supporters.supporters || []).map((supporter) => (
|
|
238
|
+
<li key={supporter.id}>
|
|
239
|
+
<span>{supporter.customer?.name}</span>
|
|
240
|
+
</li>
|
|
241
|
+
))}
|
|
242
|
+
</ul>
|
|
243
|
+
)}
|
|
244
|
+
</div>
|
|
245
|
+
)}
|
|
246
|
+
</CheckoutDonate>
|
|
247
|
+
</DonateProvider>
|
|
248
|
+
</PaymentProvider>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
`children` 函式會收到以下參數:
|
|
254
|
+
|
|
255
|
+
- `openDonate`:一個手動觸發捐贈對話方塊的函式。
|
|
256
|
+
- `totalAmount`:已捐贈總金額的格式化字串(例如 `"125.00 T"`)。
|
|
257
|
+
- `supporters`:一個 `DonateHistory` 物件,包含 `supporters` 陣列和貨幣資訊。
|
|
258
|
+
- `loading`:一個布林值,表示是否正在獲取支持者資料。
|
|
259
|
+
- `settings`:已解析的捐贈設定,由 `DonateProvider` 和 props 合併而成。
|