diff --git a/webapp/channels/src/components/confirm_modal_redux/confirm_modal_redux.tsx b/webapp/channels/src/components/confirm_modal_redux/confirm_modal_redux.tsx index 586abd5d3a..8bdcb1db2d 100644 --- a/webapp/channels/src/components/confirm_modal_redux/confirm_modal_redux.tsx +++ b/webapp/channels/src/components/confirm_modal_redux/confirm_modal_redux.tsx @@ -6,7 +6,7 @@ import React, {useCallback, useState} from 'react'; import ConfirmModal from 'components/confirm_modal'; type Props = Omit, 'show'> & { - onExited?: () => void; + onExited: () => void; }; export default function ConfirmModalRedux(props: Props) { diff --git a/webapp/channels/src/components/user_settings/advanced/index.ts b/webapp/channels/src/components/user_settings/advanced/index.ts index ea9cf5f8e4..516fcb01d2 100644 --- a/webapp/channels/src/components/user_settings/advanced/index.ts +++ b/webapp/channels/src/components/user_settings/advanced/index.ts @@ -10,7 +10,6 @@ import {updateUserActive, revokeAllSessionsForUser} from 'mattermost-redux/actio import {getConfig} from 'mattermost-redux/selectors/entities/general'; import { get, - getFromPreferences, getUnreadScrollPositionFromPreference, getUnreadScrollPositionPreference, makeGetCategory, makeGetUserCategory, syncedDraftsAreAllowed, @@ -25,7 +24,7 @@ import type {OwnProps} from './user_settings_advanced'; import AdvancedSettingsDisplay from './user_settings_advanced'; function makeMapStateToProps(state: GlobalState, props: OwnProps) { - const getAdvancedSettingsCategory = props.adminMode ? makeGetUserCategory(props.currentUser.id) : makeGetCategory(); + const getAdvancedSettingsCategory = props.adminMode ? makeGetUserCategory(props.user.id) : makeGetCategory(); return (state: GlobalState, props: OwnProps) => { const config = getConfig(state); @@ -34,22 +33,17 @@ function makeMapStateToProps(state: GlobalState, props: OwnProps) { const enableUserDeactivation = config.EnableUserDeactivation === 'true'; const enableJoinLeaveMessage = config.EnableJoinLeaveMessageByDefault === 'true'; - let getPreference = (prefCategory: string, prefName: string, defaultValue: string) => get(state, prefCategory, prefName, defaultValue); - if (props.adminMode && props.userPreferences) { - // This ties the function to the current value of userPreferences for the current execution of this function - const preferences = props.userPreferences; - getPreference = (prefCategory, prefName, defaultValue) => getFromPreferences(preferences, prefCategory, prefName, defaultValue); - } + const userPreferences = props.adminMode && props.userPreferences ? props.userPreferences : undefined; return { advancedSettingsCategory: getAdvancedSettingsCategory(state, Preferences.CATEGORY_ADVANCED_SETTINGS), - sendOnCtrlEnter: getPreference(Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter', 'false'), - codeBlockOnCtrlEnter: getPreference(Preferences.CATEGORY_ADVANCED_SETTINGS, 'code_block_ctrl_enter', 'true'), - formatting: getPreference(Preferences.CATEGORY_ADVANCED_SETTINGS, 'formatting', 'true'), - joinLeave: getPreference(Preferences.CATEGORY_ADVANCED_SETTINGS, 'join_leave', enableJoinLeaveMessage.toString()), - syncDrafts: getPreference(Preferences.CATEGORY_ADVANCED_SETTINGS, 'sync_drafts', 'true'), - currentUser: props.adminMode && props.currentUser ? props.currentUser : getCurrentUser(state), - unreadScrollPosition: props.adminMode && props.userPreferences ? getUnreadScrollPositionFromPreference(props.userPreferences) : getUnreadScrollPositionPreference(state), + sendOnCtrlEnter: get(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter', 'false', userPreferences), + codeBlockOnCtrlEnter: get(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'code_block_ctrl_enter', 'true', userPreferences), + formatting: get(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'formatting', 'true', userPreferences), + joinLeave: get(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'join_leave', enableJoinLeaveMessage.toString(), userPreferences), + syncDrafts: get(state, Preferences.CATEGORY_ADVANCED_SETTINGS, 'sync_drafts', 'true', userPreferences), + user: props.adminMode && props.user ? props.user : getCurrentUser(state), + unreadScrollPosition: getUnreadScrollPositionPreference(state, userPreferences), enablePreviewFeatures, enableUserDeactivation, syncedDraftsAreAllowed: syncedDraftsAreAllowed(state), diff --git a/webapp/channels/src/components/user_settings/advanced/join_leave_section/index.ts b/webapp/channels/src/components/user_settings/advanced/join_leave_section/index.ts index 36611d7116..c06dc80cba 100644 --- a/webapp/channels/src/components/user_settings/advanced/join_leave_section/index.ts +++ b/webapp/channels/src/components/user_settings/advanced/join_leave_section/index.ts @@ -8,7 +8,7 @@ import type {Dispatch} from 'redux'; import {savePreferences} from 'mattermost-redux/actions/preferences'; import {Preferences} from 'mattermost-redux/constants'; import {getConfig} from 'mattermost-redux/selectors/entities/general'; -import {get as getPreference, getFromPreferences} from 'mattermost-redux/selectors/entities/preferences'; +import {get} from 'mattermost-redux/selectors/entities/preferences'; import {getCurrentUserId} from 'mattermost-redux/selectors/entities/users'; import type {GlobalState} from 'types/store'; @@ -19,27 +19,11 @@ import JoinLeaveSection from './join_leave_section'; export function mapStateToProps(state: GlobalState, props: OwnProps) { const config = getConfig(state); const enableJoinLeaveMessage = config.EnableJoinLeaveMessageByDefault === 'true'; - - let joinLeave: string; - if (props.adminMode && props.userPreferences) { - joinLeave = getFromPreferences( - props.userPreferences, - Preferences.CATEGORY_ADVANCED_SETTINGS, - Preferences.ADVANCED_FILTER_JOIN_LEAVE, - enableJoinLeaveMessage.toString(), - ); - } else { - joinLeave = getPreference( - state, - Preferences.CATEGORY_ADVANCED_SETTINGS, - Preferences.ADVANCED_FILTER_JOIN_LEAVE, - enableJoinLeaveMessage.toString(), - ); - } + const userPreference = props.adminMode && props.userPreferences ? props.userPreferences : undefined; return { - currentUserId: props.adminMode ? props.currentUserId : getCurrentUserId(state), - joinLeave, + userId: props.adminMode ? props.userId : getCurrentUserId(state), + joinLeave: get(state, Preferences.CATEGORY_ADVANCED_SETTINGS, Preferences.ADVANCED_FILTER_JOIN_LEAVE, enableJoinLeaveMessage.toString(), userPreference), }; } diff --git a/webapp/channels/src/components/user_settings/advanced/join_leave_section/join_leave_section.test.tsx b/webapp/channels/src/components/user_settings/advanced/join_leave_section/join_leave_section.test.tsx index 7ac8dfc9b0..57a1ff1628 100644 --- a/webapp/channels/src/components/user_settings/advanced/join_leave_section/join_leave_section.test.tsx +++ b/webapp/channels/src/components/user_settings/advanced/join_leave_section/join_leave_section.test.tsx @@ -20,7 +20,7 @@ describe('components/user_settings/advanced/JoinLeaveSection', () => { const defaultProps = { active: false, areAllSectionsInactive: false, - currentUserId: 'current_user_id', + userId: 'current_user_id', joinLeave: 'true', onUpdateSection: jest.fn(), renderOnOffLabel: jest.fn(), @@ -149,7 +149,7 @@ describe('mapStateToProps', () => { } as unknown as GlobalState; test('configuration default to true', () => { - const props = mapStateToProps(initialState, {adminMode: false, currentUserId: ''}); + const props = mapStateToProps(initialState, {adminMode: false, userId: ''}); expect(props.joinLeave).toEqual('true'); }); @@ -163,7 +163,7 @@ describe('mapStateToProps', () => { }, }, }); - const props = mapStateToProps(testState, {currentUserId: '', adminMode: false}); + const props = mapStateToProps(testState, {userId: '', adminMode: false}); expect(props.joinLeave).toEqual('false'); }); @@ -186,7 +186,7 @@ describe('mapStateToProps', () => { }, }, }); - const props = mapStateToProps(testState, {adminMode: false, currentUserId: ''}); + const props = mapStateToProps(testState, {adminMode: false, userId: ''}); expect(props.joinLeave).toEqual('true'); }); @@ -204,7 +204,7 @@ describe('mapStateToProps', () => { }, }, }); - const props = mapStateToProps(testState, {adminMode: false, currentUserId: ''}); + const props = mapStateToProps(testState, {adminMode: false, userId: ''}); expect(props.joinLeave).toEqual('false'); }); @@ -229,14 +229,14 @@ describe('mapStateToProps', () => { }; const propsWithAdminMode = mapStateToProps(testState, { - currentUserId: 'user_1', + userId: 'user_1', adminMode: true, userPreferences, }); expect(propsWithAdminMode.joinLeave).toEqual('true'); const propsWithoutAdminMode = mapStateToProps(testState, { - currentUserId: 'user_1', + userId: 'user_1', adminMode: false, userPreferences, }); diff --git a/webapp/channels/src/components/user_settings/advanced/join_leave_section/join_leave_section.tsx b/webapp/channels/src/components/user_settings/advanced/join_leave_section/join_leave_section.tsx index 31094e3c29..5841783798 100644 --- a/webapp/channels/src/components/user_settings/advanced/join_leave_section/join_leave_section.tsx +++ b/webapp/channels/src/components/user_settings/advanced/join_leave_section/join_leave_section.tsx @@ -18,7 +18,7 @@ import {a11yFocus} from 'utils/utils'; export type OwnProps = { adminMode?: boolean; - currentUserId: string; + userId: string; userPreferences?: PreferencesType; } @@ -78,9 +78,9 @@ export default class JoinLeaveSection extends React.PureComponent }; public handleSubmit = (): void => { - const {actions, currentUserId, onUpdateSection} = this.props; - const joinLeavePreference = {category: Preferences.CATEGORY_ADVANCED_SETTINGS, user_id: currentUserId, name: Preferences.ADVANCED_FILTER_JOIN_LEAVE, value: this.state.joinLeaveState}; - actions.savePreferences(currentUserId, [joinLeavePreference]); + const {actions, userId, onUpdateSection} = this.props; + const joinLeavePreference = {category: Preferences.CATEGORY_ADVANCED_SETTINGS, user_id: userId, name: Preferences.ADVANCED_FILTER_JOIN_LEAVE, value: this.state.joinLeaveState}; + actions.savePreferences(userId, [joinLeavePreference]); onUpdateSection(); }; diff --git a/webapp/channels/src/components/user_settings/advanced/performance_debugging_section/index.ts b/webapp/channels/src/components/user_settings/advanced/performance_debugging_section/index.ts index f4d3165d37..5c9d83634d 100644 --- a/webapp/channels/src/components/user_settings/advanced/performance_debugging_section/index.ts +++ b/webapp/channels/src/components/user_settings/advanced/performance_debugging_section/index.ts @@ -7,7 +7,7 @@ import type {ConnectedProps} from 'react-redux'; import {savePreferences} from 'mattermost-redux/actions/preferences'; import {Preferences} from 'mattermost-redux/constants'; import {isPerformanceDebuggingEnabled} from 'mattermost-redux/selectors/entities/general'; -import {getBool, getBoolFromPreferences, getUserPreferences} from 'mattermost-redux/selectors/entities/preferences'; +import {getBool, getUserPreferences} from 'mattermost-redux/selectors/entities/preferences'; import {getCurrentUserId} from 'mattermost-redux/selectors/entities/users'; import type {GlobalState} from 'types/store'; @@ -16,17 +16,13 @@ import type {OwnProps} from './performance_debugging_section'; import PerformanceDebuggingSection from './performance_debugging_section'; function mapStateToProps(state: GlobalState, props: OwnProps) { - let getPreference = (prefCategory: string, prefName: string) => getBool(state, prefCategory, prefName); - if (props.adminMode && props.currentUserId) { - const userPreferences = getUserPreferences(state, props.currentUserId); - getPreference = (prefCategory: string, prefName: string) => getBoolFromPreferences(userPreferences, prefCategory, prefName); - } + const userPreferences = props.adminMode && props.userId ? getUserPreferences(state, props.userId) : undefined; return { - currentUserId: props.adminMode ? props.currentUserId : getCurrentUserId(state), - disableClientPlugins: getPreference(Preferences.CATEGORY_PERFORMANCE_DEBUGGING, Preferences.NAME_DISABLE_CLIENT_PLUGINS), - disableTelemetry: getPreference(Preferences.CATEGORY_PERFORMANCE_DEBUGGING, Preferences.NAME_DISABLE_TELEMETRY), - disableTypingMessages: getPreference(Preferences.CATEGORY_PERFORMANCE_DEBUGGING, Preferences.NAME_DISABLE_TYPING_MESSAGES), + userId: props.adminMode ? props.userId : getCurrentUserId(state), + disableClientPlugins: getBool(state, Preferences.CATEGORY_PERFORMANCE_DEBUGGING, Preferences.NAME_DISABLE_CLIENT_PLUGINS, undefined, userPreferences), + disableTelemetry: getBool(state, Preferences.CATEGORY_PERFORMANCE_DEBUGGING, Preferences.NAME_DISABLE_TELEMETRY, undefined, userPreferences), + disableTypingMessages: getBool(state, Preferences.CATEGORY_PERFORMANCE_DEBUGGING, Preferences.NAME_DISABLE_TYPING_MESSAGES, undefined, userPreferences), performanceDebuggingEnabled: isPerformanceDebuggingEnabled(state), }; diff --git a/webapp/channels/src/components/user_settings/advanced/performance_debugging_section/performance_debugging_section.tsx b/webapp/channels/src/components/user_settings/advanced/performance_debugging_section/performance_debugging_section.tsx index b26be00fcb..9dc0db59d6 100644 --- a/webapp/channels/src/components/user_settings/advanced/performance_debugging_section/performance_debugging_section.tsx +++ b/webapp/channels/src/components/user_settings/advanced/performance_debugging_section/performance_debugging_section.tsx @@ -16,7 +16,7 @@ import type {PropsFromRedux} from './index'; export type OwnProps = { adminMode?: boolean; - currentUserId?: string; + userId: string; } type Props = PropsFromRedux & OwnProps & { @@ -116,7 +116,7 @@ function PerformanceDebuggingSectionExpanded(props: Props) { const [disableTypingMessages, setDisableTypingMessages] = useState(props.disableTypingMessages); const handleSubmit = useCallback(() => { - if (!props.currentUserId) { + if (!props.userId) { return; } @@ -124,7 +124,7 @@ function PerformanceDebuggingSectionExpanded(props: Props) { if (disableClientPlugins !== props.disableClientPlugins) { preferences.push({ - user_id: props.currentUserId, + user_id: props.userId, category: Preferences.CATEGORY_PERFORMANCE_DEBUGGING, name: Preferences.NAME_DISABLE_CLIENT_PLUGINS, value: disableClientPlugins.toString(), @@ -132,7 +132,7 @@ function PerformanceDebuggingSectionExpanded(props: Props) { } if (disableTelemetry !== props.disableTelemetry) { preferences.push({ - user_id: props.currentUserId, + user_id: props.userId, category: Preferences.CATEGORY_PERFORMANCE_DEBUGGING, name: Preferences.NAME_DISABLE_TELEMETRY, value: disableTelemetry.toString(), @@ -140,20 +140,20 @@ function PerformanceDebuggingSectionExpanded(props: Props) { } if (disableTypingMessages !== props.disableTypingMessages) { preferences.push({ - user_id: props.currentUserId, + user_id: props.userId, category: Preferences.CATEGORY_PERFORMANCE_DEBUGGING, name: Preferences.NAME_DISABLE_TYPING_MESSAGES, value: disableTypingMessages.toString(), }); } - if (preferences.length !== 0 && props.currentUserId) { - props.savePreferences(props.currentUserId, preferences); + if (preferences.length !== 0 && props.userId) { + props.savePreferences(props.userId, preferences); } props.onUpdateSection(''); }, [ - props.currentUserId, + props.userId, props.onUpdateSection, props.savePreferences, disableClientPlugins, diff --git a/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.test.tsx b/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.test.tsx index 945e60b65a..4c4fcc3362 100644 --- a/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.test.tsx +++ b/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.test.tsx @@ -27,7 +27,7 @@ describe('components/user_settings/display/UserSettingsDisplay', () => { }); const requiredProps: ComponentProps = { - currentUser: user, + user, updateSection: jest.fn(), activeSection: '', closeModal: jest.fn(), @@ -78,7 +78,7 @@ describe('components/user_settings/display/UserSettingsDisplay', () => { wrapper.instance().handleDeactivateAccountSubmit(); expect(updateUserActive).toHaveBeenCalled(); - expect(updateUserActive).toHaveBeenCalledWith(requiredProps.currentUser.id, false); + expect(updateUserActive).toHaveBeenCalledWith(requiredProps.user.id, false); }); test('handleDeactivateAccountSubmit() should have called revokeAllSessions', () => { @@ -86,7 +86,7 @@ describe('components/user_settings/display/UserSettingsDisplay', () => { wrapper.instance().handleDeactivateAccountSubmit(); expect(requiredProps.actions.revokeAllSessionsForUser).toHaveBeenCalled(); - expect(requiredProps.actions.revokeAllSessionsForUser).toHaveBeenCalledWith(requiredProps.currentUser.id); + expect(requiredProps.actions.revokeAllSessionsForUser).toHaveBeenCalledWith(requiredProps.user.id); }); test('handleDeactivateAccountSubmit() should have updated state.serverError', async () => { diff --git a/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.tsx b/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.tsx index 0f200b0c8a..50e5be4903 100644 --- a/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.tsx +++ b/webapp/channels/src/components/user_settings/advanced/user_settings_advanced.tsx @@ -42,7 +42,7 @@ type Settings = { export type OwnProps = { adminMode?: boolean; - currentUser: UserProfile; + user: UserProfile; userPreferences?: PreferencesType; } @@ -166,13 +166,13 @@ export default class AdvancedSettingsDisplay extends React.PureComponent => { - if (!this.props.currentUser) { + if (!this.props.user) { return; } const preferences: PreferenceType[] = []; - const {actions, currentUser} = this.props; - const userId = currentUser.id; + const {actions, user} = this.props; + const userId = user.id; // this should be refactored so we can actually be certain about what type everything is (Array.isArray(settings) ? settings : [settings]).forEach((setting) => { @@ -191,7 +191,7 @@ export default class AdvancedSettingsDisplay extends React.PureComponent => { - const userId = this.props.currentUser.id; + const userId = this.props.user.id; this.setState({isSaving: true}); @@ -803,9 +803,8 @@ export default class AdvancedSettingsDisplay extends React.PureComponent {previewFeaturesSectionDivider} {previewFeaturesSection} @@ -948,7 +947,7 @@ export default class AdvancedSettingsDisplay extends React.PureComponent {unreadScrollPositionSectionDivider} {unreadScrollPositionSection} diff --git a/webapp/channels/src/components/user_settings/display/index.ts b/webapp/channels/src/components/user_settings/display/index.ts index cfdb04c91f..3cd5781307 100644 --- a/webapp/channels/src/components/user_settings/display/index.ts +++ b/webapp/channels/src/components/user_settings/display/index.ts @@ -16,7 +16,6 @@ import { get, isCollapsedThreadsAllowed, getCollapsedThreadsPreference, - getFromPreferences, } from 'mattermost-redux/selectors/entities/preferences'; import { generateCurrentTimezoneLabel, @@ -50,6 +49,7 @@ export function makeMapStateToProps() { const configTeammateNameDisplay = config.TeammateNameDisplay as string; const emojiPickerEnabled = config.EnableEmojiPicker === 'true'; const lastActiveTimeEnabled = config.EnableLastActiveTime === 'true'; + const userPreference = props.adminMode && props.userPreferences ? props.userPreferences : undefined; let lastActiveDisplay = true; const user = props.adminMode ? props.user : getUser(state, currentUserId); @@ -62,12 +62,6 @@ export function makeMapStateToProps() { userLocale = config.DefaultClientLocale as string; } - let getPreference = (prefCategory: string, prefName: string, defaultValue: string) => get(state, prefCategory, prefName, defaultValue); - if (props.adminMode && props.userPreferences) { - const preferences = props.userPreferences; - getPreference = (prefCategory: string, prefName: string, defaultValue: string) => getFromPreferences(preferences, prefCategory, prefName, defaultValue); - } - return { lockTeammateNameDisplay, allowCustomThemes, @@ -80,19 +74,18 @@ export function makeMapStateToProps() { timezoneLabel, userTimezone, shouldAutoUpdateTimezone, - currentUserTimezone: getUserCurrentTimezone(userTimezone) as string, - availabilityStatusOnPosts: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.AVAILABILITY_STATUS_ON_POSTS, Preferences.AVAILABILITY_STATUS_ON_POSTS_DEFAULT), - militaryTime: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.USE_MILITARY_TIME, Preferences.USE_MILITARY_TIME_DEFAULT), - teammateNameDisplay: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT, configTeammateNameDisplay), - channelDisplayMode: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT), - messageDisplay: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT), - colorizeUsernames: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.COLORIZE_USERNAMES, Preferences.COLORIZE_USERNAMES_DEFAULT), - collapseDisplay: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.COLLAPSE_DISPLAY, Preferences.COLLAPSE_DISPLAY_DEFAULT), + availabilityStatusOnPosts: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.AVAILABILITY_STATUS_ON_POSTS, Preferences.AVAILABILITY_STATUS_ON_POSTS_DEFAULT, userPreference), + militaryTime: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.USE_MILITARY_TIME, Preferences.USE_MILITARY_TIME_DEFAULT, userPreference), + teammateNameDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT, configTeammateNameDisplay, userPreference), + channelDisplayMode: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT, userPreference), + messageDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT, userPreference), + colorizeUsernames: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.COLORIZE_USERNAMES, Preferences.COLORIZE_USERNAMES_DEFAULT, userPreference), + collapseDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.COLLAPSE_DISPLAY, Preferences.COLLAPSE_DISPLAY_DEFAULT, userPreference), collapsedReplyThreadsAllowUserPreference: isCollapsedThreadsAllowed(state) && getConfig(state).CollapsedThreads !== CollapsedThreads.ALWAYS_ON, collapsedReplyThreads: getCollapsedThreadsPreference(state), - clickToReply: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CLICK_TO_REPLY, Preferences.CLICK_TO_REPLY_DEFAULT), - linkPreviewDisplay: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.LINK_PREVIEW_DISPLAY, Preferences.LINK_PREVIEW_DISPLAY_DEFAULT), - oneClickReactionsOnPosts: getPreference(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.ONE_CLICK_REACTIONS_ENABLED, Preferences.ONE_CLICK_REACTIONS_ENABLED_DEFAULT), + clickToReply: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CLICK_TO_REPLY, Preferences.CLICK_TO_REPLY_DEFAULT, userPreference), + linkPreviewDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.LINK_PREVIEW_DISPLAY, Preferences.LINK_PREVIEW_DISPLAY_DEFAULT, userPreference), + oneClickReactionsOnPosts: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.ONE_CLICK_REACTIONS_ENABLED, Preferences.ONE_CLICK_REACTIONS_ENABLED_DEFAULT, userPreference), emojiPickerEnabled, lastActiveDisplay, lastActiveTimeEnabled, diff --git a/webapp/channels/src/components/user_settings/display/user_settings_display.tsx b/webapp/channels/src/components/user_settings/display/user_settings_display.tsx index 9528c7ae07..018bde5225 100644 --- a/webapp/channels/src/components/user_settings/display/user_settings_display.tsx +++ b/webapp/channels/src/components/user_settings/display/user_settings_display.tsx @@ -103,7 +103,6 @@ type Props = OwnProps & { userLocale: string; enableThemeSelection: boolean; configTeammateNameDisplay: string; - currentUserTimezone: string; shouldAutoUpdateTimezone: boolean | string; lockTeammateNameDisplay: boolean; militaryTime: string; diff --git a/webapp/channels/src/components/user_settings/index.tsx b/webapp/channels/src/components/user_settings/index.tsx index cb915daf5b..9d161d0092 100644 --- a/webapp/channels/src/components/user_settings/index.tsx +++ b/webapp/channels/src/components/user_settings/index.tsx @@ -97,7 +97,7 @@ export default function UserSettings(props: Props) { closeModal={props.closeModal} collapseModal={props.collapseModal} adminMode={props.adminMode} - currentUserId={props.user.id} + userId={props.user.id} userPreferences={props.userPreferences} /> @@ -111,7 +111,7 @@ export default function UserSettings(props: Props) { closeModal={props.closeModal} collapseModal={props.collapseModal} adminMode={props.adminMode} - currentUser={props.user} + user={props.user} userPreferences={props.userPreferences} /> diff --git a/webapp/channels/src/components/user_settings/modal/index.ts b/webapp/channels/src/components/user_settings/modal/index.ts index 774aa871e8..15ca06c648 100644 --- a/webapp/channels/src/components/user_settings/modal/index.ts +++ b/webapp/channels/src/components/user_settings/modal/index.ts @@ -28,10 +28,10 @@ function mapStateToProps(state: GlobalState, ownProps: OwnProps) { const sendEmailNotifications = config.SendEmailNotifications === 'true'; const requireEmailVerification = config.RequireEmailVerification === 'true'; - const currentUser = ownProps.adminMode && ownProps.userID ? getUserSelector(state, ownProps.userID) : getCurrentUser(state); + const user = ownProps.adminMode && ownProps.userID ? getUserSelector(state, ownProps.userID) : getCurrentUser(state); return { - currentUser, + user, userPreferences: ownProps.adminMode && ownProps.userID ? getUserPreferencesSelector(state, ownProps.userID) : undefined, sendEmailNotifications, requireEmailVerification, diff --git a/webapp/channels/src/components/user_settings/modal/user_settings_modal.tsx b/webapp/channels/src/components/user_settings/modal/user_settings_modal.tsx index 278961fcc3..2184a23dc5 100644 --- a/webapp/channels/src/components/user_settings/modal/user_settings_modal.tsx +++ b/webapp/channels/src/components/user_settings/modal/user_settings_modal.tsx @@ -16,7 +16,7 @@ import ConfirmModal from 'components/confirm_modal'; import SettingsSidebar from 'components/settings_sidebar'; import UserSettings from 'components/user_settings'; import LoadingSpinner from 'components/widgets/loading/loading_spinner'; -import SmartLoader from 'components/widgets/smartLoader'; +import SmartLoader from 'components/widgets/smart_loader'; import Constants from 'utils/constants'; import {cmdOrCtrlPressed, isKeyPressed} from 'utils/keyboard'; @@ -28,7 +28,6 @@ import type {PluginConfiguration} from 'types/plugins/user_settings'; export type OwnProps = { userID?: string; adminMode?: boolean; - currentUser?: UserProfile; isContentProductSettings: boolean; userPreferences?: PreferencesType; } @@ -42,6 +41,7 @@ export type Props = OwnProps & { getUser: (userID: string) => Promise; }; pluginSettings: {[pluginId: string]: PluginConfiguration}; + user?: UserProfile; } type State = { @@ -106,7 +106,7 @@ class UserSettingsModal extends React.PureComponent { this.props.actions.getUserPreferences(this.props.userID); } - if (!this.props.currentUser) { + if (!this.props.user) { this.props.actions.getUser(this.props.userID); } } @@ -312,12 +312,12 @@ class UserSettingsModal extends React.PureComponent { let modalTitle: string; - if (this.props.adminMode && this.props.currentUser) { + if (this.props.adminMode && this.props.user) { modalTitle = formatMessage({ id: 'userSettings.adminMode.modal_header', defaultMessage: "{userDisplayName}'s Settings", }, { - userDisplayName: getDisplayName(this.props.currentUser), + userDisplayName: getDisplayName(this.props.user), }); } else { modalTitle = this.props.isContentProductSettings ? formatMessage({ @@ -365,7 +365,7 @@ class UserSettingsModal extends React.PureComponent { { this.props.adminMode && @@ -374,7 +374,7 @@ class UserSettingsModal extends React.PureComponent { } { - !this.state.loading && this.props.currentUser && + !this.state.loading && this.props.user &&
{ } } pluginSettings={this.props.pluginSettings} - user={this.props.currentUser} + user={this.props.user} adminMode={this.props.adminMode} userPreferences={this.props.userPreferences} /> diff --git a/webapp/channels/src/components/user_settings/sidebar/limit_visible_gms_dms/index.ts b/webapp/channels/src/components/user_settings/sidebar/limit_visible_gms_dms/index.ts index 7f914f3e66..a89a997734 100644 --- a/webapp/channels/src/components/user_settings/sidebar/limit_visible_gms_dms/index.ts +++ b/webapp/channels/src/components/user_settings/sidebar/limit_visible_gms_dms/index.ts @@ -4,7 +4,7 @@ import {connect} from 'react-redux'; import {savePreferences} from 'mattermost-redux/actions/preferences'; -import {getUserVisibleDmGmLimit, getVisibleDmGmLimit} from 'mattermost-redux/selectors/entities/preferences'; +import {getVisibleDmGmLimit} from 'mattermost-redux/selectors/entities/preferences'; import {getCurrentUserId} from 'mattermost-redux/selectors/entities/users'; import type {GlobalState} from 'types/store'; @@ -13,9 +13,10 @@ import type {OwnProps} from './limit_visible_gms_dms'; import LimitVisibleGMsDMs from './limit_visible_gms_dms'; function mapStateToProps(state: GlobalState, ownProps: OwnProps) { + const userPreferences = ownProps.adminMode && ownProps.userPreferences ? ownProps.userPreferences : undefined; return { - currentUserId: ownProps.adminMode ? ownProps.currentUserId : getCurrentUserId(state), - dmGmLimit: ownProps.adminMode && ownProps.userPreferences ? getUserVisibleDmGmLimit(ownProps.userPreferences) : getVisibleDmGmLimit(state), + userId: ownProps.adminMode ? ownProps.userId : getCurrentUserId(state), + dmGmLimit: getVisibleDmGmLimit(state, userPreferences), }; } diff --git a/webapp/channels/src/components/user_settings/sidebar/limit_visible_gms_dms/limit_visible_gms_dms.tsx b/webapp/channels/src/components/user_settings/sidebar/limit_visible_gms_dms/limit_visible_gms_dms.tsx index 331b386a53..90ead97291 100644 --- a/webapp/channels/src/components/user_settings/sidebar/limit_visible_gms_dms/limit_visible_gms_dms.tsx +++ b/webapp/channels/src/components/user_settings/sidebar/limit_visible_gms_dms/limit_visible_gms_dms.tsx @@ -25,7 +25,7 @@ type Limit = { export type OwnProps = { adminMode?: boolean; - currentUserId?: string; + userId: string; userPreferences?: PreferencesType; } @@ -104,14 +104,14 @@ export default class LimitVisibleGMsDMs extends React.PureComponent { - if (!this.props.currentUserId) { + if (!this.props.userId) { return; } this.setState({isSaving: true}); - await this.props.savePreferences(this.props.currentUserId, [{ - user_id: this.props.currentUserId, + await this.props.savePreferences(this.props.userId, [{ + user_id: this.props.userId, category: Preferences.CATEGORY_SIDEBAR_SETTINGS, name: Preferences.LIMIT_VISIBLE_DMS_GMS, value: this.state.limit.value.toString(), diff --git a/webapp/channels/src/components/user_settings/sidebar/show_unreads_category/index.ts b/webapp/channels/src/components/user_settings/sidebar/show_unreads_category/index.ts index 843496de79..ae54045d33 100644 --- a/webapp/channels/src/components/user_settings/sidebar/show_unreads_category/index.ts +++ b/webapp/channels/src/components/user_settings/sidebar/show_unreads_category/index.ts @@ -4,9 +4,7 @@ import {connect} from 'react-redux'; import {savePreferences} from 'mattermost-redux/actions/preferences'; -import {getConfig} from 'mattermost-redux/selectors/entities/general'; import { - calculateUserShouldShowUnreadsCategory, shouldShowUnreadsCategory, } from 'mattermost-redux/selectors/entities/preferences'; import {getCurrentUserId} from 'mattermost-redux/selectors/entities/users'; @@ -17,10 +15,10 @@ import type {OwnProps} from './show_unreads_category'; import ShowUnreadsCategory from './show_unreads_category'; function mapStateToProps(state: GlobalState, props: OwnProps) { - const serverDefault = getConfig(state).ExperimentalGroupUnreadChannels; + const userPreferences = props.adminMode && props.userPreferences ? props.userPreferences : undefined; return { - currentUserId: props.adminMode ? props.currentUserId : getCurrentUserId(state), - showUnreadsCategory: props.adminMode && props.userPreferences ? calculateUserShouldShowUnreadsCategory(props.userPreferences, serverDefault) : shouldShowUnreadsCategory(state), + userId: props.adminMode ? props.userId : getCurrentUserId(state), + showUnreadsCategory: shouldShowUnreadsCategory(state, userPreferences), }; } diff --git a/webapp/channels/src/components/user_settings/sidebar/show_unreads_category/show_unreads_category.tsx b/webapp/channels/src/components/user_settings/sidebar/show_unreads_category/show_unreads_category.tsx index 0f63bf0a4b..48f4b118c0 100644 --- a/webapp/channels/src/components/user_settings/sidebar/show_unreads_category/show_unreads_category.tsx +++ b/webapp/channels/src/components/user_settings/sidebar/show_unreads_category/show_unreads_category.tsx @@ -18,7 +18,7 @@ import {a11yFocus} from 'utils/utils'; export type OwnProps = { adminMode?: boolean; - currentUserId?: string; + userId: string; userPreferences?: PreferencesType; } @@ -80,15 +80,15 @@ export default class ShowUnreadsCategory extends React.PureComponent { - if (!this.props.currentUserId) { + if (!this.props.userId) { // Only for type safety, won't actually happen return; } this.setState({isSaving: true}); - await this.props.savePreferences(this.props.currentUserId, [{ - user_id: this.props.currentUserId, + await this.props.savePreferences(this.props.userId, [{ + user_id: this.props.userId, category: Preferences.CATEGORY_SIDEBAR_SETTINGS, name: Preferences.SHOW_UNREAD_SECTION, value: this.state.checked.toString(), diff --git a/webapp/channels/src/components/user_settings/sidebar/user_settings_sidebar.tsx b/webapp/channels/src/components/user_settings/sidebar/user_settings_sidebar.tsx index bbb5c1f223..aaa01ac990 100644 --- a/webapp/channels/src/components/user_settings/sidebar/user_settings_sidebar.tsx +++ b/webapp/channels/src/components/user_settings/sidebar/user_settings_sidebar.tsx @@ -18,7 +18,7 @@ export interface Props { closeModal: () => void; collapseModal: () => void; adminMode?: boolean; - currentUserId?: string; + userId: string; userPreferences?: PreferencesType; } @@ -54,7 +54,7 @@ export default function UserSettingsSidebar(props: Props): JSX.Element { updateSection={props.updateSection} areAllSectionsInactive={props.activeSection === ''} adminMode={props.adminMode} - currentUserId={props.currentUserId} + userId={props.userId} userPreferences={props.userPreferences} />
@@ -63,7 +63,7 @@ export default function UserSettingsSidebar(props: Props): JSX.Element { updateSection={props.updateSection} areAllSectionsInactive={props.activeSection === ''} adminMode={props.adminMode} - currentUserId={props.currentUserId} + userId={props.userId} userPreferences={props.userPreferences} />
diff --git a/webapp/channels/src/components/widgets/smartLoader/index.tsx b/webapp/channels/src/components/widgets/smart_loader/index.tsx similarity index 95% rename from webapp/channels/src/components/widgets/smartLoader/index.tsx rename to webapp/channels/src/components/widgets/smart_loader/index.tsx index 8d042facda..a659ff220f 100644 --- a/webapp/channels/src/components/widgets/smartLoader/index.tsx +++ b/webapp/channels/src/components/widgets/smart_loader/index.tsx @@ -3,7 +3,7 @@ import React, {type ReactNode, useEffect, useState} from 'react'; -const DEFAULT_MIN_LOADER_DURATION = 1500; +const DEFAULT_MIN_LOADER_DURATION = 1000; type Props = { loading: boolean; diff --git a/webapp/channels/src/packages/mattermost-redux/src/selectors/entities/channel_categories.ts b/webapp/channels/src/packages/mattermost-redux/src/selectors/entities/channel_categories.ts index 3e2d7db401..c3c7a07ee6 100644 --- a/webapp/channels/src/packages/mattermost-redux/src/selectors/entities/channel_categories.ts +++ b/webapp/channels/src/packages/mattermost-redux/src/selectors/entities/channel_categories.ts @@ -102,7 +102,7 @@ export function makeFilterAutoclosedDMs(): (state: GlobalState, channels: Channe getCurrentUserId, getMyChannelMemberships, getChannelMessageCounts, - getVisibleDmGmLimit, + (state) => getVisibleDmGmLimit(state), getMyPreferences, isCollapsedThreadsEnabled, (channels, categoryType, currentChannelId, profiles, currentUserId, myMembers, messageCounts, limitPref, myPreferences, collapsedThreads) => { diff --git a/webapp/channels/src/packages/mattermost-redux/src/selectors/entities/preferences.ts b/webapp/channels/src/packages/mattermost-redux/src/selectors/entities/preferences.ts index 6067467a39..3286001030 100644 --- a/webapp/channels/src/packages/mattermost-redux/src/selectors/entities/preferences.ts +++ b/webapp/channels/src/packages/mattermost-redux/src/selectors/entities/preferences.ts @@ -16,11 +16,15 @@ export function getMyPreferences(state: GlobalState): { [x: string]: PreferenceT return state.entities.preferences.myPreferences; } -export function getUserPreferences(state: GlobalState, userID: string): { [x: string]: PreferenceType } { +export function getUserPreferences(state: GlobalState, userID: string): PreferencesType { return state.entities.preferences.userPreferences[userID]; } -export function get(state: GlobalState, category: string, name: string, defaultValue: any = '') { +export function get(state: GlobalState, category: string, name: string, defaultValue: any = '', preferences?: PreferencesType) { + if (preferences) { + return getFromPreferences(preferences, category, name, defaultValue); + } + const key = getPreferenceKey(category, name); const prefs = getMyPreferences(state); @@ -41,18 +45,13 @@ export function getFromPreferences(preferences: PreferencesType, category: strin return preferences[key].value; } -export function getBool(state: GlobalState, category: string, name: string, defaultValue = false): boolean { - const value = get(state, category, name, String(defaultValue)); +export function getBool(state: GlobalState, category: string, name: string, defaultValue = false, userPreferences?: PreferencesType): boolean { + const value = get(state, category, name, String(defaultValue), userPreferences); return value !== 'false'; } -export function getBoolFromPreferences(userPreferences: PreferencesType, category: string, name: string, defaultValue = false): boolean { - const value = getFromPreferences(userPreferences, category, name, String(defaultValue)); - return value !== 'false'; -} - -export function getInt(state: GlobalState, category: string, name: string, defaultValue = 0): number { - const value = get(state, category, name, defaultValue); +export function getInt(state: GlobalState, category: string, name: string, defaultValue = 0, userPreferences?: PreferencesType): number { + const value = get(state, category, name, defaultValue, userPreferences); return parseInt(value, 10); } @@ -219,42 +218,29 @@ export function makeGetStyleFromTheme