You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/models/conversationAttributes.ts

105 lines
3.8 KiB
TypeScript

import { defaults } from 'lodash';
import { LastMessageStatusType } from '../state/ducks/conversations';
export enum ConversationTypeEnum {
GROUP = 'group',
PRIVATE = 'private',
}
/**
* all: all notifications enabled, the default
* disabled: no notifications at all
* mentions_only: trigger a notification only on mentions of ourself
*/
export const ConversationNotificationSetting = ['all', 'disabled', 'mentions_only'] as const;
export type ConversationNotificationSettingType = typeof ConversationNotificationSetting[number];
export interface ConversationAttributes {
id: string;
type: string;
// 0 means inactive (undefined and null too but we try to get rid of them and only have 0 = inactive)
active_at: number;
displayNameInProfile?: string; // no matter the type of conversation, this is the real name as set by the user/name of the open or closed group
nickname?: string; // this is the name WE gave to that user (only applicable to private chats, not closed group neither opengroups)
profileKey?: string; // Consider this being a hex string if it is set
members: Array<string>; // members are all members for this group. zombies excluded
zombies: Array<string>; // only used for closed groups. Zombies are users which left but not yet removed by the admin
left: boolean;
expireTimer: number;
mentionedUs: boolean;
unreadCount: number;
lastMessageStatus: LastMessageStatusType;
/**
* lastMessage is actually just a preview of the last message text, shortened to 60 chars.
* This is to avoid filling the redux store with a huge last message when it's only used in the
* preview of a conversation (leftpane).
* The shortening is made in sql.ts directly.
*/
lastMessage: string | null;
lastJoinedTimestamp: number; // ClosedGroup: last time we were added to this group
groupAdmins: Array<string>; // for sogs and closed group: the admins of that group.
groupModerators: Array<string>; // for sogs only, this is the moderator in that room.
isKickedFromGroup: boolean;
subscriberCount: number;
readCapability: boolean;
writeCapability: boolean;
uploadCapability: boolean;
is_medium_group: boolean;
avatarPointer?: string; // this is the url of the avatar on the file server v2. we use this to detect if we need to redownload the avatar from someone (not used for opengroups)
avatarInProfile?: string; // this is the avatar path locally once downloaded and stored in the application attachments folder
avatarImageId?: number; //Avatar imageID is currently used only for opengroupv2. It's the fileID of the image uploaded and set as the sogs avatar
triggerNotificationsFor: ConversationNotificationSettingType;
isTrustedForAttachmentDownload: boolean;
isPinned: boolean;
isApproved: boolean;
didApproveMe: boolean;
/** The open group chat this conversation originated from (if from closed group) */
conversationIdOrigin?: string;
}
/**
* This function mutates optAttributes
* @param optAttributes the entry object attributes to set the defaults to.
*
* Test are in ConversationModels_test.ts
*/
export const fillConvoAttributesWithDefaults = (
optAttributes: ConversationAttributes
): ConversationAttributes => {
return defaults(optAttributes, {
members: [],
zombies: [],
groupAdmins: [],
unreadCount: 0,
lastJoinedTimestamp: 0,
subscriberCount: 0,
expireTimer: 0,
active_at: 0,
lastMessageStatus: undefined,
lastMessage: null,
triggerNotificationsFor: 'all', // if the settings is not set in the db, this is the default
isTrustedForAttachmentDownload: false, // we don't trust a contact until we say so
isPinned: false,
isApproved: false,
didApproveMe: false,
is_medium_group: false,
mentionedUs: false,
isKickedFromGroup: false,
left: false,
});
};