import { Emoji, EmojiMartData } from '@emoji-mart/data'; export const reactionLimit: number = 6; export class RecentReactions { public items: Array = []; constructor(items: Array) { this.items = items; } public size(): number { return this.items.length; } public push(item: string): void { if (this.size() === reactionLimit) { this.items.pop(); } this.items.unshift(item); } public pop(): string | undefined { return this.items.pop(); } public swap(index: number): void { const temp = this.items.splice(index, 1); this.push(temp[0]); } } export interface FixedBaseEmoji extends Emoji { search?: string; // props from emoji panel click event native?: string; aliases?: Array; shortcodes?: string; unified?: string; } export interface NativeEmojiData extends EmojiMartData { ariaLabels?: Record; } export enum Action { REACT = 0, REMOVE = 1, } export interface Reaction { // this is in fact a uint64 so we will have an issue id: number; // original message timestamp author: string; emoji: string; action: Action; } // used for logic operations with reactions i.e responses, db, etc. export type ReactionList = Record< string, { count: number; index: number; // relies on reactsIndex in the message model senders: Array; you: boolean; // whether we are in the senders list, used within 1-1 and closed groups for ignoring duplicate data messages, used within opengroups since we dont always have the full list of senders. } >; // used when rendering reactions to guarantee sorted order using the index export type SortedReactionList = Array< [string, { count: number; index: number; senders: Array; you?: boolean }] >; export interface OpenGroupReaction { index: number; count: number; you: boolean; reactors: Array; } export type OpenGroupReactionList = Record; export interface OpenGroupReactionResponse { added?: boolean; removed?: boolean; seqno: number; }