diff --git a/app/Model/Meta/PatreonPosts.js b/app/Model/Meta/PatreonPosts.js new file mode 100644 index 00000000..8cd96287 --- /dev/null +++ b/app/Model/Meta/PatreonPosts.js @@ -0,0 +1,26 @@ +PatreonPosts = new Mongo.Collection("patreonPosts"); + +Schemas.PatreonPosts = new SimpleSchema({ + link: { + type: String, + }, + dateAdded: { + type: Date, + autoValue(){ + return new Date(); + }, + }, +}); + +PatreonPosts.attachSchema(Schemas.PatreonPosts); + +PatreonPosts.allow({ + insert: function(userId, doc) { + var user = Meteor.users.findOne(userId); + if (user) return _.contains(user.roles, "admin"); + }, + remove: function(userId, doc) { + var user = Meteor.users.findOne(userId); + if (user) return _.contains(user.roles, "admin"); + }, +}); diff --git a/app/Model/Users/Users.js b/app/Model/Users/Users.js index 5f6b2a7e..6878df1d 100644 --- a/app/Model/Users/Users.js +++ b/app/Model/Users/Users.js @@ -70,6 +70,10 @@ Schemas.User = new SimpleSchema({ index: 1, optional: true, }, + lastPatreonPostClicked: { + type: String, + optional: true, + }, }); Meteor.users.attachSchema(Schemas.User); @@ -107,3 +111,11 @@ if (Meteor.isServer) Meteor.methods({ Meteor.users.update(this.userId, {$set: {apiKey}}); }, }); + +Meteor.methods({ + clickPatreonPost(link) { + Meteor.users.update(this.userId, {$set: { + lastPatreonPostClicked: link + }}); + }, +}); diff --git a/app/client/views/layout/layout.html b/app/client/views/layout/layout.html index 1997308d..50d6cb0c 100644 --- a/app/client/views/layout/layout.html +++ b/app/client/views/layout/layout.html @@ -51,9 +51,16 @@ Send Feedback - + - + + {{#if showPatreonBadge}} + + + {{/if}} Patreon diff --git a/app/client/views/layout/layout.js b/app/client/views/layout/layout.js index 0d24a237..f4937071 100644 --- a/app/client/views/layout/layout.js +++ b/app/client/views/layout/layout.js @@ -7,6 +7,16 @@ Template.appDrawer.helpers({ var user = Meteor.user(); return user.profile && user.profile.username || user.username || "My Account"; }, + showPatreonBadge: function(){ + let post = PatreonPosts.findOne({}, {sort: {date: -1}}); + let user = Meteor.user(); + if (!post || !user) return false; + return post.link !== user.lastPatreonPostClicked; + }, + patreonLink: function(){ + let post = PatreonPosts.findOne({}, {sort: {date: -1}}); + return (post && post.link) || 'https://www.patreon.com/dicecloud'; + }, }); let drawerLayout; @@ -37,6 +47,9 @@ Template.appDrawer.events({ closeDrawer(instance); }, "click .patreon": function(event, instance){ + let post = PatreonPosts.findOne({}, {sort: {date: -1}}); + let link = (post && post.link) || 'https://www.patreon.com/dicecloud'; + Meteor.call('clickPatreonPost', link); ga("send", "event", "externalLink", "patreon"); }, "click .github": function(event, instance){ diff --git a/app/config.vulcanize b/app/config.vulcanize index fbdd8a9c..01f1cbf9 100644 --- a/app/config.vulcanize +++ b/app/config.vulcanize @@ -2,13 +2,13 @@ "polyfill": "/components/webcomponentsjs/webcomponents.min.js", "useShadowDom": true, "imports": [ - "/components/app-layout/app-layout.html", - "/components/app-layout/app-layout.html", + "/components/app-layout/app-layout.html", + "/components/app-layout/app-layout.html", "/components/app-layout/app-scroll-effects/effects/waterfall.html", "/components/app-layout/app-scroll-effects/effects/parallax-background.html", "/components/app-layout/app-scroll-effects/effects/resize-title.html", - "/components/iron-collapse/iron-collapse.html", + "/components/iron-collapse/iron-collapse.html", "/components/iron-icon/iron-icon.html", "/components/iron-icons/av-icons.html", "/components/iron-icons/editor-icons.html", @@ -21,7 +21,8 @@ "/components/neon-animation/neon-animation.html", - "/components/paper-button/paper-button.html", + "/components/paper-button/paper-button.html", + "/components/paper-badge/paper-badge.html", "/components/paper-swatch-picker/paper-swatch-picker.html", "/components/paper-dialog/paper-dialog.html", "/components/paper-dropdown-menu/paper-dropdown-menu.html", diff --git a/app/package-lock.json b/app/package-lock.json index 3c606c15..b7b60acc 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -216,9 +216,9 @@ "integrity": "sha512-HfVRxhYG7C8Jl9FqtrlElMR2z/8YiLQVDKf67MLY25Ic+ILx3ecmklfT1v3u+7P5/4vEFjuxaAFXhr2/Afwk5g==" }, "file-saver": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.0.tgz", - "integrity": "sha512-cYM1ic5DAkg25pHKgi5f10ziAM7RJU37gaH1XQlyNDrtUnzhC/dfoV9zf2OmF0RMKi42jG5B0JWBnPQqyj/G6g==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.1.tgz", + "integrity": "sha512-dCB3K7/BvAcUmtmh1DzFdv0eXSVJ9IAFt1mw3XZfAexodNRoE29l3xB2EX4wH2q8m/UTzwzEPq/ArYk98kUkBQ==" }, "find-up": { "version": "2.1.0", diff --git a/app/package.json b/app/package.json index fbbadeae..29cbefcc 100644 --- a/app/package.json +++ b/app/package.json @@ -17,7 +17,7 @@ "bower": "^1.7.9", "core-js": "^2.5.7", "fibers": "^2.0.2", - "file-saver": "^2.0.0", + "file-saver": "^2.0.1", "meteor-node-stubs": "^0.3.3", "qrcode": "^1.3.0", "source-map-support": "^0.5.9", diff --git a/app/server/publications/user.js b/app/server/publications/user.js index 799539fd..ab979722 100644 --- a/app/server/publications/user.js +++ b/app/server/publications/user.js @@ -1,9 +1,13 @@ Meteor.publish("user", function(){ - return Meteor.users.find(this.userId, {fields: { - roles: 1, - username: 1, - profile: 1, - apiKey: 1, - librarySubscriptions: 1, - }}); + return [ + Meteor.users.find(this.userId, {fields: { + roles: 1, + username: 1, + profile: 1, + apiKey: 1, + librarySubscriptions: 1, + lastPatreonPostClicked: 1, + }}), + PatreonPosts.find({},{sort: {dateAdded: -1}, limit: 1}) + ]; });