@blocklet/payment-react
Version:
Reusable react components for payment kit v2
109 lines (87 loc) • 5.5 kB
Markdown
# PaymentSummary
`PaymentSummary` 元件是任何結帳流程中至關重要的 UI 元素。它提供了訂單的詳細明細,包括所有訂單項目、試用期資訊、質押要求以及最終總金額。它的設計具有響應性,並能適應行動裝置的佈局。
這個元件與 `ProductItem` 和 `ProductDonation` 協同工作,以呈現購物車中的每個項目,並處理使用者互動,例如應用交叉銷售或更改數量。
## Props
`PaymentSummary` 元件接受以下 props 以自訂其行為和顯示:
| Prop | Type | Required | Description |
| --- | --- | --- | --- |
| `items` | `TLineItemExpanded[]` | 是 | 要在摘要中顯示的訂單項目陣列。 |
| `currency` | `TPaymentCurrency` | 是 | 用於格式化金額的貨幣物件。 |
| `trialInDays` | `number` | 是 | 循環訂閱的試用天數。 |
| `billingThreshold` | `number` | 是 | 帳單門檻金額。如果適用,用於質押計算。 |
| `trialEnd` | `number` | 否 | 試用結束時的 Unix 時間戳。會覆寫 `trialInDays`。 |
| `showStaking` | `boolean` | 否 | 若為 `true`,則顯示質押詳細資訊。預設為 `false`。 |
| `onUpsell` | `(from: string, to: string) => void` | 否 | 當使用者接受追加銷售優惠時的回呼函式。 |
| `onDownsell` | `(from: string) => void` | 否 | 當使用者還原追加銷售優惠時的回呼函式。 |
| `onQuantityChange` | `(itemId: string, quantity: number) => void` | 否 | 當項目數量變更時的回呼函式。 |
| `onChangeAmount` | `(itemId: string, amount: string) => void` | 否 | 用於更改自訂金額項目(如捐贈)金額的回呼。 |
| `onApplyCrossSell` | `(crossSellId: string) => void` | 否 | 當使用者新增交叉銷售項目時的回呼函式。 |
| `onCancelCrossSell` | `() => void` | 否 | 當使用者移除交叉銷售項目時的回呼函式。 |
| `checkoutSessionId` | `string` | 否 | 結帳會話的 ID,用於獲取潛在的交叉銷售項目。 |
| `crossSellBehavior` | `string` | 否 | 定義交叉銷售項目的行為(例如:`'required'`)。 |
| `donationSettings` | `DonationSettings` | 否 | 捐贈項目的設定。 |
| `action` | `string` | 否 | 摘要區塊的自訂標題,取代「訂單摘要」。 |
| `completed` | `boolean` | 否 | 若為 `true`,則停用數量調整等互動元素。預設為 `false`。 |
## 用法
`PaymentSummary` 元件應放置在 `PaymentProvider` 內,通常作為更大型結帳表單的一部分使用。您需要為其提供訂單項目和貨幣資訊。
這是一個如何整合 `PaymentSummary` 元件的基本範例。
```tsx PaymentSummary Example icon=lucide:shopping-cart
import React from 'react';
import { PaymentProvider, PaymentSummary } from '@blocklet/payment-react';
import { useSessionContext } from '../hooks/session-context'; // 您的 session context hook
// 用於示範的模擬資料
const mockCurrency = {
id: 'usd_4573516104843264',
symbol: '$',
name: 'USD',
decimal: 2,
isDefault: true,
};
const mockItems = [
{
id: 'li_1',
price_id: 'price_1',
quantity: 1,
adjustable_quantity: { enabled: true, minimum: 1, maximum: 10 },
price: {
id: 'price_1',
type: 'recurring',
recurring: { interval: 'month', interval_count: 1, usage_type: 'licensed' },
unit_amount: '2000',
product: {
name: 'Pro Plan',
images: [],
},
},
},
];
export default function MyCheckoutPage() {
const { session, connectApi } = useSessionContext();
const handleQuantityChange = (itemId, newQuantity) => {
console.log(`Item ${itemId} quantity changed to ${newQuantity}`);
// 在這裡您通常會更新您的狀態並重新獲取結帳資訊
};
return (
<PaymentProvider session={session} connectApi={connectApi}>
<PaymentSummary
items={mockItems}
currency={mockCurrency}
trialInDays={14}
billingThreshold={0}
showStaking={true}
onQuantityChange={handleQuantityChange}
/>
</PaymentProvider>
);
}
```
### 顯示質押與總計
如果 `showStaking` 設定為 `true`,該元件將計算並顯示循環項目所需的質押金額。它會將立即支付的金額與質押所需的金額分開,為使用者提供清晰的財務摘要。最終總額是這些金額的總和。
### 處理試用期
該元件會向使用者清楚地傳達試用期資訊。透過傳遞 `trialInDays` 或 `trialEnd`,總額下方將顯示類似「之後每月 $20.00」的訊息,告知使用者試用結束後的循環收費。
### 互動功能
- **數量調整**:如果某個項目的 `adjustable_quantity.enabled` 設定為 `true`,`PaymentSummary`(透過其子元件 `ProductItem`)將呈現增加或減少數量的控制項。修改時會觸發 `onQuantityChange` 回呼。
- **追加銷售/降級銷售**:對於具有追加銷售設定的產品,會呈現一個開關,讓使用者升級其方案。`onUpsell` 和 `onDownsell` 回呼會處理這些操作。
- **交叉銷售**:如果提供了 `checkoutSessionId`,該元件可以獲取並顯示建議的交叉銷售項目。新增或移除這些項目的按鈕會觸發 `onApplyCrossSell` 和 `onCancelCrossSell` 回呼。
### 行動裝置響應式設計
在行動裝置上,產品列表預設是可折疊的,以節省空間,特別是對於包含許多項目的訂單。使用者可以點擊以展開或折疊列表,在較小的螢幕上提供更簡潔、更友善的使用者體驗。