@blocklet/payment-react 1.20.16 → 1.20.18

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,91 @@
1
+ # 表单元素
2
+
3
+ `@blocklet/payment-react` 库提供了一系列精细的输入组件,旨在简化自定义支付和联系信息表单的创建。这些元素在构建时充分考虑了验证和用户体验,能够与 `react-hook-form` 顺畅集成,为数据收集提供了一个强大而灵活的解决方案。
4
+
5
+ 每个组件都被设计为一个独立的单元,让你可以将它们组合成满足你特定需求的复杂表单。以下是可用的表单元素概览。
6
+
7
+ <x-cards data-columns="2">
8
+ <x-card data-title="AddressForm" data-icon="lucide:map-pin" data-href="/components/ui/form-elements/address-form">
9
+ 一个预构建的表单,用于收集账单地址详情,并带有特定国家/地区的验证功能。
10
+ </x-card>
11
+ <x-card data-title="PhoneInput" data-icon="lucide:phone" data-href="/components/ui/form-elements/phone-input">
12
+ 一个国际电话号码输入框,集成了国家/地区代码选择器和验证功能。
13
+ </x-card>
14
+ <x-card data-title="CountrySelect" data-icon="lucide:globe" data-href="/components/ui/form-elements/country-select">
15
+ 一个可搜索的下拉菜单,用于选择国家/地区,配有国旗和移动端友好的用户界面。
16
+ </x-card>
17
+ <x-card data-title="CurrencySelector" data-icon="lucide:coins" data-href="/components/ui/form-elements/currency-selector">
18
+ 一个允许用户从可用选项中选择其偏好支付货币的组件。
19
+ </x-card>
20
+ </x-cards>
21
+
22
+ ## 通用使用模式
23
+
24
+ 这些表单元素旨在与 `react-hook-form` 的 `FormProvider` 一起使用。你可以组合它们来构建全面的表单,以捕获交易所需的所有必要信息。虽然每个组件都有其自己的一套属性,但它们共享一个通用的集成模式。
25
+
26
+ 下面是一个基本示例,展示了如何组合多个表单元素来创建一个用户信息表单:
27
+
28
+ ```jsx MyCustomForm.tsx icon=logos:react
29
+ import { FormProvider, useForm } from 'react-hook-form';
30
+ import { AddressForm, PhoneInput, CurrencySelector } from '@blocklet/payment-react';
31
+ import { Button, Stack } from '@mui/material';
32
+
33
+ // 假设 `availableCurrencies` 是从你的后端获取的
34
+ const availableCurrencies = [
35
+ {
36
+ id: 'usd_xxx',
37
+ name: 'USD',
38
+ symbol: 'USD',
39
+ logo: 'url/to/usd_logo.png',
40
+ method: { id: 'stripe', name: 'Stripe' },
41
+ },
42
+ // ... 其他货币
43
+ ];
44
+
45
+ function MyCustomForm() {
46
+ const methods = useForm({
47
+ defaultValues: {
48
+ currency: 'usd_xxx',
49
+ phone_number: '',
50
+ billing_address: {
51
+ line1: '',
52
+ city: '',
53
+ state: '',
54
+ postal_code: '',
55
+ country: 'US', // 使用 ISO2 代码
56
+ },
57
+ },
58
+ });
59
+
60
+ const onSubmit = (data) => {
61
+ console.log('表单数据已提交:', data);
62
+ };
63
+
64
+ return (
65
+ <FormProvider {...methods}>
66
+ <form onSubmit={methods.handleSubmit(onSubmit)}>
67
+ <Stack spacing={2}>
68
+ <CurrencySelector
69
+ value={methods.watch('currency')}
70
+ currencies={availableCurrencies}
71
+ onChange={(currencyId) => methods.setValue('currency', currencyId)}
72
+ />
73
+ <PhoneInput name="phone_number" label="Phone Number" required />
74
+ <AddressForm mode="required" stripe={false} />
75
+ <Button type="submit" variant="contained">
76
+ Submit
77
+ </Button>
78
+ </Stack>
79
+ </form>
80
+ </FormProvider>
81
+ );
82
+ }
83
+ ```
84
+
85
+ 在此示例中,`CurrencySelector`、`PhoneInput` 和 `AddressForm` 组合在同一个表单中。`CurrencySelector` 用作与表单状态绑定的受控组件,而 `PhoneInput` 和 `AddressForm` 是非受控组件,它们会自动将其字段和验证规则注册到 `react-hook-form` 的上下文中。
86
+
87
+ ## 后续步骤
88
+
89
+ 要了解每个组件的具体属性和实现细节,请浏览它们各自的文档页面。
90
+
91
+ 从 [AddressForm](./components-ui-form-elements-address-form.md) 开始,了解如何收集账单信息。
@@ -0,0 +1,109 @@
1
+ # PaymentSummary
2
+
3
+ `PaymentSummary`コンポーネントは、あらゆるチェックアウトプロセスにとって重要なUI要素です。すべての品目、トライアル期間情報、ステーキング要件、および最終的な合計金額を含む、注文の詳細な内訳を提供します。レスポンシブデザインになっており、モバイルデバイス向けにレイアウトを調整します。
4
+
5
+ このコンポーネントは`ProductItem`および`ProductDonation`と連携してカート内の各アイテムをレンダリングし、クロスセルの適用や数量の変更などのユーザーインタラクションを処理します。
6
+
7
+ ## Props
8
+
9
+ `PaymentSummary`コンポーネントは、その動作と表示をカスタマイズするために以下のプロパティを受け入れます:
10
+
11
+ | Prop | Type | Required | Description |
12
+ | --- | --- | --- | --- |
13
+ | `items` | `TLineItemExpanded[]` | はい | サマリーに表示される品目の配列。 |
14
+ | `currency` | `TPaymentCurrency` | はい | 金額をフォーマットするための通貨オブジェクト。 |
15
+ | `trialInDays` | `number` | はい | 定期的なサブスクリプションのトライアル日数。 |
16
+ | `billingThreshold` | `number` | はい | 請求しきい値金額。該当する場合、ステーキング計算で使用されます。 |
17
+ | `trialEnd` | `number` | いいえ | トライアルが終了するUnixタイムスタンプ。`trialInDays`を上書きします。 |
18
+ | `showStaking` | `boolean` | いいえ | `true`の場合、ステーキングの詳細を表示します。デフォルトは`false`です。 |
19
+ | `onUpsell` | `(from: string, to: string) => void` | いいえ | ユーザーがアップセルオファーを受け入れたときのコールバック関数。 |
20
+ | `onDownsell` | `(from: string) => void` | いいえ | ユーザーがアップセルオファーを元に戻したときのコールバック関数。 |
21
+ | `onQuantityChange` | `(itemId: string, quantity: number) => void` | いいえ | アイテムの数量が変更されたときのコールバック関数。 |
22
+ | `onChangeAmount` | `(itemId: string, amount: string) => void` | いいえ | 寄付のようなカスタム金額アイテムの金額を変更するためのコールバック。 |
23
+ | `onApplyCrossSell` | `(crossSellId: string) => void` | いいえ | ユーザーがクロスセルアイテムを追加したときのコールバック関数。 |
24
+ | `onCancelCrossSell` | `() => void` | いいえ | ユーザーがクロスセルアイテムを削除したときのコールバック関数。 |
25
+ | `checkoutSessionId` | `string` | いいえ | チェックアウトセッションのID。潜在的なクロスセルアイテムを取得するために使用されます。 |
26
+ | `crossSellBehavior` | `string` | いいえ | クロスセルアイテムの動作を定義します(例:`'required'`)。 |
27
+ | `donationSettings` | `DonationSettings` | いいえ | 寄付アイテムの設定。 |
28
+ | `action` | `string` | いいえ | "Order Summary"を置き換える、サマリーセクションのカスタムタイトル。 |
29
+ | `completed` | `boolean` | いいえ | `true`の場合、数量調整などのインタラクティブな要素を無効にします。デフォルトは`false`です。 |
30
+
31
+ ## Usage
32
+
33
+ `PaymentSummary`コンポーネントは`PaymentProvider`内に配置する必要があり、通常はより大きなチェックアウトフォームの一部として使用されます。品目と通貨情報を提供する必要があります。
34
+
35
+ 以下に`PaymentSummary`コンポーネントを統合する方法の基本的な例を示します。
36
+
37
+ ```tsx PaymentSummary Example icon=lucide:shopping-cart
38
+ import React from 'react';
39
+ import { PaymentProvider, PaymentSummary } from '@blocklet/payment-react';
40
+ import { useSessionContext } from '../hooks/session-context'; // セッションコンテキストのフック
41
+
42
+ // デモ用のモックデータ
43
+ const mockCurrency = {
44
+ id: 'usd_4573516104843264',
45
+ symbol: '$',
46
+ name: 'USD',
47
+ decimal: 2,
48
+ isDefault: true,
49
+ };
50
+
51
+ const mockItems = [
52
+ {
53
+ id: 'li_1',
54
+ price_id: 'price_1',
55
+ quantity: 1,
56
+ adjustable_quantity: { enabled: true, minimum: 1, maximum: 10 },
57
+ price: {
58
+ id: 'price_1',
59
+ type: 'recurring',
60
+ recurring: { interval: 'month', interval_count: 1, usage_type: 'licensed' },
61
+ unit_amount: '2000',
62
+ product: {
63
+ name: 'Pro Plan',
64
+ images: [],
65
+ },
66
+ },
67
+ },
68
+ ];
69
+
70
+ export default function MyCheckoutPage() {
71
+ const { session, connectApi } = useSessionContext();
72
+
73
+ const handleQuantityChange = (itemId, newQuantity) => {
74
+ console.log(`Item ${itemId} quantity changed to ${newQuantity}`);
75
+ // ここで通常、状態を更新してチェックアウト情報を再取得します
76
+ };
77
+
78
+ return (
79
+ <PaymentProvider session={session} connectApi={connectApi}>
80
+ <PaymentSummary
81
+ items={mockItems}
82
+ currency={mockCurrency}
83
+ trialInDays={14}
84
+ billingThreshold={0}
85
+ showStaking={true}
86
+ onQuantityChange={handleQuantityChange}
87
+ />
88
+ </PaymentProvider>
89
+ );
90
+ }
91
+ ```
92
+
93
+ ### ステーキングと合計の表示
94
+
95
+ `showStaking`が`true`に設定されている場合、コンポーネントは定期的なアイテムに必要なステーキング金額を計算して表示します。即時支払いの金額とステーキングに必要な金額を分離し、ユーザーに明確な財務概要を提供します。最終的な合計はこれらの金額を組み合わせたものです。
96
+
97
+ ### トライアル期間の処理
98
+
99
+ コンポーネントはトライアル期間をユーザーに明確に伝えます。`trialInDays`または`trialEnd`を渡すことで、「その後 $20.00 / 月」のようなメッセージが合計の下に表示され、トライアル終了後の定期的な請求についてユーザーに通知します。
100
+
101
+ ### インタラクティブ機能
102
+
103
+ - **数量調整**: アイテムの`adjustable_quantity.enabled`が`true`に設定されている場合、`PaymentSummary`(その子コンポーネント`ProductItem`を介して)は数量を増減させるためのコントロールをレンダリングします。変更時に`onQuantityChange`コールバックがトリガーされます。
104
+ - **アップセル/ダウンセル**: アップセル設定のある製品の場合、ユーザーがプランをアップグレードできるようにスイッチがレンダリングされます。`onUpsell`および`onDownsell`コールバックがこれらのアクションを処理します。
105
+ - **クロスセル**: `checkoutSessionId`が提供されている場合、コンポーネントは推奨されるクロスセルアイテムを取得して表示できます。これらのアイテムを追加または削除するボタンは、`onApplyCrossSell`および`onCancelCrossSell`コールバックをトリガーします。
106
+
107
+ ### モバイルレスポンシブ
108
+
109
+ モバイルデバイスでは、特に多くのアイテムがある注文の場合、スペースを節約するために製品リストはデフォルトで折りたたみ可能です。ユーザーはタップしてリストを展開または折りたたむことができ、小さな画面でよりクリーンでユーザーフレンドリーな体験を提供します。
@@ -0,0 +1,109 @@
1
+ # PaymentSummary
2
+
3
+ `PaymentSummary` 元件是任何結帳流程中至關重要的 UI 元素。它提供了訂單的詳細明細,包括所有訂單項目、試用期資訊、質押要求以及最終總金額。它的設計具有響應性,並能適應行動裝置的佈局。
4
+
5
+ 這個元件與 `ProductItem` 和 `ProductDonation` 協同工作,以呈現購物車中的每個項目,並處理使用者互動,例如應用交叉銷售或更改數量。
6
+
7
+ ## Props
8
+
9
+ `PaymentSummary` 元件接受以下 props 以自訂其行為和顯示:
10
+
11
+ | Prop | Type | Required | Description |
12
+ | --- | --- | --- | --- |
13
+ | `items` | `TLineItemExpanded[]` | 是 | 要在摘要中顯示的訂單項目陣列。 |
14
+ | `currency` | `TPaymentCurrency` | 是 | 用於格式化金額的貨幣物件。 |
15
+ | `trialInDays` | `number` | 是 | 循環訂閱的試用天數。 |
16
+ | `billingThreshold` | `number` | 是 | 帳單門檻金額。如果適用,用於質押計算。 |
17
+ | `trialEnd` | `number` | 否 | 試用結束時的 Unix 時間戳。會覆寫 `trialInDays`。 |
18
+ | `showStaking` | `boolean` | 否 | 若為 `true`,則顯示質押詳細資訊。預設為 `false`。 |
19
+ | `onUpsell` | `(from: string, to: string) => void` | 否 | 當使用者接受追加銷售優惠時的回呼函式。 |
20
+ | `onDownsell` | `(from: string) => void` | 否 | 當使用者還原追加銷售優惠時的回呼函式。 |
21
+ | `onQuantityChange` | `(itemId: string, quantity: number) => void` | 否 | 當項目數量變更時的回呼函式。 |
22
+ | `onChangeAmount` | `(itemId: string, amount: string) => void` | 否 | 用於更改自訂金額項目(如捐贈)金額的回呼。 |
23
+ | `onApplyCrossSell` | `(crossSellId: string) => void` | 否 | 當使用者新增交叉銷售項目時的回呼函式。 |
24
+ | `onCancelCrossSell` | `() => void` | 否 | 當使用者移除交叉銷售項目時的回呼函式。 |
25
+ | `checkoutSessionId` | `string` | 否 | 結帳會話的 ID,用於獲取潛在的交叉銷售項目。 |
26
+ | `crossSellBehavior` | `string` | 否 | 定義交叉銷售項目的行為(例如:`'required'`)。 |
27
+ | `donationSettings` | `DonationSettings` | 否 | 捐贈項目的設定。 |
28
+ | `action` | `string` | 否 | 摘要區塊的自訂標題,取代「訂單摘要」。 |
29
+ | `completed` | `boolean` | 否 | 若為 `true`,則停用數量調整等互動元素。預設為 `false`。 |
30
+
31
+ ## 用法
32
+
33
+ `PaymentSummary` 元件應放置在 `PaymentProvider` 內,通常作為更大型結帳表單的一部分使用。您需要為其提供訂單項目和貨幣資訊。
34
+
35
+ 這是一個如何整合 `PaymentSummary` 元件的基本範例。
36
+
37
+ ```tsx PaymentSummary Example icon=lucide:shopping-cart
38
+ import React from 'react';
39
+ import { PaymentProvider, PaymentSummary } from '@blocklet/payment-react';
40
+ import { useSessionContext } from '../hooks/session-context'; // 您的 session context hook
41
+
42
+ // 用於示範的模擬資料
43
+ const mockCurrency = {
44
+ id: 'usd_4573516104843264',
45
+ symbol: '$',
46
+ name: 'USD',
47
+ decimal: 2,
48
+ isDefault: true,
49
+ };
50
+
51
+ const mockItems = [
52
+ {
53
+ id: 'li_1',
54
+ price_id: 'price_1',
55
+ quantity: 1,
56
+ adjustable_quantity: { enabled: true, minimum: 1, maximum: 10 },
57
+ price: {
58
+ id: 'price_1',
59
+ type: 'recurring',
60
+ recurring: { interval: 'month', interval_count: 1, usage_type: 'licensed' },
61
+ unit_amount: '2000',
62
+ product: {
63
+ name: 'Pro Plan',
64
+ images: [],
65
+ },
66
+ },
67
+ },
68
+ ];
69
+
70
+ export default function MyCheckoutPage() {
71
+ const { session, connectApi } = useSessionContext();
72
+
73
+ const handleQuantityChange = (itemId, newQuantity) => {
74
+ console.log(`Item ${itemId} quantity changed to ${newQuantity}`);
75
+ // 在這裡您通常會更新您的狀態並重新獲取結帳資訊
76
+ };
77
+
78
+ return (
79
+ <PaymentProvider session={session} connectApi={connectApi}>
80
+ <PaymentSummary
81
+ items={mockItems}
82
+ currency={mockCurrency}
83
+ trialInDays={14}
84
+ billingThreshold={0}
85
+ showStaking={true}
86
+ onQuantityChange={handleQuantityChange}
87
+ />
88
+ </PaymentProvider>
89
+ );
90
+ }
91
+ ```
92
+
93
+ ### 顯示質押與總計
94
+
95
+ 如果 `showStaking` 設定為 `true`,該元件將計算並顯示循環項目所需的質押金額。它會將立即支付的金額與質押所需的金額分開,為使用者提供清晰的財務摘要。最終總額是這些金額的總和。
96
+
97
+ ### 處理試用期
98
+
99
+ 該元件會向使用者清楚地傳達試用期資訊。透過傳遞 `trialInDays` 或 `trialEnd`,總額下方將顯示類似「之後每月 $20.00」的訊息,告知使用者試用結束後的循環收費。
100
+
101
+ ### 互動功能
102
+
103
+ - **數量調整**:如果某個項目的 `adjustable_quantity.enabled` 設定為 `true`,`PaymentSummary`(透過其子元件 `ProductItem`)將呈現增加或減少數量的控制項。修改時會觸發 `onQuantityChange` 回呼。
104
+ - **追加銷售/降級銷售**:對於具有追加銷售設定的產品,會呈現一個開關,讓使用者升級其方案。`onUpsell` 和 `onDownsell` 回呼會處理這些操作。
105
+ - **交叉銷售**:如果提供了 `checkoutSessionId`,該元件可以獲取並顯示建議的交叉銷售項目。新增或移除這些項目的按鈕會觸發 `onApplyCrossSell` 和 `onCancelCrossSell` 回呼。
106
+
107
+ ### 行動裝置響應式設計
108
+
109
+ 在行動裝置上,產品列表預設是可折疊的,以節省空間,特別是對於包含許多項目的訂單。使用者可以點擊以展開或折疊列表,在較小的螢幕上提供更簡潔、更友善的使用者體驗。
@@ -0,0 +1,109 @@
1
+ # PaymentSummary
2
+
3
+ `PaymentSummary` 组件是任何结账流程中至关重要的 UI 元素。它提供了订单的详细分类,包括所有订单项、试用期信息、质押要求和最终总金额。它的设计是响应式的,可以为移动设备调整其布局。
4
+
5
+ 该组件与 `ProductItem` 和 `ProductDonation` 协同工作,以渲染购物车中的每个商品,并处理用户交互,如应用交叉销售或更改数量。
6
+
7
+ ## Props
8
+
9
+ `PaymentSummary` 组件接受以下 props 以自定义其行为和显示:
10
+
11
+ | Prop | Type | Required | Description |
12
+ | --- | --- | --- | --- |
13
+ | `items` | `TLineItemExpanded[]` | 是 | 要在摘要中显示的订单项数组。 |
14
+ | `currency` | `TPaymentCurrency` | 是 | 用于格式化金额的货币对象。 |
15
+ | `trialInDays` | `number` | 是 | 周期性订阅的试用天数。 |
16
+ | `billingThreshold` | `number` | 是 | 计费阈值金额。如果适用,用于质押计算。 |
17
+ | `trialEnd` | `number` | 否 | 试用结束的 Unix 时间戳。会覆盖 `trialInDays`。 |
18
+ | `showStaking` | `boolean` | 否 | 如果为 `true`,则显示质押详情。默认为 `false`。 |
19
+ | `onUpsell` | `(from: string, to: string) => void` | 否 | 用户接受增销提议时的回调函数。 |
20
+ | `onDownsell` | `(from: string) => void` | 否 | 用户恢复增销提议时的回调函数。 |
21
+ | `onQuantityChange` | `(itemId: string, quantity: number) => void` | 否 | 更改商品数量时的回调函数。 |
22
+ | `onChangeAmount` | `(itemId: string, amount: string) => void` | 否 | 用于更改自定义金额项目(如捐赠)金额的回调。 |
23
+ | `onApplyCrossSell` | `(crossSellId: string) => void` | 否 | 用户添加交叉销售商品时的回调函数。 |
24
+ | `onCancelCrossSell` | `() => void` | 否 | 用户移除交叉销售商品时的回调函数。 |
25
+ | `checkoutSessionId` | `string` | 否 | 结账会话的 ID,用于获取潜在的交叉销售商品。 |
26
+ | `crossSellBehavior` | `string` | 否 | 定义交叉销售商品的行为(例如,`'required'`)。 |
27
+ | `donationSettings` | `DonationSettings` | 否 | 捐赠项目的配置。 |
28
+ | `action` | `string` | 否 | 摘要部分的自定义标题,替换“订单摘要”。 |
29
+ | `completed` | `boolean` | 否 | 如果为 `true`,则禁用数量调整等交互式元素。默认为 `false`。 |
30
+
31
+ ## 用法
32
+
33
+ `PaymentSummary` 组件应放置在 `PaymentProvider` 中,并且通常用作更复杂的结账表单的一部分。你需要为其提供订单项和货币信息。
34
+
35
+ 以下是如何集成 `PaymentSummary` 组件的基本示例。
36
+
37
+ ```tsx PaymentSummary Example icon=lucide:shopping-cart
38
+ import React from 'react';
39
+ import { PaymentProvider, PaymentSummary } from '@blocklet/payment-react';
40
+ import { useSessionContext } from '../hooks/session-context'; // 你的会话上下文钩子
41
+
42
+ // 用于演示的模拟数据
43
+ const mockCurrency = {
44
+ id: 'usd_4573516104843264',
45
+ symbol: '$',
46
+ name: 'USD',
47
+ decimal: 2,
48
+ isDefault: true,
49
+ };
50
+
51
+ const mockItems = [
52
+ {
53
+ id: 'li_1',
54
+ price_id: 'price_1',
55
+ quantity: 1,
56
+ adjustable_quantity: { enabled: true, minimum: 1, maximum: 10 },
57
+ price: {
58
+ id: 'price_1',
59
+ type: 'recurring',
60
+ recurring: { interval: 'month', interval_count: 1, usage_type: 'licensed' },
61
+ unit_amount: '2000',
62
+ product: {
63
+ name: 'Pro Plan',
64
+ images: [],
65
+ },
66
+ },
67
+ },
68
+ ];
69
+
70
+ export default function MyCheckoutPage() {
71
+ const { session, connectApi } = useSessionContext();
72
+
73
+ const handleQuantityChange = (itemId, newQuantity) => {
74
+ console.log(`Item ${itemId} quantity changed to ${newQuantity}`);
75
+ // 在这里,你通常会更新你的状态并重新获取结账信息
76
+ };
77
+
78
+ return (
79
+ <PaymentProvider session={session} connectApi={connectApi}>
80
+ <PaymentSummary
81
+ items={mockItems}
82
+ currency={mockCurrency}
83
+ trialInDays={14}
84
+ billingThreshold={0}
85
+ showStaking={true}
86
+ onQuantityChange={handleQuantityChange}
87
+ />
88
+ </PaymentProvider>
89
+ );
90
+ }
91
+ ```
92
+
93
+ ### 显示质押和总计
94
+
95
+ 如果 `showStaking` 设置为 `true`,该组件将计算并显示周期性项目所需的质押金额。它将立即支付的金额与质押所需的金额分开,为用户提供清晰的财务摘要。最终总额是这些金额的总和。
96
+
97
+ ### 处理试用期
98
+
99
+ 该组件向用户清晰地传达试用期信息。通过传递 `trialInDays` 或 `trialEnd`,总额下方将显示类似“然后 $20.00 / 月”的消息,告知用户试用期结束后的周期性费用。
100
+
101
+ ### 交互功能
102
+
103
+ - **数量调整**:如果一个项目的 `adjustable_quantity.enabled` 设置为 `true`,`PaymentSummary`(通过其子组件 `ProductItem`)将渲染用于增加或减少数量的控件。修改时会触发 `onQuantityChange` 回调。
104
+ - **增销/减销**:对于具有增销配置的产品,会渲染一个开关,允许用户升级他们的计划。`onUpsell` 和 `onDownsell` 回调处理这些操作。
105
+ - **交叉销售**:如果提供了 `checkoutSessionId`,该组件可以获取并显示建议的交叉销售商品。添加或移除这些商品的按钮会触发 `onApplyCrossSell` 和 `onCancelCrossSell` 回调。
106
+
107
+ ### 移动端响应式设计
108
+
109
+ 在移动设备上,产品列表默认是可折叠的以节省空间,特别是对于包含许多商品的订单。用户可以点击以展开或折叠列表,从而在较小的屏幕上提供更清晰、更友好的用户体验。
@@ -0,0 +1,140 @@
1
+ # PricingTable
2
+
3
+ `PricingTable` コンポーネントは、サブスクリプションプランと価格オプションを構造化されたレスポンシブなテーブルに表示するために設計された、柔軟な UI 要素です。ユーザーは請求サイクル(例:月次、年次)の切り替え、希望通貨の選択、そしてプランの選択を行って次に進むことができます。
4
+
5
+ このコンポーネントは、価格プランの表示を詳細に制御する必要があるカスタムチェックアウトフローの構築に最適です。チェックアウトプロセス全体を処理する、より統合されたソリューションをお求めの場合は、高レベルの [`CheckoutTable`](./components-checkout-checkout-table.md) コンポーネントの使用を検討してください。
6
+
7
+ ## Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ | --- | --- | --- | --- |
11
+ | `table` | `TPricingTableExpanded` | - | **必須**。価格表データを含むオブジェクトで、アイテム(プラン)のリスト、通貨情報、その他の詳細が含まれます。 |
12
+ | `onSelect` | `(priceId: string, currencyId: string) => void` | - | **必須**。ユーザーがプランのアクションボタンをクリックしたときにトリガーされるコールバック関数です。選択された `priceId` と `currencyId` を受け取ります。 |
13
+ | `alignItems` | `'center' \| 'left'` | `'center'` | テーブルヘッダーのコンテンツ(請求サイクルと通貨セレクター)の水平方向の配置を制御します。 |
14
+ | `mode` | `'checkout' \| 'select'` | `'checkout'` | アクションボタンの動作とテキストを決定します。`'checkout'` モードは支払いを開始するためのもので、`'select'` モードはより大きなフォーム内でプランを選択するためのものです。 |
15
+ | `interval` | `string` | `''` | 最初に選択される請求期間を設定します。フォーマットは通常 `interval-interval_count` です(例:`month-1`、`year-1`)。 |
16
+ | `hideCurrency` | `boolean` | `false` | `true` の場合、複数の通貨が利用可能であっても、通貨セレクターのドロップダウンは非表示になります。 |
17
+
18
+ ## 使用例
19
+
20
+ `PricingTable` を使用するには、`PaymentProvider` でラップする必要があります。このコンポーネントには、製品データを含む `table` オブジェクトと、ユーザーの選択を管理するための `onSelect` ハンドラーが必要です。
21
+
22
+ ```tsx Integration Example icon=lucide:code
23
+ import { PaymentProvider } from '@blocklet/payment-react';
24
+ import { PricingTable } from '@blocklet/payment-react/components/ui';
25
+ import type { TPricingTableExpanded } from '@blocklet/payment-types';
26
+
27
+ // 実際のアプリケーションでは、このデータを支払いサービスから取得します。
28
+ const pricingTableData: TPricingTableExpanded = {
29
+ id: 'pt_123',
30
+ livemode: false,
31
+ currency: { id: 'usd', symbol: '$' },
32
+ items: [
33
+ {
34
+ price_id: 'price_basic_monthly',
35
+ product: {
36
+ name: 'Basic Plan',
37
+ description: 'For individuals and small teams.',
38
+ unit_label: 'user',
39
+ features: [{ name: '5 Projects' }, { name: '10GB Storage' }, { name: 'Basic Support' }],
40
+ },
41
+ price: {
42
+ currency: 'usd',
43
+ unit_amount: '1000', // セント単位
44
+ recurring: { interval: 'month', interval_count: 1 },
45
+ currency_options: [{ currency_id: 'usd', unit_amount: '1000' }],
46
+ },
47
+ is_highlight: false,
48
+ },
49
+ {
50
+ price_id: 'price_pro_monthly',
51
+ product: {
52
+ name: 'Pro Plan',
53
+ description: 'For growing businesses.',
54
+ unit_label: 'user',
55
+ features: [{ name: 'Unlimited Projects' }, { name: '100GB Storage' }, { name: 'Priority Support' }],
56
+ },
57
+ price: {
58
+ currency: 'usd',
59
+ unit_amount: '2500',
60
+ recurring: { interval: 'month', interval_count: 1 },
61
+ currency_options: [{ currency_id: 'usd', unit_amount: '2500' }],
62
+ },
63
+ is_highlight: true,
64
+ highlight_text: 'Popular',
65
+ },
66
+ {
67
+ price_id: 'price_basic_yearly',
68
+ product: {
69
+ name: 'Basic Plan',
70
+ description: 'For individuals and small teams.',
71
+ unit_label: 'user',
72
+ features: [{ name: '5 Projects' }, { name: '10GB Storage' }, { name: 'Basic Support' }],
73
+ },
74
+ price: {
75
+ currency: 'usd',
76
+ unit_amount: '10000',
77
+ recurring: { interval: 'year', interval_count: 1 },
78
+ currency_options: [{ currency_id: 'usd', unit_amount: '10000' }],
79
+ },
80
+ is_highlight: false,
81
+ },
82
+ {
83
+ price_id: 'price_pro_yearly',
84
+ product: {
85
+ name: 'Pro Plan',
86
+ description: 'For growing businesses.',
87
+ unit_label: 'user',
88
+ features: [{ name: 'Unlimited Projects' }, { name: '100GB Storage' }, { name: 'Priority Support' }],
89
+ },
90
+ price: {
91
+ currency: 'usd',
92
+ unit_amount: '25000',
93
+ recurring: { interval: 'year', interval_count: 1 },
94
+ currency_options: [{ currency_id: 'usd', unit_amount: '25000' }],
95
+ },
96
+ is_highlight: true,
97
+ highlight_text: 'Popular',
98
+ },
99
+ ],
100
+ };
101
+
102
+ function MyPricingPage() {
103
+ const { session, connect } = useSessionContext();
104
+
105
+ const handlePlanSelect = async (priceId: string, currencyId: string) => {
106
+ console.log(`Plan selected: ${priceId}, Currency: ${currencyId}`);
107
+ // ここでは、通常チェックアウトページに移動するか、支払いモーダルを開きます。
108
+ // 例:`router.push(\"/checkout?price_id=${priceId}&currency_id=${currencyId}\")`
109
+ alert(`Selected Price ID: ${priceId}`);
110
+ };
111
+
112
+ return (
113
+ <PaymentProvider session={session} connect={connect}>
114
+ <div style={{ maxWidth: 800, margin: 'auto' }}>
115
+ <PricingTable table={pricingTableData} onSelect={handlePlanSelect} />
116
+ </div>
117
+ </PaymentProvider>
118
+ );
119
+ }
120
+
121
+ export default MyPricingPage;
122
+ ```
123
+
124
+ ## 使用シナリオ
125
+
126
+ ### モード:`checkout` vs. `select`
127
+
128
+ `mode` プロップは、さまざまなユースケースに合わせてコールトゥアクションボタンを変更します。
129
+
130
+ - **`mode='checkout'` (デフォルト):** ボタンのテキストはコンテキストに応じて、「Subscribe」や「Start Trial」などのラベルを表示します。このモードは、ユーザーのクリックが直ちに支払いまたはチェックアウトプロセスを開始する場合に使用します。
131
+
132
+ - **`mode='select'`:** ボタンのテキストは「Select」または「Selected」と表示されます。これは、価格表がより大きなフォームや複数ステップのプロセスの一部である場合に便利です。`onSelect` コールバックを使用して、選択されたプランでアプリケーションの状態を更新でき、UI は現在どのプランが選択されているかを視覚的に示します。
133
+
134
+ ### `onSelect` の処理
135
+
136
+ `onSelect` コールバックは、ユーザーインタラクションを処理するための中心的なメカニズムです。これは選択されたプランの `priceId` と `currencyId` を受け取る非同期関数です。アプリケーションのロジックはここに記述します。一般的なアクションは次のとおりです:
137
+
138
+ - 選択したプランをアプリケーションの状態に保存する。
139
+ - ユーザーを専用のチェックアウトページにリダイレクトし、`priceId` を URL パラメータとして渡す。
140
+ - `priceId` を使用して支払いサービスのバックエンドでチェックアウトセッションを作成し、支払いフォームを開く。