2021-11-05 22:03:02 +03:00

115 lines
3.2 KiB
TypeScript

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<ISettings>): GlobalState {
return {
...global,
settings: {
...global.settings,
byKey: {
...global.settings.byKey,
...newSettings,
},
},
};
}
export function replaceThemeSettings(
global: GlobalState, theme: ThemeKey, newSettings?: Partial<IThemeSettings>,
): 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,
},
};
}