From a625e83b538d955ea94335405c041ed5b082be92 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 11 Oct 2019 20:35:49 +0200 Subject: [PATCH] client lint first pass --- .../sprites/spritesmith-largeSprites-0.css | 63 +---- .../sprites/spritesmith-largeSprites-0.png | Bin 72489 -> 84779 bytes .../components/achievements/chooseClass.vue | 16 +- .../components/achievements/justAddWater.vue | 6 +- .../src/components/achievements/levelUp.vue | 9 +- .../achievements/login-incentives.vue | 2 +- .../achievements/lostMasterclasser.vue | 6 +- .../achievements/mindOverMatter.vue | 6 +- .../components/achievements/wonChallenge.vue | 6 +- website/client/src/components/appFooter.vue | 7 +- .../client/src/components/auth/authForm.vue | 6 +- website/client/src/components/auth/logout.vue | 2 +- .../components/auth/registerLoginReset.vue | 30 +- .../components/avatarModal/extra-settings.vue | 18 +- .../components/avatarModal/hair-settings.vue | 43 +-- .../components/avatarModal/skin-settings.vue | 18 +- .../components/challenges/challengeDetail.vue | 3 +- .../components/challenges/challengeModal.vue | 84 +++--- .../challenges/closeChallengeModal.vue | 2 +- .../components/challenges/findChallenges.vue | 8 +- .../components/challenges/groupChallenges.vue | 10 +- .../components/challenges/myChallenges.vue | 8 +- .../src/components/chat/autoComplete.vue | 10 +- .../client/src/components/chat/chatCard.vue | 11 +- .../src/components/chat/chatMessages.vue | 33 ++- .../src/components/chat/reportFlagModal.vue | 22 +- .../client/src/components/creatorIntro.vue | 38 +-- .../src/components/group-plans/billing.vue | 41 +-- .../group-plans/createGroupModalPages.vue | 2 + .../group-plans/taskInformation.vue | 40 +-- .../components/groups/createPartyModal.vue | 2 +- .../src/components/groups/discovery.vue | 4 +- .../client/src/components/groups/group.vue | 7 +- .../src/components/groups/groupFormModal.vue | 6 +- .../src/components/groups/groupPlan.vue | 17 +- .../src/components/groups/inviteModal.vue | 65 +++-- .../src/components/groups/membersModal.vue | 44 +-- .../client/src/components/groups/myGuilds.vue | 6 +- .../src/components/groups/publicGuildItem.vue | 20 +- .../components/groups/questDetailsModal.vue | 7 +- .../components/groups/questSidebarSection.vue | 6 +- .../src/components/groups/startQuestModal.vue | 12 +- website/client/src/components/hall/heroes.vue | 45 ++- .../client/src/components/hall/patrons.vue | 6 +- .../client/src/components/header/index.vue | 35 +-- .../header/notificationsDropdown.vue | 5 +- .../inventory/equipment/equipGearModal.vue | 28 +- .../components/inventory/equipment/index.vue | 260 +++++++++--------- .../inventory/items/cards-modal.vue | 7 +- .../src/components/inventory/items/index.vue | 13 +- .../src/components/inventory/stable/index.vue | 31 +-- .../inventory/stable/mountRaisedModal.vue | 3 - .../components/inventory/stable/petItem.vue | 24 +- .../client/src/components/memberDetails.vue | 12 +- .../members/groupMemberSearchDropdown.vue | 6 +- .../client/src/components/modifyInventory.vue | 12 +- .../client/src/components/notifications.vue | 28 +- .../src/components/payments/amazonButton.vue | 14 +- .../src/components/payments/amazonModal.vue | 4 +- .../src/components/payments/buyGemsModal.vue | 27 +- .../src/components/payments/sendGemsModal.vue | 6 +- .../src/components/selectMembersModal.vue | 2 +- .../client/src/components/settings/api.vue | 12 +- .../src/components/settings/promoCode.vue | 6 +- .../src/components/settings/restoreModal.vue | 6 +- .../client/src/components/settings/site.vue | 68 ++--- .../src/components/settings/subscription.vue | 6 +- .../src/components/settings/usernameForm.vue | 62 ++--- .../src/components/shared/inventoryDrawer.vue | 5 +- .../src/components/shops/balanceInfo.vue | 5 +- .../client/src/components/shops/buyModal.vue | 25 +- .../components/shops/market/categoryItem.vue | 3 +- .../components/shops/market/categoryRow.vue | 5 +- .../shops/market/equipmentSection.vue | 5 +- .../src/components/shops/market/index.vue | 27 +- .../components/shops/market/keysToKennel.vue | 12 +- .../components/shops/quests/buyQuestModal.vue | 32 +-- .../src/components/shops/quests/index.vue | 23 +- .../src/components/shops/quests/questInfo.vue | 2 +- .../src/components/shops/seasonal/index.vue | 30 +- .../components/shops/timeTravelers/index.vue | 19 +- .../src/components/snackbars/notification.vue | 7 +- website/client/src/components/static/faq.vue | 2 +- .../src/components/static/staticWrapper.vue | 2 +- .../src/components/tasks/approvalFooter.vue | 19 +- .../src/components/tasks/approvalHeader.vue | 11 +- .../src/components/tasks/approvalModal.vue | 2 +- .../src/components/tasks/brokenTaskModal.vue | 2 +- .../components/tasks/clearCompletedTodos.vue | 2 +- .../client/src/components/tasks/column.vue | 36 ++- .../client/src/components/tasks/spells.vue | 28 +- website/client/src/components/tasks/task.vue | 5 +- .../client/src/components/tasks/taskModal.vue | 46 ++-- .../client/src/components/ui/drawerSlider.vue | 4 +- .../src/components/userMenu/achievements.vue | 6 +- .../client/src/components/userMenu/inbox.vue | 73 ++--- .../src/components/userMenu/profile.vue | 8 +- .../src/components/userMenu/profileStats.vue | 4 +- .../client/src/components/userMenu/stats.vue | 8 +- .../client/src/directives/directive.common.js | 5 +- .../src/libs/store/helpers/filterTasks.js | 2 +- .../src/libs/store/helpers/internals.js | 2 +- .../client/src/libs/store/helpers/public.js | 2 +- website/client/src/libs/store/index.js | 3 +- 104 files changed, 1053 insertions(+), 893 deletions(-) diff --git a/website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css b/website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css index 23e6151234..7fd10f4cfb 100644 --- a/website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css +++ b/website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css @@ -1,133 +1,78 @@ .promo_armoire_backgrounds_201910 { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -190px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: 0px -389px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css width: 423px; height: 147px; } .promo_costume_achievement { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -734px 0px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: -698px -426px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css width: 144px; height: 156px; } .promo_desert_pet_achievements { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -634px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: -891px -296px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css width: 204px; height: 102px; } .promo_fall_festival_2018 { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -361px 0px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: 0px -208px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css width: 372px; height: 180px; } .promo_fall_festival_2019 { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px 0px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: -337px 0px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css width: 360px; height: 189px; } .promo_fall_skins { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); + background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: 0px 0px; width: 336px; height: 207px; } .customize-option.promo_fall_skins { - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); + background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: -25px -15px; width: 60px; height: 60px; } .promo_mystery_201909 { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -424px -190px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: -698px -148px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css width: 282px; height: 147px; } .promo_seasonal_shop_fall { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -424px -486px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: -843px -426px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css width: 162px; height: 138px; } .promo_shadow_spooky_potions { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -338px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -698px 0px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css + background-position: 0px -537px; width: 423px; height: 147px; } .promo_spooky_sparkles { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -486px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -537px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css + background-position: -698px 0px; width: 423px; height: 147px; } .promo_take_this { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -734px -157px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: -981px -148px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css width: 96px; height: 69px; } .scene_strength { -<<<<<<< HEAD:website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -424px -338px; -======= - background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: -698px -296px; ->>>>>>> develop:website/client/assets/css/sprites/spritesmith-largeSprites-0.css width: 192px; height: 129px; } diff --git a/website/client/src/assets/images/sprites/spritesmith-largeSprites-0.png b/website/client/src/assets/images/sprites/spritesmith-largeSprites-0.png index d4c374f17daa00df52e95e5bc7ed924e17947842..35781b060670eef70aaa1e25d8eddf3ab134a93b 100644 GIT binary patch literal 84779 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 AQ~&?~ literal 72489 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 tuqsK+8BhLUz)p-HU|# `${error.message}\n`); - alert(message); + window.alert(message); } } }, diff --git a/website/client/src/components/auth/logout.vue b/website/client/src/components/auth/logout.vue index c29116c474..5c0661cc7e 100644 --- a/website/client/src/components/auth/logout.vue +++ b/website/client/src/components/auth/logout.vue @@ -6,7 +6,7 @@ export default { }, methods: { async logout () { - return await this.$store.dispatch('auth:logout'); + return this.$store.dispatch('auth:logout'); }, }, }; diff --git a/website/client/src/components/auth/registerLoginReset.vue b/website/client/src/components/auth/registerLoginReset.vue index 2c241f157d..956cc682c4 100644 --- a/website/client/src/components/auth/registerLoginReset.vue +++ b/website/client/src/components/auth/registerLoginReset.vue @@ -372,13 +372,13 @@ export default { const { code } = query; const hasError = query.hasError === 'true'; if (hasError) { - alert(query.message); + window.alert(query.message); this.$router.push({ name: 'login' }); return; } if (!code) { - alert(this.$t('invalidPasswordResetCode')); + window.alert(this.$t('invalidPasswordResetCode')); this.$router.push({ name: 'login' }); return; } @@ -419,18 +419,19 @@ export default { async register () { // @TODO do not use alert if (!this.email) { - alert(this.$t('missingEmail')); + window.alert(this.$t('missingEmail')); return; } if (this.password !== this.passwordConfirm) { - alert(this.$t('passwordConfirmationMatch')); + window.alert(this.$t('passwordConfirmationMatch')); return; } // @TODO: implement langauge and invite accepting // var url = ApiUrl.get() + "/api/v4/user/auth/local/register"; - // if (location.search && location.search.indexOf('Invite=') !== -1) { // matches groupInvite and partyInvite + // if (location.search && location.search.indexOf('Invite=') !== -1) + // { // matches groupInvite and partyInvite // url += location.search; // } // @@ -457,7 +458,8 @@ export default { // @TODO do not reload entire page // problem is that app.vue created hook should be called again // after user is logged in / just signed up - // ALSO it's the only way to make sure language data is reloaded and correct for the logged in user + // ALSO it's the only way to make sure language data + // is reloaded and correct for the logged in user window.location.href = redirectTo; }, async login () { @@ -478,7 +480,8 @@ export default { // @TODO do not reload entire page // problem is that app.vue created hook should be called again // after user is logged in / just signed up - // ALSO it's the only way to make sure language data is reloaded and correct for the logged in user + // ALSO it's the only way to make sure language data + // is reloaded and correct for the logged in user window.location.href = redirectTo; }, // @TODO: Abstract hello in to action or lib @@ -509,7 +512,8 @@ export default { // @TODO do not reload entire page // problem is that app.vue created hook should be called again // after user is logged in / just signed up - // ALSO it's the only way to make sure language data is reloaded and correct for the logged in user + // ALSO it's the only way to make sure language data + // is reloaded and correct for the logged in user window.location.href = redirectTo; }, handleSubmit () { @@ -532,7 +536,7 @@ export default { }, async forgotPasswordLink () { if (!this.username) { - alert(this.$t('missingEmail')); + window.alert(this.$t('missingEmail')); return; } @@ -540,17 +544,17 @@ export default { email: this.username, }); - alert(this.$t('newPassSent')); + window.alert(this.$t('newPassSent')); }, async resetPasswordSetNewOneLink () { if (!this.password) { - alert(this.$t('missingNewPassword')); + window.alert(this.$t('missingNewPassword')); return; } if (this.password !== this.passwordConfirm) { // @TODO i18n and don't use alerts - alert(this.$t('passwordConfirmationMatch')); + window.alert(this.$t('passwordConfirmationMatch')); return; } @@ -561,7 +565,7 @@ export default { }); if (res.data.message) { - alert(res.data.message); + window.alert(res.data.message); } this.password = ''; diff --git a/website/client/src/components/avatarModal/extra-settings.vue b/website/client/src/components/avatarModal/extra-settings.vue index 356b7ce1c8..89a6566dec 100644 --- a/website/client/src/components/avatarModal/extra-settings.vue +++ b/website/client/src/components/avatarModal/extra-settings.vue @@ -134,7 +134,9 @@ export default { const newKey = `eyewear_special_${key}`; const option = {}; option.key = key; - option.active = this.user.preferences.costume ? this.user.items.gear.costume.eyewear === newKey : this.user.items.gear.equipped.eyewear === newKey; + option.active = this.user.preferences.costume + ? this.user.items.gear.costume.eyewear === newKey + : this.user.items.gear.equipped.eyewear === newKey; option.class = `eyewear_special_${key}`; option.click = () => { const type = this.user.preferences.costume ? 'costume' : 'equipped'; @@ -160,7 +162,9 @@ export default { const newKey = `headAccessory_special_${key}`; const option = {}; option.key = key; - option.active = this.user.preferences.costume ? this.user.items.gear.costume.headAccessory === newKey : this.user.items.gear.equipped.headAccessory === newKey; + option.active = this.user.preferences.costume + ? this.user.items.gear.costume.headAccessory === newKey + : this.user.items.gear.equipped.headAccessory === newKey; option.class = `headAccessory_special_${option.key} headband`; option.click = () => { const type = this.user.preferences.costume ? 'costume' : 'equipped'; @@ -205,7 +209,8 @@ export default { }, methods: { animalItems (category) { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now + // @TODO: For some resonse when I use $set on the + // user purchases object, this is not recomputed. Hack for now let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const keys = this.animalItemKeys[category]; const options = keys.map(key => { @@ -214,7 +219,9 @@ export default { const option = {}; option.key = key; - option.active = this.user.preferences.costume ? this.user.items.gear.costume[category] === newKey : this.user.items.gear.equipped[category] === newKey; + option.active = this.user.preferences.costume + ? this.user.items.gear.costume[category] === newKey + : this.user.items.gear.equipped[category] === newKey; option.class = `headAccessory_special_${option.key} ${category}`; if (category === 'back') { option.class = `icon_back_special_${option.key} back`; @@ -247,7 +254,8 @@ export default { return keys.join(','); }, animalItemsOwned (category) { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now + // @TODO: For some resonse when I use $set on the user purchases object, + // this is not recomputed. Hack for now let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line let own = true; diff --git a/website/client/src/components/avatarModal/hair-settings.vue b/website/client/src/components/avatarModal/hair-settings.vue index 01f3bf2c93..b202cb25ae 100644 --- a/website/client/src/components/avatarModal/hair-settings.vue +++ b/website/client/src/components/avatarModal/hair-settings.vue @@ -112,11 +112,12 @@ export default { return freeHairColorKeys.map(s => this.mapKeysToFreeOption(s, 'hair', 'color')); }, seasonalHairColors () { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + // @TODO: For some resonse when I use $set on the user purchases object, + // this is not recomputed. Hack for now + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const seasonalHairColors = []; - for (const key in hairColorBySet) { + for (const key of Object.keys(hairColorBySet)) { const set = hairColorBySet[key]; const keys = set.map(item => item.key); @@ -143,22 +144,25 @@ export default { return seasonalHairColors; }, premiumHairColors () { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + // @TODO: For some resonse when I use $set on the user purchases object, + // this is not recomputed. Hack for now + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const keys = this.premiumHairColorKeys; const options = keys.map(key => this.mapKeysToOption(key, 'hair', 'color')); return options; }, baseHair2 () { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + // @TODO: For some resonse when I use $set on the user purchases object, + // this is not recomputed. Hack for now + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const keys = this.baseHair2Keys; const options = keys.map(key => this.mapKeysToOption(key, 'hair', 'base')); return options; }, baseHair3 () { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + // @TODO: For some resonse when I use $set on the user purchases object, + // this is not recomputed. Hack for now + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const keys = this.baseHair3Keys; const options = keys.map(key => { const option = this.mapKeysToOption(key, 'hair', 'base'); @@ -167,22 +171,25 @@ export default { return options; }, baseHair4 () { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + // @TODO: For some resonse when I use $set on the user purchases object, + // this is not recomputed. Hack for now + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const keys = this.baseHair4Keys; const options = keys.map(key => this.mapKeysToOption(key, 'hair', 'base')); return options; }, baseHair5 () { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + // @TODO: For some resonse when I use $set on the user purchases object, + // this is not recomputed. Hack for now + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const keys = this.baseHair5Keys; const options = keys.map(key => this.mapKeysToOption(key, 'hair', 'mustache')); return options; }, baseHair6 () { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + // @TODO: For some resonse when I use $set on the user purchases object, + // this is not recomputed. Hack for now + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const keys = this.baseHair6Keys; const options = keys.map(key => this.mapKeysToOption(key, 'hair', 'beard')); return options; @@ -259,11 +266,13 @@ export default { }, methods: { /** - * Allows you to find out whether you need the "Purchase All" button or not. If there are more than 2 unpurchased items, returns true, otherwise returns false. + * Allows you to find out whether you need the "Purchase All" button or not. + * If there are more than 2 unpurchased items, returns true, otherwise returns false. * @param {string} category - The selected category. * @param {string[]} keySets - The items keySets. * @param {string[]} [types] - The items types (subcategories). Optional. - * @returns {boolean} - Determines whether the "Purchase All" button is needed (true) or not (false). + * @returns {boolean} - Determines whether the "Purchase All" button + * is needed (true) or not (false). */ isPurchaseAllNeeded (category, keySets, types) { const purchasedItemsLengths = []; diff --git a/website/client/src/components/avatarModal/skin-settings.vue b/website/client/src/components/avatarModal/skin-settings.vue index d2b46536cd..ade49993d2 100644 --- a/website/client/src/components/avatarModal/skin-settings.vue +++ b/website/client/src/components/avatarModal/skin-settings.vue @@ -31,8 +31,8 @@ const skinsBySet = groupBy(appearance.skin, 'set.key'); const freeSkinKeys = skinsBySet[undefined].map(s => s.key); -// const specialSkinKeys = Object.keys(appearance.shirt).filter(k => appearance.shirt[k].price !== 0); - +// const specialSkinKeys = Object.keys(appearance.shirt) +// .filter(k => appearance.shirt[k].price !== 0); export default { components: { @@ -66,11 +66,12 @@ export default { return freeSkinKeys.map(s => this.mapKeysToFreeOption(s, 'skin')); }, seasonalSkins () { - // @TODO: For some resonse when I use $set on the user purchases object, this is not recomputed. Hack for now - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + // @TODO: For some resonse when I use $set on the user purchases object, + // this is not recomputed. Hack for now + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const seasonalSkins = []; - for (const setKey in skinsBySet) { + for (const setKey of Object.keys(skinsBySet)) { const set = skinsBySet[setKey]; const keys = set.map(item => item.key); @@ -101,12 +102,5 @@ export default { mounted () { this.changeSubPage('color'); }, - methods: { - - }, }; - - diff --git a/website/client/src/components/challenges/challengeDetail.vue b/website/client/src/components/challenges/challengeDetail.vue index b9ed1e69cd..e141f60a4f 100644 --- a/website/client/src/components/challenges/challengeDetail.vue +++ b/website/client/src/components/challenges/challengeDetail.vue @@ -284,7 +284,8 @@ export default { }, async loadChallenge () { this.challenge = await this.$store.dispatch('challenges:getChallenge', { challengeId: this.searchId }); - this.members = await this.loadMembers({ challengeId: this.searchId, includeAllPublicFields: true }); + this.members = await this + .loadMembers({ challengeId: this.searchId, includeAllPublicFields: true }); const tasks = await this.$store.dispatch('tasks:getChallengeTasks', { challengeId: this.searchId }); this.tasksByType = { habit: [], diff --git a/website/client/src/components/challenges/challengeModal.vue b/website/client/src/components/challenges/challengeModal.vue index c6f1bcc437..8a5d07d6e6 100644 --- a/website/client/src/components/challenges/challengeModal.vue +++ b/website/client/src/components/challenges/challengeModal.vue @@ -233,35 +233,6 @@ export default { groups: [], }; }, - watch: { - user () { - if (!this.challenge) this.workingChallenge.leader = this.user._id; - }, - challenge () { - this.setUpWorkingChallenge(); - }, - cloning () { - this.setUpWorkingChallenge(); - }, - }, - mounted () { - this.$root.$on('habitica:clone-challenge', data => { - if (!data.challenge) return; - this.cloning = true; - this.cloningChallengeId = data.challenge._id; - this.$store.state.challengeOptions.workingChallenge = { ...this.$store.state.challengeOptions.workingChallenge, ...data.challenge }; - this.$root.$emit('bv::show::modal', 'challenge-modal'); - }); - this.$root.$on('habitica:update-challenge', data => { - if (!data.challenge) return; - this.cloning = false; - this.$store.state.challengeOptions.workingChallenge = { ...this.$store.state.challengeOptions.workingChallenge, ...data.challenge }; - this.$root.$emit('bv::show::modal', 'challenge-modal'); - }); - }, - beforeDestroy () { - this.$root.$off('habitica:clone-challenge'); - }, computed: { ...mapState({ user: 'user.data' }), creating () { @@ -274,7 +245,9 @@ export default { return this.$t('editingChallenge'); }, charactersRemaining () { - const currentLength = this.workingChallenge.summary ? this.workingChallenge.summary.length : 0; + const currentLength = this.workingChallenge.summary + ? this.workingChallenge.summary.length + : 0; return MAX_SUMMARY_SIZE_FOR_CHALLENGES - currentLength; }, maxPrize () { @@ -312,6 +285,41 @@ export default { return this.$store.state.challengeOptions.workingChallenge; }, }, + watch: { + user () { + if (!this.challenge) this.workingChallenge.leader = this.user._id; + }, + challenge () { + this.setUpWorkingChallenge(); + }, + cloning () { + this.setUpWorkingChallenge(); + }, + }, + mounted () { + this.$root.$on('habitica:clone-challenge', data => { + if (!data.challenge) return; + this.cloning = true; + this.cloningChallengeId = data.challenge._id; + this.$store.state.challengeOptions.workingChallenge = { + ...this.$store.state.challengeOptions.workingChallenge, + ...data.challenge, + }; + this.$root.$emit('bv::show::modal', 'challenge-modal'); + }); + this.$root.$on('habitica:update-challenge', data => { + if (!data.challenge) return; + this.cloning = false; + this.$store.state.challengeOptions.workingChallenge = { + ...this.$store.state.challengeOptions.workingChallenge, + ...data.challenge, + }; + this.$root.$emit('bv::show::modal', 'challenge-modal'); + }); + }, + beforeDestroy () { + this.$root.$off('habitica:clone-challenge'); + }, methods: { async shown () { this.groups = await this.$store.dispatch('guilds:getMyGuilds'); @@ -378,7 +386,10 @@ export default { }, async createChallenge () { this.loading = true; - // @TODO: improve error handling, add it to updateChallenge, make errors translatable. Suggestion: `<% fieldName %> is required` where possible, where `fieldName` is inserted as the translatable string that's used for the field header. + // @TODO: improve error handling, add it to updateChallenge, + // make errors translatable. Suggestion: `<% fieldName %> + // is required` where possible, where `fieldName` is inserted + // as the translatable string that's used for the field header. const errors = []; if (!this.workingChallenge.name) errors.push(this.$t('nameRequired')); @@ -390,7 +401,7 @@ export default { if (!this.workingChallenge.categories || this.workingChallenge.categories.length === 0) errors.push(this.$t('categoiresRequired')); if (errors.length > 0) { - alert(errors.join('\n')); + window.alert(errors.join('\n')); this.loading = false; return; } @@ -425,9 +436,14 @@ export default { // @TODO: Share with server const prizeCost = this.workingChallenge.prize / 4; - const challengeGroupLeader = challengeGroup.leader && challengeGroup.leader._id ? challengeGroup.leader._id : challengeGroup.leader; + const challengeGroupLeader = challengeGroup.leader && challengeGroup.leader._id + ? challengeGroup.leader._id + : challengeGroup.leader; const userIsLeader = challengeGroupLeader === this.user._id; - if (challengeGroup && userIsLeader && challengeGroup.balance > 0 && challengeGroup.balance >= prizeCost) { + if ( + challengeGroup && userIsLeader + && challengeGroup.balance > 0 && challengeGroup.balance >= prizeCost + ) { // Group pays for all of prize } else if (challengeGroup && userIsLeader && challengeGroup.balance > 0) { // User pays remainder of prize cost after group diff --git a/website/client/src/components/challenges/closeChallengeModal.vue b/website/client/src/components/challenges/closeChallengeModal.vue index 76d97a1379..0f065b86bc 100644 --- a/website/client/src/components/challenges/closeChallengeModal.vue +++ b/website/client/src/components/challenges/closeChallengeModal.vue @@ -101,7 +101,7 @@ export default { this.$router.push('/challenges/myChallenges'); }, async deleteChallenge () { - if (!confirm('Are you sure you want to delete this challenge?')) return; + if (!window.confirm('Are you sure you want to delete this challenge?')) return; this.challenge = await this.$store.dispatch('challenges:deleteChallenge', { challengeId: this.challengeId, prize: this.prize, diff --git a/website/client/src/components/challenges/findChallenges.vue b/website/client/src/components/challenges/findChallenges.vue index 893dad43c5..b2d9d00c99 100644 --- a/website/client/src/components/challenges/findChallenges.vue +++ b/website/client/src/components/challenges/findChallenges.vue @@ -122,15 +122,15 @@ export default { page: 0, }; }, - mounted () { - this.loadChallenges(); - }, computed: { ...mapState({ user: 'user.data' }), filteredChallenges () { return this.challenges; }, }, + mounted () { + this.loadChallenges(); + }, methods: { updateSearch (eventData) { this.search = eventData.searchTerm; @@ -156,7 +156,7 @@ export default { let owned = ''; // @TODO: we skip ownership === 2 because it is the same as === 0 right now if (this.filters.ownership && this.filters.ownership.length === 1) { - owned = this.filters.ownership[0]; + [owned] = this.filters.ownership; } const challenges = await this.$store.dispatch('challenges:getUserChallenges', { diff --git a/website/client/src/components/challenges/groupChallenges.vue b/website/client/src/components/challenges/groupChallenges.vue index 0deb5816e7..95dcdc74b6 100644 --- a/website/client/src/components/challenges/groupChallenges.vue +++ b/website/client/src/components/challenges/groupChallenges.vue @@ -50,10 +50,10 @@ export default { challengeModal, challengeItem, }, - props: ['groupId'], - computed: { - ...mapState({ user: 'user.data' }), + directives: { + markdown: markdownDirective, }, + props: ['groupId'], data () { return { challenges: [], @@ -63,8 +63,8 @@ export default { groupIdForChallenges: '', }; }, - directives: { - markdown: markdownDirective, + computed: { + ...mapState({ user: 'user.data' }), }, watch: { async groupId () { diff --git a/website/client/src/components/challenges/myChallenges.vue b/website/client/src/components/challenges/myChallenges.vue index ad974d3e65..42760beef5 100644 --- a/website/client/src/components/challenges/myChallenges.vue +++ b/website/client/src/components/challenges/myChallenges.vue @@ -137,9 +137,6 @@ export default { page: 0, }; }, - mounted () { - this.loadChallenges(); - }, computed: { ...mapState({ user: 'user.data' }), filteredChallenges () { @@ -162,6 +159,9 @@ export default { }); }, }, + mounted () { + this.loadChallenges(); + }, methods: { updateSearch (eventData) { this.search = eventData.searchTerm; @@ -188,7 +188,7 @@ export default { let owned = ''; // @TODO: we skip ownership === 2 because it is the same as === 0 right now if (this.filters.ownership && this.filters.ownership.length === 1) { - owned = this.filters.ownership[0]; + [owned] = this.filters.ownership; } const challenges = await this.$store.dispatch('challenges:getUserChallenges', { diff --git a/website/client/src/components/chat/autoComplete.vue b/website/client/src/components/chat/autoComplete.vue index d0df214cb1..b830b76e9a 100644 --- a/website/client/src/components/chat/autoComplete.vue +++ b/website/client/src/components/chat/autoComplete.vue @@ -111,10 +111,12 @@ export default { searchResults () { if (!this.searchActive) return []; if (!this.atRegex.exec(this.text)) return []; - this.currentSearch = this.atRegex.exec(this.text)[0]; // eslint-disable-line vue/no-side-effects-in-computed-properties - this.currentSearch = this.currentSearch.substring(1, this.currentSearch.length); // eslint-disable-line vue/no-side-effects-in-computed-properties + this.currentSearch = this.atRegex.exec(this.text)[0]; // eslint-disable-line vue/no-side-effects-in-computed-properties, max-len, prefer-destructuring + this.currentSearch = this.currentSearch.substring(1, this.currentSearch.length); // eslint-disable-line vue/no-side-effects-in-computed-properties, max-len - return this.tmpSelections.filter(option => option.displayName.toLowerCase().indexOf(this.currentSearch.toLowerCase()) !== -1 || option.username && option.username.toLowerCase().indexOf(this.currentSearch.toLowerCase()) !== -1).slice(0, 4); + return this.tmpSelections + .filter(option => option.displayName.toLowerCase().indexOf(this.currentSearch.toLowerCase()) !== -1 || option.username && option.username.toLowerCase().indexOf(this.currentSearch.toLowerCase()) !== -1) + .slice(0, 4); }, }, @@ -153,7 +155,7 @@ export default { }, grabUserNames () { const usersThatMessage = groupBy(this.chat, 'user'); - for (const userKey in usersThatMessage) { + for (const userKey of Object.keys(usersThatMessage)) { const systemMessage = userKey === 'undefined'; if (!systemMessage && this.tmpSelections.indexOf(userKey) === -1) { this.tmpSelections.push({ diff --git a/website/client/src/components/chat/chatCard.vue b/website/client/src/components/chat/chatCard.vue index edc52ae889..75fd43fc29 100644 --- a/website/client/src/components/chat/chatCard.vue +++ b/website/client/src/components/chat/chatCard.vue @@ -176,7 +176,7 @@ export default { const message = this.msg; const { user } = this; - if (message.hasOwnProperty('highlight')) return message.highlight; + if (message.highlight) return message.highlight; message.highlight = false; const messageText = message.text.toLowerCase(); @@ -201,14 +201,14 @@ export default { if (!message.likes) return 0; let likeCount = 0; - for (const key in message.likes) { + for (const key of Object.keys(message.likes)) { const like = message.likes[key]; if (like) likeCount += 1; } return likeCount; }, isMessageReported () { - return this.msg.flags && this.msg.flags[this.user.id] || this.reported; + return (this.msg.flags && this.msg.flags[this.user.id]) || this.reported; }, flagCountDescription () { if (!this.msg.flagCount) return ''; @@ -242,6 +242,7 @@ export default { }, likeTooltip (likedStatus) { if (!likedStatus) return this.$t('like'); + return null; }, copyAsTodo (message) { this.$root.$emit('habitica::copy-as-todo', message); @@ -261,7 +262,7 @@ export default { }); }, async remove () { - if (!confirm(this.$t('areYouSureDeleteMessage'))) return; + if (!window.confirm(this.$t('areYouSureDeleteMessage'))) return; const message = this.msg; this.$emit('message-removed', message); @@ -280,7 +281,7 @@ export default { return highlightUsers(text, this.user.auth.local.username, this.user.profile.name); }, parseMarkdown (text) { - if (!text) return; + if (!text) return null; return habiticaMarkdown.render(String(text)); }, }, diff --git a/website/client/src/components/chat/chatMessages.vue b/website/client/src/components/chat/chatMessages.vue index e15a930949..0b59da5d15 100644 --- a/website/client/src/components/chat/chatMessages.vue +++ b/website/client/src/components/chat/chatMessages.vue @@ -178,15 +178,6 @@ export default { lastOffset: -1, }; }, - mounted () { - this.loadProfileCache(); - }, - created () { - window.addEventListener('scroll', this.handleScroll); - }, - destroyed () { - window.removeEventListener('scroll', this.handleScroll); - }, computed: { ...mapState({ user: 'user.data' }), // @TODO: We need a different lazy load mechnism. @@ -196,6 +187,15 @@ export default { return this.chat; }, }, + mounted () { + this.loadProfileCache(); + }, + created () { + window.addEventListener('scroll', this.handleScroll); + }, + destroyed () { + window.removeEventListener('scroll', this.handleScroll); + }, methods: { handleScroll () { this.loadProfileCache(window.scrollY / 1000); @@ -231,7 +231,10 @@ export default { // @TODO: write an explination // @TODO: Remove this after enough messages are cached - if (!noProfilesLoaded && screenPosition && Math.floor(screenPosition) + 1 > this.currentProfileLoadedEnd / 10) { + if ( + !noProfilesLoaded + && screenPosition && Math.floor(screenPosition) + 1 > this.currentProfileLoadedEnd / 10 + ) { this.currentProfileLoadedEnd = 10 * (Math.floor(screenPosition) + 1); } else if (!noProfilesLoaded && screenPosition) { return; @@ -255,7 +258,8 @@ export default { const results = await Promise.all(promises); results.forEach(result => { - // We could not load the user. Maybe they were deleted. So, let's cache empty so we don't try again + // We could not load the user. Maybe they were deleted. + // So, let's cache empty so we don't try again if (!result || !result.data || result.status >= 400) { return; } @@ -287,15 +291,16 @@ export default { if (!profile._id) { const result = await this.$store.dispatch('members:fetchMember', { memberId }); if (result.response && result.response.status === 404) { - return this.$store.dispatch('snackbars:add', { + this.$store.dispatch('snackbars:add', { title: 'Habitica', text: this.$t('messageDeletedUser'), type: 'error', timeout: false, }); + } else { + this.cachedProfileData[memberId] = result.data.data; + profile = result.data.data; } - this.cachedProfileData[memberId] = result.data.data; - profile = result.data.data; } // Open the modal only if the data is available diff --git a/website/client/src/components/chat/reportFlagModal.vue b/website/client/src/components/chat/reportFlagModal.vue index 239ac8f567..0f7478995b 100644 --- a/website/client/src/components/chat/reportFlagModal.vue +++ b/website/client/src/components/chat/reportFlagModal.vue @@ -70,17 +70,6 @@ export default { markdown: markdownDirective, }, mixins: [notifications], - computed: { - ...mapState({ user: 'user.data' }), - reportData () { - let reportMessage = this.abuseObject.user; - const isSystemMessage = this.abuseObject.uuid === 'system'; - if (isSystemMessage) reportMessage = this.$t('systemMessage'); - return { - name: `${reportMessage}`, - }; - }, - }, data () { const abuseFlagModalBody = { firstLinkStart: '', @@ -95,6 +84,17 @@ export default { reportComment: '', }; }, + computed: { + ...mapState({ user: 'user.data' }), + reportData () { + let reportMessage = this.abuseObject.user; + const isSystemMessage = this.abuseObject.uuid === 'system'; + if (isSystemMessage) reportMessage = this.$t('systemMessage'); + return { + name: `${reportMessage}`, + }; + }, + }, created () { this.$root.$on('habitica::report-chat', this.handleReport); }, diff --git a/website/client/src/components/creatorIntro.vue b/website/client/src/components/creatorIntro.vue index 79f00d5335..bbbdefa4f1 100644 --- a/website/client/src/components/creatorIntro.vue +++ b/website/client/src/components/creatorIntro.vue @@ -787,23 +787,6 @@ export default { })), }; }, - watch: { - editing () { - if (this.editing) this.modalPage = 2; - }, - startingPage () { - if (!this.$store.state.avatarEditorOptions.startingPage) return; - this.activeTopPage = this.$store.state.avatarEditorOptions.startingPage; - this.activeSubPage = this.$store.state.avatarEditorOptions.subpage; - this.$store.state.avatarEditorOptions.startingPage = ''; - this.$store.state.avatarEditorOptions.subpage = ''; - }, - }, - mounted () { - if (this.editing) this.modalPage = 2; - // Buy modal is global, so we listen at root. I'd like to not - this.$root.$on('buyModal::boughtItem', this.backgroundPurchased); - }, computed: { ...mapState({ user: 'user.data' }), @@ -858,6 +841,23 @@ export default { return ownedBackgrounds; }, }, + watch: { + editing () { + if (this.editing) this.modalPage = 2; + }, + startingPage () { + if (!this.$store.state.avatarEditorOptions.startingPage) return; + this.activeTopPage = this.$store.state.avatarEditorOptions.startingPage; + this.activeSubPage = this.$store.state.avatarEditorOptions.subpage; + this.$store.state.avatarEditorOptions.startingPage = ''; + this.$store.state.avatarEditorOptions.subpage = ''; + }, + }, + mounted () { + if (this.editing) this.modalPage = 2; + // Buy modal is global, so we listen at root. I'd like to not + this.$root.$on('buyModal::boughtItem', this.backgroundPurchased); + }, methods: { purchase (type, key) { this.$store.dispatch('shops:purchase', { @@ -923,7 +923,7 @@ export default { ownsSet (type, set) { let setOwnedByUser = false; - for (let key in set) { + for (let key of Object.keys(set)) { const value = set[key]; if (type === 'background') key = value.key; if (this.user.purchased[type][key]) setOwnedByUser = true; @@ -933,7 +933,7 @@ export default { }, setKeys (type, _set) { return map(_set, (v, k) => { - if (type === 'background') k = v.key; + if (type === 'background') k = v.key; // eslint-disable-line no-param-reassign return `${type}.${k}`; }).join(','); }, diff --git a/website/client/src/components/group-plans/billing.vue b/website/client/src/components/group-plans/billing.vue index fe9b1fe7e2..af4f258720 100644 --- a/website/client/src/components/group-plans/billing.vue +++ b/website/client/src/components/group-plans/billing.vue @@ -46,6 +46,29 @@ export default { 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(); @@ -61,24 +84,6 @@ export default { } } }, - 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), - }; - }, - }, methods: { async loadGroup () { const group = await this.$store.dispatch('guilds:getGroup', { groupId: this.groupId }); diff --git a/website/client/src/components/group-plans/createGroupModalPages.vue b/website/client/src/components/group-plans/createGroupModalPages.vue index 98a5b2774e..4d15f5cd8e 100644 --- a/website/client/src/components/group-plans/createGroupModalPages.vue +++ b/website/client/src/components/group-plans/createGroupModalPages.vue @@ -150,6 +150,8 @@ export default { paymentData.type = 'subscription'; return paymentData; } + + return null; }, }, }; diff --git a/website/client/src/components/group-plans/taskInformation.vue b/website/client/src/components/group-plans/taskInformation.vue index 79d31b828d..0231d2fa37 100644 --- a/website/client/src/components/group-plans/taskInformation.vue +++ b/website/client/src/components/group-plans/taskInformation.vue @@ -126,22 +126,6 @@ export default { group: {}, }; }, - watch: { - // call again the method if the route changes (when this route is already active) - $route: 'load', - }, - beforeRouteUpdate (to, from, next) { - this.$set(this, 'searchId', to.params.groupId); - next(); - }, - mounted () { - if (!this.searchId) this.searchId = this.groupId; - this.load(); - - if (this.$route.query.showGroupOverview) { - this.$root.$emit('bv::show::modal', 'group-plan-overview'); - } - }, computed: { ...mapState({ user: 'user.data' }), tagsByType () { @@ -175,12 +159,29 @@ export default { }, canCreateTasks () { if (!this.group) return false; - return this.group.leader && this.group.leader._id === this.user._id || this.group.managers && Boolean(this.group.managers[this.user._id]); + return (this.group.leader && this.group.leader._id === this.user._id) + || (this.group.managers && Boolean(this.group.managers[this.user._id])); }, showOptions () { return this.canCreateTasks; }, }, + watch: { + // call again the method if the route changes (when this route is already active) + $route: 'load', + }, + beforeRouteUpdate (to, from, next) { + this.$set(this, 'searchId', to.params.groupId); + next(); + }, + mounted () { + if (!this.searchId) this.searchId = this.groupId; + this.load(); + + if (this.$route.query.showGroupOverview) { + this.$root.$emit('bv::show::modal', 'group-plan-overview'); + } + }, methods: { async load () { this.tasksByType = { @@ -204,7 +205,10 @@ export default { const groupedApprovals = await this.loadApprovals(); tasks.forEach(task => { - if (groupedApprovals[task._id] && groupedApprovals[task._id].length > 0) task.approvals = groupedApprovals[task._id]; + if ( + groupedApprovals[task._id] + && groupedApprovals[task._id].length > 0 + ) task.approvals = groupedApprovals[task._id]; this.tasksByType[task.type].push(task); }); }, diff --git a/website/client/src/components/groups/createPartyModal.vue b/website/client/src/components/groups/createPartyModal.vue index 608d1c08bf..078854c658 100644 --- a/website/client/src/components/groups/createPartyModal.vue +++ b/website/client/src/components/groups/createPartyModal.vue @@ -147,6 +147,7 @@ import notifications from '@/mixins/notifications'; import copyIcon from '@/assets/svg/copy.svg'; export default { + mixins: [notifications], data () { return { icons: Object.freeze({ @@ -189,6 +190,5 @@ export default { this.text(this.$t('usernameCopied')); }, }, - mixins: [notifications], }; diff --git a/website/client/src/components/groups/discovery.vue b/website/client/src/components/groups/discovery.vue index 0d33238b7b..0024626c74 100644 --- a/website/client/src/components/groups/discovery.vue +++ b/website/client/src/components/groups/discovery.vue @@ -67,7 +67,7 @@ function _mapCategories (guilds) { guilds.forEach(guild => { if (!guild.categories) return; guild.categorySlugs = guild.categories.map(cat => { - if (!cat) return; + if (!cat) return undefined; return cat.slug; }); }); @@ -198,7 +198,7 @@ export default { _mapCategories(guilds); this.guilds.push(...guilds); - this.lastPageLoaded++; + this.lastPageLoaded += 1; this.loading = false; }, createGroup () { diff --git a/website/client/src/components/groups/group.vue b/website/client/src/components/groups/group.vue index d9db6f8823..166e2cead0 100644 --- a/website/client/src/components/groups/group.vue +++ b/website/client/src/components/groups/group.vue @@ -448,7 +448,8 @@ export default { const groupId = this.searchId === 'party' ? this.user.party._id : this.searchId; if (this.hasUnreadMessages(groupId)) { - // Delay by 1sec to make sure it returns after other requests that don't have the notification marked as read + // Delay by 1sec to make sure it returns after + // other requests that don't have the notification marked as read setTimeout(() => { this.$store.dispatch('chat:markChatSeen', { groupId }); this.$delete(this.user.newMessages, groupId); @@ -476,7 +477,7 @@ export default { } }, async join () { - if (this.group.cancelledPlan && !confirm(this.$t('aboutToJoinCancelledGroupPlan'))) { + if (this.group.cancelledPlan && !window.confirm(this.$t('aboutToJoinCancelledGroupPlan'))) { return; } await this.$store.dispatch('guilds:join', { groupId: this.group._id, type: 'guild' }); @@ -490,7 +491,7 @@ export default { }); // @TODO: Get challenges and ask to keep or remove - if (!confirm('Are you sure you want to leave?')) return; + if (!window.confirm('Are you sure you want to leave?')) return; const keep = true; this.leave(keep); }, diff --git a/website/client/src/components/groups/groupFormModal.vue b/website/client/src/components/groups/groupFormModal.vue index 41db557c8c..afe7c09e56 100644 --- a/website/client/src/components/groups/groupFormModal.vue +++ b/website/client/src/components/groups/groupFormModal.vue @@ -362,7 +362,7 @@ export default { async submit () { if (this.$store.state.user.data.balance < 1 && !this.workingGroup.id) { // @TODO: Add proper notifications - alert(this.$t('notEnoughGems')); + window.alert(this.$t('notEnoughGems')); return; // @TODO return $rootScope.openModal('buyGems', {track:"Gems > Gems > Create Group"}); } @@ -376,12 +376,12 @@ export default { if (!this.isParty && (!this.workingGroup.categories || this.workingGroup.categories.length === 0)) errors.push(this.$t('categoiresRequired')); if (errors.length > 0) { - alert(errors.join('\n')); + window.alert(errors.join('\n')); return; } // @TODO: Add proper notifications - if (!this.workingGroup.id && !confirm(this.$t('confirmGuild'))) return; + if (!this.workingGroup.id && !window.confirm(this.$t('confirmGuild'))) return; if (!this.workingGroup.privateGuild) { this.workingGroup.privacy = 'public'; diff --git a/website/client/src/components/groups/groupPlan.vue b/website/client/src/components/groups/groupPlan.vue index 95f5978188..0b5998665f 100644 --- a/website/client/src/components/groups/groupPlan.vue +++ b/website/client/src/components/groups/groupPlan.vue @@ -330,9 +330,6 @@ export default { type: 'guild', // Guild or Party @TODO enum this }; }, - mounted () { - this.activePage = this.PAGES.BENEFITS; - }, computed: { newGroupIsReady () { return Boolean(this.newGroup.name); @@ -343,6 +340,9 @@ export default { // @TODO: can we move this to payment mixin? ...mapState({ user: 'user.data' }), }, + mounted () { + this.activePage = this.PAGES.BENEFITS; + }, methods: { launchModal () { this.changePage(this.PAGES.CREATE_GROUP); @@ -370,12 +370,17 @@ export default { } this.paymentMethod = paymentMethod; - if (this.paymentMethod === this.PAYMENTS.STRIPE) { - this.showStripe(paymentData); - } else if (this.paymentMethod === this.PAYMENTS.AMAZON) { + + if (this.paymentMethod === this.PAYMENTS.AMAZON) { paymentData.type = 'subscription'; return paymentData; } + + if (this.paymentMethod === this.PAYMENTS.STRIPE) { + this.showStripe(paymentData); + } + + return null; }, }, }; diff --git a/website/client/src/components/groups/inviteModal.vue b/website/client/src/components/groups/inviteModal.vue index ac9926309e..946787cf19 100644 --- a/website/client/src/components/groups/inviteModal.vue +++ b/website/client/src/components/groups/inviteModal.vue @@ -103,17 +103,8 @@ import positiveIcon from '@/assets/svg/positive.svg'; const INVITE_DEFAULTS = { text: '', error: null, valid: null }; export default { - computed: { - ...mapState({ user: 'user.data' }), - cannotSubmit () { - const filteredInvites = filter(this.invites, invite => invite.text.length > 0 && !invite.valid); - if (filteredInvites.length > 0) return true; - return false; - }, - inviter () { - return this.user.profile.name; - }, - }, + mixins: [notifications], + props: ['group', 'groupType'], data () { return { invites: [clone(INVITE_DEFAULTS), clone(INVITE_DEFAULTS)], @@ -122,36 +113,61 @@ export default { }), }; }, + computed: { + ...mapState({ user: 'user.data' }), + cannotSubmit () { + const filteredInvites = filter( + this.invites, + invite => invite.text.length > 0 && !invite.valid, + ); + if (filteredInvites.length > 0) return true; + return false; + }, + inviter () { + return this.user.profile.name; + }, + }, methods: { checkInviteList: debounce(function checkList () { - this.invites = filter(this.invites, (invite, index) => invite.text.length > 0 || index === this.invites.length - 1); + this.invites = filter( + this.invites, + (invite, index) => invite.text.length > 0 || index === this.invites.length - 1, + ); while (this.invites.length < 2) this.invites.push(clone(INVITE_DEFAULTS)); forEach(this.invites, (value, index) => { if (value.text.length < 1 || isEmail(value.text)) { return this.fillErrors(index); } + if (isUUID(value.text)) { - this.$store.dispatch('user:userLookup', { uuid: value.text }) - .then(res => this.fillErrors(index, res)); - } else { - let searchUsername = value.text; - if (searchUsername[0] === '@') searchUsername = searchUsername.slice(1, searchUsername.length); - this.$store.dispatch('user:userLookup', { username: searchUsername }) + return this.$store.dispatch('user:userLookup', { uuid: value.text }) .then(res => this.fillErrors(index, res)); } + + let searchUsername = value.text; + if (searchUsername[0] === '@') searchUsername = searchUsername.slice(1, searchUsername.length); + return this.$store.dispatch('user:userLookup', { username: searchUsername }) + .then(res => this.fillErrors(index, res)); }); }, 250), expandInviteList () { - if (this.invites[this.invites.length - 1].text.length > 0) this.invites.push(clone(INVITE_DEFAULTS)); + if (this.invites[this.invites.length - 1].text.length > 0) { + this.invites.push(clone(INVITE_DEFAULTS)); + } }, fillErrors (index, res) { if (!res || res.status === 200) { this.invites[index].error = null; - if (this.invites[index].text.length < 1) return this.invites[index].valid = null; - return this.invites[index].valid = true; + if (this.invites[index].text.length < 1) { + this.invites[index].valid = null; + return; + } + + this.invites[index].valid = true; + return; } this.invites[index].error = res.response.data.message; - return this.invites[index].valid = false; + this.invites[index].valid = false; }, close () { this.invites = [clone(INVITE_DEFAULTS), clone(INVITE_DEFAULTS)]; @@ -179,14 +195,13 @@ export default { groupId: this.group._id, }); - const invitesSent = invitationDetails.emails.length + invitationDetails.uuids.length + invitationDetails.usernames.length; + const invitesSent = invitationDetails.emails.length + + invitationDetails.uuids.length + invitationDetails.usernames.length; const invitationString = invitesSent > 1 ? 'invitationsSent' : 'invitationSent'; this.text(this.$t(invitationString)); this.close(); }, }, - mixins: [notifications], - props: ['group', 'groupType'], }; diff --git a/website/client/src/components/groups/membersModal.vue b/website/client/src/components/groups/membersModal.vue index 377395b0a3..09033ea1b5 100644 --- a/website/client/src/components/groups/membersModal.vue +++ b/website/client/src/components/groups/membersModal.vue @@ -277,22 +277,6 @@ export default { userIdToMessage: '', }; }, - mounted () { - this.$root.$on('habitica:show-member-modal', data => { - // @TODO: Remove store - this.$store.state.memberModalOptions.challengeId = data.challengeId; - this.$store.state.memberModalOptions.groupId = data.groupId; - this.$store.state.memberModalOptions.group = data.group; - this.$store.state.memberModalOptions.memberCount = data.memberCount; - this.$store.state.memberModalOptions.viewingMembers = data.viewingMembers; - this.$store.state.memberModalOptions.fetchMoreMembers = data.fetchMoreMembers; - this.$root.$emit('bv::show::modal', 'members-modal'); - this.getMembers(); - }); - }, - destroyed () { - this.$root.$off('habitica:show-member-modal'); - }, computed: { ...mapState({ user: 'user.data' }), isLeader () { @@ -324,7 +308,11 @@ export default { if (!isEmpty(this.sortOption)) { // Use the memberlist filtered by searchTerm - sortedMembers = orderBy(sortedMembers, [this.sortOption.value], [this.sortOption.direction]); + sortedMembers = orderBy( + sortedMembers, + [this.sortOption.value], + [this.sortOption.direction], + ); } return sortedMembers; @@ -351,6 +339,22 @@ export default { } }, }, + mounted () { + this.$root.$on('habitica:show-member-modal', data => { + // @TODO: Remove store + this.$store.state.memberModalOptions.challengeId = data.challengeId; + this.$store.state.memberModalOptions.groupId = data.groupId; + this.$store.state.memberModalOptions.group = data.group; + this.$store.state.memberModalOptions.memberCount = data.memberCount; + this.$store.state.memberModalOptions.viewingMembers = data.viewingMembers; + this.$store.state.memberModalOptions.fetchMoreMembers = data.fetchMoreMembers; + this.$root.$emit('bv::show::modal', 'members-modal'); + this.getMembers(); + }); + }, + destroyed () { + this.$root.$off('habitica:show-member-modal'); + }, methods: { sendMessage (member) { this.$root.$emit('habitica::new-inbox-message', { @@ -423,14 +427,14 @@ export default { groupId: this.groupId, memberId, }); - alert(this.$t('managerAdded')); + window.alert(this.$t('managerAdded')); }, async removeManager (memberId) { await this.$store.dispatch('guilds:removeManager', { groupId: this.groupId, memberId, }); - alert(this.$t('managerRemoved')); + window.alert(this.$t('managerRemoved')); }, close () { this.$root.$emit('bv::hide::modal', 'members-modal'); @@ -488,7 +492,7 @@ export default { groupData.leader = member._id; await this.$store.dispatch('guilds:update', { group: groupData }); - alert(this.$t('leaderChanged')); + window.alert(this.$t('leaderChanged')); groupData.leader = member; this.$root.$emit('updatedGroup', groupData); diff --git a/website/client/src/components/groups/myGuilds.vue b/website/client/src/components/groups/myGuilds.vue index 83c3d6e983..b3e4c157c1 100644 --- a/website/client/src/components/groups/myGuilds.vue +++ b/website/client/src/components/groups/myGuilds.vue @@ -101,9 +101,6 @@ export default { ], }; }, - created () { - this.fetchGuilds(); - }, computed: { ...mapState({ guilds: 'myGuilds', @@ -121,6 +118,9 @@ export default { }); }, }, + created () { + this.fetchGuilds(); + }, methods: { updateSearch (eventData) { this.search = eventData.searchTerm; diff --git a/website/client/src/components/groups/publicGuildItem.vue b/website/client/src/components/groups/publicGuildItem.vue index f6f3a2d53d..e89a99ba95 100644 --- a/website/client/src/components/groups/publicGuildItem.vue +++ b/website/client/src/components/groups/publicGuildItem.vue @@ -152,15 +152,6 @@ export default { }, mixins: [groupUtilities], props: ['guild', 'displayLeave', 'displayGemBank'], - computed: { - ...mapState({ user: 'user.data' }), - isOwner () { - return this.guild.leader && this.guild.leader === this.user._id; - }, - isMember () { - return this.isMemberOfGroup(this.user, this.guild); - }, - }, data () { return { MAX_SUMMARY_SIZE_FOR_GUILDS, @@ -172,6 +163,15 @@ export default { }), }; }, + computed: { + ...mapState({ user: 'user.data' }), + isOwner () { + return this.guild.leader && this.guild.leader === this.user._id; + }, + isMember () { + return this.isMemberOfGroup(this.user, this.guild); + }, + }, methods: { showSuggested (guildId) { const habiticaHelpingGuildId = '5481ccf3-5d2d-48a9-a871-70a7380cee5a'; @@ -181,7 +181,7 @@ export default { }, async join () { // @TODO: This needs to be in the notifications where users will now accept invites - if (this.guild.cancelledPlan && !confirm(window.env.t('aboutToJoinCancelledGroupPlan'))) { + if (this.guild.cancelledPlan && !window.confirm(window.env.t('aboutToJoinCancelledGroupPlan'))) { return; } await this.$store.dispatch('guilds:join', { groupId: this.guild._id, type: 'guild' }); diff --git a/website/client/src/components/groups/questDetailsModal.vue b/website/client/src/components/groups/questDetailsModal.vue index e442548f1e..41c3a5f7be 100644 --- a/website/client/src/components/groups/questDetailsModal.vue +++ b/website/client/src/components/groups/questDetailsModal.vue @@ -200,7 +200,10 @@ export default { for (const uuid in this.group.quest.members) { if (this.group.quest.members[uuid]) count += 1; } - if (!confirm(this.$t('questConfirm', { questmembers: count, totalmembers: this.group.memberCount }))) return; + if (!window.confirm(this.$t('questConfirm', { + questmembers: count, + totalmembers: this.group.memberCount, + }))) return; this.questForceStart(); }, async questForceStart () { @@ -209,7 +212,7 @@ export default { this.close(); }, async questCancel () { - if (!confirm(this.$t('sureCancel'))) return; + if (!window.confirm(this.$t('sureCancel'))) return; const quest = await this.$store.dispatch('quests:sendAction', { groupId: this.group._id, action: 'quests/cancel' }); this.group.quest = quest; this.close(); diff --git a/website/client/src/components/groups/questSidebarSection.vue b/website/client/src/components/groups/questSidebarSection.vue index fe6868cebf..7eb2e897ee 100644 --- a/website/client/src/components/groups/questSidebarSection.vue +++ b/website/client/src/components/groups/questSidebarSection.vue @@ -271,13 +271,13 @@ export default { this.$root.$emit('bv::show::modal', 'participant-list'); }, async questAbort () { - if (!confirm(this.$t('sureAbort'))) return; - if (!confirm(this.$t('doubleSureAbort'))) return; + if (!window.confirm(this.$t('sureAbort'))) return; + if (!window.confirm(this.$t('doubleSureAbort'))) return; const quest = await this.$store.dispatch('quests:sendAction', { groupId: this.group._id, action: 'quests/abort' }); this.group.quest = quest; }, async questLeave () { - if (!confirm(this.$t('sureLeave'))) return; + if (!window.confirm(this.$t('sureLeave'))) return; const quest = await this.$store.dispatch('quests:sendAction', { groupId: this.group._id, action: 'quests/leave' }); this.group.quest = quest; }, diff --git a/website/client/src/components/groups/startQuestModal.vue b/website/client/src/components/groups/startQuestModal.vue index c310dd4e86..1f1ffccc39 100644 --- a/website/client/src/components/groups/startQuestModal.vue +++ b/website/client/src/components/groups/startQuestModal.vue @@ -147,6 +147,12 @@ export default { quests, }; }, + computed: { + ...mapState({ user: 'user.data' }), + questData () { + return quests.quests[this.selectedQuest]; + }, + }, mounted () { const userQuests = this.user.items.quests; for (const key in userQuests) { @@ -161,12 +167,6 @@ export default { destroyed () { this.$root.$off('selectQuest', this.selectQuest); }, - computed: { - ...mapState({ user: 'user.data' }), - questData () { - return quests.quests[this.selectedQuest]; - }, - }, methods: { selectQuest (quest) { this.selectedQuest = quest.key; diff --git a/website/client/src/components/hall/heroes.vue b/website/client/src/components/hall/heroes.vue index 6b24194483..06b50ef035 100644 --- a/website/client/src/components/hall/heroes.vue +++ b/website/client/src/components/hall/heroes.vue @@ -144,28 +144,43 @@ export default { expandAuth: false, }; }, - async mounted () { - this.heroes = await this.$store.dispatch('hall:getHeroes'); - }, computed: { ...mapState({ user: 'user.data' }), }, + async mounted () { + this.heroes = await this.$store.dispatch('hall:getHeroes'); + }, methods: { getAllItemPaths () { - // let questsFormat = this.getFormattedItemReference('items.quests', keys(this.quests), 'Numeric Quantity'); - // let mountsFormat = this.getFormattedItemReference('items.mounts', keys(this.mountInfo), 'Boolean'); - // let foodFormat = this.getFormattedItemReference('items.food', keys(this.food), 'Numeric Quantity'); - // let eggsFormat = this.getFormattedItemReference('items.eggs', keys(this.eggs), 'Numeric Quantity'); - // let hatchingPotionsFormat = this.getFormattedItemReference('items.hatchingPotions', keys(this.hatchingPotions), 'Numeric Quantity'); - // let petsFormat = this.getFormattedItemReference('items.pets', keys(this.petInfo), '-1: Owns Mount, 0: Not Owned, 1-49: Progress to mount'); - // let specialFormat = this.getFormattedItemReference('items.special', keys(this.special), 'Numeric Quantity'); - // let gearFormat = this.getFormattedItemReference('items.gear.owned', keys(this.gear.flat), 'Boolean'); + // let questsFormat = this.getFormattedItemReference + // ('items.quests', keys(this.quests), 'Numeric Quantity'); + // let mountsFormat = this.getFormattedItemReference + // ('items.mounts', keys(this.mountInfo), 'Boolean'); + // let foodFormat = this.getFormattedItemReference + // ('items.food', keys(this.food), 'Numeric Quantity'); + // let eggsFormat = this.getFormattedItemReference + // ('items.eggs', keys(this.eggs), 'Numeric Quantity'); + // let hatchingPotionsFormat = this.getFormattedItemReference + // ('items.hatchingPotions', keys(this.hatchingPotions), 'Numeric Quantity'); + // let petsFormat = this.getFormattedItemReference + // ('items.pets', keys(this.petInfo), '-1: + // Owns Mount, 0: Not Owned, 1-49: Progress to mount'); + // let specialFormat = this.getFormattedItemReference + // ('items.special', keys(this.special), 'Numeric Quantity'); + // let gearFormat = this.getFormattedItemReference + // ('items.gear.owned', keys(this.gear.flat), 'Boolean'); // - // let equippedGearFormat = ''; // @TODO: '\nEquipped Gear:\n\titems.gear.{equipped/costume}.{head/headAccessory/eyewear/armor/body/back/shield/weapon}.{gearKey}\n'; - // let equippedPetFormat = ''; // @TODO: '\nEquipped Pet:\n\titems.currentPet.{petKey}\n'; - // let equippedMountFormat = ''; // @TODO: '\nEquipped Mount:\n\titems.currentMount.{mountKey}\n'; + // let equippedGearFormat = ''; // @TODO: + // '\nEquipped Gear:\n\titems.gear.{equipped/costume} + // .{head/headAccessory/eyewear/armor/body/back/shield/weapon}.{gearKey}\n'; + // let equippedPetFormat = ''; // @TODO:'\nEquipped Pet:\n\titems.currentPet.{petKey}\n'; + // let equippedMountFormat = ''; // @TODO: + // '\nEquipped Mount:\n\titems.currentMount.{mountKey}\n'; // - // let data = questsFormat.concat(mountsFormat, foodFormat, eggsFormat, hatchingPotionsFormat, petsFormat, specialFormat, gearFormat, equippedGearFormat, equippedPetFormat, equippedMountFormat); + // let data = questsFormat.concat(mountsFormat, + // foodFormat, eggsFormat, hatchingPotionsFormat, + // petsFormat, specialFormat, gearFormat, equippedGearFormat, + // equippedPetFormat, equippedMountFormat); // // return data; }, diff --git a/website/client/src/components/hall/patrons.vue b/website/client/src/components/hall/patrons.vue index ec090b9077..85234bbf01 100644 --- a/website/client/src/components/hall/patrons.vue +++ b/website/client/src/components/hall/patrons.vue @@ -28,12 +28,12 @@ export default { patrons: [], }; }, - async mounted () { - this.patrons = await this.$store.dispatch('hall:getPatrons', { page: 0 }); - }, computed: { ...mapState({ user: 'user.data' }), }, + async mounted () { + this.patrons = await this.$store.dispatch('hall:getPatrons', { page: 0 }); + }, methods: { // @TODO: Import member modal - clickMember() }, diff --git a/website/client/src/components/header/index.vue b/website/client/src/components/header/index.vue index 3104b679ff..11b2962749 100644 --- a/website/client/src/components/header/index.vue +++ b/website/client/src/components/header/index.vue @@ -129,7 +129,8 @@ export default { return true; }, hasParty () { - return this.user.party && this.user.party._id && this.partyMembers && this.partyMembers.length > 1; + return this.user.party && this.user.party._id + && this.partyMembers && this.partyMembers.length > 1; }, membersToShow () { return Math.floor(this.currentWidth / 140) + 1; @@ -138,6 +139,22 @@ export default { return orderBy(this.partyMembers, [this.user.party.order], [this.user.party.orderAscending]); }, }, + created () { + if (this.user.party && this.user.party._id) { + this.$store.state.memberModalOptions.groupId = this.user.party._id; + this.getPartyMembers(); + } + }, + mounted () { + this.$root.$on('inviteModal::inviteToGroup', group => { + this.inviteModalGroup = group; + this.inviteModalGroupType = group.type === 'guild' ? 'Guild' : 'Party'; + this.$root.$emit('bv::show::modal', 'invite-modal'); + }); + }, + destroyed () { + this.$root.off('inviteModal::inviteToGroup'); + }, methods: { ...mapActions({ getPartyMembers: 'party:getMembers', @@ -171,21 +188,5 @@ export default { } }, }, - created () { - if (this.user.party && this.user.party._id) { - this.$store.state.memberModalOptions.groupId = this.user.party._id; - this.getPartyMembers(); - } - }, - mounted () { - this.$root.$on('inviteModal::inviteToGroup', group => { - this.inviteModalGroup = group; - this.inviteModalGroupType = group.type === 'guild' ? 'Guild' : 'Party'; - this.$root.$emit('bv::show::modal', 'invite-modal'); - }); - }, - destroyed () { - this.$root.off('inviteModal::inviteToGroup'); - }, }; diff --git a/website/client/src/components/header/notificationsDropdown.vue b/website/client/src/components/header/notificationsDropdown.vue index 74d410fe78..c62d8c2d0b 100644 --- a/website/client/src/components/header/notificationsDropdown.vue +++ b/website/client/src/components/header/notificationsDropdown.vue @@ -220,7 +220,8 @@ export default { })); // Sort notifications - notifications.sort((a, b) => { // a and b are notifications + // a and b are notifications + notifications.sort((a, b) => { // eslint-disable-line array-callback-return, consistent-return const aOrder = orderMap[a.type]; const bOrder = orderMap[b.type]; @@ -261,6 +262,7 @@ export default { if (notification.seen === false && notification.id && notification.id.indexOf('custom-') !== 0) { return notification.id; } + return null; }).filter(id => Boolean(id)); if (idsToSee.length > 0) this.seeNotifications({ notificationIds: idsToSee }); @@ -273,6 +275,7 @@ export default { if (!this.isActionable(notification) && notification.id.indexOf('custom-') !== 0) { return notification.id; } + return null; }).filter(id => Boolean(id)); this.openStatus = 0; diff --git a/website/client/src/components/inventory/equipment/equipGearModal.vue b/website/client/src/components/inventory/equipment/equipGearModal.vue index d3c679399a..bab453405c 100644 --- a/website/client/src/components/inventory/equipment/equipGearModal.vue +++ b/website/client/src/components/inventory/equipment/equipGearModal.vue @@ -133,6 +133,20 @@ export default { Avatar, attributesGrid, }, + props: { + item: { + type: Object, + }, + priceType: { + type: String, + }, + costumeMode: { + type: Boolean, + }, + isEquipped: { + type: Boolean, + }, + }, data () { return { icons: Object.freeze({ @@ -198,19 +212,5 @@ export default { return this.$t(classType); }, }, - props: { - item: { - type: Object, - }, - priceType: { - type: String, - }, - costumeMode: { - type: Boolean, - }, - isEquipped: { - type: Boolean, - }, - }, }; diff --git a/website/client/src/components/inventory/equipment/index.vue b/website/client/src/components/inventory/equipment/index.vue index 8a132d48b0..d1d2afcc6c 100644 --- a/website/client/src/components/inventory/equipment/index.vue +++ b/website/client/src/components/inventory/equipment/index.vue @@ -212,6 +212,130 @@ export default { selectedSortGearBy: 'sortByName', }; }, + computed: { + ...mapState({ + content: 'content', + user: 'user.data', + ownedItems: 'user.data.items.gear.owned', + equippedItems: 'user.data.items.gear.equipped', + costumeItems: 'user.data.items.gear.costume', + flatGear: 'content.gear.flat', + }), + openStatus () { + return this.$store.state.equipmentDrawerOpen ? 1 : 0; + }, + drawerPreference () { + return this.costumeMode ? 'costume' : 'autoEquip'; + }, + activeItems () { + return this.costumeMode ? this.costumeItems : this.equippedItems; + }, + gearItemsByType () { + const searchText = this.searchTextThrottled; + const gearItemsByType = {}; + each(this.gearTypesToStrings, (string, type) => { + gearItemsByType[type] = []; + }); + + each(this.ownedItems, (isOwned, gearKey) => { + if (isOwned === true) { + const ownedItem = this.flatGear[gearKey]; + + const isSearched = !searchText + || ownedItem.text().toLowerCase().indexOf(searchText) !== -1; + + if (ownedItem.klass !== 'base' && isSearched) { + const { type } = ownedItem; + const isEquipped = this.activeItems[type] === ownedItem.key; + const viewOptions = this.viewOptions[type]; + const { firstRender } = viewOptions; + const { itemsInFirstPosition } = viewOptions; + + // Render selected items in first postion only for the first render + if (itemsInFirstPosition.indexOf(ownedItem.key) !== -1 && firstRender === false) { + gearItemsByType[type].unshift(ownedItem); + } else if (isEquipped === true && firstRender === true) { + gearItemsByType[type].unshift(ownedItem); + itemsInFirstPosition.push(ownedItem.key); + } else { + gearItemsByType[type].push(ownedItem); + } + } + } + }); + + + each(this.gearTypesToStrings, (string, type) => { + this.viewOptions[type].firstRender = false; // eslint-disable-line vue/no-side-effects-in-computed-properties, max-len + }); + + return gearItemsByType; + }, + gearItemsByClass () { + const searchText = this.searchTextThrottled; + const gearItemsByClass = {}; + each(this.gearClassesToStrings, (string, klass) => { + gearItemsByClass[klass] = []; + }); + + each(this.ownedItems, (isOwned, gearKey) => { + if (isOwned === true) { + const ownedItem = this.flatGear[gearKey]; + const { klass } = ownedItem; + + const isSearched = !searchText + || ownedItem.text().toLowerCase().indexOf(searchText) !== -1; + + if (klass !== 'base' && isSearched) { + const isEquipped = this.activeItems[ownedItem.type] === ownedItem.key; + const viewOptions = this.viewOptions[klass]; + const { firstRender } = viewOptions; + const { itemsInFirstPosition } = viewOptions; + + // Render selected items in first postion only for the first render + if (itemsInFirstPosition.indexOf(ownedItem.key) !== -1 && firstRender === false) { + gearItemsByClass[klass].unshift(ownedItem); + } else if (isEquipped === true && firstRender === true) { + gearItemsByClass[klass].unshift(ownedItem); + itemsInFirstPosition.push(ownedItem.key); + } else { + gearItemsByClass[klass].push(ownedItem); + } + } + } + }); + + each(this.gearClassesToStrings, (string, klass) => { + this.viewOptions[klass].firstRender = false; // eslint-disable-line vue/no-side-effects-in-computed-properties, max-len + }); + + return gearItemsByClass; + }, + groups () { + return this.groupBy === 'type' ? this.gearTypesToStrings : this.gearClassesToStrings; + }, + items () { + return this.groupBy === 'type' ? this.gearItemsByType : this.gearItemsByClass; + }, + anyFilterSelected () { + return Object.values(this.viewOptions).some(g => g.selected); + }, + itemsGroups () { + return map(this.groups, (label, group) => { + this.$set(this.viewOptions, group, { + selected: false, + open: false, + itemsInFirstPosition: [], + firstRender: true, + }); + + return { + key: group, + label, + }; + }); + }, + }, watch: { searchText: throttle(function throttleSearch () { this.searchTextThrottled = this.searchText.toLowerCase(); @@ -223,7 +347,9 @@ export default { this.$store.state.equipmentDrawerOpen = false; } - this.costumeMode = getLocalSetting(CONSTANTS.keyConstants.CURRENT_EQUIPMENT_DRAWER_TAB) === CONSTANTS.equipmentDrawerTabValues.COSTUME_TAB; + this.costumeMode = getLocalSetting( + CONSTANTS.keyConstants.CURRENT_EQUIPMENT_DRAWER_TAB, + ) === CONSTANTS.equipmentDrawerTabValues.COSTUME_TAB; }, methods: { selectDrawerTab (tabName) { @@ -273,133 +399,17 @@ export default { this.$store.state.equipmentDrawerOpen = newState; if (newState) { - setLocalSetting(CONSTANTS.keyConstants.EQUIPMENT_DRAWER_STATE, CONSTANTS.drawerStateValues.DRAWER_OPEN); + setLocalSetting( + CONSTANTS.keyConstants.EQUIPMENT_DRAWER_STATE, + CONSTANTS.drawerStateValues.DRAWER_OPEN, + ); return; } - setLocalSetting(CONSTANTS.keyConstants.EQUIPMENT_DRAWER_STATE, CONSTANTS.drawerStateValues.DRAWER_CLOSED); - }, - }, - computed: { - ...mapState({ - content: 'content', - user: 'user.data', - ownedItems: 'user.data.items.gear.owned', - equippedItems: 'user.data.items.gear.equipped', - costumeItems: 'user.data.items.gear.costume', - flatGear: 'content.gear.flat', - }), - openStatus () { - return this.$store.state.equipmentDrawerOpen ? 1 : 0; - }, - drawerPreference () { - return this.costumeMode ? 'costume' : 'autoEquip'; - }, - activeItems () { - return this.costumeMode ? this.costumeItems : this.equippedItems; - }, - gearItemsByType () { - const searchText = this.searchTextThrottled; - const gearItemsByType = {}; - each(this.gearTypesToStrings, (string, type) => { - gearItemsByType[type] = []; - }); - - each(this.ownedItems, (isOwned, gearKey) => { - if (isOwned === true) { - const ownedItem = this.flatGear[gearKey]; - - const isSearched = !searchText || ownedItem.text().toLowerCase().indexOf(searchText) !== -1; - - if (ownedItem.klass !== 'base' && isSearched) { - const { type } = ownedItem; - const isEquipped = this.activeItems[type] === ownedItem.key; - const viewOptions = this.viewOptions[type]; - const { firstRender } = viewOptions; - const { itemsInFirstPosition } = viewOptions; - - // Render selected items in first postion only for the first render - if (itemsInFirstPosition.indexOf(ownedItem.key) !== -1 && firstRender === false) { - gearItemsByType[type].unshift(ownedItem); - } else if (isEquipped === true && firstRender === true) { - gearItemsByType[type].unshift(ownedItem); - itemsInFirstPosition.push(ownedItem.key); - } else { - gearItemsByType[type].push(ownedItem); - } - } - } - }); - - - each(this.gearTypesToStrings, (string, type) => { - this.viewOptions[type].firstRender = false; // eslint-disable-line vue/no-side-effects-in-computed-properties - }); - - return gearItemsByType; - }, - gearItemsByClass () { - const searchText = this.searchTextThrottled; - const gearItemsByClass = {}; - each(this.gearClassesToStrings, (string, klass) => { - gearItemsByClass[klass] = []; - }); - - each(this.ownedItems, (isOwned, gearKey) => { - if (isOwned === true) { - const ownedItem = this.flatGear[gearKey]; - const { klass } = ownedItem; - - const isSearched = !searchText || ownedItem.text().toLowerCase().indexOf(searchText) !== -1; - - if (klass !== 'base' && isSearched) { - const isEquipped = this.activeItems[ownedItem.type] === ownedItem.key; - const viewOptions = this.viewOptions[klass]; - const { firstRender } = viewOptions; - const { itemsInFirstPosition } = viewOptions; - - // Render selected items in first postion only for the first render - if (itemsInFirstPosition.indexOf(ownedItem.key) !== -1 && firstRender === false) { - gearItemsByClass[klass].unshift(ownedItem); - } else if (isEquipped === true && firstRender === true) { - gearItemsByClass[klass].unshift(ownedItem); - itemsInFirstPosition.push(ownedItem.key); - } else { - gearItemsByClass[klass].push(ownedItem); - } - } - } - }); - - each(this.gearClassesToStrings, (string, klass) => { - this.viewOptions[klass].firstRender = false; // eslint-disable-line vue/no-side-effects-in-computed-properties - }); - - return gearItemsByClass; - }, - groups () { - return this.groupBy === 'type' ? this.gearTypesToStrings : this.gearClassesToStrings; - }, - items () { - return this.groupBy === 'type' ? this.gearItemsByType : this.gearItemsByClass; - }, - anyFilterSelected () { - return Object.values(this.viewOptions).some(g => g.selected); - }, - itemsGroups () { - return map(this.groups, (label, group) => { - this.$set(this.viewOptions, group, { - selected: false, - open: false, - itemsInFirstPosition: [], - firstRender: true, - }); - - return { - key: group, - label, - }; - }); + setLocalSetting( + CONSTANTS.keyConstants.EQUIPMENT_DRAWER_STATE, + CONSTANTS.drawerStateValues.DRAWER_CLOSED, + ); }, }, }; diff --git a/website/client/src/components/inventory/items/cards-modal.vue b/website/client/src/components/inventory/items/cards-modal.vue index ec5ad2d32f..562f171156 100644 --- a/website/client/src/components/inventory/items/cards-modal.vue +++ b/website/client/src/components/inventory/items/cards-modal.vue @@ -37,7 +37,10 @@ export default { }, numberOfVariations () { let numberOfVariations = 0; - if (this.cardOptions && this.cardOptions.messageOptions) numberOfVariations = this.cardOptions.messageOptions; + if ( + this.cardOptions + && this.cardOptions.messageOptions + ) numberOfVariations = this.cardOptions.messageOptions; return numberOfVariations; }, cardMessage () { @@ -48,7 +51,7 @@ export default { fromName () { let fromName = ''; const card = this.user.items.special[`${this.cardType}Received`]; - if (card && card[0]) fromName = card[0]; + if (card && card[0]) [fromName] = card; return fromName; }, }, diff --git a/website/client/src/components/inventory/items/index.vue b/website/client/src/components/inventory/items/index.vue index 4a8ef581f8..4987cddad3 100644 --- a/website/client/src/components/inventory/items/index.vue +++ b/website/client/src/components/inventory/items/index.vue @@ -264,11 +264,6 @@ export default { }, }; }, - watch: { - searchText: throttle(function throttleSearch () { - this.searchTextThrottled = this.searchText.toLowerCase(); - }, 250), - }, computed: { ...mapState({ content: 'content', @@ -281,7 +276,8 @@ export default { this.groups.forEach(group => { const groupKey = group.key; group.quantity = 0; // resetf the count - const itemsArray = itemsByType[groupKey] = []; + itemsByType[groupKey] = []; + const itemsArray = itemsByType[groupKey]; const contentItems = this.content[groupKey]; each(this.user.items[groupKey], (itemQuantity, itemKey) => { @@ -342,6 +338,11 @@ export default { return this.groups.some(g => g.selected); }, }, + watch: { + searchText: throttle(function throttleSearch () { + this.searchTextThrottled = this.searchText.toLowerCase(); + }, 250), + }, methods: { userHasPet (potionKey, eggKey) { const animalKey = `${eggKey}-${potionKey}`; diff --git a/website/client/src/components/inventory/stable/index.vue b/website/client/src/components/inventory/stable/index.vue index 1fea83fc89..c0aeedbc0a 100644 --- a/website/client/src/components/inventory/stable/index.vue +++ b/website/client/src/components/inventory/stable/index.vue @@ -411,17 +411,6 @@ export default { selectedDrawerTab: 0, }; }, - watch: { - searchText: _throttle(function throttleSearch () { - const search = this.searchText.toLowerCase(); - this.searchTextThrottled = search; - }, 250), - selectedSortBy: { - handler () { - setLocalSetting(CONSTANTS.keyConstants.STABLE_SORT_STATE, this.selectedSortBy); - }, - }, - }, computed: { ...mapState({ content: 'content', @@ -473,7 +462,7 @@ export default { }, ]; - petGroups.map(petGroup => { + petGroups.forEach(petGroup => { this.$set(this.viewOptions, petGroup.key, { selected: false, animalCount: 0, @@ -518,7 +507,7 @@ export default { }, ]; - mountGroups.map(mountGroup => { + mountGroups.forEach(mountGroup => { this.$set(this.viewOptions, mountGroup.key, { selected: false, animalCount: 0, @@ -544,6 +533,17 @@ export default { return Object.values(this.viewOptions).some(g => g.selected); }, }, + watch: { + searchText: _throttle(function throttleSearch () { + const search = this.searchText.toLowerCase(); + this.searchTextThrottled = search; + }, 250), + selectedSortBy: { + handler () { + setLocalSetting(CONSTANTS.keyConstants.STABLE_SORT_STATE, this.selectedSortBy); + }, + }, + }, methods: { setShowMore (key) { this.$_openedItemRows_toggleByType(key, !this.$_openedItemRows_isToggled(key)); @@ -615,7 +615,7 @@ export default { } // 2. Sort - switch (sort) { + switch (sort) { // eslint-disable-line default-case case 'AZ': animals = _sortBy(animals, ['eggName']); break; @@ -642,9 +642,8 @@ export default { const animals = this.getAnimalList(animalGroup, type); const countAll = animals.length; - const countOwned = _filter(animals, a => // when counting pets, include those that have been raised into mounts - a.isOwned() || a.mountOwned()); + const countOwned = _filter(animals, a => a.isOwned() || a.mountOwned()); return `${countOwned.length}/${countAll}`; }, diff --git a/website/client/src/components/inventory/stable/mountRaisedModal.vue b/website/client/src/components/inventory/stable/mountRaisedModal.vue index daa873e373..e69163c3a7 100644 --- a/website/client/src/components/inventory/stable/mountRaisedModal.vue +++ b/website/client/src/components/inventory/stable/mountRaisedModal.vue @@ -73,9 +73,6 @@ export default { return { mount: null, }; - }, - created () { - }, mounted () { this.$root.$on('habitica::mount-raised', this.openDialog); diff --git a/website/client/src/components/inventory/stable/petItem.vue b/website/client/src/components/inventory/stable/petItem.vue index 55fabceae5..1ddac32ffd 100644 --- a/website/client/src/components/inventory/stable/petItem.vue +++ b/website/client/src/components/inventory/stable/petItem.vue @@ -103,6 +103,17 @@ export default { itemId: uuid.v4(), }); }, + computed: { + ...mapState({ + userItems: 'user.data.items', + }), + potionClass () { + return `Pet_HatchingPotion_${this.item.potionKey}`; + }, + eggClass () { + return `Pet_Egg_${this.item.eggKey}`; + }, + }, methods: { click () { this.$emit('click', {}); @@ -114,7 +125,7 @@ export default { return isAllowedToFeed(this.item, this.userItems); }, getPetItemClass () { - if (this.isOwned() || this.mountOwned() && this.isHatchable()) { + if (this.isOwned() || (this.mountOwned() && this.isHatchable())) { return `Pet Pet-${this.item.key} ${this.item.eggKey}`; } @@ -148,16 +159,5 @@ export default { return isSpecial(this.item); }, }, - computed: { - ...mapState({ - userItems: 'user.data.items', - }), - potionClass () { - return `Pet_HatchingPotion_${this.item.potionKey}`; - }, - eggClass () { - return `Pet_Egg_${this.item.eggKey}`; - }, - }, }; diff --git a/website/client/src/components/memberDetails.vue b/website/client/src/components/memberDetails.vue index 44392e2757..5c72c374b6 100644 --- a/website/client/src/components/memberDetails.vue +++ b/website/client/src/components/memberDetails.vue @@ -201,12 +201,6 @@ export default { }), }; }, - methods: { - percent, - showMemberModal (member) { - this.$router.push({ name: 'userProfile', params: { userId: member._id } }); - }, - }, computed: { ...mapState({ MAX_HEALTH: 'constants.MAX_HEALTH', @@ -229,5 +223,11 @@ export default { return this.$store.getters['members:hasClass'](this.member); }, }, + methods: { + percent, + showMemberModal (member) { + this.$router.push({ name: 'userProfile', params: { userId: member._id } }); + }, + }, }; diff --git a/website/client/src/components/members/groupMemberSearchDropdown.vue b/website/client/src/components/members/groupMemberSearchDropdown.vue index 7a383e6de2..f62c8a346d 100644 --- a/website/client/src/components/members/groupMemberSearchDropdown.vue +++ b/website/client/src/components/members/groupMemberSearchDropdown.vue @@ -35,14 +35,14 @@ export default { memberResults: [], }; }, - mounted () { - this.memberResults = this.members; - }, watch: { searchTerm: debounce(function searchTerm (newSearch) { this.searchMember(newSearch); }, 500), }, + mounted () { + this.memberResults = this.members; + }, methods: { selectMember (member) { this.$emit('member-selected', member); diff --git a/website/client/src/components/modifyInventory.vue b/website/client/src/components/modifyInventory.vue index 866a75cb36..142ee47fda 100644 --- a/website/client/src/components/modifyInventory.vue +++ b/website/client/src/components/modifyInventory.vue @@ -261,9 +261,6 @@ import { mapState } from '@/libs/store'; import Content from '@/../../common/script/content'; export default { - computed: { - ...mapState({ user: 'user.data' }), - }, data () { const showInv = {}; const inv = { @@ -283,14 +280,15 @@ export default { content: Content, }; }, + computed: { + ...mapState({ user: 'user.data' }), + }, methods: { setAllItems (type, value) { const set = this.inv[type]; - for (const item in set) { - if (set.hasOwnProperty(item)) { - set[item] = value; - } + for (const item of Object.keys(set)) { + set[item] = value; } }, async modifyInventory () { diff --git a/website/client/src/components/notifications.vue b/website/client/src/components/notifications.vue index 1f55641fd6..a5f7e9d278 100644 --- a/website/client/src/components/notifications.vue +++ b/website/client/src/components/notifications.vue @@ -433,11 +433,14 @@ export default { } }, checkUserAchievements () { - if (this.user.needsCron) return; + if (this.user.needsCron) return null; - // List of prompts for user on changes. Sounds like we may need a refactor here, but it is clean for now + // List of prompts for user on changes. + // Sounds like we may need a refactor here, but it is clean for now if (!this.user.flags.welcomed) { - if (this.$store.state.avatarEditorOptions) this.$store.state.avatarEditorOptions.editingUser = false; + if (this.$store.state.avatarEditorOptions) { + this.$store.state.avatarEditorOptions.editingUser = false; + } return this.$root.$emit('bv::show::modal', 'avatar-modal'); } @@ -458,6 +461,8 @@ export default { this.playSound('Achievement_Unlocked'); return this.$root.$emit('bv::show::modal', 'choose-class'); } + + return null; }, showLevelUpNotifications (newlevel) { this.lvl(); @@ -470,7 +475,11 @@ export default { this.$root.$emit('playSound', sound); }, checkNextCron: throttle(function checkNextCron () { - if (!this.$store.state.isRunningYesterdailies && this.nextCron && Date.now() > this.nextCron) { + if ( + !this.$store.state.isRunningYesterdailies + && this.nextCron + && Date.now() > this.nextCron + ) { Promise.all([ this.$store.dispatch('user:fetch', { forceLoad: true }), this.$store.dispatch('tasks:fetchUserTasks', { forceLoad: true }), @@ -540,7 +549,10 @@ export default { this.$store.state.isRunningYesterdailies = false; - if (this.levelBeforeYesterdailies > 0 && this.levelBeforeYesterdailies < this.user.stats.lvl) { + if ( + this.levelBeforeYesterdailies > 0 + && this.levelBeforeYesterdailies < this.user.stats.lvl + ) { this.showLevelUpNotifications(this.user.stats.lvl); } @@ -571,7 +583,7 @@ export default { let markAsRead = true; // @TODO: Use factory function instead - switch (notification.type) { + switch (notification.type) { // eslint-disable-line default-case case 'GUILD_PROMPT': // @TODO: I'm pretty sure we can find better names for these if (notification.data.textletiant === -1) { @@ -619,7 +631,7 @@ export default { break; case 'SCORED_TASK': // Search if it is a read notification - for (let i = 0; i < this.alreadyReadNotification.length; i++) { + for (let i = 0; i < this.alreadyReadNotification.length; i += 1) { if (this.alreadyReadNotification[i] === notification.id) { markAsRead = false; // Do not let it be read again break; @@ -659,7 +671,7 @@ export default { // Only run this code for scoring approved tasks if (scoreTaskNotification.length > 0) { const approvedTasks = []; - for (let i = 0; i < scoreTaskNotification.length; i++) { + for (let i = 0; i < scoreTaskNotification.length; i += 1) { // Array with all approved tasks const scoreData = scoreTaskNotification[i].data; let direction = 'up'; diff --git a/website/client/src/components/payments/amazonButton.vue b/website/client/src/components/payments/amazonButton.vue index 9924df7691..1e37215017 100644 --- a/website/client/src/components/payments/amazonButton.vue +++ b/website/client/src/components/payments/amazonButton.vue @@ -62,13 +62,14 @@ export default { this.amazonPaymentsInit(this.amazonData); if (this.isAmazonReady) return this.setupAmazon(); - this.$store.watch(state => state.isAmazonReady, isAmazonReady => { + return this.$store.watch(state => state.isAmazonReady, isAmazonReady => { if (isAmazonReady) return this.setupAmazon(); + return null; }); }, methods: { setupAmazon () { - if (this.isAmazonSetup) return false; + if (this.isAmazonSetup) return; this.isAmazonSetup = true; this.showButton(); }, @@ -91,16 +92,17 @@ export default { this.$root.$emit('habitica::pay-with-amazon', this.amazonPayments); }, authorization: () => { - if (this.amazonDisabled === true) return null; + if (this.amazonDisabled === true) return; + window.amazon.Login.authorize({ scope: 'payments:widget', popup: true, }, response => { - if (response.error) return alert(response.error); + if (response.error) return window.alert(response.error); const url = '/amazon/verifyAccessToken'; - axios.post(url, response).catch(e => { - alert(e.message); + return axios.post(url, response).catch(e => { + window.alert(e.message); }); }); }, diff --git a/website/client/src/components/payments/amazonModal.vue b/website/client/src/components/payments/amazonModal.vue index 90c605a4ae..8ae4903c11 100644 --- a/website/client/src/components/payments/amazonModal.vue +++ b/website/client/src/components/payments/amazonModal.vue @@ -35,7 +35,7 @@ import * as Analytics from '@/libs/analytics'; import { mapState } from '@/libs/store'; import { CONSTANTS, setLocalSetting } from '@/libs/userlocalManager'; -const habiticaUrl = `${location.protocol}//${location.host}`; +const habiticaUrl = `${window.location.protocol}//${window.location.host}`; export default { data () { @@ -95,7 +95,7 @@ export default { this.amazonPayments.orderReferenceId = response.data.data.orderReferenceId; this.amazonInitWidgets(); } else { - alert(response.message); + window.alert(response.message); } } }); diff --git a/website/client/src/components/payments/buyGemsModal.vue b/website/client/src/components/payments/buyGemsModal.vue index 04f0d0a66c..6767e50cfe 100644 --- a/website/client/src/components/payments/buyGemsModal.vue +++ b/website/client/src/components/payments/buyGemsModal.vue @@ -329,22 +329,10 @@ export default { planGemLimits, amazonButton, }, - mixins: [paymentsMixin], - computed: { - ...mapState({ user: 'user.data' }), - startingPageOption () { - return this.$store.state.gemModalOptions.startingPage; - }, - hasSubscription () { - return Boolean(this.user.purchased.plan.customerId); - }, - userReachedGemCap () { - return this.user.purchased.plan.customerId && this.user.purchased.plan.gemsBought >= this.user.purchased.plan.consecutive.gemCapExtra + this.planGemLimits.convCap; - }, - }, directives: { markdown, }, + mixins: [paymentsMixin], data () { return { icons: Object.freeze({ @@ -363,6 +351,19 @@ export default { planGemLimits, }; }, + computed: { + ...mapState({ user: 'user.data' }), + startingPageOption () { + return this.$store.state.gemModalOptions.startingPage; + }, + hasSubscription () { + return Boolean(this.user.purchased.plan.customerId); + }, + userReachedGemCap () { + return this.user.purchased.plan.customerId + && this.user.purchased.plan.gemsBought >= this.user.purchased.plan.consecutive.gemCapExtra + this.planGemLimits.convCap; + }, + }, watch: { startingPageOption () { this.selectedPage = this.$store.state.gemModalOptions.startingPage; diff --git a/website/client/src/components/payments/sendGemsModal.vue b/website/client/src/components/payments/sendGemsModal.vue index 0174162ba9..71cb106c4f 100644 --- a/website/client/src/components/payments/sendGemsModal.vue +++ b/website/client/src/components/payments/sendGemsModal.vue @@ -153,7 +153,11 @@ export default { return this.$t('sendGiftHeading', { name: this.userReceivingGems.profile.name }); }, receiverName () { - if (this.userReceivingGems.auth && this.userReceivingGems.auth.local && this.userReceivingGems.auth.local.username) { + if ( + this.userReceivingGems.auth + && this.userReceivingGems.auth.local + && this.userReceivingGems.auth.local.username + ) { return this.userReceivingGems.auth.local.username; } return this.userReceivingGems.profile.name; diff --git a/website/client/src/components/selectMembersModal.vue b/website/client/src/components/selectMembersModal.vue index 616db77973..d24e261d27 100644 --- a/website/client/src/components/selectMembersModal.vue +++ b/website/client/src/components/selectMembersModal.vue @@ -187,7 +187,7 @@ export default { this.members = this.$store.state.memberModalOptions.viewingMembers; } - if (!this.members || this.members.length === 0 && !this.groupId) { + if (!this.members || (this.members.length === 0 && !this.groupId)) { this.members = [this.user]; } }, diff --git a/website/client/src/components/settings/api.vue b/website/client/src/components/settings/api.vue index 1ea459e56e..02f9b692e2 100644 --- a/website/client/src/components/settings/api.vue +++ b/website/client/src/components/settings/api.vue @@ -86,18 +86,18 @@ export default { showApiToken: false, }; }, - mounted () { - window.addEventListener('message', this.receiveMessage, false); - }, - destroy () { - window.removeEventListener('message', this.receiveMessage); - }, computed: { ...mapState({ user: 'user.data', credentials: 'credentials' }), apiToken () { return this.credentials.API_TOKEN; }, }, + mounted () { + window.addEventListener('message', this.receiveMessage, false); + }, + destroy () { + window.removeEventListener('message', this.receiveMessage); + }, methods: { receiveMessage (eventFrom) { if (eventFrom.origin !== 'https://www.spritely.app') return; diff --git a/website/client/src/components/settings/promoCode.vue b/website/client/src/components/settings/promoCode.vue index 836699ff09..48e148cc55 100644 --- a/website/client/src/components/settings/promoCode.vue +++ b/website/client/src/components/settings/promoCode.vue @@ -45,11 +45,13 @@ export default { }, methods: { generateCodes () { - // $http.post(ApiUrl.get() + '/api/v2/coupons/generate/'+codes.event+'?count='+(codes.count || 1)) + // $http.post(ApiUrl.get() + '/api/v2/coupons/generate/ + // '+codes.event+'?count='+(codes.count || 1)) // .success(function(res,code){ // $scope._codes = {}; // if (code!==200) return; - // window.location.href = '/api/v2/coupons?limit='+codes.count+'&_id='+User.user._id+'&apiToken='+User.settings.auth.apiToken; + // window.location.href = '/api/v2/coupons?limit='+codes.count+'&_id='+User.user._id+ + // '&apiToken='+User.settings.auth.apiToken; // }) }, async enterCoupon () { diff --git a/website/client/src/components/settings/restoreModal.vue b/website/client/src/components/settings/restoreModal.vue index 73f1b84e46..bdbdb57e66 100644 --- a/website/client/src/components/settings/restoreModal.vue +++ b/website/client/src/components/settings/restoreModal.vue @@ -67,13 +67,13 @@ export default { }, }; }, + computed: { + ...mapState({ user: 'user.data' }), + }, mounted () { this.restoreValues.stats = clone(this.user.stats); this.restoreValues.achievements.streak = clone(this.user.achievements.streak); }, - computed: { - ...mapState({ user: 'user.data' }), - }, methods: { close () { this.$root.$emit('bv::hide::modal', 'restore'); diff --git a/website/client/src/components/settings/site.vue b/website/client/src/components/settings/site.vue index 88a077076e..f320576415 100644 --- a/website/client/src/components/settings/site.vue +++ b/website/client/src/components/settings/site.vue @@ -261,33 +261,6 @@ export default { usernameIssues: [], }; }, - mounted () { - this.SOCIAL_AUTH_NETWORKS = SUPPORTED_SOCIAL_NETWORKS; - // @TODO: We may need to request the party here - this.party = this.$store.state.party; - this.newDayStart = this.user.preferences.dayStart; - this.usernameUpdates.username = this.user.auth.local.username || null; - this.temporaryDisplayName = this.user.profile.name; - this.emailUpdates.newEmail = this.user.auth.local.email || null; - this.localAuth.username = this.user.auth.local.username || null; - this.soundIndex = 0; - hello.init({ - facebook: process.env.FACEBOOK_KEY, // eslint-disable-line no-process-env - google: process.env.GOOGLE_CLIENT_ID, // eslint-disable-line no-process-env - }, { - redirect_uri: '', // eslint-disable-line - }); - - const focusID = this.$route.query.focus; - if (focusID !== undefined && focusID !== null) { - this.$nextTick(() => { - const element = document.getElementById(focusID); - if (element !== undefined && element !== null) { - element.focus(); - } - }); - } - }, computed: { ...mapState({ user: 'user.data', @@ -358,6 +331,33 @@ export default { deep: true, }, }, + mounted () { + this.SOCIAL_AUTH_NETWORKS = SUPPORTED_SOCIAL_NETWORKS; + // @TODO: We may need to request the party here + this.party = this.$store.state.party; + this.newDayStart = this.user.preferences.dayStart; + this.usernameUpdates.username = this.user.auth.local.username || null; + this.temporaryDisplayName = this.user.profile.name; + this.emailUpdates.newEmail = this.user.auth.local.email || null; + this.localAuth.username = this.user.auth.local.username || null; + this.soundIndex = 0; + hello.init({ + facebook: process.env.FACEBOOK_KEY, // eslint-disable-line no-process-env + google: process.env.GOOGLE_CLIENT_ID, // eslint-disable-line no-process-env + }, { + redirect_uri: '', // eslint-disable-line + }); + + const focusID = this.$route.query.focus; + if (focusID !== undefined && focusID !== null) { + this.$nextTick(() => { + const element = document.getElementById(focusID); + if (element !== undefined && element !== null) { + element.focus(); + } + }); + } + }, methods: { validateDisplayName: debounce(function checkName (displayName) { if (displayName.length <= 1 || displayName === this.user.profile.name) { @@ -422,10 +422,12 @@ export default { return find(this.SOCIAL_AUTH_NETWORKS, network => { if (network.key !== networkKeyToCheck) { - if (this.user.auth.hasOwnProperty(network.key)) { + if (this.user.auth[network.key]) { return this.user.auth[network.key].id; } } + + return false; }); }, calculateNextCron () { @@ -442,7 +444,7 @@ export default { openDayStartModal () { const nextCron = this.calculateNextCron(); // @TODO: Add generic modal - if (!confirm(this.$t('sureChangeCustomDayStartTime', { time: nextCron }))) return; + if (!window.confirm(this.$t('sureChangeCustomDayStartTime', { time: nextCron }))) return; this.saveDayStart(); // $rootScope.openModal('change-day-start', { scope: $scope }); }, @@ -472,7 +474,7 @@ export default { }, async changeDisplayName (newName) { await axios.put('/api/v4/user/', { 'profile.name': newName }); - alert(this.$t('displayNameSuccess')); + window.alert(this.$t('displayNameSuccess')); this.user.profile.name = newName; this.temporaryDisplayName = newName; }, @@ -499,17 +501,17 @@ export default { window.location.href = '/'; }, async changeClassForUser (confirmationNeeded) { - if (confirmationNeeded && !confirm(this.$t('changeClassConfirmCost'))) return; + if (confirmationNeeded && !window.confirm(this.$t('changeClassConfirmCost'))) return; try { changeClass(this.user); await axios.post('/api/v4/user/change-class'); } catch (e) { - alert(e.message); + window.alert(e.message); } }, async addLocalAuth () { await axios.post('/api/v4/user/auth/local/register', this.localAuth); - alert(this.$t('addedLocalAuth')); + window.alert(this.$t('addedLocalAuth')); }, restoreEmptyUsername () { if (this.usernameUpdates.username.length < 1) { diff --git a/website/client/src/components/settings/subscription.vue b/website/client/src/components/settings/subscription.vue index df7750a4e2..908b5e7dc8 100644 --- a/website/client/src/components/settings/subscription.vue +++ b/website/client/src/components/settings/subscription.vue @@ -157,7 +157,8 @@ export default { purchasedPlanIdInfo () { if (!this.subscriptionBlocks[this.user.purchased.plan.planId]) { // @TODO: find which subs are in the common - // console.log(this.subscriptionBlocks[this.user.purchased.plan.planId]); // eslint-disable-line + // console.log(this.subscriptionBlocks + // [this.user.purchased.plan.planId]); // eslint-disable-line return { price: 0, months: 0, @@ -196,7 +197,8 @@ export default { return this.user.purchased.plan.customerId === 'group-plan'; }, hasConsecutiveSubscription () { - return Boolean(this.user.purchased.plan.consecutive.count) || Boolean(this.user.purchased.plan.consecutive.offset); + return Boolean(this.user.purchased.plan.consecutive.count) + || Boolean(this.user.purchased.plan.consecutive.offset); }, purchasedPlanExtraMonthsDetails () { return { diff --git a/website/client/src/components/settings/usernameForm.vue b/website/client/src/components/settings/usernameForm.vue index 92b84fb05b..a239c54818 100644 --- a/website/client/src/components/settings/usernameForm.vue +++ b/website/client/src/components/settings/usernameForm.vue @@ -100,6 +100,20 @@ import debounce from 'lodash/debounce'; import { mapState } from '@/libs/store'; export default { + props: { + avatarIntro: { + type: Boolean, + default: false, + }, + }, + data () { + return { + displayNameIssues: [], + temporaryDisplayName: '', + temporaryUsername: '', + usernameIssues: [], + }; + }, computed: { ...mapState({ user: 'user.data', @@ -125,13 +139,23 @@ export default { return this.usernameIssues.length === 0; }, }, - data () { - return { - displayNameIssues: [], - temporaryDisplayName: '', - temporaryUsername: '', - usernameIssues: [], - }; + watch: { + temporaryDisplayName: { + handler () { + this.validateDisplayName(this.temporaryDisplayName); + }, + deep: true, + }, + temporaryUsername: { + handler () { + this.validateUsername(this.temporaryUsername); + }, + deep: true, + }, + }, + mounted () { + this.temporaryDisplayName = this.user.profile.name; + this.temporaryUsername = this.user.auth.local.username; }, methods: { async close () { @@ -193,29 +217,5 @@ export default { }); }, 500), }, - watch: { - temporaryDisplayName: { - handler () { - this.validateDisplayName(this.temporaryDisplayName); - }, - deep: true, - }, - temporaryUsername: { - handler () { - this.validateUsername(this.temporaryUsername); - }, - deep: true, - }, - }, - mounted () { - this.temporaryDisplayName = this.user.profile.name; - this.temporaryUsername = this.user.auth.local.username; - }, - props: { - avatarIntro: { - type: Boolean, - default: false, - }, - }, }; diff --git a/website/client/src/components/shared/inventoryDrawer.vue b/website/client/src/components/shared/inventoryDrawer.vue index 481593f677..c13e87b011 100644 --- a/website/client/src/components/shared/inventoryDrawer.vue +++ b/website/client/src/components/shared/inventoryDrawer.vue @@ -145,10 +145,13 @@ export default { case 'food': return this.$t('noFoodAvailable'); case 'special': return this.$t('noSaddlesAvailable'); default: - // @TODO: Change any places using similar locales from `pets.json` and use these new locales from 'inventory.json' + // @TODO: Change any places using similar locales + // from `pets.json` and use these new locales from 'inventory.json' return this.$t('noItemsAvailableForType', { type: this.$t(`${type}ItemType`) }); } } + + return null; }, }, }; diff --git a/website/client/src/components/shops/balanceInfo.vue b/website/client/src/components/shops/balanceInfo.vue index 4d4414704b..265bd79294 100644 --- a/website/client/src/components/shops/balanceInfo.vue +++ b/website/client/src/components/shops/balanceInfo.vue @@ -90,7 +90,10 @@ export default { }); for (const currency of currencies) { - if (currency.type === this.currencyNeeded && !this.enoughCurrency(this.currencyNeeded, this.amountNeeded)) { + if ( + currency.type === this.currencyNeeded + && !this.enoughCurrency(this.currencyNeeded, this.amountNeeded) + ) { currency.notEnough = true; } } diff --git a/website/client/src/components/shops/buyModal.vue b/website/client/src/components/shops/buyModal.vue index 3a4756a257..25a5f40195 100644 --- a/website/client/src/components/shops/buyModal.vue +++ b/website/client/src/components/shops/buyModal.vue @@ -373,7 +373,8 @@ export default { }, gemsLeft () { if (!this.user.purchased.plan) return 0; - return planGemLimits.convCap + this.user.purchased.plan.consecutive.gemCapExtra - this.user.purchased.plan.gemsBought; + return planGemLimits.convCap + + this.user.purchased.plan.consecutive.gemCapExtra - this.user.purchased.plan.gemsBought; }, attemptingToPurchaseMoreGemsThanAreLeft () { if (this.item && this.item.key && this.item.key === 'gem' && this.selectedAmountToBuy > this.gemsLeft) return true; @@ -397,7 +398,8 @@ export default { this.$emit('change', $event); }, buyItem () { - // @TODO: I think we should buying to the items. Turn the items into classes, and use polymorphism + // @TODO: I think we should buying to the items. + // Turn the items into classes, and use polymorphism if (this.item.buy) { this.item.buy(); this.$emit('buyPressed', this.item); @@ -405,7 +407,10 @@ export default { return; } - if (this.item.pinType === 'premiumHatchingPotion' || this.item.pinType === 'eggs' && dropEggKeys.indexOf(this.item.key) === -1) { + if ( + this.item.pinType === 'premiumHatchingPotion' + || (this.item.pinType === 'eggs' && dropEggKeys.indexOf(this.item.key) === -1) + ) { let petsRemaining = 20 - this.selectedAmountToBuy; petsRemaining -= reduce(this.user.items.pets, (sum, petValue, petKey) => { if (petKey.indexOf(this.item.key) !== -1 && petValue > 0) return sum + 1; @@ -421,11 +426,17 @@ export default { petsRemaining -= this.user.items.eggs[this.item.key] || 0; } - if (petsRemaining < 0 && !confirm(this.$t('purchasePetItemConfirm', { itemText: this.item.text }))) return; + if ( + petsRemaining < 0 + && !window.confirm(this.$t('purchasePetItemConfirm', { itemText: this.item.text })) + ) return; } const shouldConfirmPurchase = this.item.currency === 'gems' || this.item.currency === 'hourglasses'; - if (shouldConfirmPurchase && !this.confirmPurchase(this.item.currency, this.item.value * this.selectedAmountToBuy)) { + if ( + shouldConfirmPurchase + && !this.confirmPurchase(this.item.currency, this.item.value * this.selectedAmountToBuy) + ) { return; } @@ -477,7 +488,7 @@ export default { return true; }, getAvatarOverrides (item) { - switch (item.purchaseType) { + switch (item.purchaseType) { // eslint-disable-line default-case case 'gear': return { [item.type]: item.key, @@ -489,7 +500,7 @@ export default { case 'mystery_set': { const gear = {}; - item.items.map(setItem => { + item.items.forEach(setItem => { gear[setItem.type] = setItem.key; }); diff --git a/website/client/src/components/shops/market/categoryItem.vue b/website/client/src/components/shops/market/categoryItem.vue index b6f466eaee..300b7de53a 100644 --- a/website/client/src/components/shops/market/categoryItem.vue +++ b/website/client/src/components/shops/market/categoryItem.vue @@ -45,7 +45,8 @@ export default { }, gemsLeft () { if (!this.user.purchased.plan) return 0; - return planGemLimits.convCap + this.user.purchased.plan.consecutive.gemCapExtra - this.user.purchased.plan.gemsBought; + return planGemLimits.convCap + + this.user.purchased.plan.consecutive.gemCapExtra - this.user.purchased.plan.gemsBought; }, }, }; diff --git a/website/client/src/components/shops/market/categoryRow.vue b/website/client/src/components/shops/market/categoryRow.vue index 1abd2329b2..91aab28eab 100644 --- a/website/client/src/components/shops/market/categoryRow.vue +++ b/website/client/src/components/shops/market/categoryRow.vue @@ -41,7 +41,8 @@ export default { }), gemsLeft () { if (!this.user.purchased.plan) return 0; - return planGemLimits.convCap + this.user.purchased.plan.consecutive.gemCapExtra - this.user.purchased.plan.gemsBought; + return planGemLimits.convCap + + this.user.purchased.plan.consecutive.gemCapExtra - this.user.purchased.plan.gemsBought; }, sortedMarketItems () { let result = _map(this.category.items, e => ({ @@ -64,7 +65,7 @@ export default { return true; }); - switch (this.sortBy) { + switch (this.sortBy) { // eslint-disable-line default-case case 'AZ': { result = _sortBy(result, ['text']); diff --git a/website/client/src/components/shops/market/equipmentSection.vue b/website/client/src/components/shops/market/equipmentSection.vue index 34d81d8aea..db6f52dad5 100644 --- a/website/client/src/components/shops/market/equipmentSection.vue +++ b/website/client/src/components/shops/market/equipmentSection.vue @@ -65,7 +65,10 @@ import svgHealer from '@/assets/svg/healer.svg'; import pinUtils from '../../../mixins/pinUtils'; -const sortGearTypes = ['sortByType', 'sortByPrice', 'sortByCon', 'sortByPer', 'sortByStr', 'sortByInt'].map(g => ({ id: g })); +const sortGearTypes = [ + 'sortByType', 'sortByPrice', 'sortByCon', + 'sortByPer', 'sortByStr', 'sortByInt', +].map(g => ({ id: g })); const sortGearTypeMap = { sortByType: 'type', diff --git a/website/client/src/components/shops/market/index.vue b/website/client/src/components/shops/market/index.vue index 5b557d1211..5b705076fc 100644 --- a/website/client/src/components/shops/market/index.vue +++ b/website/client/src/components/shops/market/index.vue @@ -189,11 +189,6 @@ export default { SelectMembersModal, }, mixins: [notifications, buyMixin, currencyMixin, inventoryUtils, pinUtils], - watch: { - searchText: _throttle(function throttleSearch () { - this.searchTextThrottled = this.searchText.toLowerCase(); - }, 250), - }, data () { return { viewOptions: { @@ -221,10 +216,6 @@ export default { broken: false, }; }, - async mounted () { - const worldState = await this.$store.dispatch('worldState:getWorldState'); - this.broken = worldState && worldState.worldBoss && worldState.worldBoss.extra && worldState.worldBoss.extra.worldDmg && worldState.worldBoss.extra.worldDmg.market; - }, computed: { ...mapState({ content: 'content', @@ -282,7 +273,7 @@ export default { }); } - categories.map(category => { + categories.forEach(category => { if (!this.viewOptions[category.identifier]) { this.$set(this.viewOptions, category.identifier, { selected: false, @@ -297,6 +288,17 @@ export default { return Object.values(this.viewOptions).some(g => g.selected); }, }, + watch: { + searchText: _throttle(function throttleSearch () { + this.searchTextThrottled = this.searchText.toLowerCase(); + }, 250), + }, + async mounted () { + const worldState = await this.$store.dispatch('worldState:getWorldState'); + this.broken = worldState && worldState.worldBoss + && worldState.worldBoss.extra && worldState.worldBoss.extra.worldDmg + && worldState.worldBoss.extra.worldDmg.market; + }, methods: { sellItem (itemScope) { this.$root.$emit('sellItem', itemScope); @@ -322,9 +324,12 @@ export default { }, inventoryDrawerErrorMessage (type) { if (!this.hasOwnedItemsForType(type)) { - // @TODO: Change any places using similar locales from `pets.json` and use these new locales from 'inventory.json' + // @TODO: Change any places using similar locales + // from `pets.json` and use these new locales from 'inventory.json' return this.$t('noItemsAvailableForType', { type: this.$t(`${type}ItemType`) }); } + + return null; }, itemSelected (item) { this.$root.$emit('buyModal::showItem', item); diff --git a/website/client/src/components/shops/market/keysToKennel.vue b/website/client/src/components/shops/market/keysToKennel.vue index 153e04ff1a..2b39a20892 100644 --- a/website/client/src/components/shops/market/keysToKennel.vue +++ b/website/client/src/components/shops/market/keysToKennel.vue @@ -84,7 +84,7 @@ export default { purchaseType: 'keys', pinType: 'keys', buy: () => { - if (!confirm(this.$t('releasePetsConfirm'))) return; + if (!window.confirm(this.$t('releasePetsConfirm'))) return; try { this.$store.dispatch('shops:releasePets', { user: this.user }); this.text(this.$t('releasePetsSuccess')); @@ -92,7 +92,7 @@ export default { // Reload because achievement is set in user.save instead of common window.location.reload(true); } catch (err) { - alert(err.message); + window.alert(err.message); } }, }, @@ -107,7 +107,7 @@ export default { purchaseType: 'keys', pinType: 'keys', buy: () => { - if (!confirm(this.$t('releaseMountsConfirm'))) return; + if (!window.confirm(this.$t('releaseMountsConfirm'))) return; try { this.$store.dispatch('shops:releaseMounts', { user: this.user }); this.text(this.$t('releaseMountsSuccess')); @@ -115,7 +115,7 @@ export default { // Reload because achievement is set in user.save instead of common window.location.reload(true); } catch (err) { - alert(err.message); + window.alert(err.message); } }, }, @@ -130,7 +130,7 @@ export default { purchaseType: 'keys', pinType: 'keys', buy: () => { - if (!confirm(this.$t('releaseBothConfirm'))) return; + if (!window.confirm(this.$t('releaseBothConfirm'))) return; try { this.$store.dispatch('shops:releaseBoth', { user: this.user }); this.text(this.$t('releaseBothSuccess')); @@ -138,7 +138,7 @@ export default { // Reload because achievement is set in user.save instead of common window.location.reload(true); } catch (err) { - alert(err.message); + window.alert(err.message); } }, }, diff --git a/website/client/src/components/shops/quests/buyQuestModal.vue b/website/client/src/components/shops/quests/buyQuestModal.vue index 5573d003e3..28019c3198 100644 --- a/website/client/src/components/shops/quests/buyQuestModal.vue +++ b/website/client/src/components/shops/quests/buyQuestModal.vue @@ -223,6 +223,17 @@ export default { questDialogContent, }, mixins: [buyMixin, currencyMixin, notifications, numberInvalid], + props: { + item: { + type: Object, + }, + priceType: { + type: String, + }, + withPin: { + type: Boolean, + }, + }, data () { return { icons: Object.freeze({ @@ -238,11 +249,6 @@ export default { selectedAmountToBuy: 1, }; }, - watch: { - item: function itemChanged () { - this.isPinned = this.item && this.item.pinned; - }, - }, computed: { ...mapState({ content: 'content', @@ -265,6 +271,11 @@ export default { return this.icons.gem; }, }, + watch: { + item: function itemChanged () { + this.isPinned = this.item && this.item.pinned; + }, + }, methods: { onChange ($event) { this.selectedAmountToBuy = 1; @@ -324,16 +335,5 @@ export default { this.$root.$emit('bv::show::modal', 'buy-gems'); }, }, - props: { - item: { - type: Object, - }, - priceType: { - type: String, - }, - withPin: { - type: Boolean, - }, - }, }; diff --git a/website/client/src/components/shops/quests/index.vue b/website/client/src/components/shops/quests/index.vue index be963d5a3b..56dd8711b6 100644 --- a/website/client/src/components/shops/quests/index.vue +++ b/website/client/src/components/shops/quests/index.vue @@ -367,11 +367,6 @@ export default { QuestInfo, }, mixins: [buyMixin, currencyMixin, pinUtils], - watch: { - searchText: _throttle(function throttleSearch () { - this.searchTextThrottled = this.searchText.toLowerCase(); - }, 250), - }, data () { return { viewOptions: {}, @@ -394,10 +389,6 @@ export default { broken: false, }; }, - async mounted () { - const worldState = await this.$store.dispatch('worldState:getWorldState'); - this.broken = worldState && worldState.worldBoss && worldState.worldBoss.extra && worldState.worldBoss.extra.worldDmg && worldState.worldBoss.extra.worldDmg.quests; - }, computed: { ...mapState({ content: 'content', @@ -410,7 +401,7 @@ export default { }, categories () { if (this.shop.categories) { - this.shop.categories.map(category => { + this.shop.categories.forEach(category => { this.$set(this.viewOptions, category.identifier, { selected: false, }); @@ -425,6 +416,16 @@ export default { return Object.values(this.viewOptions).some(g => g.selected); }, }, + watch: { + searchText: _throttle(function throttleSearch () { + this.searchTextThrottled = this.searchText.toLowerCase(); + }, 250), + }, + async mounted () { + const worldState = await this.$store.dispatch('worldState:getWorldState'); + this.broken = worldState && worldState.worldBoss && worldState.worldBoss.extra + && worldState.worldBoss.extra.worldDmg && worldState.worldBoss.extra.worldDmg.quests; + }, methods: { questItems (category, sortBy, searchBy, hideLocked, hidePinned) { let result = _map(category.items, e => ({ @@ -443,7 +444,7 @@ export default { return !searchBy || i.text.toLowerCase().indexOf(searchBy) !== -1; }); - switch (sortBy) { + switch (sortBy) { // eslint-disable-line default-case case 'AZ': { result = _sortBy(result, ['text']); diff --git a/website/client/src/components/shops/quests/questInfo.vue b/website/client/src/components/shops/quests/questInfo.vue index 0609ae0b36..a110d296f5 100644 --- a/website/client/src/components/shops/quests/questInfo.vue +++ b/website/client/src/components/shops/quests/questInfo.vue @@ -132,7 +132,7 @@ export default { const result = []; const { difficulty } = this; - for (let i = 1; i <= 4; i++) { + for (let i = 1; i <= 4; i += 1) { const diff = difficulty - i; if (diff >= 0) { diff --git a/website/client/src/components/shops/seasonal/index.vue b/website/client/src/components/shops/seasonal/index.vue index 5dec3bef91..6c570fcc6e 100644 --- a/website/client/src/components/shops/seasonal/index.vue +++ b/website/client/src/components/shops/seasonal/index.vue @@ -331,11 +331,6 @@ export default { Avatar, }, mixins: [buyMixin, currencyMixin, pinUtils], - watch: { - searchText: _throttle(function throttleSearch () { - this.searchTextThrottled = this.searchText.toLowerCase(); - }, 250), - }, data () { return { viewOptions: {}, @@ -372,10 +367,6 @@ export default { broken: false, }; }, - async mounted () { - const worldState = await this.$store.dispatch('worldState:getWorldState'); - this.broken = worldState && worldState.worldBoss && worldState.worldBoss.extra && worldState.worldBoss.extra.worldDmg && worldState.worldBoss.extra.worldDmg.seasonalShop; - }, computed: { ...mapState({ content: 'content', @@ -389,18 +380,19 @@ export default { seasonal () { // vue subscriptions, don't remove - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line - const myUserVersion = this.user._v; // eslint-disable-line + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + const myUserVersion = this.user._v; // eslint-disable-line const seasonal = shops.getSeasonalShop(this.user); - const itemsNotOwned = seasonal.featured.items.filter(item => !this.user.items.gear.owned[item.key]); + const itemsNotOwned = seasonal.featured.items + .filter(item => !this.user.items.gear.owned[item.key]); seasonal.featured.items = itemsNotOwned; // If we are out of gear, show the spells // @TODO: add dates to check instead? if (seasonal.featured.items.length === 0) { - this.featuredGearBought = true; // eslint-disable-line vue/no-side-effects-in-computed-properties + this.featuredGearBought = true; // eslint-disable-line vue/no-side-effects-in-computed-properties, max-len if (seasonal.categories.length > 0) { seasonal.featured.items = seasonal.featured.items.concat(seasonal.categories[0].items); } @@ -444,6 +436,16 @@ export default { return Object.values(this.viewOptions).some(g => g.selected); }, }, + watch: { + searchText: _throttle(function throttleSearch () { + this.searchTextThrottled = this.searchText.toLowerCase(); + }, 250), + }, + async mounted () { + const worldState = await this.$store.dispatch('worldState:getWorldState'); + this.broken = worldState && worldState.worldBoss && worldState.worldBoss.extra + && worldState.worldBoss.extra.worldDmg && worldState.worldBoss.extra.worldDmg.seasonalShop; + }, created () { this.$root.$on('buyModal::boughtItem', () => { this.backgroundUpdate = new Date(); @@ -477,7 +479,7 @@ export default { return !searchBy || i.text.toLowerCase().indexOf(searchBy) !== -1; }); - switch (sortBy) { + switch (sortBy) { // eslint-disable-line default-case case 'AZ': { result = _sortBy(result, ['text']); diff --git a/website/client/src/components/shops/timeTravelers/index.vue b/website/client/src/components/shops/timeTravelers/index.vue index 7507ef738d..91fda43f44 100644 --- a/website/client/src/components/shops/timeTravelers/index.vue +++ b/website/client/src/components/shops/timeTravelers/index.vue @@ -274,11 +274,6 @@ export default { BuyQuestModal, }, mixins: [pinUtils], - watch: { - searchText: _throttle(function throttleSearch () { - this.searchTextThrottled = this.searchText.toLowerCase(); - }, 250), - }, data () { return { viewOptions: {}, @@ -321,8 +316,9 @@ export default { categories () { const apiCategories = this.shop.categories; - // FIX ME Refactor the apiCategories Hack to force update for now until we restructure the data - let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line + // FIX ME Refactor the apiCategories Hack to + // force update for now until we restructure the data + let backgroundUpdate = this.backgroundUpdate; // eslint-disable-line const normalGroups = _filter(apiCategories, c => c.identifier === 'mounts' || c.identifier === 'pets' || c.identifier === 'quests'); @@ -343,7 +339,7 @@ export default { normalGroups.push(setCategory); - normalGroups.map(category => { + normalGroups.forEach(category => { this.$set(this.viewOptions, category.identifier, { selected: false, }); @@ -355,6 +351,11 @@ export default { return Object.values(this.viewOptions).some(g => g.selected); }, }, + watch: { + searchText: _throttle(function throttleSearch () { + this.searchTextThrottled = this.searchText.toLowerCase(); + }, 250), + }, created () { this.$root.$on('buyModal::boughtItem', () => { this.backgroundUpdate = new Date(); @@ -378,7 +379,7 @@ export default { return !searchBy || i.text.toLowerCase().indexOf(searchBy) !== -1; }); - switch (sortBy) { + switch (sortBy) { // eslint-disable-line default-case case 'AZ': { result = _sortBy(result, ['text']); diff --git a/website/client/src/components/snackbars/notification.vue b/website/client/src/components/snackbars/notification.vue index 24be51a77c..adedd06cc6 100644 --- a/website/client/src/components/snackbars/notification.vue +++ b/website/client/src/components/snackbars/notification.vue @@ -144,7 +144,9 @@ export default { if (this.notification.type === 'gp') localeKey += 'Gold'; if (this.notification.type === 'streak') localeKey = 'streakCoins'; return this.$t(localeKey); - // This requires eight translatable strings, but that gives the translators the most flexibility for matching gender/number and for using idioms for lost/spent/used/gained. + // This requires eight translatable strings, but that gives the + // translators the most flexibility for matching gender/number + // and for using idioms for lost/spent/used/gained. }, negative () { return this.notification.sign === '-' ? 'negative' : 'positive'; @@ -159,7 +161,8 @@ export default { }, }, created () { - const timeout = this.notification.hasOwnProperty('timeout') ? this.notification.timeout : true; + const timeout = this.notification && this.notification.timeout + ? this.notification.timeout : true; if (timeout) { let delay = this.notification.delay || 1500; delay += this.$store.state.notificationStore.length * 1000; diff --git a/website/client/src/components/static/faq.vue b/website/client/src/components/static/faq.vue index 251cb5d284..ab2b5cf803 100644 --- a/website/client/src/components/static/faq.vue +++ b/website/client/src/components/static/faq.vue @@ -90,7 +90,7 @@ export default { handleClick (e) { if (!e) return; const heading = e.target.nextElementSibling.id; - history.pushState({}, heading, `#${heading}`); + window.history.pushState({}, heading, `#${heading}`); }, }, }; diff --git a/website/client/src/components/static/staticWrapper.vue b/website/client/src/components/static/staticWrapper.vue index c492eea6d8..c40679bce6 100644 --- a/website/client/src/components/static/staticWrapper.vue +++ b/website/client/src/components/static/staticWrapper.vue @@ -170,7 +170,7 @@ export default { return this.$route.name !== 'news'; }, footerId () { - if (this.$route.name === 'plans') return; + if (this.$route.name === 'plans') return null; return 'purple-footer'; }, }, diff --git a/website/client/src/components/tasks/approvalFooter.vue b/website/client/src/components/tasks/approvalFooter.vue index 9c4809fb84..1d6eec8b33 100644 --- a/website/client/src/components/tasks/approvalFooter.vue +++ b/website/client/src/components/tasks/approvalFooter.vue @@ -53,7 +53,8 @@ export default { computed: { ...mapState({ user: 'user.data' }), userIsAssigned () { - return this.task.group.assignedUsers && this.task.group.assignedUsers.indexOf(this.user._id) !== -1; + return this.task.group.assignedUsers + && this.task.group.assignedUsers.indexOf(this.user._id) !== -1; }, message () { const { assignedUsers } = this.task.group; @@ -81,11 +82,19 @@ export default { return this.$t('taskIsUnassigned'); }, userIsManager () { - if (this.group && (this.group.leader.id === this.user._id || this.group.managers[this.user._id])) return true; + if ( + this.group + && (this.group.leader.id === this.user._id || this.group.managers[this.user._id]) + ) return true; return false; }, approvalRequested () { - if (this.task.approvals && this.task.approvals.length === 1 || this.task.group && this.task.group.approval && this.task.group.approval.requested) return true; + if ( + (this.task.approvals && this.task.approvals.length === 1) + || (this.task.group && this.task.group.approval && this.task.group.approval.requested) + ) { + return true; + } return false; }, multipleApprovalsRequested () { @@ -109,7 +118,7 @@ export default { this.sync(); }, async unassign () { - if (!confirm(this.$t('confirmUnClaim'))) return; + if (!window.confirm(this.$t('confirmUnClaim'))) return; let taskId = this.task._id; // If we are on the user task @@ -136,7 +145,7 @@ export default { this.task.approvals.splice(0, 1); }, needsWork () { - if (!confirm(this.$t('confirmNeedsWork'))) return; + if (!window.confirm(this.$t('confirmNeedsWork'))) return; const userIdNeedsMoreWork = this.task.group.assignedUsers[0]; this.$store.dispatch('tasks:needsWork', { taskId: this.task._id, diff --git a/website/client/src/components/tasks/approvalHeader.vue b/website/client/src/components/tasks/approvalHeader.vue index fa65fbb956..81578e9329 100644 --- a/website/client/src/components/tasks/approvalHeader.vue +++ b/website/client/src/components/tasks/approvalHeader.vue @@ -34,19 +34,24 @@ export default { message () { const approvals = this.task.approvals || []; const approvalsLength = approvals.length; - const userIsRequesting = approvals.findIndex(approval => approval.userId.id === this.user._id) !== -1; + const userIsRequesting = approvals + .findIndex(approval => approval.userId.id === this.user._id) !== -1; if (approvalsLength === 1 && !userIsRequesting) { return this.$t('userRequestsApproval', { userName: approvals[0].userId.profile.name }); } if (approvalsLength > 1 && !userIsRequesting) { return this.$t('userCountRequestsApproval', { userCount: approvalsLength }); - } if (approvalsLength === 1 && userIsRequesting || this.task.group.approval && this.task.group.approval.requested && !this.task.group.approval.approved) { + } if ( + (approvalsLength === 1 && userIsRequesting) + || (this.task.group.approval + && this.task.group.approval.requested && !this.task.group.approval.approved)) { return this.$t('youAreRequestingApproval'); } return null; }, userIsAdmin () { - return this.group && (this.group.leader.id === this.user._id || this.group.managers[this.user._id]); + return this.group + && (this.group.leader.id === this.user._id || this.group.managers[this.user._id]); }, }, }; diff --git a/website/client/src/components/tasks/approvalModal.vue b/website/client/src/components/tasks/approvalModal.vue index e98bcfe812..7d297bb005 100644 --- a/website/client/src/components/tasks/approvalModal.vue +++ b/website/client/src/components/tasks/approvalModal.vue @@ -33,7 +33,7 @@ export default { this.task.approvals.splice(index, 1); }, needsWork (index) { - if (!confirm(this.$t('confirmNeedsWork'))) return; + if (!window.confirm(this.$t('confirmNeedsWork'))) return; const userIdNeedsMoreWork = this.task.group.assignedUsers[index]; this.$store.dispatch('tasks:needsWork', { taskId: this.task._id, diff --git a/website/client/src/components/tasks/brokenTaskModal.vue b/website/client/src/components/tasks/brokenTaskModal.vue index ddde351411..2952e24f38 100644 --- a/website/client/src/components/tasks/brokenTaskModal.vue +++ b/website/client/src/components/tasks/brokenTaskModal.vue @@ -81,7 +81,7 @@ export default { this.close(); }, removeTask () { - if (!confirm('Are you sure you want to delete this task?')) return; + if (!window.confirm('Are you sure you want to delete this task?')) return; this.destroyTask(this.brokenChallengeTask); this.close(); }, diff --git a/website/client/src/components/tasks/clearCompletedTodos.vue b/website/client/src/components/tasks/clearCompletedTodos.vue index a2239dd404..64f5df0826 100644 --- a/website/client/src/components/tasks/clearCompletedTodos.vue +++ b/website/client/src/components/tasks/clearCompletedTodos.vue @@ -25,7 +25,7 @@ export default { methods: { clearTodos () { - if (!confirm(this.$t('clearCompletedConfirm'))) return; + if (!window.confirm(this.$t('clearCompletedConfirm'))) return; this.$store.dispatch('tasks:clearCompletedTodos'); }, }, diff --git a/website/client/src/components/tasks/column.vue b/website/client/src/components/tasks/column.vue index 9600c88370..64b06cd3d5 100644 --- a/website/client/src/components/tasks/column.vue +++ b/website/client/src/components/tasks/column.vue @@ -347,14 +347,6 @@ export default { dragging: false, }; }, - created () { - // Set Task Column Label - this.typeLabel = getTypeLabel(this.type); - // Get Category Filter Labels - this.typeFilters = getFilterLabels(this.type); - // Set default filter for task column - this.activateFilter(this.type); - }, computed: { ...mapState({ user: 'user.data', @@ -409,7 +401,8 @@ export default { return this.isUser === true && this.type === 'reward' && this.activeFilter.label !== 'custom'; }, initialColumnDescription () { - // Show the column description in the middle only if there are no elements (tasks or in app items) + // Show the column description in the middle only + // if there are no elements (tasks or in app items) if (this.hasRewardsList) { if (this.inAppRewards && this.inAppRewards.length >= 0) return false; } @@ -430,7 +423,8 @@ export default { if (this.activeFilter.label === 'due') { return this.taskList.length; } if (this.activeFilter.label === 'all') { - return this.taskList.reduce((count, t) => (!t.completed && shouldDo(new Date(), t, this.getUserPreferences) ? count + 1 : count), 0); + return this.taskList + .reduce((count, t) => (!t.completed && shouldDo(new Date(), t, this.getUserPreferences) ? count + 1 : count), 0); } } @@ -449,6 +443,14 @@ export default { if (!newValue) this.quickAddRows = 1; }, }, + created () { + // Set Task Column Label + this.typeLabel = getTypeLabel(this.type); + // Get Category Filter Labels + this.typeFilters = getFilterLabels(this.type); + // Set default filter for task column + this.activateFilter(this.type); + }, mounted () { this.setColumnBackgroundVisibility(); @@ -538,7 +540,7 @@ export default { quickAdd (ev) { // Add a new line if Shift+Enter Pressed if (ev.shiftKey) { - this.quickAddRows++; + this.quickAddRows += 1; return true; } @@ -557,6 +559,7 @@ export default { this.quickAddRows = 1; this.createTask(tasks); this.$refs.quickAdd.blur(); + return true; }, editTask (task) { this.$emit('editTask', task); @@ -571,11 +574,14 @@ export default { } } - // the only time activateFilter is called with filter==='' is when the component is first created - // this can be used to check If the user has set 'due' as default filter for daily - // and set the filter as 'due' only when the component first loads and not on subsequent reloads. + // the only time activateFilter is called with filter==='' + // is when the component is first created + // this can be used to check If the user has set 'due' + // as default filter for daily + // and set the filter as 'due' only when the component first + // loads and not on subsequent reloads. if (type === 'daily' && filter === '' && this.user.preferences.dailyDueDefaultView) { - filter = 'due'; + filter = 'due'; // eslint-disable-line no-param-reassign } this.activeFilter = getActiveFilter(type, filter); diff --git a/website/client/src/components/tasks/spells.vue b/website/client/src/components/tasks/spells.vue index 3b8cd16bea..74970622d3 100644 --- a/website/client/src/components/tasks/spells.vue +++ b/website/client/src/components/tasks/spells.vue @@ -201,36 +201,44 @@ export default { potionClickMode: false, }; }, - mounted () { - // @TODO: should we abstract the drawer state/local store to a library and mixing combo? We use a similar pattern in equipment - const spellDrawerState = getLocalSetting(CONSTANTS.keyConstants.SPELL_DRAWER_STATE); - if (spellDrawerState === CONSTANTS.drawerStateValues.DRAWER_CLOSED) { - this.$store.state.spellOptions.spellDrawOpen = false; - } - }, computed: { ...mapState({ user: 'user.data' }), openStatus () { return this.$store.state.spellOptions.spellDrawOpen ? 1 : 0; }, }, + mounted () { + // @TODO: should we abstract the drawer state/local + // store to a library and mixing combo? We use a similar pattern in equipment + const spellDrawerState = getLocalSetting(CONSTANTS.keyConstants.SPELL_DRAWER_STATE); + if (spellDrawerState === CONSTANTS.drawerStateValues.DRAWER_CLOSED) { + this.$store.state.spellOptions.spellDrawOpen = false; + } + }, methods: { drawerToggled (newState) { this.$store.state.spellOptions.spellDrawOpen = newState; if (newState) { - setLocalSetting(CONSTANTS.keyConstants.SPELL_DRAWER_STATE, CONSTANTS.drawerStateValues.DRAWER_OPEN); + setLocalSetting( + CONSTANTS.keyConstants.SPELL_DRAWER_STATE, + CONSTANTS.drawerStateValues.DRAWER_OPEN, + ); return; } - setLocalSetting(CONSTANTS.keyConstants.SPELL_DRAWER_STATE, CONSTANTS.drawerStateValues.DRAWER_CLOSED); + setLocalSetting( + CONSTANTS.keyConstants.SPELL_DRAWER_STATE, + CONSTANTS.drawerStateValues.DRAWER_CLOSED, + ); }, spellDisabled (skill) { if (skill === 'frost' && this.user.stats.buffs.streaks) { return true; } // @TODO: Implement - // } else if (skill === 'stealth' && this.user.stats.buffs.stealth >= this.user.dailys.length) { + // } else if (skill === 'stealth' && this.user.stats.buffs.stealth + // >= this.user.dailys.length) { // return true; // } diff --git a/website/client/src/components/tasks/task.vue b/website/client/src/components/tasks/task.vue index 21b5b13a60..20bd02692b 100644 --- a/website/client/src/components/tasks/task.vue +++ b/website/client/src/components/tasks/task.vue @@ -631,7 +631,8 @@ export default { }, checklistProgress () { const totalItems = this.task.checklist.length; - const completedItems = this.task.checklist.reduce((total, item) => (item.completed ? total + 1 : total), 0); + const completedItems = this.task.checklist + .reduce((total, item) => (item.completed ? total + 1 : total), 0); return `${completedItems}/${totalItems}`; }, leftControl () { @@ -734,7 +735,7 @@ export default { this.$emit('moveTo', this.task, 'bottom'); }, destroy () { - if (!confirm(this.$t('sureDelete'))) return; + if (!window.confirm(this.$t('sureDelete'))) return; this.destroyTask(this.task); this.$emit('taskDestroyed', this.task); }, diff --git a/website/client/src/components/tasks/taskModal.vue b/website/client/src/components/tasks/taskModal.vue index fea4551a61..e5896b73ed 100644 --- a/website/client/src/components/tasks/taskModal.vue +++ b/website/client/src/components/tasks/taskModal.vue @@ -724,20 +724,6 @@ export default { calendarHighlights: { dates: [new Date()] }, }; }, - watch: { - task () { - this.syncTask(); - }, - 'task.startDate': function () { - this.calculateMonthlyRepeatDays(); - }, - 'task.frequency': function () { - this.calculateMonthlyRepeatDays(); - }, - }, - mounted () { - this.showAdvancedOptions = !this.user.preferences.advancedCollapsed; - }, computed: { ...mapGetters({ getTaskClasses: 'tasks:getTaskClasses', @@ -767,7 +753,8 @@ export default { }, isOriginalChallengeTask () { const isUserChallenge = Boolean(this.task.userId); - return !isUserChallenge && (this.challengeId || this.task.challenge && this.task.challenge.id); + return !isUserChallenge + && (this.challengeId || (this.task.challenge && this.task.challenge.id)); }, canDelete () { return this.purpose !== 'create' && this.canDeleteTask(this.task); @@ -817,6 +804,20 @@ export default { return this.selectedTags.slice(this.maxTags); }, }, + watch: { + task () { + this.syncTask(); + }, + 'task.startDate': function taskStartDate () { + this.calculateMonthlyRepeatDays(); + }, + 'task.frequency': function taskFrequency () { + this.calculateMonthlyRepeatDays(); + }, + }, + mounted () { + this.showAdvancedOptions = !this.user.preferences.advancedCollapsed; + }, created () { document.addEventListener('keyup', this.handleEsc); }, @@ -840,11 +841,16 @@ export default { this.memberNamesById[member._id] = member.profile.name; }); this.assignedMembers = []; - if (this.task.group && this.task.group.assignedUsers) this.assignedMembers = this.task.group.assignedUsers; - if (this.task.group) this.sharedCompletion = this.task.group.sharedCompletion || 'singleCompletion'; + if (this.task.group && this.task.group.assignedUsers) { + this.assignedMembers = this.task.group.assignedUsers; + } + if (this.task.group) { + this.sharedCompletion = this.task.group.sharedCompletion || 'singleCompletion'; + } } - // @TODO: This whole component is mutating a prop and that causes issues. We need to not copy the prop similar to group modals + // @TODO: This whole component is mutating a prop + // and that causes issues. We need to not copy the prop similar to group modals if (this.task) this.checklist = clone(this.task.checklist); }, async handleOpen () { @@ -913,7 +919,7 @@ export default { const shortDay = this.dayMapping[dayOfWeek]; task.daysOfMonth = []; task.weeksOfMonth = [week]; - for (const key in task.repeat) { + for (const key of Object.keys(task.repeat)) { task.repeat[key] = false; } task.repeat[shortDay] = true; @@ -962,7 +968,7 @@ export default { this.$root.$emit('bv::hide::modal', 'task-modal'); }, destroy () { - if (!confirm(this.$t('sureDelete'))) return; + if (!window.confirm(this.$t('sureDelete'))) return; this.destroyTask(this.task); this.$emit('taskDestroyed', this.task); this.$root.$emit('bv::hide::modal', 'task-modal'); diff --git a/website/client/src/components/ui/drawerSlider.vue b/website/client/src/components/ui/drawerSlider.vue index 1aaddab27d..e174eff6fa 100644 --- a/website/client/src/components/ui/drawerSlider.vue +++ b/website/client/src/components/ui/drawerSlider.vue @@ -162,14 +162,14 @@ export default { methods: { shiftLeft () { if (this.pointer < this.items.length - 1) { - this.pointer++; + this.pointer += 1; } else { this.pointer = 0; } }, shiftRight () { if (this.pointer > 0) { - this.pointer--; + this.pointer -= 1; } else { this.pointer = this.items.length - 1; } diff --git a/website/client/src/components/userMenu/achievements.vue b/website/client/src/components/userMenu/achievements.vue index 0424b94e5b..6be71459d7 100644 --- a/website/client/src/components/userMenu/achievements.vue +++ b/website/client/src/components/userMenu/achievements.vue @@ -62,11 +62,11 @@ export default { content: Content, }; }, - mounted () { - this.achievements = achievementsLib.getAchievementsForProfile(this.user); - }, computed: { ...mapState({ user: 'user.data' }), }, + mounted () { + this.achievements = achievementsLib.getAchievementsForProfile(this.user); + }, }; diff --git a/website/client/src/components/userMenu/inbox.vue b/website/client/src/components/userMenu/inbox.vue index d0727ddb51..4846ea3d3b 100644 --- a/website/client/src/components/userMenu/inbox.vue +++ b/website/client/src/components/userMenu/inbox.vue @@ -299,37 +299,6 @@ export default { updateConversionsCounter: 0, }; }, - mounted () { - this.$root.$on('habitica::new-inbox-message', data => { - this.$root.$emit('bv::show::modal', 'inbox-modal'); - - // Wait for messages to be loaded - const unwatchLoaded = this.$watch('loaded', loaded => { - if (!loaded) return; - - const conversation = this.conversations.find(convo => convo.key === data.userIdToMessage); - if (loaded) setImmediate(() => unwatchLoaded()); - - if (conversation) { - this.selectConversation(data.userIdToMessage); - return; - } - - this.initiatedConversation = { - uuid: data.userIdToMessage, - user: data.displayName, - username: data.username, - backer: data.backer, - contributor: data.contributor, - }; - - this.selectConversation(data.userIdToMessage); - }, { immediate: true }); - }); - }, - destroyed () { - this.$root.$off('habitica::new-inbox-message'); - }, computed: { ...mapState({ user: 'user.data' }), canLoadMore () { @@ -427,6 +396,37 @@ export default { }; }, }, + mounted () { + this.$root.$on('habitica::new-inbox-message', data => { + this.$root.$emit('bv::show::modal', 'inbox-modal'); + + // Wait for messages to be loaded + const unwatchLoaded = this.$watch('loaded', loaded => { + if (!loaded) return; + + const conversation = this.conversations.find(convo => convo.key === data.userIdToMessage); + if (loaded) setImmediate(() => unwatchLoaded()); + + if (conversation) { + this.selectConversation(data.userIdToMessage); + return; + } + + this.initiatedConversation = { + uuid: data.userIdToMessage, + user: data.displayName, + username: data.username, + backer: data.backer, + contributor: data.contributor, + }; + + this.selectConversation(data.userIdToMessage); + }, { immediate: true }); + }); + }, + destroyed () { + this.$root.$off('habitica::new-inbox-message'); + }, methods: { async onModalShown () { this.loaded = false; @@ -507,7 +507,10 @@ export default { }); // Remove the placeholder message - if (this.initiatedConversation && this.initiatedConversation.uuid === this.selectedConversation.key) { + if ( + this.initiatedConversation && + this.initiatedConversation.uuid === this.selectedConversation.key + ) { this.loadedConversations.unshift(this.initiatedConversation); this.initiatedConversation = null; } @@ -529,7 +532,7 @@ export default { const messageToReset = messages[messages.length - 1]; messageToReset.id = newMessage.id; // just set the id, all other infos already set Object.assign(messages[messages.length - 1], messageToReset); - this.updateConversionsCounter++; + this.updateConversionsCounter += 1; }); this.newMessage = ''; @@ -542,7 +545,7 @@ export default { if (isNPC) { return this.icons.tierNPC; } - if (!message.contributor) return; + if (!message.contributor) return null; return this.icons[`tier${message.contributor.level}`]; }, removeTags (html) { @@ -551,7 +554,7 @@ export default { return tmp.textContent || tmp.innerText || ''; }, parseMarkdown (text) { - if (!text) return; + if (!text) return null; return habiticaMarkdown.render(String(text)); }, infiniteScrollTrigger () { diff --git a/website/client/src/components/userMenu/profile.vue b/website/client/src/components/userMenu/profile.vue index e97e872791..47b5b7ad01 100644 --- a/website/client/src/components/userMenu/profile.vue +++ b/website/client/src/components/userMenu/profile.vue @@ -463,10 +463,12 @@ export default { flatGear: 'content.gear.flat', }), userJoinedDate () { - return moment(this.user.auth.timestamps.created).format(this.userLoggedIn.preferences.dateFormat.toUpperCase()); + return moment(this.user.auth.timestamps.created) + .format(this.userLoggedIn.preferences.dateFormat.toUpperCase()); }, userLastLoggedIn () { - return moment(this.user.auth.timestamps.loggedin).format(this.userLoggedIn.preferences.dateFormat.toUpperCase()); + return moment(this.user.auth.timestamps.loggedin) + .format(this.userLoggedIn.preferences.dateFormat.toUpperCase()); }, equippedItems () { return this.user.items.gear.equipped; @@ -570,7 +572,7 @@ export default { if (!currentLoginDay) return 0; const previousRewardDay = currentLoginDay.prevRewardKey; const { nextRewardAt } = currentLoginDay; - return (this.user.loginIncentives - previousRewardDay) / (nextRewardAt - previousRewardDay) * 100; + return ((this.user.loginIncentives - previousRewardDay) / (nextRewardAt - previousRewardDay)) * 100; }, save () { const values = {}; diff --git a/website/client/src/components/userMenu/profileStats.vue b/website/client/src/components/userMenu/profileStats.vue index 8c55dd7ad5..3b62593825 100644 --- a/website/client/src/components/userMenu/profileStats.vue +++ b/website/client/src/components/userMenu/profileStats.vue @@ -303,11 +303,11 @@ export default { }, allocate (stat) { if (this.pointsRemaining === 0) return; - this.statUpdates[stat]++; + this.statUpdates[stat] += 1; }, deallocate (stat) { if (this.statUpdates[stat] === 0) return; - this.statUpdates[stat]--; + this.statUpdates[stat] -= 1; }, async saveAttributes () { this.loading = true; diff --git a/website/client/src/components/userMenu/stats.vue b/website/client/src/components/userMenu/stats.vue index 66ffd0fa71..38a40c5411 100644 --- a/website/client/src/components/userMenu/stats.vue +++ b/website/client/src/components/userMenu/stats.vue @@ -246,21 +246,23 @@ export default { methods: { formatAnimal (animalName, type) { if (type === 'pet') { - if (Content.petInfo.hasOwnProperty(animalName)) { + if (Content.petInfo[animalName]) { return Content.petInfo[animalName].text(); } return this.$t('noActivePet'); } if (type === 'mount') { - if (Content.mountInfo.hasOwnProperty(animalName)) { + if (Content.mountInfo[animalName]) { return Content.mountInfo[animalName].text(); } return this.$t('noActiveMount'); } + + return null; }, formatBackground (background) { const bg = Content.appearances.background; - if (bg.hasOwnProperty(background)) { + if (bg[background]) { return `${bg[background].text()} (${this.$t(bg[background].set.text)})`; } return window.env.t('noBackground'); diff --git a/website/client/src/directives/directive.common.js b/website/client/src/directives/directive.common.js index 355e539d05..fb0f9a7b28 100644 --- a/website/client/src/directives/directive.common.js +++ b/website/client/src/directives/directive.common.js @@ -1,6 +1,9 @@ // https://stackoverflow.com/a/40720172/1298154 export const emit = (vnode, emitName, data) => { // eslint-disable-line import/prefer-default-export - const handlers = vnode.data && vnode.data.on || vnode.componentOptions && vnode.componentOptions.listeners; + const handlers = (vnode.data + && vnode.data.on) + || (vnode.componentOptions + && vnode.componentOptions.listeners); if (handlers && handlers[emitName]) { handlers[emitName].fns(data); diff --git a/website/client/src/libs/store/helpers/filterTasks.js b/website/client/src/libs/store/helpers/filterTasks.js index 2068bfadb5..caac6ebb9d 100644 --- a/website/client/src/libs/store/helpers/filterTasks.js +++ b/website/client/src/libs/store/helpers/filterTasks.js @@ -47,7 +47,7 @@ function filterLabel (filterList) { return type => { const filterListByType = filterList[type].filters; const filterListOfLabels = new Array(filterListByType.length); - filterListByType.forEach(({ label }, i) => filterListOfLabels[i] = label); + filterListByType.forEach(({ label }, i) => { filterListOfLabels[i] = label; }); return filterListOfLabels; }; diff --git a/website/client/src/libs/store/helpers/internals.js b/website/client/src/libs/store/helpers/internals.js index 2c37f4869a..c846ae0672 100644 --- a/website/client/src/libs/store/helpers/internals.js +++ b/website/client/src/libs/store/helpers/internals.js @@ -19,7 +19,7 @@ Example: tasks:todos tasks:dailys */ -export function flattenAndNamespace (namespaces) { // eslint-disable-line import/prefer-default-export +export function flattenAndNamespace (namespaces) { // eslint-disable-line import/prefer-default-export, max-len const result = {}; Object.keys(namespaces).forEach(namespace => { diff --git a/website/client/src/libs/store/helpers/public.js b/website/client/src/libs/store/helpers/public.js index d6ae5ea759..c907b7c5ca 100644 --- a/website/client/src/libs/store/helpers/public.js +++ b/website/client/src/libs/store/helpers/public.js @@ -61,7 +61,7 @@ export function mapActions (actions) { normalizeMap(actions).forEach(({ key, val }) => { res[key] = function mappedAction (...args) { - return this.$store.dispatch.apply(this.$store, [val].concat(args)); // eslint-disable-line prefer-spread + return this.$store.dispatch.apply(this.$store, [val].concat(args)); // eslint-disable-line prefer-spread, max-len }; }); diff --git a/website/client/src/libs/store/index.js b/website/client/src/libs/store/index.js index e288479108..d0af6f9ae8 100644 --- a/website/client/src/libs/store/index.js +++ b/website/client/src/libs/store/index.js @@ -9,7 +9,8 @@ export default class Store { // Store actions this._actions = actions; - // Store getters (computed properties), implemented as computed properties in the internal Vue VM + // Store getters (computed properties), + // implemented as computed properties in the internal Vue VM this.getters = {}; // Setup getters