UNPKG

@sendbird/uikit-react-native

Version:

Sendbird UIKit for React Native: A feature-rich and customizable chat UI kit with messaging, channel management, and user authentication.

57 lines (47 loc) 1.78 kB
interface VoiceMessageStatus { currentTime: number; subscribers?: Set<(currentTime: number) => void>; } class VoiceMessageStatusManager { private statusMap: Map<string, VoiceMessageStatus> = new Map(); private generateKey = (channelUrl: string, messageId: number): string => { return `${channelUrl}-${messageId}`; }; subscribe = (channelUrl: string, messageId: number, subscriber: (currentTime: number) => void) => { const key = this.generateKey(channelUrl, messageId); if (!this.statusMap.has(key)) { this.statusMap.set(key, { currentTime: 0, subscribers: new Set() }); } this.statusMap.get(key)!.subscribers?.add(subscriber); }; unsubscribe = (channelUrl: string, messageId: number, subscriber: (currentTime: number) => void) => { const key = this.generateKey(channelUrl, messageId); this.statusMap.get(key)?.subscribers?.delete(subscriber); }; publishAll = (): void => { this.statusMap.forEach((status) => { status.subscribers?.forEach((subscriber) => { subscriber(status.currentTime); }); }); }; getCurrentTime = (channelUrl: string, messageId: number): number => { const key = this.generateKey(channelUrl, messageId); return this.statusMap.get(key)?.currentTime || 0; }; setCurrentTime = (channelUrl: string, messageId: number, currentTime: number): void => { const key = this.generateKey(channelUrl, messageId); if (!this.statusMap.has(key)) { this.statusMap.set(key, { currentTime }); } else { this.statusMap.get(key)!.currentTime = currentTime; } }; clear = (): void => { this.statusMap.forEach((status) => { status.subscribers?.clear(); }); this.statusMap.clear(); }; } export default VoiceMessageStatusManager;