diff --git a/package.json b/package.json index 391cb8f..e484f87 100644 --- a/package.json +++ b/package.json @@ -150,6 +150,6 @@ ] }, "dependencies": { - "uuid": "^9.0.1" + "react-native-uuid": "^2.0.3" } } diff --git a/src/OpenIMSDK.native.ts b/src/OpenIMSDK.native.ts new file mode 100644 index 0000000..1d265fe --- /dev/null +++ b/src/OpenIMSDK.native.ts @@ -0,0 +1,505 @@ +import { NativeEventEmitter, NativeModules, Platform } from 'react-native'; +import { + SelfUserInfo, + UserOnlineState, + BlackUserItem, + FriendApplicationItem, + FriendshipInfo, + SearchedFriendsInfo, + GroupApplicationItem, + GroupItem, + GroupMemberItem, + ConversationItem, + AdvancedGetMessageResult, + CardElem, + MessageItem, + SearchMessageResult, + FriendUserItem, + PublicUserItem, +} from './types/entity'; +import { LoginStatus, MessageReceiveOptType } from './types/enum'; +import { + AccessFriendParams, + AccessGroupParams, + AddBlackParams, + AddFriendParams, + AtMsgParams, + ChangeGroupMemberMuteParams, + ChangeGroupMuteParams, + ChangeInputStatesParams, + CreateGroupParams, + CustomMsgParams, + FaceMessageParams, + FileMsgByPathParams, + FileMsgParams, + FindMessageParams, + GetAdvancedHistoryMsgParams, + GetFriendApplicationListAsApplicantParams, + GetFriendApplicationListAsRecipientParams, + GetGroupApplicationListAsApplicantParams, + GetGroupApplicationListAsRecipientParams, + GetGroupMemberByTimeParams, + GetGroupMemberParams, + GetGroupMembersInfoParams, + GetInputStatesParams, + GetOneConversationParams, + GetSelfApplicationUnhandledCountParams, + GetSpecifiedFriendsParams, + ImageMsgParams, + InitOptions, + InsertGroupMsgParams, + InsertSingleMsgParams, + JoinGroupParams, + LocationMsgParams, + LoginParams, + LogsParams, + MergerMsgParams, + OffsetParams, + OpreateGroupParams, + OpreateMessageParams, + PinConversationParams, + QuoteMsgParams, + RemarkFriendParams, + SearchFriendParams, + SearchGroupMemberParams, + SearchGroupParams, + SearchLocalParams, + SendMsgParams, + SetBurnDurationParams, + SetConversationDraftParams, + SetConversationParams, + SetConversationPrivateParams, + SetConversationRecvOptParams, + SetGroupinfoParams, + SetMessageLocalExParams, + SoundMsgByPathParams, + SoundMsgParams, + SplitConversationParams, + TransferGroupParams, + TypingUpdateParams, + UpdateFriendsParams, + UpdateMemberInfoParams, + UploadFileParams, + UploadLogsParams, + VideoMsgByPathParams, + VideoMsgParams, +} from './types/params'; + +const LINKING_ERROR = + `The package 'open-im-sdk-rn' doesn't seem to be linked. Make sure: \n\n` + + Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) + + '- You rebuilt the app after installing the package\n' + + '- You are not using Expo managed workflow\n'; + +const NativeOpenIMSDK: NativeOpenIMSDKInterface = NativeModules.OpenIMSDKRN + ? NativeModules.OpenIMSDKRN + : new Proxy( + {}, + { + get() { + throw new Error(LINKING_ERROR); + }, + } + ); + +export const NativeOpenIMEmitter = new NativeEventEmitter(NativeOpenIMSDK); + +export default NativeOpenIMSDK; + +export interface NativeOpenIMSDKInterface { + addListener: (eventType: string) => void; + removeListeners: (count: number) => void; + + // login + initSDK: (params: InitOptions, operationID: string) => Promise; + login: (params: LoginParams, operationID: string) => Promise; + logout: (operationID: string) => Promise; + getLoginStatus: (operationID: string) => Promise; + getLoginUserID: (operationID: string) => Promise; + uploadFile: ( + params: UploadFileParams, + operationID: string + ) => Promise<{ + url: string; + }>; + + // user + getUsersInfo: ( + userIDList: string[], + operationID: string + ) => Promise; + getSelfUserInfo: (operationID: string) => Promise; + setSelfInfo: ( + params: Partial, + operationID: string + ) => Promise; + subscribeUsersStatus: ( + params: string[], + operationID: string + ) => Promise; + unsubscribeUsersStatus: ( + params: string[], + operationID: string + ) => Promise; + getSubscribeUsersStatus: (operationID: string) => Promise; + setAppBackgroundStatus: ( + params: boolean, + operationID: string + ) => Promise; + networkStatusChanged: (operationID: string) => Promise; + /** + * @deprecated Use setSelfInfo instead. + */ + setGlobalRecvMessageOpt: ( + params: MessageReceiveOptType, + operationID: string + ) => Promise; + + // friend relationShip + acceptFriendApplication: ( + params: AccessFriendParams, + operationID: string + ) => Promise; + addBlack: (params: AddBlackParams, operationID: string) => Promise; + addFriend: (params: AddFriendParams, operationID: string) => Promise; + checkFriend: ( + params: string[], + operationID: string + ) => Promise; + deleteFriend: (params: string, operationID: string) => Promise; + getBlackList: (operationID: string) => Promise; + getFriendApplicationListAsApplicant: ( + operationID: string, + req: GetFriendApplicationListAsApplicantParams + ) => Promise; + getFriendApplicationListAsRecipient: ( + operationID: string, + req: GetFriendApplicationListAsRecipientParams + ) => Promise; + getFriendApplicationUnhandledCount: ( + req: GetSelfApplicationUnhandledCountParams, + operationID: string + ) => Promise; + getFriendList: ( + filterBlack: boolean, + operationID: string + ) => Promise; + getFriendListPage: ( + params: OffsetParams & { filterBlack?: boolean }, + operationID: string + ) => Promise; + getSpecifiedFriendsInfo: ( + params: GetSpecifiedFriendsParams, + operationID: string + ) => Promise; + updateFriends: ( + params: UpdateFriendsParams, + operationID: string + ) => Promise; + refuseFriendApplication: ( + params: AccessFriendParams, + operationID: string + ) => Promise; + removeBlack: (params: string, operationID: string) => Promise; + searchFriends: ( + params: SearchFriendParams, + operationID: string + ) => Promise; + setFriendRemark: ( + params: RemarkFriendParams, + operationID: string + ) => Promise; + + // group + createGroup: ( + params: CreateGroupParams, + operationID: string + ) => Promise; + joinGroup: (params: JoinGroupParams, operationID: string) => Promise; + inviteUserToGroup: ( + params: OpreateGroupParams, + operationID: string + ) => Promise; + getJoinedGroupList: (operationID: string) => Promise; + getJoinedGroupListPage: ( + params: OffsetParams, + operationID: string + ) => Promise; + searchGroups: ( + params: SearchGroupParams, + operationID: string + ) => Promise; + getSpecifiedGroupsInfo: ( + params: string[], + operationID: string + ) => Promise; + setGroupInfo: ( + params: SetGroupinfoParams, + operationID: string + ) => Promise; + getGroupApplicationListAsRecipient: ( + operationID: string, + req: GetGroupApplicationListAsRecipientParams + ) => Promise; + getGroupApplicationListAsApplicant: ( + operationID: string, + req: GetGroupApplicationListAsApplicantParams + ) => Promise; + getGroupApplicationUnhandledCount: ( + req: GetSelfApplicationUnhandledCountParams, + operationID: string + ) => Promise; + acceptGroupApplication: ( + params: AccessGroupParams, + operationID: string + ) => Promise; + refuseGroupApplication: ( + params: AccessGroupParams, + operationID: string + ) => Promise; + getGroupMemberList: ( + params: GetGroupMemberParams, + operationID: string + ) => Promise; + getSpecifiedGroupMembersInfo: ( + params: GetGroupMembersInfoParams, + operationID: string + ) => Promise; + getUsersInGroup: ( + params: GetGroupMembersInfoParams, + operationID: string + ) => Promise; + searchGroupMembers: ( + params: SearchGroupMemberParams, + operationID: string + ) => Promise; + setGroupMemberInfo: ( + params: UpdateMemberInfoParams, + operationID: string + ) => Promise; + getGroupMemberOwnerAndAdmin: ( + params: string, + operationID: string + ) => Promise; + getGroupMemberListByJoinTimeFilter: ( + params: GetGroupMemberByTimeParams, + operationID: string + ) => Promise; + kickGroupMember: ( + params: OpreateGroupParams, + operationID: string + ) => Promise; + changeGroupMemberMute: ( + params: ChangeGroupMemberMuteParams, + operationID: string + ) => Promise; + changeGroupMute: ( + params: ChangeGroupMuteParams, + operationID: string + ) => Promise; + transferGroupOwner: ( + params: TransferGroupParams, + operationID: string + ) => Promise; + dismissGroup: (params: string, operationID: string) => Promise; + quitGroup: (params: string, operationID: string) => Promise; + isJoinGroup: (groupID: string, operationID: string) => Promise; + + // conversation & message + getAllConversationList: (operationID: string) => Promise; + getConversationListSplit: ( + params: SplitConversationParams, + operationID: string + ) => Promise; + getOneConversation: ( + params: GetOneConversationParams, + operationID: string + ) => Promise; + getMultipleConversation: ( + params: string, + operationID: string + ) => Promise; + getConversationIDBySessionType: ( + params: GetOneConversationParams, + operationID: string + ) => Promise; + getTotalUnreadMsgCount: (operationID: string) => Promise; + markConversationMessageAsRead: ( + params: string, + operationID: string + ) => Promise; + setConversation: ( + params: SetConversationParams, + operationID: string + ) => Promise; + setConversationDraft: ( + params: SetConversationDraftParams, + operationID: string + ) => Promise; + pinConversation: ( + params: PinConversationParams, + operationID: string + ) => Promise; + setConversationRecvMessageOpt: ( + params: SetConversationRecvOptParams, + operationID: string + ) => Promise; + setConversationPrivateChat: ( + params: SetConversationPrivateParams, + operationID: string + ) => Promise; + setConversationBurnDuration: ( + params: SetBurnDurationParams, + operationID: string + ) => Promise; + resetConversationGroupAtType: ( + params: string, + operationID: string + ) => Promise; + hideConversation: (params: string, operationID: string) => Promise; + hideAllConversation: (operationID: string) => Promise; + clearConversationAndDeleteAllMsg: ( + params: string, + operationID: string + ) => Promise; + deleteConversationAndDeleteAllMsg: ( + params: string, + operationID: string + ) => Promise; + + createImageMessageFromFullPath: ( + params: string, + operationID: string + ) => Promise; + createVideoMessageFromFullPath: ( + params: VideoMsgByPathParams, + operationID: string + ) => Promise; + createSoundMessageFromFullPath: ( + params: SoundMsgByPathParams, + operationID: string + ) => Promise; + createFileMessageFromFullPath: ( + params: FileMsgByPathParams, + operationID: string + ) => Promise; + createTextMessage: ( + params: string, + operationID: string + ) => Promise; + createTextAtMessage: ( + params: AtMsgParams, + operationID: string + ) => Promise; + createImageMessageByURL: ( + params: ImageMsgParams, + operationID: string + ) => Promise; + createSoundMessageByURL: ( + params: SoundMsgParams, + operationID: string + ) => Promise; + createVideoMessageByURL: ( + params: VideoMsgParams, + operationID: string + ) => Promise; + createFileMessageByURL: ( + params: FileMsgParams, + operationID: string + ) => Promise; + createMergerMessage: ( + params: MergerMsgParams, + operationID: string + ) => Promise; + createForwardMessage: ( + params: MessageItem, + operationID: string + ) => Promise; + createLocationMessage: ( + params: LocationMsgParams, + operationID: string + ) => Promise; + createQuoteMessage: ( + params: QuoteMsgParams, + operationID: string + ) => Promise; + createCardMessage: ( + params: CardElem, + operationID: string + ) => Promise; + createCustomMessage: ( + params: CustomMsgParams, + operationID: string + ) => Promise; + createFaceMessage: ( + params: FaceMessageParams, + operationID: string + ) => Promise; + sendMessage: ( + params: SendMsgParams, + operationID: string + ) => Promise; + sendMessageNotOss: ( + params: SendMsgParams, + operationID: string + ) => Promise; + typingStatusUpdate: ( + params: TypingUpdateParams, + operationID: string + ) => Promise; + changeInputStates: ( + params: ChangeInputStatesParams, + operationID: string + ) => Promise; + getInputStates: ( + params: GetInputStatesParams, + operationID: string + ) => Promise; + revokeMessage: ( + params: OpreateMessageParams, + operationID: string + ) => Promise; + deleteMessage: ( + params: OpreateMessageParams, + operationID: string + ) => Promise; + deleteMessageFromLocalStorage: ( + params: OpreateMessageParams, + operationID: string + ) => Promise; + deleteAllMsgFromLocal: (operationID: string) => Promise; + deleteAllMsgFromLocalAndSvr: (operationID: string) => Promise; + searchLocalMessages: ( + params: SearchLocalParams, + operationID: string + ) => Promise; + getAdvancedHistoryMessageList: ( + params: GetAdvancedHistoryMsgParams, + operationID: string + ) => Promise; + getAdvancedHistoryMessageListReverse: ( + params: GetAdvancedHistoryMsgParams, + operationID: string + ) => Promise; + findMessageList: ( + params: FindMessageParams[], + operationID: string + ) => Promise; + insertGroupMessageToLocalStorage: ( + params: InsertGroupMsgParams, + operationID: string + ) => Promise; + insertSingleMessageToLocalStorage: ( + params: InsertSingleMsgParams, + operationID: string + ) => Promise; + setMessageLocalEx: ( + params: SetMessageLocalExParams, + operationID: string + ) => Promise; + uploadLogs: (params: UploadLogsParams, operationID: string) => Promise; + logs: (params: LogsParams, operationID: string) => Promise; + unInitSDK: (operationID: string) => Promise; + updateFcmToken: (fcmToken: string, expireTime: number, operationID: string) => Promise; + setAppBadge: (appUnreadCount: number, operationID: string) => Promise; +} diff --git a/src/constants/OpenIMEvents.ts b/src/constants/OpenIMEvents.ts new file mode 100644 index 0000000..f164b9d --- /dev/null +++ b/src/constants/OpenIMEvents.ts @@ -0,0 +1,62 @@ +export const OpenIMEvent = { + OnConnectSuccess: 'onConnectSuccess', + OnConnecting: 'onConnecting', + OnConnectFailed: 'onConnectFailed', + OnKickedOffline: 'onKickedOffline', + OnSelfInfoUpdated: 'onSelfInfoUpdated', + OnUserStatusChanged: 'onUserStatusChanged', + OnUserTokenExpired: 'onUserTokenExpired', + OnUserTokenInvalid: 'onUserTokenInvalid', + + OnRecvNewMessage: 'onRecvNewMessage', + OnRecvNewMessages: 'onRecvNewMessages', + OnRecvOfflineNewMessage: 'onRecvOfflineNewMessage', + OnRecvOnlineOnlyMessage: 'onRecvOnlineOnlyMessage', + OnRecvOfflineNewMessages: 'onRecvOfflineNewMessages', + OnMsgDeleted: 'onMsgDeleted', + OnRecvC2CReadReceipt: 'onRecvC2CReadReceipt', + OnNewRecvMessageRevoked: 'onNewRecvMessageRevoked', + // OnRecvMessageRevoked: 'onRecvMessageRevoked', // iOS only + // OnRecvMessageExtensionsAdded: 'onRecvMessageExtensionsAdded', // iOS only + // OnRecvMessageExtensionsChanged: 'onRecvMessageExtensionsChanged', // iOS only + // OnRecvMessageExtensionsDeleted: 'onRecvMessageExtensionsDeleted', // iOS only + + OnConversationChanged: 'onConversationChanged', + OnInputStatusChanged: 'onInputStatusChanged', + OnNewConversation: 'onNewConversation', + OnSyncServerFailed: 'onSyncServerFailed', + OnSyncServerFinish: 'onSyncServerFinish', + OnSyncServerStart: 'onSyncServerStart', + OnSyncServerProgress: 'onSyncServerProgress', + OnTotalUnreadMessageCountChanged: 'onTotalUnreadMessageCountChanged', + + OnBlackAdded: 'onBlackAdded', + OnBlackDeleted: 'onBlackDeleted', + OnFriendApplicationAccepted: 'onFriendApplicationAccepted', + OnFriendApplicationAdded: 'onFriendApplicationAdded', + OnFriendApplicationDeleted: 'onFriendApplicationDeleted', + OnFriendApplicationRejected: 'onFriendApplicationRejected', + OnFriendInfoChanged: 'onFriendInfoChanged', + OnFriendAdded: 'onFriendAdded', + OnFriendDeleted: 'onFriendDeleted', + + OnGroupApplicationAccepted: 'onGroupApplicationAccepted', + OnGroupApplicationRejected: 'onGroupApplicationRejected', + OnGroupApplicationAdded: 'onGroupApplicationAdded', + OnGroupApplicationDeleted: 'onGroupApplicationDeleted', + OnGroupInfoChanged: 'onGroupInfoChanged', + OnGroupMemberInfoChanged: 'onGroupMemberInfoChanged', + OnGroupMemberAdded: 'onGroupMemberAdded', + OnGroupMemberDeleted: 'onGroupMemberDeleted', + OnJoinedGroupAdded: 'onJoinedGroupAdded', + OnJoinedGroupDeleted: 'onJoinedGroupDeleted', + OnGroupDismissed: 'onGroupDismissed', + SendMessageProgress: 'SendMessageProgress', + UploadComplete: 'uploadComplete', + OnRecvCustomBusinessMessage: 'onRecvCustomBusinessMessage', + UploadOnProgress: 'uploadOnProgress', + // OnReceiveNewMessages: 'onReceiveNewMessages', // iOS only + // OnReceiveOfflineNewMessages: 'onReceiveOfflineNewMessages', // iOS only +} as const; + +export type OpenIMEventName = typeof OpenIMEvent[keyof typeof OpenIMEvent]; diff --git a/src/emitter.ts b/src/emitter.ts new file mode 100644 index 0000000..c529379 --- /dev/null +++ b/src/emitter.ts @@ -0,0 +1,55 @@ +import { EmitterSubscription } from 'react-native'; +import { OpenIMEvent } from './constants/OpenIMEvents'; +import { NativeOpenIMEmitter } from './OpenIMSDK.native'; +import { ArgsOfEvent } from './types/eventArgs'; + +interface EmitterInterface { + on(eventName: E, callback: (...args: ArgsOfEvent) => void): void; + off(eventName: E, callback: (...args: ArgsOfEvent) => void): void; +} + +type EventName = typeof OpenIMEvent[keyof typeof OpenIMEvent]; + +type NativeSubscriptionAndCallbackPair = { + subscription: EmitterSubscription; + callback: (...args: any[]) => void; +}; + +class Emitter implements EmitterInterface { + private pairsMap: Map; + + constructor(){ + this.pairsMap = new Map(); + } + + on(eventName: E, callback: (...args: ArgsOfEvent) => void): void { + const subscription = NativeOpenIMEmitter.addListener(eventName, (...data) => { + callback(...data as ArgsOfEvent) + }); + + const pair = this.pairsMap.get(eventName) || []; + pair.push({ subscription, callback }); + this.pairsMap.set(eventName, pair); + } + + off(eventName: E, callback: (...args: ArgsOfEvent) => void): void { + const pairs = this.pairsMap.get(eventName); + if (!pairs) return; + + const pair = pairs.find((candidate) => candidate.callback === callback); + if (pair) { + /** + * NOTE: When removing listeners in a useEffect cleanup, calling + * NativeOpenIMEmitter.removeSubscription(subscription) can throw a + * "method not found" error. Prefer subscription.remove(), which works + * reliably. This appears to be a React Native bug. + */ + // NativeOpenIMEmitter.removeSubscription(pair.subscription); + pair.subscription.remove(); + pairs.splice(pairs.indexOf(pair), 1); + this.pairsMap.set(eventName, pairs); + } + } +} + +export default Emitter; diff --git a/src/errors/OpenIMApiError.ts b/src/errors/OpenIMApiError.ts new file mode 100644 index 0000000..65094ca --- /dev/null +++ b/src/errors/OpenIMApiError.ts @@ -0,0 +1,11 @@ +export class OpenIMApiError extends Error { + name: string = 'OpenIMApiError'; + code: number; + message: string; + + constructor(code: number, message: string) { + super(message); + this.code = code; + this.message = message; + } +} diff --git a/src/errors/OpenIMEventError.ts b/src/errors/OpenIMEventError.ts new file mode 100644 index 0000000..4bda912 --- /dev/null +++ b/src/errors/OpenIMEventError.ts @@ -0,0 +1,4 @@ +export type OpenIMEventBaseErrorType = { + errMsg: string; + errCode: number; +} diff --git a/src/index.tsx b/src/index.tsx index 511a713..2472c43 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,505 +1,15 @@ -import { NativeEventEmitter, NativeModules, Platform } from 'react-native'; -import { - SelfUserInfo, - UserOnlineState, - BlackUserItem, - FriendApplicationItem, - FriendshipInfo, - SearchedFriendsInfo, - GroupApplicationItem, - GroupItem, - GroupMemberItem, - ConversationItem, - AdvancedGetMessageResult, - CardElem, - MessageItem, - SearchMessageResult, - FriendUserItem, - PublicUserItem, -} from './types/entity'; -import { LoginStatus, MessageReceiveOptType } from './types/enum'; -import { - AccessFriendParams, - AccessGroupParams, - AddBlackParams, - AddFriendParams, - AtMsgParams, - ChangeGroupMemberMuteParams, - ChangeGroupMuteParams, - ChangeInputStatesParams, - CreateGroupParams, - CustomMsgParams, - FaceMessageParams, - FileMsgByPathParams, - FileMsgParams, - FindMessageParams, - GetAdvancedHistoryMsgParams, - GetFriendApplicationListAsApplicantParams, - GetFriendApplicationListAsRecipientParams, - GetGroupApplicationListAsApplicantParams, - GetGroupApplicationListAsRecipientParams, - GetGroupMemberByTimeParams, - GetGroupMemberParams, - GetGroupMembersInfoParams, - GetInputStatesParams, - GetOneConversationParams, - GetSelfApplicationUnhandledCountParams, - GetSpecifiedFriendsParams, - ImageMsgParams, - InitOptions, - InsertGroupMsgParams, - InsertSingleMsgParams, - JoinGroupParams, - LocationMsgParams, - LoginParams, - LogsParams, - MergerMsgParams, - OffsetParams, - OpreateGroupParams, - OpreateMessageParams, - PinConversationParams, - QuoteMsgParams, - RemarkFriendParams, - SearchFriendParams, - SearchGroupMemberParams, - SearchGroupParams, - SearchLocalParams, - SendMsgParams, - SetBurnDurationParams, - SetConversationDraftParams, - SetConversationParams, - SetConversationPrivateParams, - SetConversationRecvOptParams, - SetGroupinfoParams, - SetMessageLocalExParams, - SoundMsgByPathParams, - SoundMsgParams, - SplitConversationParams, - TransferGroupParams, - TypingUpdateParams, - UpdateFriendsParams, - UpdateMemberInfoParams, - UploadFileParams, - UploadLogsParams, - VideoMsgByPathParams, - VideoMsgParams, -} from './types/params'; - -const LINKING_ERROR = - `The package 'open-im-sdk-rn' doesn't seem to be linked. Make sure: \n\n` + - Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) + - '- You rebuilt the app after installing the package\n' + - '- You are not using Expo managed workflow\n'; - -const OpenIMSDKRN: OpenIMSDKRNInterface = NativeModules.OpenIMSDKRN - ? NativeModules.OpenIMSDKRN - : new Proxy( - {}, - { - get() { - throw new Error(LINKING_ERROR); - }, - } - ); - -export const OpenIMEmitter = new NativeEventEmitter(OpenIMSDKRN); - -export default OpenIMSDKRN; - -interface OpenIMSDKRNInterface { - addListener: (eventType: string) => void; - removeListeners: (count: number) => void; - - // login - initSDK: (params: InitOptions, operationID: string) => Promise; - login: (params: LoginParams, operationID: string) => Promise; - logout: (operationID: string) => Promise; - getLoginStatus: (operationID: string) => Promise; - getLoginUserID: (operationID: string) => Promise; - uploadFile: ( - params: UploadFileParams, - operationID: string - ) => Promise<{ - url: string; - }>; - - // user - getUsersInfo: ( - userIDList: string[], - operationID: string - ) => Promise; - getSelfUserInfo: (operationID: string) => Promise; - setSelfInfo: ( - params: Partial, - operationID: string - ) => Promise; - subscribeUsersStatus: ( - params: string[], - operationID: string - ) => Promise; - unsubscribeUsersStatus: ( - params: string[], - operationID: string - ) => Promise; - getSubscribeUsersStatus: (operationID: string) => Promise; - setAppBackgroundStatus: ( - params: boolean, - operationID: string - ) => Promise; - networkStatusChanged: (operationID: string) => Promise; - /** - * @deprecated Use setSelfInfo instead. - */ - setGlobalRecvMessageOpt: ( - params: MessageReceiveOptType, - operationID: string - ) => Promise; - - // friend relationShip - acceptFriendApplication: ( - params: AccessFriendParams, - operationID: string - ) => Promise; - addBlack: (params: AddBlackParams, operationID: string) => Promise; - addFriend: (params: AddFriendParams, operationID: string) => Promise; - checkFriend: ( - params: string[], - operationID: string - ) => Promise; - deleteFriend: (params: string, operationID: string) => Promise; - getBlackList: (operationID: string) => Promise; - getFriendApplicationListAsApplicant: ( - operationID: string, - req: GetFriendApplicationListAsApplicantParams - ) => Promise; - getFriendApplicationListAsRecipient: ( - operationID: string, - req: GetFriendApplicationListAsRecipientParams - ) => Promise; - getFriendApplicationUnhandledCount: ( - req: GetSelfApplicationUnhandledCountParams, - operationID: string - ) => Promise; - getFriendList: ( - filterBlack: boolean, - operationID: string - ) => Promise; - getFriendListPage: ( - params: OffsetParams & { filterBlack?: boolean }, - operationID: string - ) => Promise; - getSpecifiedFriendsInfo: ( - params: GetSpecifiedFriendsParams, - operationID: string - ) => Promise; - updateFriends: ( - params: UpdateFriendsParams, - operationID: string - ) => Promise; - refuseFriendApplication: ( - params: AccessFriendParams, - operationID: string - ) => Promise; - removeBlack: (params: string, operationID: string) => Promise; - searchFriends: ( - params: SearchFriendParams, - operationID: string - ) => Promise; - setFriendRemark: ( - params: RemarkFriendParams, - operationID: string - ) => Promise; - - // group - createGroup: ( - params: CreateGroupParams, - operationID: string - ) => Promise; - joinGroup: (params: JoinGroupParams, operationID: string) => Promise; - inviteUserToGroup: ( - params: OpreateGroupParams, - operationID: string - ) => Promise; - getJoinedGroupList: (operationID: string) => Promise; - getJoinedGroupListPage: ( - params: OffsetParams, - operationID: string - ) => Promise; - searchGroups: ( - params: SearchGroupParams, - operationID: string - ) => Promise; - getSpecifiedGroupsInfo: ( - params: string[], - operationID: string - ) => Promise; - setGroupInfo: ( - params: SetGroupinfoParams, - operationID: string - ) => Promise; - getGroupApplicationListAsRecipient: ( - operationID: string, - req: GetGroupApplicationListAsRecipientParams - ) => Promise; - getGroupApplicationListAsApplicant: ( - operationID: string, - req: GetGroupApplicationListAsApplicantParams - ) => Promise; - getGroupApplicationUnhandledCount: ( - req: GetSelfApplicationUnhandledCountParams, - operationID: string - ) => Promise; - acceptGroupApplication: ( - params: AccessGroupParams, - operationID: string - ) => Promise; - refuseGroupApplication: ( - params: AccessGroupParams, - operationID: string - ) => Promise; - getGroupMemberList: ( - params: GetGroupMemberParams, - operationID: string - ) => Promise; - getSpecifiedGroupMembersInfo: ( - params: GetGroupMembersInfoParams, - operationID: string - ) => Promise; - getUsersInGroup: ( - params: GetGroupMembersInfoParams, - operationID: string - ) => Promise; - searchGroupMembers: ( - params: SearchGroupMemberParams, - operationID: string - ) => Promise; - setGroupMemberInfo: ( - params: UpdateMemberInfoParams, - operationID: string - ) => Promise; - getGroupMemberOwnerAndAdmin: ( - params: string, - operationID: string - ) => Promise; - getGroupMemberListByJoinTimeFilter: ( - params: GetGroupMemberByTimeParams, - operationID: string - ) => Promise; - kickGroupMember: ( - params: OpreateGroupParams, - operationID: string - ) => Promise; - changeGroupMemberMute: ( - params: ChangeGroupMemberMuteParams, - operationID: string - ) => Promise; - changeGroupMute: ( - params: ChangeGroupMuteParams, - operationID: string - ) => Promise; - transferGroupOwner: ( - params: TransferGroupParams, - operationID: string - ) => Promise; - dismissGroup: (params: string, operationID: string) => Promise; - quitGroup: (params: string, operationID: string) => Promise; - isJoinGroup: (groupID: string, operationID: string) => Promise; - - // conversation & message - getAllConversationList: (operationID: string) => Promise; - getConversationListSplit: ( - params: SplitConversationParams, - operationID: string - ) => Promise; - getOneConversation: ( - params: GetOneConversationParams, - operationID: string - ) => Promise; - getMultipleConversation: ( - params: string, - operationID: string - ) => Promise; - getConversationIDBySessionType: ( - params: GetOneConversationParams, - operationID: string - ) => Promise; - getTotalUnreadMsgCount: (operationID: string) => Promise; - markConversationMessageAsRead: ( - params: string, - operationID: string - ) => Promise; - setConversation: ( - params: SetConversationParams, - operationID: string - ) => Promise; - setConversationDraft: ( - params: SetConversationDraftParams, - operationID: string - ) => Promise; - pinConversation: ( - params: PinConversationParams, - operationID: string - ) => Promise; - setConversationRecvMessageOpt: ( - params: SetConversationRecvOptParams, - operationID: string - ) => Promise; - setConversationPrivateChat: ( - params: SetConversationPrivateParams, - operationID: string - ) => Promise; - setConversationBurnDuration: ( - params: SetBurnDurationParams, - operationID: string - ) => Promise; - resetConversationGroupAtType: ( - params: string, - operationID: string - ) => Promise; - hideConversation: (params: string, operationID: string) => Promise; - hideAllConversation: (operationID: string) => Promise; - clearConversationAndDeleteAllMsg: ( - params: string, - operationID: string - ) => Promise; - deleteConversationAndDeleteAllMsg: ( - params: string, - operationID: string - ) => Promise; - - createImageMessageFromFullPath: ( - params: string, - operationID: string - ) => Promise; - createVideoMessageFromFullPath: ( - params: VideoMsgByPathParams, - operationID: string - ) => Promise; - createSoundMessageFromFullPath: ( - params: SoundMsgByPathParams, - operationID: string - ) => Promise; - createFileMessageFromFullPath: ( - params: FileMsgByPathParams, - operationID: string - ) => Promise; - createTextMessage: ( - params: string, - operationID: string - ) => Promise; - createTextAtMessage: ( - params: AtMsgParams, - operationID: string - ) => Promise; - createImageMessageByURL: ( - params: ImageMsgParams, - operationID: string - ) => Promise; - createSoundMessageByURL: ( - params: SoundMsgParams, - operationID: string - ) => Promise; - createVideoMessageByURL: ( - params: VideoMsgParams, - operationID: string - ) => Promise; - createFileMessageByURL: ( - params: FileMsgParams, - operationID: string - ) => Promise; - createMergerMessage: ( - params: MergerMsgParams, - operationID: string - ) => Promise; - createForwardMessage: ( - params: MessageItem, - operationID: string - ) => Promise; - createLocationMessage: ( - params: LocationMsgParams, - operationID: string - ) => Promise; - createQuoteMessage: ( - params: QuoteMsgParams, - operationID: string - ) => Promise; - createCardMessage: ( - params: CardElem, - operationID: string - ) => Promise; - createCustomMessage: ( - params: CustomMsgParams, - operationID: string - ) => Promise; - createFaceMessage: ( - params: FaceMessageParams, - operationID: string - ) => Promise; - sendMessage: ( - params: SendMsgParams, - operationID: string - ) => Promise; - sendMessageNotOss: ( - params: SendMsgParams, - operationID: string - ) => Promise; - typingStatusUpdate: ( - params: TypingUpdateParams, - operationID: string - ) => Promise; - changeInputStates: ( - params: ChangeInputStatesParams, - operationID: string - ) => Promise; - getInputStates: ( - params: GetInputStatesParams, - operationID: string - ) => Promise; - revokeMessage: ( - params: OpreateMessageParams, - operationID: string - ) => Promise; - deleteMessage: ( - params: OpreateMessageParams, - operationID: string - ) => Promise; - deleteMessageFromLocalStorage: ( - params: OpreateMessageParams, - operationID: string - ) => Promise; - deleteAllMsgFromLocal: (operationID: string) => Promise; - deleteAllMsgFromLocalAndSvr: (operationID: string) => Promise; - searchLocalMessages: ( - params: SearchLocalParams, - operationID: string - ) => Promise; - getAdvancedHistoryMessageList: ( - params: GetAdvancedHistoryMsgParams, - operationID: string - ) => Promise; - getAdvancedHistoryMessageListReverse: ( - params: GetAdvancedHistoryMsgParams, - operationID: string - ) => Promise; - findMessageList: ( - params: FindMessageParams[], - operationID: string - ) => Promise; - insertGroupMessageToLocalStorage: ( - params: InsertGroupMsgParams, - operationID: string - ) => Promise; - insertSingleMessageToLocalStorage: ( - params: InsertSingleMsgParams, - operationID: string - ) => Promise; - setMessageLocalEx: ( - params: SetMessageLocalExParams, - operationID: string - ) => Promise; - uploadLogs: (params: UploadLogsParams, operationID: string) => Promise; - logs: (params: LogsParams, operationID: string) => Promise; - unInitSDK: (operationID: string) => Promise; - updateFcmToken: (fcmToken: string, expireTime: number, operationID: string) => Promise; - setAppBadge: (appUnreadCount: number, operationID: string) => Promise; -} +import { default as OpenIMSDK } from './sdk'; +export default OpenIMSDK; + +// Legacy event listeners used the native module's emitter directly. +// They are now wrapped; prefer OpenIMSDK.on and OpenIMSDK.off. +// For backward compatibility, we still export NativeOpenIMEmitter as OpenIMEmitter. +export { NativeOpenIMEmitter as OpenIMEmitter } from './OpenIMSDK.native'; + +export * from './constants/OpenIMEvents'; +export * from './errors/OpenIMApiError'; +export * from './errors/OpenIMEventError'; +export * from './types/entity'; +export * from './types/enum'; +export * from './types/eventArgs'; +export * from './types/params'; diff --git a/src/sdk.ts b/src/sdk.ts new file mode 100644 index 0000000..d4f564b --- /dev/null +++ b/src/sdk.ts @@ -0,0 +1,638 @@ +import Emitter from './emitter'; +import { OpenIMApiError } from './errors/OpenIMApiError'; +import NativeOpenIMSDK from './OpenIMSDK.native'; +import type { CardElem, MessageItem, SelfUserInfo } from './types/entity'; +import type { MessageReceiveOptType } from './types/enum'; +import { + AccessFriendParams, + AccessGroupParams, + AddBlackParams, + AddFriendParams, + AtMsgParams, + ChangeGroupMemberMuteParams, + ChangeGroupMuteParams, + ChangeInputStatesParams, + CreateGroupParams, + CustomMsgParams, + FaceMessageParams, + FileMsgByPathParams, + FileMsgParams, + FindMessageParams, + GetAdvancedHistoryMsgParams, + GetFriendApplicationListAsApplicantParams, + GetFriendApplicationListAsRecipientParams, + GetGroupApplicationListAsApplicantParams, + GetGroupApplicationListAsRecipientParams, + GetGroupMemberByTimeParams, + GetGroupMemberParams, + GetGroupMembersInfoParams, + GetInputStatesParams, + GetOneConversationParams, + GetSelfApplicationUnhandledCountParams, + GetSpecifiedFriendsParams, + ImageMsgParams, + InitOptions, + InsertGroupMsgParams, + InsertSingleMsgParams, + JoinGroupParams, + LocationMsgParams, + LoginParams, + LogsParams, + MergerMsgParams, + OffsetParams, + OpreateGroupParams, + OpreateMessageParams, + PinConversationParams, + QuoteMsgParams, + RemarkFriendParams, + SearchFriendParams, + SearchGroupMemberParams, + SearchGroupParams, + SearchLocalParams, + SendMsgParams, + SetBurnDurationParams, + SetConversationDraftParams, + SetConversationParams, + SetConversationPrivateParams, + SetConversationRecvOptParams, + SetGroupinfoParams, + SetMessageLocalExParams, + SoundMsgByPathParams, + SoundMsgParams, + SplitConversationParams, + TransferGroupParams, + TypingUpdateParams, + UpdateFriendsParams, + UpdateMemberInfoParams, + UploadFileParams, + UploadLogsParams, + VideoMsgByPathParams, + VideoMsgParams, +} from './types/params'; +import id from './utils/id'; + +class OpenIMSDK extends Emitter { + private static instance: OpenIMSDK; + + private constructor() { + super(); + } + + static getInstance(): OpenIMSDK { + if (!OpenIMSDK.instance) { + OpenIMSDK.instance = new OpenIMSDK(); + } + return OpenIMSDK.instance; + } + + private async invoke any, R = ReturnType>( + nativeMethod: T, + args: Parameters + ): Promise ? Awaited : R> { + try { + const result = nativeMethod(...args); + if (result instanceof Promise) { + return await result; + } + return result; + } catch (error: any) { + /** + * Native-layer rejection (via the React Native bridge): + * When the native side calls Promise.reject, the JS side receives an object shaped as: + * { + * code: number; + * message: string; + * userInfo: object; + * nativeStackIOS: string; // iOS only + * domain: string; // iOS only + * nativeStackAndroid: string; // Android only + * } + * See com.facebook.react.bridge.PromiseImpl (Android) for details. + * + * This handler wraps all errors into the OpenIMApiError class (code, message) to + * standardize error formats and make it easy for the business layer to determine + * error sources based on the OpenIMApiError class. + */ + throw new OpenIMApiError(error.code, error.message); + } + } + + // login + initSDK(params: InitOptions, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.initSDK, [params, operationID]); + } + + login(params: LoginParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.login, [params, operationID]); + } + + logout(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.logout, [operationID]); + } + + getLoginStatus(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getLoginStatus, [operationID]); + } + + getLoginUserID(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getLoginUserID, [operationID]); + } + + uploadFile(params: UploadFileParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.uploadFile, [params, operationID]); + } + + // user + getUsersInfo(userIDList: string[], operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getUsersInfo, [userIDList, operationID]); + } + + getSelfUserInfo(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getSelfUserInfo, [operationID]); + } + + setSelfInfo(params: Partial, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setSelfInfo, [params, operationID]); + } + + subscribeUsersStatus(params: string[], operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.subscribeUsersStatus, [params, operationID]); + } + + unsubscribeUsersStatus(params: string[], operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.unsubscribeUsersStatus, [params, operationID]); + } + + getSubscribeUsersStatus(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getSubscribeUsersStatus, [operationID]); + } + + setAppBackgroundStatus(params: boolean, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setAppBackgroundStatus, [params, operationID]); + } + + networkStatusChanged(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.networkStatusChanged, [operationID]); + } + + /** + * @deprecated Use setSelfInfo instead. + */ + setGlobalRecvMessageOpt(params: MessageReceiveOptType, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setGlobalRecvMessageOpt, [params, operationID]); + } + + // friend relationship + acceptFriendApplication(params: AccessFriendParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.acceptFriendApplication, [params, operationID]); + } + + addBlack(params: AddBlackParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.addBlack, [params, operationID]); + } + + addFriend(params: AddFriendParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.addFriend, [params, operationID]); + } + + checkFriend(params: string[], operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.checkFriend, [params, operationID]); + } + + deleteFriend(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.deleteFriend, [params, operationID]); + } + + getBlackList(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getBlackList, [operationID]); + } + + // TODO: + getFriendApplicationListAsApplicant( + operationID: string = id(), + req: GetFriendApplicationListAsApplicantParams = { offset: 0, count: 20 }, + ) { + return this.invoke(NativeOpenIMSDK.getFriendApplicationListAsApplicant, [operationID, req]); + } + + // TODO: + getFriendApplicationListAsRecipient( + operationID: string = id(), + req: GetFriendApplicationListAsRecipientParams = { handleResults: [], offset: 0, count: 20 }, + ) { + return this.invoke(NativeOpenIMSDK.getFriendApplicationListAsRecipient, [operationID, req]); + } + + getFriendApplicationUnhandledCount( + req: GetSelfApplicationUnhandledCountParams, + operationID: string = id() + ) { + return this.invoke(NativeOpenIMSDK.getFriendApplicationUnhandledCount, [req, operationID]); + } + + getFriendList(filterBlack: boolean, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getFriendList, [filterBlack, operationID]); + } + + getFriendListPage( + params: OffsetParams & { filterBlack?: boolean }, + operationID: string = id() + ) { + return this.invoke(NativeOpenIMSDK.getFriendListPage, [params, operationID]); + } + + getSpecifiedFriendsInfo(params: GetSpecifiedFriendsParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getSpecifiedFriendsInfo, [params, operationID]); + } + + updateFriends(params: UpdateFriendsParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.updateFriends, [params, operationID]); + } + + refuseFriendApplication(params: AccessFriendParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.refuseFriendApplication, [params, operationID]); + } + + removeBlack(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.removeBlack, [params, operationID]); + } + + searchFriends(params: SearchFriendParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.searchFriends, [params, operationID]); + } + + setFriendRemark(params: RemarkFriendParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setFriendRemark, [params, operationID]); + } + + // group + createGroup(params: CreateGroupParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createGroup, [params, operationID]); + } + + joinGroup(params: JoinGroupParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.joinGroup, [params, operationID]); + } + + inviteUserToGroup(params: OpreateGroupParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.inviteUserToGroup, [params, operationID]); + } + + getJoinedGroupList(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getJoinedGroupList, [operationID]); + } + + getJoinedGroupListPage(params: OffsetParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getJoinedGroupListPage, [params, operationID]); + } + + searchGroups(params: SearchGroupParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.searchGroups, [params, operationID]); + } + + getSpecifiedGroupsInfo(params: string[], operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getSpecifiedGroupsInfo, [params, operationID]); + } + + setGroupInfo(params: SetGroupinfoParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setGroupInfo, [params, operationID]); + } + + // TODO: + getGroupApplicationListAsRecipient( + operationID: string = id(), + req: GetGroupApplicationListAsRecipientParams = { groupIDs: [], handleResults: [], offset: 0, count: 20 }, + ) { + return this.invoke(NativeOpenIMSDK.getGroupApplicationListAsRecipient, [operationID, req]); + } + + // TODO: + getGroupApplicationListAsApplicant( + operationID: string = id(), + req: GetGroupApplicationListAsApplicantParams = { groupIDs: [], handleResults: [], offset: 0, count: 20 }, + ) { + return this.invoke(NativeOpenIMSDK.getGroupApplicationListAsApplicant, [operationID, req]); + } + + getGroupApplicationUnhandledCount( + req: GetSelfApplicationUnhandledCountParams, + operationID: string = id() + ) { + return this.invoke(NativeOpenIMSDK.getGroupApplicationUnhandledCount, [req, operationID]); + } + + acceptGroupApplication(params: AccessGroupParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.acceptGroupApplication, [params, operationID]); + } + + refuseGroupApplication(params: AccessGroupParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.refuseGroupApplication, [params, operationID]); + } + + getGroupMemberList(params: GetGroupMemberParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getGroupMemberList, [params, operationID]); + } + + getSpecifiedGroupMembersInfo( + params: GetGroupMembersInfoParams, + operationID: string = id() + ) { + return this.invoke(NativeOpenIMSDK.getSpecifiedGroupMembersInfo, [params, operationID]); + } + + getUsersInGroup(params: GetGroupMembersInfoParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getUsersInGroup, [params, operationID]); + } + + searchGroupMembers(params: SearchGroupMemberParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.searchGroupMembers, [params, operationID]); + } + + setGroupMemberInfo(params: UpdateMemberInfoParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setGroupMemberInfo, [params, operationID]); + } + + getGroupMemberOwnerAndAdmin(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getGroupMemberOwnerAndAdmin, [params, operationID]); + } + + getGroupMemberListByJoinTimeFilter( + params: GetGroupMemberByTimeParams, + operationID: string = id() + ) { + return this.invoke(NativeOpenIMSDK.getGroupMemberListByJoinTimeFilter, [params, operationID]); + } + + kickGroupMember(params: OpreateGroupParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.kickGroupMember, [params, operationID]); + } + + changeGroupMemberMute(params: ChangeGroupMemberMuteParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.changeGroupMemberMute, [params, operationID]); + } + + changeGroupMute(params: ChangeGroupMuteParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.changeGroupMute, [params, operationID]); + } + + transferGroupOwner(params: TransferGroupParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.transferGroupOwner, [params, operationID]); + } + + dismissGroup(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.dismissGroup, [params, operationID]); + } + + quitGroup(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.quitGroup, [params, operationID]); + } + + isJoinGroup(groupID: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.isJoinGroup, [groupID, operationID]); + } + + // conversation & message + getAllConversationList(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getAllConversationList, [operationID]); + } + + getConversationListSplit(params: SplitConversationParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getConversationListSplit, [params, operationID]); + } + + getOneConversation(params: GetOneConversationParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getOneConversation, [params, operationID]); + } + + getMultipleConversation(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getMultipleConversation, [params, operationID]); + } + + getConversationIDBySessionType(params: GetOneConversationParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getConversationIDBySessionType, [params, operationID]); + } + + getTotalUnreadMsgCount(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getTotalUnreadMsgCount, [operationID]); + } + + markConversationMessageAsRead(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.markConversationMessageAsRead, [params, operationID]); + } + + setConversation(params: SetConversationParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setConversation, [params, operationID]); + } + + setConversationDraft(params: SetConversationDraftParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setConversationDraft, [params, operationID]); + } + + pinConversation(params: PinConversationParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.pinConversation, [params, operationID]); + } + + setConversationRecvMessageOpt( + params: SetConversationRecvOptParams, + operationID: string = id() + ) { + return this.invoke(NativeOpenIMSDK.setConversationRecvMessageOpt, [params, operationID]); + } + + setConversationPrivateChat( + params: SetConversationPrivateParams, + operationID: string = id() + ) { + return this.invoke(NativeOpenIMSDK.setConversationPrivateChat, [params, operationID]); + } + + setConversationBurnDuration(params: SetBurnDurationParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setConversationBurnDuration, [params, operationID]); + } + + resetConversationGroupAtType(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.resetConversationGroupAtType, [params, operationID]); + } + + hideConversation(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.hideConversation, [params, operationID]); + } + + hideAllConversation(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.hideAllConversation, [operationID]); + } + + clearConversationAndDeleteAllMsg(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.clearConversationAndDeleteAllMsg, [params, operationID]); + } + + deleteConversationAndDeleteAllMsg(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.deleteConversationAndDeleteAllMsg, [params, operationID]); + } + + createImageMessageFromFullPath(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createImageMessageFromFullPath, [params, operationID]); + } + + createVideoMessageFromFullPath(params: VideoMsgByPathParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createVideoMessageFromFullPath, [params, operationID]); + } + + createSoundMessageFromFullPath(params: SoundMsgByPathParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createSoundMessageFromFullPath, [params, operationID]); + } + + createFileMessageFromFullPath(params: FileMsgByPathParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createFileMessageFromFullPath, [params, operationID]); + } + + createTextMessage(params: string, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createTextMessage, [params, operationID]); + } + + createTextAtMessage(params: AtMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createTextAtMessage, [params, operationID]); + } + + createImageMessageByURL(params: ImageMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createImageMessageByURL, [params, operationID]); + } + + createSoundMessageByURL(params: SoundMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createSoundMessageByURL, [params, operationID]); + } + + createVideoMessageByURL(params: VideoMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createVideoMessageByURL, [params, operationID]); + } + + createFileMessageByURL(params: FileMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createFileMessageByURL, [params, operationID]); + } + + createMergerMessage(params: MergerMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createMergerMessage, [params, operationID]); + } + + createForwardMessage(params: MessageItem, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createForwardMessage, [params, operationID]); + } + + createLocationMessage(params: LocationMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createLocationMessage, [params, operationID]); + } + + createQuoteMessage(params: QuoteMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createQuoteMessage, [params, operationID]); + } + + createCardMessage(params: CardElem, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createCardMessage, [params, operationID]); + } + + createCustomMessage(params: CustomMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createCustomMessage, [params, operationID]); + } + + createFaceMessage(params: FaceMessageParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.createFaceMessage, [params, operationID]); + } + + sendMessage(params: SendMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.sendMessage, [params, operationID]); + } + + sendMessageNotOss(params: SendMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.sendMessageNotOss, [params, operationID]); + } + + typingStatusUpdate(params: TypingUpdateParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.typingStatusUpdate, [params, operationID]); + } + + changeInputStates(params: ChangeInputStatesParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.changeInputStates, [params, operationID]); + } + + getInputStates(params: GetInputStatesParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.getInputStates, [params, operationID]); + } + + revokeMessage(params: OpreateMessageParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.revokeMessage, [params, operationID]); + } + + deleteMessage(params: OpreateMessageParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.deleteMessage, [params, operationID]); + } + + deleteMessageFromLocalStorage(params: OpreateMessageParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.deleteMessageFromLocalStorage, [params, operationID]); + } + + deleteAllMsgFromLocal(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.deleteAllMsgFromLocal, [operationID]); + } + + deleteAllMsgFromLocalAndSvr(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.deleteAllMsgFromLocalAndSvr, [operationID]); + } + + searchLocalMessages(params: SearchLocalParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.searchLocalMessages, [params, operationID]); + } + + getAdvancedHistoryMessageList( + params: GetAdvancedHistoryMsgParams, + operationID: string = id() + ) { + return this.invoke(NativeOpenIMSDK.getAdvancedHistoryMessageList, [params, operationID]); + } + + getAdvancedHistoryMessageListReverse( + params: GetAdvancedHistoryMsgParams, + operationID: string = id() + ) { + return this.invoke(NativeOpenIMSDK.getAdvancedHistoryMessageListReverse, [params, operationID]); + } + + findMessageList(params: FindMessageParams[], operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.findMessageList, [params, operationID]); + } + + insertGroupMessageToLocalStorage(params: InsertGroupMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.insertGroupMessageToLocalStorage, [params, operationID]); + } + + insertSingleMessageToLocalStorage(params: InsertSingleMsgParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.insertSingleMessageToLocalStorage, [params, operationID]); + } + + setMessageLocalEx(params: SetMessageLocalExParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setMessageLocalEx, [params, operationID]); + } + + uploadLogs(params: UploadLogsParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.uploadLogs, [params, operationID]); + } + + logs(params: LogsParams, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.logs, [params, operationID]); + } + + unInitSDK(operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.unInitSDK, [operationID]); + } + + updateFcmToken(fcmToken: string, expireTime: number, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.updateFcmToken, [fcmToken, expireTime, operationID]); + } + + setAppBadge(appUnreadCount: number, operationID: string = id()) { + return this.invoke(NativeOpenIMSDK.setAppBadge, [appUnreadCount, operationID]); + } +} + +const openIMSDK = OpenIMSDK.getInstance(); + +export default openIMSDK; diff --git a/src/types/eventArgs.ts b/src/types/eventArgs.ts new file mode 100644 index 0000000..2466fca --- /dev/null +++ b/src/types/eventArgs.ts @@ -0,0 +1,96 @@ +import { OpenIMEventBaseErrorType } from 'src/errors/OpenIMEventError'; +import { OpenIMEvent, OpenIMEventName } from '../constants/OpenIMEvents'; +import { + BlackUserItem, + ConversationInputStatus, + ConversationItem, + FriendApplicationItem, + FriendUserItem, + GroupApplicationItem, + GroupItem, + GroupMemberItem, + MessageItem, + ReceiptInfo, + RevokedInfo, + SelfUserInfo, + UserOnlineState, +} from './entity'; + +/** + * Event callback argument type map + * + * - Key: event name + * - Value: tuple of callback parameter types + * + * #### Examples: + * + * For `[OpenIMEvent.OnConnectSuccess]: []` + * the generated listener signature is: + * ``` + * OpenIMSDK.on(OpenIMEvent.OnConnectSuccess, () => {}) + * ``` + * + * For `[OpenIMEvent.OnSelfInfoUpdated]: [selfUserInfo: SelfUserInfo]` + * the generated listener signature is: + * ``` + * OpenIMSDK.on(OpenIMEvent.OnSelfInfoUpdated, (selfUserInfo: SelfUserInfo) => {}) + * ``` + */ +export type EventCallbackArgsMap = { + [OpenIMEvent.OnConnectSuccess]: []; + [OpenIMEvent.OnConnecting]: []; + [OpenIMEvent.OnConnectFailed]: [error: OpenIMEventBaseErrorType]; + [OpenIMEvent.OnKickedOffline]: []; + [OpenIMEvent.OnSelfInfoUpdated]: [selfUserInfo: SelfUserInfo]; + [OpenIMEvent.OnUserStatusChanged]: [userStatus: UserOnlineState]; + [OpenIMEvent.OnUserTokenExpired]: []; + [OpenIMEvent.OnUserTokenInvalid]: []; + + [OpenIMEvent.OnRecvNewMessage]: [message: MessageItem]; + [OpenIMEvent.OnRecvNewMessages]: [messages: MessageItem[]]; + [OpenIMEvent.OnRecvOfflineNewMessage]: [message: MessageItem]; + [OpenIMEvent.OnRecvOnlineOnlyMessage]: [message: MessageItem]; + [OpenIMEvent.OnRecvOfflineNewMessages]: [messages: MessageItem[]]; + [OpenIMEvent.OnMsgDeleted]: [message: MessageItem]; // FIXME: Type may be inaccurate, Golang core returns LocalChatLog type which has fewer properties than MessageItem here + [OpenIMEvent.OnRecvC2CReadReceipt]: [receipts: ReceiptInfo[]]; + [OpenIMEvent.OnNewRecvMessageRevoked]: [revokedInfo: RevokedInfo]; + + [OpenIMEvent.OnConversationChanged]: [conversations: ConversationItem[]]; + [OpenIMEvent.OnInputStatusChanged]: [inputStatus: ConversationInputStatus]; + [OpenIMEvent.OnNewConversation]: [conversations: ConversationItem[]]; + [OpenIMEvent.OnSyncServerFailed]: []; + [OpenIMEvent.OnSyncServerFinish]: []; + [OpenIMEvent.OnSyncServerStart]: [isSyncing: boolean]; + [OpenIMEvent.OnSyncServerProgress]: [progress: number]; + [OpenIMEvent.OnTotalUnreadMessageCountChanged]: [totalUnread: number]; + + [OpenIMEvent.OnBlackAdded]: [blackUser: BlackUserItem]; + [OpenIMEvent.OnBlackDeleted]: [blackUser: BlackUserItem]; + [OpenIMEvent.OnFriendApplicationAccepted]: [application: FriendApplicationItem]; + [OpenIMEvent.OnFriendApplicationAdded]: [application: FriendApplicationItem]; + [OpenIMEvent.OnFriendApplicationDeleted]: [application: FriendApplicationItem]; + [OpenIMEvent.OnFriendApplicationRejected]: [application: FriendApplicationItem]; + [OpenIMEvent.OnFriendInfoChanged]: [friend: FriendUserItem]; + [OpenIMEvent.OnFriendAdded]: [friend: FriendUserItem]; + [OpenIMEvent.OnFriendDeleted]: [friend: FriendUserItem]; + + [OpenIMEvent.OnGroupApplicationAccepted]: [application: GroupApplicationItem]; + [OpenIMEvent.OnGroupApplicationRejected]: [application: GroupApplicationItem]; + [OpenIMEvent.OnGroupApplicationAdded]: [application: GroupApplicationItem]; + [OpenIMEvent.OnGroupApplicationDeleted]: [application: GroupApplicationItem]; + [OpenIMEvent.OnGroupInfoChanged]: [group: GroupItem]; + [OpenIMEvent.OnGroupMemberInfoChanged]: [member: GroupMemberItem]; + [OpenIMEvent.OnGroupMemberAdded]: [member: GroupMemberItem]; + [OpenIMEvent.OnGroupMemberDeleted]: [member: GroupMemberItem]; + [OpenIMEvent.OnJoinedGroupAdded]: [group: GroupItem]; + [OpenIMEvent.OnJoinedGroupDeleted]: [group: GroupItem]; + [OpenIMEvent.OnGroupDismissed]: [group: GroupItem]; + [OpenIMEvent.SendMessageProgress]: [info: { progress: number; message: MessageItem }]; + [OpenIMEvent.UploadComplete]: [payload: { data: { fileSize: number; streamSize: number; storageSize: number; operationID: string } }]; + [OpenIMEvent.OnRecvCustomBusinessMessage]: [data: any]; // FIXME: Type is unknown. + [OpenIMEvent.UploadOnProgress]: [payload: { current: number; size: number, operationID: string }]; +}; + +export type ArgsOfEvent = E extends keyof EventCallbackArgsMap + ? EventCallbackArgsMap[E] + : never; diff --git a/src/utils/id.ts b/src/utils/id.ts new file mode 100644 index 0000000..3312b96 --- /dev/null +++ b/src/utils/id.ts @@ -0,0 +1,5 @@ +import uuid from 'react-native-uuid'; + +export default function id() { + return uuid.v4(); +} diff --git a/yarn.lock b/yarn.lock index f1709a0..ae2fa29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6686,6 +6686,11 @@ react-native-gradle-plugin@^0.70.3: resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.70.3.tgz#cbcf0619cbfbddaa9128701aa2d7b4145f9c4fc8" integrity sha512-oOanj84fJEXUg9FoEAQomA8ISG+DVIrTZ3qF7m69VQUJyOGYyDZmPqKcjvRku4KXlEH6hWO9i4ACLzNBh8gC0A== +react-native-uuid@^2.0.3: + version "2.0.3" + resolved "https://registry.npmmirror.com/react-native-uuid/-/react-native-uuid-2.0.3.tgz#f85f8a8d68e52e3f1c18ba0f02ec7776f9d4a0da" + integrity sha512-f/YfIS2f5UB+gut7t/9BKGSCYbRA9/74A5R1MDp+FLYsuS+OSWoiM/D8Jko6OJB6Jcu3v6ONuddvZKHdIGpeiw== + react-native@0.70.5: version "0.70.5" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.70.5.tgz#f60540b21d338891086e0a834e331c124dd1f55c" @@ -7946,11 +7951,6 @@ utils-merge@1.0.1: resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz"