From f4ee222e3c13caf51ad15d820a75665a3f1a51e3 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sun, 22 Apr 2018 09:10:10 -0500 Subject: make nsfw censor image configurable --- src/main.js | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/main.js') diff --git a/src/main.js b/src/main.js index 6f8c00f0..3d2bcbb0 100644 --- a/src/main.js +++ b/src/main.js @@ -96,6 +96,9 @@ window.fetch('/static/config.json') if (data['chatDisabled']) { store.dispatch('disableChat') } + if (data['nsfwCensorImage']) { + store.dispatch('setOption', { name: 'nsfwCensorImage', value: data['nsfwCensorImage'] }) + } const routes = [ { name: 'root', path: '/', redirect: data['defaultPath'] || '/main/all' }, -- cgit v1.2.3-70-g09d2 From 07f1b8523eddd596d154e68561a389d6b9742d95 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 7 Dec 2018 18:13:04 +0700 Subject: add subscribe module and fix race condition --- src/main.js | 4 +++- src/modules/subscribe.js | 21 +++++++++++++++++++++ src/modules/users.js | 5 +---- src/services/push/push.js | 8 ++++---- 4 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 src/modules/subscribe.js (limited to 'src/main.js') diff --git a/src/main.js b/src/main.js index 378fe95c..4285e70b 100644 --- a/src/main.js +++ b/src/main.js @@ -10,6 +10,7 @@ import apiModule from './modules/api.js' import configModule from './modules/config.js' import chatModule from './modules/chat.js' import oauthModule from './modules/oauth.js' +import subscribeModule from './modules/subscribe.js' import VueTimeago from 'vue-timeago' import VueI18n from 'vue-i18n' @@ -60,7 +61,8 @@ createPersistedState(persistedStateOptions).then((persistedState) => { api: apiModule, config: configModule, chat: chatModule, - oauth: oauthModule + oauth: oauthModule, + subscribe: subscribeModule }, plugins: [persistedState], strict: false // Socket modifies itself, let's ignore this for now. diff --git a/src/modules/subscribe.js b/src/modules/subscribe.js new file mode 100644 index 00000000..e705904c --- /dev/null +++ b/src/modules/subscribe.js @@ -0,0 +1,21 @@ +import registerPushNotifications from '../services/push/push.js' + +const subscribe = { + state: { + token: null, + vapidPublicKey: null + }, + mutations: { + setCurrentUser (state, user) { + state.token = user.credentials + if (state.token && state.vapidPublicKey) registerPushNotifications(this) + }, + setInstanceOption (state, { name, value }) { + if (name !== 'vapidPublicKey') return + state.vapidPublicKey = value + if (state.token && state.vapidPublicKey) registerPushNotifications(this) + } + } +} + +export default subscribe diff --git a/src/modules/users.js b/src/modules/users.js index d2c7fdf6..88ec7115 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -1,5 +1,4 @@ import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' -import registerPushNotifications from '../services/push/push.js' import { compact, map, each, merge } from 'lodash' import { set } from 'vue' @@ -120,10 +119,8 @@ const users = { }) // Fetch our friends - store.rootState.api.backendInteractor.fetchFriends({id: user.id}) + store.rootState.api.backendInteractor.fetchFriends({ id: user.id }) .then((friends) => commit('addNewUsers', friends)) - - registerPushNotifications(store) }) } else { // Authentication failed diff --git a/src/services/push/push.js b/src/services/push/push.js index ffab5918..923c2178 100644 --- a/src/services/push/push.js +++ b/src/services/push/push.js @@ -45,17 +45,17 @@ function askPermission () { } function subscribe (registration, store) { - if (!store.rootState.config.webPushNotifications) { + if (!store.state.config.webPushNotifications) { return Promise.reject(new Error('Web Push is disabled in config')) } - if (!store.rootState.instance.vapidPublicKey) { + if (!store.state.subscribe.vapidPublicKey) { return Promise.reject(new Error('VAPID public key is not found')) } const subscribeOptions = { userVisibleOnly: true, - applicationServerKey: urlBase64ToUint8Array(store.rootState.instance.vapidPublicKey) + applicationServerKey: urlBase64ToUint8Array(store.state.subscribe.vapidPublicKey) } return registration.pushManager.subscribe(subscribeOptions) } @@ -65,7 +65,7 @@ function sendSubscriptionToBackEnd (subscription, store) { method: 'POST', headers: { 'Content-Type': 'application/json', - 'Authorization': `Bearer ${store.rootState.oauth.token}` + 'Authorization': `Bearer ${store.state.subscribe.token}` }, body: JSON.stringify({ subscription, -- cgit v1.2.3-70-g09d2 From a85d128d3754c97c9124352863ab6bcafd42bf35 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 7 Dec 2018 18:53:40 +0700 Subject: Revert "add subscribe module and fix race condition" This reverts commit 07f1b8523eddd596d154e68561a389d6b9742d95. --- src/main.js | 4 +--- src/modules/subscribe.js | 21 --------------------- src/modules/users.js | 5 ++++- src/services/push/push.js | 8 ++++---- 4 files changed, 9 insertions(+), 29 deletions(-) delete mode 100644 src/modules/subscribe.js (limited to 'src/main.js') diff --git a/src/main.js b/src/main.js index 4285e70b..378fe95c 100644 --- a/src/main.js +++ b/src/main.js @@ -10,7 +10,6 @@ import apiModule from './modules/api.js' import configModule from './modules/config.js' import chatModule from './modules/chat.js' import oauthModule from './modules/oauth.js' -import subscribeModule from './modules/subscribe.js' import VueTimeago from 'vue-timeago' import VueI18n from 'vue-i18n' @@ -61,8 +60,7 @@ createPersistedState(persistedStateOptions).then((persistedState) => { api: apiModule, config: configModule, chat: chatModule, - oauth: oauthModule, - subscribe: subscribeModule + oauth: oauthModule }, plugins: [persistedState], strict: false // Socket modifies itself, let's ignore this for now. diff --git a/src/modules/subscribe.js b/src/modules/subscribe.js deleted file mode 100644 index e705904c..00000000 --- a/src/modules/subscribe.js +++ /dev/null @@ -1,21 +0,0 @@ -import registerPushNotifications from '../services/push/push.js' - -const subscribe = { - state: { - token: null, - vapidPublicKey: null - }, - mutations: { - setCurrentUser (state, user) { - state.token = user.credentials - if (state.token && state.vapidPublicKey) registerPushNotifications(this) - }, - setInstanceOption (state, { name, value }) { - if (name !== 'vapidPublicKey') return - state.vapidPublicKey = value - if (state.token && state.vapidPublicKey) registerPushNotifications(this) - } - } -} - -export default subscribe diff --git a/src/modules/users.js b/src/modules/users.js index 88ec7115..d2c7fdf6 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -1,4 +1,5 @@ import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' +import registerPushNotifications from '../services/push/push.js' import { compact, map, each, merge } from 'lodash' import { set } from 'vue' @@ -119,8 +120,10 @@ const users = { }) // Fetch our friends - store.rootState.api.backendInteractor.fetchFriends({ id: user.id }) + store.rootState.api.backendInteractor.fetchFriends({id: user.id}) .then((friends) => commit('addNewUsers', friends)) + + registerPushNotifications(store) }) } else { // Authentication failed diff --git a/src/services/push/push.js b/src/services/push/push.js index 923c2178..ffab5918 100644 --- a/src/services/push/push.js +++ b/src/services/push/push.js @@ -45,17 +45,17 @@ function askPermission () { } function subscribe (registration, store) { - if (!store.state.config.webPushNotifications) { + if (!store.rootState.config.webPushNotifications) { return Promise.reject(new Error('Web Push is disabled in config')) } - if (!store.state.subscribe.vapidPublicKey) { + if (!store.rootState.instance.vapidPublicKey) { return Promise.reject(new Error('VAPID public key is not found')) } const subscribeOptions = { userVisibleOnly: true, - applicationServerKey: urlBase64ToUint8Array(store.state.subscribe.vapidPublicKey) + applicationServerKey: urlBase64ToUint8Array(store.rootState.instance.vapidPublicKey) } return registration.pushManager.subscribe(subscribeOptions) } @@ -65,7 +65,7 @@ function sendSubscriptionToBackEnd (subscription, store) { method: 'POST', headers: { 'Content-Type': 'application/json', - 'Authorization': `Bearer ${store.state.subscribe.token}` + 'Authorization': `Bearer ${store.rootState.oauth.token}` }, body: JSON.stringify({ subscription, -- cgit v1.2.3-70-g09d2 From 11716a7a5381c8f4fe06c869a4a21c52a2120e6c Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 7 Dec 2018 20:13:36 +0700 Subject: second attempt to add subscribe module and fix race condition --- src/main.js | 6 ++++-- src/modules/pushNotifications.js | 29 +++++++++++++++++++++++++++++ src/modules/users.js | 8 ++++---- 3 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 src/modules/pushNotifications.js (limited to 'src/main.js') diff --git a/src/main.js b/src/main.js index 378fe95c..91592191 100644 --- a/src/main.js +++ b/src/main.js @@ -10,6 +10,7 @@ import apiModule from './modules/api.js' import configModule from './modules/config.js' import chatModule from './modules/chat.js' import oauthModule from './modules/oauth.js' +import pushNotificationsModule from './modules/pushNotifications.js' import VueTimeago from 'vue-timeago' import VueI18n from 'vue-i18n' @@ -60,12 +61,13 @@ createPersistedState(persistedStateOptions).then((persistedState) => { api: apiModule, config: configModule, chat: chatModule, - oauth: oauthModule + oauth: oauthModule, + pushNotifications: pushNotificationsModule }, plugins: [persistedState], strict: false // Socket modifies itself, let's ignore this for now. // strict: process.env.NODE_ENV !== 'production' }) - afterStoreSetup({store, i18n}) + afterStoreSetup({ store, i18n }) }) diff --git a/src/modules/pushNotifications.js b/src/modules/pushNotifications.js new file mode 100644 index 00000000..43143b1f --- /dev/null +++ b/src/modules/pushNotifications.js @@ -0,0 +1,29 @@ +import registerPushNotifications from '../services/push/push.js' + +const subscribe = { + state: { + token: null, + vapidPublicKey: null + }, + mutations: { + setApiToken (state, user) { + state.token = user.credentials + }, + setVapidPublicKey (state, vapidPublicKey) { + state.vapidPublicKey = vapidPublicKey + } + + }, + actions: { + setInstanceOption (store, { name, value }) { + store.commit('setVapidPublicKey', value) + if (store.state.token) registerPushNotifications(this) + }, + setCurrentUser (store, user) { + store.commit('setApiToken', user.credentials) + if (store.state.vapidPublicKey) registerPushNotifications(this) + } + } +} + +export default subscribe diff --git a/src/modules/users.js b/src/modules/users.js index d2c7fdf6..1256e9df 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -1,5 +1,4 @@ import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' -import registerPushNotifications from '../services/push/push.js' import { compact, map, each, merge } from 'lodash' import { set } from 'vue' @@ -87,6 +86,9 @@ const users = { store.dispatch('stopFetching', 'friends') store.commit('setBackendInteractor', backendInteractorService()) }, + setCurrentUser (store, user) { + store.commit('setCurrentUser', user) + }, loginUser (store, accessToken) { return new Promise((resolve, reject) => { const commit = store.commit @@ -98,7 +100,7 @@ const users = { .then((user) => { // user.credentials = userCredentials user.credentials = accessToken - commit('setCurrentUser', user) + store.dispatch('setCurrentUser', user) commit('addNewUsers', [user]) // Set our new backend interactor @@ -122,8 +124,6 @@ const users = { // Fetch our friends store.rootState.api.backendInteractor.fetchFriends({id: user.id}) .then((friends) => commit('addNewUsers', friends)) - - registerPushNotifications(store) }) } else { // Authentication failed -- cgit v1.2.3-70-g09d2 From ee70ec4c7efb49c08f0a76b6b2694c0e9910978c Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Mon, 10 Dec 2018 22:36:25 +0700 Subject: fix race condition --- src/boot/after_store.js | 5 ++++- src/main.js | 11 ++++++++--- src/modules/pushNotifications.js | 36 ------------------------------------ src/modules/users.js | 13 +++++++++---- 4 files changed, 21 insertions(+), 44 deletions(-) delete mode 100644 src/modules/pushNotifications.js (limited to 'src/main.js') diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 0c121fe2..0d1cabd5 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -27,7 +27,10 @@ const afterStoreSetup = ({ store, i18n }) => { store.dispatch('setInstanceOption', { name: 'registrationOpen', value: (registrationClosed === '0') }) store.dispatch('setInstanceOption', { name: 'textlimit', value: parseInt(textlimit) }) store.dispatch('setInstanceOption', { name: 'server', value: server }) - store.dispatch('setInstanceOption', { name: 'vapidPublicKey', value: vapidPublicKey }) + + if (vapidPublicKey) { + store.dispatch('setInstanceOption', { name: 'vapidPublicKey', value: vapidPublicKey }) + } var apiConfig = data.site.pleromafe diff --git a/src/main.js b/src/main.js index 91592191..e4621482 100644 --- a/src/main.js +++ b/src/main.js @@ -10,7 +10,6 @@ import apiModule from './modules/api.js' import configModule from './modules/config.js' import chatModule from './modules/chat.js' import oauthModule from './modules/oauth.js' -import pushNotificationsModule from './modules/pushNotifications.js' import VueTimeago from 'vue-timeago' import VueI18n from 'vue-i18n' @@ -61,13 +60,19 @@ createPersistedState(persistedStateOptions).then((persistedState) => { api: apiModule, config: configModule, chat: chatModule, - oauth: oauthModule, - pushNotifications: pushNotificationsModule + oauth: oauthModule }, plugins: [persistedState], strict: false // Socket modifies itself, let's ignore this for now. // strict: process.env.NODE_ENV !== 'production' }) + store.subscribe((mutation, state) => { + if ((mutation.type === 'setCurrentUser' && state.instance.vapidPublicKey) || // Login + existing key + (mutation.type === 'setInstanceOption' && mutation.payload.name === 'vapidPublicKey' && state.users.currentUser)) { // Logged in, key arrives late + store.dispatch('registerPushNotifications') + } + }) + afterStoreSetup({ store, i18n }) }) diff --git a/src/modules/pushNotifications.js b/src/modules/pushNotifications.js deleted file mode 100644 index ea92f811..00000000 --- a/src/modules/pushNotifications.js +++ /dev/null @@ -1,36 +0,0 @@ -import registerPushNotifications from '../services/push/push.js' - -const subscribe = { - state: { - token: null, - vapidPublicKey: null - }, - mutations: { - setApiToken (state, user) { - state.token = user.credentials - }, - setVapidPublicKey (state, vapidPublicKey) { - state.vapidPublicKey = vapidPublicKey - } - }, - actions: { - setInstanceOption (store, { name, value }) { - if (name === 'vapidPublicKey') { - store.commit('setVapidPublicKey', value) - - if (store.state.token) { - registerPushNotifications(store.rootState.config.webPushNotifications, value, store.state.token) - } - } - }, - setCurrentUser (store, user) { - store.commit('setApiToken', user.credentials) - - if (store.state.vapidPublicKey) { - registerPushNotifications(store.rootState.config.webPushNotifications, store.state.vapidPublicKey, user.credentials) - } - } - } -} - -export default subscribe diff --git a/src/modules/users.js b/src/modules/users.js index 1256e9df..5e0c087d 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -1,6 +1,7 @@ import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' import { compact, map, each, merge } from 'lodash' import { set } from 'vue' +import registerPushNotifications from '../services/push/push.js' // TODO: Unify with mergeOrAdd in statuses.js export const mergeOrAdd = (arr, obj, item) => { @@ -65,6 +66,13 @@ const users = { store.rootState.api.backendInteractor.fetchUser({id}) .then((user) => store.commit('addNewUsers', user)) }, + registerPushNotifications (store) { + const token = store.state.currentUser.credentials + const vapidPublicKey = store.rootState.instance.vapidPublicKey + const isEnabled = store.rootState.config.webPushNotifications + + registerPushNotifications(isEnabled, vapidPublicKey, token) + }, addNewStatuses (store, { statuses }) { const users = map(statuses, 'user') const retweetedUsers = compact(map(statuses, 'retweeted_status.user')) @@ -86,9 +94,6 @@ const users = { store.dispatch('stopFetching', 'friends') store.commit('setBackendInteractor', backendInteractorService()) }, - setCurrentUser (store, user) { - store.commit('setCurrentUser', user) - }, loginUser (store, accessToken) { return new Promise((resolve, reject) => { const commit = store.commit @@ -100,7 +105,7 @@ const users = { .then((user) => { // user.credentials = userCredentials user.credentials = accessToken - store.dispatch('setCurrentUser', user) + commit('setCurrentUser', user) commit('addNewUsers', [user]) // Set our new backend interactor -- cgit v1.2.3-70-g09d2 From b839ba7870c2872607ebf3ae41a8c08f17a7dde7 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 11 Dec 2018 18:45:25 +0300 Subject: Quality of Frontend Developer's Life: here to stay --- README.md | 9 +++++++++ build/webpack.dev.conf.js | 4 +++- build/webpack.prod.conf.js | 12 +++++++++--- config/index.js | 19 +++++++++++++++---- src/boot/after_store.js | 11 ++++++++++- src/main.js | 6 ++++++ 6 files changed, 52 insertions(+), 9 deletions(-) (limited to 'src/main.js') diff --git a/README.md b/README.md index b6e5a586..181b6a0d 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,15 @@ npm run build npm run unit ``` +# For Contributors: + +You can create file `/config/local.json` (see [example](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/config/local.example.json)) to enable some convenience dev options: + +* `target`: makes local dev server redirect to some existing instance's BE instead of local BE, useful for testing things in near-production environment and searching for real-life use-cases. +* `staticConfigPreference`: makes FE's `/static/config.json` take preference of BE-served `/api/statusnet/config.json`. Only works in dev mode. + +FE Build process also leaves current commit hash in global variable `___pleromafe_commit_hash` so that you can easily see which pleroma-fe commit instance is running, also helps pinpointing which commit was used when FE was bundled into BE. + # Configuration Edit config.json for configuration. scopeOptionsEnabled gives you input fields for CWs and the scope settings. diff --git a/build/webpack.dev.conf.js b/build/webpack.dev.conf.js index 7e1a104f..9f34619c 100644 --- a/build/webpack.dev.conf.js +++ b/build/webpack.dev.conf.js @@ -18,7 +18,9 @@ module.exports = merge(baseWebpackConfig, { devtool: '#eval-source-map', plugins: [ new webpack.DefinePlugin({ - 'process.env': config.dev.env + 'process.env': config.dev.env, + 'COMMIT_HASH': JSON.stringify('DEV'), + 'DEV_OVERRIDES': JSON.stringify(config.dev.settings) }), // https://github.com/glenjamin/webpack-hot-middleware#installation--usage new webpack.optimize.OccurenceOrderPlugin(), diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js index 6119f700..b2c87e6c 100644 --- a/build/webpack.prod.conf.js +++ b/build/webpack.prod.conf.js @@ -7,8 +7,13 @@ var baseWebpackConfig = require('./webpack.base.conf') var ExtractTextPlugin = require('extract-text-webpack-plugin') var HtmlWebpackPlugin = require('html-webpack-plugin') var env = process.env.NODE_ENV === 'testing' - ? require('../config/test.env') - : config.build.env + ? require('../config/test.env') + : config.build.env + +let commitHash = require('child_process') + .execSync('git rev-parse --short HEAD') + .toString(); +console.log(commitHash) var webpackConfig = merge(baseWebpackConfig, { module: { @@ -29,7 +34,8 @@ var webpackConfig = merge(baseWebpackConfig, { plugins: [ // http://vuejs.github.io/vue-loader/workflow/production.html new webpack.DefinePlugin({ - 'process.env': env + 'process.env': env, + 'COMMIT_HASH': JSON.stringify(commitHash) }), new webpack.optimize.UglifyJsPlugin({ compress: { diff --git a/config/index.js b/config/index.js index 7b0ef26c..56fa5940 100644 --- a/config/index.js +++ b/config/index.js @@ -1,5 +1,15 @@ // see http://vuejs-templates.github.io/webpack for documentation. -var path = require('path') +const path = require('path') +let settings = {} +try { + settings = require('./local.json') + console.log('Using local dev server settings (/config/local.json):') + console.log(JSON.stringify(settings, null, 2)) +} catch (e) { + console.log('Local dev server settings not found (/config/local.json)') +} + +const target = settings.target || 'http://localhost:4000/' module.exports = { build: { @@ -19,21 +29,22 @@ module.exports = { dev: { env: require('./dev.env'), port: 8080, + settings, assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: { '/api': { - target: 'http://localhost:4000/', + target, changeOrigin: true, cookieDomainRewrite: 'localhost' }, '/nodeinfo': { - target: 'http://localhost:4000/', + target, changeOrigin: true, cookieDomainRewrite: 'localhost' }, '/socket': { - target: 'http://localhost:4000/', + target, changeOrigin: true, cookieDomainRewrite: 'localhost', ws: true diff --git a/src/boot/after_store.js b/src/boot/after_store.js index a80baaf5..9ce2d7ed 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -38,8 +38,17 @@ const afterStoreSetup = ({store, i18n}) => { return {} }) .then((staticConfig) => { + const overrides = window.___pleromafe_dev_overrides || {} + const env = window.___pleromafe_mode.NODE_ENV + // This takes static config and overrides properties that are present in apiConfig - var config = Object.assign({}, staticConfig, apiConfig) + let config = {} + if (overrides.staticConfigPreference && env === 'DEV') { + console.warn('OVERRIDING API CONFIG WITH STATIC CONFIG') + config = Object.assign({}, apiConfig, staticConfig) + } else { + config = Object.assign({}, staticConfig, apiConfig) + } var theme = (config.theme) var background = (config.background) diff --git a/src/main.js b/src/main.js index 378fe95c..7f3746c8 100644 --- a/src/main.js +++ b/src/main.js @@ -69,3 +69,9 @@ createPersistedState(persistedStateOptions).then((persistedState) => { afterStoreSetup({store, i18n}) }) + +// These are inlined by webpack's DefinePlugin +/* eslint-disable */ +window.___pleromafe_mode = process.env +window.___pleromafe_commit_hash = COMMIT_HASH +window.___pleromafe_dev_overrides = DEV_OVERRIDES -- cgit v1.2.3-70-g09d2 From b3455649c53034e01725977260e69cff59c47e87 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 13 Dec 2018 18:04:09 +0700 Subject: improve notification subscription --- src/main.js | 35 +++++++++++++++++++++++++++-------- src/modules/interface.js | 11 +++++++++-- src/modules/users.js | 11 +++++++++++ src/services/push/push.js | 25 +++---------------------- 4 files changed, 50 insertions(+), 32 deletions(-) (limited to 'src/main.js') diff --git a/src/main.js b/src/main.js index e4621482..23ea854b 100644 --- a/src/main.js +++ b/src/main.js @@ -50,6 +50,32 @@ const persistedStateOptions = { 'oauth' ] } + +const registerPushNotifications = store => { + store.subscribe((mutation, state) => { + const vapidPublicKey = state.instance.vapidPublicKey + const permission = state.interface.notificationPermission === 'granted' + const isUserMutation = mutation.type === 'setCurrentUser' + + if (isUserMutation && vapidPublicKey && permission) { + return store.dispatch('registerPushNotifications') + } + + const user = state.users.currentUser + const isVapidMutation = mutation.type === 'setInstanceOption' && mutation.payload.name === 'vapidPublicKey' + + if (isVapidMutation && user && permission) { + return store.dispatch('registerPushNotifications') + } + + const isPermMutation = mutation.type === 'setNotificationPermission' && mutation.payload === 'granted' + + if (isPermMutation && user && vapidPublicKey) { + return store.dispatch('registerPushNotifications') + } + }) +} + createPersistedState(persistedStateOptions).then((persistedState) => { const store = new Vuex.Store({ modules: { @@ -62,17 +88,10 @@ createPersistedState(persistedStateOptions).then((persistedState) => { chat: chatModule, oauth: oauthModule }, - plugins: [persistedState], + plugins: [persistedState, registerPushNotifications], strict: false // Socket modifies itself, let's ignore this for now. // strict: process.env.NODE_ENV !== 'production' }) - store.subscribe((mutation, state) => { - if ((mutation.type === 'setCurrentUser' && state.instance.vapidPublicKey) || // Login + existing key - (mutation.type === 'setInstanceOption' && mutation.payload.name === 'vapidPublicKey' && state.users.currentUser)) { // Logged in, key arrives late - store.dispatch('registerPushNotifications') - } - }) - afterStoreSetup({ store, i18n }) }) diff --git a/src/modules/interface.js b/src/modules/interface.js index 07489685..5abc2c81 100644 --- a/src/modules/interface.js +++ b/src/modules/interface.js @@ -3,7 +3,8 @@ import { set, delete as del } from 'vue' const defaultState = { settings: { currentSaveStateNotice: null, - noticeClearTimeout: null + noticeClearTimeout: null, + notificationPermission: null } } @@ -17,10 +18,13 @@ const interfaceMod = { } set(state.settings, 'currentSaveStateNotice', { error: false, data: success }) set(state.settings, 'noticeClearTimeout', - setTimeout(() => del(state.settings, 'currentSaveStateNotice'), 2000)) + setTimeout(() => del(state.settings, 'currentSaveStateNotice'), 2000)) } else { set(state.settings, 'currentSaveStateNotice', { error: true, errorData: error }) } + }, + setNotificationPermission (state, permission) { + state.notificationPermission = permission } }, actions: { @@ -29,6 +33,9 @@ const interfaceMod = { }, settingsSaved ({ commit, dispatch }, { success, error }) { commit('settingsSaved', { success, error }) + }, + setNotificationPermission ({ commit }, permission) { + commit('setNotificationPermission', permission) } } } diff --git a/src/modules/users.js b/src/modules/users.js index 5e0c087d..e4fa472d 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -19,6 +19,14 @@ export const mergeOrAdd = (arr, obj, item) => { } } +const getNotificationPermission = () => { + const Notification = window.Notification + + if (!Notification) return Promise.resolve(null) + if (Notification.permission === 'default') return Notification.requestPermission() + return Promise.resolve(Notification.permission) +} + export const mutations = { setMuted (state, { user: {id}, muted }) { const user = state.usersObject[id] @@ -108,6 +116,9 @@ const users = { commit('setCurrentUser', user) commit('addNewUsers', [user]) + getNotificationPermission() + .then(permission => commit('setNotificationPermission', permission)) + // Set our new backend interactor commit('setBackendInteractor', backendInteractorService(accessToken)) diff --git a/src/services/push/push.js b/src/services/push/push.js index 58017ed7..1ac304d1 100644 --- a/src/services/push/push.js +++ b/src/services/push/push.js @@ -19,22 +19,6 @@ function registerServiceWorker () { .catch((err) => console.error('Unable to register service worker.', err)) } -function askPermission () { - return new Promise((resolve, reject) => { - const Notification = window.Notification - - if (!Notification) return reject(new Error('Notifications disabled')) - if (Notification.permission !== 'default') return resolve(Notification.permission) - - const permissionResult = Notification.requestPermission(resolve) - - if (permissionResult) permissionResult.then(resolve, reject) - }).then((permissionResult) => { - if (permissionResult !== 'granted') throw new Error('We weren\'t granted permission.') - return permissionResult - }) -} - function subscribe (registration, isEnabled, vapidPublicKey) { if (!isEnabled) return Promise.reject(new Error('Web Push is disabled in config')) if (!vapidPublicKey) return Promise.reject(new Error('VAPID public key is not found')) @@ -78,11 +62,8 @@ function sendSubscriptionToBackEnd (subscription, token) { export default function registerPushNotifications (isEnabled, vapidPublicKey, token) { if (isPushSupported()) { registerServiceWorker() - .then((registration) => { - return askPermission() - .then(() => subscribe(registration, isEnabled, vapidPublicKey)) - .then((subscription) => sendSubscriptionToBackEnd(subscription, token)) - .catch((e) => console.warn(`Failed to setup Web Push Notifications: ${e.message}`)) - }) + .then((registration) => subscribe(registration, isEnabled, vapidPublicKey)) + .then((subscription) => sendSubscriptionToBackEnd(subscription, token)) + .catch((e) => console.warn(`Failed to setup Web Push Notifications: ${e.message}`)) } } -- cgit v1.2.3-70-g09d2 From f87001c22f8c85bddb78c975f0bc22b8bfdcd27c Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 13 Dec 2018 20:25:46 +0300 Subject: fix old MR --- src/boot/after_store.js | 4 ++++ src/main.js | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/main.js') diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 07337595..a8594a64 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -28,6 +28,10 @@ const afterStoreSetup = ({ store, i18n }) => { store.dispatch('setInstanceOption', { name: 'textlimit', value: parseInt(textlimit) }) store.dispatch('setInstanceOption', { name: 'server', value: server }) + if (data.nsfwCensorImage) { + store.dispatch('setInstanceOption', { name: 'nsfwCensorImage', value: data.nsfwCensorImage }) + } + if (vapidPublicKey) { store.dispatch('setInstanceOption', { name: 'vapidPublicKey', value: vapidPublicKey }) } diff --git a/src/main.js b/src/main.js index 6ce2df13..bf92e78e 100644 --- a/src/main.js +++ b/src/main.js @@ -60,9 +60,6 @@ const registerPushNotifications = store => { if (isUserMutation && vapidPublicKey && permission) { return store.dispatch('registerPushNotifications') } - if (data['nsfwCensorImage']) { - store.dispatch('setOption', { name: 'nsfwCensorImage', value: data['nsfwCensorImage'] }) - } const user = state.users.currentUser const isVapidMutation = mutation.type === 'setInstanceOption' && mutation.payload.name === 'vapidPublicKey' -- cgit v1.2.3-70-g09d2