diff --git a/website/client/app.vue b/website/client/app.vue
index 8590f4ee7e..07c1ecb1fe 100644
--- a/website/client/app.vue
+++ b/website/client/app.vue
@@ -147,11 +147,7 @@ export default {
// Check for conditions to reset the user auth
const invalidUserMessage = [this.$t('invalidCredentials'), 'Missing authentication headers.'];
if (invalidUserMessage.indexOf(error.response.data.message) !== -1) {
- localStorage.removeItem('habit-mobile-settings');
- localStorage.removeItem('hello');
- this.$store.state.isUserLoggedIn = false;
- window.location.href = '/static/home';
- return Promise.reject(error);
+ this.$store.dispatch('auth:logout');
}
// Don't show errors from getting user details. These users have delete their account,
diff --git a/website/client/components/achievements/questInvitation.vue b/website/client/components/achievements/questInvitation.vue
index f1e5cd0d1e..6ad360c71f 100644
--- a/website/client/components/achievements/questInvitation.vue
+++ b/website/client/components/achievements/questInvitation.vue
@@ -49,7 +49,6 @@ import bModal from 'bootstrap-vue/lib/components/modal';
import quests from 'common/script/content/quests';
import { mapState } from 'client/libs/store';
-import revive from '../../../common/script/ops/revive';
import percent from '../../../common/script/libs/percent';
import {maxHealth} from '../../../common/script/index';
@@ -73,11 +72,7 @@ export default {
},
methods: {
close () {
- this.$root.$emit('hide::modal', 'death');
- },
- revive () {
- // @TODO: Post
- revive(this.user);
+ this.$root.$emit('hide::modal', 'quest-invitation');
},
},
};
diff --git a/website/client/components/appFooter.vue b/website/client/components/appFooter.vue
index cbd89a900c..44f073a370 100644
--- a/website/client/components/appFooter.vue
+++ b/website/client/components/appFooter.vue
@@ -82,7 +82,7 @@
.row
.col-4
| © 2017 Habitica. All rights reserved.
- // .debug.float-left(v-if="!IS_PRODUCTION && isUserLoaded")
+ .debug.float-left(v-if="!IS_PRODUCTION && isUserLoaded")
button.btn.btn-primary(@click="debugMenuShown = !debugMenuShown") Toggle Debug Menu
.debug-group(v-if="debugMenuShown")
a.btn.btn-default(@click="setHealthLow()") Health = 1
diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue
index 53d8a7867a..6633be274d 100644
--- a/website/client/components/challenges/challengeDetail.vue
+++ b/website/client/components/challenges/challengeDetail.vue
@@ -10,7 +10,7 @@
h1(v-markdown='challenge.name')
div
strong(v-once) {{$t('createdBy')}}:
- span {{challenge.leader.profile.name}}
+ span(v-if='challenge.leader && challenge.leader.profile') {{challenge.leader.profile.name}}
// @TODO: make challenge.author a variable inside the createdBy string (helps with RTL languages)
// @TODO: Implement in V2 strong.margin-left(v-once)
.svg-icon.calendar-icon(v-html="icons.calendarIcon")
diff --git a/website/client/components/chat/chatMessages.vue b/website/client/components/chat/chatMessages.vue
index 9396e2e809..40532a5e0c 100644
--- a/website/client/components/chat/chatMessages.vue
+++ b/website/client/components/chat/chatMessages.vue
@@ -36,10 +36,11 @@
.svg-icon(v-html="icons.like")
span(v-if='!msg.likes[user._id]') {{ $t('like') }}
span(v-if='msg.likes[user._id]') {{ $t('liked') }}
- span.action(v-if='!inbox', @click='copyAsTodo(msg)')
- .svg-icon(v-html="icons.copy")
- | {{$t('copyAsTodo')}}
- // @TODO make copyAsTodo work in the inbox
+ // @TODO make copyAsTodo work in Tavern, guilds, party (inbox can be done later)
+ span.action(v-if='!inbox', @click='copyAsTodo(msg)')
+ .svg-icon(v-html="icons.copy")
+ | {{$t('copyAsTodo')}}
+ // @TODO make copyAsTodo work in the inbox
span.action(v-if='!inbox && user.flags.communityGuidelinesAccepted', @click='report(msg)')
.svg-icon(v-html="icons.report")
| {{$t('report')}}
@@ -72,10 +73,11 @@
.svg-icon(v-html="icons.like")
span(v-if='!msg.likes[user._id]') {{ $t('like') }}
span(v-if='msg.likes[user._id]') {{ $t('liked') }}
- span.action(v-if='!inbox', @click='copyAsTodo(msg)')
- .svg-icon(v-html="icons.copy")
- | {{$t('copyAsTodo')}}
- // @TODO make copyAsTodo work in the inbox
+ // @TODO make copyAsTodo work in Tavern, guilds, party (inbox can be done later)
+ span.action(v-if='!inbox', @click='copyAsTodo(msg)')
+ .svg-icon(v-html="icons.copy")
+ | {{$t('copyAsTodo')}}
+ // @TODO make copyAsTodo work in the inbox
span.action(v-if='user.flags.communityGuidelinesAccepted', @click='report(msg)')
span.action(v-if='!inbox && user.flags.communityGuidelinesAccepted', @click='report(msg)')
.svg-icon(v-html="icons.report")
diff --git a/website/client/components/creatorIntro.vue b/website/client/components/creatorIntro.vue
index 0670891fce..1210008e3c 100644
--- a/website/client/components/creatorIntro.vue
+++ b/website/client/components/creatorIntro.vue
@@ -1350,7 +1350,15 @@ export default {
cost = fullSet ? 1.25 : 0.5; // (Hair, skin, etc) 5G per set, 2G per individual
}
- let loginIncentives = ['background.blue', 'background.green', 'background.red', 'background.purple', 'background.yellow', 'background.violet'];
+ let loginIncentives = [
+ 'background.blue',
+ 'background.green',
+ 'background.red',
+ 'background.purple',
+ 'background.yellow',
+ 'background.violet',
+ ];
+
if (loginIncentives.indexOf(path) === -1) {
if (fullSet) {
if (confirm(this.$t('purchaseFor', {cost: cost * 4})) !== true) return;
diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue
index 8423983972..515e1eecdc 100644
--- a/website/client/components/groups/group.vue
+++ b/website/client/components/groups/group.vue
@@ -4,6 +4,7 @@
invite-modal(:group='this.group')
start-quest-modal(:group='this.group')
quest-details-modal(:group='this.group')
+ group-gems-modal
.col-12.col-sm-8.standard-page
.row
.col-6.title-details
@@ -18,9 +19,9 @@
.svg-icon.shield(v-html="icons.silverGuildBadgeIcon", v-if='group.memberCount > 100 && group.memberCount < 999')
.svg-icon.shield(v-html="icons.bronzeGuildBadgeIcon", v-if='group.memberCount < 100')
span.number {{ group.memberCount | abbrNum }}
- div(v-once) {{ $t('members') }}
+ div(v-once) {{ $t('memberList') }}
.col-4(v-if='!isParty')
- .item-with-icon
+ .item-with-icon(@click='showGroupGems()')
.svg-icon.gem(v-html="icons.gem")
span.number {{group.balance * 4}}
div(v-once) {{ $t('guildBank') }}
@@ -47,7 +48,6 @@
.row
.col-12.hr
chat-message(:chat.sync='group.chat', :group-id='group._id', group-name='group.name')
-
.col-12.col-sm-4.sidebar
.row(:class='{"guild-background": !isParty}')
.col-6
@@ -453,6 +453,7 @@ import inviteModal from './inviteModal';
import chatMessage from '../chat/chatMessages';
import autocomplete from '../chat/autoComplete';
import groupChallenges from '../challenges/groupChallenges';
+import groupGemsModal from 'client/components/groups/groupGemsModal';
import markdownDirective from 'client/directives/markdown';
import bCollapse from 'bootstrap-vue/lib/components/collapse';
@@ -490,6 +491,7 @@ export default {
groupChallenges,
autocomplete,
questDetailsModal,
+ groupGemsModal,
},
directives: {
bToggle,
@@ -857,6 +859,9 @@ export default {
let quest = await this.$store.dispatch('quests:sendAction', {groupId: this.group._id, action: 'quests/reject'});
this.group.quest = quest;
},
+ showGroupGems () {
+ this.$root.$emit('show::modal', 'group-gems-modal');
+ },
},
};
diff --git a/website/client/components/groups/groupFormModal.vue b/website/client/components/groups/groupFormModal.vue
index 3b81c0bb2b..bb68fd0e4a 100644
--- a/website/client/components/groups/groupFormModal.vue
+++ b/website/client/components/groups/groupFormModal.vue
@@ -9,7 +9,7 @@
label
strong(v-once) {{$t('guildOrPartyLeader')}} *
select.form-control(v-model="workingGroup.newLeader")
- option(v-for='member in members', :value="member._id") {{ member.profile.name }}
+ option(v-for='potentialLeader in potentialLeaders', :value="potentialLeader._id") {{ potentialLeader.name }}
.form-group(v-if='!this.workingGroup.id')
label
@@ -316,6 +316,17 @@ export default {
isParty () {
return this.workingGroup.type === 'party';
},
+ potentialLeaders () {
+ let leaders = [{ _id: this.user._id, name: this.user.profile.name }];
+ // @TODO consider pushing all recent posters to the top of the list if they are guild members - more likely to be the ones the leader wants to see (and then ignore them in the while below)
+ let i = 0;
+ while (this.members[i]) {
+ let memb = this.members[i];
+ i++;
+ if (memb._id !== this.user._id) leaders.push({_id: memb._id, name: memb.profile.name});
+ }
+ return leaders;
+ },
},
watch: {
editingGroup () {
diff --git a/website/client/components/groups/groupGemsModal.vue b/website/client/components/groups/groupGemsModal.vue
new file mode 100644
index 0000000000..70a2f9cba0
--- /dev/null
+++ b/website/client/components/groups/groupGemsModal.vue
@@ -0,0 +1,32 @@
+
+ b-modal#group-gems-modal(:title="$t('groupGems')", size='md', :hide-footer="true")
+ .modal-body
+ .row
+ .col-6.offset-3
+ h3 {{ $t('groupGemsDesc') }}
+ .modal-footer
+ .col-12.text-center
+ button.btn.btn-primary(@click='close()') {{$t('close')}}
+
+
+
+
+
diff --git a/website/client/components/inventory/stable/index.vue b/website/client/components/inventory/stable/index.vue
index 875b65a13f..afaa1ffd92 100644
--- a/website/client/components/inventory/stable/index.vue
+++ b/website/client/components/inventory/stable/index.vue
@@ -113,7 +113,7 @@
div(v-else)
h4.popover-content-title {{ item.name }}
template(slot="itemBadge", scope="context")
- starBadge(:selected="item.key === currentPet", :show="item.isOwned()", @click="selectPet(item)")
+ starBadge(:selected="item.key === currentPet", :show="item.isOwned()", @click="selectPet(item)")
.btn.btn-flat.btn-show-more(@click="setShowMore(petGroup.key)", v-if='petGroup.key !== "specialPets"')
| {{ showMore === petGroup.key ? $t('showLess') : $t('showMore') }}
diff --git a/website/client/components/inventory/stable/mountItem.vue b/website/client/components/inventory/stable/mountItem.vue
index ac22282acd..6ede37aa13 100644
--- a/website/client/components/inventory/stable/mountItem.vue
+++ b/website/client/components/inventory/stable/mountItem.vue
@@ -1,6 +1,6 @@
div
- .item-wrapper(:id="itemId")
+ .item-wrapper(@click="click()", :id="itemId")
.item(
:class="{'item-empty': emptyItem}",
)
@@ -48,5 +48,10 @@ div
itemId: uuid.v4(),
});
},
+ methods: {
+ click () {
+ this.$emit('click', {});
+ },
+ },
};
diff --git a/website/client/components/notifications.vue b/website/client/components/notifications.vue
index 0aa2733a3b..5041cfa517 100644
--- a/website/client/components/notifications.vue
+++ b/website/client/components/notifications.vue
@@ -303,6 +303,11 @@ export default {
this.$root.$emit('show::modal', 'avatar-modal');
}
+ if (this.user.stats.hp <= 0) {
+ this.playSound('Death');
+ this.$root.$emit('show::modal', 'death');
+ }
+
if (this.questCompleted) {
this.$root.$emit('show::modal', 'quest-completed');
}
diff --git a/website/client/components/payments/amazonModal.vue b/website/client/components/payments/amazonModal.vue
index 572a20ef95..035f1ed12e 100644
--- a/website/client/components/payments/amazonModal.vue
+++ b/website/client/components/payments/amazonModal.vue
@@ -1,15 +1,22 @@
- b-modal#amazon-payment(title="Amazon", :hide-footer="true", size='lg')
+ b-modal#amazon-payment(title="Amazon", :hide-footer="true", size='md')
+ h2.text-center Continue with Amazon
#AmazonPayButton
#AmazonPayWallet(v-if="amazonPayments.loggedIn", style="width: 400px; height: 228px;")
#AmazonPayRecurring(v-if="amazonPayments.loggedIn && amazonPayments.type === 'subscription'",
style="width: 400px; height: 140px;")
.modal-footer
- .btn.btn-primary(:disabled="amazonPaymentsCanCheckout() || !amazonButtonEnabled",
- @click="amazonCheckOut()") {{ $t('checkout') }}
+ .text-center
+ .btn.btn-primary(v-if="amazonPaymentsCanCheckout",
+ @click="amazonCheckOut()") {{ $t('checkout') }}