@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,67 @@
|
|
|
1
|
+
# 歷史記錄元件
|
|
2
|
+
|
|
3
|
+
`@blocklet/payment-react` 函式庫提供了一套歷史記錄元件,旨在為您的使用者提供清晰詳細的過往活動檢視。這些元件對於建構客戶入口網站、帳戶儀表板和管理介面至關重要,在這些介面中,使用者需要追蹤他們的帳單、付款和點數使用情況。
|
|
4
|
+
|
|
5
|
+
這些元件直接從支付服務中獲取並顯示資料,提供了一種無縫的方式來呈現歷史資訊,而無需從頭開始建構複雜的資料獲取和渲染邏輯。
|
|
6
|
+
|
|
7
|
+
<x-cards data-columns="2">
|
|
8
|
+
<x-card data-title="CustomerInvoiceList" data-icon="lucide:receipt-text" data-href="/components/history/invoice-list">
|
|
9
|
+
渲染客戶的發票列表或表格,包含狀態、金額和建立日期等詳細資訊。
|
|
10
|
+
</x-card>
|
|
11
|
+
<x-card data-title="CustomerPaymentList" data-icon="lucide:credit-card" data-href="/components/history/payment-list">
|
|
12
|
+
顯示客戶的完整付款歷史,包含交易詳情、付款方式和狀態。
|
|
13
|
+
</x-card>
|
|
14
|
+
<x-card data-title="CreditGrantsList" data-icon="lucide:award" data-href="/components/history/credit-grants-list">
|
|
15
|
+
顯示客戶的所有點數授予列表,詳細說明狀態、剩餘金額和生效日期。
|
|
16
|
+
</x-card>
|
|
17
|
+
<x-card data-title="CreditTransactionsList" data-icon="lucide:history" data-href="/components/history/credit-transactions-list">
|
|
18
|
+
列出所有單獨的點數交易,提供隨時間變化的點數使用和調整的詳細日誌。
|
|
19
|
+
</x-card>
|
|
20
|
+
</x-cards>
|
|
21
|
+
|
|
22
|
+
## 常見使用案例
|
|
23
|
+
|
|
24
|
+
一個典型的使用案例是在使用者的帳戶頁面中建立一個「帳務歷史」部分。您可以使用分頁介面在不同的歷史檢視之間切換,例如發票、付款和點數。
|
|
25
|
+
|
|
26
|
+
以下是一個概念性範例,展示了您如何建構這樣一個頁面。
|
|
27
|
+
|
|
28
|
+
```jsx MyBillingPage.tsx icon=lucide:user
|
|
29
|
+
import React from 'react';
|
|
30
|
+
import { CustomerInvoiceList, CustomerPaymentList } from '@blocklet/payment-react';
|
|
31
|
+
|
|
32
|
+
// 假設您已從會話或上下文中獲取了客戶 ID
|
|
33
|
+
const customerId = 'cus_xxxxxxxxxxxxxx';
|
|
34
|
+
|
|
35
|
+
export default function MyBillingPage() {
|
|
36
|
+
// 在實際應用中,您會使用狀態來管理當前的分頁
|
|
37
|
+
const [activeTab, setActiveTab] = React.useState('invoices');
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<div>
|
|
41
|
+
<h1>Billing History</h1>
|
|
42
|
+
<nav>
|
|
43
|
+
<button onClick={() => setActiveTab('invoices')}>Invoices</button>
|
|
44
|
+
<button onClick={() => setActiveTab('payments')}>Payments</button>
|
|
45
|
+
</nav>
|
|
46
|
+
|
|
47
|
+
<div style={{ marginTop: '20px' }}>
|
|
48
|
+
{activeTab === 'invoices' && (
|
|
49
|
+
<CustomerInvoiceList
|
|
50
|
+
customer_id={customerId}
|
|
51
|
+
type="table"
|
|
52
|
+
/>
|
|
53
|
+
)}
|
|
54
|
+
{activeTab === 'payments' && (
|
|
55
|
+
<CustomerPaymentList
|
|
56
|
+
customer_id={customerId}
|
|
57
|
+
/>
|
|
58
|
+
)}
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
這個範例展示了如何輕鬆嵌入歷史記錄元件,為您的使用者提供全面的自助式帳務資訊。每個元件都會處理自己的資料獲取、分頁和顯示邏輯。
|
|
66
|
+
|
|
67
|
+
探索每個元件的詳細文件,以了解其特定的 props 和自訂選項。
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 历史组件
|
|
2
|
+
|
|
3
|
+
`@blocklet/payment-react` 库提供了一套历史组件,旨在为您的用户提供清晰详细的过往活动视图。这些组件对于构建客户门户、账户仪表盘和管理界面至关重要,用户可以在这些界面中跟踪他们的账单、支付和信用使用情况。
|
|
4
|
+
|
|
5
|
+
这些组件直接从支付服务中获取并显示数据,提供了一种无缝呈现历史信息的方式,无需从头开始构建复杂的数据获取和渲染逻辑。
|
|
6
|
+
|
|
7
|
+
<x-cards data-columns="2">
|
|
8
|
+
<x-card data-title="CustomerInvoiceList" data-icon="lucide:receipt-text" data-href="/components/history/invoice-list">
|
|
9
|
+
渲染客户发票的列表或表格,包括状态、金额和创建日期的详细信息。
|
|
10
|
+
</x-card>
|
|
11
|
+
<x-card data-title="CustomerPaymentList" data-icon="lucide:credit-card" data-href="/components/history/payment-list">
|
|
12
|
+
显示客户的完整支付历史,包括交易详情、支付方式和状态。
|
|
13
|
+
</x-card>
|
|
14
|
+
<x-card data-title="CreditGrantsList" data-icon="lucide:award" data-href="/components/history/credit-grants-list">
|
|
15
|
+
显示客户的所有信用授予列表,详细说明状态、剩余金额和生效日期。
|
|
16
|
+
</x-card>
|
|
17
|
+
<x-card data-title="CreditTransactionsList" data-icon="lucide:history" data-href="/components/history/credit-transactions-list">
|
|
18
|
+
列出所有个人信用交易,提供信用使用和随时间调整的详细日志。
|
|
19
|
+
</x-card>
|
|
20
|
+
</x-cards>
|
|
21
|
+
|
|
22
|
+
## 常见用例
|
|
23
|
+
|
|
24
|
+
一个典型的用例是在用户的账户页面中创建一个“账单历史”部分。您可以使用选项卡式界面在不同的历史视图之间切换,例如发票、支付和信用。
|
|
25
|
+
|
|
26
|
+
下面是一个关于如何构建这样一个页面的概念性示例。
|
|
27
|
+
|
|
28
|
+
```jsx MyBillingPage.tsx icon=lucide:user
|
|
29
|
+
import React from 'react';
|
|
30
|
+
import { CustomerInvoiceList, CustomerPaymentList } from '@blocklet/payment-react';
|
|
31
|
+
|
|
32
|
+
// 假设您从会话或上下文中获取了客户的 ID
|
|
33
|
+
const customerId = 'cus_xxxxxxxxxxxxxx';
|
|
34
|
+
|
|
35
|
+
export default function MyBillingPage() {
|
|
36
|
+
// 在实际应用中,您会使用 state 来管理活动选项卡
|
|
37
|
+
const [activeTab, setActiveTab] = React.useState('invoices');
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<div>
|
|
41
|
+
<h1>Billing History</h1>
|
|
42
|
+
<nav>
|
|
43
|
+
<button onClick={() => setActiveTab('invoices')}>Invoices</button>
|
|
44
|
+
<button onClick={() => setActiveTab('payments')}>Payments</button>
|
|
45
|
+
</nav>
|
|
46
|
+
|
|
47
|
+
<div style={{ marginTop: '20px' }}>
|
|
48
|
+
{activeTab === 'invoices' && (
|
|
49
|
+
<CustomerInvoiceList
|
|
50
|
+
customer_id={customerId}
|
|
51
|
+
type="table"
|
|
52
|
+
/>
|
|
53
|
+
)}
|
|
54
|
+
{activeTab === 'payments' && (
|
|
55
|
+
<CustomerPaymentList
|
|
56
|
+
customer_id={customerId}
|
|
57
|
+
/>
|
|
58
|
+
)}
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
这个例子展示了如何轻松嵌入历史组件,为您的用户提供全面的自助式账单信息。每个组件都处理自己的数据获取、分页和显示逻辑。
|
|
66
|
+
|
|
67
|
+
探索每个组件的详细文档,以了解其特定的属性和自定义选项。
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# AddressForm
|
|
2
|
+
|
|
3
|
+
`AddressForm`コンポーネントは、請求先住所情報を収集するための構築済みUIを提供します。`react-hook-form`とシームレスに統合されており、郵便番号などのフィールドに対して国別の組み込みバリデーションが含まれています。
|
|
4
|
+
|
|
5
|
+
このコンポーネントは柔軟に設計されており、完全な住所の収集と、Stripeの郵便番号検証用の簡易バージョンの両方をサポートしています。
|
|
6
|
+
|
|
7
|
+
## Props
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Description | Default |
|
|
10
|
+
| ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
|
|
11
|
+
| `mode` | `string` | 表示するフィールドを決定します。`'required'`に設定すると、完全な住所フォーム(住所1、市区町村、都道府県、郵便番号、国)が表示されます。 | `undefined` |
|
|
12
|
+
| `stripe` | `boolean` | `true`の場合、郵便番号と国のみを含む簡易フォームを表示します。これは通常、Stripeでのカード検証に使用されます。 | `false` |
|
|
13
|
+
| `sx` | `SxProps` | ルートの`Stack`コンポーネントをカスタムスタイリングするためのMUIの`sx`プロパティです。 | `{}` |
|
|
14
|
+
| `fieldValidation` | `Record<string, any>` | 特定のフィールドに正規表現パターンなどのカスタムバリデーションルールを提供するためのオブジェクトです。詳細はバリデーションのセクションを参照してください。 | `{}` |
|
|
15
|
+
| `errorPosition` | `'right'` \| `'bottom'` | 入力フィールドに対してバリデーションエラーメッセージをどこに表示するかを指定します。 | `'right'` |
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
`AddressForm`は、フィールドの登録と状態管理のために`react-hook-form`のコンテキストに依存しているため、`FormProvider`内で使用する必要があります。
|
|
20
|
+
|
|
21
|
+
### 標準的な請求先住所
|
|
22
|
+
|
|
23
|
+
完全な請求先住所を収集するには、`mode`プロパティを`'required'`に設定します。これにより、すべての標準的な住所フィールドが、それぞれ`'required'`のバリデーションルールと共にレンダリングされます。
|
|
24
|
+
|
|
25
|
+
```tsx AddressForm with Full Address icon=material-symbols:location-on-outline
|
|
26
|
+
import { FormProvider, useForm } from 'react-hook-form';
|
|
27
|
+
import { Button, Stack } from '@mui/material';
|
|
28
|
+
import AddressForm from './AddressForm'; // インポートパスを調整してください
|
|
29
|
+
|
|
30
|
+
export default function FullAddressExample() {
|
|
31
|
+
const methods = useForm({
|
|
32
|
+
defaultValues: {
|
|
33
|
+
billing_address: {
|
|
34
|
+
line1: '',
|
|
35
|
+
city: '',
|
|
36
|
+
state: '',
|
|
37
|
+
postal_code: '',
|
|
38
|
+
country: 'US', // デフォルトの国
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const onSubmit = (data) => {
|
|
44
|
+
console.log('Form data:', data);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<FormProvider {...methods}>
|
|
49
|
+
<form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
50
|
+
<Stack spacing={2}>
|
|
51
|
+
<AddressForm mode="required" />
|
|
52
|
+
<Button type="submit" variant="contained">
|
|
53
|
+
Submit
|
|
54
|
+
</Button>
|
|
55
|
+
</Stack>
|
|
56
|
+
</form>
|
|
57
|
+
</FormProvider>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
この設定では、住所、市区町村、都道府県、郵便番号の入力フィールドがレンダリングされます。国は、統合された[CountrySelect](./components-ui-form-elements-country-select.md)コンポーネントを介して選択されます。
|
|
63
|
+
|
|
64
|
+
### Stripeの郵便番号検証
|
|
65
|
+
|
|
66
|
+
Stripeのような決済方法を使用する場合、カード検証に必要なのは郵便番号と国のみであることがよくあります。`stripe`プロパティを`true`に設定すると、これら2つのフィールドのみを含む簡易フォームがレンダリングされます。
|
|
67
|
+
|
|
68
|
+
```tsx AddressForm for Stripe icon=logos:stripe
|
|
69
|
+
import { FormProvider, useForm } from 'react-hook-form';
|
|
70
|
+
import { Button, Stack } from '@mui/material';
|
|
71
|
+
import AddressForm from './AddressForm'; // インポートパスを調整してください
|
|
72
|
+
|
|
73
|
+
export default function StripeAddressExample() {
|
|
74
|
+
const methods = useForm({
|
|
75
|
+
defaultValues: {
|
|
76
|
+
billing_address: {
|
|
77
|
+
postal_code: '',
|
|
78
|
+
country: 'US', // デフォルトの国
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const onSubmit = (data) => {
|
|
84
|
+
console.log('Form data:', data);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<FormProvider {...methods}>
|
|
89
|
+
<form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
90
|
+
<Stack spacing={2}>
|
|
91
|
+
<AddressForm stripe={true} />
|
|
92
|
+
<Button type="submit" variant="contained">
|
|
93
|
+
Submit
|
|
94
|
+
</Button>
|
|
95
|
+
</Stack>
|
|
96
|
+
</form>
|
|
97
|
+
</FormProvider>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## バリデーション
|
|
103
|
+
|
|
104
|
+
このコンポーネントには、必須フィールドに対する自動バリデーションが含まれています。最も注目すべき機能は、動的な郵便番号バリデーションであり、選択された国に基づいてルールを調整します。
|
|
105
|
+
|
|
106
|
+
- **必須フィールド**: 表示されるすべてのフィールドは自動的に必須としてマークされます。
|
|
107
|
+
- **郵便番号**: バリデーションロジックは`validator/lib/isPostalCode`ライブラリを使用します。選択された国の標準形式(例:米国の場合は5桁、カナダの場合は英数字)に対して郵便番号の形式をチェックします。国の形式が明示的にサポートされていない場合は、一般的なバリデーションが適用されます。
|
|
108
|
+
- **カスタムバリデーション**: `fieldValidation`プロパティを介して追加のバリデーションルールを渡すことができます。例えば、`state`フィールドに特定のパターンを適用するには:
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
const customValidation = {
|
|
112
|
+
'billing_address.state': {
|
|
113
|
+
pattern: '^[A-Z]{2}$',
|
|
114
|
+
pattern_message: {
|
|
115
|
+
en: '州は2文字のコードでなければなりません。',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
<AddressForm mode="required" fieldValidation={customValidation} />;
|
|
121
|
+
```
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# AddressForm
|
|
2
|
+
|
|
3
|
+
`AddressForm` 元件提供了一個預先建置的使用者介面,用於收集帳單地址資訊。它與 `react-hook-form` 無縫整合,並包含針對郵遞區號等欄位的內建、特定國家/地區的驗證。
|
|
4
|
+
|
|
5
|
+
此元件設計靈活,支援完整地址收集和用於 Stripe 郵遞區號驗證的簡化版本。
|
|
6
|
+
|
|
7
|
+
## Props
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Description | Default |
|
|
10
|
+
| ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
|
|
11
|
+
| `mode` | `string` | 決定要顯示的欄位。設定為 `'required'` 以顯示完整的地址表單(地址第一行、城市、州/省、郵遞區號、國家/地區)。 | `undefined` |
|
|
12
|
+
| `stripe` | `boolean` | 若為 `true`,則顯示一個僅包含郵遞區號和國家/地區的簡化表單,通常用於 Stripe 的卡片驗證。 | `false` |
|
|
13
|
+
| `sx` | `SxProps` | MUI 的 `sx` prop,用於對根 `Stack` 元件進行自訂樣式設定。 | `{}` |
|
|
14
|
+
| `fieldValidation` | `Record<string, any>` | 一個用於為特定欄位提供自訂驗證規則的物件,例如正規表示式模式。詳情請參閱驗證部分。 | `{}` |
|
|
15
|
+
| `errorPosition` | `'right'` \| `'bottom'` | 指定相對於輸入欄位的驗證錯誤訊息顯示位置。 | `'right'` |
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
`AddressForm` 必須在 `react-hook-form` 的 `FormProvider` 內使用,因為它依賴其上下文來註冊欄位和管理狀態。
|
|
20
|
+
|
|
21
|
+
### 標準帳單地址
|
|
22
|
+
|
|
23
|
+
若要收集完整的帳單地址,請將 `mode` prop 設定為 `'required'`。這將呈現所有標準地址欄位,每個欄位都帶有「必填」驗證規則。
|
|
24
|
+
|
|
25
|
+
```tsx 包含完整地址的 AddressForm icon=material-symbols:location-on-outline
|
|
26
|
+
import { FormProvider, useForm } from 'react-hook-form';
|
|
27
|
+
import { Button, Stack } from '@mui/material';
|
|
28
|
+
import AddressForm from './AddressForm'; // 調整匯入路徑
|
|
29
|
+
|
|
30
|
+
export default function FullAddressExample() {
|
|
31
|
+
const methods = useForm({
|
|
32
|
+
defaultValues: {
|
|
33
|
+
billing_address: {
|
|
34
|
+
line1: '',
|
|
35
|
+
city: '',
|
|
36
|
+
state: '',
|
|
37
|
+
postal_code: '',
|
|
38
|
+
country: 'US', // 預設國家/地區
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const onSubmit = (data) => {
|
|
44
|
+
console.log('Form data:', data);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<FormProvider {...methods}>
|
|
49
|
+
<form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
50
|
+
<Stack spacing={2}>
|
|
51
|
+
<AddressForm mode="required" />
|
|
52
|
+
<Button type="submit" variant="contained">
|
|
53
|
+
提交
|
|
54
|
+
</Button>
|
|
55
|
+
</Stack>
|
|
56
|
+
</form>
|
|
57
|
+
</FormProvider>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
此設定會呈現地址、城市、州/省和郵遞區號的輸入欄位。國家/地區是透過整合的 [CountrySelect](./components-ui-form-elements-country-select.md) 元件來選擇。
|
|
63
|
+
|
|
64
|
+
### Stripe 郵遞區號驗證
|
|
65
|
+
|
|
66
|
+
當使用像 Stripe 這樣的支付方式時,通常只需要郵遞區號和國家/地區進行卡片驗證。將 `stripe` prop 設定為 `true`,以呈現僅包含這兩個欄位的簡化表單。
|
|
67
|
+
|
|
68
|
+
```tsx 用於 Stripe 的 AddressForm icon=logos:stripe
|
|
69
|
+
import { FormProvider, useForm } from 'react-hook-form';
|
|
70
|
+
import { Button, Stack } from '@mui/material';
|
|
71
|
+
import AddressForm from './AddressForm'; // 調整匯入路徑
|
|
72
|
+
|
|
73
|
+
export default function StripeAddressExample() {
|
|
74
|
+
const methods = useForm({
|
|
75
|
+
defaultValues: {
|
|
76
|
+
billing_address: {
|
|
77
|
+
postal_code: '',
|
|
78
|
+
country: 'US', // 預設國家/地區
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const onSubmit = (data) => {
|
|
84
|
+
console.log('Form data:', data);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<FormProvider {...methods}>
|
|
89
|
+
<form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
90
|
+
<Stack spacing={2}>
|
|
91
|
+
<AddressForm stripe={true} />
|
|
92
|
+
<Button type="submit" variant="contained">
|
|
93
|
+
提交
|
|
94
|
+
</Button>
|
|
95
|
+
</Stack>
|
|
96
|
+
</form>
|
|
97
|
+
</FormProvider>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 驗證
|
|
103
|
+
|
|
104
|
+
該元件包含對必填欄位的自動驗證。最顯著的特點是動態郵遞區號驗證,它會根據所選國家/地區調整其規則。
|
|
105
|
+
|
|
106
|
+
- **必填欄位**:所有可見欄位都會自動標記為必填。
|
|
107
|
+
- **郵遞區號**:驗證邏輯使用 `validator/lib/isPostalCode` 函式庫。它會根據所選國家/地區的標準格式(例如,美國為 5 位數字,加拿大為字母數字)來檢查郵遞區號格式。如果某個國家/地區的格式未被明確支援,則會套用通用驗證。
|
|
108
|
+
- **自訂驗證**:您可以透過 `fieldValidation` prop 傳遞額外的驗證規則。例如,若要對 `state` 欄位強制執行特定模式:
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
const customValidation = {
|
|
112
|
+
'billing_address.state': {
|
|
113
|
+
pattern: '^[A-Z]{2}$',
|
|
114
|
+
pattern_message: {
|
|
115
|
+
en: '州/省必須是 2 個字母的代碼。',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
<AddressForm mode="required" fieldValidation={customValidation} />;
|
|
121
|
+
```
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# AddressForm
|
|
2
|
+
|
|
3
|
+
`AddressForm` 组件提供了一个预构建的用户界面,用于收集账单地址信息。它与 `react-hook-form` 无缝集成,并包含针对邮政编码等字段的内置、特定国家/地区的验证。
|
|
4
|
+
|
|
5
|
+
该组件设计灵活,既支持完整的地址收集,也支持用于 Stripe 邮政编码验证的简化版本。
|
|
6
|
+
|
|
7
|
+
## Props
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Description | Default |
|
|
10
|
+
| ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
|
|
11
|
+
| `mode` | `string` | 决定要显示的字段。设置为 `'required'` 以显示完整的地址表单(地址行 1、城市、州/省、邮政编码、国家/地区)。 | `undefined` |
|
|
12
|
+
| `stripe` | `boolean` | 如果为 `true`,则显示一个仅包含邮政编码和国家/地区的简化表单,通常用于 Stripe 的银行卡验证。 | `false` |
|
|
13
|
+
| `sx` | `SxProps` | MUI 的 `sx` 属性,用于对根 `Stack` 组件进行自定义样式设置。 | `{}` |
|
|
14
|
+
| `fieldValidation` | `Record<string, any>` | 一个用于为特定字段提供自定义验证规则(例如正则表达式模式)的对象。有关详细信息,请参见验证部分。 | `{}` |
|
|
15
|
+
| `errorPosition` | `'right'` \| `'bottom'` | 指定在输入字段的哪个位置显示验证错误消息。 | `'right'` |
|
|
16
|
+
|
|
17
|
+
## 用法
|
|
18
|
+
|
|
19
|
+
`AddressForm` 必须在 `react-hook-form` 的 `FormProvider` 中使用,因为它依赖其上下文来注册字段和管理状态。
|
|
20
|
+
|
|
21
|
+
### 标准账单地址
|
|
22
|
+
|
|
23
|
+
要收集完整的账单地址,请将 `mode` 属性设置为 `'required'`。这将渲染所有标准的地址字段,每个字段都带有“必填”验证规则。
|
|
24
|
+
|
|
25
|
+
```tsx AddressForm with Full Address icon=material-symbols:location-on-outline
|
|
26
|
+
import { FormProvider, useForm } from 'react-hook-form';
|
|
27
|
+
import { Button, Stack } from '@mui/material';
|
|
28
|
+
import AddressForm from './AddressForm'; // 调整导入路径
|
|
29
|
+
|
|
30
|
+
export default function FullAddressExample() {
|
|
31
|
+
const methods = useForm({
|
|
32
|
+
defaultValues: {
|
|
33
|
+
billing_address: {
|
|
34
|
+
line1: '',
|
|
35
|
+
city: '',
|
|
36
|
+
state: '',
|
|
37
|
+
postal_code: '',
|
|
38
|
+
country: 'US', // 默认国家/地区
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const onSubmit = (data) => {
|
|
44
|
+
console.log('表单数据:', data);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<FormProvider {...methods}>
|
|
49
|
+
<form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
50
|
+
<Stack spacing={2}>
|
|
51
|
+
<AddressForm mode="required" />
|
|
52
|
+
<Button type="submit" variant="contained">
|
|
53
|
+
Submit
|
|
54
|
+
</Button>
|
|
55
|
+
</Stack>
|
|
56
|
+
</form>
|
|
57
|
+
</FormProvider>
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
此设置会渲染地址行、城市、州/省和邮政编码的输入字段。国家/地区通过集成的 [CountrySelect](./components-ui-form-elements-country-select.md) 组件进行选择。
|
|
63
|
+
|
|
64
|
+
### Stripe 邮政编码验证
|
|
65
|
+
|
|
66
|
+
在使用 Stripe 等支付方式时,通常只需要邮政编码和国家/地区进行银行卡验证。将 `stripe` 属性设置为 `true` 以渲染一个仅包含这两个字段的简化表单。
|
|
67
|
+
|
|
68
|
+
```tsx AddressForm for Stripe icon=logos:stripe
|
|
69
|
+
import { FormProvider, useForm } from 'react-hook-form';
|
|
70
|
+
import { Button, Stack } from '@mui/material';
|
|
71
|
+
import AddressForm from './AddressForm'; // 调整导入路径
|
|
72
|
+
|
|
73
|
+
export default function StripeAddressExample() {
|
|
74
|
+
const methods = useForm({
|
|
75
|
+
defaultValues: {
|
|
76
|
+
billing_address: {
|
|
77
|
+
postal_code: '',
|
|
78
|
+
country: 'US', // 默认国家/地区
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const onSubmit = (data) => {
|
|
84
|
+
console.log('表单数据:', data);
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<FormProvider {...methods}>
|
|
89
|
+
<form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
90
|
+
<Stack spacing={2}>
|
|
91
|
+
<AddressForm stripe={true} />
|
|
92
|
+
<Button type="submit" variant="contained">
|
|
93
|
+
Submit
|
|
94
|
+
</Button>
|
|
95
|
+
</Stack>
|
|
96
|
+
</form>
|
|
97
|
+
</FormProvider>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 验证
|
|
103
|
+
|
|
104
|
+
该组件包含对必填字段的自动验证。最显著的特点是动态邮政编码验证,它会根据所选的国家/地区调整其规则。
|
|
105
|
+
|
|
106
|
+
- **必填字段**:所有可见字段都会自动标记为必填。
|
|
107
|
+
- **邮政编码**:验证逻辑使用 `validator/lib/isPostalCode` 库。它会根据所选国家/地区的标准格式(例如,美国的 5 位数字,加拿大的字母数字组合)检查邮政编码格式。如果某个国家/地区的格式未被明确支持,则会应用通用验证。
|
|
108
|
+
- **自定义验证**:您可以通过 `fieldValidation` 属性传递额外的验证规则。例如,要对 `state` 字段强制执行特定模式:
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
const customValidation = {
|
|
112
|
+
'billing_address.state': {
|
|
113
|
+
pattern: '^[A-Z]{2}$',
|
|
114
|
+
pattern_message: {
|
|
115
|
+
en: '州/省必须是 2 个字母的代码。',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
<AddressForm mode="required" fieldValidation={customValidation} />;
|
|
121
|
+
```
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# CountrySelect
|
|
2
|
+
|
|
3
|
+
`CountrySelect`コンポーネントは、国を選択するための使いやすいドロップダウンを提供します。検索可能なリスト、国旗の表示、デスクトップとモバイルの両方のビューポートに適応するレスポンシブデザインが特徴です。`react-hook-form`で管理されるフォーム内での使用を想定して設計されています。
|
|
4
|
+
|
|
5
|
+
## Props
|
|
6
|
+
|
|
7
|
+
| Prop | Type | 説明 | 必須 | デフォルト |
|
|
8
|
+
|--------------|----------------------------------|---------------------------------------------------------------------------------------------|----------|---------|
|
|
9
|
+
| `value` | `CountryIso2` | 選択された国のISO2コード(例:「us」)。 | はい | |
|
|
10
|
+
| `onChange` | `(value: CountryIso2) => void` | 国が選択されたときに呼び出されるコールバック関数。 | はい | |
|
|
11
|
+
| `name` | `string` | 入力のname属性で、`react-hook-form`との統合に使用されます。 | はい | |
|
|
12
|
+
| `sx` | `SxProps` | ルート要素に適用されるカスタムスタイル。 | いいえ | `{}` |
|
|
13
|
+
| `showDialCode` | `boolean` | `true`の場合、国のダイヤルコードがリストの名前の横に表示されます。 | いいえ | `false` |
|
|
14
|
+
|
|
15
|
+
## 基本的な使用法
|
|
16
|
+
|
|
17
|
+
`CountrySelect`コンポーネントを使用するには、`react-hook-form`の`FormProvider`でラップする必要があります。コンポーネントの状態はフォームコンテキストを介して管理されます。
|
|
18
|
+
|
|
19
|
+
```tsx Basic CountrySelect Example icon=logos:react
|
|
20
|
+
import { FormProvider, useForm } from 'react-hook-form';
|
|
21
|
+
import { Box, Button, Typography } from '@mui/material';
|
|
22
|
+
import CountrySelect from '@blocklet/payment-react/src/components/country-select'; // 必要に応じてパスを調整
|
|
23
|
+
import type { CountryIso2 } from 'react-international-phone';
|
|
24
|
+
|
|
25
|
+
export default function BasicCountrySelect() {
|
|
26
|
+
const methods = useForm<{ country: CountryIso2 }>({
|
|
27
|
+
defaultValues: {
|
|
28
|
+
country: 'us',
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const { handleSubmit, watch, setValue } = methods;
|
|
33
|
+
const countryValue = watch('country'); // 変更を監視して制御されたコンポーネントを更新
|
|
34
|
+
|
|
35
|
+
const onSubmit = (data: { country: CountryIso2 }) => {
|
|
36
|
+
alert(`国: ${data.country} でフォームが送信されました`);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<FormProvider {...methods}>
|
|
41
|
+
<form onSubmit={handleSubmit(onSubmit)}>
|
|
42
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, maxWidth: 400 }}>
|
|
43
|
+
<Typography variant="h6">国を選択してください</Typography>
|
|
44
|
+
<CountrySelect
|
|
45
|
+
name="country"
|
|
46
|
+
value={countryValue}
|
|
47
|
+
onChange={(newCountry) => {
|
|
48
|
+
setValue('country', newCountry, { shouldValidate: true });
|
|
49
|
+
}}
|
|
50
|
+
/>
|
|
51
|
+
<Button type="submit" variant="contained">
|
|
52
|
+
送信
|
|
53
|
+
</Button>
|
|
54
|
+
<Typography>
|
|
55
|
+
現在のフォーム値: {countryValue}
|
|
56
|
+
</Typography>
|
|
57
|
+
</Box>
|
|
58
|
+
</form>
|
|
59
|
+
</FormProvider>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 機能
|
|
65
|
+
|
|
66
|
+
### 検索とフィルタリング
|
|
67
|
+
コンポーネントにはドロップダウンリストの上部に検索バーがあり、ユーザーは国名、ISO2コード、またはダイヤルコードで国をすばやく見つけることができます。例えば、「+1」を検索すると、アメリカ合衆国とカナダが表示されます。
|
|
68
|
+
|
|
69
|
+
### レスポンシブUI
|
|
70
|
+
デスクトップデバイスでは、`CountrySelect`は標準のドロップダウンメニューとして表示されます。モバイルデバイスでは、画面下部からスライドアップする全幅のダイアログに変わり、小さなデバイスでも最適化されたユーザーエクスペリエンスを提供します。
|
|
71
|
+
|
|
72
|
+
### キーボードアクセシビリティ
|
|
73
|
+
`CountrySelect`は完全なキーボードナビゲーションをサポートしています。ユーザーは`ArrowUp`キーと`ArrowDown`キーでリストを移動し、`Enter`キーで国を選択し、`Escape`キーでドロップダウンを閉じることができます。`Tab`キーと`Shift+Tab`キーでもリスト項目を順に移動できます。
|
|
74
|
+
|
|
75
|
+
### フォーム統合
|
|
76
|
+
`react-hook-form`とシームレスに連携するように設計されています。選択が行われるとフォームの状態が自動的に更新されるため、`FormProvider`でラップする必要があります。
|
|
77
|
+
|
|
78
|
+
## 高度な使用法
|
|
79
|
+
|
|
80
|
+
### ダイヤルコードの表示
|
|
81
|
+
|
|
82
|
+
`showDialCode`プロパティを`true`に設定すると、リスト内の各国の電話ダイヤルコードを表示できます。
|
|
83
|
+
|
|
84
|
+
```tsx CountrySelect with Dial Code icon=logos:react
|
|
85
|
+
import { FormProvider, useForm } from 'react-hook-form';
|
|
86
|
+
import { Box, Button } from '@mui/material';
|
|
87
|
+
import CountrySelect from '@blocklet/payment-react/src/components/country-select'; // 必要に応じてパスを調整
|
|
88
|
+
import type { CountryIso2 } from 'react-international-phone';
|
|
89
|
+
|
|
90
|
+
export default function CountrySelectWithDialCode() {
|
|
91
|
+
const methods = useForm<{ country: CountryIso2 }>({
|
|
92
|
+
defaultValues: {
|
|
93
|
+
country: 'gb',
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const { handleSubmit, watch, setValue } = methods;
|
|
98
|
+
const countryValue = watch('country');
|
|
99
|
+
|
|
100
|
+
const onSubmit = (data: { country: CountryIso2 }) => {
|
|
101
|
+
alert(`国: ${data.country} でフォームが送信されました`);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<FormProvider {...methods}>
|
|
106
|
+
<form onSubmit={handleSubmit(onSubmit)}>
|
|
107
|
+
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 2, maxWidth: 400 }}>
|
|
108
|
+
<CountrySelect
|
|
109
|
+
name="country"
|
|
110
|
+
value={countryValue}
|
|
111
|
+
onChange={(newCountry) => setValue('country', newCountry)}
|
|
112
|
+
showDialCode={true}
|
|
113
|
+
/>
|
|
114
|
+
<Button type="submit" variant="contained">
|
|
115
|
+
送信
|
|
116
|
+
</Button>
|
|
117
|
+
</Box>
|
|
118
|
+
</form>
|
|
119
|
+
</FormProvider>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 次のステップ
|
|
125
|
+
|
|
126
|
+
このコンポーネントは、より複雑なフォーム要素の構成要素です。完全な国際電話番号フィールドを作成するために、[PhoneInput](./components-ui-form-elements-phone-input.md)コンポーネントにどのように統合されているかを参照してください。
|