main.js
This commit is contained in:
parent
69656e0181
commit
c9dede920e
4 changed files with 133 additions and 26 deletions
14
src/lib/language.js
Normal file
14
src/lib/language.js
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
import { useI18nStore } from 'src/stores/i18n.js'
|
||||||
|
|
||||||
|
export const piniaLanguagePlugin = ({ store, options }) => {
|
||||||
|
if (store.$id === 'sync_config') {
|
||||||
|
store.$onAction(({ name, args }) => {
|
||||||
|
if (name === 'setPreference') {
|
||||||
|
const { path, value } = args[0]
|
||||||
|
if (path === 'simple.interfaceLanguage') {
|
||||||
|
useI18nStore().setLanguage(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,37 +1,92 @@
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
import { useInterfaceStore } from 'src/stores/interface.js'
|
import { useInterfaceStore } from 'src/stores/interface.js'
|
||||||
|
import { useSyncConfigStore } from 'src/stores/sync_config.js'
|
||||||
|
|
||||||
export default (store) => {
|
export const piniaPushNotificationsPlugin = ({ store }) => {
|
||||||
|
if (
|
||||||
|
store.$id !== 'sync_config' &&
|
||||||
|
store.$id !== 'instance' &&
|
||||||
|
store.$id !== 'interface'
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
store.$onAction(({ name: actionName, args }) => {
|
||||||
|
if (
|
||||||
|
store.$id === 'interface' &&
|
||||||
|
actionName !== 'setNotificationPermission' &&
|
||||||
|
actionName !== 'setLoginStatus'
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
// Initial state
|
||||||
|
let vapidPublicKey = useInstanceStore().vapidPublicKey
|
||||||
|
let enabled = useSyncConfigStore().mergedConfig.webPushNotifications
|
||||||
|
let permissionGranted =
|
||||||
|
useInterfaceStore().notificationPermission === 'granted'
|
||||||
|
let permissionPresent =
|
||||||
|
useInterfaceStore().notificationPermission !== undefined
|
||||||
|
let user = !!window.vuex.state.users.currentUser
|
||||||
|
|
||||||
|
if (store.$id === 'instance') {
|
||||||
|
if (actionName === 'set' && args[0].path === 'vapidPublicKey') {
|
||||||
|
const { value } = args[0]
|
||||||
|
vapidPublicKey = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!vapidPublicKey || !permissionPresent) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (store.$id === 'interface') {
|
||||||
|
if (actionName === 'setNotificationPermission') {
|
||||||
|
permissionGranted = args[0] === 'granted'
|
||||||
|
} else if (actionName === 'setLoginStatus') {
|
||||||
|
user = args[0]
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if (store.$id === 'sync_config') {
|
||||||
|
if (
|
||||||
|
actionName === 'setPreference' &&
|
||||||
|
args[0].path === 'simple.webPushNotifications'
|
||||||
|
) {
|
||||||
|
const { value } = args[0]
|
||||||
|
enabled = value
|
||||||
|
} else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (permissionGranted && enabled && user) {
|
||||||
|
return window.vuex.dispatch('registerPushNotifications')
|
||||||
|
} else {
|
||||||
|
return window.vuex.dispatch('unregisterPushNotifications')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const vuexPushNotificationsPlugin = (store) => {
|
||||||
store.subscribe((mutation, state) => {
|
store.subscribe((mutation, state) => {
|
||||||
|
// Initial state
|
||||||
const vapidPublicKey = useInstanceStore().vapidPublicKey
|
const vapidPublicKey = useInstanceStore().vapidPublicKey
|
||||||
const webPushNotification = state.config.webPushNotifications
|
const enabled = useSyncConfigStore().mergedConfig.webPushNotifications
|
||||||
const permission = useInterfaceStore().notificationPermission === 'granted'
|
const permissionGranted =
|
||||||
|
useInterfaceStore().notificationPermission === 'granted'
|
||||||
|
const permissionPresent =
|
||||||
|
useInterfaceStore().notificationPermission !== undefined
|
||||||
const user = state.users.currentUser
|
const user = state.users.currentUser
|
||||||
|
|
||||||
const isUserMutation = mutation.type === 'setCurrentUser'
|
if (!permissionPresent || !vapidPublicKey) return
|
||||||
const isVapidMutation =
|
|
||||||
mutation.type === 'setInstanceOption' &&
|
|
||||||
mutation.payload.name === 'vapidPublicKey'
|
|
||||||
const isPermMutation =
|
|
||||||
mutation.type === 'setNotificationPermission' &&
|
|
||||||
mutation.payload === 'granted'
|
|
||||||
const isUserConfigMutation =
|
|
||||||
mutation.type === 'setOption' &&
|
|
||||||
mutation.payload.name === 'webPushNotifications'
|
|
||||||
const isVisibilityMutation =
|
|
||||||
mutation.type === 'setOption' &&
|
|
||||||
mutation.payload.name === 'notificationVisibility'
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
isUserMutation ||
|
mutation.type === 'setCurrentUser' ||
|
||||||
isVapidMutation ||
|
mutation.type === 'clearCurrentUser'
|
||||||
isPermMutation ||
|
|
||||||
isUserConfigMutation ||
|
|
||||||
isVisibilityMutation
|
|
||||||
) {
|
) {
|
||||||
if (user && vapidPublicKey && permission && webPushNotification) {
|
console.log(!!user, permissionGranted, enabled)
|
||||||
|
if (user && permissionGranted && enabled) {
|
||||||
return store.dispatch('registerPushNotifications')
|
return store.dispatch('registerPushNotifications')
|
||||||
} else if (isUserConfigMutation && !webPushNotification) {
|
} else {
|
||||||
return store.dispatch('unregisterPushNotifications')
|
return store.dispatch('unregisterPushNotifications')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
29
src/lib/style.js
Normal file
29
src/lib/style.js
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
import { applyStyleConfig } from 'src/services/style_setter/style_setter.js'
|
||||||
|
|
||||||
|
const APPEARANCE_SETTINGS_KEYS = new Set(
|
||||||
|
[
|
||||||
|
'sidebarColumnWidth',
|
||||||
|
'contentColumnWidth',
|
||||||
|
'notifsColumnWidth',
|
||||||
|
'themeEditorMinWidth',
|
||||||
|
'textSize',
|
||||||
|
'navbarSize',
|
||||||
|
'panelHeaderSize',
|
||||||
|
'forcedRoundness',
|
||||||
|
'emojiSize',
|
||||||
|
'emojiReactionsScale',
|
||||||
|
].map((x) => 'simple.' + x),
|
||||||
|
)
|
||||||
|
|
||||||
|
export const piniaStylePlugin = ({ store, options }) => {
|
||||||
|
if (store.$id === 'sync_config') {
|
||||||
|
store.$onAction(({ name, args, after }) => {
|
||||||
|
if (name === 'setPreference') {
|
||||||
|
const { path } = args[0]
|
||||||
|
if (APPEARANCE_SETTINGS_KEYS.has(path)) {
|
||||||
|
after(() => applyStyleConfig(store.mergedConfig))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
15
src/main.js
15
src/main.js
|
|
@ -20,9 +20,15 @@ import messages from './i18n/messages.js'
|
||||||
import createPersistedState, {
|
import createPersistedState, {
|
||||||
piniaPersistPlugin,
|
piniaPersistPlugin,
|
||||||
} from './lib/persisted_state.js'
|
} from './lib/persisted_state.js'
|
||||||
import pushNotifications from './lib/push_notifications_plugin.js'
|
import {
|
||||||
|
piniaPushNotificationsPlugin,
|
||||||
|
vuexPushNotificationsPlugin,
|
||||||
|
} from './lib/push_notifications_plugin.js'
|
||||||
import vuexModules from './modules/index.js'
|
import vuexModules from './modules/index.js'
|
||||||
|
|
||||||
|
import { piniaLanguagePlugin } from 'src/lib/language.js'
|
||||||
|
import { piniaStylePlugin } from 'src/lib/style.js'
|
||||||
|
|
||||||
const currentLocale = (window.navigator.language || 'en').split('-')[0]
|
const currentLocale = (window.navigator.language || 'en').split('-')[0]
|
||||||
|
|
||||||
const i18n = createI18n({
|
const i18n = createI18n({
|
||||||
|
|
@ -35,7 +41,7 @@ const i18n = createI18n({
|
||||||
messages.setLanguage(i18n.global, currentLocale)
|
messages.setLanguage(i18n.global, currentLocale)
|
||||||
|
|
||||||
const persistedStateOptions = {
|
const persistedStateOptions = {
|
||||||
paths: ['serverSideStorage.cache', 'config', 'users.lastLoginName', 'oauth'],
|
paths: ['syncConfig.cache', 'config', 'users.lastLoginName', 'oauth'],
|
||||||
}
|
}
|
||||||
|
|
||||||
;(async () => {
|
;(async () => {
|
||||||
|
|
@ -66,9 +72,12 @@ const persistedStateOptions = {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let storageError
|
let storageError
|
||||||
const plugins = [pushNotifications]
|
const plugins = [vuexPushNotificationsPlugin]
|
||||||
const pinia = createPinia()
|
const pinia = createPinia()
|
||||||
pinia.use(piniaPersistPlugin())
|
pinia.use(piniaPersistPlugin())
|
||||||
|
pinia.use(piniaLanguagePlugin)
|
||||||
|
pinia.use(piniaStylePlugin)
|
||||||
|
pinia.use(piniaPushNotificationsPlugin)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const persistedState = await createPersistedState(persistedStateOptions)
|
const persistedState = await createPersistedState(persistedStateOptions)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue