import { GlobalState } from '../../global/types'; import { ISettings, IThemeSettings, ThemeKey, NotifyException, } from '../../types'; import { ApiNotifyException } from '../../api/types'; import { updateUserBlockedState } from './users'; export function replaceSettings(global: GlobalState, newSettings?: Partial): GlobalState { return { ...global, settings: { ...global.settings, byKey: { ...global.settings.byKey, ...newSettings, }, }, }; } export function replaceThemeSettings( global: GlobalState, theme: ThemeKey, newSettings?: Partial, ): GlobalState { return { ...global, settings: { ...global.settings, themes: { ...global.settings.themes, [theme]: { ...(global.settings.themes[theme] || {}), ...newSettings, }, }, }, }; } export function addNotifyExceptions( global: GlobalState, notifyExceptions: ApiNotifyException[], ): GlobalState { notifyExceptions.forEach((notifyException) => { const { chatId, ...exceptionData } = notifyException; global = addNotifyException(global, chatId, exceptionData); }); return global; } export function addNotifyException( global: GlobalState, id: string, notifyException: NotifyException, ): GlobalState { return { ...global, settings: { ...global.settings, notifyExceptions: { ...global.settings.notifyExceptions, [id]: notifyException, }, }, }; } export function updateNotifySettings( global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, shouldShowPreviews?: boolean, ) { switch (peerType) { case 'contact': return replaceSettings(global, { ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }), ...(typeof shouldShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: shouldShowPreviews }), }); case 'group': return replaceSettings(global, { ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }), ...(typeof shouldShowPreviews !== 'undefined' && { hasGroupMessagePreview: shouldShowPreviews }), }); case 'broadcast': return replaceSettings(global, { ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }), ...(typeof shouldShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: shouldShowPreviews }), }); default: return undefined; } } export function addBlockedContact(global: GlobalState, contactId: string): GlobalState { global = updateUserBlockedState(global, contactId, true); return { ...global, blocked: { ...global.blocked, ids: [contactId, ...global.blocked.ids], totalCount: global.blocked.totalCount + 1, }, }; } export function removeBlockedContact(global: GlobalState, contactId: string): GlobalState { global = updateUserBlockedState(global, contactId, false); return { ...global, blocked: { ...global.blocked, ids: global.blocked.ids.filter((id) => id !== contactId), totalCount: global.blocked.totalCount - 1, }, }; }