You've already forked AstralRinth
forked from didirus/AstralRinth
* refactor: migrate to common eslint+prettier configs * fix: prettier frontend * feat: config changes * fix: lint issues * fix: lint * fix: type imports * fix: cyclical import issue * fix: lockfile * fix: missing dep * fix: switch to tabs * fix: continue switch to tabs * fix: rustfmt parity * fix: moderation lint issue * fix: lint issues * fix: ui intl * fix: lint issues * Revert "fix: rustfmt parity" This reverts commit cb99d2376c321d813d4b7fc7e2a213bb30a54711. * feat: revert last rs
72 lines
2.0 KiB
Vue
72 lines
2.0 KiB
Vue
<template>
|
|
<div>
|
|
<section class="card">
|
|
<Breadcrumbs
|
|
current-title="Past charges"
|
|
:link-stack="[{ href: '/settings/billing', label: 'Billing and subscriptions' }]"
|
|
/>
|
|
<h2>Past charges</h2>
|
|
<p>All of your past charges to your Modrinth account will be listed here:</p>
|
|
<div
|
|
v-for="charge in charges"
|
|
:key="charge.id"
|
|
class="universal-card recessed flex items-center justify-between gap-4"
|
|
>
|
|
<div class="flex flex-col gap-1">
|
|
<div class="flex items-center gap-1">
|
|
<span class="font-bold text-primary">
|
|
<template v-if="charge.product.metadata.type === 'midas'"> Modrinth Plus </template>
|
|
<template v-else-if="charge.product.metadata.type === 'pyro'">
|
|
Modrinth Servers
|
|
</template>
|
|
<template v-else> Unknown product </template>
|
|
<template v-if="charge.subscription_interval">
|
|
{{ charge.subscription_interval }}
|
|
</template>
|
|
</span>
|
|
⋅
|
|
<span>{{ formatPrice(vintl.locale, charge.amount, charge.currency_code) }}</span>
|
|
</div>
|
|
<div class="flex items-center gap-1">
|
|
<Badge :color="charge.status === 'succeeded' ? 'green' : 'red'" :type="charge.status" />
|
|
⋅
|
|
{{ $dayjs(charge.due).format('YYYY-MM-DD') }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
</template>
|
|
<script setup>
|
|
import { Badge, Breadcrumbs } from '@modrinth/ui'
|
|
import { formatPrice } from '@modrinth/utils'
|
|
|
|
import { products } from '~/generated/state.json'
|
|
|
|
definePageMeta({
|
|
middleware: 'auth',
|
|
})
|
|
|
|
const vintl = useVIntl()
|
|
|
|
const { data: charges } = await useAsyncData(
|
|
'billing/payments',
|
|
() => useBaseFetch('billing/payments', { internal: true }),
|
|
{
|
|
transform: (charges) => {
|
|
return charges
|
|
.filter((charge) => charge.status !== 'open' && charge.status !== 'cancelled')
|
|
.map((charge) => {
|
|
const product = products.find((product) =>
|
|
product.prices.some((price) => price.id === charge.price_id),
|
|
)
|
|
|
|
charge.product = product
|
|
|
|
return charge
|
|
})
|
|
},
|
|
},
|
|
)
|
|
</script>
|