payment-kit 1.18.18 → 1.18.20

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 (36) hide show
  1. package/api/src/libs/subscription.ts +116 -0
  2. package/api/src/routes/checkout-sessions.ts +28 -1
  3. package/api/src/routes/customers.ts +5 -1
  4. package/api/src/store/migrations/20250318-donate-invoice.ts +45 -0
  5. package/api/tests/libs/subscription.spec.ts +311 -0
  6. package/blocklet.yml +1 -1
  7. package/package.json +8 -8
  8. package/src/components/currency.tsx +11 -4
  9. package/src/components/customer/link.tsx +54 -14
  10. package/src/components/customer/overdraft-protection.tsx +36 -2
  11. package/src/components/info-card.tsx +55 -7
  12. package/src/components/info-row-group.tsx +122 -0
  13. package/src/components/info-row.tsx +14 -1
  14. package/src/components/payouts/portal/list.tsx +7 -2
  15. package/src/components/subscription/items/index.tsx +1 -1
  16. package/src/components/subscription/metrics.tsx +14 -6
  17. package/src/contexts/info-row.tsx +4 -0
  18. package/src/libs/dayjs.ts +4 -3
  19. package/src/locales/en.tsx +1 -0
  20. package/src/locales/zh.tsx +1 -0
  21. package/src/pages/admin/billing/invoices/detail.tsx +54 -76
  22. package/src/pages/admin/billing/subscriptions/detail.tsx +34 -71
  23. package/src/pages/admin/customers/customers/detail.tsx +41 -64
  24. package/src/pages/admin/payments/intents/detail.tsx +28 -42
  25. package/src/pages/admin/payments/payouts/detail.tsx +27 -36
  26. package/src/pages/admin/payments/refunds/detail.tsx +27 -41
  27. package/src/pages/admin/products/links/detail.tsx +30 -55
  28. package/src/pages/admin/products/prices/detail.tsx +43 -50
  29. package/src/pages/admin/products/pricing-tables/detail.tsx +23 -25
  30. package/src/pages/admin/products/products/detail.tsx +52 -81
  31. package/src/pages/customer/index.tsx +189 -107
  32. package/src/pages/customer/invoice/detail.tsx +49 -50
  33. package/src/pages/customer/payout/detail.tsx +16 -22
  34. package/src/pages/customer/recharge/account.tsx +119 -34
  35. package/src/pages/customer/recharge/subscription.tsx +11 -1
  36. package/src/pages/customer/subscription/detail.tsx +176 -94
@@ -36,6 +36,7 @@ import RefundList from '../../../../components/refund/list';
36
36
  import SectionHeader from '../../../../components/section/header';
37
37
  import { goBackOrFallback } from '../../../../libs/util';
38
38
  import InfoMetric from '../../../../components/info-metric';
39
+ import InfoRowGroup from '../../../../components/info-row-group';
39
40
 
40
41
  const fetchData = (id: string): Promise<TInvoiceExpanded> => {
41
42
  return api.get(`/api/invoices/${id}`).then((res) => res.data);
@@ -185,6 +186,29 @@ export default function InvoiceDetail(props: { id: string }) {
185
186
  <InfoMetric
186
187
  label={t('common.status')}
187
188
  value={<Status label={data.status} color={getInvoiceStatusColor(data.status)} />}
189
+ divider
190
+ />
191
+ {data.subscription && (
192
+ <InfoMetric
193
+ label={t('admin.subscription.name')}
194
+ value={
195
+ <Link to={`/admin/billing/${data.subscription.id}`}>
196
+ <Typography variant="body1" color="text.link">
197
+ {data.subscription.description || data.subscription.id}
198
+ </Typography>
199
+ </Link>
200
+ }
201
+ divider
202
+ />
203
+ )}
204
+ <InfoMetric label={t('common.createdAt')} value={formatTime(data.created_at)} divider />
205
+ <InfoMetric
206
+ label={t('admin.subscription.currentPeriod')}
207
+ value={
208
+ data.period_start && data.period_end
209
+ ? [formatTime(data.period_start * 1000), formatTime(data.period_end * 1000)].join(' ~ ')
210
+ : ''
211
+ }
188
212
  />
189
213
  </Stack>
190
214
  </Box>
@@ -219,83 +243,57 @@ export default function InvoiceDetail(props: { id: string }) {
219
243
  },
220
244
  }}>
221
245
  <Box flex={1} className="payment-link-column-1" sx={{ gap: 2.5, display: 'flex', flexDirection: 'column' }}>
222
- <Box className="section">
246
+ <Box className="section" sx={{ containerType: 'inline-size' }}>
223
247
  <SectionHeader title={t('admin.details')} />
224
- <Stack
248
+ <InfoRowGroup
225
249
  sx={{
226
250
  display: 'grid',
227
251
  gridTemplateColumns: {
228
252
  xs: 'repeat(1, 1fr)',
229
- sm: 'repeat(1, 1fr)',
230
- md: 'repeat(2, 1fr)',
231
- lg: 'repeat(3, 1fr)',
253
+ xl: 'repeat(2, 1fr)',
254
+ },
255
+ '@container (min-width: 1000px)': {
256
+ gridTemplateColumns: 'repeat(2, 1fr)',
232
257
  },
233
- gap: {
234
- xs: 0,
235
- md: 2,
258
+ '.info-row-wrapper': {
259
+ gap: 1,
260
+ flexDirection: {
261
+ xs: 'column',
262
+ xl: 'row',
263
+ },
264
+ alignItems: {
265
+ xs: 'flex-start',
266
+ xl: 'center',
267
+ },
268
+ '@container (min-width: 1000px)': {
269
+ flexDirection: 'row',
270
+ alignItems: 'center',
271
+ },
272
+ },
273
+ '.currency-name': {
274
+ color: 'text.secondary',
236
275
  },
237
276
  }}>
238
- <InfoRow
239
- label={t('admin.invoice.number')}
240
- value={data.number}
241
- direction={InfoDirection}
242
- alignItems={InfoAlignItems}
243
- />
244
- <InfoRow
245
- label={t('admin.invoice.description')}
246
- value={getDescription(data.description || '')}
247
- direction={InfoDirection}
248
- alignItems={InfoAlignItems}
249
- />
250
277
  <InfoRow
251
278
  label={t('admin.invoice.billTo')}
252
- value={<CustomerLink customer={data.customer} />}
253
- direction={InfoDirection}
254
- alignItems={InfoAlignItems}
255
- />
256
- <InfoRow
257
- label={t('admin.subscription.currentPeriod')}
258
- value={
259
- data.period_start && data.period_end
260
- ? [formatTime(data.period_start * 1000), formatTime(data.period_end * 1000)].join(' ~ ')
261
- : ''
262
- }
263
- direction={InfoDirection}
264
- alignItems={InfoAlignItems}
265
- />
266
- <InfoRow
267
- label={t('common.createdAt')}
268
- value={formatTime(data.created_at)}
269
- direction={InfoDirection}
270
- alignItems={InfoAlignItems}
279
+ value={<CustomerLink customer={data.customer} size={isMobile ? 'default' : 'small'} />}
271
280
  />
281
+ <InfoRow label={t('admin.invoice.from')} value={data.statement_descriptor || blocklet.appName} />
282
+ <InfoRow label={t('admin.invoice.description')} value={getDescription(data.description || '')} />
283
+
284
+ <InfoRow label={t('admin.invoice.billing')} value={data.collection_method} />
272
285
  {data.status_transitions?.finalized_at && (
273
286
  <InfoRow
274
287
  label={t('admin.invoice.finalizedAt')}
275
288
  value={formatTime(data.status_transitions.finalized_at * 1000)}
276
- direction={InfoDirection}
277
- alignItems={InfoAlignItems}
278
289
  />
279
290
  )}
280
291
  {data.status_transitions?.paid_at && (
281
- <InfoRow
282
- label={t('admin.invoice.paidAt')}
283
- value={formatTime(data.status_transitions.paid_at * 1000)}
284
- direction={InfoDirection}
285
- alignItems={InfoAlignItems}
286
- />
292
+ <InfoRow label={t('admin.invoice.paidAt')} value={formatTime(data.status_transitions.paid_at * 1000)} />
287
293
  )}
288
- <InfoRow
289
- label={t('admin.invoice.billing')}
290
- value={data.collection_method}
291
- direction={InfoDirection}
292
- alignItems={InfoAlignItems}
293
- />
294
294
  <InfoRow
295
295
  label={t('admin.paymentMethod._name')}
296
296
  value={<Currency logo={data.paymentMethod?.logo} name={data.paymentMethod?.name} />}
297
- direction={InfoDirection}
298
- alignItems={InfoAlignItems}
299
297
  />
300
298
  <InfoRow
301
299
  label={t('admin.paymentCurrency.name')}
@@ -305,15 +303,11 @@ export default function InvoiceDetail(props: { id: string }) {
305
303
  name={`${data.paymentCurrency.symbol} (${data.paymentMethod?.name})`}
306
304
  />
307
305
  }
308
- direction={InfoDirection}
309
- alignItems={InfoAlignItems}
310
306
  />
311
307
  {(!!data.paymentIntent?.payment_details?.ethereum || !!data.paymentIntent?.payment_details?.base) && (
312
308
  <InfoRow
313
309
  label={t('common.txGas')}
314
310
  value={<TxGas details={data.paymentIntent.payment_details as any} method={data.paymentMethod} />}
315
- direction={InfoDirection}
316
- alignItems={InfoAlignItems}
317
311
  />
318
312
  )}
319
313
  {data.paymentIntent && data.paymentIntent.payment_details && (
@@ -322,8 +316,6 @@ export default function InvoiceDetail(props: { id: string }) {
322
316
  value={
323
317
  <TxLink details={data.paymentIntent.payment_details} method={data.paymentMethod} mode="customer" />
324
318
  }
325
- direction={InfoDirection}
326
- alignItems={InfoAlignItems}
327
319
  />
328
320
  )}
329
321
  {['stake', 'stake_overdraft_protection'].includes(data.billing_reason) &&
@@ -338,23 +330,9 @@ export default function InvoiceDetail(props: { id: string }) {
338
330
  method={data.paymentMethod}
339
331
  />
340
332
  }
341
- direction={InfoDirection}
342
- alignItems={InfoAlignItems}
343
333
  />
344
334
  )}
345
- {data.subscription && (
346
- <InfoRow
347
- label={t('admin.subscription.name')}
348
- value={
349
- <Link to={`/admin/billing/${data.subscription.id}`}>
350
- {data.subscription.description || data.subscription.id}
351
- </Link>
352
- }
353
- direction={InfoDirection}
354
- alignItems={InfoAlignItems}
355
- />
356
- )}
357
- </Stack>
335
+ </InfoRowGroup>
358
336
  </Box>
359
337
  <Divider />
360
338
  <Box className="section">
@@ -31,14 +31,12 @@ import SubscriptionActions from '../../../../components/subscription/actions';
31
31
  import SubscriptionItemList from '../../../../components/subscription/items';
32
32
  import SubscriptionMetrics from '../../../../components/subscription/metrics';
33
33
  import { goBackOrFallback } from '../../../../libs/util';
34
+ import InfoRowGroup from '../../../../components/info-row-group';
34
35
 
35
36
  const fetchData = (id: string): Promise<TSubscriptionExpanded> => {
36
37
  return api.get(`/api/subscriptions/${id}`).then((res) => res.data);
37
38
  };
38
39
 
39
- const InfoDirection = 'column';
40
- const InfoAlignItems = 'flex-start';
41
-
42
40
  export default function SubscriptionDetail(props: { id: string }) {
43
41
  const { t } = useLocaleContext();
44
42
  const { isMobile } = useMobile();
@@ -190,58 +188,47 @@ export default function SubscriptionDetail(props: { id: string }) {
190
188
  },
191
189
  }}>
192
190
  <Box flex={1} className="payment-link-column-1" sx={{ gap: 2.5, display: 'flex', flexDirection: 'column' }}>
193
- <Box className="section">
194
- <SectionHeader title={t('admin.details')}>
195
- {/* <Button
196
- variant="text"
197
- color="inherit"
198
- size="small"
199
- sx={{ color: 'text.link' }}
200
- onClick={() => setState((prev) => ({ editing: { ...prev.editing, product: true } }))}>
201
- {t('common.edit')}
202
- </Button> */}
203
- </SectionHeader>
204
- <Stack
191
+ <Box className="section" sx={{ containerType: 'inline-size' }}>
192
+ <SectionHeader title={t('admin.details')} />
193
+ <InfoRowGroup
205
194
  sx={{
206
195
  display: 'grid',
207
196
  gridTemplateColumns: {
208
197
  xs: 'repeat(1, 1fr)',
209
- sm: 'repeat(1, 1fr)',
210
- md: 'repeat(2, 1fr)',
211
- lg: 'repeat(3, 1fr)',
198
+ xl: 'repeat(2, 1fr)',
199
+ },
200
+ '@container (min-width: 1000px)': {
201
+ gridTemplateColumns: 'repeat(2, 1fr)',
202
+ },
203
+ '.info-row-wrapper': {
204
+ gap: 1,
205
+ flexDirection: {
206
+ xs: 'column',
207
+ xl: 'row',
208
+ },
209
+ alignItems: {
210
+ xs: 'flex-start',
211
+ xl: 'center',
212
+ },
213
+ '@container (min-width: 1000px)': {
214
+ flexDirection: 'row',
215
+ alignItems: 'center',
216
+ },
212
217
  },
213
- gap: {
214
- xs: 0,
215
- md: 2,
218
+ '.currency-name': {
219
+ color: 'text.secondary',
216
220
  },
217
221
  }}>
218
222
  <InfoRow
219
223
  label={t('common.customer')}
220
- value={<CustomerLink customer={data.customer} />}
221
- direction={InfoDirection}
222
- alignItems={InfoAlignItems}
224
+ value={<CustomerLink customer={data.customer} size={isMobile ? 'default' : 'small'} />}
223
225
  />
224
- <InfoRow
225
- label={t('common.createdAt')}
226
- value={formatTime(data.created_at)}
227
- direction={InfoDirection}
228
- alignItems={InfoAlignItems}
229
- />
230
- {data.status === 'paused' && !!data.pause_collection?.resumes_at && (
231
- <InfoRow
232
- label={t('common.resumesAt')}
233
- value={formatTime(data.pause_collection.resumes_at * 1000)}
234
- direction={InfoDirection}
235
- alignItems={InfoAlignItems}
236
- />
237
- )}
226
+ <InfoRow label={t('common.createdAt')} value={formatTime(data.created_at)} />
238
227
  <InfoRow
239
228
  label={t('admin.subscription.currentPeriod')}
240
229
  value={[formatTime(data.current_period_start * 1000), formatTime(data.current_period_end * 1000)].join(
241
230
  ' ~ '
242
231
  )}
243
- direction={InfoDirection}
244
- alignItems={InfoAlignItems}
245
232
  />
246
233
  <InfoRow
247
234
  label={t('admin.subscription.trialingPeriod')}
@@ -250,21 +237,12 @@ export default function SubscriptionDetail(props: { id: string }) {
250
237
  ? [formatTime(data.trial_start * 1000), formatTime(data.trial_end * 1000)].join(' ~ ')
251
238
  : ''
252
239
  }
253
- direction={InfoDirection}
254
- alignItems={InfoAlignItems}
255
- />
256
- <InfoRow
257
- label={t('admin.subscription.discount')}
258
- value={data.discount_id ? data.discount_id : ''}
259
- direction={InfoDirection}
260
- alignItems={InfoAlignItems}
261
- />
262
- <InfoRow
263
- label={t('admin.subscription.collectionMethod')}
264
- value={data.collection_method}
265
- direction={InfoDirection}
266
- alignItems={InfoAlignItems}
267
240
  />
241
+ {data.status === 'paused' && !!data.pause_collection?.resumes_at && (
242
+ <InfoRow label={t('common.resumesAt')} value={formatTime(data.pause_collection.resumes_at * 1000)} />
243
+ )}
244
+ <InfoRow label={t('admin.subscription.collectionMethod')} value={data.collection_method} />
245
+ <InfoRow label={t('admin.subscription.discount')} value={data.discount_id ? data.discount_id : ''} />
268
246
  <InfoRow
269
247
  label={t('admin.paymentCurrency.name')}
270
248
  value={
@@ -273,15 +251,11 @@ export default function SubscriptionDetail(props: { id: string }) {
273
251
  name={`${data.paymentCurrency.symbol} (${data.paymentMethod?.name})`}
274
252
  />
275
253
  }
276
- direction={InfoDirection}
277
- alignItems={InfoAlignItems}
278
254
  />
279
255
  {data.payment_details && hasDelegateTxHash(data.payment_details, data.paymentMethod) && (
280
256
  <InfoRow
281
257
  label={t('common.delegateTxHash')}
282
258
  value={<TxLink details={data.payment_details} method={data.paymentMethod} />}
283
- direction={InfoDirection}
284
- alignItems={InfoAlignItems}
285
259
  />
286
260
  )}
287
261
  {data.paymentMethod?.type === 'arcblock' && data.payment_details?.arcblock?.staking?.tx_hash && (
@@ -293,18 +267,9 @@ export default function SubscriptionDetail(props: { id: string }) {
293
267
  method={data.paymentMethod}
294
268
  />
295
269
  }
296
- direction={InfoDirection}
297
- alignItems={InfoAlignItems}
298
- />
299
- )}
300
- {!!data.description && (
301
- <InfoRow
302
- label={t('common.description')}
303
- value={data.description}
304
- direction={InfoDirection}
305
- alignItems={InfoAlignItems}
306
270
  />
307
271
  )}
272
+ {!!data.description && <InfoRow label={t('common.description')} value={data.description} />}
308
273
  {!!data.recovered_from && (
309
274
  <InfoRow
310
275
  label={t('common.recoverFrom')}
@@ -313,11 +278,9 @@ export default function SubscriptionDetail(props: { id: string }) {
313
278
  {data.recovered_from}
314
279
  </Link>
315
280
  }
316
- direction={InfoDirection}
317
- alignItems={InfoAlignItems}
318
281
  />
319
282
  )}
320
- </Stack>
283
+ </InfoRowGroup>
321
284
  </Box>
322
285
  <Divider />
323
286
  <Box className="section">
@@ -34,6 +34,7 @@ import SectionHeader from '../../../../components/section/header';
34
34
  import SubscriptionList from '../../../../components/subscription/list';
35
35
  import { goBackOrFallback } from '../../../../libs/util';
36
36
  import MetadataList from '../../../../components/metadata/list';
37
+ import InfoRowGroup from '../../../../components/info-row-group';
37
38
 
38
39
  const fetchData = async (
39
40
  id: string
@@ -278,76 +279,52 @@ export default function CustomerDetail(props: { id: string }) {
278
279
  },
279
280
  }}>
280
281
  <Box flex={1} className="payment-link-column-1" sx={{ gap: 2.5, display: 'flex', flexDirection: 'column' }}>
281
- <Box className="section">
282
+ <Box className="section" sx={{ containerType: 'inline-size' }}>
282
283
  <SectionHeader title={t('admin.details')} />
283
- <Stack>
284
+ <InfoRowGroup
285
+ sx={{
286
+ display: 'grid',
287
+ gridTemplateColumns: {
288
+ xs: 'repeat(1, 1fr)',
289
+ xxl: 'repeat(2, 1fr)',
290
+ },
291
+ '@container (min-width: 1050px)': {
292
+ gridTemplateColumns: 'repeat(2, 1fr)',
293
+ },
294
+ '.info-row-wrapper': {
295
+ gap: 1,
296
+ flexDirection: {
297
+ xs: 'column',
298
+ xxl: 'row',
299
+ },
300
+ alignItems: {
301
+ xs: 'flex-start',
302
+ xxl: 'center',
303
+ },
304
+ '@container (min-width: 1050px)': {
305
+ flexDirection: 'row',
306
+ alignItems: 'center',
307
+ },
308
+ },
309
+ }}>
284
310
  <InfoRow
285
311
  label={t('common.did')}
286
312
  value={<DidAddress did={data.customer.did} chainId={livemode ? 'main' : 'beta'} showQrcode />}
287
- direction={InfoDirection}
288
- alignItems={InfoAlignItems}
289
313
  />
290
- <Box
291
- sx={{
292
- display: 'grid',
293
- gridTemplateColumns: {
294
- xs: 'repeat(1, 1fr)',
295
- sm: 'repeat(1, 1fr)',
296
- md: 'repeat(2, 1fr)',
297
- lg: 'repeat(3, 1fr)',
298
- },
299
- gap: {
300
- xs: 0,
301
- md: 2,
302
- },
303
- }}>
304
- <InfoRow
305
- label={t('admin.customer.name')}
306
- value={data.customer.name}
307
- direction={InfoDirection}
308
- alignItems={InfoAlignItems}
309
- />
310
- <InfoRow
311
- label={t('admin.customer.phone')}
312
- value={data.customer.phone}
313
- direction={InfoDirection}
314
- alignItems={InfoAlignItems}
315
- />
316
- <InfoRow
317
- label={t('admin.customer.email')}
318
- value={data.customer.email}
319
- direction={InfoDirection}
320
- alignItems={InfoAlignItems}
321
- />
322
- <InfoRow
323
- label={t('admin.customer.invoicePrefix')}
324
- value={data.customer.invoice_prefix}
325
- direction={InfoDirection}
326
- alignItems={InfoAlignItems}
327
- />
328
- <InfoRow
329
- label={t('common.createdAt')}
330
- value={formatTime(data.customer.created_at)}
331
- direction={InfoDirection}
332
- alignItems={InfoAlignItems}
333
- />
334
- <InfoRow
335
- label={t('common.updatedAt')}
336
- value={formatTime(data.customer.updated_at)}
337
- direction={InfoDirection}
338
- alignItems={InfoAlignItems}
339
- />
314
+ <InfoRow label={t('admin.customer.name')} value={data.customer.name} />
315
+ <InfoRow label={t('common.createdAt')} value={formatTime(data.customer.created_at)} />
340
316
 
341
- {state.editing.customer && (
342
- <EditCustomer
343
- data={data.customer}
344
- loading={state.loading.customer}
345
- onSave={onUpdateInfo}
346
- onCancel={() => setState((prev) => ({ editing: { ...prev.editing, customer: false } }))}
347
- />
348
- )}
349
- </Box>
350
- </Stack>
317
+ <InfoRow label={t('admin.customer.invoicePrefix')} value={data.customer.invoice_prefix} />
318
+ <InfoRow label={t('common.updatedAt')} value={formatTime(data.customer.updated_at)} />
319
+ {state.editing.customer && (
320
+ <EditCustomer
321
+ data={data.customer}
322
+ loading={state.loading.customer}
323
+ onSave={onUpdateInfo}
324
+ onCancel={() => setState((prev) => ({ editing: { ...prev.editing, customer: false } }))}
325
+ />
326
+ )}
327
+ </InfoRowGroup>
351
328
  </Box>
352
329
  <Divider />
353
330
  <Box className="section">
@@ -33,6 +33,7 @@ import PayoutList from '../../../../components/payouts/list';
33
33
  import SectionHeader from '../../../../components/section/header';
34
34
  import { goBackOrFallback } from '../../../../libs/util';
35
35
  import RefundList from '../../../../components/refund/list';
36
+ import InfoRowGroup from '../../../../components/info-row-group';
36
37
 
37
38
  const fetchData = (id: string): Promise<TPaymentIntentExpanded> => {
38
39
  return api.get(`/api/payment-intents/${id}`).then((res) => res.data);
@@ -209,29 +210,34 @@ export default function PaymentIntentDetail(props: { id: string }) {
209
210
  },
210
211
  }}>
211
212
  <Box flex={1} className="payment-link-column-1" sx={{ gap: 2.5, display: 'flex', flexDirection: 'column' }}>
212
- <Box className="section">
213
+ <Box className="section" sx={{ containerType: 'inline-size' }}>
213
214
  <SectionHeader title={t('admin.details')} />
214
- <Stack
215
+ <InfoRowGroup
215
216
  sx={{
216
217
  display: 'grid',
217
218
  gridTemplateColumns: {
218
219
  xs: 'repeat(1, 1fr)',
219
- sm: 'repeat(1, 1fr)',
220
- md: 'repeat(2, 1fr)',
221
- lg: 'repeat(3, 1fr)',
220
+ xl: 'repeat(2, 1fr)',
221
+ },
222
+ '@container (min-width: 1000px)': {
223
+ gridTemplateColumns: 'repeat(2, 1fr)',
222
224
  },
223
- gap: {
224
- xs: 0,
225
- md: 2,
225
+ '.info-row-wrapper': {
226
+ gap: 1,
227
+ flexDirection: {
228
+ xs: 'column',
229
+ xl: 'row',
230
+ },
231
+ alignItems: {
232
+ xs: 'flex-start',
233
+ xl: 'center',
234
+ },
235
+ '@container (min-width: 1000px)': {
236
+ flexDirection: 'row',
237
+ alignItems: 'center',
238
+ },
226
239
  },
227
240
  }}>
228
- <InfoRow label={t('common.amount')} value={total} direction={InfoDirection} alignItems={InfoAlignItems} />
229
- <InfoRow
230
- label={t('admin.paymentIntent.received')}
231
- value={received}
232
- direction={InfoDirection}
233
- alignItems={InfoAlignItems}
234
- />
235
241
  <InfoRow
236
242
  label={t('common.status')}
237
243
  value={
@@ -256,34 +262,14 @@ export default function PaymentIntentDetail(props: { id: string }) {
256
262
  )}
257
263
  </Stack>
258
264
  }
259
- direction={InfoDirection}
260
- alignItems={InfoAlignItems}
261
- />
262
- <InfoRow
263
- label={t('common.description')}
264
- value={data.description}
265
- direction={InfoDirection}
266
- alignItems={InfoAlignItems}
267
265
  />
268
- <InfoRow
269
- label={t('common.statementDescriptor')}
270
- value={data.statement_descriptor}
271
- direction={InfoDirection}
272
- alignItems={InfoAlignItems}
273
- />
274
- <InfoRow
275
- label={t('common.createdAt')}
276
- value={formatTime(data.created_at)}
277
- direction={InfoDirection}
278
- alignItems={InfoAlignItems}
279
- />
280
- <InfoRow
281
- label={t('common.updatedAt')}
282
- value={formatTime(data.updated_at)}
283
- direction={InfoDirection}
284
- alignItems={InfoAlignItems}
285
- />
286
- </Stack>
266
+ <InfoRow label={t('common.amount')} value={total} />
267
+ <InfoRow label={t('admin.paymentIntent.received')} value={received} />
268
+ <InfoRow label={t('common.createdAt')} value={formatTime(data.created_at)} />
269
+ <InfoRow label={t('common.description')} value={data.description} />
270
+ <InfoRow label={t('common.updatedAt')} value={formatTime(data.updated_at)} />
271
+ <InfoRow label={t('common.statementDescriptor')} value={data.statement_descriptor} />
272
+ </InfoRowGroup>
287
273
  </Box>
288
274
  <Divider />
289
275
  <Box className="section">