payment-kit 1.18.56 → 1.19.1

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 (214) hide show
  1. package/.eslintrc.js +6 -0
  2. package/api/src/crons/index.ts +8 -0
  3. package/api/src/index.ts +4 -0
  4. package/api/src/libs/credit-grant.ts +146 -0
  5. package/api/src/libs/env.ts +1 -0
  6. package/api/src/libs/invoice.ts +4 -3
  7. package/api/src/libs/notification/template/base.ts +388 -2
  8. package/api/src/libs/notification/template/customer-credit-grant-granted.ts +149 -0
  9. package/api/src/libs/notification/template/customer-credit-grant-low-balance.ts +151 -0
  10. package/api/src/libs/notification/template/customer-credit-insufficient.ts +254 -0
  11. package/api/src/libs/notification/template/subscription-canceled.ts +193 -202
  12. package/api/src/libs/notification/template/subscription-refund-succeeded.ts +215 -237
  13. package/api/src/libs/notification/template/subscription-renewed.ts +130 -200
  14. package/api/src/libs/notification/template/subscription-succeeded.ts +100 -202
  15. package/api/src/libs/notification/template/subscription-trial-start.ts +142 -188
  16. package/api/src/libs/notification/template/subscription-trial-will-end.ts +146 -174
  17. package/api/src/libs/notification/template/subscription-upgraded.ts +96 -192
  18. package/api/src/libs/notification/template/subscription-will-canceled.ts +94 -135
  19. package/api/src/libs/notification/template/subscription-will-renew.ts +220 -245
  20. package/api/src/libs/payment.ts +69 -0
  21. package/api/src/libs/queue/index.ts +3 -2
  22. package/api/src/libs/session.ts +8 -0
  23. package/api/src/libs/subscription.ts +74 -3
  24. package/api/src/libs/ws.ts +23 -1
  25. package/api/src/locales/en.ts +33 -0
  26. package/api/src/locales/zh.ts +31 -0
  27. package/api/src/queues/credit-consume.ts +715 -0
  28. package/api/src/queues/credit-grant.ts +572 -0
  29. package/api/src/queues/notification.ts +173 -128
  30. package/api/src/queues/payment.ts +210 -122
  31. package/api/src/queues/subscription.ts +179 -0
  32. package/api/src/routes/checkout-sessions.ts +157 -9
  33. package/api/src/routes/connect/shared.ts +3 -2
  34. package/api/src/routes/credit-grants.ts +241 -0
  35. package/api/src/routes/credit-transactions.ts +208 -0
  36. package/api/src/routes/index.ts +8 -0
  37. package/api/src/routes/meter-events.ts +347 -0
  38. package/api/src/routes/meters.ts +219 -0
  39. package/api/src/routes/payment-currencies.ts +14 -2
  40. package/api/src/routes/payment-links.ts +1 -1
  41. package/api/src/routes/payment-methods.ts +14 -2
  42. package/api/src/routes/prices.ts +43 -0
  43. package/api/src/routes/pricing-table.ts +13 -7
  44. package/api/src/routes/products.ts +63 -4
  45. package/api/src/routes/settings.ts +1 -1
  46. package/api/src/routes/subscriptions.ts +4 -0
  47. package/api/src/store/migrations/20250610-billing-credit.ts +43 -0
  48. package/api/src/store/models/credit-grant.ts +486 -0
  49. package/api/src/store/models/credit-transaction.ts +268 -0
  50. package/api/src/store/models/customer.ts +8 -0
  51. package/api/src/store/models/index.ts +52 -1
  52. package/api/src/store/models/meter-event.ts +423 -0
  53. package/api/src/store/models/meter.ts +176 -0
  54. package/api/src/store/models/payment-currency.ts +66 -14
  55. package/api/src/store/models/price.ts +6 -0
  56. package/api/src/store/models/product.ts +2 -2
  57. package/api/src/store/models/subscription.ts +24 -0
  58. package/api/src/store/models/types.ts +28 -2
  59. package/api/tests/libs/subscription.spec.ts +53 -0
  60. package/blocklet.yml +9 -1
  61. package/package.json +57 -58
  62. package/scripts/sdk.js +233 -1
  63. package/src/app.tsx +10 -0
  64. package/src/components/actions.tsx +22 -9
  65. package/src/components/balance-list.tsx +40 -12
  66. package/src/components/collapse.tsx +33 -15
  67. package/src/components/copyable.tsx +8 -7
  68. package/src/components/currency.tsx +15 -7
  69. package/src/components/customer/actions.tsx +1 -5
  70. package/src/components/customer/credit-grant-item-list.tsx +99 -0
  71. package/src/components/customer/credit-overview.tsx +233 -0
  72. package/src/components/customer/form.tsx +7 -2
  73. package/src/components/customer/link.tsx +4 -12
  74. package/src/components/customer/notification-preference.tsx +18 -9
  75. package/src/components/customer/overdraft-protection.tsx +112 -41
  76. package/src/components/drawer-form.tsx +42 -18
  77. package/src/components/error.tsx +1 -5
  78. package/src/components/event/list.tsx +9 -10
  79. package/src/components/filter-toolbar.tsx +20 -19
  80. package/src/components/info-card.tsx +32 -18
  81. package/src/components/info-metric.tsx +16 -6
  82. package/src/components/info-row-group.tsx +1 -7
  83. package/src/components/info-row.tsx +30 -24
  84. package/src/components/invoice/action.tsx +1 -7
  85. package/src/components/invoice/list.tsx +34 -26
  86. package/src/components/invoice/recharge.tsx +5 -7
  87. package/src/components/invoice/table.tsx +17 -12
  88. package/src/components/layout/user.tsx +1 -1
  89. package/src/components/metadata/form.tsx +290 -94
  90. package/src/components/metadata/list.tsx +11 -3
  91. package/src/components/meter/actions.tsx +101 -0
  92. package/src/components/meter/add-usage-dialog.tsx +239 -0
  93. package/src/components/meter/events-list.tsx +657 -0
  94. package/src/components/meter/form.tsx +245 -0
  95. package/src/components/meter/products.tsx +264 -0
  96. package/src/components/meter/usage-guide.tsx +174 -0
  97. package/src/components/passport/actions.tsx +9 -4
  98. package/src/components/payment-currency/add.tsx +16 -3
  99. package/src/components/payment-currency/form.tsx +14 -6
  100. package/src/components/payment-intent/actions.tsx +24 -16
  101. package/src/components/payment-intent/list.tsx +30 -9
  102. package/src/components/payment-link/actions.tsx +1 -5
  103. package/src/components/payment-link/after-pay.tsx +4 -2
  104. package/src/components/payment-link/before-pay.tsx +14 -4
  105. package/src/components/payment-link/item.tsx +27 -6
  106. package/src/components/payment-link/preview.tsx +9 -9
  107. package/src/components/payment-link/product-select.tsx +69 -15
  108. package/src/components/payment-method/arcblock.tsx +8 -1
  109. package/src/components/payment-method/base.tsx +8 -1
  110. package/src/components/payment-method/bitcoin.tsx +8 -1
  111. package/src/components/payment-method/ethereum.tsx +8 -1
  112. package/src/components/payment-method/evm-rpc-input.tsx +11 -7
  113. package/src/components/payment-method/form.tsx +2 -7
  114. package/src/components/payment-method/stripe.tsx +2 -0
  115. package/src/components/payouts/actions.tsx +1 -5
  116. package/src/components/payouts/list.tsx +30 -10
  117. package/src/components/payouts/portal/list.tsx +11 -9
  118. package/src/components/price/currency-select.tsx +63 -32
  119. package/src/components/price/form.tsx +895 -370
  120. package/src/components/price/upsell-select.tsx +10 -2
  121. package/src/components/price/upsell.tsx +7 -2
  122. package/src/components/pricing-table/actions.tsx +1 -5
  123. package/src/components/pricing-table/customer-settings.tsx +5 -1
  124. package/src/components/pricing-table/payment-settings.tsx +14 -4
  125. package/src/components/pricing-table/preview.tsx +9 -9
  126. package/src/components/pricing-table/price-item.tsx +6 -1
  127. package/src/components/pricing-table/product-item.tsx +6 -1
  128. package/src/components/pricing-table/product-settings.tsx +17 -4
  129. package/src/components/product/actions.tsx +1 -5
  130. package/src/components/product/add-price.tsx +9 -7
  131. package/src/components/product/create.tsx +8 -9
  132. package/src/components/product/cross-sell-select.tsx +5 -1
  133. package/src/components/product/cross-sell.tsx +7 -2
  134. package/src/components/product/edit-price.tsx +21 -12
  135. package/src/components/product/features.tsx +26 -6
  136. package/src/components/product/form.tsx +115 -72
  137. package/src/components/progress-bar.tsx +1 -1
  138. package/src/components/refund/actions.tsx +1 -7
  139. package/src/components/refund/list.tsx +31 -18
  140. package/src/components/section/header.tsx +12 -14
  141. package/src/components/subscription/actions/cancel.tsx +22 -5
  142. package/src/components/subscription/actions/index.tsx +9 -10
  143. package/src/components/subscription/actions/pause.tsx +32 -6
  144. package/src/components/subscription/actions/slash-stake.tsx +5 -3
  145. package/src/components/subscription/description.tsx +12 -8
  146. package/src/components/subscription/items/index.tsx +31 -16
  147. package/src/components/subscription/items/usage-records.tsx +19 -5
  148. package/src/components/subscription/list.tsx +5 -7
  149. package/src/components/subscription/metrics.tsx +62 -15
  150. package/src/components/subscription/portal/actions.tsx +78 -71
  151. package/src/components/subscription/portal/cancel.tsx +10 -3
  152. package/src/components/subscription/portal/list.tsx +48 -26
  153. package/src/components/uploader.tsx +5 -13
  154. package/src/components/webhook/attempts.tsx +51 -16
  155. package/src/components/webhook/request-info.tsx +8 -6
  156. package/src/contexts/products.tsx +27 -10
  157. package/src/hooks/subscription.ts +34 -0
  158. package/src/libs/meter-utils.ts +196 -0
  159. package/src/libs/util.ts +4 -0
  160. package/src/locales/en.tsx +385 -4
  161. package/src/locales/zh.tsx +364 -0
  162. package/src/pages/admin/billing/index.tsx +61 -33
  163. package/src/pages/admin/billing/invoices/detail.tsx +49 -13
  164. package/src/pages/admin/billing/meters/create.tsx +60 -0
  165. package/src/pages/admin/billing/meters/detail.tsx +435 -0
  166. package/src/pages/admin/billing/meters/index.tsx +210 -0
  167. package/src/pages/admin/billing/meters/meter-event.tsx +346 -0
  168. package/src/pages/admin/billing/subscriptions/detail.tsx +90 -25
  169. package/src/pages/admin/customers/customers/credit-grant/detail.tsx +391 -0
  170. package/src/pages/admin/customers/customers/detail.tsx +67 -14
  171. package/src/pages/admin/customers/customers/index.tsx +6 -1
  172. package/src/pages/admin/customers/index.tsx +5 -0
  173. package/src/pages/admin/developers/events/detail.tsx +37 -11
  174. package/src/pages/admin/developers/index.tsx +1 -1
  175. package/src/pages/admin/developers/webhooks/detail.tsx +41 -11
  176. package/src/pages/admin/index.tsx +15 -2
  177. package/src/pages/admin/overview.tsx +107 -19
  178. package/src/pages/admin/payments/intents/detail.tsx +58 -14
  179. package/src/pages/admin/payments/payouts/detail.tsx +63 -15
  180. package/src/pages/admin/payments/refunds/detail.tsx +58 -14
  181. package/src/pages/admin/products/index.tsx +11 -4
  182. package/src/pages/admin/products/links/create.tsx +22 -4
  183. package/src/pages/admin/products/links/detail.tsx +43 -14
  184. package/src/pages/admin/products/passports/index.tsx +23 -4
  185. package/src/pages/admin/products/prices/actions.tsx +16 -9
  186. package/src/pages/admin/products/prices/detail.tsx +73 -14
  187. package/src/pages/admin/products/prices/list.tsx +15 -3
  188. package/src/pages/admin/products/pricing-tables/create.tsx +45 -12
  189. package/src/pages/admin/products/pricing-tables/detail.tsx +45 -14
  190. package/src/pages/admin/products/products/create.tsx +233 -54
  191. package/src/pages/admin/products/products/detail.tsx +74 -18
  192. package/src/pages/admin/settings/index.tsx +8 -1
  193. package/src/pages/admin/settings/payment-methods/index.tsx +87 -19
  194. package/src/pages/admin/settings/vault-config/edit-form.tsx +42 -28
  195. package/src/pages/admin/settings/vault-config/index.tsx +57 -10
  196. package/src/pages/customer/credit-grant/detail.tsx +308 -0
  197. package/src/pages/customer/index.tsx +76 -17
  198. package/src/pages/customer/invoice/detail.tsx +63 -14
  199. package/src/pages/customer/invoice/past-due.tsx +11 -3
  200. package/src/pages/customer/payout/detail.tsx +56 -13
  201. package/src/pages/customer/recharge/account.tsx +78 -18
  202. package/src/pages/customer/recharge/subscription.tsx +86 -25
  203. package/src/pages/customer/refund/list.tsx +60 -24
  204. package/src/pages/customer/subscription/change-payment.tsx +17 -6
  205. package/src/pages/customer/subscription/change-plan.tsx +34 -7
  206. package/src/pages/customer/subscription/detail.tsx +134 -34
  207. package/src/pages/customer/subscription/embed.tsx +25 -5
  208. package/src/pages/home.tsx +26 -4
  209. package/src/pages/integrations/donations/edit-form.tsx +25 -9
  210. package/src/pages/integrations/donations/index.tsx +26 -9
  211. package/src/pages/integrations/donations/preview.tsx +59 -15
  212. package/src/pages/integrations/index.tsx +10 -1
  213. package/src/pages/integrations/overview.tsx +78 -17
  214. package/vite.config.ts +60 -30
@@ -1,26 +1,11 @@
1
1
  /* eslint-disable @typescript-eslint/brace-style */
2
2
  /* eslint-disable @typescript-eslint/indent */
3
- import prettyMsI18n from 'pretty-ms-i18n';
4
-
5
- import { getUserLocale } from '../../../integrations/blocklet/notification';
6
3
  import { translate } from '../../../locales';
7
- import {
8
- CheckoutSession,
9
- Customer,
10
- NFTMintChainType,
11
- NftMintItem,
12
- PaymentIntent,
13
- PaymentMethod,
14
- Subscription,
15
- } from '../../../store/models';
4
+ import { PaymentIntent, NftMintItem } from '../../../store/models';
16
5
  import { Invoice } from '../../../store/models/invoice';
17
- import { PaymentCurrency } from '../../../store/models/payment-currency';
18
- import { getCustomerInvoicePageUrl } from '../../invoice';
19
- import { getMainProductName } from '../../product';
20
- import { getCustomerSubscriptionPageUrl } from '../../subscription';
21
- import { formatTime, getPrettyMsI18nLocale } from '../../time';
22
- import { formatCurrencyInfo, getExplorerLink, getSubscriptionNotificationCustomActions } from '../../util';
23
- import type { BaseEmailTemplate, BaseEmailTemplateType } from './base';
6
+ import { formatTime } from '../../time';
7
+ import { formatCurrencyInfo, getExplorerLink } from '../../util';
8
+ import { BaseSubscriptionEmailTemplate, BaseEmailTemplateType } from './base';
24
9
 
25
10
  export interface SubscriptionUpgradedEmailTemplateOptions {
26
11
  subscriptionId: string;
@@ -42,123 +27,98 @@ interface SubscriptionUpgradedEmailTemplateContext {
42
27
  viewTxHashLink: string | undefined;
43
28
  skipInvoice: boolean;
44
29
  customActions: any[];
30
+ isCreditSubscription: boolean;
45
31
  }
46
32
 
47
- export class SubscriptionUpgradedEmailTemplate implements BaseEmailTemplate<SubscriptionUpgradedEmailTemplateContext> {
33
+ export class SubscriptionUpgradedEmailTemplate extends BaseSubscriptionEmailTemplate<SubscriptionUpgradedEmailTemplateContext> {
48
34
  options: SubscriptionUpgradedEmailTemplateOptions;
49
35
 
50
36
  constructor(options: SubscriptionUpgradedEmailTemplateOptions) {
37
+ super();
51
38
  this.options = options;
52
39
  }
53
40
 
54
41
  async getContext(): Promise<SubscriptionUpgradedEmailTemplateContext> {
55
- const subscription: Subscription | null = await Subscription.findByPk(this.options.subscriptionId);
56
- if (!subscription) {
57
- throw new Error(`Subscription not found: ${this.options.subscriptionId}`);
58
- }
42
+ // 获取基础订阅数据
43
+ const basicData = await this.getSubscriptionBasicData(this.options.subscriptionId);
44
+ const { subscription, userDid, locale, productName, paymentCurrency, isCreditSubscription } = basicData;
45
+
59
46
  if (!subscription.isActive()) {
60
47
  throw new Error(`Subscription not active: ${this.options.subscriptionId}`);
61
48
  }
62
49
 
63
- const customer = await Customer.findByPk(subscription.customer_id);
64
- if (!customer) {
65
- throw new Error(`Customer not found: ${subscription.customer_id}`);
66
- }
67
-
68
50
  // invoice应该是最新的subscription_update invoice
69
51
  const invoiceId = subscription.pending_update?.updates?.latest_invoice_id || subscription.latest_invoice_id;
70
52
  const invoice = (await Invoice.findByPk(invoiceId)) as Invoice;
71
53
  const skipInvoice = subscription.status === 'trialing' || invoice.billing_reason !== 'subscription_update';
72
54
  const paymentIntent = await PaymentIntent.findByPk(invoice.payment_intent_id);
73
- const paymentCurrency = (await PaymentCurrency.findOne({
74
- where: {
75
- id: subscription.currency_id,
76
- },
77
- })) as PaymentCurrency;
78
-
79
- const checkoutSession = await CheckoutSession.findBySubscriptionId(subscription.id);
80
-
81
- const userDid: string = customer.did;
82
- const locale = await getUserLocale(userDid);
83
- const productName = await getMainProductName(subscription.id);
84
- const at: string = formatTime(subscription.created_at);
85
55
 
86
- const hasNft: boolean = checkoutSession?.nft_mint_status === 'minted';
87
- const nftMintItem: NftMintItem | undefined = hasNft
88
- ? checkoutSession?.nft_mint_details?.[checkoutSession?.nft_mint_details?.type as NFTMintChainType]
89
- : undefined;
90
- const currentPeriodStart: string = formatTime(
91
- skipInvoice ? subscription.current_period_start * 1000 : invoice.period_start * 1000
92
- );
93
- const currentPeriodEnd: string = formatTime(
94
- skipInvoice ? subscription.current_period_end * 1000 : invoice.period_end * 1000
56
+ // 获取支付信息
57
+ const paymentInfoResult = await this.getPaymentInfo(
58
+ subscription,
59
+ paymentCurrency,
60
+ isCreditSubscription,
61
+ invoice?.id
95
62
  );
96
- const duration: string = prettyMsI18n(
97
- new Date(currentPeriodEnd).getTime() - new Date(currentPeriodStart).getTime(),
98
- {
99
- locale: getPrettyMsI18nLocale(locale),
100
- }
63
+
64
+ // 获取链接
65
+ const links = this.generateSubscriptionLinks(
66
+ subscription,
67
+ locale,
68
+ userDid,
69
+ 'customer.subscription.upgraded',
70
+ invoice?.id,
71
+ isCreditSubscription
101
72
  );
102
73
 
103
- const paymentMethod: PaymentMethod | null = await PaymentMethod.findByPk(invoice.default_payment_method_id);
74
+ // 获取 NFT 信息
75
+ const nftInfo = await this.getNftMintInfo(subscription.id);
104
76
 
105
- const paymentInfo: string = formatCurrencyInfo(
77
+ // 格式化支付信息
78
+ const formattedPaymentInfo = formatCurrencyInfo(
106
79
  paymentIntent?.amount || invoice.amount_paid,
107
80
  paymentCurrency,
108
- paymentMethod
81
+ paymentInfoResult.paymentMethod
109
82
  );
110
83
 
111
- // @ts-expect-error
112
- const chainHost: string | undefined = paymentMethod?.settings?.[paymentMethod.type]?.api_host;
113
- const viewSubscriptionLink = getCustomerSubscriptionPageUrl({
114
- subscriptionId: subscription.id,
115
- locale,
116
- userDid,
117
- });
118
- const viewInvoiceLink = getCustomerInvoicePageUrl({
119
- invoiceId: invoice.id,
120
- userDid,
121
- locale,
122
- });
123
-
124
- // @ts-expect-error
125
- const txHash: string | undefined = paymentIntent?.payment_details?.[paymentMethod.type]?.tx_hash;
126
- const viewTxHashLink: string | undefined =
127
- txHash &&
128
- getExplorerLink({
129
- type: 'tx',
130
- did: txHash,
131
- chainHost,
132
- });
133
-
134
- const customActions = getSubscriptionNotificationCustomActions(
135
- subscription,
136
- 'customer.subscription.upgraded',
84
+ // 格式化时间信息
85
+ const periodInfo = this.formatSubscriptionPeriod(
86
+ skipInvoice ? subscription.current_period_start : invoice.period_start,
87
+ skipInvoice ? subscription.current_period_end : invoice.period_end,
137
88
  locale
138
89
  );
139
90
 
91
+ // 获取交易哈希链接
92
+ const txHash: string | undefined = (paymentIntent?.payment_details as any)?.[
93
+ paymentInfoResult?.paymentMethod?.type as string
94
+ ]?.tx_hash;
95
+ const chainHost: string | undefined = (paymentInfoResult?.paymentMethod?.settings as any)?.[
96
+ paymentInfoResult.paymentMethod?.type as string
97
+ ]?.api_host;
98
+ const viewTxHashLink: string | undefined = txHash && getExplorerLink({ type: 'tx', did: txHash, chainHost });
99
+
140
100
  return {
141
101
  locale,
142
102
  productName,
143
- at,
144
-
103
+ at: formatTime(subscription.created_at),
145
104
  userDid,
146
- nftMintItem,
105
+ nftMintItem: nftInfo.nftMintItem,
147
106
  chainHost,
148
- paymentInfo,
149
- currentPeriodStart,
150
- currentPeriodEnd,
151
- duration,
152
-
153
- viewSubscriptionLink,
154
- viewInvoiceLink,
107
+ paymentInfo: formattedPaymentInfo,
108
+ currentPeriodStart: periodInfo.currentPeriodStart,
109
+ currentPeriodEnd: periodInfo.currentPeriodEnd,
110
+ duration: periodInfo.duration,
111
+ viewSubscriptionLink: links.viewSubscriptionLink,
112
+ viewInvoiceLink: links.viewInvoiceLink!,
155
113
  viewTxHashLink,
156
114
  skipInvoice,
157
- customActions,
115
+ customActions: links.customActions,
116
+ isCreditSubscription,
158
117
  };
159
118
  }
160
119
 
161
120
  async getTemplate(): Promise<BaseEmailTemplateType> {
121
+ const context = await this.getContext();
162
122
  const {
163
123
  locale,
164
124
  productName,
@@ -175,116 +135,60 @@ export class SubscriptionUpgradedEmailTemplate implements BaseEmailTemplate<Subs
175
135
  viewTxHashLink,
176
136
  skipInvoice,
177
137
  customActions,
178
- } = await this.getContext();
138
+ isCreditSubscription,
139
+ } = context;
140
+
141
+ // 构建基础字段
142
+ const commonFields = this.buildCommonFields(userDid, productName, locale);
143
+
144
+ // 构建支付金额字段(跳过发票时不显示)
145
+ const paymentFields = skipInvoice || isCreditSubscription ? [] : this.buildPaymentField(paymentInfo, locale, false);
146
+
147
+ // 构建有效期字段
148
+ const periodFields = this.buildPeriodField(
149
+ currentPeriodStart,
150
+ currentPeriodEnd,
151
+ duration,
152
+ locale,
153
+ isCreditSubscription
154
+ );
155
+
156
+ // 构建操作按钮
157
+ const baseActions = this.buildCommonActions(
158
+ viewSubscriptionLink,
159
+ skipInvoice ? undefined : viewInvoiceLink,
160
+ locale,
161
+ isCreditSubscription,
162
+ []
163
+ );
164
+
165
+ const additionalActions = [
166
+ !skipInvoice &&
167
+ viewTxHashLink && {
168
+ name: translate('notification.common.viewTxHash', locale),
169
+ title: translate('notification.common.viewTxHash', locale),
170
+ link: viewTxHashLink,
171
+ },
172
+ ...customActions,
173
+ ];
179
174
 
180
175
  const template: BaseEmailTemplateType = {
181
- title: `${translate('notification.subscriptionUpgraded.title', locale, {
182
- productName,
183
- })}`,
184
- body: `${translate('notification.subscriptionUpgraded.body', locale, {
185
- at,
186
- productName,
187
- })}`,
176
+ title: translate('notification.subscriptionUpgraded.title', locale, { productName }),
177
+ body: translate('notification.subscriptionUpgraded.body', locale, { at, productName }),
188
178
  // @ts-expect-error
189
179
  attachments: [
190
180
  nftMintItem &&
191
181
  chainHost && {
192
182
  type: 'asset',
193
- data: {
194
- chainHost,
195
- did: nftMintItem.address,
196
- },
183
+ data: { chainHost, did: nftMintItem.address },
197
184
  },
198
185
  {
199
186
  type: 'section',
200
- fields: [
201
- {
202
- type: 'text',
203
- data: {
204
- type: 'plain',
205
- color: '#9397A1',
206
- text: translate('notification.common.account', locale),
207
- },
208
- },
209
- {
210
- type: 'text',
211
- data: {
212
- type: 'plain',
213
- text: userDid,
214
- },
215
- },
216
- {
217
- type: 'text',
218
- data: {
219
- type: 'plain',
220
- color: '#9397A1',
221
- text: translate('notification.common.product', locale),
222
- },
223
- },
224
- {
225
- type: 'text',
226
- data: {
227
- type: 'plain',
228
- text: productName,
229
- },
230
- },
231
- ...(skipInvoice
232
- ? []
233
- : [
234
- {
235
- type: 'text',
236
- data: {
237
- type: 'plain',
238
- color: '#9397A1',
239
- text: translate('notification.common.paymentAmount', locale),
240
- },
241
- },
242
- {
243
- type: 'text',
244
- data: {
245
- type: 'plain',
246
- text: paymentInfo,
247
- },
248
- },
249
- ]),
250
- {
251
- type: 'text',
252
- data: {
253
- type: 'plain',
254
- color: '#9397A1',
255
- text: translate('notification.common.validityPeriod', locale),
256
- },
257
- },
258
- {
259
- type: 'text',
260
- data: {
261
- type: 'plain',
262
- text: `${currentPeriodStart} ~ ${currentPeriodEnd}(${duration})`,
263
- },
264
- },
265
- ].filter(Boolean),
187
+ fields: [...commonFields, ...paymentFields, ...periodFields].filter(Boolean),
266
188
  },
267
189
  ].filter(Boolean),
268
190
  // @ts-ignore
269
- actions: [
270
- {
271
- name: translate('notification.common.viewSubscription', locale),
272
- title: translate('notification.common.viewSubscription', locale),
273
- link: viewSubscriptionLink,
274
- },
275
- !skipInvoice && {
276
- name: translate('notification.common.viewInvoice', locale),
277
- title: translate('notification.common.viewInvoice', locale),
278
- link: viewInvoiceLink,
279
- },
280
- !skipInvoice &&
281
- viewTxHashLink && {
282
- name: translate('notification.common.viewTxHash', locale),
283
- title: translate('notification.common.viewTxHash', locale),
284
- link: viewTxHashLink,
285
- },
286
- ...customActions,
287
- ].filter(Boolean),
191
+ actions: [...baseActions, ...additionalActions].filter(Boolean),
288
192
  };
289
193
 
290
194
  return template;