Merge branch 'develop' of https://github.com/HabitRPG/habitica into negue/flagpm
@@ -11,22 +11,23 @@ div
|
||||
#app(:class='{"casting-spell": castingSpell}')
|
||||
banned-account-modal
|
||||
amazon-payments-modal(v-if='!isStaticPage')
|
||||
payments-success-modal
|
||||
snackbars
|
||||
router-view(v-if="!isUserLoggedIn || isStaticPage")
|
||||
template(v-else)
|
||||
template(v-if="isUserLoaded")
|
||||
div.resting-banner(v-show="showRestingBanner", ref="restingBanner")
|
||||
.resting-banner(v-show="showRestingBanner", ref="restingBanner")
|
||||
span.content
|
||||
span.label.d-inline.d-sm-none {{ $t('innCheckOutBannerShort') }}
|
||||
span.label.d-none.d-sm-inline {{ $t('innCheckOutBanner') }}
|
||||
span.separator |
|
||||
span.resume(@click="resumeDamage()") {{ $t('resumeDamage') }}
|
||||
div.closepadding(@click="hideBanner()")
|
||||
.closepadding(@click="hideBanner()")
|
||||
span.svg-icon.inline.icon-10(aria-hidden="true", v-html="icons.close")
|
||||
notifications-display
|
||||
app-menu(:class='{"restingInn": showRestingBanner}' :style="{ marginTop: bannerHeight + 'px' }")
|
||||
app-menu
|
||||
.container-fluid
|
||||
app-header(:class='{"restingInn": showRestingBanner}')
|
||||
app-header
|
||||
buyModal(
|
||||
:item="selectedItemToBuy || {}",
|
||||
:withPin="true",
|
||||
@@ -49,6 +50,13 @@ div
|
||||
<style lang='scss' scoped>
|
||||
@import '~client/assets/scss/colors.scss';
|
||||
|
||||
#app {
|
||||
height: calc(100% - 56px); /* 56px is the menu */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
#loading-screen-inapp {
|
||||
#melior {
|
||||
margin: 0 auto;
|
||||
@@ -78,6 +86,11 @@ div
|
||||
cursor: crosshair;
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
overflow-x: hidden;
|
||||
flex: 1 0 auto;
|
||||
}
|
||||
|
||||
.notification {
|
||||
border-radius: 1000px;
|
||||
background-color: $green-10;
|
||||
@@ -88,42 +101,10 @@ div
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
overflow-x: hidden;
|
||||
flex: 1 0 auto;
|
||||
}
|
||||
|
||||
#app {
|
||||
height: calc(100% - 56px); /* 56px is the menu */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 100vh;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang='scss'>
|
||||
@import '~client/assets/scss/colors.scss';
|
||||
|
||||
/* @TODO: The modal-open class is not being removed. Let's try this for now */
|
||||
.modal {
|
||||
overflow-y: scroll !important;
|
||||
}
|
||||
|
||||
.modal-backdrop.show {
|
||||
opacity: .9 !important;
|
||||
background-color: $purple-100 !important;
|
||||
}
|
||||
|
||||
/* Push progress bar above modals */
|
||||
#nprogress .bar {
|
||||
z-index: 1600 !important; /* Must stay above nav bar */
|
||||
}
|
||||
|
||||
.resting-banner {
|
||||
width: 100%;
|
||||
min-height: 40px;
|
||||
background-color: $blue-10;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
z-index: 1300;
|
||||
display: flex;
|
||||
@@ -139,14 +120,10 @@ div
|
||||
.closepadding {
|
||||
margin: 11px 24px;
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
position: relative;
|
||||
right: 0;
|
||||
top: 0;
|
||||
cursor: pointer;
|
||||
|
||||
span svg path {
|
||||
stroke: $blue-500;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 768px) {
|
||||
@@ -169,6 +146,30 @@ div
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang='scss'>
|
||||
@import '~client/assets/scss/colors.scss';
|
||||
|
||||
.closepadding span svg path {
|
||||
stroke: #FFF;
|
||||
opacity: 0.48;
|
||||
}
|
||||
|
||||
/* @TODO: The modal-open class is not being removed. Let's try this for now */
|
||||
.modal {
|
||||
overflow-y: scroll !important;
|
||||
}
|
||||
|
||||
.modal-backdrop.show {
|
||||
opacity: .9 !important;
|
||||
background-color: $purple-100 !important;
|
||||
}
|
||||
|
||||
/* Push progress bar above modals */
|
||||
#nprogress .bar {
|
||||
z-index: 1600 !important; /* Must stay above nav bar */
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import axios from 'axios';
|
||||
import { loadProgressBar } from 'axios-progress-bar';
|
||||
@@ -185,7 +186,10 @@ import SelectMembersModal from 'client/components/selectMembersModal.vue';
|
||||
import notifications from 'client/mixins/notifications';
|
||||
import { setup as setupPayments } from 'client/libs/payments';
|
||||
import amazonPaymentsModal from 'client/components/payments/amazonModal';
|
||||
import paymentsSuccessModal from 'client/components/payments/successModal';
|
||||
|
||||
import spellsMixin from 'client/mixins/spells';
|
||||
import { CONSTANTS, getLocalSetting, removeLocalSetting } from 'client/libs/userlocalManager';
|
||||
|
||||
import svgClose from 'assets/svg/close.svg';
|
||||
import bannedAccountModal from 'client/components/bannedAccountModal';
|
||||
@@ -205,6 +209,7 @@ export default {
|
||||
SelectMembersModal,
|
||||
amazonPaymentsModal,
|
||||
bannedAccountModal,
|
||||
paymentsSuccessModal,
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
@@ -220,7 +225,6 @@ export default {
|
||||
loading: true,
|
||||
currentTipNumber: 0,
|
||||
bannerHidden: false,
|
||||
bannerHeight: 0,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -313,6 +317,7 @@ export default {
|
||||
const errorMessage = errorData.message || errorData;
|
||||
|
||||
// Check for conditions to reset the user auth
|
||||
// TODO use a specific error like NotificationNotFound instead of checking for the string
|
||||
const invalidUserMessage = [this.$t('invalidCredentials'), 'Missing authentication headers.'];
|
||||
if (invalidUserMessage.indexOf(errorMessage) !== -1) {
|
||||
this.$store.dispatch('auth:logout');
|
||||
@@ -322,12 +327,6 @@ export default {
|
||||
let snackbarTimeout = false;
|
||||
if (error.response.status === 502) snackbarTimeout = true;
|
||||
|
||||
const notificationNotFoundMessage = [
|
||||
this.$t('messageNotificationNotFound'),
|
||||
this.$t('messageNotificationNotFound', 'en'),
|
||||
];
|
||||
if (notificationNotFoundMessage.indexOf(errorMessage) !== -1) snackbarTimeout = true;
|
||||
|
||||
let errorsToShow = [];
|
||||
// show only the first error for each param
|
||||
let paramErrorsFound = {};
|
||||
@@ -341,13 +340,17 @@ export default {
|
||||
} else {
|
||||
errorsToShow.push(errorMessage);
|
||||
}
|
||||
// dispatch as one snackbar notification
|
||||
this.$store.dispatch('snackbars:add', {
|
||||
title: 'Habitica',
|
||||
text: errorsToShow.join(' '),
|
||||
type: 'error',
|
||||
timeout: snackbarTimeout,
|
||||
});
|
||||
|
||||
// Ignore NotificationNotFound errors, see https://github.com/HabitRPG/habitica/issues/10391
|
||||
if (errorData.error !== 'NotificationNotFound') {
|
||||
// dispatch as one snackbar notification
|
||||
this.$store.dispatch('snackbars:add', {
|
||||
title: 'Habitica',
|
||||
text: errorsToShow.join(' '),
|
||||
type: 'error',
|
||||
timeout: snackbarTimeout,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.reject(error);
|
||||
@@ -418,14 +421,6 @@ export default {
|
||||
|
||||
this.hideLoadingScreen();
|
||||
|
||||
window.addEventListener('resize', this.setBannerOffset);
|
||||
// Adjust the positioning of the header banners
|
||||
this.$watch('showRestingBanner', () => {
|
||||
this.$nextTick(() => {
|
||||
this.setBannerOffset();
|
||||
});
|
||||
}, {immediate: true});
|
||||
|
||||
// Adjust the timezone offset
|
||||
if (this.user.preferences.timezoneOffset !== this.browserTimezoneOffset) {
|
||||
this.$store.dispatch('user:set', {
|
||||
@@ -433,6 +428,14 @@ export default {
|
||||
});
|
||||
}
|
||||
|
||||
let appState = getLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE);
|
||||
if (appState) {
|
||||
appState = JSON.parse(appState);
|
||||
if (appState.paymentCompleted) {
|
||||
removeLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE);
|
||||
this.$root.$emit('habitica:payment-success', appState);
|
||||
}
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
// Load external scripts after the app has been rendered
|
||||
setupPayments();
|
||||
@@ -452,7 +455,6 @@ export default {
|
||||
this.$root.$off('bv::show::modal');
|
||||
this.$root.$off('buyModal::showItem');
|
||||
this.$root.$off('selectMembersModal::showItem');
|
||||
window.removeEventListener('resize', this.setBannerOffset);
|
||||
},
|
||||
mounted () {
|
||||
// Remove the index.html loading screen and now show the inapp loading
|
||||
@@ -611,22 +613,10 @@ export default {
|
||||
},
|
||||
hideBanner () {
|
||||
this.bannerHidden = true;
|
||||
this.setBannerOffset();
|
||||
},
|
||||
resumeDamage () {
|
||||
this.$store.dispatch('user:sleep');
|
||||
},
|
||||
setBannerOffset () {
|
||||
let contentPlacement = 0;
|
||||
if (this.showRestingBanner && this.$refs.restingBanner !== undefined) {
|
||||
contentPlacement = this.$refs.restingBanner.clientHeight;
|
||||
}
|
||||
this.bannerHeight = contentPlacement;
|
||||
let smartBanner = document.getElementsByClassName('smartbanner')[0];
|
||||
if (smartBanner !== undefined) {
|
||||
smartBanner.style.top = `${contentPlacement}px`;
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -1,90 +1,78 @@
|
||||
.achievement-costumeContest6x {
|
||||
.promo_armoire_backgrounds_201901 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -1136px -148px;
|
||||
width: 144px;
|
||||
height: 156px;
|
||||
}
|
||||
.promo_alligator {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px 0px;
|
||||
width: 480px;
|
||||
height: 360px;
|
||||
}
|
||||
.promo_animal_tails {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -994px 0px;
|
||||
width: 141px;
|
||||
height: 441px;
|
||||
}
|
||||
.promo_armoire_backgrounds_201811 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -481px -420px;
|
||||
background-position: -445px 0px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_frost_potions {
|
||||
.promo_bird_buddies_bundle {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -421px -723px;
|
||||
width: 417px;
|
||||
background-position: -421px -337px;
|
||||
width: 420px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_ios {
|
||||
.promo_g1g1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -361px;
|
||||
width: 375px;
|
||||
height: 361px;
|
||||
background-position: -241px -633px;
|
||||
width: 237px;
|
||||
height: 150px;
|
||||
}
|
||||
.promo_mystery_201811 {
|
||||
.promo_npc_alex {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -839px -723px;
|
||||
width: 282px;
|
||||
height: 147px;
|
||||
background-position: -566px -485px;
|
||||
width: 162px;
|
||||
height: 138px;
|
||||
}
|
||||
.promo_oddballs_bundle {
|
||||
.promo_seasonal_shop {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -481px -568px;
|
||||
background-position: -403px -485px;
|
||||
width: 162px;
|
||||
height: 138px;
|
||||
}
|
||||
.promo_snow_potions {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -445px -148px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_piyo {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -1136px 0px;
|
||||
width: 279px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_take_this {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -1281px -148px;
|
||||
background-position: -729px -485px;
|
||||
width: 96px;
|
||||
height: 69px;
|
||||
}
|
||||
.promo_turkey_day_2018 {
|
||||
.promo_winter_wonderland_2019 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -723px;
|
||||
background-position: 0px -485px;
|
||||
width: 402px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_wintery_skins {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -337px;
|
||||
width: 420px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_veteran_pets {
|
||||
.customize-option.promo_wintery_skins {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -871px;
|
||||
width: 363px;
|
||||
height: 141px;
|
||||
background-position: -25px -352px;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.scene_nametag {
|
||||
.scene_hat_guild {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -481px 0px;
|
||||
width: 512px;
|
||||
height: 208px;
|
||||
background-position: 0px 0px;
|
||||
width: 444px;
|
||||
height: 336px;
|
||||
}
|
||||
.scene_sleep {
|
||||
.scene_starting_over {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -481px -209px;
|
||||
width: 390px;
|
||||
height: 210px;
|
||||
background-position: -479px -633px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.scene_veteran_pets {
|
||||
.scene_todo_list {
|
||||
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -1136px -305px;
|
||||
width: 242px;
|
||||
height: 62px;
|
||||
background-position: 0px -633px;
|
||||
width: 240px;
|
||||
height: 195px;
|
||||
}
|
||||
|
||||
@@ -1,402 +1,402 @@
|
||||
.quest_TEMPLATE_FOR_MISSING_IMAGE {
|
||||
.npc_matt {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -251px -1519px;
|
||||
width: 221px;
|
||||
height: 39px;
|
||||
background-position: -597px -1535px;
|
||||
width: 195px;
|
||||
height: 138px;
|
||||
}
|
||||
.background_dysheartener {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px 0px;
|
||||
width: 306px;
|
||||
height: 202px;
|
||||
}
|
||||
.banner_flair_dysheartener {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1963px -836px;
|
||||
width: 69px;
|
||||
height: 18px;
|
||||
}
|
||||
.phobia_dysheartener {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1187px -880px;
|
||||
width: 201px;
|
||||
height: 195px;
|
||||
}
|
||||
.quest_alligator {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1627px -1079px;
|
||||
width: 201px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_armadillo {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px -435px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_atom1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1105px -1315px;
|
||||
width: 250px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_atom2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -389px -1535px;
|
||||
width: 207px;
|
||||
height: 138px;
|
||||
}
|
||||
.quest_atom3 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -747px -440px;
|
||||
width: 216px;
|
||||
height: 180px;
|
||||
}
|
||||
.quest_axolotl {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -747px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_badger {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px -655px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_basilist {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1844px -392px;
|
||||
width: 189px;
|
||||
height: 141px;
|
||||
}
|
||||
.quest_beetle {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1627px -1293px;
|
||||
width: 204px;
|
||||
height: 201px;
|
||||
}
|
||||
.quest_bunny {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -967px -660px;
|
||||
width: 210px;
|
||||
height: 186px;
|
||||
}
|
||||
.quest_butterfly {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -967px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_cheetah {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -967px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_cow {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1757px -175px;
|
||||
background-position: 0px -1535px;
|
||||
width: 174px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_dilatory {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -440px 0px;
|
||||
background-position: -220px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_dilatoryDistress1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1540px -1085px;
|
||||
background-position: -1627px -868px;
|
||||
width: 210px;
|
||||
height: 210px;
|
||||
}
|
||||
.quest_dilatoryDistress2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1757px -959px;
|
||||
background-position: -1844px -534px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_dilatoryDistress3 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -440px -232px;
|
||||
background-position: -880px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_dilatory_derby {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1320px -660px;
|
||||
background-position: 0px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_dustbunnies {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -660px 0px;
|
||||
background-position: -1187px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_egg {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1757px -751px;
|
||||
background-position: -1844px -184px;
|
||||
width: 165px;
|
||||
height: 207px;
|
||||
}
|
||||
.quest_evilsanta {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1562px -1332px;
|
||||
background-position: -1844px -836px;
|
||||
width: 118px;
|
||||
height: 131px;
|
||||
}
|
||||
.quest_evilsanta2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -220px -452px;
|
||||
background-position: -1187px -660px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_falcon {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -440px -452px;
|
||||
background-position: 0px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_ferret {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -660px -452px;
|
||||
background-position: -307px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_frog {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -880px -1112px;
|
||||
background-position: -660px -1315px;
|
||||
width: 221px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_ghost_stag {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -880px -220px;
|
||||
background-position: -660px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_goldenknight1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -880px -440px;
|
||||
background-position: -880px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_goldenknight2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1311px -1332px;
|
||||
background-position: -1356px -1315px;
|
||||
width: 250px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_goldenknight3 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px 0px;
|
||||
background-position: 0px -203px;
|
||||
width: 219px;
|
||||
height: 231px;
|
||||
}
|
||||
.quest_gryphon {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1322px -1112px;
|
||||
background-position: -307px -220px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_guineapig {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -660px -672px;
|
||||
background-position: -1407px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_harpy {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -880px -672px;
|
||||
background-position: -1407px -660px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_hedgehog {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px -1332px;
|
||||
background-position: -1407px -1100px;
|
||||
width: 219px;
|
||||
height: 186px;
|
||||
}
|
||||
.quest_hippo {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1100px -220px;
|
||||
background-position: 0px -1315px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_horse {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1100px -440px;
|
||||
background-position: -220px -1315px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_kangaroo {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1100px -660px;
|
||||
background-position: -1407px -880px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_kraken {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -877px -1332px;
|
||||
background-position: -527px -220px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_lostMasterclasser1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -220px -892px;
|
||||
background-position: -1100px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_lostMasterclasser2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -440px -892px;
|
||||
background-position: -440px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_lostMasterclasser3 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -660px -892px;
|
||||
background-position: -1187px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_mayhemMistiflying1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1757px -1261px;
|
||||
background-position: -1844px -685px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_mayhemMistiflying2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1100px -892px;
|
||||
background-position: -440px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_mayhemMistiflying3 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1320px 0px;
|
||||
background-position: -660px -655px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_monkey {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1320px -220px;
|
||||
background-position: -440px -655px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moon1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1540px -217px;
|
||||
background-position: -1627px -651px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_moon2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -220px 0px;
|
||||
background-position: -220px -655px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moon3 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1320px -880px;
|
||||
background-position: -747px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moonstone1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px -1112px;
|
||||
background-position: -527px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moonstone2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -220px -1112px;
|
||||
background-position: -1407px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_moonstone3 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -440px -1112px;
|
||||
background-position: -440px -1315px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_nudibranch {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1540px -868px;
|
||||
background-position: -1627px -217px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_octopus {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -220px -1332px;
|
||||
background-position: -882px -1315px;
|
||||
width: 222px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_owl {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -660px -1112px;
|
||||
background-position: -1187px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_peacock {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1540px 0px;
|
||||
background-position: -1627px 0px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_penguin {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1757px -567px;
|
||||
background-position: -1844px 0px;
|
||||
width: 190px;
|
||||
height: 183px;
|
||||
}
|
||||
.quest_pterodactyl {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1320px -440px;
|
||||
background-position: -660px -875px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_rat {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -880px -892px;
|
||||
background-position: -967px -440px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_rock {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1540px -434px;
|
||||
background-position: -1627px -434px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_rooster {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1757px 0px;
|
||||
background-position: -175px -1535px;
|
||||
width: 213px;
|
||||
height: 174px;
|
||||
}
|
||||
.quest_sabretooth {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px -892px;
|
||||
background-position: -440px -435px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_seaserpent {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1100px 0px;
|
||||
background-position: -220px -435px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_sheep {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -440px -672px;
|
||||
background-position: -220px -1095px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_slime {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px -672px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_sloth {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -880px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_snail {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1102px -1112px;
|
||||
width: 219px;
|
||||
height: 213px;
|
||||
}
|
||||
.quest_snake {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -660px -1332px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_spider {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px -1519px;
|
||||
width: 250px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_squirrel {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px -452px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_stoikalmCalamity1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1757px -1412px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_stoikalmCalamity2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -660px -220px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_stoikalmCalamity3 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -220px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_taskwoodsTerror1 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1757px -1110px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
.quest_taskwoodsTerror2 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1540px -651px;
|
||||
width: 216px;
|
||||
height: 216px;
|
||||
}
|
||||
.quest_taskwoodsTerror3 {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: 0px -232px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
.quest_treeling {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1094px -1332px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_trex {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -1757px -389px;
|
||||
width: 204px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_trex_undead {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -443px -1332px;
|
||||
width: 216px;
|
||||
height: 177px;
|
||||
}
|
||||
.quest_triceratops {
|
||||
background-image: url('~assets/images/sprites/spritesmith-main-11.png');
|
||||
background-position: -220px -672px;
|
||||
background-position: -1407px 0px;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 447 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 546 KiB After Width: | Height: | Size: 545 KiB |
|
Before Width: | Height: | Size: 500 KiB After Width: | Height: | Size: 532 KiB |
|
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 417 KiB After Width: | Height: | Size: 393 KiB |
|
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 279 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 142 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 181 KiB |
|
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
@@ -2,8 +2,8 @@
|
||||
// possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, spring, summer
|
||||
// more to be added on future seasons
|
||||
|
||||
$npc_market_flavor: 'normal';
|
||||
$npc_quests_flavor: 'normal';
|
||||
$npc_seasonal_flavor: 'normal';
|
||||
$npc_timetravelers_flavor: 'normal';
|
||||
$npc_tavern_flavor: 'normal';
|
||||
$npc_market_flavor: 'winter';
|
||||
$npc_quests_flavor: 'winter';
|
||||
$npc_seasonal_flavor: 'winter';
|
||||
$npc_timetravelers_flavor: 'winter';
|
||||
$npc_tavern_flavor: 'winter';
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>
|
||||
|
After Width: | Height: | Size: 431 B |
@@ -0,0 +1,44 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="73" height="27" viewBox="0 0 73 27">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path fill="#8EEDF6" d="M4.333 9.757l2.166-.554-1.742-1.401-.554-2.166-1.401 1.742-2.166.554 1.742 1.4.554 2.167zM70.333 5.757l2.166-.554-1.742-1.401-.554-2.166-1.401 1.742-2.166.554 1.742 1.4.554 2.167zM37.147 5.518l2.573.428-1.202-2.315.428-2.574-2.315 1.202-2.574-.427 1.202 2.315-.427 2.573zM68.735 22.132l2.367 1.812.03-2.981 1.812-2.368-2.981-.03-2.368-1.812-.03 2.982-1.812 2.367zM33.676 23.656l1.839.305-.859-1.653.305-1.839-1.653.859-1.839-.305.859 1.653-.305 1.839zM10.695 25.362l.805 1.68.862-1.651 1.68-.804-1.651-.862-.804-1.681-.862 1.652-1.681.804z"/>
|
||||
<path fill="#F8F9F9" d="M21.862 9.542l5.914-1.585 2.219 8.28-5.914 1.584z"/>
|
||||
<path fill="#DDF3F3" d="M15.949 11.126l5.913-1.584 2.219 8.28-5.914 1.584z"/>
|
||||
<path fill="#FFA624" d="M20.68 9.859l1.182-.317 2.219 8.28-1.183.316z"/>
|
||||
<path fill="#FFBE5D" d="M21.862 9.542l1.183-.317 2.219 8.28-1.183.316z"/>
|
||||
<path fill="#EE9109" d="M22.581 16.955l1.183-.317.317 1.183-1.183.317zM20.68 9.859l1.182-.317.317 1.183-1.182.317z"/>
|
||||
<path fill="#C1E9E9" d="M15.949 11.126l4.73-1.267.318 1.183-4.732 1.267zM17.85 18.223l4.731-1.268.317 1.183-4.731 1.268z"/>
|
||||
<path fill="#DDF3F3" d="M23.045 9.225l4.731-1.268.317 1.183-4.73 1.268zM24.947 16.322l4.73-1.268.318 1.183-4.731 1.267z"/>
|
||||
<path fill="#FFA624" d="M23.764 16.638l1.183-.316.317 1.182-1.183.317zM21.862 9.542l1.183-.317.317 1.183-1.183.317z"/>
|
||||
<g>
|
||||
<path stroke="#FFA624" stroke-width="1.5" d="M21.737 3.348c-.295-1.038-1.009-2.02-2.008-2.204-1-.184-1.69.542-1.495 1.297.195.755.88.984 3.075 1.916.623.264.723.03.428-1.009z"/>
|
||||
<path stroke="#FFBE5D" stroke-width="1.5" d="M24.307 3.71c.57-.918 1.527-1.664 2.538-1.565 1.012.098 1.475.986 1.08 1.658-.396.671-1.117.703-3.484.994-.672.083-.703-.17-.134-1.088z"/>
|
||||
<path fill="#EE9109" d="M23.129 2.769c-1.968-.277-1.106 2.141-.317 2.252.79.111 2.285-1.976.317-2.252z"/>
|
||||
<path fill="#F8F9F9" d="M22.862 4.665l7.276 1.022-.511 3.638-7.276-1.022z"/>
|
||||
<path fill="#DDF3F3" d="M15.587 3.642l7.275 1.023-.51 3.638-7.276-1.023z"/>
|
||||
<path fill="#FFBE5D" d="M20.437 4.324l4.85.682-.51 3.638-4.85-.682z"/>
|
||||
<path fill="#FFA624" d="M20.437 4.324l2.425.341-.51 3.638-2.426-.341z"/>
|
||||
<path fill="#FFA624" d="M22.862 4.665l2.426.34-.17 1.213-2.426-.34z"/>
|
||||
<path fill="#EE9109" d="M20.437 4.324l2.425.341-.17 1.213-2.425-.341z"/>
|
||||
<path fill="#C1E9E9" d="M15.246 6.068l4.85.681-.17 1.213-4.85-.682z"/>
|
||||
<path fill="#DDF3F3" d="M24.947 7.431l4.85.682-.17 1.212-4.85-.681z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path stroke="#FFA624" stroke-width="1.5" d="M49.696 7.04c-.549-1.24-1.609-2.337-2.885-2.391-1.276-.054-2.007.969-1.632 1.874.374.905 1.266 1.071 4.16 1.847.822.22.905-.09.357-1.33z"/>
|
||||
<path stroke="#FFBE5D" stroke-width="1.5" d="M52.956 7.04c.548-1.24 1.609-2.337 2.885-2.391 1.276-.054 2.007.969 1.632 1.874-.374.905-1.266 1.071-4.16 1.847-.822.22-.905-.09-.357-1.33z"/>
|
||||
<path fill="#EE9109" d="M51.326 6.075c-2.497 0-1.002 2.858 0 2.858s2.497-2.858 0-2.858z"/>
|
||||
<path fill="#F8F9F9" d="M51.326 8.481h9.23v4.616h-9.23z"/>
|
||||
<path fill="#DDF3F3" d="M42.095 8.481h9.23v4.616h-9.23z"/>
|
||||
<path fill="#FFBE5D" d="M48.249 8.481h6.154v4.616h-6.154z"/>
|
||||
<path fill="#FFA624" d="M48.249 8.481h3.077v4.616h-3.077zM51.326 8.481h3.077v1.539h-3.077z"/>
|
||||
<path fill="#EE9109" d="M48.249 8.481h3.077v1.539h-3.077z"/>
|
||||
<path fill="#F8F9F9" d="M51.326 13.097h7.692v10.769h-7.692z"/>
|
||||
<path fill="#DDF3F3" d="M43.634 13.097h7.692v10.769h-7.692z"/>
|
||||
<path fill="#FFA624" d="M49.787 13.097h1.538v10.769h-1.538z"/>
|
||||
<path fill="#FFBE5D" d="M51.326 13.097h1.538v10.769h-1.538z"/>
|
||||
<path fill="#EE9109" d="M49.787 22.327h1.539v1.539h-1.539zM49.787 13.097h1.539v1.538h-1.539z"/>
|
||||
<path fill="#C1E9E9" d="M43.634 13.097h6.153v1.538h-6.153zM42.095 11.558h6.154v1.539h-6.154zM43.634 22.327h6.153v1.539h-6.153z"/>
|
||||
<path fill="#DDF3F3" d="M52.864 13.097h6.154v1.538h-6.154zM54.403 11.558h6.154v1.539h-6.154zM52.864 22.327h6.154v1.539h-6.154z"/>
|
||||
<path fill="#FFA624" d="M51.326 22.327h1.538v1.539h-1.538zM51.326 13.097h1.538v1.538h-1.538z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |
@@ -164,30 +164,30 @@ export default {
|
||||
classGear (heroClass) {
|
||||
if (heroClass === 'rogue') {
|
||||
return {
|
||||
armor: 'armor_rogue_5',
|
||||
head: 'head_rogue_5',
|
||||
shield: 'shield_rogue_6',
|
||||
weapon: 'weapon_rogue_6',
|
||||
armor: 'armor_special_winter2019Rogue',
|
||||
head: 'head_special_winter2019Rogue',
|
||||
shield: 'shield_special_winter2019Rogue',
|
||||
weapon: 'weapon_special_winter2019Rogue',
|
||||
};
|
||||
} else if (heroClass === 'wizard') {
|
||||
return {
|
||||
armor: 'armor_wizard_5',
|
||||
head: 'head_wizard_5',
|
||||
weapon: 'weapon_wizard_6',
|
||||
armor: 'armor_special_winter2019Mage',
|
||||
head: 'head_special_winter2019Mage',
|
||||
weapon: 'weapon_special_winter2019Mage',
|
||||
};
|
||||
} else if (heroClass === 'healer') {
|
||||
return {
|
||||
armor: 'armor_healer_5',
|
||||
head: 'head_healer_5',
|
||||
shield: 'shield_healer_5',
|
||||
weapon: 'weapon_healer_6',
|
||||
armor: 'armor_special_winter2019Healer',
|
||||
head: 'head_special_winter2019Healer',
|
||||
shield: 'shield_special_winter2019Healer',
|
||||
weapon: 'weapon_special_winter2019Healer',
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
armor: 'armor_warrior_5',
|
||||
head: 'head_warrior_5',
|
||||
shield: 'shield_warrior_5',
|
||||
weapon: 'weapon_warrior_6',
|
||||
armor: 'armor_special_winter2019Warrior',
|
||||
head: 'head_special_winter2019Warrior',
|
||||
shield: 'shield_special_winter2019Warrior',
|
||||
weapon: 'weapon_special_winter2019Warrior',
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
.quest(:class='`quest_${user.party.quest.completed}`')
|
||||
p(v-if='questData.completion && typeof questData.completion === "function"', v-html='questData.completion()')
|
||||
.quest-rewards.text-center
|
||||
h3 {{ $t('youReceived') }}
|
||||
h3(v-once) {{ $t('paymentYouReceived') }}
|
||||
questDialogDrops(:item="questData")
|
||||
.modal-footer
|
||||
button.btn.btn-primary(@click='setQuestCompleted()') {{ $t('ok') }}
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
hr
|
||||
.row
|
||||
.col-12.col-md-5
|
||||
| © 2018 Habitica. All rights reserved.
|
||||
| © 2019 Habitica. All rights reserved.
|
||||
.debug.float-left(v-if="!IS_PRODUCTION && isUserLoaded")
|
||||
button.btn.btn-primary(@click="debugMenuShown = !debugMenuShown") Toggle Debug Menu
|
||||
.debug-group(v-if="debugMenuShown")
|
||||
@@ -96,6 +96,7 @@
|
||||
a.btn.btn-secondary(@click="plusTenHealth()") + 10HP
|
||||
a.btn.btn-secondary(@click="addMana()") +MP
|
||||
a.btn.btn-secondary(@click="addLevelsAndGold()") +Exp +GP +MP
|
||||
a.btn.btn-secondary(@click="addExp()") +Exp
|
||||
a.btn.btn-secondary(@click="addOneLevel()") +1 Level
|
||||
a.btn.btn-secondary(@click="addQuestProgress()", tooltip="+1000 to boss quests. 300 items to collection quests") Quest Progress Up
|
||||
a.btn.btn-secondary(@click="makeAdmin()") Make Admin
|
||||
@@ -326,7 +327,7 @@ export default {
|
||||
'stats.mp': this.user.stats.mp + 10000,
|
||||
});
|
||||
},
|
||||
addOneLevel () {
|
||||
addExp () {
|
||||
// @TODO: Name these variables better
|
||||
let exp = 0;
|
||||
let five = 10 * this.user.stats.lvl;
|
||||
@@ -340,6 +341,11 @@ export default {
|
||||
'stats.exp': exp,
|
||||
});
|
||||
},
|
||||
addOneLevel () {
|
||||
this.$store.dispatch('user:set', {
|
||||
'stats.lvl': this.user.stats.lvl + 1,
|
||||
});
|
||||
},
|
||||
async addQuestProgress () {
|
||||
await axios.post('/api/v4/debug/quest-progress');
|
||||
|
||||
|
||||
@@ -328,10 +328,10 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
registering () {
|
||||
if (this.$route.path.startsWith('/login')) {
|
||||
return false;
|
||||
if (this.$route.path.startsWith('/register')) {
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
},
|
||||
resetPasswordSetNewOne () {
|
||||
if (this.$route.path.startsWith('/reset-password')) {
|
||||
|
||||
@@ -325,7 +325,9 @@ export default {
|
||||
this.$emit('show-member-modal', memberId);
|
||||
},
|
||||
atHighlight (text) {
|
||||
const userRegex = new RegExp(`@(${this.user.auth.local.username}|${this.user.profile.name})(?:\\b)`, 'gi');
|
||||
const escapedDisplayName = escapeRegExp(this.user.profile.name);
|
||||
const escapedUsername = escapeRegExp(this.user.auth.local.username);
|
||||
const userRegex = new RegExp(`@(${escapedDisplayName}|${escapedUsername})(?:\\b)`, 'gi');
|
||||
const atRegex = new RegExp(/(?!\b)@[\w-]+/g);
|
||||
|
||||
if (userRegex.test(text)) {
|
||||
|
||||
@@ -32,7 +32,7 @@ b-modal#avatar-modal(title="", :size='editing ? "lg" : "md"', :hide-header='true
|
||||
.menu-item
|
||||
.svg-icon(v-html='icons.accessoriesIcon')
|
||||
strong(v-once) {{$t('extra')}}
|
||||
.menu-container.col-2(@click='changeTopPage("backgrounds", "2018")', v-if='editing', :class='{active: activeTopPage === "backgrounds"}')
|
||||
.menu-container.col-2(@click='changeTopPage("backgrounds", "2019")', v-if='editing', :class='{active: activeTopPage === "backgrounds"}')
|
||||
.menu-item
|
||||
.svg-icon(v-html='icons.backgroundsIcon')
|
||||
strong(v-once) {{$t('backgrounds')}}
|
||||
@@ -274,9 +274,11 @@ b-modal#avatar-modal(title="", :size='editing ? "lg" : "md"', :hide-header='true
|
||||
.incentive-background(:class='[`background_${bg.key}`]')
|
||||
.small-rectangle
|
||||
.row.sub-menu.col-10.offset-1(v-if='!filterBackgrounds')
|
||||
.col-3.text-center.sub-menu-item(@click='changeSubPage("2018")', :class='{active: activeSubPage === "2018"}')
|
||||
.col-2.text-center.sub-menu-item(@click='changeSubPage("2019")', :class='{active: activeSubPage === "2019"}')
|
||||
strong(v-once) 2019
|
||||
.col-2.text-center.sub-menu-item(@click='changeSubPage("2018")', :class='{active: activeSubPage === "2018"}')
|
||||
strong(v-once) 2018
|
||||
.col-3.text-center.sub-menu-item(@click='changeSubPage("2017")', :class='{active: activeSubPage === "2017"}')
|
||||
.col-2.text-center.sub-menu-item(@click='changeSubPage("2017")', :class='{active: activeSubPage === "2017"}')
|
||||
strong(v-once) 2017
|
||||
.col-2.text-center.sub-menu-item(@click='changeSubPage("2016")', :class='{active: activeSubPage === "2016"}')
|
||||
strong(v-once) 2016
|
||||
@@ -1297,6 +1299,7 @@ export default {
|
||||
2016: [],
|
||||
2017: [],
|
||||
2018: [],
|
||||
2019: [],
|
||||
};
|
||||
|
||||
// Hack to force update for now until we restructure the data
|
||||
|
||||
@@ -141,7 +141,7 @@ export default {
|
||||
this.changePage(this.PAGES.PAY);
|
||||
},
|
||||
pay (paymentMethod) {
|
||||
const subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
|
||||
const subscriptionKey = 'group_monthly';
|
||||
let paymentData = {
|
||||
subscription: subscriptionKey,
|
||||
coupon: null,
|
||||
@@ -149,6 +149,7 @@ export default {
|
||||
|
||||
if (this.upgradingGroup && this.upgradingGroup._id) {
|
||||
paymentData.groupId = this.upgradingGroup._id;
|
||||
paymentData.group = this.upgradingGroup;
|
||||
} else {
|
||||
paymentData.groupToCreate = this.newGroup;
|
||||
}
|
||||
|
||||
@@ -1,100 +1,61 @@
|
||||
<template lang="pug">
|
||||
b-modal#create-party-modal(title="Empty", size='lg', hide-footer=true)
|
||||
b-modal#create-party-modal(size='lg', hide-footer=true)
|
||||
.header-wrap(slot="modal-header")
|
||||
.quest_screen
|
||||
.row.heading
|
||||
.col-12.text-center
|
||||
h2(v-once) {{$t('playInPartyTitle')}}
|
||||
p(v-once) {{$t('playInPartyDescription')}}
|
||||
.col-12.text-center.pr-5.pl-5
|
||||
h2(v-once) {{ $t('playInPartyTitle') }}
|
||||
p.mb-4(v-once) {{ $t('playInPartyDescription') }}
|
||||
button.btn.btn-primary(v-once, @click='createParty()') {{ $t('createParty') }}
|
||||
.row.grey-row
|
||||
.col-6.text-center
|
||||
.start-party
|
||||
h3(v-once) {{$t('startYourOwnPartyTitle')}}
|
||||
p(v-once) {{$t('startYourOwnPartyDescription')}}
|
||||
button.btn.btn-primary(v-once, @click='createParty()') {{$t('createParty')}}
|
||||
.col-6
|
||||
div.text-center
|
||||
.join-party
|
||||
h3(v-once) {{$t('wantToJoinPartyTitle')}}
|
||||
p(v-once) {{$t('wantToJoinPartyDescription')}}
|
||||
button.btn.btn-primary(v-once, @click='shareUserId()') {{$t('shartUserId')}}
|
||||
.share-userid-options(v-if="shareUserIdShown")
|
||||
.option-item(@click='copyUserId()')
|
||||
.svg-icon(v-html="icons.copy")
|
||||
input(type="text", v-model="user._id", id="userIdInput")
|
||||
| Copy User ID
|
||||
//.option-item(v-once)
|
||||
.svg-icon(v-html="icons.greyBadge")
|
||||
| {{$t('lookingForGroup')}}
|
||||
//.option-item(v-once)
|
||||
.svg-icon(v-html="icons.qrCode")
|
||||
| {{$t('qrCode')}}
|
||||
//.option-item(v-once)
|
||||
.svg-icon.facebook(v-html="icons.facebook")
|
||||
| Facebook
|
||||
//.option-item(v-once)
|
||||
.svg-icon(v-html="icons.twitter")
|
||||
| Twitter
|
||||
.col-12.text-center
|
||||
.join-party
|
||||
h2(v-once) {{ $t('wantToJoinPartyTitle') }}
|
||||
p(v-html='$t("wantToJoinPartyDescription")')
|
||||
.form-group(@click='copyUsername')
|
||||
.d-flex.align-items-center
|
||||
label.mr-3(v-once) {{ $t('username') }}
|
||||
.flex-grow-1
|
||||
.input-group-prepend.input-group-text @
|
||||
.text {{ user.auth.local.username }}
|
||||
.svg-icon.copy-icon(v-html='icons.copy')
|
||||
.small(v-once) {{ $t('copy') }}
|
||||
</template>
|
||||
|
||||
<style>
|
||||
#create-party-modal .modal-body {
|
||||
padding: 0rem 0.75rem;
|
||||
}
|
||||
|
||||
#create-party-modal .modal-dialog {
|
||||
width: 684px;
|
||||
width: 35.75rem;
|
||||
}
|
||||
|
||||
#create-party-modal .modal-header {
|
||||
padding: 0;
|
||||
border-bottom: 0px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss">
|
||||
<style lang="scss" scoped>
|
||||
@import '~client/assets/scss/colors.scss';
|
||||
|
||||
.heading {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
.copy-icon {
|
||||
width: 1rem;
|
||||
}
|
||||
|
||||
.header-wrap {
|
||||
padding: 0;
|
||||
color: #4e4a57;
|
||||
width: 100%;
|
||||
|
||||
.quest_screen {
|
||||
background-image: url('~client/assets/images/quest_screen.png');
|
||||
background-size: cover;
|
||||
width: 100%;
|
||||
height: 246px;
|
||||
margin-bottom: .5em;
|
||||
border-radius: 2px 2px 0 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: #4f2a93;
|
||||
}
|
||||
.form-control[readonly] {
|
||||
background-color: $white;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
.start-party {
|
||||
background-image: url('~client/assets/images/basilist@3x.png');
|
||||
background-size: cover;
|
||||
width: 122px;
|
||||
height: 69px;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.join-party {
|
||||
background-image: url('~client/assets/images/party@3x.png');
|
||||
background-size: cover;
|
||||
width: 203px;
|
||||
height: 66px;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
padding-bottom: 0;
|
||||
padding-top: 0;
|
||||
.form-group {
|
||||
background-color: $gray-600;
|
||||
border-radius: 2px;
|
||||
border: solid 1px $gray-500;
|
||||
width: 90%;
|
||||
margin: auto;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.grey-row {
|
||||
@@ -104,97 +65,130 @@ b-modal#create-party-modal(title="Empty", size='lg', hide-footer=true)
|
||||
border-radius: 0px 0px 2px 2px;
|
||||
}
|
||||
|
||||
.share-userid-options {
|
||||
background-color: $white;
|
||||
border-radius: 2px;
|
||||
width: 220px;
|
||||
position: absolute;
|
||||
top: 9em;
|
||||
left: 4.8em;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
h2 {
|
||||
color: $gray-100;
|
||||
}
|
||||
|
||||
#userIdInput {
|
||||
position: absolute;
|
||||
left: 1000rem;
|
||||
.header-wrap {
|
||||
padding: 0;
|
||||
color: #4e4a57;
|
||||
width: 100%;
|
||||
|
||||
.quest_screen {
|
||||
background-image: url('~client/assets/images/group@3x.png');
|
||||
background-size: cover;
|
||||
width: 100%;
|
||||
height: 246px;
|
||||
margin-bottom: 1.5rem;
|
||||
border-radius: 2px 2px 0 0;
|
||||
image-rendering: optimizequality;
|
||||
}
|
||||
|
||||
.option-item {
|
||||
padding: 1em;
|
||||
|
||||
.svg-icon {
|
||||
margin-right: .5em;
|
||||
width: 20px;
|
||||
display: inline-block;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.facebook svg {
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.option-item:hover {
|
||||
background-color: $header-color;
|
||||
h2 {
|
||||
color: $purple-200;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.heading {
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
input.form-control {
|
||||
border: 0px;
|
||||
padding-left: 0.25rem;
|
||||
}
|
||||
|
||||
.input-group-prepend {
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.input-group-text {
|
||||
background-color: $white;
|
||||
border: 0px;
|
||||
border-radius: 0px;
|
||||
color: $gray-300;
|
||||
padding: 0rem 0.1rem 0rem 0.75rem;
|
||||
}
|
||||
|
||||
.join-party {
|
||||
background-image: url('~client/assets/images/party.png');
|
||||
background-size: cover;
|
||||
width: 203px;
|
||||
height: 66px;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
label {
|
||||
color: $gray-100;
|
||||
font-weight: bold;
|
||||
margin-bottom: 0rem;
|
||||
margin-left: 1rem;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.modal-dialog .text {
|
||||
min-height: 1rem;
|
||||
margin: 0.75rem auto 0.75rem 0.25rem;
|
||||
}
|
||||
|
||||
.small {
|
||||
color: $gray-200;
|
||||
margin: auto 0.5rem auto 0.25rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import { mapState } from 'client/libs/store';
|
||||
import * as Analytics from 'client/libs/analytics';
|
||||
import { mapState } from 'client/libs/store';
|
||||
import * as Analytics from 'client/libs/analytics';
|
||||
import notifications from 'client/mixins/notifications';
|
||||
|
||||
import copyIcon from 'assets/svg/copy.svg';
|
||||
import greyBadgeIcon from 'assets/svg/grey-badge.svg';
|
||||
import qrCodeIcon from 'assets/svg/qrCode.svg';
|
||||
import facebookIcon from 'assets/svg/facebook.svg';
|
||||
import twitterIcon from 'assets/svg/twitter.svg';
|
||||
import copyIcon from 'assets/svg/copy.svg';
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
icons: Object.freeze({
|
||||
copy: copyIcon,
|
||||
greyBadge: greyBadgeIcon,
|
||||
qrCode: qrCodeIcon,
|
||||
facebook: facebookIcon,
|
||||
twitter: twitterIcon,
|
||||
}),
|
||||
shareUserIdShown: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({user: 'user.data'}),
|
||||
},
|
||||
methods: {
|
||||
shareUserId () {
|
||||
this.shareUserIdShown = !this.shareUserIdShown;
|
||||
},
|
||||
async createParty () {
|
||||
let group = {
|
||||
type: 'party',
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
icons: Object.freeze({
|
||||
copy: copyIcon,
|
||||
}),
|
||||
};
|
||||
group.name = this.$t('possessiveParty', {name: this.user.profile.name});
|
||||
let party = await this.$store.dispatch('guilds:create', {group});
|
||||
this.$store.state.party.data = party;
|
||||
this.user.party._id = party._id;
|
||||
|
||||
Analytics.updateUser({
|
||||
partyID: party._id,
|
||||
partySize: 1,
|
||||
});
|
||||
|
||||
this.$root.$emit('bv::hide::modal', 'create-party-modal');
|
||||
this.$router.push('/party');
|
||||
},
|
||||
copyUserId () {
|
||||
const copyText = document.getElementById('userIdInput');
|
||||
copyText.select();
|
||||
document.execCommand('copy');
|
||||
alert('User ID has been copied');
|
||||
computed: {
|
||||
...mapState({user: 'user.data'}),
|
||||
},
|
||||
},
|
||||
};
|
||||
methods: {
|
||||
async createParty () {
|
||||
let group = {
|
||||
type: 'party',
|
||||
};
|
||||
group.name = this.$t('possessiveParty', {name: this.user.profile.name});
|
||||
let party = await this.$store.dispatch('guilds:create', {group});
|
||||
this.$store.state.party.data = party;
|
||||
this.user.party._id = party._id;
|
||||
|
||||
Analytics.updateUser({
|
||||
partyID: party._id,
|
||||
partySize: 1,
|
||||
});
|
||||
|
||||
this.$root.$emit('bv::hide::modal', 'create-party-modal');
|
||||
this.$router.push('/party');
|
||||
},
|
||||
copyUsername () {
|
||||
if (navigator.clipboard) {
|
||||
navigator.clipboard.writeText(this.user.auth.local.username);
|
||||
} else {
|
||||
let copyText = document.createElement('textarea');
|
||||
copyText.value = this.user.auth.local.username;
|
||||
document.body.appendChild(copyText);
|
||||
copyText.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(copyText);
|
||||
}
|
||||
this.text(this.$t('usernameCopied'));
|
||||
},
|
||||
},
|
||||
mixins: [notifications],
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -395,14 +395,15 @@ export default {
|
||||
this.changePage(this.PAGES.PAY);
|
||||
},
|
||||
pay (paymentMethod) {
|
||||
let subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
|
||||
let paymentData = {
|
||||
const subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
|
||||
const paymentData = {
|
||||
subscription: subscriptionKey,
|
||||
coupon: null,
|
||||
};
|
||||
|
||||
if (this.upgradingGroup && this.upgradingGroup._id) {
|
||||
paymentData.groupId = this.upgradingGroup._id;
|
||||
paymentData.group = this.upgradingGroup;
|
||||
} else {
|
||||
paymentData.groupToCreate = this.newGroup;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ menu-dropdown.item-user(:right="true")
|
||||
a.nav-link.dropdown-item.dropdown-separated.d-flex.justify-content-between.align-items-center(@click.prevent='showInbox()')
|
||||
div {{ $t('messages') }}
|
||||
message-count(v-if='user.inbox.newMessages > 0', :count="user.inbox.newMessages")
|
||||
a.dropdown-item(@click='showAvatar("backgrounds", "2018")') {{ $t('backgrounds') }}
|
||||
a.dropdown-item(@click='showAvatar("backgrounds", "2019")') {{ $t('backgrounds') }}
|
||||
a.dropdown-item(@click='showProfile("stats")') {{ $t('stats') }}
|
||||
a.dropdown-item(@click='showProfile("achievements")') {{ $t('achievements') }}
|
||||
a.dropdown-item.dropdown-separated(@click='showProfile("profile")') {{ $t('profile') }}
|
||||
|
||||
@@ -6,7 +6,7 @@ b-modal#hatchedPet-modal(:hide-header="true")
|
||||
div.pet-background
|
||||
div(:class="pet.class")
|
||||
h4.title {{ pet.name }}
|
||||
div.text(v-if="!hideText", v-markdown="$t('hatchedPetHowToUse')")
|
||||
div.text(v-if="!hideText", v-markdown="$t('hatchedPetHowToUse', { stableUrl: '/inventory/stable' })")
|
||||
button.btn.btn-primary(@click="close()") {{ $t('onward') }}
|
||||
div.clearfix(slot="modal-footer")
|
||||
</template>
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
<template lang="pug">
|
||||
div
|
||||
.item-wrapper(@click="click()", :id="itemId")
|
||||
.item.pet-slot(
|
||||
div
|
||||
.item-wrapper(@click="click()", :id="itemId")
|
||||
.item.pet-slot(
|
||||
:class="{'item-empty': !isOwned(), 'highlight': highlightBorder}",
|
||||
)
|
||||
slot(name="itemBadge", :item="item")
|
||||
span.item-content.hatchAgain(v-if="mountOwned() && isHatchable()")
|
||||
span.egg(:class="eggClass")
|
||||
span.potion(:class="potionClass")
|
||||
span.item-content(v-else, :class="getPetItemClass()")
|
||||
span.pet-progress-background(v-if="isAllowedToFeed() && progress() > 0")
|
||||
div.pet-progress-bar(v-bind:style="{width: 100 * progress()/50 + '%' }")
|
||||
span.item-label(v-if="label") {{ label }}
|
||||
)
|
||||
slot(name="itemBadge", :item="item")
|
||||
span.item-content.hatchAgain(v-if="mountOwned() && isHatchable() && !item.isSpecial()")
|
||||
span.egg(:class="eggClass")
|
||||
span.potion(:class="potionClass")
|
||||
span.item-content(v-else, :class="getPetItemClass()")
|
||||
span.pet-progress-background(v-if="isAllowedToFeed() && progress() > 0")
|
||||
div.pet-progress-bar(v-bind:style="{width: 100 * progress()/50 + '%' }")
|
||||
span.item-label(v-if="label") {{ label }}
|
||||
|
||||
b-popover(
|
||||
b-popover(
|
||||
:target="itemId",
|
||||
:triggers="showPopover ? 'hover' : ''",
|
||||
:placement="popoverPosition",
|
||||
)
|
||||
div.hatchablePopover(v-if="item.isHatchable()")
|
||||
h4.popover-content-title {{ item.name }}
|
||||
div.popover-content-text(v-html="$t('haveHatchablePet', { potion: item.potionName, egg: item.eggName })")
|
||||
div.potionEggGroup
|
||||
div.potionEggBackground
|
||||
div(:class="potionClass")
|
||||
div.potionEggBackground
|
||||
div(:class="eggClass")
|
||||
div(v-else)
|
||||
h4.popover-content-title {{ item.name }}
|
||||
)
|
||||
div.hatchablePopover(v-if="item.isHatchable()")
|
||||
h4.popover-content-title {{ item.name }}
|
||||
div.popover-content-text(v-html="$t('haveHatchablePet', { potion: item.potionName, egg: item.eggName })")
|
||||
div.potionEggGroup
|
||||
div.potionEggBackground
|
||||
div(:class="potionClass")
|
||||
div.potionEggBackground
|
||||
div(:class="eggClass")
|
||||
div(v-else)
|
||||
h4.popover-content-title {{ item.name }}
|
||||
|
||||
</template>
|
||||
|
||||
@@ -73,7 +73,7 @@ div
|
||||
<script>
|
||||
import uuid from 'uuid';
|
||||
import { mapState } from 'client/libs/store';
|
||||
import {isAllowedToFeed, isHatchable, isOwned} from '../../../libs/createAnimal';
|
||||
import {isAllowedToFeed, isHatchable, isOwned, isSpecial} from '../../../libs/createAnimal';
|
||||
|
||||
export default {
|
||||
props: {
|
||||
@@ -116,6 +116,10 @@ div
|
||||
return `Pet Pet-${this.item.key} ${this.item.eggKey}`;
|
||||
}
|
||||
|
||||
if (!this.isOwned() && this.isSpecial()) {
|
||||
return 'GreyedOut PixelPaw';
|
||||
}
|
||||
|
||||
if (this.isHatchable()) {
|
||||
return 'PixelPaw';
|
||||
}
|
||||
@@ -138,6 +142,9 @@ div
|
||||
mountOwned () {
|
||||
return isOwned('mount', this.item, this.userItems);
|
||||
},
|
||||
isSpecial () {
|
||||
return isSpecial(this.item);
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
|
||||
@@ -569,10 +569,8 @@ export default {
|
||||
break;
|
||||
case 'STREAK_ACHIEVEMENT':
|
||||
this.text(`${this.$t('streaks')}: ${this.user.achievements.streak}`, () => {
|
||||
if (!this.user.preferences.suppressModals.streak) {
|
||||
this.$root.$emit('bv::show::modal', 'streak');
|
||||
}
|
||||
});
|
||||
this.$root.$emit('bv::show::modal', 'streak');
|
||||
}, this.user.preferences.suppressModals.streak);
|
||||
this.playSound('Achievement_Unlocked');
|
||||
break;
|
||||
case 'ULTIMATE_GEAR_ACHIEVEMENT':
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
<template lang="pug">
|
||||
.row
|
||||
.col
|
||||
h1.page-header Page
|
||||
p {{ $route.path }}
|
||||
</template>
|
||||
@@ -33,8 +33,11 @@
|
||||
import * as Analytics from 'client/libs/analytics';
|
||||
import axios from 'axios';
|
||||
import { mapState } from 'client/libs/store';
|
||||
import { CONSTANTS, setLocalSetting } from 'client/libs/userlocalManager';
|
||||
import pick from 'lodash/pick';
|
||||
|
||||
const AMAZON_PAYMENTS = process.env.AMAZON_PAYMENTS; // eslint-disable-line
|
||||
const habiticaUrl = `${location.protocol}//${location.host}`;
|
||||
|
||||
export default {
|
||||
data () {
|
||||
@@ -54,6 +57,8 @@ export default {
|
||||
OffAmazonPayments: {},
|
||||
isAmazonSetup: false,
|
||||
amazonButtonEnabled: false,
|
||||
groupToCreate: null, // creating new group
|
||||
group: null, // upgrading existing group
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -186,6 +191,45 @@ export default {
|
||||
|
||||
new this.OffAmazonPayments.Widgets.Wallet(walletParams).bind('AmazonPayWallet');
|
||||
},
|
||||
storePaymentStatusAndReload (url) {
|
||||
let paymentType;
|
||||
|
||||
if (this.amazonPayments.type === 'single' && !this.amazonPayments.gift) paymentType = 'gems';
|
||||
if (this.amazonPayments.type === 'subscription') paymentType = 'subscription';
|
||||
if (this.amazonPayments.groupId || this.amazonPayments.groupToCreate) paymentType = 'groupPlan';
|
||||
if (this.amazonPayments.type === 'single' && this.amazonPayments.gift && this.amazonPayments.giftReceiver) {
|
||||
paymentType = this.amazonPayments.gift.type === 'gems' ? 'gift-gems' : 'gift-subscription';
|
||||
}
|
||||
|
||||
const appState = {
|
||||
paymentMethod: 'amazon',
|
||||
paymentCompleted: true,
|
||||
paymentType,
|
||||
};
|
||||
if (paymentType === 'subscription') {
|
||||
appState.subscriptionKey = this.amazonPayments.subscription;
|
||||
} else if (paymentType === 'groupPlan') {
|
||||
appState.subscriptionKey = this.amazonPayments.subscription;
|
||||
|
||||
if (this.amazonPayments.groupToCreate) {
|
||||
appState.newGroup = true;
|
||||
appState.group = pick(this.amazonPayments.groupToCreate, ['_id', 'memberCount', 'name']);
|
||||
} else {
|
||||
appState.newGroup = false;
|
||||
appState.group = pick(this.amazonPayments.group, ['_id', 'memberCount', 'name']);
|
||||
}
|
||||
} else if (paymentType.indexOf('gift-') === 0) {
|
||||
appState.gift = this.amazonPayments.gift;
|
||||
appState.giftReceiver = this.amazonPayments.giftReceiver;
|
||||
}
|
||||
|
||||
setLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE, JSON.stringify(appState));
|
||||
if (url) {
|
||||
window.location.assign(url);
|
||||
} else {
|
||||
window.location.reload(true);
|
||||
}
|
||||
},
|
||||
async amazonCheckOut () {
|
||||
this.amazonButtonEnabled = false;
|
||||
|
||||
@@ -201,12 +245,11 @@ export default {
|
||||
});
|
||||
|
||||
this.$set(this, 'amazonButtonEnabled', true);
|
||||
this.reset();
|
||||
// @TODO: What are we syncing?
|
||||
window.location.reload(true);
|
||||
this.storePaymentStatusAndReload();
|
||||
} catch (e) {
|
||||
console.error(e); // eslint-disable-line no-console
|
||||
this.$set(this, 'amazonButtonEnabled', true);
|
||||
this.amazonPaymentsreset();
|
||||
this.reset();
|
||||
}
|
||||
} else if (this.amazonPayments.type === 'subscription') {
|
||||
let url = '/amazon/subscribe';
|
||||
@@ -231,8 +274,6 @@ export default {
|
||||
if (newGroup && newGroup._id) {
|
||||
// Handle new user signup
|
||||
if (!this.$store.state.isUserLoggedIn) {
|
||||
const habiticaUrl = `${location.protocol}//${location.host}`;
|
||||
|
||||
Analytics.track({
|
||||
hitType: 'event',
|
||||
eventCategory: 'group-plans-static',
|
||||
@@ -240,23 +281,21 @@ export default {
|
||||
eventLabel: 'paid-with-amazon',
|
||||
});
|
||||
|
||||
location.href = `${habiticaUrl}/group-plans/${newGroup._id}/task-information?showGroupOverview=true`;
|
||||
this.storePaymentStatusAndReload(`${habiticaUrl}/group-plans/${newGroup._id}/task-information?showGroupOverview=true`);
|
||||
return;
|
||||
}
|
||||
|
||||
// @TODO: Just append? or $emit?
|
||||
this.$router.push(`/group-plans/${newGroup._id}/task-information`);
|
||||
this.user.guilds.push(newGroup._id);
|
||||
this.storePaymentStatusAndReload(`${habiticaUrl}/group-plans/${newGroup._id}/task-information`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.amazonPayments.groupId) {
|
||||
this.$router.push(`/group-plans/${this.amazonPayments.groupId}/task-information`);
|
||||
this.storePaymentStatusAndReload(`${habiticaUrl}/group-plans/${this.amazonPayments.groupId}/task-information`);
|
||||
return;
|
||||
}
|
||||
|
||||
window.location.reload(true);
|
||||
this.reset();
|
||||
this.storePaymentStatusAndReload();
|
||||
} catch (e) {
|
||||
this.$set(this, 'amazonButtonEnabled', true);
|
||||
// @TODO: do we need this? this.amazonPaymentsreset();
|
||||
@@ -276,13 +315,19 @@ export default {
|
||||
this.amazonPayments.modal = null;
|
||||
this.amazonPayments.type = null;
|
||||
this.amazonPayments.loggedIn = false;
|
||||
|
||||
// Gift
|
||||
this.amazonPayments.gift = null;
|
||||
this.amazonPayments.giftReceiver = null;
|
||||
|
||||
this.amazonPayments.billingAgreementId = null;
|
||||
this.amazonPayments.orderReferenceId = null;
|
||||
this.amazonPayments.paymentSelected = false;
|
||||
this.amazonPayments.recurringConsent = false;
|
||||
this.amazonPayments.subscription = null;
|
||||
this.amazonPayments.coupon = null;
|
||||
this.amazonPayments.groupToCreate = null;
|
||||
this.amazonPayments.group = null;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2,180 +2,166 @@
|
||||
mixin featureBullet (text)
|
||||
.row
|
||||
.col-md-2.offset-1
|
||||
.bubble.mx-auto
|
||||
.svg-icon.check(v-html='icons.check')
|
||||
.d-flex.bubble.justify-content-center.align-items-center
|
||||
.svg-icon.check.mx-auto(v-html='icons.check')
|
||||
.col-md-8.align-self-center
|
||||
p=text
|
||||
div(v-if='user')
|
||||
b-modal(:hide-footer='true', :hide-header='true', :id='"buy-gems"', size='lg')
|
||||
.container-fluid.purple-gradient
|
||||
.gemfall
|
||||
b-modal#buy-gems(:hide-footer='true', size='lg')
|
||||
.header-wrap(slot='modal-header')
|
||||
.image-gemfall
|
||||
.row
|
||||
h2.text-invert.mx-auto {{ $t('support') }}
|
||||
h2.header-invert.mx-auto {{ $t('support') }}
|
||||
.row
|
||||
.logo.svg-icon.mx-auto(v-html="icons.logo")
|
||||
.container-fluid
|
||||
.row
|
||||
.col-6.offset-3.nav
|
||||
.nav-item(@click='selectedPage = "subscribe"', :class="{active: selectedPage === 'subscribe'}") {{ $t('subscribe') }}
|
||||
.nav-item(@click='selectedPage = "gems"', :class="{active: selectedPage === 'gems'}") {{ $t('buyGems') }}
|
||||
div(v-show='selectedPage === "gems"')
|
||||
div(v-if='hasSubscription')
|
||||
.row.text-center
|
||||
h2.mx-auto.text-leadin {{ $t('subscriptionAlreadySubscribedLeadIn') }}
|
||||
.row.text-center
|
||||
.col-6.offset-3
|
||||
p {{ $t("gemsPurchaseNote") }}
|
||||
.d-flex.nav.justify-content-center
|
||||
.nav-item.text-center(@click='selectedPage = "subscribe"', :class="{active: selectedPage === 'subscribe'}") {{ $t('subscribe') }}
|
||||
.nav-item.text-center(@click='selectedPage = "gems"', :class="{active: selectedPage === 'gems'}") {{ $t('buyGems') }}
|
||||
div(v-show='selectedPage === "gems"')
|
||||
div(v-if='hasSubscription')
|
||||
.row.text-center
|
||||
h2.mx-auto.text-leadin {{ $t('gemBenefitLeadin') }}
|
||||
h2.mx-auto.text-leadin {{ $t('subscriptionAlreadySubscribedLeadIn') }}
|
||||
.row.text-center
|
||||
.col-6.offset-3
|
||||
p {{ $t("gemsPurchaseNote") }}
|
||||
.row.text-center
|
||||
h2.mx-auto.text-leadin {{ $t('gemBenefitLeadin') }}
|
||||
.row
|
||||
.col
|
||||
+featureBullet("{{ $t('gemBenefit1') }}")
|
||||
+featureBullet("{{ $t('gemBenefit2') }}")
|
||||
.col
|
||||
+featureBullet("{{ $t('gemBenefit3') }}")
|
||||
+featureBullet("{{ $t('gemBenefit4') }}")
|
||||
.card-deck.gem-deck
|
||||
.card.text-center.col-3(:class="{active: gemAmount === 20 }")
|
||||
.card-img-top
|
||||
.mx-auto(v-html='icons.twentyOneGems', style='"height: 55px; width: 47.5px; margin-top: 1.85em;"')
|
||||
.card-body
|
||||
.gem-count 20
|
||||
.gem-text {{ $t('gems') }}
|
||||
.divider
|
||||
button.btn.btn-primary(@click='gemAmount === 20 ? gemAmount = 0 : gemAmount = 20') {{gemAmount === 20 ? $t('selected') : '$5.00'}}
|
||||
.row.text-center
|
||||
h2.mx-auto.text-payment {{ $t('choosePaymentMethod') }}
|
||||
.card-deck
|
||||
.card.text-center.payment-method(@click='showStripe({})')
|
||||
.card-body
|
||||
.mx-auto(v-html='icons.creditCard', style='"height: 56px; width: 159px; margin-top: 1em;"')
|
||||
.card.text-center.payment-method
|
||||
a.card-body.paypal(@click="openPaypal(paypalCheckoutLink, 'gems')")
|
||||
img(src='~assets/images/paypal.png')
|
||||
.card.text-center.payment-method(@click="amazonPaymentsInit({type: 'single'})")
|
||||
.card-body.amazon
|
||||
img(src='~assets/images/amazon-payments.png')
|
||||
.row.text-center
|
||||
.svg-icon.mx-auto(v-html='icons.heart', style='"height: 24px; width: 24px;"')
|
||||
.row.text-center.text-outtro
|
||||
.col-6.offset-3 {{ $t('buyGemsSupportsDevs') }}
|
||||
|
||||
div(v-show='selectedPage === "subscribe"')
|
||||
div(v-if='hasSubscription')
|
||||
.row.text-center
|
||||
h2.mx-auto.text-leadin {{ $t('subscriptionAlreadySubscribedLeadIn') }}
|
||||
.row.text-center
|
||||
.col-10.offset-1
|
||||
p(v-html='$t("subscriptionAlreadySubscribed1")')
|
||||
div(v-if='!hasSubscription')
|
||||
.row.text-center
|
||||
h2.mx-auto.text-leadin {{ $t('subscriptionBenefitLeadin') }}
|
||||
.row
|
||||
.col
|
||||
+featureBullet("{{ $t('gemBenefit1') }}")
|
||||
+featureBullet("{{ $t('gemBenefit2') }}")
|
||||
+featureBullet("{{ $t('subscriptionBenefit1') }}")
|
||||
+featureBullet("{{ $t('subscriptionBenefit2') }}")
|
||||
+featureBullet("{{ $t('subscriptionBenefit3') }}")
|
||||
.col
|
||||
+featureBullet("{{ $t('gemBenefit3') }}")
|
||||
+featureBullet("{{ $t('gemBenefit4') }}")
|
||||
.card-deck.gem-deck
|
||||
//.card.text-center(:class="{active: gemAmount === 4}")
|
||||
.card-img-top
|
||||
.mx-auto(v-html='icons.fourGems', style='"height: 53px; width: 49.5px; margin-top: 2em;"')
|
||||
.card-body
|
||||
.gem-count 4
|
||||
.gem-text {{ $t('gems') }}
|
||||
.divider
|
||||
button.btn.btn-primary(@click='gemAmount = 4') {{gemAmount === 4 ? $t('selected') : '$1.00'}}
|
||||
.card.text-center.col-3(:class="{active: gemAmount === 20 }")
|
||||
.card-img-top
|
||||
.mx-auto(v-html='icons.twentyOneGems', style='"height: 55px; width: 47.5px; margin-top: 1.85em;"')
|
||||
.card-body
|
||||
.gem-count 20
|
||||
.gem-text {{ $t('gems') }}
|
||||
.divider
|
||||
button.btn.btn-primary(@click='gemAmount === 20 ? gemAmount = 0 : gemAmount = 20') {{gemAmount === 20 ? $t('selected') : '$5.00'}}
|
||||
//.card.text-center(:class="{active: gemAmount === 42}")
|
||||
.card-img-top
|
||||
.mx-auto(v-html='icons.fortyTwoGems', style='"height: 49.5px; width: 51px; margin-top: 1.9em;"')
|
||||
.card-body
|
||||
.gem-count 42
|
||||
.gem-text {{ $t('gems') }}
|
||||
.divider
|
||||
button.btn.btn-primary(@click='gemAmount = 42') {{gemAmount === 42 ? $t('selected') : '$10.00'}}
|
||||
//.card.text-center(:class="{active: gemAmount === 84}")
|
||||
.card-img-top
|
||||
.mx-auto(v-html='icons.eightyFourGems', style='"height: 65px; width: 67px; margin-top: 1em;"')
|
||||
.card-body
|
||||
.gem-count 84
|
||||
.gem-text {{ $t('gems') }}
|
||||
.divider
|
||||
button.btn.btn-primary(@click='gemAmount = 84') {{gemAmount === 84 ? $t('selected') : '$20.00'}}
|
||||
.row.text-center
|
||||
h2.mx-auto.text-payment {{ $t('choosePaymentMethod') }}
|
||||
+featureBullet("{{ $t('subscriptionBenefit4') }}")
|
||||
+featureBullet("{{ $t('subscriptionBenefit5') }}")
|
||||
+featureBullet("{{ $t('subscriptionBenefit6') }}")
|
||||
.card-deck
|
||||
.card.text-center.payment-method(@click='showStripe({})')
|
||||
.card.text-center(:class='{active: subscriptionPlan === "basic_earned"}')
|
||||
.card-body
|
||||
.subscription-price
|
||||
span.superscript $
|
||||
span 5
|
||||
span.superscript.muted .00
|
||||
.small(v-once) {{ $t('everyMonth') }}
|
||||
.divider
|
||||
p.benefits(v-markdown='$t("earnGemsMonthly", {cap:25})')
|
||||
.spacer
|
||||
button.btn.btn-primary(@click='subscriptionPlan = "basic_earned"') {{ subscriptionPlan === "basic_earned" ? $t('selected') : $t('select') }}
|
||||
.card.text-center(:class='{active: subscriptionPlan === "basic_3mo"}')
|
||||
.card-body
|
||||
.subscription-price
|
||||
span.superscript $
|
||||
span 15
|
||||
span.superscript.muted .00
|
||||
.small(v-once) {{ $t('everyXMonths', {interval: 3}) }}
|
||||
.divider
|
||||
p.benefits(v-markdown='$t("earnGemsMonthly", {cap:30})')
|
||||
p.benefits(v-markdown='$t("receiveMysticHourglass")')
|
||||
button.btn.btn-primary(@click='subscriptionPlan = "basic_3mo"') {{ subscriptionPlan === "basic_3mo" ? $t('selected') : $t('select') }}
|
||||
.card.text-center(:class='{active: subscriptionPlan === "basic_6mo"}')
|
||||
.card-body
|
||||
.subscription-price
|
||||
span.superscript $
|
||||
span 30
|
||||
span.superscript.muted .00
|
||||
.small(v-once) {{ $t('everyXMonths', {interval: 6}) }}
|
||||
.divider
|
||||
p.benefits(v-markdown='$t("earnGemsMonthly", {cap:35})')
|
||||
p.benefits(v-markdown='$t("receiveMysticHourglasses", {amount:2})')
|
||||
button.btn.btn-primary(@click='subscriptionPlan = "basic_6mo"') {{ subscriptionPlan === "basic_6mo" ? $t('selected') : $t('select') }}
|
||||
.card.text-center(:class='{active: subscriptionPlan === "basic_12mo"}')
|
||||
.card-body
|
||||
.subscription-price
|
||||
span.superscript $
|
||||
span 48
|
||||
span.superscript.muted .00
|
||||
.small(v-once) {{ $t('everyYear') }}
|
||||
.divider
|
||||
p.benefits(v-markdown='$t("earnGemsMonthly", {cap:45})')
|
||||
p.benefits(v-markdown='$t("receiveMysticHourglasses", {amount:4})')
|
||||
button.btn.btn-primary(@click='subscriptionPlan = "basic_12mo"') {{ subscriptionPlan === "basic_12mo" ? $t('selected') : $t('select') }}
|
||||
.row.text-center(v-if='subscriptionPlan')
|
||||
h2.mx-auto.text-payment(v-once) {{ $t('choosePaymentMethod') }}
|
||||
.row.text-center
|
||||
a.mx-auto(v-once) {{ $t('haveCouponCode') }}
|
||||
.card-deck(v-if='subscriptionPlan')
|
||||
.card.text-center.payment-method
|
||||
.card-body(@click='showStripe({subscription: subscriptionPlan})')
|
||||
.mx-auto(v-html='icons.creditCard', style='"height: 56px; width: 159px; margin-top: 1em;"')
|
||||
.card.text-center.payment-method
|
||||
a.card-body.paypal(:href='paypalCheckoutLink', target='_blank')
|
||||
a.card-body.paypal(@click="openPaypal(paypalSubscriptionLink, 'subscription')")
|
||||
img(src='~assets/images/paypal.png')
|
||||
.card.text-center.payment-method(@click="amazonPaymentsInit({type: 'single'})")
|
||||
.card-body.amazon
|
||||
.card.text-center.payment-method
|
||||
.card-body.amazon(@click="amazonPaymentsInit({type: 'subscription', subscription: subscriptionPlan})")
|
||||
img(src='~assets/images/amazon-payments.png')
|
||||
.row.text-center
|
||||
.svg-icon.mx-auto(v-html='icons.heart', style='"height: 24px; width: 24px;"')
|
||||
.row.text-center.text-outtro
|
||||
.col-6.offset-3 {{ $t('buyGemsSupportsDevs') }}
|
||||
|
||||
div(v-show='selectedPage === "subscribe"')
|
||||
div(v-if='hasSubscription')
|
||||
.row.text-center
|
||||
h2.mx-auto.text-leadin {{ $t('subscriptionAlreadySubscribedLeadIn') }}
|
||||
.row.text-center
|
||||
.col
|
||||
p(v-html='$t("subscriptionAlreadySubscribed1")')
|
||||
div(v-if='!hasSubscription')
|
||||
.row.text-center
|
||||
h2.mx-auto.text-leadin {{ $t('subscriptionBenefitLeadin') }}
|
||||
.row
|
||||
.col
|
||||
+featureBullet("{{ $t('subscriptionBenefit1') }}")
|
||||
+featureBullet("{{ $t('subscriptionBenefit2') }}")
|
||||
+featureBullet("{{ $t('subscriptionBenefit3') }}")
|
||||
.col
|
||||
+featureBullet("{{ $t('subscriptionBenefit4') }}")
|
||||
+featureBullet("{{ $t('subscriptionBenefit5') }}")
|
||||
+featureBullet("{{ $t('subscriptionBenefit6') }}")
|
||||
.card-deck
|
||||
.card.text-center(:class='{active: subscriptionPlan === "basic_earned"}')
|
||||
.card-body
|
||||
.subscription-price
|
||||
span.superscript $
|
||||
span 5
|
||||
span.superscript.muted .00
|
||||
.small {{ $t('everyMonth') }}
|
||||
.divider
|
||||
p.benefits(v-markdown='$t("earnGemsMonthly", {cap:25})')
|
||||
.spacer
|
||||
button.btn.btn-primary(@click='subscriptionPlan = "basic_earned"') {{ subscriptionPlan === "basic_earned" ? $t('selected') : $t('select') }}
|
||||
.card.text-center(:class='{active: subscriptionPlan === "basic_3mo"}')
|
||||
.card-body
|
||||
.subscription-price
|
||||
span.superscript $
|
||||
span 15
|
||||
span.superscript.muted .00
|
||||
.small {{ $t('everyXMonths', {interval: 3}) }}
|
||||
.divider
|
||||
p.benefits(v-markdown='$t("earnGemsMonthly", {cap:30})')
|
||||
p.benefits(v-markdown='$t("receiveMysticHourglass")')
|
||||
button.btn.btn-primary(@click='subscriptionPlan = "basic_3mo"') {{ subscriptionPlan === "basic_3mo" ? $t('selected') : $t('select') }}
|
||||
.card.text-center(:class='{active: subscriptionPlan === "basic_6mo"}')
|
||||
.card-body
|
||||
.subscription-price
|
||||
span.superscript $
|
||||
span 30
|
||||
span.superscript.muted .00
|
||||
.small {{ $t('everyXMonths', {interval: 6}) }}
|
||||
.divider
|
||||
p.benefits(v-markdown='$t("earnGemsMonthly", {cap:35})')
|
||||
p.benefits(v-markdown='$t("receiveMysticHourglasses", {amount:2})')
|
||||
button.btn.btn-primary(@click='subscriptionPlan = "basic_6mo"') {{ subscriptionPlan === "basic_6mo" ? $t('selected') : $t('select') }}
|
||||
.card.text-center(:class='{active: subscriptionPlan === "basic_12mo"}')
|
||||
.card-body
|
||||
.subscription-price
|
||||
span.superscript $
|
||||
span 48
|
||||
span.superscript.muted .00
|
||||
.small {{ $t('everyYear') }}
|
||||
.divider
|
||||
p.benefits(v-markdown='$t("earnGemsMonthly", {cap:45})')
|
||||
p.benefits(v-markdown='$t("receiveMysticHourglasses", {amount:4})')
|
||||
button.btn.btn-primary(@click='subscriptionPlan = "basic_12mo"') {{ subscriptionPlan === "basic_12mo" ? $t('selected') : $t('select') }}
|
||||
.row.text-center(v-if='subscriptionPlan')
|
||||
h2.mx-auto.text-payment {{ $t('choosePaymentMethod') }}
|
||||
.row.text-center
|
||||
a.mx-auto {{ $t('haveCouponCode') }}
|
||||
.card-deck(v-if='subscriptionPlan')
|
||||
.card.text-center.payment-method
|
||||
.card-body(@click='showStripe({subscription: subscriptionPlan})')
|
||||
.mx-auto(v-html='icons.creditCard', style='"height: 56px; width: 159px; margin-top: 1em;"')
|
||||
.card.text-center.payment-method
|
||||
a.card-body.paypal(:href='paypalSubscriptionLink', target='_blank')
|
||||
img(src='~assets/images/paypal.png')
|
||||
.card.text-center.payment-method
|
||||
.card-body.amazon(@click="amazonPaymentsInit({type: 'subscription', subscription: subscriptionPlan})")
|
||||
img(src='~assets/images/amazon-payments.png')
|
||||
.row.text-center
|
||||
.svg-icon.mx-auto(v-html='icons.heart', style='"height: 24px; width: 24px;"')
|
||||
.row.text-center.text-outtro
|
||||
.col-6.offset-3 {{ $t('subscribeSupportsDevs') }}
|
||||
.col-6.offset-3 {{ $t('subscribeSupportsDevs') }}
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
#buy-gems__BV_body_ {
|
||||
#buy-gems .modal-body {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#buy-gems .modal-content {
|
||||
border-radius: 8px;
|
||||
width: 824px;
|
||||
}
|
||||
|
||||
#buy-gems .modal-header {
|
||||
padding: 0;
|
||||
border-bottom: 0px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '~client/assets/scss/colors.scss';
|
||||
|
||||
a.mx-auto {
|
||||
color: #2995cd;
|
||||
}
|
||||
@@ -242,11 +228,21 @@
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.gemfall {
|
||||
.image-gemfall {
|
||||
background: url(~assets/images/gemfall.png) center repeat-y;
|
||||
height: 14em;
|
||||
}
|
||||
|
||||
.header-wrap {
|
||||
background-image: linear-gradient(74deg, #4f2a93, #6133b4);
|
||||
height: 14em;
|
||||
width: 100%;
|
||||
color: #4e4a57;
|
||||
padding: 0;
|
||||
border-top-left-radius: 7px;
|
||||
border-top-right-radius: 7px;
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 256px;
|
||||
height: 56px;
|
||||
@@ -258,19 +254,21 @@
|
||||
|
||||
.nav {
|
||||
font-weight: bold;
|
||||
height: 40px;
|
||||
background-color: $gray-600;
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
margin: 0 auto;
|
||||
padding: 1.5em;
|
||||
margin: 0rem;
|
||||
padding: 1rem;
|
||||
width: 7.5rem;
|
||||
}
|
||||
|
||||
.nav-item:hover, .nav-item.active {
|
||||
color: #4f2a93;
|
||||
border-bottom: 2px solid #4f2a93;
|
||||
border-bottom: 4px solid $purple-300;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@@ -286,11 +284,6 @@
|
||||
padding-top: 1.3em;
|
||||
}
|
||||
|
||||
.purple-gradient {
|
||||
background-image: linear-gradient(74deg, #4f2a93, #6133b4);
|
||||
height: 14em;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
height: 4em;
|
||||
}
|
||||
@@ -309,10 +302,11 @@
|
||||
|
||||
.svg-icon.check {
|
||||
color: #bda8ff;
|
||||
width: 1rem;
|
||||
}
|
||||
|
||||
.text-invert {
|
||||
margin: 1.6em;
|
||||
.header-invert {
|
||||
margin: 3rem auto 1.5rem;
|
||||
color: #FFFFFF;
|
||||
font-family: Roboto;
|
||||
font-weight: normal;
|
||||
@@ -320,9 +314,9 @@
|
||||
}
|
||||
|
||||
.text-leadin {
|
||||
margin: 1.6em;
|
||||
font-weight: normal;
|
||||
color: #4f2a93;
|
||||
margin: 1rem;
|
||||
font-weight: bold;
|
||||
color: $purple-200;
|
||||
}
|
||||
|
||||
.text-outtro {
|
||||
|
||||
@@ -31,11 +31,13 @@ b-modal#send-gems(:title="title", :hide-footer="true", size='lg', @hide='onHide(
|
||||
)
|
||||
h3.panel-heading {{ $t('subscription') }}
|
||||
.panel-body
|
||||
.form-group
|
||||
.radio(v-for='block in subscriptionBlocks', v-if="block.target !== 'group' && block.canSubscribe === true")
|
||||
label
|
||||
input(type="radio", name="subRadio", :value="block.key", v-model='gift.subscription.key')
|
||||
| {{ $t('sendGiftSubscription', {price: block.price, months: block.months}) }}
|
||||
.row
|
||||
.col-md-4
|
||||
.form-group
|
||||
.radio(v-for='block in subscriptionBlocks', v-if="block.target !== 'group' && block.canSubscribe === true")
|
||||
label
|
||||
input(type="radio", name="subRadio", :value="block.key", v-model='gift.subscription.key')
|
||||
| {{ $t('sendGiftSubscription', {price: block.price, months: block.months}) }}
|
||||
|
||||
textarea.form-control(rows='3', v-model='gift.message', :placeholder="$t('sendGiftMessagePlaceholder')")
|
||||
//include ../formatting-help
|
||||
@@ -47,9 +49,9 @@ b-modal#send-gems(:title="title", :hide-footer="true", size='lg', @hide='onHide(
|
||||
:disabled="sendingInProgress"
|
||||
) {{ $t("send") }}
|
||||
template(v-else)
|
||||
button.btn.btn-primary(@click='showStripe({gift, uuid: userReceivingGems._id})') {{ $t('card') }}
|
||||
button.btn.btn-warning(@click='openPaypalGift({gift: gift, giftedTo: userReceivingGems._id})') PayPal
|
||||
button.btn.btn-success(@click="amazonPaymentsInit({type: 'single', gift, giftedTo: userReceivingGems._id})") Amazon Payments
|
||||
button.btn.btn-primary(@click='showStripe({gift, uuid: userReceivingGems._id, receiverName})') {{ $t('card') }}
|
||||
button.btn.btn-warning(@click='openPaypalGift({gift: gift, giftedTo: userReceivingGems._id, receiverName})') PayPal
|
||||
button.btn.btn-success(@click="amazonPaymentsInit({type: 'single', gift, giftedTo: userReceivingGems._id, receiverName})") Amazon Payments
|
||||
button.btn.btn-secondary(@click='close()') {{$t('cancel')}}
|
||||
</template>
|
||||
|
||||
@@ -131,6 +133,13 @@ export default {
|
||||
if (!this.userReceivingGems) return '';
|
||||
return this.$t('sendGiftHeading', {name: this.userReceivingGems.profile.name});
|
||||
},
|
||||
receiverName () {
|
||||
if (this.userReceivingGems.auth && this.userReceivingGems.auth.local && this.userReceivingGems.auth.local.username) {
|
||||
return this.userReceivingGems.auth.local.username;
|
||||
} else {
|
||||
return this.userReceivingGems.profile.name;
|
||||
}
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
// @TODO move to payments mixin or action (problem is that we need notifications)
|
||||
@@ -141,11 +150,23 @@ export default {
|
||||
toUserId: this.userReceivingGems._id,
|
||||
gemAmount: this.gift.gems.amount,
|
||||
});
|
||||
this.text(this.$t('sentGems'));
|
||||
this.close();
|
||||
setTimeout(() => { // wait for the send gem modal to be closed
|
||||
this.$root.$emit('habitica:payment-success', {
|
||||
paymentMethod: 'balance',
|
||||
paymentCompleted: true,
|
||||
paymentType: 'gift-gems-balance',
|
||||
gift: {
|
||||
gems: {
|
||||
amount: this.gift.gems.amount,
|
||||
},
|
||||
},
|
||||
giftReceiver: this.receiverName,
|
||||
});
|
||||
}, 500);
|
||||
},
|
||||
onHide () {
|
||||
// TODO this breaks amazon purchases because when the amazon modal
|
||||
// @TODO this breaks amazon purchases because when the amazon modal
|
||||
// is opened this one is closed and the amount reset
|
||||
// this.gift.gems.amount = 0;
|
||||
this.gift.message = '';
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
<template lang="pug">
|
||||
b-modal#payments-success-modal(
|
||||
:title="$t('accountSuspendedTitle')",
|
||||
size='sm',
|
||||
:hideFooter="isFromBalance",
|
||||
:modalClass="isFromBalance ? ['modal-hidden-footer'] : []"
|
||||
)
|
||||
div(slot="modal-header")
|
||||
.check-container.d-flex.align-items-center.justify-content-center
|
||||
.svg-icon.check(v-html="icons.check", v-once)
|
||||
h2 {{ $t(isFromBalance ? 'success' : 'paymentSuccessful') }}
|
||||
div(slot="modal-footer")
|
||||
.small-text(v-once) {{ $t('giftSubscriptionText4') }}
|
||||
.row
|
||||
.col-12.modal-body-col
|
||||
template(v-if="paymentData.paymentType === 'gems'")
|
||||
strong(v-once) {{ $t('paymentYouReceived') }}
|
||||
.details-block.gems
|
||||
.svg-icon(v-html="icons.gem", v-once)
|
||||
span 20
|
||||
template(v-if="paymentData.paymentType === 'gift-gems' || paymentData.paymentType === 'gift-gems-balance'")
|
||||
span(v-html="$t('paymentYouSentGems', {name: paymentData.giftReceiver})")
|
||||
.details-block.gems
|
||||
.svg-icon(v-html="icons.gem", v-once)
|
||||
span {{ paymentData.gift.gems.amount }}
|
||||
template(v-if="paymentData.paymentType === 'gift-subscription'")
|
||||
span(v-html="$t('paymentYouSentSubscription', {name: paymentData.giftReceiver, months: paymentData.subscription.months})")
|
||||
template(v-if="paymentData.paymentType === 'subscription'")
|
||||
strong(v-once) {{ $t('nowSubscribed') }}
|
||||
.details-block
|
||||
span(v-html="$t('paymentSubBilling', {amount: paymentData.subscription.price, months: paymentData.subscription.months})")
|
||||
template(v-if="paymentData.paymentType === 'groupPlan'")
|
||||
span(v-html="$t(paymentData.newGroup ? 'groupPlanCreated' : 'groupPlanUpgraded', {groupName: paymentData.group.name})")
|
||||
.details-block
|
||||
span(v-html="$t('paymentSubBilling', {amount: groupPlanCost, months: paymentData.subscription.months})")
|
||||
button.btn.btn-primary(@click='close()', v-once) {{$t('onwards')}}
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
@import '~client/assets/scss/colors.scss';
|
||||
|
||||
#payments-success-modal .modal-content {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
#payments-success-modal.modal-hidden-footer .modal-body {
|
||||
border-bottom-right-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
}
|
||||
|
||||
#payments-success-modal .modal-header {
|
||||
justify-content: center;
|
||||
padding-top: 24px;
|
||||
padding-bottom: 0px;
|
||||
background: $green-10;
|
||||
border-top-right-radius: 8px;
|
||||
border-top-left-radius: 8px;
|
||||
border-bottom: none;
|
||||
|
||||
h2 {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.check-container {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
border-radius: 50%;
|
||||
background: #1CA372;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.check {
|
||||
width: 35.1px;
|
||||
height: 28px;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
|
||||
#payments-success-modal .modal-body {
|
||||
padding-top: 16px;
|
||||
padding-bottom: 24px;
|
||||
background: white;
|
||||
|
||||
.modal-body-col {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
|
||||
.btn.btn-primary {
|
||||
margin-top: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
.details-block {
|
||||
background: $gray-700;
|
||||
border-radius: 4px;
|
||||
padding: 8px 24px;
|
||||
margin-top: 16px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
text-align: center;
|
||||
|
||||
&.gems {
|
||||
padding: 12px 16px 12px 20px;
|
||||
color: $green-10;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
line-height: 1.33;
|
||||
|
||||
.svg-icon {
|
||||
margin-right: 8px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#payments-success-modal .modal-footer {
|
||||
background: $gray-700;
|
||||
border-bottom-right-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
justify-content: center;
|
||||
border-top: none;
|
||||
|
||||
.small-text {
|
||||
font-style: normal;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import checkIcon from 'assets/svg/check.svg';
|
||||
import gemIcon from 'assets/svg/gem.svg';
|
||||
import subscriptionBlocks from '../../../common/script/content/subscriptionBlocks';
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
icons: Object.freeze({
|
||||
check: checkIcon,
|
||||
gem: gemIcon,
|
||||
}),
|
||||
paymentData: {},
|
||||
};
|
||||
},
|
||||
mounted () {
|
||||
this.$root.$on('habitica:payment-success', (data) => {
|
||||
if (['subscription', 'groupPlan', 'gift-subscription'].indexOf(data.paymentType) !== -1) {
|
||||
data.subscription = subscriptionBlocks[data.subscriptionKey || data.gift.subscription.key];
|
||||
}
|
||||
this.paymentData = data;
|
||||
this.$root.$emit('bv::show::modal', 'payments-success-modal');
|
||||
});
|
||||
},
|
||||
destroyed () {
|
||||
this.paymentData = {};
|
||||
this.$root.$off('habitica:payments-success');
|
||||
},
|
||||
computed: {
|
||||
groupPlanCost () {
|
||||
const sub = this.paymentData.subscription;
|
||||
const memberCount = this.paymentData.group.memberCount || 1;
|
||||
return sub.price + 3 * (memberCount - 1);
|
||||
},
|
||||
isFromBalance () {
|
||||
return this.paymentData.paymentType === 'gift-gems-balance';
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
close () {
|
||||
this.paymentData = {};
|
||||
this.$root.$emit('bv::hide::modal', 'payments-success-modal');
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -77,19 +77,19 @@
|
||||
.col-md-4
|
||||
button.purchase.btn.btn-primary(@click='showStripe({subscription:subscription.key, coupon:subscription.coupon})', :disabled='!subscription.key') {{ $t('card') }}
|
||||
.col-md-4
|
||||
a.purchase(:href='paypalPurchaseLink', :disabled='!subscription.key', target='_blank')
|
||||
a.purchase(@click="openPaypal(paypalPurchaseLink, 'subscription')", :disabled='!subscription.key')
|
||||
img(src='https://www.paypalobjects.com/webstatic/en_US/i/buttons/pp-acceptance-small.png', :alt="$t('paypal')")
|
||||
.col-md-4
|
||||
a.btn.btn-secondary.purchase(@click="payWithAmazon()")
|
||||
img(src='https://payments.amazon.com/gp/cba/button', :alt="$t('amazonPayments')")
|
||||
.row
|
||||
.col-6
|
||||
h2 {{ $t('giftSubscription') }}
|
||||
h2(v-once) {{ $t('giftSubscription') }}
|
||||
ol
|
||||
li {{ $t('giftSubscriptionText1') }}
|
||||
li {{ $t('giftSubscriptionText2') }}
|
||||
li {{ $t('giftSubscriptionText3') }}
|
||||
h4 {{ $t('giftSubscriptionText4') }}
|
||||
li(v-once) {{ $t('giftSubscriptionText1') }}
|
||||
li(v-once) {{ $t('giftSubscriptionText2') }}
|
||||
li(v-once) {{ $t('giftSubscriptionText3') }}
|
||||
h4(v-once) {{ $t('giftSubscriptionText4') }}
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
div(
|
||||
v-for="(groupSets, categoryGroup) in getGroupedCategories(categories)",
|
||||
)
|
||||
h3.classgroup(v-if='categoryGroup !== "spells"')
|
||||
h3.classgroup(v-if='categoryGroup !== "spells" && categoryGroup !== "quests"')
|
||||
span.svg-icon.inline(v-html="icons[categoryGroup]")
|
||||
span.name(:class="categoryGroup") {{ getClassName(categoryGroup) }}
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
p {{ $t('needTips') }}
|
||||
div(v-for='step in stepsNum')
|
||||
h3 {{ $t('step'+step) }}
|
||||
p(v-markdown="$t('webStep'+step+'Text')")
|
||||
p(v-markdown="$t('webStep'+step+'Text', stepVars[step])")
|
||||
hr
|
||||
p(v-markdown="$t('overviewQuestions')")
|
||||
p(v-markdown="$t('overviewQuestions', {faqUrl: '/static/faq/', helpGuildUrl: '/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a'})")
|
||||
</template>
|
||||
|
||||
<style lang='scss'>
|
||||
@@ -31,6 +31,15 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
stepsNum: ['1', '2', '3'],
|
||||
stepVars: {
|
||||
1: {},
|
||||
2: {},
|
||||
3: {
|
||||
partyUrl: '/party',
|
||||
equipUrl: '/inventory/equipment',
|
||||
shopUrl: '/shops/market',
|
||||
},
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -30,15 +30,29 @@
|
||||
a.d-block(v-if="tagsType.key !== 'groups' && !editingTags", @click="editTags(tagsType.key)") {{ $t('editTags2') }}
|
||||
.tags-list.container
|
||||
.row(:class="{'no-gutters': !editingTags}")
|
||||
template(v-if="editingTags && tagsType.key !== 'groups'")
|
||||
.col-6(v-for="(tag, tagIndex) in tagsSnap[tagsType.key]")
|
||||
.inline-edit-input-group.tag-edit-item.input-group
|
||||
input.tag-edit-input.inline-edit-input.form-control(type="text", v-model="tag.name")
|
||||
.input-group-append(@click="removeTag(tagIndex, tagsType.key)")
|
||||
.svg-icon.destroy-icon(v-html="icons.destroy")
|
||||
.col-6(v-if="tagsType.key === 'tags'")
|
||||
input.new-tag-item.edit-tag-item.inline-edit-input.form-control(type="text", :placeholder="$t('newTag')", @keydown.enter="addTag($event, tagsType.key)", v-model="newTag")
|
||||
template(v-else)
|
||||
template(v-if="editingTags && tagsType.key === 'tags'")
|
||||
draggable(
|
||||
v-if="tagsType.key === 'tags'",
|
||||
v-model="tagsSnap[tagsType.key]",
|
||||
class="row"
|
||||
)
|
||||
.col-6(v-for="(tag, tagIndex) in tagsSnap[tagsType.key]")
|
||||
.inline-edit-input-group.tag-edit-item.input-group
|
||||
.svg-icon.inline.drag(v-html="icons.drag")
|
||||
input.tag-edit-input.inline-edit-input.form-control(type="text", v-model="tag.name")
|
||||
.input-group-append(@click="removeTag(tagIndex, tagsType.key)")
|
||||
.svg-icon.destroy-icon(v-html="icons.destroy")
|
||||
|
||||
.col-6.dragSpace
|
||||
input.new-tag-item.edit-tag-item.inline-edit-input.form-control(type="text", :placeholder="$t('newTag')", @keydown.enter="addTag($event, tagsType.key)", v-model="newTag")
|
||||
template(v-if="editingTags && tagsType.key === 'challenges'")
|
||||
.col-6(v-for="(tag, tagIndex) in tagsSnap[tagsType.key]")
|
||||
.inline-edit-input-group.tag-edit-item.input-group
|
||||
input.tag-edit-input.inline-edit-input.form-control(type="text", v-model="tag.name")
|
||||
.input-group-append(@click="removeTag(tagIndex, tagsType.key)")
|
||||
.svg-icon.destroy-icon(v-html="icons.destroy")
|
||||
|
||||
template(v-if="!editingTags || tagsType.key === 'groups'")
|
||||
.col-6(v-for="(tag, tagIndex) in tagsType.tags")
|
||||
.custom-control.custom-checkbox
|
||||
input.custom-control-input(
|
||||
@@ -289,6 +303,23 @@
|
||||
}
|
||||
}
|
||||
|
||||
.drag {
|
||||
cursor: grab;
|
||||
margin: auto 0;
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
|
||||
color: #C3C0C7;
|
||||
|
||||
&:hover {
|
||||
color: #878190;
|
||||
}
|
||||
}
|
||||
|
||||
.dragSpace {
|
||||
padding-left: 32px;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 768px) {
|
||||
.filter-panel {
|
||||
max-width: none;
|
||||
@@ -310,6 +341,7 @@ import habitIcon from 'assets/svg/habit.svg';
|
||||
import dailyIcon from 'assets/svg/daily.svg';
|
||||
import todoIcon from 'assets/svg/todo.svg';
|
||||
import rewardIcon from 'assets/svg/reward.svg';
|
||||
import dragIcon from 'assets/svg/drag_indicator.svg';
|
||||
|
||||
import uuid from 'uuid';
|
||||
import Vue from 'vue';
|
||||
@@ -320,6 +352,7 @@ import taskDefaults from 'common/script/libs/taskDefaults';
|
||||
import brokenTaskModal from './brokenTaskModal';
|
||||
|
||||
import Item from 'client/components/inventory/item.vue';
|
||||
import draggable from 'vuedraggable';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@@ -328,6 +361,7 @@ export default {
|
||||
Item,
|
||||
spells,
|
||||
brokenTaskModal,
|
||||
draggable,
|
||||
},
|
||||
directives: {
|
||||
markdown,
|
||||
@@ -347,6 +381,7 @@ export default {
|
||||
daily: dailyIcon,
|
||||
todo: todoIcon,
|
||||
reward: rewardIcon,
|
||||
drag: dragIcon,
|
||||
}),
|
||||
selectedTags: [],
|
||||
temporarilySelectedTags: [],
|
||||
|
||||
@@ -33,7 +33,7 @@ div
|
||||
.col-12
|
||||
member-details(:member="user")
|
||||
.row
|
||||
.col-12.col-md-6.offset-md-3.text-center.nav
|
||||
.col-12.text-center.nav
|
||||
.nav-item(@click='selectPage("profile")', :class="{active: selectedPage === 'profile'}") {{ $t('profile') }}
|
||||
.nav-item(@click='selectPage("stats")', :class="{active: selectedPage === 'stats'}") {{ $t('stats') }}
|
||||
.nav-item(@click='selectPage("achievements")', :class="{active: selectedPage === 'achievements'}") {{ $t('achievements') }}
|
||||
@@ -228,12 +228,13 @@ div
|
||||
|
||||
.nav {
|
||||
font-weight: bold;
|
||||
height: 40px;
|
||||
min-height: 40px;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
margin: 0 1.2em;
|
||||
padding: 1em;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,10 @@ export function isAllowedToFeed (animal, userItems) {
|
||||
!isOwned('mount', animal, userItems);
|
||||
}
|
||||
|
||||
export function isSpecial (animal) {
|
||||
return specialPets.includes(animal.key);
|
||||
}
|
||||
|
||||
export function createAnimal (egg, potion, type, _content, userItems) {
|
||||
let animalKey = `${egg.key}-${potion.key}`;
|
||||
|
||||
@@ -50,6 +54,9 @@ export function createAnimal (egg, potion, type, _content, userItems) {
|
||||
isHatchable () {
|
||||
return isHatchable(this, userItems);
|
||||
},
|
||||
isSpecial () {
|
||||
return isSpecial(this);
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,9 @@ const CONSTANTS = {
|
||||
COSTUME_TAB: 'costume-tab',
|
||||
EQUIPMENT_TAB: 'equipment-tab',
|
||||
},
|
||||
savedAppStateValues: {
|
||||
SAVED_APP_STATE: 'saved-app-state',
|
||||
},
|
||||
};
|
||||
|
||||
function setLocalSetting (key, value) {
|
||||
@@ -24,8 +27,14 @@ function getLocalSetting (key) {
|
||||
return localStorage.getItem(key);
|
||||
}
|
||||
|
||||
function removeLocalSetting (key) {
|
||||
return localStorage.removeItem(key);
|
||||
}
|
||||
|
||||
|
||||
export {
|
||||
CONSTANTS,
|
||||
getLocalSetting,
|
||||
setLocalSetting,
|
||||
removeLocalSetting,
|
||||
};
|
||||
|
||||
@@ -4,7 +4,7 @@ import {
|
||||
setup as setupAnalytics,
|
||||
} from 'client/libs/analytics';
|
||||
import { setUpLogging } from 'client/libs/logging';
|
||||
import router from './router';
|
||||
import router from './router/index';
|
||||
import getStore from './store';
|
||||
import StoreModule from './libs/store';
|
||||
import './filters/registerGlobals';
|
||||
|
||||
@@ -1,17 +1,20 @@
|
||||
import axios from 'axios';
|
||||
|
||||
const STRIPE_PUB_KEY = process.env.STRIPE_PUB_KEY; // eslint-disable-line
|
||||
const STRIPE_PUB_KEY = process.env.STRIPE_PUB_KEY; // eslint-disable-line no-process-env
|
||||
import subscriptionBlocks from '../../common/script/content/subscriptionBlocks';
|
||||
import { mapState } from 'client/libs/store';
|
||||
import encodeParams from 'client/libs/encodeParams';
|
||||
import notificationsMixin from 'client/mixins/notifications';
|
||||
import * as Analytics from 'client/libs/analytics';
|
||||
import { CONSTANTS, setLocalSetting } from 'client/libs/userlocalManager';
|
||||
import pick from 'lodash/pick';
|
||||
|
||||
const habiticaUrl = `${location.protocol}//${location.host}`;
|
||||
|
||||
export default {
|
||||
mixins: [notificationsMixin],
|
||||
computed: {
|
||||
...mapState(['credentials']),
|
||||
// @TODO refactor into one single computed property
|
||||
paypalCheckoutLink () {
|
||||
return '/paypal/checkout';
|
||||
},
|
||||
@@ -41,7 +44,37 @@ export default {
|
||||
let gift = this.encodeGift(data.giftedTo, data.gift);
|
||||
const url = `/paypal/checkout?gift=${gift}`;
|
||||
|
||||
this.openPaypal(url, `gift-${data.gift.type === 'gems' ? 'gems' : 'subscription'}`, data);
|
||||
},
|
||||
openPaypal (url, type, giftData) {
|
||||
const appState = {
|
||||
paymentMethod: 'paypal',
|
||||
paymentCompleted: false,
|
||||
paymentType: type,
|
||||
};
|
||||
|
||||
if (type === 'subscription') {
|
||||
appState.subscriptionKey = this.subscriptionPlan || this.subscription.key;
|
||||
}
|
||||
|
||||
if (type.indexOf('gift-') === 0) {
|
||||
appState.gift = giftData.gift;
|
||||
appState.giftReceiver = giftData.receiverName;
|
||||
}
|
||||
|
||||
setLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE, JSON.stringify(appState));
|
||||
window.open(url, '_blank');
|
||||
|
||||
function localStorageChangeHandled (e) {
|
||||
if (e.key === 'saved-app-state') {
|
||||
window.removeEventListener('storage', localStorageChangeHandled);
|
||||
const newState = e.newValue ? JSON.parse(e.newValue) : {};
|
||||
if (newState.paymentCompleted) window.location.reload(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Listen for changes to local storage, indicating that the payment completed
|
||||
window.addEventListener('storage', localStorageChangeHandled);
|
||||
},
|
||||
showStripe (data) {
|
||||
if (!this.checkGemAmount(data)) return;
|
||||
@@ -56,11 +89,18 @@ export default {
|
||||
|
||||
sub = sub && subscriptionBlocks[sub];
|
||||
|
||||
let amount = 500;// 500 = $5
|
||||
let amount = 500; // 500 = $5
|
||||
if (sub) amount = sub.price * 100;
|
||||
if (data.gift && data.gift.type === 'gems') amount = data.gift.gems.amount / 4 * 100;
|
||||
if (data.group) amount = (sub.price + 3 * (data.group.memberCount - 1)) * 100;
|
||||
|
||||
let paymentType;
|
||||
if (sub === false && !data.gift) paymentType = 'gems';
|
||||
if (sub !== false && !data.gift) paymentType = 'subscription';
|
||||
if (data.group || data.groupToCreate) paymentType = 'groupPlan';
|
||||
if (data.gift && data.gift.type === 'gems') paymentType = 'gift-gems';
|
||||
if (data.gift && data.gift.type === 'subscription') paymentType = 'gift-subscription';
|
||||
|
||||
window.StripeCheckout.open({
|
||||
key: STRIPE_PUB_KEY,
|
||||
address: false,
|
||||
@@ -92,6 +132,31 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
const appState = {
|
||||
paymentMethod: 'stripe',
|
||||
paymentCompleted: true,
|
||||
paymentType,
|
||||
};
|
||||
if (paymentType === 'subscription') {
|
||||
appState.subscriptionKey = sub.key;
|
||||
} else if (paymentType === 'groupPlan') {
|
||||
appState.subscriptionKey = sub.key;
|
||||
|
||||
if (data.groupToCreate) {
|
||||
appState.newGroup = true;
|
||||
appState.group = pick(data.groupToCreate, ['_id', 'memberCount', 'name']);
|
||||
} else {
|
||||
appState.newGroup = false;
|
||||
appState.group = pick(data.group, ['_id', 'memberCount', 'name']);
|
||||
}
|
||||
} else if (paymentType.indexOf('gift-') === 0) {
|
||||
appState.gift = data.gift;
|
||||
appState.giftReceiver = data.receiverName;
|
||||
}
|
||||
|
||||
|
||||
setLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE, JSON.stringify(appState));
|
||||
|
||||
let newGroup = response.data.data;
|
||||
if (newGroup && newGroup._id) {
|
||||
// @TODO this does not do anything as we reload just below
|
||||
@@ -99,8 +164,6 @@ export default {
|
||||
|
||||
// Handle new user signup
|
||||
if (!this.$store.state.isUserLoggedIn) {
|
||||
const habiticaUrl = `${location.protocol}//${location.host}`;
|
||||
|
||||
Analytics.track({
|
||||
hitType: 'event',
|
||||
eventCategory: 'group-plans-static',
|
||||
@@ -108,18 +171,17 @@ export default {
|
||||
eventLabel: 'paid-with-stripe',
|
||||
});
|
||||
|
||||
location.href = `${habiticaUrl}/group-plans/${newGroup._id}/task-information?showGroupOverview=true`;
|
||||
window.location.assign(`${habiticaUrl}/group-plans/${newGroup._id}/task-information?showGroupOverview=true`);
|
||||
return;
|
||||
}
|
||||
|
||||
this.$router.push(`/group-plans/${newGroup._id}/task-information`);
|
||||
// @TODO action
|
||||
this.user.guilds.push(newGroup._id);
|
||||
window.location.assign(`${habiticaUrl}/group-plans/${newGroup._id}/task-information`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.groupId) {
|
||||
this.$router.push(`/group-plans/${data.groupId}/task-information`);
|
||||
window.location.assign(`${habiticaUrl}/group-plans/${data.groupId}/task-information`);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -144,7 +206,7 @@ export default {
|
||||
let url = '/stripe/subscribe/edit';
|
||||
let response = await axios.post(url, data);
|
||||
|
||||
// Succss
|
||||
// Success
|
||||
window.location.reload(true);
|
||||
// error
|
||||
alert(response.message);
|
||||
@@ -167,6 +229,7 @@ export default {
|
||||
if (data.gift) {
|
||||
if (data.gift.gems && data.gift.gems.amount && data.gift.gems.amount <= 0) return;
|
||||
data.gift.uuid = data.giftedTo;
|
||||
this.amazonPayments.giftReceiver = data.receiverName;
|
||||
}
|
||||
|
||||
if (data.subscription) {
|
||||
@@ -178,7 +241,11 @@ export default {
|
||||
this.amazonPayments.groupId = data.groupId;
|
||||
}
|
||||
|
||||
if (data.groupToCreate) {
|
||||
if (data.group) { // upgrading a group
|
||||
this.amazonPayments.group = data.group;
|
||||
}
|
||||
|
||||
if (data.groupToCreate) { // creating a group
|
||||
this.amazonPayments.groupToCreate = data.groupToCreate;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import { CONSTANTS, getLocalSetting, setLocalSetting } from 'client/libs/userlocalManager';
|
||||
|
||||
export default function (to, from, next) {
|
||||
const redirect = to.params.redirect;
|
||||
|
||||
switch (redirect) {
|
||||
case 'paypal-success-checkout':
|
||||
case 'paypal-success-subscribe': {
|
||||
const appState = getLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE);
|
||||
if (appState) {
|
||||
const newAppState = JSON.parse(appState);
|
||||
newAppState.paymentCompleted = true;
|
||||
setLocalSetting(CONSTANTS.savedAppStateValues.SAVED_APP_STATE, JSON.stringify(newAppState));
|
||||
}
|
||||
window.close();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
next({name: 'notFound'});
|
||||
}
|
||||
}
|
||||
@@ -2,51 +2,49 @@ import Vue from 'vue';
|
||||
import VueRouter from 'vue-router';
|
||||
import getStore from 'client/store';
|
||||
import * as Analytics from 'client/libs/analytics';
|
||||
import handleRedirect from './handleRedirect';
|
||||
|
||||
// import EmptyView from './components/emptyView';
|
||||
|
||||
// TODO Dummy elements used as placeholder until real components are implemented
|
||||
import ParentPage from './components/parentPage';
|
||||
import ParentPage from 'client/components/parentPage';
|
||||
|
||||
// Static Pages
|
||||
const StaticWrapper = () => import(/* webpackChunkName: "entry" */'./components/static/staticWrapper');
|
||||
const HomePage = () => import(/* webpackChunkName: "entry" */'./components/static/home');
|
||||
const StaticWrapper = () => import(/* webpackChunkName: "entry" */'client/components/static/staticWrapper');
|
||||
const HomePage = () => import(/* webpackChunkName: "entry" */'client/components/static/home');
|
||||
|
||||
const AppPage = () => import(/* webpackChunkName: "static" */'./components/static/app');
|
||||
const ClearBrowserDataPage = () => import(/* webpackChunkName: "static" */'./components/static/clearBrowserData');
|
||||
const CommunityGuidelinesPage = () => import(/* webpackChunkName: "static" */'./components/static/communityGuidelines');
|
||||
const ContactPage = () => import(/* webpackChunkName: "static" */'./components/static/contact');
|
||||
const FAQPage = () => import(/* webpackChunkName: "static" */'./components/static/faq');
|
||||
const FeaturesPage = () => import(/* webpackChunkName: "static" */'./components/static/features');
|
||||
const GroupPlansPage = () => import(/* webpackChunkName: "static" */'./components/static/groupPlans');
|
||||
const MerchPage = () => import(/* webpackChunkName: "static" */'./components/static/merch');
|
||||
const NewsPage = () => import(/* webpackChunkName: "static" */'./components/static/newStuff');
|
||||
const OverviewPage = () => import(/* webpackChunkName: "static" */'./components/static/overview');
|
||||
const PressKitPage = () => import(/* webpackChunkName: "static" */'./components/static/pressKit');
|
||||
const PrivacyPage = () => import(/* webpackChunkName: "static" */'./components/static/privacy');
|
||||
const TermsPage = () => import(/* webpackChunkName: "static" */'./components/static/terms');
|
||||
const AppPage = () => import(/* webpackChunkName: "static" */'client/components/static/app');
|
||||
const ClearBrowserDataPage = () => import(/* webpackChunkName: "static" */'client/components/static/clearBrowserData');
|
||||
const CommunityGuidelinesPage = () => import(/* webpackChunkName: "static" */'client/components/static/communityGuidelines');
|
||||
const ContactPage = () => import(/* webpackChunkName: "static" */'client/components/static/contact');
|
||||
const FAQPage = () => import(/* webpackChunkName: "static" */'client/components/static/faq');
|
||||
const FeaturesPage = () => import(/* webpackChunkName: "static" */'client/components/static/features');
|
||||
const GroupPlansPage = () => import(/* webpackChunkName: "static" */'client/components/static/groupPlans');
|
||||
const MerchPage = () => import(/* webpackChunkName: "static" */'client/components/static/merch');
|
||||
const NewsPage = () => import(/* webpackChunkName: "static" */'client/components/static/newStuff');
|
||||
const OverviewPage = () => import(/* webpackChunkName: "static" */'client/components/static/overview');
|
||||
const PressKitPage = () => import(/* webpackChunkName: "static" */'client/components/static/pressKit');
|
||||
const PrivacyPage = () => import(/* webpackChunkName: "static" */'client/components/static/privacy');
|
||||
const TermsPage = () => import(/* webpackChunkName: "static" */'client/components/static/terms');
|
||||
|
||||
const RegisterLoginReset = () => import(/* webpackChunkName: "auth" */'./components/auth/registerLoginReset');
|
||||
const Logout = () => import(/* webpackChunkName: "auth" */'./components/auth/logout');
|
||||
const RegisterLoginReset = () => import(/* webpackChunkName: "auth" */'client/components/auth/registerLoginReset');
|
||||
const Logout = () => import(/* webpackChunkName: "auth" */'client/components/auth/logout');
|
||||
|
||||
// User Pages
|
||||
// const StatsPage = () => import(/* webpackChunkName: "user" */'./components/userMenu/stats');
|
||||
// const AchievementsPage = () => import(/* webpackChunkName: "user" */'./components/userMenu/achievements');
|
||||
const ProfilePage = () => import(/* webpackChunkName: "user" */'./components/userMenu/profilePage');
|
||||
const ProfilePage = () => import(/* webpackChunkName: "user" */'client/components/userMenu/profilePage');
|
||||
|
||||
// Settings
|
||||
const Settings = () => import(/* webpackChunkName: "settings" */'./components/settings/index');
|
||||
const API = () => import(/* webpackChunkName: "settings" */'./components/settings/api');
|
||||
const DataExport = () => import(/* webpackChunkName: "settings" */'./components/settings/dataExport');
|
||||
const Notifications = () => import(/* webpackChunkName: "settings" */'./components/settings/notifications');
|
||||
const PromoCode = () => import(/* webpackChunkName: "settings" */'./components/settings/promoCode');
|
||||
const Site = () => import(/* webpackChunkName: "settings" */'./components/settings/site');
|
||||
const Subscription = () => import(/* webpackChunkName: "settings" */'./components/settings/subscription');
|
||||
const Settings = () => import(/* webpackChunkName: "settings" */'client/components/settings/index');
|
||||
const API = () => import(/* webpackChunkName: "settings" */'client/components/settings/api');
|
||||
const DataExport = () => import(/* webpackChunkName: "settings" */'client/components/settings/dataExport');
|
||||
const Notifications = () => import(/* webpackChunkName: "settings" */'client/components/settings/notifications');
|
||||
const PromoCode = () => import(/* webpackChunkName: "settings" */'client/components/settings/promoCode');
|
||||
const Site = () => import(/* webpackChunkName: "settings" */'client/components/settings/site');
|
||||
const Subscription = () => import(/* webpackChunkName: "settings" */'client/components/settings/subscription');
|
||||
|
||||
// Hall
|
||||
const HallPage = () => import(/* webpackChunkName: "hall" */'./components/hall/index');
|
||||
const PatronsPage = () => import(/* webpackChunkName: "hall" */'./components/hall/patrons');
|
||||
const HeroesPage = () => import(/* webpackChunkName: "hall" */'./components/hall/heroes');
|
||||
const HallPage = () => import(/* webpackChunkName: "hall" */'client/components/hall/index');
|
||||
const PatronsPage = () => import(/* webpackChunkName: "hall" */'client/components/hall/patrons');
|
||||
const HeroesPage = () => import(/* webpackChunkName: "hall" */'client/components/hall/heroes');
|
||||
|
||||
// Except for tasks that are always loaded all the other main level
|
||||
// All the main level
|
||||
@@ -55,41 +53,41 @@ const HeroesPage = () => import(/* webpackChunkName: "hall" */'./components/hall
|
||||
// for docs
|
||||
|
||||
// Tasks
|
||||
const UserTasks = () => import(/* webpackChunkName: "userTasks" */'./components/tasks/user');
|
||||
const UserTasks = () => import(/* webpackChunkName: "userTasks" */'client/components/tasks/user');
|
||||
|
||||
// Inventory
|
||||
const InventoryContainer = () => import(/* webpackChunkName: "inventory" */'./components/inventory/index');
|
||||
const ItemsPage = () => import(/* webpackChunkName: "inventory" */'./components/inventory/items/index');
|
||||
const EquipmentPage = () => import(/* webpackChunkName: "inventory" */'./components/inventory/equipment/index');
|
||||
const StablePage = () => import(/* webpackChunkName: "inventory" */'./components/inventory/stable/index');
|
||||
const InventoryContainer = () => import(/* webpackChunkName: "inventory" */'client/components/inventory/index');
|
||||
const ItemsPage = () => import(/* webpackChunkName: "inventory" */'client/components/inventory/items/index');
|
||||
const EquipmentPage = () => import(/* webpackChunkName: "inventory" */'client/components/inventory/equipment/index');
|
||||
const StablePage = () => import(/* webpackChunkName: "inventory" */'client/components/inventory/stable/index');
|
||||
|
||||
// Guilds
|
||||
const GuildIndex = () => import(/* webpackChunkName: "guilds" */ './components/groups/index');
|
||||
const TavernPage = () => import(/* webpackChunkName: "guilds" */ './components/groups/tavern');
|
||||
const MyGuilds = () => import(/* webpackChunkName: "guilds" */ './components/groups/myGuilds');
|
||||
const GuildsDiscoveryPage = () => import(/* webpackChunkName: "guilds" */ './components/groups/discovery');
|
||||
const GroupPage = () => import(/* webpackChunkName: "guilds" */ './components/groups/group');
|
||||
const GroupPlansAppPage = () => import(/* webpackChunkName: "guilds" */ './components/groups/groupPlan');
|
||||
const GuildIndex = () => import(/* webpackChunkName: "guilds" */ 'client/components/groups/index');
|
||||
const TavernPage = () => import(/* webpackChunkName: "guilds" */ 'client/components/groups/tavern');
|
||||
const MyGuilds = () => import(/* webpackChunkName: "guilds" */ 'client/components/groups/myGuilds');
|
||||
const GuildsDiscoveryPage = () => import(/* webpackChunkName: "guilds" */ 'client/components/groups/discovery');
|
||||
const GroupPage = () => import(/* webpackChunkName: "guilds" */ 'client/components/groups/group');
|
||||
const GroupPlansAppPage = () => import(/* webpackChunkName: "guilds" */ 'client/components/groups/groupPlan');
|
||||
|
||||
// Group Plans
|
||||
const GroupPlanIndex = () => import(/* webpackChunkName: "group-plans" */ './components/group-plans/index');
|
||||
const GroupPlanTaskInformation = () => import(/* webpackChunkName: "group-plans" */ './components/group-plans/taskInformation');
|
||||
const GroupPlanBilling = () => import(/* webpackChunkName: "group-plans" */ './components/group-plans/billing');
|
||||
const GroupPlanIndex = () => import(/* webpackChunkName: "group-plans" */ 'client/components/group-plans/index');
|
||||
const GroupPlanTaskInformation = () => import(/* webpackChunkName: "group-plans" */ 'client/components/group-plans/taskInformation');
|
||||
const GroupPlanBilling = () => import(/* webpackChunkName: "group-plans" */ 'client/components/group-plans/billing');
|
||||
|
||||
// Challenges
|
||||
const ChallengeIndex = () => import(/* webpackChunkName: "challenges" */ './components/challenges/index');
|
||||
const MyChallenges = () => import(/* webpackChunkName: "challenges" */ './components/challenges/myChallenges');
|
||||
const FindChallenges = () => import(/* webpackChunkName: "challenges" */ './components/challenges/findChallenges');
|
||||
const ChallengeDetail = () => import(/* webpackChunkName: "challenges" */ './components/challenges/challengeDetail');
|
||||
const ChallengeIndex = () => import(/* webpackChunkName: "challenges" */ 'client/components/challenges/index');
|
||||
const MyChallenges = () => import(/* webpackChunkName: "challenges" */ 'client/components/challenges/myChallenges');
|
||||
const FindChallenges = () => import(/* webpackChunkName: "challenges" */ 'client/components/challenges/findChallenges');
|
||||
const ChallengeDetail = () => import(/* webpackChunkName: "challenges" */ 'client/components/challenges/challengeDetail');
|
||||
|
||||
// Shops
|
||||
const ShopsContainer = () => import(/* webpackChunkName: "shops" */'./components/shops/index');
|
||||
const MarketPage = () => import(/* webpackChunkName: "shops-market" */'./components/shops/market/index');
|
||||
const QuestsPage = () => import(/* webpackChunkName: "shops-quest" */'./components/shops/quests/index');
|
||||
const SeasonalPage = () => import(/* webpackChunkName: "shops-seasonal" */'./components/shops/seasonal/index');
|
||||
const TimeTravelersPage = () => import(/* webpackChunkName: "shops-timetravelers" */'./components/shops/timeTravelers/index');
|
||||
const ShopsContainer = () => import(/* webpackChunkName: "shops" */'client/components/shops/index');
|
||||
const MarketPage = () => import(/* webpackChunkName: "shops-market" */'client/components/shops/market/index');
|
||||
const QuestsPage = () => import(/* webpackChunkName: "shops-quest" */'client/components/shops/quests/index');
|
||||
const SeasonalPage = () => import(/* webpackChunkName: "shops-seasonal" */'client/components/shops/seasonal/index');
|
||||
const TimeTravelersPage = () => import(/* webpackChunkName: "shops-timetravelers" */'client/components/shops/timeTravelers/index');
|
||||
|
||||
import NotFoundPage from './components/404';
|
||||
import NotFoundPage from 'client/components/404';
|
||||
|
||||
Vue.use(VueRouter);
|
||||
|
||||
@@ -279,6 +277,9 @@ const router = new VueRouter({
|
||||
{ name: 'contributors', path: 'contributors', component: HeroesPage },
|
||||
],
|
||||
},
|
||||
// Only used to handle some redirects
|
||||
// See router.beforeEach
|
||||
{ path: '/redirect/:redirect', name: 'redirect' },
|
||||
{ path: '*', redirect: { name: 'notFound' } },
|
||||
],
|
||||
});
|
||||
@@ -289,6 +290,8 @@ router.beforeEach(function routerGuard (to, from, next) {
|
||||
const isUserLoggedIn = store.state.isUserLoggedIn;
|
||||
const routeRequiresLogin = to.meta.requiresLogin !== false;
|
||||
|
||||
if (to.name === 'redirect') return handleRedirect(to, from, next);
|
||||
|
||||
if (!isUserLoggedIn && routeRequiresLogin) {
|
||||
// Redirect to the login page unless the user is trying to reach the
|
||||
// root of the website, in which case show the home page.
|
||||
@@ -1,7 +1,6 @@
|
||||
import axios from 'axios';
|
||||
|
||||
const LOCALSTORAGE_AUTH_KEY = 'habit-mobile-settings';
|
||||
const LOCALSTORAGE_SOCIAL_AUTH_KEY = 'hello'; // Used by hello.js for social auth
|
||||
|
||||
export async function register (store, params) {
|
||||
let url = '/api/v4/user/auth/local/register';
|
||||
@@ -84,7 +83,6 @@ export async function socialAuth (store, params) {
|
||||
}
|
||||
|
||||
export function logout () {
|
||||
localStorage.removeItem(LOCALSTORAGE_AUTH_KEY);
|
||||
localStorage.removeItem(LOCALSTORAGE_SOCIAL_AUTH_KEY);
|
||||
localStorage.clear();
|
||||
window.location.href = '/logout-server';
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ export async function updateTag (store, payload) {
|
||||
export async function sortTag (store, payload) {
|
||||
let url = 'api/v4/reorder-tags';
|
||||
let response = await axios.post(url, {
|
||||
tagDetails: payload.tagDetails,
|
||||
tagId: payload.tagId,
|
||||
to: payload.to,
|
||||
});
|
||||
return response.data.data;
|
||||
|
||||
@@ -394,5 +394,19 @@
|
||||
"backgroundGlowingMushroomCaveText": "Пещера на светещите гъби",
|
||||
"backgroundGlowingMushroomCaveNotes": "Възхищавайте се на пещера на светещите гъби.",
|
||||
"backgroundCozyBedroomText": "Уютна спалня",
|
||||
"backgroundCozyBedroomNotes": "Полегнете в уютна спалня."
|
||||
"backgroundCozyBedroomNotes": "Полегнете в уютна спалня.",
|
||||
"backgrounds122018": "КОМПЛЕКТ 55: декември 2018 г.",
|
||||
"backgroundFlyingOverSnowyMountainsText": "Заснежени планини",
|
||||
"backgroundFlyingOverSnowyMountainsNotes": "Полетете над заснежените планини през нощта",
|
||||
"backgroundFrostyForestText": "Ледена гора",
|
||||
"backgroundFrostyForestNotes": "Пригответе се за поход през ледена гора.",
|
||||
"backgroundSnowyDayFireplaceText": "Огнище в снежен ден",
|
||||
"backgroundSnowyDayFireplaceNotes": "Сгушете се пред огнището в снежен ден.",
|
||||
"backgrounds012019": "КОМПЛЕКТ 56: януари 2019 г.",
|
||||
"backgroundAvalancheText": "Лавина",
|
||||
"backgroundAvalancheNotes": "Избягайте от страховитата мощ на лавина.",
|
||||
"backgroundArchaeologicalDigText": "Археологически разкопки",
|
||||
"backgroundArchaeologicalDigNotes": "Разкрийте тайните на древността в археологически разкопки.",
|
||||
"backgroundScribesWorkshopText": "Работилница на книжник",
|
||||
"backgroundScribesWorkshopNotes": "Напишете следващия си списък в работилница на книжник."
|
||||
}
|
||||
@@ -179,6 +179,9 @@
|
||||
"questEggAlligatorText": "Алигатор",
|
||||
"questEggAlligatorMountText": "Алигатор",
|
||||
"questEggAlligatorAdjective": "хитър",
|
||||
"questEggVelociraptorText": "Велоцираптор",
|
||||
"questEggVelociraptorMountText": "Велоцираптор",
|
||||
"questEggVelociraptorAdjective": "умен",
|
||||
"eggNotes": "Намерете излюпваща отвара, която да излеете върху това яйце и от него ще се излюпи <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
|
||||
"hatchingPotionBase": "Нормален цвят",
|
||||
"hatchingPotionWhite": "Бял цвят",
|
||||
@@ -207,6 +210,7 @@
|
||||
"hatchingPotionGlass": "Стъкло",
|
||||
"hatchingPotionGlow": "Светещо в тъмното",
|
||||
"hatchingPotionFrost": "Скреж",
|
||||
"hatchingPotionIcySnow": "Леден сняг",
|
||||
"hatchingPotionNotes": "Излейте това върху яйце и от него ще се излюпи любимец с(ъс) <%= potText(locale) %>.",
|
||||
"premiumPotionAddlNotes": "Не може да се използва върху яйца за любимци от мисии.",
|
||||
"foodMeat": "Месо",
|
||||
|
||||
@@ -271,9 +271,17 @@
|
||||
"weaponSpecialFall2018WarriorText": "Камшикът на Минос",
|
||||
"weaponSpecialFall2018WarriorNotes": "Недостатъчно дълго, за да се развие зад Вас и да Ви задържи в лабиринта. Е, може би, ако лабиринтът е много малък. Увеличава силата с <%= str %>. Ограничена серия: Есенна екипировка 2018 г.",
|
||||
"weaponSpecialFall2018MageText": "Скиптър на сладостта",
|
||||
"weaponSpecialFall2018MageNotes": "Това не е просто някаква близалка! Светещото кълбо от вълшебна захар на върха на този скиптър има силата да кара добрите навици да залепнат за Вас. Увеличава интелигентността с <%= int %> и усета с <%= per %>. Ограничена серия: Есенна екипировка 2018 г. Оръжие за две ръце.",
|
||||
"weaponSpecialFall2018MageNotes": "Това не е просто някаква близалка! Светещото кълбо от вълшебна захар на върха на този скиптър има силата да кара добрите навици да залепнат за Вас. Увеличава интелигентността с <%= int %> и усета с <%= per %>. Ограничена серия: Есенна екипировка 2018 г.",
|
||||
"weaponSpecialFall2018HealerText": "Гладен скиптър",
|
||||
"weaponSpecialFall2018HealerNotes": "Просто гледайте този скиптър да е нахранен, и той ще Ви възнаграждава с благословиите си. Ако забравите да го нахраните, по-добре си пазете пръстите. Увеличава интелигентността с <%= int %>. Ограничена серия: Есенна екипировка 2018 г.",
|
||||
"weaponSpecialWinter2019RogueText": "Букет от коледни звезди",
|
||||
"weaponSpecialWinter2019RogueNotes": "Използвайте този празничен букет, за да се прикриете още повече, или пък за да го подарите на някой приятел и да го разведрите. Увеличава силата с <%= str %>. Ограничена серия: Зимна екипировка 2018-2019г.",
|
||||
"weaponSpecialWinter2019WarriorText": "Снежинкова алебарда",
|
||||
"weaponSpecialWinter2019WarriorNotes": "Тази снежинка е изкуствено изработена кристалче по кристалче, за да се превърне в здраво като диамант острие! Увеличава силата с <%= str %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"weaponSpecialWinter2019MageText": "Скиптър на огнен дракон",
|
||||
"weaponSpecialWinter2019MageNotes": "Внимавайте! Този взривоопасен скиптър е готов да Ви помогне да се справите с всички нападатели. Увеличава интелигентността с <%= int %> и усета с <%= per %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"weaponSpecialWinter2019HealerText": "Зимна вълшебна пръчка",
|
||||
"weaponSpecialWinter2019HealerNotes": "Зимата може да бъде време за почивка и възстановяване, така че тази зимна вълшебна пръчка може да Ви помогне и срещу най-тежките болежки. Увеличава интелигентността с <%= int %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"weaponMystery201411Text": "Вилица на изобилието",
|
||||
"weaponMystery201411Notes": "Наръгайте враговете си или си боцнете от любимата храна — тази универсална вилица може всичко! не променя показателите. Предмет за абонати: ноември 2014 г.",
|
||||
"weaponMystery201502Text": "Блестящият крилат скиптър на любовта и истината",
|
||||
@@ -284,8 +292,8 @@
|
||||
"weaponMystery201611Notes": "Разнообразие от вкусни и полезни храни се сипе от този рог. Добър апетит! Не променя показателите. Предмет за абонати: ноември 2016 г.",
|
||||
"weaponMystery201708Text": "Меч от лава",
|
||||
"weaponMystery201708Notes": "Светлината излъчвана яростно от този меч ще Ви помогне да свършите бързи и най-тъмночервените задачи! Не променя показателите. Предмет за абонати: август 2017 г.",
|
||||
"weaponMystery201811Text": "Splendid Sorcerer's Staff",
|
||||
"weaponMystery201811Notes": "This magical stave is as powerful as it is elegant. Confers no benefit. November 2018 Subscriber Item.",
|
||||
"weaponMystery201811Text": "Скиптър на великолепния магьосник",
|
||||
"weaponMystery201811Notes": "Този вълшебен скиптър е колкото елегантен, толкова и могъщ. Не променя показателите. Предмет за абонати: септември 2018 г.",
|
||||
"weaponMystery301404Text": "Изтънчен бастун",
|
||||
"weaponMystery301404Notes": "Чудесен за разходка из града. Предмет за абонати: март 3015 г. Не променя показателите.",
|
||||
"weaponArmoireBasicCrossbowText": "Обикновен арбалет",
|
||||
@@ -364,6 +372,8 @@
|
||||
"weaponArmoireNeedleOfBookbindingNotes": "Ще се учудите колко здрави могат да бъдат книгите. Тази игла може да пробие всичко и да достигне до сърцето на задачите Ви. Увеличава силата с <%= str %>. Омагьосан гардероб: Подвързачески комплект (предмет 3 от 4).",
|
||||
"weaponArmoireSpearOfSpadesText": "Копие — пика",
|
||||
"weaponArmoireSpearOfSpadesNotes": "Това рицарско копие е идеално за промушване на най-червените навици или ежедневни задачи. Увеличава якостта с <%= con %>. Омагьосан гардероб: комплект „Асо пика“ (предмет 3 от 3).",
|
||||
"weaponArmoireArcaneScrollText": "Мистериозен свитък",
|
||||
"weaponArmoireArcaneScrollNotes": "Този древен списък със задачи за изпълнение е изпълнен със странни значи и заклинания от забравена ера. Увеличава интелигентността с <%= int %>. Омагьосан гардероб: комплект на книжника (предмет 3 от 3).",
|
||||
"armor": "броня",
|
||||
"armorCapitalized": "Броня",
|
||||
"armorBase0Text": "Обикновени дрехи",
|
||||
@@ -616,6 +626,14 @@
|
||||
"armorSpecialFall2018MageNotes": "В тъканта на тези одежди са втъкани вълшебни бонбони! Но яденето им не е препоръчително. Увеличава интелигентността с <%= int %>. Ограничена серия: Есенна екипировка 2018 г.",
|
||||
"armorSpecialFall2018HealerText": "Месоядна мантия",
|
||||
"armorSpecialFall2018HealerNotes": "Въпреки че е направена от растения, тази мантия не е вегетарианска. Лошите навици я заобикалят от километри. Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2018 г.",
|
||||
"armorSpecialWinter2019RogueText": "Броня от коледна звезда",
|
||||
"armorSpecialWinter2019RogueNotes": "С цялата празнична зеленина навсякъде, никой няма да забележи малко допълнителна растителност! Можете да се промъквате незабележимо през сезонните събирания. Увеличава усета с <%= per %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"armorSpecialWinter2019WarriorText": "Ледникова броня",
|
||||
"armorSpecialWinter2019WarriorNotes": "В разгара на битката тази броня ще Ви държи хладно, за да не прегреете. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"armorSpecialWinter2019MageText": "Одежди от изгарящо вдъхновение",
|
||||
"armorSpecialWinter2019MageNotes": "Това огнеупорно облекло ще Ви защити, ако някой от проблясъците Ви на гениалност случайно подпали нещо! Увеличава интелигентността с <%= int %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"armorSpecialWinter2019HealerText": "Среднощна мантия",
|
||||
"armorSpecialWinter2019HealerNotes": "Без тъмнина няма да има светлина. Тези тъмни одежди носят мир и спокойствие, за да помогнат за по-бързо оздравяване. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"armorMystery201402Text": "Одежди на вестоносец",
|
||||
"armorMystery201402Notes": "Блестящи и здрави, тези одежди имат много джобове за носене на писма. Не променя показателите. Предмет за абонати: февруари 2014 г.",
|
||||
"armorMystery201403Text": "Броня на горски бродник",
|
||||
@@ -790,6 +808,12 @@
|
||||
"armorArmoireRobeOfSpadesNotes": "Тези изтупани одежди имат скрити джобове за съкровища или оръжия – Вие решавате! Увеличава силата с <%= str %>. Омагьосан гардероб: комплект „Асо пика“ (предмет 2 от 3).",
|
||||
"armorArmoireSoftBlueSuitText": "Мек син костюм",
|
||||
"armorArmoireSoftBlueSuitNotes": "Синият цвят успокоява. Толкова много, че някои носят този мек костюм докато спят… хрр. Увеличава интелигентността с <%= int %> и усета с <%= per %>. Омагьосан гардероб: Син домашен комплект (предмет 2 от 3).",
|
||||
"armorArmoireSoftGreenSuitText": "Мек зелен костюм",
|
||||
"armorArmoireSoftGreenSuitNotes": "Зеленият цвят е най-успокояващ! Чудесен за почивка на уморените очи… ммм, или дори малка дрямка… Увеличава якостта и интелигентността с по <%= attrs %>. Омагьосан гардероб: Зелен домашен комплект (предмет 2 от 3).",
|
||||
"armorArmoireSoftRedSuitText": "Мек червен костюм",
|
||||
"armorArmoireSoftRedSuitNotes": "Червеното е толкова ободряващ цвят. Ако искате да се събудите рано, този костюм е идеалната за Вас пижама… Увеличава интелигентността с <%= int %> и силата с <%= str %>. Омагьосан гардероб: Червен домашен комплект (предмет 2 от 3).",
|
||||
"armorArmoireScribesRobeText": "Одежди на книжник",
|
||||
"armorArmoireScribesRobeNotes": "Тези кадифени одежди са изтъкани с вдъхновяващо и мотивиращо вълшебство. Увеличава усета и интелигентността с по <%= attrs %>. Омагьосан гардероб: комплект на книжника (предмет 1 от 3).",
|
||||
"headgear": "шлем",
|
||||
"headgearCapitalized": "Защита за главата",
|
||||
"headBase0Text": "Няма защита за главата",
|
||||
@@ -1042,6 +1066,16 @@
|
||||
"headSpecialFall2018MageNotes": "Тази островърха шапка е подсилена с могъщи заклинание за сладост. Внимавайте, защото ако се намокри, може да стане лепкава! Увеличава усета с <%= per %>. Ограничена серия: Есенна екипировка 2018 г.",
|
||||
"headSpecialFall2018HealerText": "Хищен шлем",
|
||||
"headSpecialFall2018HealerNotes": "Този шлем е направен от месоядно растение, известно със способността си да произвежда зомбита и други неудобства. Увеличава интелигентността с <%= int %>. Ограничена серия: Есенна екипировка 2018 г.",
|
||||
"headSpecialNye2018Text": "Необичайна купонджийска шапка",
|
||||
"headSpecialNye2018Notes": "Получихте необичайна купонджийска шапка! Носете я с гордост, когато посрещате Нова година! Не променя показателите.",
|
||||
"headSpecialWinter2019RogueText": "Шлем от коледна звезда",
|
||||
"headSpecialWinter2019RogueNotes": "Този листен се обагря в най-яркия червен цвят около най-тъмните дни на зимата, за да се слеете с празничната украса. Увеличава усета с <%= per %>. Ограничена серия: Змина екипировка 2018-2019 г.",
|
||||
"headSpecialWinter2019WarriorText": "Ледников шлем",
|
||||
"headSpecialWinter2019WarriorNotes": "Важно е главата Ви да е на студено! Този леден шлем ще Ви защитава от ударите на враговете. Увеличава силата с <%= str %>. Ограничена серия: Зимна екипировка 2018-2018 г.",
|
||||
"headSpecialWinter2019MageText": "Пламтящи фойерверки",
|
||||
"headSpecialWinter2019MageNotes": "Застанете по-надалеч и гледайте как хвърчат искрите! Задачите Ви нама да издържат на това! Увеличава усета с <%= per %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"headSpecialWinter2019HealerText": "Звездна корона",
|
||||
"headSpecialWinter2019HealerNotes": "В най-тъмната и студена зимна нощ, една определена звезда свети най-силно. Тази корона е направена от метал от тази звезда, за да озарявате всичко! Увеличава интелигентността с <%= int %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"headSpecialGaymerxText": "Боен шлем с цветовете на дъгата",
|
||||
"headSpecialGaymerxNotes": "В чест на конференцията GaymerX, този специален шлем е оцветен с шарка на дъга! GaymerX е игрално изложение в чест на ЛГБТ културата и игрите и е отворено за всички.",
|
||||
"headMystery201402Text": "Крилат шлем",
|
||||
@@ -1122,8 +1156,8 @@
|
||||
"headMystery201809Notes": "Последните цветя на топлите есенни дни напомнят за красотата на този сезон. Не променя показателите. Предмет за абонати: септември 2018 г.",
|
||||
"headMystery201810Text": "Тъмногорски шлем",
|
||||
"headMystery201810Notes": "Ако се окаже, че пътят Ви минава през някое зловещо място, то червените очи на този шлем със сигурност ще изплашат враговете, които могат да се появят на пътя Ви. Не променя показателите. Предмет за абонати: октомври 2018 г.",
|
||||
"headMystery201811Text": "Splendid Sorcerer's Hat",
|
||||
"headMystery201811Notes": "Wear this feathered hat to stand out at even the fanciest wizardly gatherings! Confers no benefit. November 2018 Subscriber Item.",
|
||||
"headMystery201811Text": "Шапка на великолепния магьосник",
|
||||
"headMystery201811Notes": "Ако носите тази перната шапка, ще изпъквате и на най-шантавите сбирки на магьосници! Не променя показателите. Предмет за абонати: декември 2018 г.",
|
||||
"headMystery301404Text": "Украсен цилиндър",
|
||||
"headMystery301404Notes": "Украсен цилиндър за най-изтънчените и високопоставени членове на обществото. Не променя показателите. Предмет за абонати: януари 3015 г.",
|
||||
"headMystery301405Text": "Обикновен цилиндър",
|
||||
@@ -1153,7 +1187,7 @@
|
||||
"headArmoireYellowHairbowText": "Жълта панделка",
|
||||
"headArmoireYellowHairbowNotes": "Всеки става по-концентриран, силен и умен, когато си сложи тази красива жълта панделка! Увеличава усета, силата и интелигентността с по <%= attrs %>. Омагьосан гардероб: комплект „Жълта панделка“ (предмет 1 от 2).",
|
||||
"headArmoireRedFloppyHatText": "Широка червена шапка",
|
||||
"headArmoireRedFloppyHatNotes": "Много заклинания са втъкани в тази простовата шапка, придавайки ѝ сияен червен цвят. Увеличава якостта, интелигентността и усета с по <%= attrs %>. Омагьосан гардероб: Независим предмет.",
|
||||
"headArmoireRedFloppyHatNotes": "Много заклинания са втъкани в тази простовата шапка, придавайки ѝ сияен червен цвят. Увеличава якостта, интелигентността и усета с по <%= attrs %>. Омагьосан гардероб: Червен домашен комплект (предмет 1 от 3).",
|
||||
"headArmoirePlagueDoctorHatText": "Шапка на чумен лекар",
|
||||
"headArmoirePlagueDoctorHatNotes": "Съвсем истинска шапка, носена от лекарите, които са се борили срещу чумата на протакането! Увеличава силата с <%= str %>, интелигентността с <%= int %> и якостта с <%= con %>. Омагьосан гардероб: комплект „Чумен лекар“ (предмет 1 от 3).",
|
||||
"headArmoireBlackCatText": "Черна котешка шапка",
|
||||
@@ -1179,7 +1213,7 @@
|
||||
"headArmoireGraduateCapText": "Шапка на висшист",
|
||||
"headArmoireGraduateCapNotes": "Поздравления! Заради усърдното си мислене заслужихте тази мисловна шапка. Увеличава интелигентността с <%= int %>. Омагьосан гардероб: Комплект „Висшист“ (предмет 3 от 3).",
|
||||
"headArmoireGreenFloppyHatText": "Широка зелена шапка",
|
||||
"headArmoireGreenFloppyHatNotes": "Много заклинания са втъкани в тази простовата шапка, придавайки ѝ разкошен зелен цвят. Увеличава якостта, интелигентността и усета с по <%= attrs %>. Омагьосан гардероб: Независим предмет.",
|
||||
"headArmoireGreenFloppyHatNotes": "Много заклинания са втъкани в тази простовата шапка, придавайки ѝ разкошен зелен цвят. Увеличава якостта, интелигентността и усета с по <%= attrs %>. Омагьосан гардероб: Зелен домашен комплект (предмет 1 от 3).",
|
||||
"headArmoireCannoneerBandannaText": "Артилеристка кърпа за глава",
|
||||
"headArmoireCannoneerBandannaNotes": "Т’ва е артилеристкия живот за мен! Увеличава интелигентността и усета с по <%= attrs %>. Омагьосан гардероб: Артилерийски комплект (предмет 3 от 3).",
|
||||
"headArmoireFalconerCapText": "Соколарска шапка",
|
||||
@@ -1390,6 +1424,10 @@
|
||||
"shieldSpecialFall2018WarriorNotes": "Много лъскав, за да обезкуражава досадните горгони, опитващи се да се появяват изненадващо зад ъглите! Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2018 г.",
|
||||
"shieldSpecialFall2018HealerText": "Гладен щит",
|
||||
"shieldSpecialFall2018HealerNotes": "С отворената си паст, този щит ще поеме всички удари на враговете Ви. Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2018 г.",
|
||||
"shieldSpecialWinter2019WarriorText": "Замразен щит",
|
||||
"shieldSpecialWinter2019WarriorNotes": "Този щит е изработен от най-дебелите парчета лед от най-стария ледник в Споколандските степи. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"shieldSpecialWinter2019HealerText": "Вълшебни ледени кристали",
|
||||
"shieldSpecialWinter2019HealerNotes": "Тънкият лед може и да се чупи, но тези перфектни кристали отблъскват обратно всеки удар, още преди да стигне до Вас. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2018-2019 г.",
|
||||
"shieldMystery201601Text": "Решителен убиец",
|
||||
"shieldMystery201601Notes": "Това острие може да отблъсне всички разсейващи Ви неща. Не променя показателите. Предмет за абонати: януари 2016 г.",
|
||||
"shieldMystery201701Text": "Спиращ времето щит",
|
||||
@@ -1456,6 +1494,12 @@
|
||||
"shieldArmoireUnfinishedTomeNotes": "Няма как да протакате, когато държите това! Подвързията трябва да бъде завършена, за да могат хората да прочетат книгата! Увеличава интелигентността с <%= int %>. Омагьосан гардероб: Подвързачески комплект (предмет 4 от 4).",
|
||||
"shieldArmoireSoftBluePillowText": "Мека синя възглавница",
|
||||
"shieldArmoireSoftBluePillowNotes": "Предвидливият воин си взема възглавница при всяко пътешествие. Защитете се от острите задачи… дори когато си подремвате. Увеличава якостта с <%= con %>. Омагьосан гардероб: Син домашен комплект (предмет 3 от 3).",
|
||||
"shieldArmoireSoftRedPillowText": "Мека червена възглавницата",
|
||||
"shieldArmoireSoftRedPillowNotes": "Предвидливият воин си взема възглавница при всяко пътешествие. Защитете се от острите задачи… дори когато си подремвате. Увеличава якостта и силата с <%= attrs %>. Омагьосан гардероб: Червен домашен комплект (предмет 3 от 3).",
|
||||
"shieldArmoireSoftGreenPillowText": "Мека зелена възглавница",
|
||||
"shieldArmoireSoftGreenPillowNotes": "Практичният воин си взема възглавница при всяко пътешествие. Пропъдете нахалните задължения… дори когато си подремвате. Увеличава якостта с <%= con %> и силата с <%= int %>. Омагьосан гардероб: Зелен домашен комплект (предмет 3 от 3).",
|
||||
"shieldArmoireMightyQuillText": "Могъщо перо",
|
||||
"shieldArmoireMightyQuillNotes": "По-могъщо от меч, както казват! Увеличава усета с <%= per %>. Омагьосан гардероб: комплект на книжника (предмет 2 от 3).",
|
||||
"back": "Аксесоар за гръб",
|
||||
"backCapitalized": "Аксесоар за гръб",
|
||||
"backBase0Text": "Няма аксесоар за гръб",
|
||||
@@ -1491,6 +1535,8 @@
|
||||
"backMystery201803Notes": "С тези светли и блещукащи крила ще можете да се понесете по лекия пролетен бриз и да прехвърчате от лилия на лилия без проблем. Не променя показателите. Предмет за абонати: април 2018 г.",
|
||||
"backMystery201804Text": "Катерича опашка",
|
||||
"backMystery201804Notes": "Със сигурност ще Ви помогне да балансирате по-добре, когато скачате от клон на клон, но най-важното ѝ свойство е, че ПУХКАВОСТТА Е НА МАКСИМУМ. Не променя показателите. Предмет за абонати: април 2018 г.",
|
||||
"backMystery201812Text": "Опашка на полярна лисица",
|
||||
"backMystery201812Notes": "Луксозната Ви опашка блести като ледена висулка, поклащайки се лек, докато се плъзгате по снега. Не променя показателите. Предмет за абонати: декември 2018 г.",
|
||||
"backMystery201805Text": "Феноменална паунова опашка",
|
||||
"backMystery201805Notes": "Тази разкошна перната опашка е идеална за разходки по красивите градински пътечки. Не променя показателите. Предмет за абонати: май 2018 г.",
|
||||
"backSpecialWonderconRedText": "Могъщо наметало",
|
||||
@@ -1641,6 +1687,8 @@
|
||||
"headAccessoryMystery201801Notes": "Тези ледени рога блестят със светлината на зимни сияния. Не променя показателите. Предмет за абонати: януари 2018 г.",
|
||||
"headAccessoryMystery201804Text": "Катеричи уши",
|
||||
"headAccessoryMystery201804Notes": "С тези уши няма да пропуснете нито шума на листата, поклащани от вятъра, нито звука на падащите жълъди! Не променя показателите. Предмет за абонати: април 2018 г.",
|
||||
"headAccessoryMystery201812Text": "Уши на полярна лисица",
|
||||
"headAccessoryMystery201812Notes": "Чувате лекия звук на падащите наоколо снежинки. Не променя показателите. Предмет за абонати: декември 2018 г.",
|
||||
"headAccessoryMystery301405Text": "Защитни очила за чело",
|
||||
"headAccessoryMystery301405Notes": "„Очилата се слагат на очите“ — казват хората. „Никому не са нужни защитни очила, които могат да се носят само на главата“ — казват пак те. Ха! Показахте на всички, че това не е вярно! Не променя показателите. Предмет за абонати: август 3015 г.",
|
||||
"headAccessoryArmoireComicalArrowText": "Забавна стрела",
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
"LFG": "За да рекламирате новата си група или да потърсите такава, към която да се присъедините, посетете гилдията <%= linkStart %>„Търсене на група“ (Looking for Group)<%= linkEnd %>.",
|
||||
"wantExistingParty": "Искате да се присъедините към съществуваща група? Посетете <%= linkStart %>гилдията „Търсене на група“ (Party Wanted Guild)<%= linkEnd %> и публикувайте потребителския си идентификатор:",
|
||||
"joinExistingParty": "Присъединете се към нечия друга група",
|
||||
"usernameCopied": "Потребителското име е копирано в буфера.",
|
||||
"needPartyToStartQuest": "Опа! Трябва да <a href='http://habitica.wikia.com/wiki/Party' target='_blank'>създадете група или да се присъедините към такава</a>, преди да можете да започнете мисия!",
|
||||
"createGroupPlan": "Създаване",
|
||||
"create": "Създаване",
|
||||
@@ -331,6 +332,8 @@
|
||||
"claimedBy": "Поета от: <%= claimingUsers %>",
|
||||
"cantDeleteAssignedGroupTasks": "Не можете да изтриете груповите задачи, които са Ви разпределени.",
|
||||
"confirmGuildPlanCreation": "Създаване на тази група?",
|
||||
"groupPlanUpgraded": "<strong><%= groupName %></strong> премина към групов план!",
|
||||
"groupPlanCreated": "Групата <strong><%= groupName %></strong> беше създадена!",
|
||||
"onlyGroupLeaderCanInviteToGroupPlan": "Само водачът на групата може да кани хора в група с абонамент.",
|
||||
"paymentDetails": "Подробности за разплащането",
|
||||
"aboutToJoinCancelledGroupPlan": "На път сте да се присъедините към група, чийто план е прекратен. НЯМА да получите безплатен абонамент.",
|
||||
@@ -412,9 +415,8 @@
|
||||
"playInPartyDescription": "Изпълнявайте невероятни мисии заедно с приятели или самостоятелно. Бийте се с чудовища, създавайте предизвикателства и поддържайте отговорността си чрез групите.",
|
||||
"startYourOwnPartyTitle": "Създайте своя група",
|
||||
"startYourOwnPartyDescription": "Бийте се с чудовища самостоятелно, или поканете колкото искате приятели!",
|
||||
"shartUserId": "Споделяне на потр. ид.",
|
||||
"wantToJoinPartyTitle": "Искате да се присъедините към група?",
|
||||
"wantToJoinPartyDescription": "Дайте своя потребителски идентификатор на приятел, който вече има група, или се отправете към гилдията „Търсене на група“ (Party Wanted), за да се срещнете с потенциални другари!",
|
||||
"wantToJoinPartyDescription": "Дайте потребителското си име на приятел, който вече има група, или се отправете към гилдията <a href='/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'>„Търсене на група“ (Party Wanted)</a>, за да се срещнете с потенциални другари!",
|
||||
"copy": "Копиране",
|
||||
"inviteToPartyOrQuest": "Канене на групата за мисия",
|
||||
"inviteInformation": "Ако натиснете „Поканване“, ще изпратите покани до всички членове на групата. Мисията започва, когато всички приемат или отхвърлят поканата си.",
|
||||
|
||||
@@ -130,6 +130,10 @@
|
||||
"fall2018CandymancerMageSet": "Майстор на бонбони (магьосник)",
|
||||
"fall2018CarnivorousPlantSet": "Месоядно растение (лечител)",
|
||||
"fall2018AlterEgoSet": "Алтер его (мошеник)",
|
||||
"winter2019BlizzardSet": "Снежна буря (воин)",
|
||||
"winter2019PyrotechnicSet": "Пиротехник (магьосник)",
|
||||
"winter2019WinterStarSet": "Зимна звезда (лечител)",
|
||||
"winter2019PoinsettiaSet": "Коледна звезда (мошеник)",
|
||||
"eventAvailability": "Налично за купуване до <%= date(locale) %>.",
|
||||
"dateEndMarch": "30 април",
|
||||
"dateEndApril": "19 април",
|
||||
@@ -139,11 +143,13 @@
|
||||
"dateEndAugust": "31 август",
|
||||
"dateEndSeptember": "21 септември",
|
||||
"dateEndOctober": "31 октомври",
|
||||
"dateEndNovember": "30 ноември",
|
||||
"dateEndNovember": "3 декември",
|
||||
"dateEndJanuary": "31 януари",
|
||||
"dateEndFebruary": "28 февруари",
|
||||
"winterPromoGiftHeader": "ПОДАРЕТЕ АБОНАМЕНТ И ЩЕ ПОЛУЧИТЕ ОЩЕ ЕДИН БЕЗПЛАТНО!",
|
||||
"winterPromoGiftDetails1": "Само до 12 януари, ако подарите абонамент на някого, ще получите същия и за себе си безплатно!",
|
||||
"winterPromoGiftDetails1": "Само до 15 януари, ако подарите абонамент на някого, ще получите същия и за себе си безплатно!",
|
||||
"winterPromoGiftDetails2": "Моля, имайте предвид, че ако Вие или получателят на подаръка Ви вече имате повтарящ се абонамент, подареният ще започне след като текущият бъде прекратен или изтече. Благодарим Ви за подкрепата! <3",
|
||||
"discountBundle": "пакет"
|
||||
"discountBundle": "пакет",
|
||||
"g1g1Announcement": "Подарете абонамент и ще получите още един безплатно! Събитието протича в момента!",
|
||||
"g1g1Details": "Подарете абонамент на приятел от профила му и ще получите същия абонамент безплатно!"
|
||||
}
|
||||
@@ -106,6 +106,12 @@
|
||||
"card": "Кредитна карта (чрез Stripe)",
|
||||
"amazonInstructions": "Натиснете бутона, за да платите чрез „Amazon Payments“",
|
||||
"paymentMethods": "Купуване чрез",
|
||||
"paymentSuccessful": "Плащането Ви беше успешно!",
|
||||
"paymentYouReceived": "Получихте:",
|
||||
"paymentYouSentGems": "Изпратихте на <strong><%= name %></strong>:",
|
||||
"paymentYouSentSubscription": "Изпратихте на <strong><%= name %></strong> <%= months %>-месечен абонамент за Хабитика.",
|
||||
"paymentSubBilling": "Абонаментът Ви ще бъде таксуван с <strong>$<%= amount %></strong> всеки <strong><%= months %> месеца</strong>.",
|
||||
"success": "Готово!",
|
||||
"classGear": "Снаряжение за класа",
|
||||
"classGearText": "Поздравления за избора на клас! Добавих новата Ви основна екипировка в инвентара Ви. Погледнете по-долу, за да я екипирате!",
|
||||
"classStats": "Това са показателите на класа Ви. Те оказват влияние върху играта Ви. Всеки път, когато качите ниво, получавате една точка, която може да приложите към избран показател. Посочете всеки от показателите с мишката за повече информация.",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"webStep2Text": "А сега започнете да преследвате целите си от списъка! Когато завършвате задачи и ги отмятате в Хабитика, ще получавате [опит](http://habitica.wikia.com/wiki/Experience_Points), чрез който качвате ниво и [злато](http://habitica.wikia.com/wiki/Gold_Points), с което можете да си купувате награди. Ако се поддадете на лош навик или пропуснете ежедневна задача, ще загубите [здраве](http://habitica.wikia.com/wiki/Health_Points). Така лентите за опит и здраве представляват своеобразен показател за напредъка към целите Ви. Подобрявайки истинския си живот, Вашият герой в играта ще напредва.",
|
||||
|
||||
"step3": "Стъпка 3: Персонализирайте и изследвайте Хабитика",
|
||||
"webStep3Text": "След като свикнете с нещата, ще можете да се забавлявате още повече с Хабитика, с тези интересни функционалности:\n * Организирайте задачите си с [етикети](http://habitica.wikia.com/wiki/Tags) (етикетите се добавят в прозорчето за редактиране на задача);\n * Персонализирайте [героя](http://habitica.wikia.com/wiki/Avatar) си, като натиснете потребителската иконка в горния десен ъгъл;\n * Купете си [екипировка](http://habitica.wikia.com/wiki/Equipment) от колоната с награди или от [магазините](/shops/market) и екипирайте героя си с нея в [Инвентар > Екипировка](/inventory/equipment);\n * Свържете се с други потребители посредством [кръчмата](http://habitica.wikia.com/wiki/Tavern);\n * След като достигнете ниво 3, ще можете да излюпвате [любимци](http://habitica.wikia.com/wiki/Pets) като събирате [яйца](http://habitica.wikia.com/wiki/Eggs) и [излюпващи отвари](http://habitica.wikia.com/wiki/Hatching_Potions). [Хранете](http://habitica.wikia.com/wiki/Food) ги, за да се превърнат в [превози](http://habitica.wikia.com/wiki/Mounts);\n * След като достигнете ниво 10, ще можете да изберете [клас](http://habitica.wikia.com/wiki/Class_System) и да използвате класово-специфични [умения](http://habitica.wikia.com/wiki/Skills) (нива 11 до 14);\n * Сформирайте група с приятелите си от [Група](/party), за да се държите отговорни взаимно и да получите свитък с мисия;\n * Побеждавайте чудовища и събирайте предмети от [мисии](http://habitica.wikia.com/wiki/Quests) (ще получите мисия, когато достигнете ниво 15).",
|
||||
"webStep3Text": "След като свикнете с нещата, ще можете да се забавлявате още повече с Хабитика, с тези интересни функционалности:\n * Организирайте задачите си с [етикети](http://habitica.wikia.com/wiki/Tags) (етикетите се добавят в прозорчето за редактиране на задача);\n * Персонализирайте [героя](http://habitica.wikia.com/wiki/Avatar) си, като натиснете потребителската иконка в горния десен ъгъл;\n * Купете си [екипировка](http://habitica.wikia.com/wiki/Equipment) от колоната с награди или от [магазините](<%= shopUrl %>) и екипирайте героя си с нея в [Инвентар > Екипировка](<%= equipUrl %>);\n * Свържете се с други потребители посредством [кръчмата](http://habitica.wikia.com/wiki/Tavern);\n * След като достигнете ниво 3, ще можете да излюпвате [любимци](http://habitica.wikia.com/wiki/Pets) като събирате [яйца](http://habitica.wikia.com/wiki/Eggs) и [излюпващи отвари](http://habitica.wikia.com/wiki/Hatching_Potions). [Хранете](http://habitica.wikia.com/wiki/Food) ги, за да се превърнат в [превози](http://habitica.wikia.com/wiki/Mounts);\n * След като достигнете ниво 10, ще можете да изберете [клас](http://habitica.wikia.com/wiki/Class_System) и да използвате класово-специфични [умения](http://habitica.wikia.com/wiki/Skills) (нива 11 до 14);\n * Сформирайте група с приятелите си от [Група](<%= partyUrl %>), за да се държите отговорни взаимно и да получите свитък с мисия;\n * Побеждавайте чудовища и събирайте предмети от [мисии](http://habitica.wikia.com/wiki/Quests) (ще получите мисия, когато достигнете ниво 15).",
|
||||
|
||||
"overviewQuestions": "Имате въпрос? Вижте нашите [ЧЗВ](/static/faq/)! Ако не намирате въпроса си там, можете да ни попитате за помощ в [Помощната гилдия на Хабитика](/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a).\n\nУспех със задачите Ви!"
|
||||
"overviewQuestions": "Имате въпрос? Вижте нашите [ЧЗВ](<%= faqUrl %>)! Ако не намирате въпроса си там, можете да ни попитате за помощ в [Помощната гилдия на Хабитика](<%= helpGuildUrl %>).\n\nУспех със задачите Ви!"
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
"hatchAPot": "Искате ли да излюпите <%= egg %> с <%= potion %>?",
|
||||
"hatchedPet": "Вие излюпихте <%= egg %> с <%= potion %>!",
|
||||
"hatchedPetGeneric": "Излюпихте нов любимец!",
|
||||
"hatchedPetHowToUse": "Посетете [конюшнята](/inventory/stable), за да нахраните и екипирате новия си любимец!",
|
||||
"hatchedPetHowToUse": "Посетете [конюшнята](<%= stableUrl %>), за да нахраните и екипирате новия си любимец!",
|
||||
"displayNow": "Показване сега",
|
||||
"displayLater": "Показване по-късно",
|
||||
"petNotOwned": "Не притежавате този любимец.",
|
||||
|
||||
@@ -626,5 +626,13 @@
|
||||
"questAlligatorDropAlligatorEgg": "Алигатор (яйце)",
|
||||
"questAlligatorUnlockText": "Отключва възможността за купуване на яйца на алигатор от пазара.",
|
||||
"oddballsText": "Пакет мисии „Странности“",
|
||||
"oddballsNotes": "Съдържа: „Желираният регент“, „Бягство от пещерното създание“ и „Омотана прежда“. Наличен до 30 ноември."
|
||||
"oddballsNotes": "Съдържа: „Желираният регент“, „Бягство от пещерното създание“ и „Омотана прежда“. Наличен до 3 декември.",
|
||||
"birdBuddiesText": "Пакет мисии „Птичи приятели“",
|
||||
"birdBuddiesNotes": "Съдържа: „Пернатият мраз“, „Петльова ярост“ и „Паунът Бутни-Дръпни“. Наличен до 31 декември.",
|
||||
"questVelociraptorText": "The Veloci-Rapper",
|
||||
"questVelociraptorNotes": "You’re sharing honey cakes with @*~Seraphina~*, @Procyon P, and @Lilith of Alfheim by a lake in the Stoïkalm Steppes. Suddenly, a mournful voice interrupts your picnic.<br><br><em>My Habits took a hit, I missed my Dailies,<br>I’m losing it, sinking with doubt and maybes,<br>At the top of my game I used to be so fly,<br>But now I just let my Due Dates go by.</em><br><br>@*~Seraphina~* peers behind a stand of grass. “It’s the Veloci-Rapper. It seems... distraught?”<br><br>You pump a fist in determination. “There's only one thing to do. Rap battle time!”",
|
||||
"questVelociraptorCompletion": "You burst through the grass, confronting the Veloci-Rapper.<br><br><em>See here, rapper, you’re no quitter,<br>You’re Bad Habits' hardest hitter!<br>Check off your To-Dos like a boss,<br>Don’t mourn over one day’s loss!</em><br><br>Filled with renewed confidence, it bounds off to freestyle another day, leaving behind three eggs where it sat.",
|
||||
"questVelociraptorBoss": "Veloci-Rapper",
|
||||
"questVelociraptorDropVelociraptorEgg": "Velociraptor (Egg)",
|
||||
"questVelociraptorUnlockText": "Unlocks purchasable Velociraptor eggs in the Market"
|
||||
}
|
||||