Files
habitica/website/client/src/components/group-plans/billing.vue
Kalista Payne 9fd0bfae46 Squashed commit of the following:
commit 05933be205
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Nov 25 11:46:16 2025 -0600

    fix(layout): contrast

commit f36f3c8a21
Author: Kalista Payne <kalista@habitica.com>
Date:   Thu Nov 20 17:29:06 2025 -0600

    fix(layout): less ridiculous flow

commit 74fcbe9494
Author: Kalista Payne <kalista@habitica.com>
Date:   Thu Nov 20 17:19:23 2025 -0600

    fix(billing): adjust placement and copy

commit c0c1ea4309
Author: Kalista Payne <kalista@habitica.com>
Date:   Thu Nov 20 10:48:45 2025 -0600

    fix(groups): fine print about billing
2025-11-25 11:47:13 -06:00

139 lines
4.4 KiB
Vue

<template>
<div
v-if="groupIsSubscribed && isLeader"
class="row standard-page"
>
<div class="col-12 col-md-6 offset-md-3">
<table class="table alert alert-info">
<tr v-if="group.purchased.plan.dateTerminated">
<td class="alert alert-warning">
<span class="noninteractive-button btn-danger">{{ $t('canceledGroupPlan') }}</span>
<i class="glyphicon glyphicon-time">{{ $t('groupPlanCanceled') }}</i>
<strong>{{ dateTerminated }}</strong>
</td>
</tr>
<tr v-if="!group.purchased.plan.dateTerminated">
<td>
<h3>{{ $t('paymentDetails') }}</h3>
<p v-if="group.purchased.plan.planId">
{{ $t('groupSubscriptionPrice') }}
</p>
</td>
</tr>
<tr v-if="group.purchased.plan.extraMonths">
<td>
<span class="glyphicon glyphicon-credit-card"></span>
{{ $t('purchasedGroupPlanPlanExtraMonths', purchasedGroupPlanPlanExtraMonths) }}
</td>
</tr>
<tr
v-if="group.purchased.plan.consecutive.count"
>
<td>
<span class="glyphicon glyphicon-forward"></span>
{{ $t('consecutiveSubscription') }}
<ul class="list-unstyled">
<li>{{ $t('consecutiveMonths') }} {{ group.purchased.plan.consecutive.count }}</li> <!-- eslint-disable-line max-len -->
<li>{{ $t('gemCapExtra') }} {{ group.purchased.plan.consecutive.gemCapExtra }}</li>
<li>{{ $t('mysticHourglasses') }} {{ group.purchased.plan.consecutive.trinkets }}</li>
</ul>
</td>
</tr>
</table>
</div>
<div class="col-12 col-md-6 offset-md-3">
<button
v-if="group.purchased.plan.dateTerminated"
class="btn btn-success btn-success"
@click="upgradeGroup()"
>
{{ $t('upgradeToGroup') }}
</button>
<div
v-if="!group.purchased.plan.dateTerminated
&& group.purchased.plan.paymentMethod === 'Stripe'"
class="btn btn-primary"
@click="redirectToStripeEdit({groupId: group.id})"
>
{{ $t('subUpdateCard') }}
</div>
<div v-if="!group.purchased.plan.dateTerminated">
<div class="small gray-50 mb-3" v-once>
{{ $t('groupPlanBillingFYIShort') }}
</div>
<div
class="btn btn-sm btn-danger"
@click="cancelSubscriptionConfirm({group: group})"
>
{{ $t('cancelGroupSub') }}
</div>
</div>
</div>
</div>
</template>
<script>
import moment from 'moment';
import { mapState } from '@/libs/store';
import paymentsMixin from '@/mixins/payments';
import { CONSTANTS, getLocalSetting, removeLocalSetting } from '@/libs/userlocalManager';
export default {
mixins: [paymentsMixin],
props: ['groupId'],
data () {
return {
group: {},
};
},
computed: {
...mapState({ user: 'user.data' }),
isLeader () {
return this.user._id === this.group.leader._id;
},
groupIsSubscribed () {
return this.group.purchased && this.group.purchased.plan
&& this.group.purchased.plan.customerId;
},
dateTerminated () {
if (!this.user.preferences || !this.user.preferences.dateFormat) {
return moment(this.group.purchased.plan.dateTerminated);
}
return moment(this.group.purchased.plan.dateTerminated)
.format(this.user.preferences.dateFormat.toUpperCase());
},
purchasedGroupPlanPlanExtraMonths () {
return {
months: parseFloat(this.group.purchased.plan.extraMonths).toFixed(2),
};
},
},
async mounted () {
await this.loadGroup();
let appState = getLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE);
if (appState) {
appState = JSON.parse(appState);
if (appState.groupPlanCanceled) {
removeLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE);
this.$root.$emit('habitica:subscription-canceled', {
dateTerminated: this.dateTerminated,
isGroup: true,
});
}
}
},
methods: {
async loadGroup () {
const group = await this.$store.dispatch('guilds:getGroup', { groupId: this.groupId });
this.group = { ...group };
},
upgradeGroup () {
this.$store.state.upgradingGroup = this.group;
this.$router.push('/group-plans');
},
},
};
</script>