diff --git a/website/client/app.vue b/website/client/app.vue index 510b69089e..8590f4ee7e 100644 --- a/website/client/app.vue +++ b/website/client/app.vue @@ -144,6 +144,16 @@ export default { return response; }, (error) => { if (error.response.status >= 400) { + // 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); + } + // Don't show errors from getting user details. These users have delete their account, // but their chat message still exists. let configExists = Boolean(error.response) && Boolean(error.response.config); diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue index ce49b49762..53d8a7867a 100644 --- a/website/client/components/challenges/challengeDetail.vue +++ b/website/client/components/challenges/challengeDetail.vue @@ -68,7 +68,7 @@ button.btn.btn-secondary(v-once, @click='edit()') {{$t('editChallenge')}} div(v-if='isLeader') button.btn.btn-danger(v-once, @click='closeChallenge()') {{$t('endChallenge')}} - div(v-if='isLeader') + div(v-if='isLeader || isAdmin') button.btn.btn-secondary(v-once, @click='exportChallengeCsv()') {{$t('exportChallengeCsv')}} div(v-if='isLeader') button.btn.btn-secondary(v-once, @click='cloneChallenge()') {{$t('clone')}} @@ -246,6 +246,9 @@ export default { if (!this.challenge.leader) return false; return this.user._id === this.challenge.leader._id; }, + isAdmin () { + return Boolean(this.user.contributor.admin); + }, canJoin () { return !this.isMember; }, @@ -403,6 +406,7 @@ export default { cloneChallenge () { this.cloning = true; this.$store.state.challengeOptions.tasksToClone = this.tasksByType; + this.$store.state.challengeOptions.workingChallenge = Object.assign({}, this.$store.state.challengeOptions.workingChallenge, this.challenge); this.$root.$emit('show::modal', 'challenge-modal'); }, }, diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index 6f7e49eb99..8423983972 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -31,11 +31,13 @@ .row.new-message-row textarea(:placeholder="!isParty ? $t('chatPlaceholder') : $t('partyChatPlaceholder')", v-model='newMessage', @keydown='updateCarretPosition') autocomplete(:text='newMessage', v-on:select="selectedAutocomplete", :coords='coords', :chat='group.chat') - button.btn.btn-secondary.send-chat.float-left(v-once, @click='sendMessage()') {{ $t('send') }} + .row .col-6 button.btn.btn-secondary.float-left.fetch(v-once, @click='fetchRecentMessages()') {{ $t('fetchRecentMessages') }} button.btn.btn-secondary.float-left(v-once, @click='reverseChat()') {{ $t('reverseChat') }} + .col-6 + button.btn.btn-secondary.send-chat.float-right(v-once, @click='sendMessage()') {{ $t('send') }} .row.community-guidelines(v-if='!communityGuidelinesAccepted') div.col-8(v-once, v-html="$t('communityGuidelinesIntro')") @@ -301,13 +303,6 @@ .new-message-row { position: relative; } - - .send-chat { - z-index: 10; - position: absolute; - right: 1em; - bottom: 1em; - } } .toggle-up .svg-icon, .toggle-down .svg-icon { diff --git a/website/client/components/groups/tavern.vue b/website/client/components/groups/tavern.vue index 39a0d9ebca..ccfec8d7d6 100644 --- a/website/client/components/groups/tavern.vue +++ b/website/client/components/groups/tavern.vue @@ -15,10 +15,10 @@ .row .col-6 - button.btn.btn-secondary.send-chat.float-left(v-once, @click='sendMessage()') {{ $t('send') }} + button.btn.btn-secondary.float-left.fetch(v-once, @click='fetchRecentMessages()') {{ $t('fetchRecentMessages') }} + button.btn.btn-secondary.float-left(v-once, @click='reverseChat()') {{ $t('reverseChat') }} .col-6 - button.btn.btn-secondary.float-right.fetch(v-once, @click='fetchRecentMessages()') {{ $t('fetchRecentMessages') }} - button.btn.btn-secondary.float-right(v-once, @click='reverseChat()') {{ $t('reverseChat') }} + button.btn.btn-secondary.send-chat.float-right(v-once, @click='sendMessage()') {{ $t('send') }} .row.community-guidelines(v-if='!communityGuidelinesAccepted') div.col-8(v-once, v-html="$t('communityGuidelinesIntro')") diff --git a/website/client/components/inventory/stable/index.vue b/website/client/components/inventory/stable/index.vue index 1855f76e4c..875b65a13f 100644 --- a/website/client/components/inventory/stable/index.vue +++ b/website/client/components/inventory/stable/index.vue @@ -248,6 +248,22 @@ div.popover-content {{ $t('clickOnPetToFeed', {foodName: currentDraggingFood.text() }) }} + +