UNPKG

@blocklet/payment-react

Version:

Reusable react components for payment kit v2

197 lines (143 loc) 6.13 kB
# 工具函数 `@blocklet/payment-react` 库导出了一套工具函数和类,旨在简化常见任务,例如发出 API 请求、管理缓存、处理日期、格式化价格和设置国际化。这些工具旨在与库的组件和提供程序无缝协作。 ## API 客户端 该库提供了一个预配置的 Axios 实例,用于向你的支付后端发出 API 请求。它会自动处理基本 URL 和其他必要的配置。 ```tsx API Client Usage icon=logos:javascript import { api } from '@blocklet/payment-react'; // 基本的 GET 请求 const getPayments = async () => { const response = await api.get('/api/payments'); return response.data; }; // 带负载的 POST 请求 const createCheckout = async (amount) => { const data = await api.post('/api/checkout', { amount }); return data; }; // 带查询参数的 GET 请求 const getPaidInvoices = async () => { const results = await api.get('/api/invoices', { params: { status: 'paid' } }); return results.data; }; // 带附加配置的 PUT 请求 const updateSubscription = async (data) => { const config = { headers: { 'Custom-Header': 'value' } }; const response = await api.put('/api/subscription', data, config); return response.data; }; ``` ## CachedRequest 为了优化性能并减少冗余的网络请求,你可以使用 `CachedRequest` 类。它提供了一种简单的方法来缓存数据,具有可配置的策略和生存时间(TTL)。 ### 配置选项 在创建 `CachedRequest` 实例时,你可以提供以下选项: | 选项 | 类型 | 描述 | 默认值 | | :--- | :--- | :--- | :--- | | `strategy` | `'session' \| 'local' \| 'memory'` | 缓存的存储机制。 | `'session'` | | `ttl` | `number` | 缓存的生存时间(毫秒)。值为 `0` 表示永不过期。 | `0` | ### 使用示例 以下是如何创建和使用缓存请求来获取产品价格的示例。 ```tsx CachedRequest Example icon=logos:javascript import { CachedRequest, api } from '@blocklet/payment-react'; // 1. 创建一个缓存请求实例 const priceRequest = new CachedRequest( 'product-prices', () => api.get('/api/prices'), { strategy: 'session', // 在 sessionStorage 中缓存数据 ttl: 5 * 60 * 1000 // 缓存 5 分钟 } ); // 2. 在你的组件中使用缓存请求 async function fetchPrices() { // 如果缓存可用且未过期,将使用缓存 const prices = await priceRequest.fetch(); // 绕过缓存并强制获取新数据 const freshPrices = await priceRequest.fetch(true); return prices; } // 3. 当数据发生变化时清除缓存 async function updatePrices() { await api.post('/api/prices', newPriceData); priceRequest.clearCache(); // 或者 await priceRequest.fetch(true); } ``` ## 日期处理 该库重新导出了一个预配置的 `dayjs` 实例,其中已包含 `relativeTime`、`utc` 和 `timezone` 等有用的插件。你可以用它来满足任何日期和时间操作的需求。 ```tsx Date Handling with dayjs icon=logos:javascript import { dayjs } from '@blocklet/payment-react'; // 格式化当前日期 const formattedDate = dayjs().format('YYYY-MM-DD HH:mm'); // 解析时间戳 const dateFromTimestamp = dayjs(1672531200000); const unixTimestamp = dateFromTimestamp.unix(); // 计算相对时间 const fiveMinutesAgo = dayjs().subtract(5, 'minute'); const relativeTime = dayjs().from(fiveMinutesAgo); // "5 分钟前" ``` ## 国际化 (i18n) `@blocklet/payment-react` 内置了对 i18n 的支持。你可以创建自己的翻译器,也可以将你的翻译与库的默认翻译合并。 ### 创建翻译器 使用 `createTranslator` 函数来设置你自己的翻译实例。 ```tsx Custom Translator Setup icon=logos:javascript import { createTranslator } from '@blocklet/payment-react'; const myTranslations = { en: { checkout: { title: 'Complete Payment' } }, zh: { checkout: { title: '完成支付' } } }; const translator = createTranslator({ fallbackLocale: 'en' }, myTranslations); translator('checkout.title', 'zh'); // '完成支付' ``` ### 与库翻译合并 为了在添加自己的翻译的同时利用库为组件提供的内置翻译,你可以将它们合并在一起。 ```tsx Merging Translations icon=logos:javascript import { translations as paymentTranslations } from '@blocklet/payment-react'; import merge from 'lodash/merge'; // 你的应用程序的翻译 import en from './locales/en'; import zh from './locales/zh'; export const translations = merge( { en, zh, }, paymentTranslations ); ``` ## 格式化工具 有几个辅助函数可用于格式化数据显示。 | 函数 | 描述 | | :--- | :--- | | `formatPrice` | 将价格对象格式化为人类可读的字符串,并考虑重复周期。 | | `formatRecurring` | 将重复周期对象格式化为“每月”或“每 3 个月”之类的字符串。 | | `formatBNStr` | 将 BigNumber 字符串从基本单位格式化为具有指定精度的代币值。 | | `formatNumber` | 使用千位分隔符和指定精度格式化数字或字符串。 | | `formatError` | 将各种错误格式(GraphQL、Joi、Axios)解析为可读的字符串。 | ```tsx Formatting Example icon=logos:javascript import { formatNumber, formatRecurring } from '@blocklet/payment-react'; // 格式化数字 const formatted = formatNumber('1234567.89123', 2); // "1,234,567.89" // 格式化重复周期 const monthly = formatRecurring({ interval: 'month', interval_count: 1 }); // "每月" const quarterly = formatRecurring({ interval: 'month', interval_count: 3 }); // "每季度" ``` ## 验证工具 该库还包含用于表单验证的辅助函数。 ### `validatePostalCode` 检查给定的邮政编码对于特定国家是否有效。 ```tsx Postal Code Validation icon=logos:javascript import { validatePostalCode } from '@blocklet/payment-react'; // 返回 true const isValidUS = validatePostalCode('90210', 'US'); // 返回 false const isInvalidUS = validatePostalCode('ABC-123', 'US'); // 对于英国邮政编码,返回 true const isValidGB = validatePostalCode('SW1A 0AA', 'GB'); ```