profileConfig.js (3884B)
- import { get, set } from 'lodash'
- const defaultApi = ({ rootState, commit }, { path, value }) => {
- const params = {}
- set(params, path, value)
- return rootState
- .api
- .backendInteractor
- .updateProfile({ params })
- .then(result => {
- commit('addNewUsers', [result])
- commit('setCurrentUser', result)
- })
- }
- const notificationsApi = ({ rootState, commit }, { path, value, oldValue }) => {
- const settings = {}
- set(settings, path, value)
- return rootState
- .api
- .backendInteractor
- .updateNotificationSettings({ settings })
- .then(result => {
- if (result.status === 'success') {
- commit('confirmProfileOption', { name, value })
- } else {
- commit('confirmProfileOption', { name, value: oldValue })
- }
- })
- }
- /**
- * Map that stores relation between path for reading (from user profile),
- * for writing (into API) an what API to use.
- *
- * Shorthand - instead of { get, set, api? } object it's possible to use string
- * in case default api is used and get = set
- *
- * If no api is specified, defaultApi is used (see above)
- */
- export const settingsMap = {
- defaultScope: 'source.privacy',
- defaultNSFW: 'source.sensitive', // BROKEN: pleroma/pleroma#2837
- stripRichContent: {
- get: 'source.pleroma.no_rich_text',
- set: 'no_rich_text'
- },
- // Privacy
- locked: 'locked',
- acceptChatMessages: {
- get: 'pleroma.accepts_chat_messages',
- set: 'accepts_chat_messages'
- },
- allowFollowingMove: {
- get: 'pleroma.allow_following_move',
- set: 'allow_following_move'
- },
- discoverable: {
- get: 'source.pleroma.discoverable',
- set: 'discoverable'
- },
- hideFavorites: {
- get: 'pleroma.hide_favorites',
- set: 'hide_favorites'
- },
- hideFollowers: {
- get: 'pleroma.hide_followers',
- set: 'hide_followers'
- },
- hideFollows: {
- get: 'pleroma.hide_follows',
- set: 'hide_follows'
- },
- hideFollowersCount: {
- get: 'pleroma.hide_followers_count',
- set: 'hide_followers_count'
- },
- hideFollowsCount: {
- get: 'pleroma.hide_follows_count',
- set: 'hide_follows_count'
- },
- // NotificationSettingsAPIs
- webPushHideContents: {
- get: 'pleroma.notification_settings.hide_notification_contents',
- set: 'hide_notification_contents',
- api: notificationsApi
- },
- blockNotificationsFromStrangers: {
- get: 'pleroma.notification_settings.block_from_strangers',
- set: 'block_from_strangers',
- api: notificationsApi
- }
- }
- export const defaultState = Object.fromEntries(Object.keys(settingsMap).map(key => [key, null]))
- const profileConfig = {
- state: { ...defaultState },
- mutations: {
- confirmProfileOption (state, { name, value }) {
- set(state, name, value)
- },
- wipeProfileOption (state, { name }) {
- set(state, name, null)
- },
- wipeAllProfileOptions (state) {
- Object.keys(settingsMap).forEach(key => {
- set(state, key, null)
- })
- },
- // Set the settings based on their path location
- setCurrentUser (state, user) {
- Object.entries(settingsMap).forEach((map) => {
- const [name, value] = map
- const { get: path = value } = value
- set(state, name, get(user._original, path))
- })
- }
- },
- actions: {
- setProfileOption ({ rootState, state, commit, dispatch }, { name, value }) {
- const oldValue = get(state, name)
- const map = settingsMap[name]
- if (!map) throw new Error('Invalid server-side setting')
- const { set: path = map, api = defaultApi } = map
- commit('wipeProfileOption', { name })
- api({ rootState, commit }, { path, value, oldValue })
- .catch((e) => {
- console.warn('Error setting server-side option:', e)
- commit('confirmProfileOption', { name, value: oldValue })
- })
- },
- logout ({ commit }) {
- commit('wipeAllProfileOptions')
- }
- }
- }
- export default profileConfig