From f1a06396c6464c193e9d1da16e3ba4cd6bcdf032 Mon Sep 17 00:00:00 2001 From: Mattermost Build Date: Mon, 30 Jan 2023 21:12:26 +0200 Subject: [PATCH] Filter unused preferences (#7015) (#7061) * small preferences refactor * filter unused preferences and fix removal of preferences in the db * Feedback review (cherry picked from commit 64a59aad5593a604ad2c33f23594da81bff91835) Co-authored-by: Elias Nahum --- app/actions/local/channel.ts | 4 +- app/actions/remote/channel.ts | 8 +-- app/actions/remote/entry/common.ts | 2 +- app/actions/remote/entry/gql_common.ts | 2 +- app/actions/remote/entry/notification.ts | 6 +-- app/actions/remote/preference.ts | 31 ++++-------- app/actions/remote/retry.ts | 6 +-- app/actions/websocket/preferences.ts | 2 +- app/actions/websocket/users.ts | 4 +- .../autocomplete/emoji_suggestion/index.ts | 9 ++-- .../custom_status/custom_status_expiry.tsx | 9 ++-- .../post/body/content/opengraph/index.ts | 8 +-- app/components/post_list/post/header/index.ts | 9 ++-- .../post_list/thread_overview/index.ts | 5 +- app/components/system_header/index.tsx | 9 ++-- .../team_sidebar/team_list/index.ts | 2 +- app/components/threads_button/index.ts | 8 +-- app/constants/preferences.ts | 35 +++++++------ app/context/theme/index.tsx | 4 +- .../handlers/user.test.ts | 5 +- .../server_data_operator/handlers/user.ts | 39 +++++++++------ app/helpers/api/preference.ts | 50 +++++++++++++------ app/products/calls/actions/calls.ts | 4 +- .../components/calls_custom_message/index.ts | 8 +-- app/queries/servers/post.ts | 22 +++----- app/queries/servers/preference.ts | 31 ++++++++++-- app/queries/servers/team.ts | 6 +-- app/queries/servers/thread.ts | 8 +-- app/queries/servers/user.ts | 7 ++- .../channel/channel_post_list/index.ts | 8 +-- .../components/date_time_selector.tsx | 8 +-- .../emoji_picker/picker/filtered/index.ts | 4 +- .../emoji_picker/picker/header/index.ts | 4 +- .../categories_list/categories/body/index.ts | 14 +++--- .../categories_list/categories/index.ts | 8 +-- .../categories/unreads/index.ts | 8 +-- .../categories_list/subheader/index.ts | 8 +-- app/screens/home/saved_messages/index.ts | 5 +- app/screens/settings/display/index.tsx | 8 +-- .../settings/display_clock/display_clock.tsx | 2 +- app/screens/settings/display_clock/index.tsx | 8 +-- .../settings/display_crt/display_crt.tsx | 2 +- .../settings/display_theme/display_theme.tsx | 4 +- .../settings/display_theme/theme_tiles.tsx | 2 +- .../settings/notification_email/index.tsx | 4 +- .../notification_email/notification_email.tsx | 2 +- app/screens/settings/notifications/index.tsx | 4 +- app/screens/user_profile/index.ts | 8 +-- app/utils/thread/index.ts | 4 +- 49 files changed, 246 insertions(+), 212 deletions(-) diff --git a/app/actions/local/channel.ts b/app/actions/local/channel.ts index f31cac9aa..6ab57bb6a 100644 --- a/app/actions/local/channel.ts +++ b/app/actions/local/channel.ts @@ -13,7 +13,7 @@ import { prepareDeleteChannel, prepareMyChannelsForTeam, queryAllMyChannel, getMyChannel, getChannelById, queryUsersOnChannel, queryUserChannelsByTypes, } from '@queries/servers/channel'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {prepareCommonSystemValues, PrepareCommonSystemValuesArgs, getCommonSystemValues, getCurrentTeamId, setCurrentChannelId, getCurrentUserId, getConfig, getLicense} from '@queries/servers/system'; import {addChannelToTeamHistory, addTeamToTeamHistory, getTeamById, removeChannelFromTeamHistory} from '@queries/servers/team'; import {getCurrentUser, queryUsersById} from '@queries/servers/user'; @@ -369,7 +369,7 @@ export async function updateChannelsDisplayName(serverUrl: string, channels: Cha const license = await getLicense(database); const config = await getConfig(database); - const preferences = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT).fetch(); + const preferences = await queryDisplayNamePreferences(database, Preferences.NAME_NAME_FORMAT).fetch(); const displaySettings = getTeammateNameDisplaySetting(preferences, config.LockTeammateNameDisplay, config.TeammateNameDisplay, license); const models: Model[] = []; for await (const channel of channels) { diff --git a/app/actions/remote/channel.ts b/app/actions/remote/channel.ts index af1fb841d..dfcdd9852 100644 --- a/app/actions/remote/channel.ts +++ b/app/actions/remote/channel.ts @@ -16,7 +16,7 @@ import AppsManager from '@managers/apps_manager'; import NetworkManager from '@managers/network_manager'; import {getActiveServer} from '@queries/app/servers'; import {prepareMyChannelsForTeam, getChannelById, getChannelByName, getMyChannel, getChannelInfo, queryMyChannelSettingsByIds, getMembersCountByChannelsId} from '@queries/servers/channel'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {getCommonSystemValues, getConfig, getCurrentChannelId, getCurrentTeamId, getCurrentUserId, getLicense, setCurrentChannelId, setCurrentTeamAndChannelId} from '@queries/servers/system'; import {getNthLastChannelFromTeam, getMyTeamById, getTeamByName, queryMyTeams, removeChannelFromTeamHistory} from '@queries/servers/team'; import {getCurrentUser} from '@queries/servers/user'; @@ -530,7 +530,7 @@ export async function fetchDirectChannelsInfo(serverUrl: string, directChannels: return {error: `${serverUrl} database not found`}; } - const preferences = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS).fetch(); + const preferences = await queryDisplayNamePreferences(database).fetch(); const config = await getConfig(database); const license = await getLicense(database); const teammateDisplayNameSetting = getTeammateNameDisplaySetting(preferences, config?.LockTeammateNameDisplay, config?.TeammateNameDisplay, license); @@ -776,7 +776,7 @@ export async function createDirectChannel(serverUrl: string, userId: string, dis if (displayName) { created.display_name = displayName; } else { - const preferences = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT).fetch(); + const preferences = await queryDisplayNamePreferences(database, Preferences.NAME_NAME_FORMAT).fetch(); const license = await getLicense(database); const config = await getConfig(database); const teammateDisplayNameSetting = getTeammateNameDisplaySetting(preferences || [], config.LockTeammateNameDisplay, config.TeammateNameDisplay, license); @@ -918,7 +918,7 @@ export async function createGroupChannel(serverUrl: string, userIds: string[]) { return {data: created}; } - const preferences = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT).fetch(); + const preferences = await queryDisplayNamePreferences(database, Preferences.NAME_NAME_FORMAT).fetch(); const license = await getLicense(database); const config = await getConfig(database); const teammateDisplayNameSetting = getTeammateNameDisplaySetting(preferences || [], config.LockTeammateNameDisplay, config.TeammateNameDisplay, license); diff --git a/app/actions/remote/entry/common.ts b/app/actions/remote/entry/common.ts index beda43898..631efa466 100644 --- a/app/actions/remote/entry/common.ts +++ b/app/actions/remote/entry/common.ts @@ -178,7 +178,7 @@ export const fetchAppEntryData = async (serverUrl: string, sinceArg: number, ini if (!initialTeamId && teamData.teams?.length && teamData.memberships?.length) { // If no initial team was set in the database but got teams in the response const config = await getConfig(database); - const teamOrderPreference = getPreferenceValue(prefData.preferences || [], Preferences.TEAMS_ORDER, '', '') as string; + const teamOrderPreference = getPreferenceValue(prefData.preferences || [], Preferences.CATEGORIES.TEAMS_ORDER, '', ''); const teamMembers = new Set(teamData.memberships.filter((m) => m.delete_at === 0).map((m) => m.team_id)); const myTeams = teamData.teams!.filter((t) => teamMembers.has(t.id)); const defaultTeam = selectDefaultTeam(myTeams, meData.user?.locale || DEFAULT_LOCALE, teamOrderPreference, config?.ExperimentalPrimaryTeam); diff --git a/app/actions/remote/entry/gql_common.ts b/app/actions/remote/entry/gql_common.ts index 32dae476f..04840656f 100644 --- a/app/actions/remote/entry/gql_common.ts +++ b/app/actions/remote/entry/gql_common.ts @@ -217,7 +217,7 @@ export const entryGQL = async (serverUrl: string, currentTeamId?: string, curren if (!teamData.teams.length) { initialTeamId = ''; } else if (!initialTeamId || !teamData.teams.find((t) => t.id === currentTeamId && t.delete_at === 0)) { - const teamOrderPreference = getPreferenceValue(prefData.preferences || [], Preferences.TEAMS_ORDER, '', '') as string; + const teamOrderPreference = getPreferenceValue(prefData.preferences || [], Preferences.CATEGORIES.TEAMS_ORDER, '', ''); initialTeamId = selectDefaultTeam(teamData.teams, meData.user.locale, teamOrderPreference, config.ExperimentalPrimaryTeam)?.id || ''; } const gqlRoles = [ diff --git a/app/actions/remote/entry/notification.ts b/app/actions/remote/entry/notification.ts index 76ef6ee38..e3d57ac68 100644 --- a/app/actions/remote/entry/notification.ts +++ b/app/actions/remote/entry/notification.ts @@ -3,11 +3,11 @@ import {switchToChannelById} from '@actions/remote/channel'; import {fetchAndSwitchToThread} from '@actions/remote/thread'; -import {Preferences, Screens} from '@constants'; +import {Screens} from '@constants'; import {getDefaultThemeByAppearance} from '@context/theme'; import DatabaseManager from '@database/manager'; import {getMyChannel} from '@queries/servers/channel'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryThemePreferences} from '@queries/servers/preference'; import {getConfig, getCurrentTeamId, getLicense, getWebSocketLastDisconnected, setCurrentTeamAndChannelId} from '@queries/servers/system'; import {getMyTeamById} from '@queries/servers/team'; import {getIsCRTEnabled} from '@queries/servers/thread'; @@ -53,7 +53,7 @@ export async function pushNotificationEntry(serverUrl: string, notification: Not // When opening the app from a push notification the theme may not be set in the EphemeralStore // causing the goToScreen to use the Appearance theme instead and that causes the screen background color to potentially // not match the theme - const themes = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_THEME, teamId).fetch(); + const themes = await queryThemePreferences(database, teamId).fetch(); let theme = getDefaultThemeByAppearance(); if (themes.length) { theme = setThemeDefaults(JSON.parse(themes[0].value) as Theme); diff --git a/app/actions/remote/preference.ts b/app/actions/remote/preference.ts index 3180e476a..8a73a6cd7 100644 --- a/app/actions/remote/preference.ts +++ b/app/actions/remote/preference.ts @@ -5,14 +5,12 @@ import {General, Preferences} from '@constants'; import DatabaseManager from '@database/manager'; import NetworkManager from '@managers/network_manager'; import {getChannelById} from '@queries/servers/channel'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {querySavedPostsPreferences} from '@queries/servers/preference'; import {getCurrentUserId} from '@queries/servers/system'; import {getUserIdFromChannelName} from '@utils/user'; import {forceLogoutIfNecessary} from './session'; -const {CATEGORY_DIRECT_CHANNEL_SHOW, CATEGORY_GROUP_CHANNEL_SHOW, CATEGORY_FAVORITE_CHANNEL, CATEGORY_SAVED_POST} = Preferences; - export type MyPreferencesRequest = { preferences?: PreferenceType[]; error?: unknown; @@ -56,7 +54,7 @@ export const saveFavoriteChannel = async (serverUrl: string, channelId: string, try { const userId = await getCurrentUserId(operator.database); const favPref: PreferenceType = { - category: CATEGORY_FAVORITE_CHANNEL, + category: Preferences.CATEGORIES.FAVORITE_CHANNEL, name: channelId, user_id: userId, value: String(isFavorite), @@ -77,7 +75,7 @@ export const savePostPreference = async (serverUrl: string, postId: string) => { const userId = await getCurrentUserId(operator.database); const pref: PreferenceType = { user_id: userId, - category: CATEGORY_SAVED_POST, + category: Preferences.CATEGORIES.SAVED_POST, name: postId, value: 'true', }; @@ -116,23 +114,15 @@ export const savePreference = async (serverUrl: string, preferences: PreferenceT }; export const deleteSavedPost = async (serverUrl: string, postId: string) => { - const operator = DatabaseManager.serverDatabases[serverUrl]?.operator; - if (!operator) { - return {error: `${serverUrl} database not found`}; - } - let client; try { - client = NetworkManager.getClient(serverUrl); - } catch (error) { - return {error}; - } - try { - const userId = await getCurrentUserId(operator.database); - const records = await queryPreferencesByCategoryAndName(operator.database, CATEGORY_SAVED_POST, postId).fetch(); + const {database} = DatabaseManager.getServerDatabaseAndOperator(serverUrl); + const client = NetworkManager.getClient(serverUrl); + const userId = await getCurrentUserId(database); + const records = await querySavedPostsPreferences(database, postId).fetch(); const postPreferenceRecord = records.find((r) => postId === r.name); const pref = { user_id: userId, - category: CATEGORY_SAVED_POST, + category: Preferences.CATEGORIES.SAVED_POST, name: postId, value: 'true', }; @@ -161,7 +151,8 @@ export const setDirectChannelVisible = async (serverUrl: string, channelId: stri const channel = await getChannelById(database, channelId); if (channel?.type === General.DM_CHANNEL || channel?.type === General.GM_CHANNEL) { const userId = await getCurrentUserId(database); - const category = channel.type === General.DM_CHANNEL ? CATEGORY_DIRECT_CHANNEL_SHOW : CATEGORY_GROUP_CHANNEL_SHOW; + const {DIRECT_CHANNEL_SHOW, GROUP_CHANNEL_SHOW} = Preferences.CATEGORIES; + const category = channel.type === General.DM_CHANNEL ? DIRECT_CHANNEL_SHOW : GROUP_CHANNEL_SHOW; const name = channel.type === General.DM_CHANNEL ? getUserIdFromChannelName(userId, channel.name) : channelId; const pref: PreferenceType = { user_id: userId, @@ -185,7 +176,7 @@ export const savePreferredSkinTone = async (serverUrl: string, skinCode: string) const userId = await getCurrentUserId(database); const pref: PreferenceType = { user_id: userId, - category: Preferences.CATEGORY_EMOJI, + category: Preferences.CATEGORIES.EMOJI, name: Preferences.EMOJI_SKINTONE, value: skinCode, }; diff --git a/app/actions/remote/retry.ts b/app/actions/remote/retry.ts index 0c078c2a7..a71dec054 100644 --- a/app/actions/remote/retry.ts +++ b/app/actions/remote/retry.ts @@ -9,7 +9,7 @@ import {selectDefaultTeam} from '@helpers/api/team'; import NetworkManager from '@managers/network_manager'; import {prepareCategoriesAndCategoriesChannels} from '@queries/servers/categories'; import {prepareMyChannelsForTeam} from '@queries/servers/channel'; -import {prepareMyPreferences, queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {prepareMyPreferences, queryDisplayNamePreferences} from '@queries/servers/preference'; import {prepareCommonSystemValues, getConfig, getLicense} from '@queries/servers/system'; import {prepareMyTeams} from '@queries/servers/team'; import {getCurrentUser} from '@queries/servers/user'; @@ -60,7 +60,7 @@ export async function retryInitialTeamAndChannel(serverUrl: string) { // select initial team if (!clData.error && !prefData.error && !teamData.error) { - const teamOrderPreference = getPreferenceValue(prefData.preferences!, Preferences.TEAMS_ORDER, '', '') as string; + const teamOrderPreference = getPreferenceValue(prefData.preferences!, Preferences.CATEGORIES.TEAMS_ORDER, '', ''); const teamRoles: string[] = []; const teamMembers = new Set(); @@ -157,7 +157,7 @@ export async function retryInitialChannel(serverUrl: string, teamId: string) { return {error: true}; } - const prefs = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT).fetch(); + const prefs = await queryDisplayNamePreferences(database, Preferences.NAME_NAME_FORMAT).fetch(); const preferences: PreferenceType[] = prefs.map((p) => ({ category: p.category, name: p.name, diff --git a/app/actions/websocket/preferences.ts b/app/actions/websocket/preferences.ts index a3b1e7b30..a0173d59c 100644 --- a/app/actions/websocket/preferences.ts +++ b/app/actions/websocket/preferences.ts @@ -107,7 +107,7 @@ async function handleSavePostAdded(serverUrl: string, preferences: PreferenceTyp return; } - const savedPosts = preferences.filter((p) => p.category === Preferences.CATEGORY_SAVED_POST); + const savedPosts = preferences.filter((p) => p.category === Preferences.CATEGORIES.SAVED_POST); for await (const saved of savedPosts) { const post = await getPostById(database, saved.name); if (!post) { diff --git a/app/actions/websocket/users.ts b/app/actions/websocket/users.ts index 71ba361fc..089fe786d 100644 --- a/app/actions/websocket/users.ts +++ b/app/actions/websocket/users.ts @@ -10,7 +10,7 @@ import DatabaseManager from '@database/manager'; import {getTeammateNameDisplaySetting} from '@helpers/api/preference'; import WebsocketManager from '@managers/websocket_manager'; import {queryChannelsByTypes, queryUserChannelsByTypes} from '@queries/servers/channel'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {getConfig, getLicense} from '@queries/servers/system'; import {getCurrentUser} from '@queries/servers/user'; import {displayUsername} from '@utils/user'; @@ -91,7 +91,7 @@ export async function handleUserTypingEvent(serverUrl: string, msg: WebSocketMes const {users, existingUsers} = await fetchUsersByIds(serverUrl, [msg.data.user_id]); const user = users?.[0] || existingUsers?.[0]; - const namePreference = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT).fetch(); + const namePreference = await queryDisplayNamePreferences(database, Preferences.NAME_NAME_FORMAT).fetch(); const teammateDisplayNameSetting = getTeammateNameDisplaySetting(namePreference, config.LockTeammateNameDisplay, config.TeammateNameDisplay, license); const currentUser = await getCurrentUser(database); const username = displayUsername(user, currentUser?.locale, teammateDisplayNameSetting); diff --git a/app/components/autocomplete/emoji_suggestion/index.ts b/app/components/autocomplete/emoji_suggestion/index.ts index 456e1e800..d816293d5 100644 --- a/app/components/autocomplete/emoji_suggestion/index.ts +++ b/app/components/autocomplete/emoji_suggestion/index.ts @@ -8,7 +8,7 @@ import {switchMap} from 'rxjs/operators'; import {Preferences} from '@constants'; import {queryAllCustomEmojis} from '@queries/servers/custom_emoji'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryEmojiPreferences} from '@queries/servers/preference'; import {observeConfigBooleanValue} from '@queries/servers/system'; import EmojiSuggestion from './emoji_suggestion'; @@ -21,12 +21,9 @@ const enhanced = withObservables([], ({database}: WithDatabaseArgs) => { const isCustomEmojisEnabled = observeConfigBooleanValue(database, 'EnableCustomEmoji'); return { customEmojis: isCustomEmojisEnabled.pipe( - switchMap((enabled) => (enabled ? - queryAllCustomEmojis(database).observe() : - of$(emptyEmojiList)), - ), + switchMap((enabled) => (enabled ? queryAllCustomEmojis(database).observe() : of$(emptyEmojiList))), ), - skinTone: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_EMOJI, Preferences.EMOJI_SKINTONE). + skinTone: queryEmojiPreferences(database, Preferences.EMOJI_SKINTONE). observeWithColumns(['value']).pipe( switchMap((prefs) => of$(prefs?.[0]?.value ?? 'default')), ), diff --git a/app/components/custom_status/custom_status_expiry.tsx b/app/components/custom_status/custom_status_expiry.tsx index 7277fd189..b3fee4b2a 100644 --- a/app/components/custom_status/custom_status_expiry.tsx +++ b/app/components/custom_status/custom_status_expiry.tsx @@ -12,9 +12,8 @@ import {switchMap} from 'rxjs/operators'; import FormattedDate from '@components/formatted_date'; import FormattedText from '@components/formatted_text'; import FormattedTime from '@components/formatted_time'; -import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {getDisplayNamePreferenceAsBool} from '@helpers/api/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {observeCurrentUser} from '@queries/servers/user'; import {getCurrentMomentForTimezone} from '@utils/helpers'; import {makeStyleSheetFromTheme} from '@utils/theme'; @@ -134,10 +133,10 @@ const CustomStatusExpiry = ({currentUser, isMilitaryTime, showPrefix, showTimeCo const enhanced = withObservables([], ({database}: WithDatabaseArgs) => ({ currentUser: observeCurrentUser(database), - isMilitaryTime: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS). + isMilitaryTime: queryDisplayNamePreferences(database). observeWithColumns(['value']).pipe( switchMap( - (preferences) => of$(getPreferenceAsBool(preferences, Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time', false)), + (preferences) => of$(getDisplayNamePreferenceAsBool(preferences, 'use_military_time')), ), ), })); diff --git a/app/components/post_list/post/body/content/opengraph/index.ts b/app/components/post_list/post/body/content/opengraph/index.ts index d11cafa46..ea237a50c 100644 --- a/app/components/post_list/post/body/content/opengraph/index.ts +++ b/app/components/post_list/post/body/content/opengraph/index.ts @@ -6,8 +6,8 @@ import withObservables from '@nozbe/with-observables'; import {of as of$, combineLatest} from 'rxjs'; import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {getDisplayNamePreferenceAsBool} from '@helpers/api/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {observeConfigBooleanValue} from '@queries/servers/system'; import Opengraph from './opengraph'; @@ -22,10 +22,10 @@ const enhance = withObservables( } const linkPreviewsConfig = observeConfigBooleanValue(database, 'EnableLinkPreviews'); - const linkPreviewPreference = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.LINK_PREVIEW_DISPLAY). + const linkPreviewPreference = queryDisplayNamePreferences(database, Preferences.LINK_PREVIEW_DISPLAY). observeWithColumns(['value']); const showLinkPreviews = combineLatest([linkPreviewsConfig, linkPreviewPreference], (cfg, pref) => { - const previewsEnabled = getPreferenceAsBool(pref, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.LINK_PREVIEW_DISPLAY, true); + const previewsEnabled = getDisplayNamePreferenceAsBool(pref, Preferences.LINK_PREVIEW_DISPLAY, true); return of$(previewsEnabled && cfg); }); diff --git a/app/components/post_list/post/header/index.ts b/app/components/post_list/post/header/index.ts index d56e8ce49..9932dbe31 100644 --- a/app/components/post_list/post/header/index.ts +++ b/app/components/post_list/post/header/index.ts @@ -6,10 +6,9 @@ import withObservables from '@nozbe/with-observables'; import {of as of$} from 'rxjs'; import {map, switchMap} from 'rxjs/operators'; -import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; +import {getDisplayNamePreferenceAsBool} from '@helpers/api/preference'; import {observePost, observePostAuthor, queryPostReplies} from '@queries/servers/post'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {observeConfigBooleanValue} from '@queries/servers/system'; import {observeTeammateNameDisplay, observeUser} from '@queries/servers/user'; @@ -26,12 +25,12 @@ type HeaderInputProps = { const withHeaderProps = withObservables( ['post', 'differentThreadSequence'], ({post, database, differentThreadSequence}: WithDatabaseArgs & HeaderInputProps) => { - const preferences = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS). + const preferences = queryDisplayNamePreferences(database). observeWithColumns(['value']); const author = observePostAuthor(database, post); const enablePostUsernameOverride = observeConfigBooleanValue(database, 'EnablePostUsernameOverride'); const isTimezoneEnabled = observeConfigBooleanValue(database, 'ExperimentalTimezone'); - const isMilitaryTime = preferences.pipe(map((prefs) => getPreferenceAsBool(prefs, Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time', false))); + const isMilitaryTime = preferences.pipe(map((prefs) => getDisplayNamePreferenceAsBool(prefs, 'use_military_time'))); const teammateNameDisplay = observeTeammateNameDisplay(database); const commentCount = queryPostReplies(database, post.rootId || post.id).observeCount(); const isCustomStatusEnabled = observeConfigBooleanValue(database, 'EnableCustomUserStatuses'); diff --git a/app/components/post_list/thread_overview/index.ts b/app/components/post_list/thread_overview/index.ts index 1e946fa6b..cbf8327fc 100644 --- a/app/components/post_list/thread_overview/index.ts +++ b/app/components/post_list/thread_overview/index.ts @@ -6,9 +6,8 @@ import withObservables from '@nozbe/with-observables'; import {of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; -import {Preferences} from '@constants'; import {observePost, queryPostReplies} from '@queries/servers/post'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {querySavedPostsPreferences} from '@queries/servers/preference'; import ThreadOverview from './thread_overview'; @@ -19,7 +18,7 @@ const enhanced = withObservables( ({database, rootId}: WithDatabaseArgs & {rootId: string}) => { return { rootPost: observePost(database, rootId), - isSaved: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_SAVED_POST, rootId). + isSaved: querySavedPostsPreferences(database, rootId). observeWithColumns(['value']). pipe( switchMap((pref) => of$(Boolean(pref[0]?.value === 'true'))), diff --git a/app/components/system_header/index.tsx b/app/components/system_header/index.tsx index a33209e05..53f16110c 100644 --- a/app/components/system_header/index.tsx +++ b/app/components/system_header/index.tsx @@ -9,9 +9,8 @@ import {map} from 'rxjs/operators'; import FormattedText from '@components/formatted_text'; import FormattedTime from '@components/formatted_time'; -import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {getDisplayNamePreferenceAsBool} from '@helpers/api/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {observeConfigBooleanValue} from '@queries/servers/system'; import {observeCurrentUser} from '@queries/servers/user'; import {makeStyleSheetFromTheme} from '@utils/theme'; @@ -80,11 +79,11 @@ const SystemHeader = ({isMilitaryTime, isTimezoneEnabled, createAt, theme, user} }; const enhanced = withObservables([], ({database}: WithDatabaseArgs) => { - const preferences = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time'). + const preferences = queryDisplayNamePreferences(database, 'use_military_time'). observeWithColumns(['value']); const isTimezoneEnabled = observeConfigBooleanValue(database, 'ExperimentalTimezone'); const isMilitaryTime = preferences.pipe( - map((prefs) => getPreferenceAsBool(prefs, Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time', false)), + map((prefs) => getDisplayNamePreferenceAsBool(prefs, 'use_military_time')), ); const user = observeCurrentUser(database); diff --git a/app/components/team_sidebar/team_list/index.ts b/app/components/team_sidebar/team_list/index.ts index 3829bb2af..20c0aae78 100644 --- a/app/components/team_sidebar/team_list/index.ts +++ b/app/components/team_sidebar/team_list/index.ts @@ -21,7 +21,7 @@ const withTeams = withObservables([], ({database}: WithDatabaseArgs) => { const teamIds = queryJoinedTeams(database).observe().pipe( map((ts) => ts.map((t) => ({id: t.id, displayName: t.displayName}))), ); - const order = queryPreferencesByCategoryAndName(database, Preferences.TEAMS_ORDER). + const order = queryPreferencesByCategoryAndName(database, Preferences.CATEGORIES.TEAMS_ORDER). observeWithColumns(['value']).pipe( switchMap((p) => (p.length ? of$(p[0].value.split(',')) : of$([]))), ); diff --git a/app/components/threads_button/index.ts b/app/components/threads_button/index.ts index 396c3072b..eec587956 100644 --- a/app/components/threads_button/index.ts +++ b/app/components/threads_button/index.ts @@ -7,8 +7,8 @@ import {of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; import Preferences from '@constants/preferences'; -import {getPreferenceAsBool} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {getSidebarPreferenceAsBool} from '@helpers/api/preference'; +import {querySidebarPreferences} from '@queries/servers/preference'; import {observeCurrentChannelId, observeCurrentTeamId, observeOnlyUnreads} from '@queries/servers/system'; import {observeUnreadsAndMentionsInTeam} from '@queries/servers/thread'; @@ -22,10 +22,10 @@ const enhanced = withObservables([], ({database}: WithDatabaseArgs) => { return { currentChannelId: observeCurrentChannelId(database), - groupUnreadsSeparately: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). + groupUnreadsSeparately: querySidebarPreferences(database, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). observeWithColumns(['value']). pipe( - switchMap((prefs: PreferenceModel[]) => of$(getPreferenceAsBool(prefs, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS, false))), + switchMap((prefs: PreferenceModel[]) => of$(getSidebarPreferenceAsBool(prefs, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS))), ), onlyUnreads: observeOnlyUnreads(database), unreadsAndMentions: currentTeamId.pipe( diff --git a/app/constants/preferences.ts b/app/constants/preferences.ts index 7da1dd3d4..efc154e0e 100644 --- a/app/constants/preferences.ts +++ b/app/constants/preferences.ts @@ -1,16 +1,26 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -const Preferences: Record = { - CATEGORY_CHANNEL_OPEN_TIME: 'channel_open_time', - CATEGORY_CHANNEL_APPROXIMATE_VIEW_TIME: 'channel_approximate_view_time', - CATEGORY_DIRECT_CHANNEL_SHOW: 'direct_channel_show', - CATEGORY_GROUP_CHANNEL_SHOW: 'group_channel_show', - CATEGORY_EMOJI: 'emoji', - CATEGORY_SAVED_POST: 'flagged_post', - CATEGORY_FAVORITE_CHANNEL: 'favorite_channel', - CATEGORY_AUTO_RESET_MANUAL_STATUS: 'auto_reset_manual_status', - CATEGORY_NOTIFICATIONS: 'notifications', +export const CATEGORIES_TO_KEEP: Record = { + ADVANCED_SETTINGS: 'advanced_settings', + DIRECT_CHANNEL_SHOW: 'direct_channel_show', + GROUP_CHANNEL_SHOW: 'group_channel_show', + DISPLAY_SETTINGS: 'display_settings', + EMOJI: 'emoji', + NOTIFICATIONS: 'notifications', + SAVED_POST: 'flagged_post', + SIDEBAR_SETTINGS: 'sidebar_settings', + TEAMS_ORDER: 'teams_order', + THEME: 'theme', +}; + +const CATEGORIES: Record = { + ...CATEGORIES_TO_KEEP, + FAVORITE_CHANNEL: 'favorite_channel', +}; + +const Preferences = { + CATEGORIES, COLLAPSED_REPLY_THREADS: 'collapsed_reply_threads', COLLAPSED_REPLY_THREADS_OFF: 'off', COLLAPSED_REPLY_THREADS_ON: 'on', @@ -27,7 +37,6 @@ const Preferences: Record = { // "immediate" is a 30 second interval INTERVAL_NEVER: 0, INTERVAL_NOT_SET: -1, - CATEGORY_DISPLAY_SETTINGS: 'display_settings', NAME_NAME_FORMAT: 'name_format', DISPLAY_PREFER_NICKNAME: 'nickname_full_name', DISPLAY_PREFER_FULL_NAME: 'full_name', @@ -36,18 +45,14 @@ const Preferences: Record = { LINK_PREVIEW_DISPLAY: 'link_previews', MENTION_KEYS: 'mention_keys', USE_MILITARY_TIME: 'use_military_time', - CATEGORY_SIDEBAR_SETTINGS: 'sidebar_settings', CHANNEL_SIDEBAR_ORGANIZATION: 'channel_sidebar_organization', CHANNEL_SIDEBAR_LIMIT_DMS: 'limit_visible_dms_gms', CHANNEL_SIDEBAR_LIMIT_DMS_DEFAULT: 20, CHANNEL_SIDEBAR_GROUP_UNREADS: 'show_unread_section', AUTOCLOSE_DMS_ENABLED: 'after_seven_days', - CATEGORY_ADVANCED_SETTINGS: 'advanced_settings', ADVANCED_FILTER_JOIN_LEAVE: 'join_leave', ADVANCED_CODE_BLOCK_ON_CTRL_ENTER: 'code_block_ctrl_enter', ADVANCED_SEND_ON_CTRL_ENTER: 'send_on_ctrl_enter', - CATEGORY_THEME: 'theme', - TEAMS_ORDER: 'teams_order', THEMES: { denim: { type: 'Denim', diff --git a/app/context/theme/index.tsx b/app/context/theme/index.tsx index 261eea249..057e3cb44 100644 --- a/app/context/theme/index.tsx +++ b/app/context/theme/index.tsx @@ -6,7 +6,7 @@ import React, {ComponentType, createContext, useEffect, useState} from 'react'; import {Appearance} from 'react-native'; import {Preferences} from '@constants'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryThemePreferences} from '@queries/servers/preference'; import {observeCurrentTeamId} from '@queries/servers/system'; import {setThemeDefaults, updateThemeIfNeeded} from '@utils/theme'; @@ -97,7 +97,7 @@ export function useTheme(): Theme { const enhancedThemeProvider = withObservables([], ({database}: {database: Database}) => ({ currentTeamId: observeCurrentTeamId(database), - themes: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_THEME).observeWithColumns(['value']), + themes: queryThemePreferences(database).observeWithColumns(['value']), })); export default enhancedThemeProvider(ThemeProvider); diff --git a/app/database/operator/server_data_operator/handlers/user.test.ts b/app/database/operator/server_data_operator/handlers/user.test.ts index 18e8ed73e..360930e85 100644 --- a/app/database/operator/server_data_operator/handlers/user.test.ts +++ b/app/database/operator/server_data_operator/handlers/user.test.ts @@ -131,7 +131,7 @@ describe('*** Operator: User Handlers tests ***', () => { }, { user_id: '9ciscaqbrpd6d8s68k76xb9bte', - category: 'tutorial_step', + category: 'tutorial_step', // we aren't using this category in the app, should be filtered name: '9ciscaqbrpd6d8s68k76xb9bte', value: '2', }, @@ -140,12 +140,13 @@ describe('*** Operator: User Handlers tests ***', () => { await operator.handlePreferences({ preferences, prepareRecordsOnly: false, + sync: false, }); expect(spyOnHandleRecords).toHaveBeenCalledTimes(1); expect(spyOnHandleRecords).toHaveBeenCalledWith({ fieldName: 'user_id', - createOrUpdateRawValues: preferences, + createOrUpdateRawValues: preferences.filter((p) => p.category !== 'tutorial_step'), tableName: 'Preference', prepareRecordsOnly: true, buildKeyRecordBy: buildPreferenceKey, diff --git a/app/database/operator/server_data_operator/handlers/user.ts b/app/database/operator/server_data_operator/handlers/user.ts index 51ddff7ba..bf62b8285 100644 --- a/app/database/operator/server_data_operator/handlers/user.ts +++ b/app/database/operator/server_data_operator/handlers/user.ts @@ -8,6 +8,7 @@ import { transformUserRecord, } from '@database/operator/server_data_operator/transformers/user'; import {getUniqueRawsBy} from '@database/operator/utils/general'; +import {filterPreferences} from '@helpers/api/preference'; import {logWarning} from '@utils/log'; import type { @@ -33,22 +34,25 @@ const UserHandler = (superclass: any) => class extends superclass { * @returns {Promise} */ handlePreferences = async ({preferences, prepareRecordsOnly = true, sync = false}: HandlePreferencesArgs): Promise => { - if (!preferences?.length) { + const records: PreferenceModel[] = []; + const filtered = filterPreferences(preferences); + if (!filtered?.length) { logWarning( 'An empty or undefined "preferences" array has been passed to the handlePreferences method', ); - return []; + return records; } // WE NEED TO SYNC THE PREFS FROM WHAT WE GOT AND WHAT WE HAVE const deleteValues: PreferenceModel[] = []; const stored = await this.database.get(PREFERENCE).query().fetch() as PreferenceModel[]; - const preferenesMap = new Map(stored.map((p) => { + const storedPreferencesMap = new Map(stored.map((p) => { return [`${p.category}-${p.name}`, p]; })); if (sync) { + const rawPreferencesMap = new Map(filtered.map((p) => [`${p.category}-${p.name}`, p])); for (const pref of stored) { - const exists = preferenesMap.get(`${pref.category}-${pref.name}`); + const exists = rawPreferencesMap.get(`${pref.category}-${pref.name}`); if (!exists) { pref.prepareDestroyPermanently(); deleteValues.push(pref); @@ -56,9 +60,9 @@ const UserHandler = (superclass: any) => class extends superclass { } } - const createOrUpdateRawValues = preferences.reduce((res: PreferenceType[], p) => { + const createOrUpdateRawValues = filtered.reduce((res: PreferenceType[], p) => { const id = `${p.category}-${p.name}`; - const exist = preferenesMap.get(id); + const exist = storedPreferencesMap.get(id); if (!exist) { res.push(p); return res; @@ -71,18 +75,21 @@ const UserHandler = (superclass: any) => class extends superclass { return res; }, []); - if (!createOrUpdateRawValues.length) { - return []; + if (!createOrUpdateRawValues.length && !deleteValues.length) { + return records; } - const records: PreferenceModel[] = await this.handleRecords({ - fieldName: 'user_id', - buildKeyRecordBy: buildPreferenceKey, - transformer: transformPreferenceRecord, - prepareRecordsOnly: true, - createOrUpdateRawValues, - tableName: PREFERENCE, - }); + if (createOrUpdateRawValues.length) { + const createOrUpdate: PreferenceModel[] = await this.handleRecords({ + fieldName: 'user_id', + buildKeyRecordBy: buildPreferenceKey, + transformer: transformPreferenceRecord, + prepareRecordsOnly: true, + createOrUpdateRawValues, + tableName: PREFERENCE, + }); + records.push(...createOrUpdate); + } if (deleteValues.length) { records.push(...deleteValues); diff --git a/app/helpers/api/preference.ts b/app/helpers/api/preference.ts index f55478f6e..b3f824b53 100644 --- a/app/helpers/api/preference.ts +++ b/app/helpers/api/preference.ts @@ -2,17 +2,22 @@ // See LICENSE.txt for license information. import {General, Preferences} from '@constants'; +import {CATEGORIES_TO_KEEP} from '@constants/preferences'; import type PreferenceModel from '@typings/database/models/servers/preference'; -export function getPreferenceValue(preferences: Array, category: string, name: string, defaultValue: unknown = '') { +type Preference = PreferenceModel | PreferenceType; + +const categoriesToKeep = new Set(Object.values(CATEGORIES_TO_KEEP)); + +export function getPreferenceValue(preferences: Preference[], category: string, name: string, defaultValue = '' as unknown) { const pref = preferences.find((p) => p.category === category && p.name === name); - return pref?.value || defaultValue; + return (pref?.value || defaultValue) as T; } -export function getPreferenceAsBool(preferences: PreferenceType[] | PreferenceModel[], category: string, name: string, defaultValue = false) { - const value = getPreferenceValue(preferences, category, name, defaultValue); +export function getPreferenceAsBool(preferences: Preference[], category: string, name: string, defaultValue = false) { + const value = getPreferenceValue(preferences, category, name, defaultValue); if (typeof value === 'boolean') { return defaultValue; } @@ -20,18 +25,9 @@ export function getPreferenceAsBool(preferences: PreferenceType[] | PreferenceMo return value !== 'false'; } -export function getPreferenceAsInt(preferences: PreferenceType[] | PreferenceModel[], category: string, name: string, defaultValue = 0) { - const value = getPreferenceValue(preferences, category, name, defaultValue); - if (value) { - return parseInt(value as string, 10); - } - - return defaultValue; -} - -export function getTeammateNameDisplaySetting(preferences: PreferenceType[] | PreferenceModel[], lockTeammateNameDisplay?: string, teammateNameDisplay?: string, license?: ClientLicense) { +export function getTeammateNameDisplaySetting(preferences: Preference[], lockTeammateNameDisplay?: string, teammateNameDisplay?: string, license?: ClientLicense) { const useAdminTeammateNameDisplaySetting = license?.LockTeammateNameDisplay === 'true' && lockTeammateNameDisplay === 'true'; - const preference = getPreferenceValue(preferences, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT, '') as string; + const preference = getPreferenceValue(preferences, Preferences.CATEGORIES.DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT, ''); if (preference && !useAdminTeammateNameDisplaySetting) { return preference; } else if (teammateNameDisplay) { @@ -40,3 +36,27 @@ export function getTeammateNameDisplaySetting(preferences: PreferenceType[] | Pr return General.TEAMMATE_NAME_DISPLAY.SHOW_USERNAME; } + +export function getAdvanceSettingPreferenceAsBool(preferences: Preference[], name: string, defaultValue = false) { + return getPreferenceAsBool(preferences, Preferences.CATEGORIES.ADVANCED_SETTINGS, name, defaultValue); +} + +export function getDisplayNamePreferenceAsBool(preferences: Preference[], name: string, defaultValue = false) { + return getPreferenceAsBool(preferences, Preferences.CATEGORIES.DISPLAY_SETTINGS, name, defaultValue); +} + +export function getDisplayNamePreference(preferences: Preference[], name: string, defaultValue = '' as unknown) { + return getPreferenceValue(preferences, Preferences.CATEGORIES.DISPLAY_SETTINGS, name, defaultValue); +} + +export function getSidebarPreferenceAsBool(preferences: Preference[], name: string, defaultValue = false) { + return getPreferenceAsBool(preferences, Preferences.CATEGORIES.SIDEBAR_SETTINGS, name, defaultValue); +} + +export function filterPreferences(preferences?: PreferenceType[]) { + if (!preferences?.length) { + return preferences; + } + + return preferences.filter((p) => categoriesToKeep.has(p.category)); +} diff --git a/app/products/calls/actions/calls.ts b/app/products/calls/actions/calls.ts index f935ff42f..61416ebd5 100644 --- a/app/products/calls/actions/calls.ts +++ b/app/products/calls/actions/calls.ts @@ -29,7 +29,7 @@ import DatabaseManager from '@database/manager'; import {getTeammateNameDisplaySetting} from '@helpers/api/preference'; import NetworkManager from '@managers/network_manager'; import {getChannelById} from '@queries/servers/channel'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {getConfig, getLicense} from '@queries/servers/system'; import {getCurrentUser, getUserById} from '@queries/servers/user'; import {dismissAllModalsAndPopToScreen} from '@screens/navigation'; @@ -385,7 +385,7 @@ export const getEndCallMessage = async (serverUrl: string, channelId: string, cu const otherUser = await getUserById(database, otherID); const license = await getLicense(database); const config = await getConfig(database); - const preferences = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT).fetch(); + const preferences = await queryDisplayNamePreferences(database, Preferences.NAME_NAME_FORMAT).fetch(); const displaySetting = getTeammateNameDisplaySetting(preferences, config.LockTeammateNameDisplay, config.TeammateNameDisplay, license); msg = intl.formatMessage({ id: 'mobile.calls_end_msg_dm', diff --git a/app/products/calls/components/calls_custom_message/index.ts b/app/products/calls/components/calls_custom_message/index.ts index 3f4234817..88c2d850f 100644 --- a/app/products/calls/components/calls_custom_message/index.ts +++ b/app/products/calls/components/calls_custom_message/index.ts @@ -10,8 +10,8 @@ import {CallsCustomMessage} from '@calls/components/calls_custom_message/calls_c import {observeIsCallLimitRestricted} from '@calls/observers'; import {observeCurrentCall} from '@calls/state'; import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {getDisplayNamePreferenceAsBool} from '@helpers/api/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {observeCurrentUser, observeTeammateNameDisplay, observeUser} from '@queries/servers/user'; import type {WithDatabaseArgs} from '@typings/database/database'; @@ -25,9 +25,9 @@ type OwnProps = { const enhanced = withObservables(['post'], ({serverUrl, post, database}: OwnProps & WithDatabaseArgs) => { const currentUser = observeCurrentUser(database); const author = observeUser(database, post.userId); - const isMilitaryTime = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS).observeWithColumns(['value']).pipe( + const isMilitaryTime = queryDisplayNamePreferences(database).observeWithColumns(['value']).pipe( switchMap( - (preferences) => of$(getPreferenceAsBool(preferences, Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time', false)), + (preferences) => of$(getDisplayNamePreferenceAsBool(preferences, Preferences.USE_MILITARY_TIME)), ), ); diff --git a/app/queries/servers/post.ts b/app/queries/servers/post.ts index 8e04c6fec..34fb538c1 100644 --- a/app/queries/servers/post.ts +++ b/app/queries/servers/post.ts @@ -5,18 +5,16 @@ import {Database, Model, Q, Query} from '@nozbe/watermelondb'; import {of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; -import {Preferences} from '@constants'; import {MM_TABLES} from '@constants/database'; -import {queryPreferencesByCategoryAndName} from './preference'; +import {querySavedPostsPreferences} from './preference'; import {observeUser} from './user'; import type PostModel from '@typings/database/models/servers/post'; import type PostInChannelModel from '@typings/database/models/servers/posts_in_channel'; import type PostsInThreadModel from '@typings/database/models/servers/posts_in_thread'; -import type PreferenceModel from '@typings/database/models/servers/preference'; -const {SERVER: {POST, POSTS_IN_CHANNEL, POSTS_IN_THREAD, PREFERENCE}} = MM_TABLES; +const {SERVER: {POST, POSTS_IN_CHANNEL, POSTS_IN_THREAD}} = MM_TABLES; export const prepareDeletePost = async (post: PostModel): Promise => { const preparedModels: Model[] = [post.prepareDestroyPermanently()]; @@ -72,7 +70,7 @@ export const observePostAuthor = (database: Database, post: PostModel) => { }; export const observePostSaved = (database: Database, postId: string) => { - return queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_SAVED_POST, postId). + return querySavedPostsPreferences(database, postId). observeWithColumns(['value']).pipe( switchMap( (pref) => of$(Boolean(pref[0]?.value === 'true')), @@ -212,13 +210,9 @@ export const observePinnedPostsInChannel = (database: Database, channelId: strin }; export const observeSavedPostsByIds = (database: Database, postIds: string[]) => { - return database.get(PREFERENCE). - query( - Q.and( - Q.where('category', Preferences.CATEGORY_SAVED_POST), - Q.where('name', Q.oneOf(postIds)), - ), - ).observeWithColumns(['name']).pipe( - switchMap((prefs) => of$(new Set(prefs.map((p) => p.name)))), - ); + return querySavedPostsPreferences(database).extend( + Q.where('name', Q.oneOf(postIds)), + ).observeWithColumns(['name']).pipe( + switchMap((prefs) => of$(new Set(prefs.map((p) => p.name)))), + ); }; diff --git a/app/queries/servers/preference.ts b/app/queries/servers/preference.ts index f5ba81c0d..d86ee6e9a 100644 --- a/app/queries/servers/preference.ts +++ b/app/queries/servers/preference.ts @@ -15,6 +15,7 @@ import type {ServerDatabase} from '@typings/database/database'; import type PreferenceModel from '@typings/database/models/servers/preference'; const {SERVER: {PREFERENCE}} = MM_TABLES; +const {ADVANCED_SETTINGS, DISPLAY_SETTINGS, EMOJI, SAVED_POST, SIDEBAR_SETTINGS, THEME} = Preferences.CATEGORIES; export async function prepareMyPreferences(operator: ServerDataOperator, preferences: PreferenceType[], sync = false): Promise { return operator.handlePreferences({ @@ -37,7 +38,7 @@ export const queryPreferencesByCategoryAndName = (database: Database, category: export const getThemeForCurrentTeam = async (database: Database): Promise => { const currentTeamId = await getCurrentTeamId(database); - const teamTheme = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_THEME, currentTeamId).fetch(); + const teamTheme = await queryPreferencesByCategoryAndName(database, THEME, currentTeamId).fetch(); if (teamTheme.length) { try { return JSON.parse(teamTheme[0].value); @@ -68,12 +69,12 @@ export async function deletePreferences(database: ServerDatabase, preferences: P } export const differsFromLocalNameFormat = async (database: Database, preferences: PreferenceType[]) => { - const displayPref = getPreferenceValue(preferences, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT) as string; + const displayPref = getPreferenceValue(preferences, DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT); if (displayPref === '') { return false; } - const currentPref = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.NAME_NAME_FORMAT, displayPref).fetch(); + const currentPref = await queryDisplayNamePreferences(database, Preferences.NAME_NAME_FORMAT, displayPref).fetch(); if (currentPref.length > 0) { return false; } @@ -93,3 +94,27 @@ export async function getHasCRTChanged(database: Database, preferences: Preferen return oldCRT !== newCRT; } + +export const queryDisplayNamePreferences = (database: Database, name?: string, value?: string) => { + return queryPreferencesByCategoryAndName(database, DISPLAY_SETTINGS, name, value); +}; + +export const querySavedPostsPreferences = (database: Database, postId?: string, value?: string) => { + return queryPreferencesByCategoryAndName(database, SAVED_POST, postId, value); +}; + +export const queryThemePreferences = (database: Database, teamId?: string) => { + return queryPreferencesByCategoryAndName(database, THEME, teamId); +}; + +export const querySidebarPreferences = (database: Database, name?: string) => { + return queryPreferencesByCategoryAndName(database, SIDEBAR_SETTINGS, name); +}; + +export const queryEmojiPreferences = (database: Database, name: string) => { + return queryPreferencesByCategoryAndName(database, EMOJI, name); +}; + +export const queryAdvanceSettingsPreferences = (database: Database, name?: string, value?: string) => { + return queryPreferencesByCategoryAndName(database, ADVANCED_SETTINGS, name, value); +}; diff --git a/app/queries/servers/team.ts b/app/queries/servers/team.ts index a148c3c59..c328da4d9 100644 --- a/app/queries/servers/team.ts +++ b/app/queries/servers/team.ts @@ -168,7 +168,7 @@ export const getLastTeam = async (database: Database, ignoreIdForDefault?: strin export const getDefaultTeamId = async (database: Database, ignoreId?: string) => { const user = await getCurrentUser(database); const config = await getConfig(database); - const teamOrderPreferences = await queryPreferencesByCategoryAndName(database, Preferences.TEAMS_ORDER, '').fetch(); + const teamOrderPreferences = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORIES.TEAMS_ORDER, '').fetch(); let teamOrderPreference = ''; if (teamOrderPreferences.length) { teamOrderPreference = teamOrderPreferences[0].value; @@ -368,9 +368,9 @@ export const getAvailableTeamIds = async (database: Database, excludeTeamId: str if (teams) { let teamOrderPreference; if (preferences) { - teamOrderPreference = getPreferenceValue(preferences, Preferences.TEAMS_ORDER, '', '') as string; + teamOrderPreference = getPreferenceValue(preferences, Preferences.CATEGORIES.TEAMS_ORDER, '', ''); } else { - const dbPreferences = await queryPreferencesByCategoryAndName(database, Preferences.TEAMS_ORDER, '').fetch(); + const dbPreferences = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORIES.TEAMS_ORDER, '').fetch(); teamOrderPreference = dbPreferences[0].value; } diff --git a/app/queries/servers/thread.ts b/app/queries/servers/thread.ts index 26283cda2..68ffceab9 100644 --- a/app/queries/servers/thread.ts +++ b/app/queries/servers/thread.ts @@ -5,13 +5,13 @@ import {Database, Q, Query} from '@nozbe/watermelondb'; import {combineLatest, of as of$, Observable} from 'rxjs'; import {map, switchMap, distinctUntilChanged} from 'rxjs/operators'; -import {Config, Preferences} from '@constants'; +import {Config} from '@constants'; import {MM_TABLES} from '@constants/database'; import {processIsCRTAllowed, processIsCRTEnabled} from '@utils/thread'; import {observeChannel} from './channel'; import {observePost} from './post'; -import {queryPreferencesByCategoryAndName} from './preference'; +import {queryDisplayNamePreferences} from './preference'; import {getConfig, observeConfigValue} from './system'; import type ServerDataOperator from '@database/operator/server_data_operator'; @@ -24,7 +24,7 @@ const {SERVER: {CHANNEL, POST, THREAD, THREADS_IN_TEAM, THREAD_PARTICIPANT, TEAM export const getIsCRTEnabled = async (database: Database): Promise => { const config = await getConfig(database); - const preferences = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS).fetch(); + const preferences = await queryDisplayNamePreferences(database).fetch(); return processIsCRTEnabled(preferences, config?.CollapsedThreads, config?.FeatureFlagCollapsedThreads, config?.Version); }; @@ -52,7 +52,7 @@ export const observeIsCRTEnabled = (database: Database) => { const cfgValue = observeConfigValue(database, 'CollapsedThreads'); const featureFlag = observeConfigValue(database, 'FeatureFlagCollapsedThreads'); const version = observeConfigValue(database, 'Version'); - const preferences = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS).observeWithColumns(['value']); + const preferences = queryDisplayNamePreferences(database).observeWithColumns(['value']); return combineLatest([cfgValue, featureFlag, preferences, version]).pipe( map( ([cfgV, ff, prefs, ver]) => processIsCRTEnabled(prefs, cfgV, ff, ver), diff --git a/app/queries/servers/user.ts b/app/queries/servers/user.ts index f8ff40b2e..e9818f35b 100644 --- a/app/queries/servers/user.ts +++ b/app/queries/servers/user.ts @@ -5,11 +5,10 @@ import {Database, Q} from '@nozbe/watermelondb'; import {combineLatest, of as of$} from 'rxjs'; import {distinctUntilChanged, switchMap} from 'rxjs/operators'; -import {Preferences} from '@constants'; import {MM_TABLES} from '@constants/database'; import {getTeammateNameDisplaySetting} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from './preference'; +import {queryDisplayNamePreferences} from './preference'; import {observeCurrentUserId, observeLicense, getCurrentUserId, getConfig, getLicense, observeConfigValue} from './system'; import type ServerDataOperator from '@database/operator/server_data_operator'; @@ -68,7 +67,7 @@ export const observeTeammateNameDisplay = (database: Database) => { const lockTeammateNameDisplay = observeConfigValue(database, 'LockTeammateNameDisplay'); const teammateNameDisplay = observeConfigValue(database, 'TeammateNameDisplay'); const license = observeLicense(database); - const preferences = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS). + const preferences = queryDisplayNamePreferences(database). observeWithColumns(['value']); return combineLatest([lockTeammateNameDisplay, teammateNameDisplay, license, preferences]).pipe( switchMap( @@ -80,7 +79,7 @@ export const observeTeammateNameDisplay = (database: Database) => { export async function getTeammateNameDisplay(database: Database) { const config = await getConfig(database); const license = await getLicense(database); - const preferences = await queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS).fetch(); + const preferences = await queryDisplayNamePreferences(database).fetch(); return getTeammateNameDisplaySetting(preferences, config?.LockTeammateNameDisplay, config?.TeammateNameDisplay, license); } diff --git a/app/screens/channel/channel_post_list/index.ts b/app/screens/channel/channel_post_list/index.ts index 39e60924c..3babb5144 100644 --- a/app/screens/channel/channel_post_list/index.ts +++ b/app/screens/channel/channel_post_list/index.ts @@ -9,10 +9,10 @@ import {combineLatest, of as of$} from 'rxjs'; import {switchMap, distinctUntilChanged} from 'rxjs/operators'; import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; +import {getAdvanceSettingPreferenceAsBool} from '@helpers/api/preference'; import {observeMyChannel} from '@queries/servers/channel'; import {queryPostsBetween, queryPostsInChannel} from '@queries/servers/post'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryAdvanceSettingsPreferences} from '@queries/servers/preference'; import {observeIsCRTEnabled} from '@queries/servers/thread'; import ChannelPostList from './channel_post_list'; @@ -40,9 +40,9 @@ const enhanced = withObservables(['channelId', 'forceQueryAfterAppState'], ({dat return queryPostsBetween(database, earliest, latest, Q.desc, '', channelId, isCRTEnabled ? '' : undefined).observe(); }), ), - shouldShowJoinLeaveMessages: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_ADVANCED_SETTINGS, Preferences.ADVANCED_FILTER_JOIN_LEAVE). + shouldShowJoinLeaveMessages: queryAdvanceSettingsPreferences(database, Preferences.ADVANCED_FILTER_JOIN_LEAVE). observeWithColumns(['value']).pipe( - switchMap((preferences) => of$(getPreferenceAsBool(preferences, Preferences.CATEGORY_ADVANCED_SETTINGS, Preferences.ADVANCED_FILTER_JOIN_LEAVE, true))), + switchMap((preferences) => of$(getAdvanceSettingPreferenceAsBool(preferences, Preferences.ADVANCED_FILTER_JOIN_LEAVE, true))), distinctUntilChanged(), ), }; diff --git a/app/screens/custom_status_clear_after/components/date_time_selector.tsx b/app/screens/custom_status_clear_after/components/date_time_selector.tsx index e747f5951..1acbac9c0 100644 --- a/app/screens/custom_status_clear_after/components/date_time_selector.tsx +++ b/app/screens/custom_status_clear_after/components/date_time_selector.tsx @@ -12,8 +12,8 @@ import {switchMap} from 'rxjs/operators'; import {Preferences} from '@constants'; import {CUSTOM_STATUS_TIME_PICKER_INTERVALS_IN_MINUTES} from '@constants/custom_status'; -import {getPreferenceAsBool} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {getDisplayNamePreferenceAsBool} from '@helpers/api/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {getCurrentMomentForTimezone, getRoundedTime, getUtcOffsetForTimeZone} from '@utils/helpers'; import {makeStyleSheetFromTheme} from '@utils/theme'; @@ -113,10 +113,10 @@ const DateTimeSelector = ({timezone, handleChange, isMilitaryTime, theme}: Props }; const enhanced = withObservables([], ({database}: WithDatabaseArgs) => ({ - isMilitaryTime: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS). + isMilitaryTime: queryDisplayNamePreferences(database). observeWithColumns(['value']).pipe( switchMap( - (preferences) => of$(getPreferenceAsBool(preferences, Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time', false)), + (preferences) => of$(getDisplayNamePreferenceAsBool(preferences, Preferences.USE_MILITARY_TIME, false)), ), ), })); diff --git a/app/screens/emoji_picker/picker/filtered/index.ts b/app/screens/emoji_picker/picker/filtered/index.ts index 5998061d1..0ed4776b0 100644 --- a/app/screens/emoji_picker/picker/filtered/index.ts +++ b/app/screens/emoji_picker/picker/filtered/index.ts @@ -7,14 +7,14 @@ import {of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; import {Preferences} from '@constants'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryEmojiPreferences} from '@queries/servers/preference'; import EmojiFiltered from './filtered'; import type {WithDatabaseArgs} from '@typings/database/database'; const enhanced = withObservables([], ({database}: WithDatabaseArgs) => ({ - skinTone: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_EMOJI, Preferences.EMOJI_SKINTONE). + skinTone: queryEmojiPreferences(database, Preferences.EMOJI_SKINTONE). observeWithColumns(['value']).pipe( switchMap((prefs) => of$(prefs?.[0]?.value ?? 'default')), ), diff --git a/app/screens/emoji_picker/picker/header/index.ts b/app/screens/emoji_picker/picker/header/index.ts index 51b8c3cef..208fd1503 100644 --- a/app/screens/emoji_picker/picker/header/index.ts +++ b/app/screens/emoji_picker/picker/header/index.ts @@ -7,14 +7,14 @@ import {of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; import {Preferences} from '@constants'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryEmojiPreferences} from '@queries/servers/preference'; import PickerHeader from './header'; import type {WithDatabaseArgs} from '@typings/database/database'; const enhanced = withObservables([], ({database}: WithDatabaseArgs) => ({ - skinTone: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_EMOJI, Preferences.EMOJI_SKINTONE). + skinTone: queryEmojiPreferences(database, Preferences.EMOJI_SKINTONE). observeWithColumns(['value']).pipe( switchMap((prefs) => of$(prefs?.[0]?.value ?? 'default')), ), diff --git a/app/screens/home/channel_list/categories_list/categories/body/index.ts b/app/screens/home/channel_list/categories_list/categories/body/index.ts index 0f35d1bab..e3fe0cda4 100644 --- a/app/screens/home/channel_list/categories_list/categories/body/index.ts +++ b/app/screens/home/channel_list/categories_list/categories/body/index.ts @@ -9,10 +9,10 @@ import {map, switchMap, combineLatestWith} from 'rxjs/operators'; import {General, Preferences} from '@constants'; import {DMS_CATEGORY} from '@constants/categories'; -import {getPreferenceAsBool} from '@helpers/api/preference'; +import {getSidebarPreferenceAsBool} from '@helpers/api/preference'; import {observeChannelsByCategoryChannelSortOrder, observeChannelsByLastPostAtInCategory} from '@queries/servers/categories'; import {observeNotifyPropsByChannels, queryChannelsByNames, queryEmptyDirectAndGroupChannels} from '@queries/servers/channel'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryPreferencesByCategoryAndName, querySidebarPreferences} from '@queries/servers/preference'; import {observeCurrentChannelId, observeCurrentUserId, observeLastUnreadChannelId} from '@queries/servers/system'; import {getDirectChannelName} from '@utils/channel'; @@ -96,7 +96,7 @@ const enhance = withObservables(['category', 'isTablet', 'locale'], ({category, const currentChannelId = observeCurrentChannelId(database); - const hiddenDmIds = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, undefined, 'false'). + const hiddenDmIds = queryPreferencesByCategoryAndName(database, Preferences.CATEGORIES.DIRECT_CHANNEL_SHOW, undefined, 'false'). observeWithColumns(['value']).pipe( switchMap((prefs: PreferenceModel[]) => { const names = prefs.map(dmMap); @@ -112,7 +112,7 @@ const enhance = withObservables(['category', 'isTablet', 'locale'], ({category, switchMap(mapChannelIds), ); - const hiddenChannelIds = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_GROUP_CHANNEL_SHOW, undefined, 'false'). + const hiddenChannelIds = queryPreferencesByCategoryAndName(database, Preferences.CATEGORIES.GROUP_CHANNEL_SHOW, undefined, 'false'). observeWithColumns(['value']).pipe( switchMap(mapPrefName), combineLatestWith(hiddenDmIds, emptyDmIds), @@ -129,7 +129,7 @@ const enhance = withObservables(['category', 'isTablet', 'locale'], ({category, let limit = of$(Preferences.CHANNEL_SIDEBAR_LIMIT_DMS_DEFAULT); if (category.type === DMS_CATEGORY) { - limit = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_LIMIT_DMS). + limit = querySidebarPreferences(database, Preferences.CHANNEL_SIDEBAR_LIMIT_DMS). observeWithColumns(['value']).pipe( switchMap((val) => { return val[0] ? of$(parseInt(val[0].value, 10)) : of$(Preferences.CHANNEL_SIDEBAR_LIMIT_DMS_DEFAULT); @@ -137,10 +137,10 @@ const enhance = withObservables(['category', 'isTablet', 'locale'], ({category, ); } - const unreadsOnTop = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). + const unreadsOnTop = querySidebarPreferences(database, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). observeWithColumns(['value']). pipe( - switchMap((prefs: PreferenceModel[]) => of$(getPreferenceAsBool(prefs, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS, false))), + switchMap((prefs: PreferenceModel[]) => of$(getSidebarPreferenceAsBool(prefs, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS))), ); const lastUnreadId = isTablet ? observeLastUnreadChannelId(database) : of$(undefined); diff --git a/app/screens/home/channel_list/categories_list/categories/index.ts b/app/screens/home/channel_list/categories_list/categories/index.ts index 89d474e8f..370932e6c 100644 --- a/app/screens/home/channel_list/categories_list/categories/index.ts +++ b/app/screens/home/channel_list/categories_list/categories/index.ts @@ -7,9 +7,9 @@ import {of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; +import {getSidebarPreferenceAsBool} from '@helpers/api/preference'; import {queryCategoriesByTeamIds} from '@queries/servers/categories'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {querySidebarPreferences} from '@queries/servers/preference'; import {observeCurrentTeamId, observeOnlyUnreads} from '@queries/servers/system'; import Categories from './categories'; @@ -23,10 +23,10 @@ const enhanced = withObservables( const currentTeamId = observeCurrentTeamId(database); const categories = currentTeamId.pipe(switchMap((ctid) => queryCategoriesByTeamIds(database, [ctid]).observeWithColumns(['sort_order']))); - const unreadsOnTop = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). + const unreadsOnTop = querySidebarPreferences(database, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). observeWithColumns(['value']). pipe( - switchMap((prefs: PreferenceModel[]) => of$(getPreferenceAsBool(prefs, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS, false))), + switchMap((prefs: PreferenceModel[]) => of$(getSidebarPreferenceAsBool(prefs, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS))), ); return { diff --git a/app/screens/home/channel_list/categories_list/categories/unreads/index.ts b/app/screens/home/channel_list/categories_list/categories/unreads/index.ts index c89bd9da1..54163f3f0 100644 --- a/app/screens/home/channel_list/categories_list/categories/unreads/index.ts +++ b/app/screens/home/channel_list/categories_list/categories/unreads/index.ts @@ -7,10 +7,10 @@ import {of as of$} from 'rxjs'; import {combineLatestWith, map, switchMap} from 'rxjs/operators'; import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; +import {getSidebarPreferenceAsBool} from '@helpers/api/preference'; import {filterAndSortMyChannels, makeChannelsMap} from '@helpers/database'; import {getChannelById, observeChannelsByLastPostAt, observeNotifyPropsByChannels, queryMyChannelUnreads} from '@queries/servers/channel'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {querySidebarPreferences} from '@queries/servers/preference'; import {observeLastUnreadChannelId} from '@queries/servers/system'; import {observeUnreadsAndMentionsInTeam} from '@queries/servers/thread'; @@ -36,10 +36,10 @@ const concatenateChannelsArray = ([a, b]: CA) => { }; const enhanced = withObservables(['currentTeamId', 'isTablet', 'onlyUnreads'], ({currentTeamId, isTablet, database, onlyUnreads}: WithDatabaseProps) => { - const unreadsOnTop = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). + const unreadsOnTop = querySidebarPreferences(database, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). observeWithColumns(['value']). pipe( - switchMap((prefs: PreferenceModel[]) => of$(getPreferenceAsBool(prefs, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS, false))), + switchMap((prefs: PreferenceModel[]) => of$(getSidebarPreferenceAsBool(prefs, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS))), ); const getC = (lastUnreadChannelId: string) => getChannelById(database, lastUnreadChannelId); diff --git a/app/screens/home/channel_list/categories_list/subheader/index.ts b/app/screens/home/channel_list/categories_list/subheader/index.ts index aadf9b1cb..0bdcf42c4 100644 --- a/app/screens/home/channel_list/categories_list/subheader/index.ts +++ b/app/screens/home/channel_list/categories_list/subheader/index.ts @@ -7,8 +7,8 @@ import {of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {getSidebarPreferenceAsBool} from '@helpers/api/preference'; +import {querySidebarPreferences} from '@queries/servers/preference'; import SubHeader from './subheader'; @@ -16,10 +16,10 @@ import type {WithDatabaseArgs} from '@typings/database/database'; import type PreferenceModel from '@typings/database/models/servers/preference'; const enhanced = withObservables([], ({database}: WithDatabaseArgs) => { - const unreadsOnTop = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). + const unreadsOnTop = querySidebarPreferences(database, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS). observeWithColumns(['value']). pipe( - switchMap((prefs: PreferenceModel[]) => of$(getPreferenceAsBool(prefs, Preferences.CATEGORY_SIDEBAR_SETTINGS, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS, false))), + switchMap((prefs: PreferenceModel[]) => of$(getSidebarPreferenceAsBool(prefs, Preferences.CHANNEL_SIDEBAR_GROUP_UNREADS))), ); return { diff --git a/app/screens/home/saved_messages/index.ts b/app/screens/home/saved_messages/index.ts index 5411f0736..31da6f722 100644 --- a/app/screens/home/saved_messages/index.ts +++ b/app/screens/home/saved_messages/index.ts @@ -7,10 +7,9 @@ import withObservables from '@nozbe/with-observables'; import {of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; -import {Preferences} from '@constants'; import {queryAllCustomEmojis} from '@queries/servers/custom_emoji'; import {queryPostsById} from '@queries/servers/post'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {querySavedPostsPreferences} from '@queries/servers/preference'; import {observeConfigBooleanValue} from '@queries/servers/system'; import {observeCurrentUser} from '@queries/servers/user'; import {mapCustomEmojiNames} from '@utils/emoji/helpers'; @@ -29,7 +28,7 @@ const enhance = withObservables([], ({database}: WithDatabaseArgs) => { const currentUser = observeCurrentUser(database); return { - posts: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_SAVED_POST, undefined, 'true').observeWithColumns(['name']).pipe( + posts: querySavedPostsPreferences(database, undefined, 'true').observeWithColumns(['name']).pipe( switchMap((rows) => { if (!rows.length) { return of$([]); diff --git a/app/screens/settings/display/index.tsx b/app/screens/settings/display/index.tsx index 4bcedfaaf..30b1b17c7 100644 --- a/app/screens/settings/display/index.tsx +++ b/app/screens/settings/display/index.tsx @@ -7,8 +7,8 @@ import {combineLatest, of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {getDisplayNamePreferenceAsBool} from '@helpers/api/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {observeAllowedThemesKeys, observeConfigBooleanValue} from '@queries/servers/system'; import {observeCRTUserPreferenceDisplay, observeIsCRTEnabled} from '@queries/servers/thread'; import {observeCurrentUser} from '@queries/servers/user'; @@ -34,10 +34,10 @@ const enhanced = withObservables([], ({database}: WithDatabaseArgs) => { isThemeSwitchingEnabled, isCRTEnabled: observeIsCRTEnabled(database), isCRTSwitchEnabled: observeCRTUserPreferenceDisplay(database), - hasMilitaryTimeFormat: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS). + hasMilitaryTimeFormat: queryDisplayNamePreferences(database). observeWithColumns(['value']).pipe( switchMap( - (preferences) => of$(getPreferenceAsBool(preferences, Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time', false)), + (preferences) => of$(getDisplayNamePreferenceAsBool(preferences, Preferences.USE_MILITARY_TIME)), ), ), currentUser: observeCurrentUser(database), diff --git a/app/screens/settings/display_clock/display_clock.tsx b/app/screens/settings/display_clock/display_clock.tsx index 812510b07..0d1c8f046 100644 --- a/app/screens/settings/display_clock/display_clock.tsx +++ b/app/screens/settings/display_clock/display_clock.tsx @@ -42,7 +42,7 @@ const DisplayClock = ({componentId, currentUserId, hasMilitaryTimeFormat}: Displ const saveClockDisplayPreference = useCallback(() => { if (hasMilitaryTimeFormat !== isMilitaryTimeFormat) { const timePreference: PreferenceType = { - category: Preferences.CATEGORY_DISPLAY_SETTINGS, + category: Preferences.CATEGORIES.DISPLAY_SETTINGS, name: 'use_military_time', user_id: currentUserId, value: `${isMilitaryTimeFormat}`, diff --git a/app/screens/settings/display_clock/index.tsx b/app/screens/settings/display_clock/index.tsx index c3a36d9e4..635ba4617 100644 --- a/app/screens/settings/display_clock/index.tsx +++ b/app/screens/settings/display_clock/index.tsx @@ -7,8 +7,8 @@ import {of as of$} from 'rxjs'; import {switchMap} from 'rxjs/operators'; import {Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {getDisplayNamePreferenceAsBool} from '@helpers/api/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {observeCurrentUserId} from '@queries/servers/system'; import DisplayClock from './display_clock'; @@ -18,10 +18,10 @@ import type {WithDatabaseArgs} from '@typings/database/database'; const enhanced = withObservables([], ({database}: WithDatabaseArgs) => { return { currentUserId: observeCurrentUserId(database), - hasMilitaryTimeFormat: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS). + hasMilitaryTimeFormat: queryDisplayNamePreferences(database). observeWithColumns(['value']).pipe( switchMap( - (preferences) => of$(getPreferenceAsBool(preferences, Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time', false)), + (preferences) => of$(getDisplayNamePreferenceAsBool(preferences, Preferences.USE_MILITARY_TIME)), ), ), }; diff --git a/app/screens/settings/display_crt/display_crt.tsx b/app/screens/settings/display_crt/display_crt.tsx index a9110dd6f..d113c69bc 100644 --- a/app/screens/settings/display_crt/display_crt.tsx +++ b/app/screens/settings/display_crt/display_crt.tsx @@ -40,7 +40,7 @@ const DisplayCRT = ({componentId, currentUserId, isCRTEnabled}: Props) => { const saveCRTPreference = useCallback(() => { if (isCRTEnabled !== isEnabled) { const crtPreference: PreferenceType = { - category: Preferences.CATEGORY_DISPLAY_SETTINGS, + category: Preferences.CATEGORIES.DISPLAY_SETTINGS, name: Preferences.COLLAPSED_REPLY_THREADS, user_id: currentUserId, value: isEnabled ? Preferences.COLLAPSED_REPLY_THREADS_ON : Preferences.COLLAPSED_REPLY_THREADS_OFF, diff --git a/app/screens/settings/display_theme/display_theme.tsx b/app/screens/settings/display_theme/display_theme.tsx index e5de3ec35..d83b48846 100644 --- a/app/screens/settings/display_theme/display_theme.tsx +++ b/app/screens/settings/display_theme/display_theme.tsx @@ -40,10 +40,10 @@ const DisplayTheme = ({allowedThemeKeys, componentId, currentTeamId, currentUser } const pref: PreferenceType = { - category: Preferences.CATEGORY_THEME, + category: Preferences.CATEGORIES.THEME, name: currentTeamId, user_id: currentUserId, - value: JSON.stringify(Preferences.THEMES[allowedTheme]), + value: JSON.stringify(Preferences.THEMES[allowedTheme as ThemeKey]), }; savePreference(serverUrl, [pref]); }, [allowedThemeKeys, currentTeamId, initialTheme, serverUrl]); diff --git a/app/screens/settings/display_theme/theme_tiles.tsx b/app/screens/settings/display_theme/theme_tiles.tsx index 1aa0b7d22..47f0a539c 100644 --- a/app/screens/settings/display_theme/theme_tiles.tsx +++ b/app/screens/settings/display_theme/theme_tiles.tsx @@ -129,7 +129,7 @@ export const ThemeTiles = ({allowedThemeKeys, onThemeChange, selectedTheme}: The return ( { - allowedThemeKeys.map((themeKey: string) => { + allowedThemeKeys.map((themeKey: ThemeKey) => { if (!Preferences.THEMES[themeKey] || !selectedTheme) { return null; } diff --git a/app/screens/settings/notification_email/index.tsx b/app/screens/settings/notification_email/index.tsx index 5ab545fb6..1825e66b5 100644 --- a/app/screens/settings/notification_email/index.tsx +++ b/app/screens/settings/notification_email/index.tsx @@ -21,9 +21,9 @@ const enhanced = withObservables([], ({database}: WithDatabaseArgs) => { return { currentUser: observeCurrentUser(database), enableEmailBatching: observeConfigBooleanValue(database, 'EnableEmailBatching'), - emailInterval: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_NOTIFICATIONS). + emailInterval: queryPreferencesByCategoryAndName(database, Preferences.CATEGORIES.NOTIFICATIONS). observeWithColumns(['value']).pipe( - switchMap((preferences) => of$(getPreferenceValue(preferences, Preferences.CATEGORY_NOTIFICATIONS, Preferences.EMAIL_INTERVAL, Preferences.INTERVAL_NOT_SET))), + switchMap((preferences) => of$(getPreferenceValue(preferences, Preferences.CATEGORIES.NOTIFICATIONS, Preferences.EMAIL_INTERVAL, Preferences.INTERVAL_NOT_SET))), ), isCRTEnabled: observeIsCRTEnabled(database), sendEmailNotifications: observeConfigBooleanValue(database, 'SendEmailNotifications'), diff --git a/app/screens/settings/notification_email/notification_email.tsx b/app/screens/settings/notification_email/notification_email.tsx index c88e12c11..efb10929a 100644 --- a/app/screens/settings/notification_email/notification_email.tsx +++ b/app/screens/settings/notification_email/notification_email.tsx @@ -96,7 +96,7 @@ const NotificationEmail = ({componentId, currentUser, emailInterval, enableEmail if (notifyInterval !== initialInterval) { const emailIntervalPreference = { - category: Preferences.CATEGORY_NOTIFICATIONS, + category: Preferences.CATEGORIES.NOTIFICATIONS, name: Preferences.EMAIL_INTERVAL, user_id: currentUser.id, value: notifyInterval, diff --git a/app/screens/settings/notifications/index.tsx b/app/screens/settings/notifications/index.tsx index cc68cc9ef..c26abe379 100644 --- a/app/screens/settings/notifications/index.tsx +++ b/app/screens/settings/notifications/index.tsx @@ -23,9 +23,9 @@ const enhanced = withObservables([], ({database}: WithDatabaseArgs) => { isCRTEnabled: observeIsCRTEnabled(database), enableAutoResponder: observeConfigBooleanValue(database, 'ExperimentalEnableAutomaticReplies'), enableEmailBatching: observeConfigBooleanValue(database, 'EnableEmailBatching'), - emailInterval: queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_NOTIFICATIONS). + emailInterval: queryPreferencesByCategoryAndName(database, Preferences.CATEGORIES.NOTIFICATIONS). observeWithColumns(['value']).pipe( - switchMap((preferences) => of$(getPreferenceValue(preferences, Preferences.CATEGORY_NOTIFICATIONS, Preferences.EMAIL_INTERVAL, Preferences.INTERVAL_NOT_SET))), + switchMap((preferences) => of$(getPreferenceValue(preferences, Preferences.CATEGORIES.NOTIFICATIONS, Preferences.EMAIL_INTERVAL, Preferences.INTERVAL_NOT_SET))), ), sendEmailNotifications: observeConfigBooleanValue(database, 'SendEmailNotifications'), }; diff --git a/app/screens/user_profile/index.ts b/app/screens/user_profile/index.ts index f03acf1eb..7ef852886 100644 --- a/app/screens/user_profile/index.ts +++ b/app/screens/user_profile/index.ts @@ -7,9 +7,9 @@ import {of as of$} from 'rxjs'; import {map, switchMap} from 'rxjs/operators'; import {General, Preferences} from '@constants'; -import {getPreferenceAsBool} from '@helpers/api/preference'; +import {getDisplayNamePreferenceAsBool} from '@helpers/api/preference'; import {observeChannel} from '@queries/servers/channel'; -import {queryPreferencesByCategoryAndName} from '@queries/servers/preference'; +import {queryDisplayNamePreferences} from '@queries/servers/preference'; import {observeConfigBooleanValue, observeCurrentTeamId, observeCurrentUserId} from '@queries/servers/system'; import {observeTeammateNameDisplay, observeUser, observeUserIsChannelAdmin, observeUserIsTeamAdmin} from '@queries/servers/user'; import {isSystemAdmin} from '@utils/user'; @@ -37,9 +37,9 @@ const enhanced = withObservables([], ({channelId, database, userId}: EnhancedPro const systemAdmin = user.pipe(switchMap((u) => of$(u?.roles ? isSystemAdmin(u.roles) : false))); const enablePostIconOverride = observeConfigBooleanValue(database, 'EnablePostIconOverride'); const enablePostUsernameOverride = observeConfigBooleanValue(database, 'EnablePostUsernameOverride'); - const preferences = queryPreferencesByCategoryAndName(database, Preferences.CATEGORY_DISPLAY_SETTINGS). + const preferences = queryDisplayNamePreferences(database). observeWithColumns(['value']); - const isMilitaryTime = preferences.pipe(map((prefs) => getPreferenceAsBool(prefs, Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time', false))); + const isMilitaryTime = preferences.pipe(map((prefs) => getDisplayNamePreferenceAsBool(prefs, Preferences.USE_MILITARY_TIME))); const isCustomStatusEnabled = observeConfigBooleanValue(database, 'EnableCustomUserStatuses'); return { diff --git a/app/utils/thread/index.ts b/app/utils/thread/index.ts index 7a4f016eb..099411b19 100644 --- a/app/utils/thread/index.ts +++ b/app/utils/thread/index.ts @@ -2,7 +2,7 @@ // See LICENSE.txt for license information. import {Config, Preferences} from '@constants'; -import {getPreferenceValue} from '@helpers/api/preference'; +import {getDisplayNamePreference} from '@helpers/api/preference'; import {isMinimumServerVersion} from '@utils/helpers'; import type PreferenceModel from '@typings/database/models/servers/preference'; @@ -16,7 +16,7 @@ export function processIsCRTEnabled(preferences: PreferenceModel[]|PreferenceTyp if (configValue === Config.DEFAULT_ON) { preferenceDefault = Preferences.COLLAPSED_REPLY_THREADS_ON; } - const preference = getPreferenceValue(preferences, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.COLLAPSED_REPLY_THREADS, preferenceDefault); + const preference = getDisplayNamePreference(preferences, Preferences.COLLAPSED_REPLY_THREADS, preferenceDefault); // CRT Feature flag removed in 7.6 const isFeatureFlagEnabled = version && isMinimumServerVersion(version, 7, 6) ? true : featureFlag === Config.TRUE;