UNPKG

@amityco/ts-sdk-react-native

Version:

Amity Social Cloud Typescript SDK

136 lines (121 loc) 3.92 kB
import { pullFromCache } from '~/cache/api/pullFromCache'; import { getActiveClient } from '~/client/api/activeClient'; /** * Attach user object to membership model * - If cache is not enabled, set user to undefined ({..., user: undefined}) * - If user object is not found in cache, set user to undefined * ({..., user: undefined}) * - If a user is found in the cache, it attaches the user from the cache * ({..., user: { userId, displayName,... }}) * * @param member The membership model object * @returns The membership model object that is already mapped to user * @hidden */ export const convertRawMembershipToMembership = <T extends Amity.GroupType>( member: Amity.RawMembership<T>, ): Amity.Membership<T> => { return { ...member, get user() { const client = getActiveClient(); if (!client.cache) return undefined; const userCache = pullFromCache<Amity.InternalUser>(['user', 'get', member.userId])?.data; if (!userCache) { return undefined; } return userCache; }, }; }; /** * Attach user object to membership model * - If cache is not enabled, set user to undefined ({..., user: undefined}) * - If user object is not found in cache, set user to undefined * ({..., user: undefined}) * - If a user is found in the cache, it attaches the user from the cache * ({..., user: { userId, displayName,... }}) * * @param member The membership model object * @param userIdProp The user ID prop name of membership object * @param userProp The user prop name of destination object * @returns The membership model object that is already mapped to user * @hidden */ export const withUser = < M extends Record<any, any>, I extends keyof M = 'userId', U extends string = 'user', >( member: M, userIdProp: I = <I>'userId', userProp: U = <U>'user', ): Record<U, Amity.InternalUser | undefined> & M => { // If the user prop already exists, do not overwrite. if (member[userProp]) return member; return { get [userProp]() { const client = getActiveClient(); if (!client.cache) return undefined; const userCache = pullFromCache<Amity.InternalUser>([ 'user', 'get', member[userIdProp], ])?.data; if (!userCache) { return undefined; } return userCache; }, ...member, }; }; /** * Mapping membership model with user object * * @param members The membership model objects * @param userIdProp The user ID prop name of membership object * @param userProp The user prop name of destination object * @returns The membership model objects that is already * mapped to users * @hidden */ export const withUsers = < M extends Record<any, any>[], I extends keyof M[number] = 'userId', U extends string = 'user', >( members: M, userIdProp: I = <I>'userId', userProp: U = <U>'user', ): (Record<U, Amity.InternalUser | undefined> & M[number])[] => { return members?.map(member => withUser(member, userIdProp, userProp)) ?? members; }; /** * Transform members prop in any payload with attached users members * * @param payload The payload contain members prop * @param memberProp A name of members prop * @param userIdProp The user ID prop name of membership object * @param userProp The user prop name of destination object * @returns The transforming payload * @hidden */ export const prepareMembershipPayload = < P extends Record<any, any>, M extends keyof P, I extends keyof P[M][number] = 'userId', U extends string = 'user', >( payload: P, memberProp: M, userIdProp: I = <I>'userId', userProp: U = <U>'user', ): Omit<P, M> & Record<M, (Record<U, Amity.InternalUser | undefined> & P[M][number])[]> => { const { [memberProp]: memberPayload, ...rest } = payload; const members = withUsers(memberPayload, userIdProp, userProp); return { ...rest, ...{ [memberProp]: members }, }; };