diff --git a/test/api/unit/models/user.test.js b/test/api/unit/models/user.test.js index 27c61485d9..eb462a20f4 100644 --- a/test/api/unit/models/user.test.js +++ b/test/api/unit/models/user.test.js @@ -592,6 +592,20 @@ describe('User Model', () => { }); context('pre-save hook', () => { + it('enrolls users that signup through web in the Drop Cap AB test', async () => { + let user = new User(); + user.registeredThrough = 'habitica-web'; + user = await user.save(); + expect(user._ABtests.dropCapNotif).to.exist; + }); + + it('does not enroll users that signup through modal in the Drop Cap AB test', async () => { + let user = new User(); + user.registeredThrough = 'habitica-ios'; + user = await user.save(); + expect(user._ABtests.dropCapNotif).to.not.exist; + }); + it('marks the last news post as read for new users', async () => { const lastNewsPost = { _id: '1' }; sandbox.stub(NewsPost, 'lastNewsPost').returns(lastNewsPost); diff --git a/website/client/src/components/achievements/dropCapReached.vue b/website/client/src/components/achievements/dropCapReached.vue index e5f592e8fc..a804fd78fa 100644 --- a/website/client/src/components/achievements/dropCapReached.vue +++ b/website/client/src/components/achievements/dropCapReached.vue @@ -3,7 +3,7 @@ id="drop-cap-reached" size="md" :hide-header="true" - :hide-footer="!hasSubscription" + :hide-footer="hasSubscription" >
Modal > Subscriptions', }); + + this.close(); + this.$router.push('/user/settings/subscription'); }, }, }; diff --git a/website/client/src/components/header/userDropdown.vue b/website/client/src/components/header/userDropdown.vue index ec0bc2547a..6da37f6ca1 100644 --- a/website/client/src/components/header/userDropdown.vue +++ b/website/client/src/components/header/userDropdown.vue @@ -94,7 +94,7 @@ @@ -173,15 +173,15 @@ export default { showProfile (startingPage) { this.$router.push({ name: startingPage }); }, - showBuyGemsModal () { + toLearnMore () { Analytics.track({ hitType: 'event', eventCategory: 'button', eventAction: 'click', - eventLabel: 'Gems > User Dropdown', + eventLabel: 'User Dropdown > Subscriptions', }); - this.$root.$emit('bv::show::modal', 'buy-gems', { alreadyTracked: true }); + this.$router.push({ name: 'subscription' }); }, logout () { this.$store.dispatch('auth:logout'); diff --git a/website/server/middlewares/cron.js b/website/server/middlewares/cron.js index 8b8f8be59e..0d20e8923e 100644 --- a/website/server/middlewares/cron.js +++ b/website/server/middlewares/cron.js @@ -52,26 +52,6 @@ async function unlockUser (user) { }).exec(); } -// Enroll users in the Drop Cap A/B Test -function dropCapABTest (user, req) { - // Only target users that use web for cron and aren't subscribed. - // Those using mobile aren't excluded as they may use it later - const isWeb = req.headers['x-client'] === 'habitica-web'; - - if (isWeb && !user._ABtests.dropCapNotif && !user.isSubscribed()) { - const testGroup = Math.random(); - // Enroll 20% of users, splitting them 50/50 - if (testGroup <= 0.25) { - user._ABtests.dropCapNotif = 'drop-cap-notif-enabled'; - } else if (testGroup <= 0.5) { - user._ABtests.dropCapNotif = 'drop-cap-notif-disabled'; - } else { - user._ABtests.dropCapNotif = 'drop-cap-notif-not-enrolled'; - } - user.markModified('_ABtests'); - } -} - async function cronAsync (req, res) { let { user } = res.locals; if (!user) return null; // User might not be available when authentication is not mandatory @@ -86,7 +66,7 @@ async function cronAsync (req, res) { res.locals.user = user; const { daysMissed, timezoneUtcOffsetFromUserPrefs } = user.daysUserHasMissed(now, req); - dropCapABTest(user, req); + user.enrollInDropCapABTest(req.headers['x-client']); await updateLastCron(user, now); if (daysMissed <= 0) { diff --git a/website/server/models/user/hooks.js b/website/server/models/user/hooks.js index fab92c7365..5a3c67a154 100644 --- a/website/server/models/user/hooks.js +++ b/website/server/models/user/hooks.js @@ -164,6 +164,8 @@ function _setUpNewUser (user) { user.markModified('items achievements'); + user.enrollInDropCapABTest(user.registeredThrough); + if (user.registeredThrough === 'habitica-web') { taskTypes = ['habit', 'daily', 'todo', 'reward', 'tag']; diff --git a/website/server/models/user/methods.js b/website/server/models/user/methods.js index d92fd30557..fbe084b407 100644 --- a/website/server/models/user/methods.js +++ b/website/server/models/user/methods.js @@ -525,3 +525,23 @@ schema.methods.getSecretData = function getSecretData () { return user.secret; }; + +// Enroll users in the Drop Cap A/B Test +schema.methods.enrollInDropCapABTest = function enrollInDropCapABTest (xClientHeader) { + // Only target users that use web for cron and aren't subscribed. + // Those using mobile aren't excluded as they may use it later + const isWeb = xClientHeader === 'habitica-web'; + + if (isWeb && !this._ABtests.dropCapNotif && !this.isSubscribed()) { + const testGroup = Math.random(); + // Enroll 20% of users, splitting them 50/50 + if (testGroup <= 0.25) { + this._ABtests.dropCapNotif = 'drop-cap-notif-enabled'; + } else if (testGroup <= 0.5) { + this._ABtests.dropCapNotif = 'drop-cap-notif-disabled'; + } else { + this._ABtests.dropCapNotif = 'drop-cap-notif-not-enrolled'; + } + this.markModified('_ABtests'); + } +};