payment-kit 1.18.18 → 1.18.19
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.
- package/api/src/libs/subscription.ts +116 -0
- package/api/src/routes/checkout-sessions.ts +28 -1
- package/api/src/routes/customers.ts +5 -1
- package/api/src/store/migrations/20250318-donate-invoice.ts +45 -0
- package/api/tests/libs/subscription.spec.ts +311 -0
- package/blocklet.yml +1 -1
- package/package.json +8 -8
- package/src/components/currency.tsx +11 -4
- package/src/components/customer/link.tsx +54 -14
- package/src/components/customer/overdraft-protection.tsx +36 -2
- package/src/components/info-card.tsx +55 -7
- package/src/components/info-row-group.tsx +122 -0
- package/src/components/info-row.tsx +14 -1
- package/src/components/payouts/portal/list.tsx +7 -2
- package/src/components/subscription/items/index.tsx +1 -1
- package/src/components/subscription/metrics.tsx +14 -6
- package/src/contexts/info-row.tsx +4 -0
- package/src/locales/en.tsx +1 -0
- package/src/locales/zh.tsx +1 -0
- package/src/pages/admin/billing/invoices/detail.tsx +54 -76
- package/src/pages/admin/billing/subscriptions/detail.tsx +34 -71
- package/src/pages/admin/customers/customers/detail.tsx +41 -64
- package/src/pages/admin/payments/intents/detail.tsx +28 -42
- package/src/pages/admin/payments/payouts/detail.tsx +27 -36
- package/src/pages/admin/payments/refunds/detail.tsx +27 -41
- package/src/pages/admin/products/links/detail.tsx +30 -55
- package/src/pages/admin/products/prices/detail.tsx +43 -50
- package/src/pages/admin/products/pricing-tables/detail.tsx +23 -25
- package/src/pages/admin/products/products/detail.tsx +52 -81
- package/src/pages/customer/index.tsx +183 -108
- package/src/pages/customer/invoice/detail.tsx +49 -50
- package/src/pages/customer/payout/detail.tsx +16 -22
- package/src/pages/customer/recharge/account.tsx +92 -34
- package/src/pages/customer/recharge/subscription.tsx +6 -0
- 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
|
-
<
|
|
248
|
+
<InfoRowGroup
|
|
225
249
|
sx={{
|
|
226
250
|
display: 'grid',
|
|
227
251
|
gridTemplateColumns: {
|
|
228
252
|
xs: 'repeat(1, 1fr)',
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
253
|
+
xl: 'repeat(2, 1fr)',
|
|
254
|
+
},
|
|
255
|
+
'@container (min-width: 1000px)': {
|
|
256
|
+
gridTemplateColumns: 'repeat(2, 1fr)',
|
|
232
257
|
},
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
214
|
-
|
|
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
|
-
</
|
|
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
|
-
<
|
|
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
|
-
<
|
|
291
|
-
|
|
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
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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
|
-
<
|
|
215
|
+
<InfoRowGroup
|
|
215
216
|
sx={{
|
|
216
217
|
display: 'grid',
|
|
217
218
|
gridTemplateColumns: {
|
|
218
219
|
xs: 'repeat(1, 1fr)',
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
220
|
+
xl: 'repeat(2, 1fr)',
|
|
221
|
+
},
|
|
222
|
+
'@container (min-width: 1000px)': {
|
|
223
|
+
gridTemplateColumns: 'repeat(2, 1fr)',
|
|
222
224
|
},
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
/>
|
|
274
|
-
|
|
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">
|