import moment from 'moment'; import {RootState} from '../store/rootReducer'; import {ChannelGroupedType} from '../types'; /** * 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; };