UNPKG

@amityco/ts-sdk-react-native

Version:

Amity Social Cloud Typescript SDK

132 lines (107 loc) 3.56 kB
import { getActiveUser } from '~/client/api/activeUser'; import { getTotalChannelsUnread as _getTotalChannelsUnread } from '../internalApi/getTotalChannelsUnread'; import { onChannelUnreadUpdatedLocal } from '../events/onChannelUnreadUpdatedLocal'; import { ASCApiError, ASCError } from '~/core/errors'; import { getActiveClient } from '~/client'; import { convertGetterPropsToStatic } from '~/utils/object'; import { createQuery, runQuery } from '~/core/query'; import { UNSYNCED_OBJECT_CACHED_AT_MESSAGE, UNSYNCED_OBJECT_CACHED_AT_VALUE, } from '~/utils/constants'; import { isEqual } from '~/utils/isEqual'; /* begin_public_function id: totalChannelsUnread.get */ /** * ```js * import { ChannelRepository } from '@amityco/ts-sdk'; * * let totalChannelsUnread; * * const unsubscribe = ChannelRepository.getTotalChannelsUnread(response => { * unread = response.data; * }); * ``` * * Observe all mutation on a given {@link Amity.UserUnread} * * @returns An {@link Amity.UserUnread} function to run when willing to stop observing the message * * @category User Unread Live Object * */ export const getTotalChannelsUnread = ( callback: Amity.LiveObjectCallback<Amity.UserUnread | undefined>, ): Amity.Unsubscriber => { const { _id: userId } = getActiveUser(); if (!userId) throw new ASCError( 'The _id has not been defined in ActiveUser', Amity.ClientError.UNKNOWN_ERROR, Amity.ErrorLevel.ERROR, ); const { log, cache } = getActiveClient(); if (!cache) { console.log('For using Live Object feature you need to enable Cache!'); } const timestamp = Date.now(); log(`liveTotalChannelsUnread(tmpid: ${timestamp}) > listen`); const disposers: Amity.Unsubscriber[] = []; let isUnsyncedModel = false; // for messages let model: Amity.UserUnread | undefined; const dispatcher = (data: Amity.LiveObject<Amity.UserUnread | undefined>) => { const { data: userUnread } = data; const callbackModel = userUnread ? { unreadCount: userUnread.unreadCount, isMentioned: userUnread.isMentioned, } : undefined; model = callbackModel ? convertGetterPropsToStatic(callbackModel) : callbackModel; callback({ data: callbackModel ? { ...callbackModel, isMentioned: callbackModel.isMentioned } : callbackModel, loading: data.loading, error: data.error, }); }; const realtimeRouter = (_: Amity.ChannelUnread[]) => { const { data: userUnread } = _getTotalChannelsUnread(); if (isEqual(model, userUnread)) return; dispatcher({ loading: false, data: userUnread, }); }; const onFetch = () => { const query = createQuery(async () => _getTotalChannelsUnread()); runQuery(query, ({ error, data, loading, origin, cachedAt }) => { if (cachedAt === UNSYNCED_OBJECT_CACHED_AT_VALUE) { dispatcher({ data, origin, loading: false, error: new ASCApiError( UNSYNCED_OBJECT_CACHED_AT_MESSAGE, Amity.ClientError.DISALOOW_UNSYNCED_OBJECT, Amity.ErrorLevel.ERROR, ), }); isUnsyncedModel = true; disposers.forEach(fn => fn()); } else if (!isUnsyncedModel) { dispatcher({ loading, data, origin, error }); } if (error) { disposers.forEach(fn => fn()); } }); }; disposers.push(onChannelUnreadUpdatedLocal(realtimeRouter)); onFetch(); return () => { disposers.forEach(fn => fn()); }; };