@amityco/ts-sdk-react-native
Version:
Amity Social Cloud Typescript SDK
141 lines (120 loc) • 4.36 kB
text/typescript
import { CommunityPostSettingMaps, DefaultCommunityPostSetting } from '~/@types';
import { updateMembershipStatus } from './communityWithMembership';
import { convertRawUserToInternalUser } from '~/userRepository/utils/convertRawUserToInternalUser';
const getMatchPostSetting = (value: {
needApprovalOnPostCreation: Amity.RawCommunity['needApprovalOnPostCreation'];
onlyAdminCanPost: Amity.RawCommunity['onlyAdminCanPost'];
}): Amity.Community['postSetting'] =>
Object.keys(CommunityPostSettingMaps).find(
key =>
value.needApprovalOnPostCreation ===
CommunityPostSettingMaps[key].needApprovalOnPostCreation &&
value.onlyAdminCanPost === CommunityPostSettingMaps[key].onlyAdminCanPost,
) ?? DefaultCommunityPostSetting;
export function addPostSetting({ communities }: { communities: Amity.RawCommunity[] }) {
return communities.map<Amity.InternalCommunity>(
({ needApprovalOnPostCreation, onlyAdminCanPost, ...restCommunityPayload }) => ({
postSetting: getMatchPostSetting({
needApprovalOnPostCreation,
onlyAdminCanPost,
}),
...restCommunityPayload,
}),
);
}
export const prepareCommunityPayload = (
rawPayload: Amity.CommunityPayload,
): Amity.ProcessedCommunityPayload => {
const communitiesWithPostSetting = addPostSetting({ communities: rawPayload.communities });
// Convert users to internal format
const internalUsers = rawPayload.users.map(convertRawUserToInternalUser);
// map users with community
const mappedCommunityUsers: Array<Amity.Membership<'community'>> = rawPayload.communityUsers.map(
communityUser => {
const user = internalUsers.find(user => user.userId === communityUser.userId)!;
return {
...communityUser,
user,
};
},
);
const communityWithMembershipStatus = updateMembershipStatus(
communitiesWithPostSetting,
mappedCommunityUsers,
);
return {
...rawPayload,
users: rawPayload.users.map(convertRawUserToInternalUser),
communities: communityWithMembershipStatus,
communityUsers: mappedCommunityUsers,
};
};
export const prepareCommunityJoinRequestPayload = (
rawPayload: Amity.CommunityJoinRequestPayload,
): Amity.ProcessedJoinRequestPayload => {
const mappedJoinRequests: Array<Amity.InternalJoinRequest> = rawPayload.joinRequests.map(
joinRequest => {
return {
...joinRequest,
joinRequestId: joinRequest._id,
};
},
);
const users = rawPayload.users.map(convertRawUserToInternalUser);
return {
...rawPayload,
joinRequests: mappedJoinRequests,
users,
};
};
export const prepareCommunityMembershipPayload = (
rawPayload: Amity.CommunityMembershipPayload,
): Amity.ProcessedCommunityMembershipPayload => {
const communitiesWithPostSetting = addPostSetting({ communities: rawPayload.communities });
// map users with community
const mappedCommunityUsers: Array<Amity.Membership<'community'>> = rawPayload.communityUsers.map(
communityUser => {
const user = rawPayload.users.find(user => user.userId === communityUser.userId)!;
return {
...communityUser,
user,
};
},
);
const communityWithMembershipStatus = updateMembershipStatus(
communitiesWithPostSetting,
mappedCommunityUsers,
);
return {
...rawPayload,
communities: communityWithMembershipStatus,
communityUsers: mappedCommunityUsers,
};
};
export const prepareCommunityRequest = <
T extends {
postSetting?: Amity.Community['postSetting'];
[k: string]: any;
},
>(
params: T,
) => {
const { postSetting = undefined, storySetting, ...restParam } = params;
return {
...restParam,
// Repack community payload by mapping postSetting to the actual value.
...(postSetting ? CommunityPostSettingMaps[postSetting] : undefined),
// Convert story setting to the actual value. (Allow by default)
allowCommentInStory:
typeof storySetting?.enableComment === 'boolean' ? storySetting.enableComment : true,
};
};
export const prepareSemanticSearchCommunityPayload = ({
searchResult,
...communityPayload
}: Amity.SemanticSearchCommunityPayload): Amity.ProcessedSemanticSearchCommunityPayload => {
const processedCommunityPayload = prepareCommunityPayload(communityPayload);
return {
...processedCommunityPayload,
};
};