@blocklet/payment-react 1.20.15 → 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 (114) 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/es/locales/en.js +13 -3
  103. package/es/locales/zh.js +13 -3
  104. package/es/payment/product-item.js +123 -20
  105. package/es/payment/success.js +2 -2
  106. package/lib/locales/en.js +13 -3
  107. package/lib/locales/zh.js +13 -3
  108. package/lib/payment/product-item.js +136 -32
  109. package/lib/payment/success.js +2 -2
  110. package/package.json +5 -5
  111. package/src/locales/en.tsx +18 -3
  112. package/src/locales/zh.tsx +17 -3
  113. package/src/payment/product-item.tsx +140 -19
  114. package/src/payment/success.tsx +2 -2
@@ -0,0 +1,138 @@
1
+ # PhoneInput
2
+
3
+ `PhoneInput`コンポーネントは、ユーザーフレンドリーな国際電話番号入力フィールドを提供します。`react-hook-form`とシームレスに統合され、国旗と国番号付きの検索可能な国選択機能、自動番号フォーマット、および`google-libphonenumber`による強力な検証機能を備えています。
4
+
5
+ このコンポーネントは、選択された国を共有フォームフィールドと同期させることで、[`CountrySelect`](./components-ui-form-elements-country-select.md)や[`AddressForm`](./components-ui-form-elements-address-form.md)などの他のフォーム要素と連携して動作するように設計されています。
6
+
7
+ ## 仕組み
8
+
9
+ このコンポーネントは、`react-international-phone`ライブラリをコア機能として活用し、それをラップして`react-hook-form`およびMaterial-UIとの深い統合を提供します。ユーザーが国を選択したり番号を入力したりすると、コンポーネントはフォームの状態にある対応するフィールドを更新します。また、他のコンポーネントがフォーム内のリンクされた国フィールドを変更すると、自動的に国選択を更新します。
10
+
11
+ ```d2
12
+ direction: down
13
+
14
+ User: {
15
+ shape: c4-person
16
+ }
17
+
18
+ Form-State: {
19
+ label: "React Hook Form の状態"
20
+ shape: cylinder
21
+ }
22
+
23
+ PhoneInput-Component: {
24
+ label: "PhoneInput コンポーネント"
25
+
26
+ CountrySelect: {
27
+ label: "CountrySelect"
28
+ }
29
+
30
+ Phone-Field: {
31
+ label: "電話番号テキストフィールド"
32
+ }
33
+ }
34
+
35
+ User -> PhoneInput-Component.CountrySelect: "1. 国を選択"
36
+ PhoneInput-Component.CountrySelect -> Form-State: "2. 'countryFieldName' の値を更新"
37
+
38
+ User -> PhoneInput-Component.Phone-Field: "3. 電話番号を入力"
39
+ PhoneInput-Component.Phone-Field -> Form-State: "4. 'name' の値(電話番号)を更新"
40
+
41
+ Form-State -> PhoneInput-Component: "5. 状態を同期"
42
+ ```
43
+
44
+ ## Props
45
+
46
+ `PhoneInput`コンポーネントは、すべての標準的なMaterial-UIの`TextField` propsに加えて、以下の特定のpropsを受け入れます:
47
+
48
+ | Prop | Type | Required | Default | Description |
49
+ |---|---|---|---|---|
50
+ | `name` | `string` | Yes | - | `react-hook-form`に電話番号を登録するためのフィールド名。 |
51
+ | `countryFieldName` | `string` | No | `'billing_address.country'` | 選択された国のISO2コードを保存するフォームフィールドの名前。これにより、電話番号入力の国を、アドレスコンポーネントなど、フォームの他の部分と同期させることができます。 |
52
+
53
+ ## 使用方法
54
+
55
+ `PhoneInput`コンポーネントを使用するには、`react-hook-form`の`FormProvider`でラップする必要があります。次の例は、検証機能を含む基本的な実装を示しています。
56
+
57
+ まず、ライブラリが提供する非同期検証関数が必要です。
58
+
59
+ ```javascript phone-validator.js icon=logos:javascript
60
+ // src/libs/phone-validator.js
61
+ import { getPhoneUtil } from '@blocklet/payment-react/libs/phone-validator';
62
+
63
+ export const validatePhoneNumber = async (phoneNumber) => {
64
+ if (!phoneNumber) return true;
65
+ try {
66
+ const util = await getPhoneUtil();
67
+ const parsed = util.parseAndKeepRawInput(phoneNumber);
68
+ return util.isValidNumber(parsed);
69
+ } catch (err) {
70
+ console.error('Phone validation error:', err);
71
+ // ライブラリの読み込みに失敗した場合、単純な正規表現にフォールバックします
72
+ const pattern = /^[+]?[(]?[0-9]{3}[)]?[-\s.]?[0-9]{3}[-\s.]?[0-9]{4,6}$/im;
73
+ return pattern.test(phoneNumber) || 'Invalid phone number';
74
+ }
75
+ };
76
+ ```
77
+
78
+ これで、このバリデータをフォームコンポーネントで使用できます。
79
+
80
+ ```jsx MyPaymentForm.tsx icon=logos:react
81
+ import { FormProvider, useForm } from 'react-hook-form';
82
+ import { Button, Box } from '@mui/material';
83
+ import { PhoneInput } from '@blocklet/payment-react';
84
+ import { validatePhoneNumber } from '../libs/phone-validator'; // 必要に応じてパスを調整してください
85
+
86
+ export default function MyPaymentForm() {
87
+ const methods = useForm({
88
+ mode: 'onBlur',
89
+ defaultValues: {
90
+ phone: '',
91
+ 'billing_address.country': 'us', // デフォルトの国
92
+ },
93
+ });
94
+
95
+ const onSubmit = (data) => {
96
+ alert(JSON.stringify(data, null, 2));
97
+ };
98
+
99
+ return (
100
+ <FormProvider {...methods}>
101
+ <form onSubmit={methods.handleSubmit(onSubmit)}>
102
+ <Box display="flex" flexDirection="column" gap={2}>
103
+ <PhoneInput
104
+ label="Phone Number"
105
+ name="phone"
106
+ // フォームの状態にある国フィールドへのリンク
107
+ countryFieldName="billing_address.country"
108
+ // 検証ルールを追加
109
+ rules={{
110
+ validate: async (value) => {
111
+ const isValid = await validatePhoneNumber(value);
112
+ return isValid || 'Please enter a valid phone number.';
113
+ },
114
+ }}
115
+ fullWidth
116
+ />
117
+ <Button type="submit" variant="contained">
118
+ Submit
119
+ </Button>
120
+ </Box>
121
+ </form>
122
+ </FormProvider>
123
+ );
124
+ }
125
+ ```
126
+
127
+ ### 解説
128
+
129
+ 1. **`FormProvider`**: `PhoneInput`を含むフォーム全体が`FormProvider`でラップされ、必要なフォームコンテキストを提供します。
130
+ 2. **`name="phone"`**: これにより、入力フィールドがフォームデータ内で`phone`という名前で登録されます。
131
+ 3. **`countryFieldName="billing_address.country"`**: これは`PhoneInput`に、フォームの状態にある`billing_address.country`フィールドの読み書きを両方行うように指示します。これにより同期が保たれます。このフィールドのデフォルト値は`useForm`で`'us'`に設定されています。
132
+ 4. **`rules`**: 非同期の`validate`関数を`rules` propに渡します。`react-hook-form`は検証中にこの関数が解決されるのを待ちます。チェックを実行するために`validatePhoneNumber`ユーティリティが呼び出されます。
133
+
134
+ ## AddressFormとの統合
135
+
136
+ `PhoneInput`の真価は、`AddressForm`と併用することで発揮されます。両方のコンポーネントは同じ国フィールド(デフォルトでは`billing_address.country`)にリンクできるため、`AddressForm`で国を変更すると、`PhoneInput`の国旗と国番号が自動的に更新されます。
137
+
138
+ この統合の完全な例については、[`AddressForm`](./components-ui-form-elements-address-form.md)のドキュメントを参照してください。
@@ -0,0 +1,138 @@
1
+ # PhoneInput
2
+
3
+ `PhoneInput` 元件提供了一個使用者友善的國際電話號碼輸入欄位。它與 `react-hook-form` 無縫整合,並包含一個帶有國旗和國碼的可搜尋國家選擇器、自動號碼格式化,以及由 `google-libphonenumber` 支援的強大驗證功能。
4
+
5
+ 此元件旨在與其他表單元素(例如 [`CountrySelect`](./components-ui-form-elements-country-select.md) 或 [`AddressForm`](./components-ui-form-elements-address-form.md))協同工作,透過將其選定的國家與共享的表單欄位同步。
6
+
7
+ ## 運作方式
8
+
9
+ 該元件利用 `react-international-phone` 函式庫實現其核心功能,並將其包裝以提供與 `react-hook-form` 和 Material-UI 的深度整合。當使用者選擇一個國家或輸入號碼時,該元件會更新表單狀態中對應的欄位。當另一個元件修改表單中連結的國家欄位時,它也會自動更新其國家選擇。
10
+
11
+ ```d2
12
+ direction: down
13
+
14
+ User: {
15
+ shape: c4-person
16
+ }
17
+
18
+ Form-State: {
19
+ label: "React Hook Form 狀態"
20
+ shape: cylinder
21
+ }
22
+
23
+ PhoneInput-Component: {
24
+ label: "PhoneInput 元件"
25
+
26
+ CountrySelect: {
27
+ label: "CountrySelect"
28
+ }
29
+
30
+ Phone-Field: {
31
+ label: "電話文字欄位"
32
+ }
33
+ }
34
+
35
+ User -> PhoneInput-Component.CountrySelect: "1. 選擇一個國家"
36
+ PhoneInput-Component.CountrySelect -> Form-State: "2. 更新 'countryFieldName' 的值"
37
+
38
+ User -> PhoneInput-Component.Phone-Field: "3. 輸入電話號碼"
39
+ PhoneInput-Component.Phone-Field -> Form-State: "4. 更新 'name' 的值(電話號碼)"
40
+
41
+ Form-State -> PhoneInput-Component: "5. 同步狀態"
42
+ ```
43
+
44
+ ## 屬性
45
+
46
+ `PhoneInput` 元件接受所有標準的 Material-UI `TextField` 屬性,此外還包括以下特定屬性:
47
+
48
+ | 屬性 | 類型 | 是否必須 | 預設值 | 描述 |
49
+ |---|---|---|---|---|
50
+ | `name` | `string` | 是 | - | 用於向 `react-hook-form` 註冊電話號碼的欄位名稱。 |
51
+ | `countryFieldName` | `string` | 否 | `'billing_address.country'` | 儲存所選國家 ISO2 代碼的表單欄位名稱。這使得電話輸入的國家可以與表單的其他部分(例如地址元件)同步。 |
52
+
53
+ ## 使用方式
54
+
55
+ 若要使用 `PhoneInput` 元件,您必須將其包裝在 `react-hook-form` 的 `FormProvider` 中。以下範例展示了一個包含驗證的基本實作。
56
+
57
+ 首先,您需要函式庫提供的非同步驗證函式。
58
+
59
+ ```javascript phone-validator.js icon=logos:javascript
60
+ // src/libs/phone-validator.js
61
+ import { getPhoneUtil } from '@blocklet/payment-react/libs/phone-validator';
62
+
63
+ export const validatePhoneNumber = async (phoneNumber) => {
64
+ if (!phoneNumber) return true;
65
+ try {
66
+ const util = await getPhoneUtil();
67
+ const parsed = util.parseAndKeepRawInput(phoneNumber);
68
+ return util.isValidNumber(parsed);
69
+ } catch (err) {
70
+ console.error('Phone validation error:', err);
71
+ // 如果函式庫載入失敗,則退回使用簡單的正規表示式
72
+ const pattern = /^[+]?[(]?[0-9]{3}[)]?[-\s.]?[0-9]{3}[-\s.]?[0-9]{4,6}$/im;
73
+ return pattern.test(phoneNumber) || 'Invalid phone number';
74
+ }
75
+ };
76
+ ```
77
+
78
+ 現在,您可以在您的表單元件中使用此驗證器。
79
+
80
+ ```jsx MyPaymentForm.tsx icon=logos:react
81
+ import { FormProvider, useForm } from 'react-hook-form';
82
+ import { Button, Box } from '@mui/material';
83
+ import { PhoneInput } from '@blocklet/payment-react';
84
+ import { validatePhoneNumber } from '../libs/phone-validator'; // 根據需要調整路徑
85
+
86
+ export default function MyPaymentForm() {
87
+ const methods = useForm({
88
+ mode: 'onBlur',
89
+ defaultValues: {
90
+ phone: '',
91
+ 'billing_address.country': 'us', // 預設國家
92
+ },
93
+ });
94
+
95
+ const onSubmit = (data) => {
96
+ alert(JSON.stringify(data, null, 2));
97
+ };
98
+
99
+ return (
100
+ <FormProvider {...methods}>
101
+ <form onSubmit={methods.handleSubmit(onSubmit)}>
102
+ <Box display="flex" flexDirection="column" gap={2}>
103
+ <PhoneInput
104
+ label="Phone Number"
105
+ name="phone"
106
+ // 連結到表單狀態中的國家欄位
107
+ countryFieldName="billing_address.country"
108
+ // 新增驗證規則
109
+ rules={{
110
+ validate: async (value) => {
111
+ const isValid = await validatePhoneNumber(value);
112
+ return isValid || 'Please enter a valid phone number.';
113
+ },
114
+ }}
115
+ fullWidth
116
+ />
117
+ <Button type="submit" variant="contained">
118
+ Submit
119
+ </Button>
120
+ </Box>
121
+ </form>
122
+ </FormProvider>
123
+ );
124
+ }
125
+ ```
126
+
127
+ ### 解釋
128
+
129
+ 1. **`FormProvider`**:整個表單,包括 `PhoneInput`,都被包裝在 `FormProvider` 中,以提供必要的表單情境。
130
+ 2. **`name="phone"`**:這會將輸入欄位以 `phone` 的名稱註冊到表單資料中。
131
+ 3. **`countryFieldName="billing_address.country"`**:這會告知 `PhoneInput` 從表單狀態的 `billing_address.country` 欄位讀取和寫入。這就是它保持同步的方式。在 `useForm` 中,此欄位的預設值被設為 `'us'`。
132
+ 4. **`rules`**:我們將一個非同步的 `validate` 函式傳遞給 `rules` 屬性。`react-hook-form` 在驗證期間將會等待此函式解析完成。`validatePhoneNumber` 公用程式被呼叫以執行檢查。
133
+
134
+ ## 與 AddressForm 整合
135
+
136
+ `PhoneInput` 的真正強大之處在於與 `AddressForm` 一同使用時才能展現。由於兩個元件可以連結到同一個國家欄位(預設為 `billing_address.country`),因此在 `AddressForm` 中變更國家將會自動更新 `PhoneInput` 中的國旗和國碼。
137
+
138
+ 關於此整合的完整範例,請參閱 [`AddressForm`](./components-ui-form-elements-address-form.md) 的文件。
@@ -0,0 +1,139 @@
1
+ # PhoneInput
2
+
3
+ `PhoneInput` 组件提供了一个用户友好的国际电话号码输入字段。它与 `react-hook-form` 无缝集成,并包含一个带有国旗和拨号代码的可搜索国家选择器、自动号码格式化以及由 `google-libphonenumber` 提供支持的强大验证功能。
4
+
5
+ 该组件旨在与其他表单元素(例如 [`CountrySelect`](./components-ui-form-elements-country-select.md) 或 [`AddressForm`](./components-ui-form-elements-address-form.md))协同工作,通过与共享的表单字段同步其所选国家来实现。
6
+
7
+ ## 工作原理
8
+
9
+ 该组件利用 `react-international-phone` 库实现其核心功能,并对其进行包装,以提供与 `react-hook-form` 和 Material-UI 的深度集成。当用户选择一个国家或输入一个号码时,该组件会更新表单状态中相应的字段。当另一个组件修改表单中链接的国家字段时,它也会自动更新其国家选择。
10
+
11
+ ```d2
12
+ direction: down
13
+
14
+ User: {
15
+ label: "用户"
16
+ shape: c4-person
17
+ }
18
+
19
+ Form-State: {
20
+ label: "React Hook Form 状态"
21
+ shape: cylinder
22
+ }
23
+
24
+ PhoneInput-Component: {
25
+ label: "PhoneInput 组件"
26
+
27
+ CountrySelect: {
28
+ label: "CountrySelect"
29
+ }
30
+
31
+ Phone-Field: {
32
+ label: "电话文本字段"
33
+ }
34
+ }
35
+
36
+ User -> PhoneInput-Component.CountrySelect: "1. 选择一个国家"
37
+ PhoneInput-Component.CountrySelect -> Form-State: "2. 更新 'countryFieldName' 的值"
38
+
39
+ User -> PhoneInput-Component.Phone-Field: "3. 输入电话号码"
40
+ PhoneInput-Component.Phone-Field -> Form-State: "4. 更新 'name' 的值(电话号码)"
41
+
42
+ Form-State -> PhoneInput-Component: "5. 同步状态"
43
+ ```
44
+
45
+ ## Props
46
+
47
+ `PhoneInput` 组件接受所有标准的 Material-UI `TextField` props,以及以下特定 props:
48
+
49
+ | Prop | 类型 | 必需 | 默认值 | 描述 |
50
+ |---|---|---|---|---|
51
+ | `name` | `string` | 是 | - | 用于在 `react-hook-form` 中注册电话号码的字段名称。 |
52
+ | `countryFieldName` | `string` | 否 | `'billing_address.country'` | 存储所选国家 ISO2 代码的表单字段的名称。这使得电话输入的国家可以与表单的其他部分(例如地址组件)同步。 |
53
+
54
+ ## 用法
55
+
56
+ 要使用 `PhoneInput` 组件,您必须将其包装在 `react-hook-form` 的 `FormProvider` 中。以下示例演示了带验证的基本实现。
57
+
58
+ 首先,您需要库提供的异步验证函数。
59
+
60
+ ```javascript phone-validator.js icon=logos:javascript
61
+ // src/libs/phone-validator.js
62
+ import { getPhoneUtil } from '@blocklet/payment-react/libs/phone-validator';
63
+
64
+ export const validatePhoneNumber = async (phoneNumber) => {
65
+ if (!phoneNumber) return true;
66
+ try {
67
+ const util = await getPhoneUtil();
68
+ const parsed = util.parseAndKeepRawInput(phoneNumber);
69
+ return util.isValidNumber(parsed);
70
+ } catch (err) {
71
+ console.error('电话验证错误:', err);
72
+ // 如果库加载失败,则回退到简单的正则表达式
73
+ const pattern = /^[+]?[(]?[0-9]{3}[)]?[-\s.]?[0-9]{3}[-\s.]?[0-9]{4,6}$/im;
74
+ return pattern.test(phoneNumber) || '无效的电话号码';
75
+ }
76
+ };
77
+ ```
78
+
79
+ 现在,您可以在表单组件中使用此验证器。
80
+
81
+ ```jsx MyPaymentForm.tsx icon=logos:react
82
+ import { FormProvider, useForm } from 'react-hook-form';
83
+ import { Button, Box } from '@mui/material';
84
+ import { PhoneInput } from '@blocklet/payment-react';
85
+ import { validatePhoneNumber } from '../libs/phone-validator'; // 根据需要调整路径
86
+
87
+ export default function MyPaymentForm() {
88
+ const methods = useForm({
89
+ mode: 'onBlur',
90
+ defaultValues: {
91
+ phone: '',
92
+ 'billing_address.country': 'us', // 默认国家
93
+ },
94
+ });
95
+
96
+ const onSubmit = (data) => {
97
+ alert(JSON.stringify(data, null, 2));
98
+ };
99
+
100
+ return (
101
+ <FormProvider {...methods}>
102
+ <form onSubmit={methods.handleSubmit(onSubmit)}>
103
+ <Box display="flex" flexDirection="column" gap={2}>
104
+ <PhoneInput
105
+ label="Phone Number"
106
+ name="phone"
107
+ // 链接到表单状态中的国家字段
108
+ countryFieldName="billing_address.country"
109
+ // 添加验证规则
110
+ rules={{
111
+ validate: async (value) => {
112
+ const isValid = await validatePhoneNumber(value);
113
+ return isValid || '请输入有效的电话号码。';
114
+ },
115
+ }}
116
+ fullWidth
117
+ />
118
+ <Button type="submit" variant="contained">
119
+ Submit
120
+ </Button>
121
+ </Box>
122
+ </form>
123
+ </FormProvider>
124
+ );
125
+ }
126
+ ```
127
+
128
+ ### 说明
129
+
130
+ 1. **`FormProvider`**:整个表单(包括 `PhoneInput`)都包装在 `FormProvider` 中,以提供必要的表单上下文。
131
+ 2. **`name="phone"`**:这会将输入字段以 `phone` 的名称注册到表单数据中。
132
+ 3. **`countryFieldName="billing_address.country"`**:这告诉 `PhoneInput` 从表单状态的 `billing_address.country` 字段读取数据并向其写入数据。这就是它保持同步的方式。在 `useForm` 中,此字段的默认值设置为 `'us'`。
133
+ 4. **`rules`**:我们将一个异步的 `validate` 函数传递给 `rules` prop。`react-hook-form` 将在验证期间等待此函数解析。调用 `validatePhoneNumber` 实用程序来执行检查。
134
+
135
+ ## 与 AddressForm 集成
136
+
137
+ 当 `PhoneInput` 与 `AddressForm` 一起使用时,其真正的强大之处就显现出来了。由于两个组件都可以链接到同一个国家字段(默认为 `billing_address.country`),因此在 `AddressForm` 中更改国家将自动更新 `PhoneInput` 中的国旗和拨号代码。
138
+
139
+ 有关此集成的完整示例,请参阅 [`AddressForm`](./components-ui-form-elements-address-form.md) 的文档。
@@ -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
+ 国旗付きでモバイルフレンドリーなUIを備えた、国を選択するための検索可能なドロップダウン。
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
+ // Assume `availableCurrencies` is fetched from your backend
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
+ // ... other currencies
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', // Use ISO2 code
56
+ },
57
+ },
58
+ });
59
+
60
+ const onSubmit = (data) => {
61
+ console.log('Form data submitted:', 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,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="電話號碼" required />
74
+ <AddressForm mode="required" stripe={false} />
75
+ <Button type="submit" variant="contained">
76
+ 提交
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) 開始,了解如何收集帳單資訊。