Ghost/ghost/admin/app/controllers/offers.js
Simon Backx bc79293594
Fixed generating offers in data generator (#19495)
no issue

The data generator created an offer for the free product. This caused an
error in admin UI because it couldn't find the tier for the offer.

This fixes the issue in both the data generator and the admin UI.
2024-01-16 13:53:34 +00:00

94 lines
2.6 KiB
JavaScript

import Controller from '@ember/controller';
import LinkOfferModal from '../components/modals/offers/link';
import {action} from '@ember/object';
import {inject as service} from '@ember/service';
import {task} from 'ember-concurrency';
import {tracked} from '@glimmer/tracking';
const TYPES = [{
name: 'Active',
value: 'active'
},{
name: 'Archived',
value: 'archived'
}];
export default class MembersController extends Controller {
@service modals;
@service router;
@service membersUtils;
@tracked offers = [];
@tracked tiers = [];
@tracked type = 'active';
queryParams = [
'type'
];
constructor() {
super(...arguments);
this.availableTypes = TYPES;
}
get filteredOffers() {
return this.offers.filter((offer) => {
const tier = this.tiers.find((p) => {
return p.id === offer.tier.id;
});
if (!tier) {
return false;
}
const price = offer.cadence === 'month' ? tier.monthlyPrice : tier.yearlyPrice;
return !!tier && tier.active && offer.status === this.type && !!price;
}).map((offer) => {
const tier = this.tiers.find((p) => {
return p.id === offer.tier.id;
});
if (!tier) {
return offer;
}
const price = offer.cadence === 'month' ? tier.monthlyPrice : tier.yearlyPrice;
offer.finalCurrency = offer.currency || tier.currency;
offer.originalPrice = price;
if (offer.type !== 'trial') {
offer.updatedPrice = offer.type === 'fixed' ? (price - offer.amount) : (price - ((price * offer.amount) / 100));
} else {
offer.updatedPrice = offer.originalPrice;
}
return offer;
});
}
get offersExist() {
return this.offers.length > 0;
}
get selectedType() {
return this.type ? TYPES.find((d) => {
return this.type === d.value;
}) : TYPES[0];
}
@action
onTypeChange(type) {
this.type = type.value;
}
@action
openLinkDialog(offer) {
this.advancedModal = this.modals.open(LinkOfferModal, {
offer: offer
});
}
@task({restartable: true})
*fetchOffersTask() {
this.tiers = yield this.store.query('tier', {
filter: 'type:paid', include: 'monthly_price,yearly_price'
});
this.offers = yield this.store.query('offer', {limit: 'all'});
return this.offers;
}
}