import Service, {inject as service} from '@ember/service'; export default class MembersUtilsService extends Service { @service config; @service settings; @service feature; @service store; get isMembersEnabled() { return this.settings.get('membersSignupAccess') !== 'none'; } get isStripeEnabled() { const stripeDirect = this.config.get('stripeDirect'); const hasDirectKeys = !!this.settings.get('stripeSecretKey') && !!this.settings.get('stripePublishableKey'); const hasConnectKeys = !!this.settings.get('stripeConnectSecretKey') && !!this.settings.get('stripeConnectPublishableKey'); if (stripeDirect) { return hasDirectKeys; } return hasConnectKeys || hasDirectKeys; } // Button / Icon helpers --------------------------------------------------- get defaultButtonIcons() { return [ { icon: 'portal-icon-1', value: 'icon-1' }, { icon: 'portal-icon-2', value: 'icon-2' }, { icon: 'portal-icon-3', value: 'icon-3' }, { icon: 'portal-icon-4', value: 'icon-4' }, { icon: 'portal-icon-5', value: 'icon-5' } ]; } get defaultIconKeys() { return this.defaultButtonIcons.map(buttonIcon => buttonIcon.value); } get buttonIcon() { return this.settings.get('portalButtonIcon') || this.defaultIconKeys[0]; } // Plan helpers ------------------------------------------------------------ get isFreeChecked() { const allowedPlans = this.settings.get('portalPlans') || []; return !!(this.settings.get('membersSignupAccess') === 'all' && allowedPlans.includes('free')); } get isMonthlyChecked() { const allowedPlans = this.settings.get('portalPlans') || []; return !!(this.isStripeConfigured && allowedPlans.includes('monthly')); } get isYearlyChecked() { const allowedPlans = this.settings.get('portalPlans') || []; return !!(this.isStripeConfigured && allowedPlans.includes('yearly')); } // Portal preview ---------------------------------------------------------- getPortalPreviewUrl(overrides) { let { disableBackground = false, page = 'signup', button = this.settings.get('portalButton'), buttonIcon = this.buttonIcon, isFreeChecked = this.isFreeChecked, isMonthlyChecked = this.isMonthlyChecked, isYearlyChecked = this.isYearlyChecked, monthlyPrice, yearlyPrice, portalPlans = this.settings.get('portalPlans'), portalProducts, currency, membersSignupAccess = this.settings.get('membersSignupAccess') } = overrides; const tiers = this.store.peekAll('product') || []; portalProducts = portalProducts || tiers.filter((t) => { return t.visibility === 'public' && t.type === 'paid'; }).map(t => t.id); const baseUrl = this.config.get('blogUrl'); const portalBase = '/#/portal/preview'; const settingsParam = new URLSearchParams(); const signupButtonText = this.settings.get('portalButtonSignupText') || ''; const allowSelfSignup = membersSignupAccess === 'all' && (!this.isStripeEnabled || isFreeChecked); settingsParam.append('button', button); settingsParam.append('name', this.settings.get('portalName')); settingsParam.append('isFree', isFreeChecked); settingsParam.append('isMonthly', isMonthlyChecked); settingsParam.append('isYearly', isYearlyChecked); settingsParam.append('page', page); settingsParam.append('buttonIcon', encodeURIComponent(buttonIcon)); settingsParam.append('signupButtonText', encodeURIComponent(signupButtonText)); settingsParam.append('membersSignupAccess', membersSignupAccess); settingsParam.append('allowSelfSignup', allowSelfSignup); if (portalPlans) { settingsParam.append('portalPrices', encodeURIComponent(portalPlans)); } if (portalProducts && this.feature.get('multipleProducts')) { settingsParam.append('portalProducts', encodeURIComponent(portalProducts)); } if (this.settings.get('accentColor') === '' || this.settings.get('accentColor')) { settingsParam.append('accentColor', encodeURIComponent(`${this.settings.get('accentColor')}`)); } if (this.settings.get('portalButtonStyle')) { settingsParam.append('buttonStyle', encodeURIComponent(this.settings.get('portalButtonStyle'))); } if (monthlyPrice) { settingsParam.append('monthlyPrice', monthlyPrice); } if (yearlyPrice) { settingsParam.append('yearlyPrice', yearlyPrice); } if (currency) { settingsParam.append('currency', currency); } if (disableBackground) { settingsParam.append('disableBackground', true); } return `${baseUrl}${portalBase}?${settingsParam.toString()}`; } getOfferPortalPreviewUrl(overrides) { const { disableBackground = false, name, code, displayTitle = '', displayDescription = '', type, cadence, amount = 0, duration, durationInMonths, currency = 'usd', status, tierId } = overrides; const baseUrl = this.config.get('blogUrl'); const portalBase = '/#/portal/preview/offer'; const settingsParam = new URLSearchParams(); settingsParam.append('name', encodeURIComponent(name)); settingsParam.append('code', encodeURIComponent(code)); settingsParam.append('display_title', encodeURIComponent(displayTitle)); settingsParam.append('display_description', encodeURIComponent(displayDescription)); settingsParam.append('type', encodeURIComponent(type)); settingsParam.append('cadence', encodeURIComponent(cadence)); settingsParam.append('amount', encodeURIComponent(amount)); settingsParam.append('duration', encodeURIComponent(duration)); settingsParam.append('duration_in_months', encodeURIComponent(durationInMonths)); settingsParam.append('currency', encodeURIComponent(currency)); settingsParam.append('status', encodeURIComponent(status)); settingsParam.append('tier_id', encodeURIComponent(tierId)); if (disableBackground) { settingsParam.append('disableBackground', 'true'); } return `${baseUrl}${portalBase}?${settingsParam.toString()}`; } }