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.
		
		
		
		
		
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
| import { Emoji, EmojiMartData } from '@emoji-mart/data';
 | |
| 
 | |
| export const reactionLimit: number = 6;
 | |
| 
 | |
| export class RecentReactions {
 | |
|   public items: Array<string> = [];
 | |
| 
 | |
|   constructor(items: Array<string>) {
 | |
|     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<string>;
 | |
|   shortcodes?: string;
 | |
|   unified?: string;
 | |
| }
 | |
| 
 | |
| export interface NativeEmojiData extends EmojiMartData {
 | |
|   ariaLabels?: Record<string, string>;
 | |
|   ids?: Record<string, string>;
 | |
| }
 | |
| 
 | |
| 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<string>;
 | |
|     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<string>; you?: boolean }]
 | |
| >;
 | |
| 
 | |
| export interface OpenGroupReaction {
 | |
|   index: number;
 | |
|   count: number;
 | |
|   you: boolean;
 | |
|   reactors: Array<string>;
 | |
| }
 | |
| 
 | |
| export type OpenGroupReactionList = Record<string, OpenGroupReaction>;
 | |
| 
 | |
| export interface OpenGroupReactionResponse {
 | |
|   added?: boolean;
 | |
|   removed?: boolean;
 | |
|   seqno: number;
 | |
| }
 |