跳到主要內容

工具程式

@blocklet/payment-react 函式庫匯出一系列工具函式與類別,旨在簡化常見任務,如發送 API 請求、管理快取、處理日期、格式化價格以及設定國際化。這些工具的設計能與函式庫的元件和提供者無縫協作。

API 客戶端

該函式庫提供了一個預先設定的 Axios 實例,可用於向您的支付後端發送 API 請求。它會自動處理基礎 URL 和其他必要的設定。

API Client Usage

tsx
import { api } from '@blocklet/payment-react';

// 基本的 GET 請求
const getPayments = async () => {
  const response = await api.get('/api/payments');
  return response.data;
};

// 帶有 payload 的 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 實例時,您可以提供以下選項:

OptionTypeDescriptionDefault
strategy'session' | 'local' | 'memory'快取的儲存機制。'session'
ttlnumber快取的存留時間(毫秒)。值為 0 表示永不過期。0

使用範例

以下是如何建立和使用快取請求來擷取產品價格。

CachedRequest Example

tsx
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 實例,其中已包含 relativeTimeutctimezone 等實用外掛程式。您可以用它來滿足任何日期和時間的操作需求。

Date Handling with dayjs

tsx
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 函式來設定您自己的翻譯實例。

Custom Translator Setup

tsx
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'); // '完成支付'

與函式庫翻譯合併

為利用函式庫為元件提供的內建翻譯,同時加入您自己的翻譯,您可以將它們合併在一起。

Merging Translations

tsx
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
);

格式化工具程式

提供數個輔助函式可用於格式化顯示資料。

FunctionDescription
formatPrice將價格物件格式化為人類可讀的字串,同時考慮定期區間。
formatRecurring將定期物件格式化為「每月」或「每 3 個月」等字串。
formatBNStr將 BigNumber 字串從基本單位格式化為具有指定精度的代幣值。
formatNumber將數字或字串格式化,加上千分位分隔符和精度。
formatError將各種錯誤格式(GraphQL、Joi、Axios)解析為可讀的字串。

Formatting Example

tsx
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

檢查給定的郵遞區號對於特定國家是否有效。

Postal Code Validation

tsx
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');