From 8cbfec25b322dd45c7b39efe0f0473e5b5e7d4a5 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 22 Jun 2020 13:22:53 +0200 Subject: [PATCH] Added the setting to swap ability scores and modifiers to the account page --- app/imports/api/users/Users.js | 39 +++++++++++++++++++ app/imports/server/publications/users.js | 1 + app/imports/ui/pages/Account.vue | 25 ++++++++++-- .../components/attributes/AbilityListTile.vue | 24 ++++++++++-- 4 files changed, 82 insertions(+), 7 deletions(-) diff --git a/app/imports/api/users/Users.js b/app/imports/api/users/Users.js index 54789917..70242af7 100644 --- a/app/imports/api/users/Users.js +++ b/app/imports/api/users/Users.js @@ -83,6 +83,15 @@ const userSchema = new SimpleSchema({ blackbox: true, optional: true, }, + preferences: { + type: Object, + optional: true, + defaultValue: {}, + }, + 'preferences.swapAbilityScoresAndModifiers': { + type: Boolean, + optional: true, + }, }); Meteor.users.attachSchema(userSchema); @@ -192,6 +201,36 @@ Meteor.users.setUsername = new ValidatedMethod({ } }); +Meteor.users.setPreference = new ValidatedMethod({ + name: 'users.setPreference', + validate: new SimpleSchema({ + preference:{ + type: String, + }, + value: { + type: SimpleSchema.oneOf(Boolean), + }, + }).validator(), + mixins: [RateLimiterMixin], + rateLimit: { + numRequests: 5, + timeInterval: 5000, + }, + run({preference, value}){ + if (!this.userId) throw 'You can only set preferences once logged in'; + let prefPath = `preferences.${preference}` + if (value == true){ + return Meteor.users.update(this.userId, { + $set: {[prefPath]: true}, + }); + } else { + return Meteor.users.update(this.userId, { + $unset: {[prefPath]: 1}, + }); + } + }, +}); + Meteor.users.subscribeToLibrary = new ValidatedMethod({ name: 'users.subscribeToLibrary', validate: new SimpleSchema({ diff --git a/app/imports/server/publications/users.js b/app/imports/server/publications/users.js index ac8e272d..c3e0c101 100644 --- a/app/imports/server/publications/users.js +++ b/app/imports/server/publications/users.js @@ -11,6 +11,7 @@ Meteor.publish('user', function(){ darkMode: 1, subscribedLibraries: 1, profile: 1, + preferences: 1, 'services.patreon.id': 1, 'services.patreon.entitledCents': 1, 'services.patreon.entitledCentsOverride': 1, diff --git a/app/imports/ui/pages/Account.vue b/app/imports/ui/pages/Account.vue index 35b91ab7..3187a1ed 100644 --- a/app/imports/ui/pages/Account.vue +++ b/app/imports/ui/pages/Account.vue @@ -6,12 +6,23 @@ > - + + + Username @@ -186,8 +197,14 @@ Meteor.logout(); router.push('/'); }, - setDarkMode(value){ - Meteor.users.setDarkMode.call({darkMode: !!value}); + setDarkMode(value, ack){ + Meteor.users.setDarkMode.call({darkMode: !!value}, ack); + }, + swapAbilityScoresAndModifiers(value, ack){ + Meteor.users.setPreference.call({ + preference: 'swapAbilityScoresAndModifiers', + value: !!value, + }, ack); }, generateKey(){ Meteor.users.gnerateApiKey.call(error => { diff --git a/app/imports/ui/properties/components/attributes/AbilityListTile.vue b/app/imports/ui/properties/components/attributes/AbilityListTile.vue index 562db6e8..5fedfbe5 100644 --- a/app/imports/ui/properties/components/attributes/AbilityListTile.vue +++ b/app/imports/ui/properties/components/attributes/AbilityListTile.vue @@ -5,10 +5,20 @@ >
- {{ numberToSignedString(model.modifier) }} + +
- {{ model.value }} + +
@@ -36,7 +46,15 @@ export default { click(e){ this.$emit('click', e); }, - } + }, + meteor: { + swapScoresAndMods(){ + let user = Meteor.user(); + return user && + user.preferences && + user.preferences.swapAbilityScoresAndModifiers; + } + } }