aboutsummaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/config.js19
-rw-r--r--src/modules/instance.js74
-rw-r--r--src/modules/interface.js32
-rw-r--r--src/modules/statuses.js54
-rw-r--r--src/modules/users.js55
5 files changed, 172 insertions, 62 deletions
diff --git a/src/modules/config.js b/src/modules/config.js
index e6b373b4..47b24d77 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -1,8 +1,19 @@
import { set, delete as del } from 'vue'
import { setPreset, applyTheme } from '../services/style_setter/style_setter.js'
+import messages from '../i18n/messages'
const browserLocale = (window.navigator.language || 'en').split('-')[0]
+/* TODO this is a bit messy.
+ * We need to declare settings with their types and also deal with
+ * instance-default settings in some way, hopefully try to avoid copy-pasta
+ * in general.
+ */
+export const multiChoiceProperties = [
+ 'postContentType',
+ 'subjectLineBehavior'
+]
+
export const defaultState = {
colors: {},
theme: undefined,
@@ -34,7 +45,8 @@ export const defaultState = {
likes: true,
repeats: true,
moves: true,
- emojiReactions: false
+ emojiReactions: false,
+ followRequest: true
},
webPushNotifications: false,
muteWords: [],
@@ -102,7 +114,12 @@ const config = {
setPreset(value)
break
case 'customTheme':
+ case 'customThemeSource':
applyTheme(value)
+ break
+ case 'interfaceLanguage':
+ messages.setLanguage(this.getters.i18n, value)
+ break
}
}
}
diff --git a/src/modules/instance.js b/src/modules/instance.js
index ffece311..ec5f4e54 100644
--- a/src/modules/instance.js
+++ b/src/modules/instance.js
@@ -1,55 +1,60 @@
import { set } from 'vue'
import { getPreset, applyTheme } from '../services/style_setter/style_setter.js'
import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js'
+import apiService from '../services/api/api.service.js'
import { instanceDefaultProperties } from './config.js'
const defaultState = {
- // Stuff from static/config.json and apiConfig
+ // Stuff from apiConfig
name: 'Pleroma FE',
registrationOpen: true,
- safeDM: true,
- textlimit: 5000,
server: 'http://localhost:4040/',
- theme: 'pleroma-dark',
+ textlimit: 5000,
themeData: undefined,
- background: '/static/aurora_borealis.jpg',
- logo: '/static/logo.png',
- logoMask: true,
- logoMargin: '.2em',
- redirectRootNoLogin: '/main/all',
- redirectRootLogin: '/main/friends',
- showInstanceSpecificPanel: false,
+ vapidPublicKey: undefined,
+
+ // Stuff from static/config.json
alwaysShowSubjectInput: true,
- hideMutedPosts: false,
+ background: '/static/aurora_borealis.jpg',
collapseMessageWithSubject: false,
- hidePostStats: false,
- hideUserStats: false,
- hideFilteredStatuses: false,
disableChat: false,
- scopeCopy: true,
- subjectLineBehavior: 'email',
- postContentType: 'text/plain',
+ greentext: false,
+ hideFilteredStatuses: false,
+ hideMutedPosts: false,
+ hidePostStats: false,
hideSitename: false,
+ hideUserStats: false,
+ loginMethod: 'password',
+ logo: '/static/logo.png',
+ logoMargin: '.2em',
+ logoMask: true,
+ minimalScopesMode: false,
nsfwCensorImage: undefined,
- vapidPublicKey: undefined,
- noAttachmentLinks: false,
+ postContentType: 'text/plain',
+ redirectRootLogin: '/main/friends',
+ redirectRootNoLogin: '/main/all',
+ scopeCopy: true,
showFeaturesPanel: true,
- minimalScopesMode: false,
- greentext: false,
+ showInstanceSpecificPanel: false,
+ sidebarRight: false,
+ subjectLineBehavior: 'email',
+ theme: 'pleroma-dark',
// Nasty stuff
- pleromaBackend: true,
- emoji: [],
- emojiFetched: false,
customEmoji: [],
customEmojiFetched: false,
- restrictedNicknames: [],
+ emoji: [],
+ emojiFetched: false,
+ pleromaBackend: true,
postFormats: [],
+ restrictedNicknames: [],
+ safeDM: true,
+ knownDomains: [],
// Feature-set, apparently, not everything here is reported...
- mediaProxyAvailable: false,
chatAvailable: false,
gopherAvailable: false,
+ mediaProxyAvailable: false,
suggestionsEnabled: false,
suggestionsWeb: '',
@@ -77,6 +82,9 @@ const instance = {
if (typeof value !== 'undefined') {
set(state, name, value)
}
+ },
+ setKnownDomains (state, domains) {
+ state.knownDomains = domains
}
},
getters: {
@@ -179,6 +187,18 @@ const instance = {
state.emojiFetched = true
dispatch('getStaticEmoji')
}
+ },
+
+ async getKnownDomains ({ commit, rootState }) {
+ try {
+ const result = await apiService.fetchKnownDomains({
+ credentials: rootState.users.currentUser.credentials
+ })
+ commit('setKnownDomains', result)
+ } catch (e) {
+ console.warn("Can't load known domains")
+ console.warn(e)
+ }
}
}
}
diff --git a/src/modules/interface.js b/src/modules/interface.js
index 5b2762e5..eeebd65e 100644
--- a/src/modules/interface.js
+++ b/src/modules/interface.js
@@ -1,6 +1,8 @@
import { set, delete as del } from 'vue'
const defaultState = {
+ settingsModalState: 'hidden',
+ settingsModalLoaded: false,
settings: {
currentSaveStateNotice: null,
noticeClearTimeout: null,
@@ -35,6 +37,27 @@ const interfaceMod = {
},
setMobileLayout (state, value) {
state.mobileLayout = value
+ },
+ closeSettingsModal (state) {
+ state.settingsModalState = 'hidden'
+ },
+ togglePeekSettingsModal (state) {
+ switch (state.settingsModalState) {
+ case 'minimized':
+ state.settingsModalState = 'visible'
+ return
+ case 'visible':
+ state.settingsModalState = 'minimized'
+ return
+ default:
+ throw new Error('Illegal minimization state of settings modal')
+ }
+ },
+ openSettingsModal (state) {
+ state.settingsModalState = 'visible'
+ if (!state.settingsModalLoaded) {
+ state.settingsModalLoaded = true
+ }
}
},
actions: {
@@ -49,6 +72,15 @@ const interfaceMod = {
},
setMobileLayout ({ commit }, value) {
commit('setMobileLayout', value)
+ },
+ closeSettingsModal ({ commit }) {
+ commit('closeSettingsModal')
+ },
+ openSettingsModal ({ commit }) {
+ commit('openSettingsModal')
+ },
+ togglePeekSettingsModal ({ commit }) {
+ commit('togglePeekSettingsModal')
}
}
}
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index 25b62ac7..9a2e0df1 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -13,8 +13,9 @@ import {
omitBy
} from 'lodash'
import { set } from 'vue'
+import { isStatusNotification } from '../services/notification_utils/notification_utils.js'
import apiService from '../services/api/api.service.js'
-// import parse from '../services/status_parser/status_parser.js'
+import { muteWordHits } from '../services/status_parser/status_parser.js'
const emptyTl = (userId = 0) => ({
statuses: [],
@@ -321,7 +322,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us
const addNewNotifications = (state, { dispatch, notifications, older, visibleNotificationTypes, rootGetters }) => {
each(notifications, (notification) => {
- if (notification.type !== 'follow' && notification.type !== 'move') {
+ if (isStatusNotification(notification.type)) {
notification.action = addStatusToGlobalStorage(state, notification.action).item
notification.status = notification.status && addStatusToGlobalStorage(state, notification.status).item
}
@@ -361,13 +362,16 @@ const addNewNotifications = (state, { dispatch, notifications, older, visibleNot
case 'move':
i18nString = 'migrated_to'
break
+ case 'follow_request':
+ i18nString = 'follow_request'
+ break
}
if (notification.type === 'pleroma:emoji_reaction') {
notifObj.body = rootGetters.i18n.t('notifications.reacted_with', [notification.emoji])
} else if (i18nString) {
notifObj.body = rootGetters.i18n.t('notifications.' + i18nString)
- } else {
+ } else if (isStatusNotification(notification.type)) {
notifObj.body = notification.status.text
}
@@ -377,7 +381,18 @@ const addNewNotifications = (state, { dispatch, notifications, older, visibleNot
notifObj.image = status.attachments[0].url
}
- if (!notification.seen && !state.notifications.desktopNotificationSilence && visibleNotificationTypes.includes(notification.type)) {
+ const reasonsToMuteNotif = (
+ notification.seen ||
+ state.notifications.desktopNotificationSilence ||
+ !visibleNotificationTypes.includes(notification.type) ||
+ (
+ notification.type === 'mention' && status && (
+ status.muted ||
+ muteWordHits(status, rootGetters.mergedConfig.muteWords).length === 0
+ )
+ )
+ )
+ if (!reasonsToMuteNotif) {
let desktopNotification = new window.Notification(title, notifObj)
// Chrome is known for not closing notifications automatically
// according to MDN, anyway.
@@ -521,6 +536,17 @@ export const mutations = {
notification.seen = true
})
},
+ markSingleNotificationAsSeen (state, { id }) {
+ const notification = find(state.notifications.data, n => n.id === id)
+ if (notification) notification.seen = true
+ },
+ dismissNotification (state, { id }) {
+ state.notifications.data = state.notifications.data.filter(n => n.id !== id)
+ },
+ updateNotification (state, { id, updater }) {
+ const notification = find(state.notifications.data, n => n.id === id)
+ notification && updater(notification)
+ },
queueFlush (state, { timeline, id }) {
state.timelines[timeline].flushMarker = id
},
@@ -616,7 +642,7 @@ const statuses = {
commit('setNotificationsSilence', { value })
},
fetchStatus ({ rootState, dispatch }, id) {
- rootState.api.backendInteractor.fetchStatus({ id })
+ return rootState.api.backendInteractor.fetchStatus({ id })
.then((status) => dispatch('addNewStatuses', { statuses: [status] }))
},
deleteStatus ({ rootState, commit }, status) {
@@ -680,6 +706,24 @@ const statuses = {
credentials: rootState.users.currentUser.credentials
})
},
+ markSingleNotificationAsSeen ({ rootState, commit }, { id }) {
+ commit('markSingleNotificationAsSeen', { id })
+ apiService.markNotificationsAsSeen({
+ single: true,
+ id,
+ credentials: rootState.users.currentUser.credentials
+ })
+ },
+ dismissNotificationLocal ({ rootState, commit }, { id }) {
+ commit('dismissNotification', { id })
+ },
+ dismissNotification ({ rootState, commit }, { id }) {
+ commit('dismissNotification', { id })
+ rootState.api.backendInteractor.dismissNotification({ id })
+ },
+ updateNotification ({ rootState, commit }, { id, updater }) {
+ commit('updateNotification', { id, updater })
+ },
fetchFavsAndRepeats ({ rootState, commit }, id) {
Promise.all([
rootState.api.backendInteractor.fetchFavoritedByUsers({ id }),
diff --git a/src/modules/users.js b/src/modules/users.js
index df133be0..f9329f2a 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -48,6 +48,11 @@ const unblockUser = (store, id) => {
}
const muteUser = (store, id) => {
+ const predictedRelationship = store.state.relationships[id] || { id }
+ predictedRelationship.muting = true
+ store.commit('updateUserRelationship', [predictedRelationship])
+ store.commit('addMuteId', id)
+
return store.rootState.api.backendInteractor.muteUser({ id })
.then((relationship) => {
store.commit('updateUserRelationship', [relationship])
@@ -56,6 +61,10 @@ const muteUser = (store, id) => {
}
const unmuteUser = (store, id) => {
+ const predictedRelationship = store.state.relationships[id] || { id }
+ predictedRelationship.muting = false
+ store.commit('updateUserRelationship', [predictedRelationship])
+
return store.rootState.api.backendInteractor.unmuteUser({ id })
.then((relationship) => store.commit('updateUserRelationship', [relationship]))
}
@@ -83,10 +92,6 @@ const unmuteDomain = (store, domain) => {
}
export const mutations = {
- setMuted (state, { user: { id }, muted }) {
- const user = state.usersObject[id]
- set(user, 'muted', muted)
- },
tagUser (state, { user: { id }, tag }) {
const user = state.usersObject[id]
const tags = user.tags || []
@@ -146,26 +151,18 @@ export const mutations = {
}
},
addNewUsers (state, users) {
- each(users, (user) => mergeOrAdd(state.users, state.usersObject, user))
+ each(users, (user) => {
+ if (user.relationship) {
+ set(state.relationships, user.relationship.id, user.relationship)
+ }
+ mergeOrAdd(state.users, state.usersObject, user)
+ })
},
updateUserRelationship (state, relationships) {
relationships.forEach((relationship) => {
- const user = state.usersObject[relationship.id]
- if (user) {
- user.follows_you = relationship.followed_by
- user.following = relationship.following
- user.muted = relationship.muting
- user.statusnet_blocking = relationship.blocking
- user.subscribed = relationship.subscribing
- user.showing_reblogs = relationship.showing_reblogs
- }
+ set(state.relationships, relationship.id, relationship)
})
},
- updateBlocks (state, blockedUsers) {
- // Reset statusnet_blocking of all fetched users
- each(state.users, (user) => { user.statusnet_blocking = false })
- each(blockedUsers, (user) => mergeOrAdd(state.users, state.usersObject, user))
- },
saveBlockIds (state, blockIds) {
state.currentUser.blockIds = blockIds
},
@@ -174,11 +171,6 @@ export const mutations = {
state.currentUser.blockIds.push(blockId)
}
},
- updateMutes (state, mutedUsers) {
- // Reset muted of all fetched users
- each(state.users, (user) => { user.muted = false })
- each(mutedUsers, (user) => mergeOrAdd(state.users, state.usersObject, user))
- },
saveMuteIds (state, muteIds) {
state.currentUser.muteIds = muteIds
},
@@ -244,6 +236,10 @@ export const getters = {
return state.usersObject[query.toLowerCase()]
}
return result
+ },
+ relationship: state => id => {
+ const rel = id && state.relationships[id]
+ return rel || { id, loading: true }
}
}
@@ -254,7 +250,8 @@ export const defaultState = {
users: [],
usersObject: {},
signUpPending: false,
- signUpErrors: []
+ signUpErrors: [],
+ relationships: {}
}
const users = {
@@ -279,7 +276,7 @@ const users = {
return store.rootState.api.backendInteractor.fetchBlocks()
.then((blocks) => {
store.commit('saveBlockIds', map(blocks, 'id'))
- store.commit('updateBlocks', blocks)
+ store.commit('addNewUsers', blocks)
return blocks
})
},
@@ -298,8 +295,8 @@ const users = {
fetchMutes (store) {
return store.rootState.api.backendInteractor.fetchMutes()
.then((mutes) => {
- store.commit('updateMutes', mutes)
store.commit('saveMuteIds', map(mutes, 'id'))
+ store.commit('addNewUsers', mutes)
return mutes
})
},
@@ -416,7 +413,7 @@ const users = {
},
addNewNotifications (store, { notifications }) {
const users = map(notifications, 'from_profile')
- const targetUsers = map(notifications, 'target')
+ const targetUsers = map(notifications, 'target').filter(_ => _)
const notificationIds = notifications.map(_ => _.id)
store.commit('addNewUsers', users)
store.commit('addNewUsers', targetUsers)
@@ -431,7 +428,7 @@ const users = {
store.commit('setUserForNotification', notification)
})
},
- searchUsers (store, query) {
+ searchUsers (store, { query }) {
return store.rootState.api.backendInteractor.searchUsers({ query })
.then((users) => {
store.commit('addNewUsers', users)