import AsyncStorage from '@react-native-community/async-storage'; import moment from 'moment'; import {loadChatTokenService} from '../services/ChatService'; import {RootState} from '../store/rootReducer'; import {ChannelGroupedType} from '../types'; import {StreamChat} from 'stream-chat'; /** * Finds the difference in time in minutes * @param lastActive given time e.g. "2021-04-08T19:07:09.361300983Z" * @returns diff in minutes */ const _diffInMinutes = (lastActive: string | undefined) => { if (!lastActive) { return undefined; } return moment().diff(moment(lastActive), 'minutes'); }; /** * Formats the last activity status. * - "Active now" (≤ 5 minutes) * - "Seen X minutes ago" (5 > x ≥ 59 minutes) * - "Seen X hours ago" (x = [1, 2]) * - "Offline" * @param lastActive given time e.g. "2021-04-08T19:07:09.361300983Z" * @returns */ export const formatLastSeenText = (lastActive: string | undefined) => { const diff = _diffInMinutes(lastActive); if (!diff) { return 'Offline'; } if (diff <= 5) { return 'Active now'; } if (diff <= 59) { return `Seen ${diff} minutes ago`; } if (diff <= 180) { const hours = Math.floor(diff / 60); return `Seen ${hours} hours ago`; } return 'Offline'; }; /** * Checks if a lastActive timestamp is considered Online or not. * * A user is online if last active is ≤ 15 minutes. * * @param lastActive given time e.g. "2021-04-08T19:07:09.361300983Z" * @returns True if active */ export const isOnline = (lastActive: string | undefined) => { if (!lastActive) { return false; } const diff = _diffInMinutes(lastActive); if (!diff) { return false; } return diff <= 15; }; /** * Gets the other member in the channel. * @param channel the current chat channel * @param state the current redux state * @returns other member or undefined */ export const getMember = ( channel: ChannelGroupedType | undefined, state: RootState, ) => { if (!channel) { return undefined; } const loggedInUserId = state.user.user.userId; const otherMembers = channel ? Object.values(channel.state.members).filter( (member) => member.user?.id !== loggedInUserId, ) : []; return otherMembers.length === 1 ? otherMembers[0] : undefined; }; export const connectChatAccount = async ( loggedInUserId: string, chatClient: StreamChat, ) => { try { await getChatToken(); const chatToken = await AsyncStorage.getItem('chatToken'); if (!chatClient.user && chatToken) { await chatClient.connectUser( { id: loggedInUserId, }, chatToken, ); return true; } else if (chatClient.user) { return true; } else { console.log('Unable to connect to stream. Empty chat token'); return false; } } catch (err) { console.log('Error while connecting user to Stream: ', err); return false; } }; export const getChatToken = async () => { try { const currentChatToken = await AsyncStorage.getItem('chatToken'); if (currentChatToken === null) { const chatToken = await loadChatTokenService(); await AsyncStorage.setItem('chatToken', chatToken); } } catch (err) { console.log(err); } };