diff --git a/test/client/unit/specs/store/getters/members/hasClass.js b/test/client/unit/specs/store/getters/members/hasClass.js new file mode 100644 index 0000000000..2aad254f0f --- /dev/null +++ b/test/client/unit/specs/store/getters/members/hasClass.js @@ -0,0 +1,63 @@ +import { hasClass } from 'client/store/getters/members'; + +describe('hasClass getter', () => { + it('returns false if level < 10', () => { + const member = { + stats: { + lvl: 5, + }, + preferences: { + disableClasses: false, + }, + flags: { + classSelected: true, + }, + }; + expect(hasClass()(member)).to.equal(false); + }); + + it('returns false if member has disabled classes', () => { + const member = { + stats: { + lvl: 10, + }, + preferences: { + disableClasses: true, + }, + flags: { + classSelected: true, + }, + }; + expect(hasClass()(member)).to.equal(false); + }); + + it('returns false if member has not yet selected a class', () => { + const member = { + stats: { + lvl: 10, + }, + preferences: { + disableClasses: false, + }, + flags: { + classSelected: false, + }, + }; + expect(hasClass()(member)).to.equal(false); + }); + + it('returns true when all conditions are met', () => { + const member = { + stats: { + lvl: 10, + }, + preferences: { + disableClasses: false, + }, + flags: { + classSelected: true, + }, + }; + expect(hasClass()(member)).to.equal(true); + }); +}); \ No newline at end of file diff --git a/website/client/components/achievements/levelUp.vue b/website/client/components/achievements/levelUp.vue index 7df5bbf51b..0f815deecf 100644 --- a/website/client/components/achievements/levelUp.vue +++ b/website/client/components/achievements/levelUp.vue @@ -149,7 +149,7 @@ export default { computed: { ...mapState({user: 'user.data'}), showAllocation () { - return this.user.flags.classSelected && !this.user.preferences.disableClasses && !this.user.preferences.automaticAllocation; + return this.$store.getters['members:hasClass'](this.user) && !this.user.preferences.automaticAllocation; }, }, methods: { diff --git a/website/client/components/header/notificationsDropdown.vue b/website/client/components/header/notificationsDropdown.vue index eb5e6d124f..c7aa8772d4 100644 --- a/website/client/components/header/notificationsDropdown.vue +++ b/website/client/components/header/notificationsDropdown.vue @@ -185,7 +185,7 @@ export default { // skipping those not defined in the handledNotifications object notifications.push(...this.user.notifications.filter(notification => { if (notification.type === 'UNALLOCATED_STATS_POINTS') { - if (!this.user.flags.classSelected || this.user.preferences.disableClasses) return false; + if (!this.hasClass) return false; } return orderMap[notification.type] !== undefined; @@ -212,6 +212,9 @@ export default { return notification.seen === false ? true : false; }); }, + hasClass () { + return this.$store.getters['members:hasClass'](this.user); + }, }, methods: { ...mapActions({ diff --git a/website/client/components/notifications.vue b/website/client/components/notifications.vue index 4d3b1f6eab..58ceff56aa 100644 --- a/website/client/components/notifications.vue +++ b/website/client/components/notifications.vue @@ -244,7 +244,8 @@ export default { }, userMp (after, before) { if (after === before) return; - if (!this.user.flags.classSelected || this.user.preferences.disableClasses) return; + if (!this.$store.getters['members:hasClass'](this.user)) return; + let mana = after - before; this.mp(mana); }, diff --git a/website/client/components/settings/site.vue b/website/client/components/settings/site.vue index a6857abc6f..0e583df0e6 100644 --- a/website/client/components/settings/site.vue +++ b/website/client/components/settings/site.vue @@ -31,7 +31,7 @@ option(v-for='sound in availableAudioThemes', :value='sound') {{ $t(`audioTheme_${sound}`) }} hr - .form-horizontal(v-if='user.flags.classSelected && !user.preferences.disableClasses') + .form-horizontal(v-if='hasClass') h5 {{ $t('characterBuild') }} h6(v-once) {{ $t('class') + ': ' }} // @TODO: what is classText @@ -270,6 +270,9 @@ export default { dayStart () { return this.user.preferences.dayStart; }, + hasClass () { + return this.$store.getters['members:hasClass'](this.user); + }, }, methods: { set (preferenceType, subtype) { diff --git a/website/client/components/userMenu/profile.vue b/website/client/components/userMenu/profile.vue index 5dfe049d81..3b3ad7f7a0 100644 --- a/website/client/components/userMenu/profile.vue +++ b/website/client/components/userMenu/profile.vue @@ -235,7 +235,7 @@ div li strong {{$t('buffs')}}: | {{user.stats.buffs[stat]}} - #allocation(v-if='user._id === userLoggedIn._id && user.flags.classSelected && !user.preferences.disableClasses') + #allocation(v-if='user._id === userLoggedIn._id && hasClass') .row.title-row .col-12.col-md-6 h3(v-if='userLevel100Plus', v-once, v-html="$t('noMoreAllocate')") @@ -733,6 +733,9 @@ export default { startingPageOption () { return this.$store.state.profileOptions.startingPage; }, + hasClass () { + return this.$store.getters['members:hasClass'](this.userLoggedIn); + }, }, watch: { startingPageOption () { diff --git a/website/client/components/userMenu/stats.vue b/website/client/components/userMenu/stats.vue index 8df97720b8..34fa0d7b79 100644 --- a/website/client/components/userMenu/stats.vue +++ b/website/client/components/userMenu/stats.vue @@ -116,7 +116,7 @@ popover-placement='right', :popover="$t('streaksFrozenText')") | {{ $t('streaksFrozen') }} - .col-4(v-if='user.flags.classSelected && !user.preferences.disableClasses') + .col-4(v-if='hasClass') h3(v-once) {{ $t('characterBuild') }} h4(v-once) {{ $t('class') + ': ' }} span {{ classText }}  @@ -239,6 +239,9 @@ export default { return classTexts[this.user.stats.class]; }, + hasClass () { + return this.$store.getters['members:hasClass'](this.user); + }, }, methods: { formatAnimal (animalName, type) { diff --git a/website/client/store/getters/members.js b/website/client/store/getters/members.js index f63645e58d..c0c246639c 100644 --- a/website/client/store/getters/members.js +++ b/website/client/store/getters/members.js @@ -7,6 +7,6 @@ export function isBuffed () { export function hasClass () { return (member) => { - return member.stats.lvl >= 10 && !member.preferences.disableClasses; + return member.stats.lvl >= 10 && !member.preferences.disableClasses && member.flags.classSelected; }; } \ No newline at end of file