diff --git a/android/build.gradle b/android/build.gradle index 932035c85..e404ebbcf 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -74,4 +74,4 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'androidx.appcompat:appcompat:1.3.1' -} +} \ No newline at end of file diff --git a/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt b/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt index 5bde3f046..a5174b2f1 100644 --- a/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +++ b/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt @@ -150,6 +150,13 @@ class HMSRNSDK( return data } + fun emitHMSMessageSuccess(hmsMessage: HMSMessage): ReadableMap { + val data: WritableMap = Arguments.createMap() + data.putString("message", hmsMessage.message) + data.putString("messageId", hmsMessage.messageId) + return data + } + fun preview(credentials: ReadableMap) { if (previewInProgress) { self.emitCustomError("PREVIEW_IS_IN_PROGRESS") @@ -377,6 +384,7 @@ class HMSRNSDK( data.putMap("sender", HMSDecoder.getHmsPeerSubset(message.sender)) data.putString("message", message.message) + data.putString("messageId", message.messageId) data.putString("type", message.type) data.putString("time", message.serverReceiveTime.toString()) data.putString("id", id) @@ -670,7 +678,7 @@ class HMSRNSDK( callback?.reject(error.code.toString(), error.message) } override fun onSuccess(hmsMessage: HMSMessage) { - callback?.resolve(emitHMSSuccess(hmsMessage)) + callback?.resolve(emitHMSMessageSuccess(hmsMessage)) } }, ) @@ -702,7 +710,7 @@ class HMSRNSDK( callback?.reject(error.code.toString(), error.message) } override fun onSuccess(hmsMessage: HMSMessage) { - callback?.resolve(emitHMSSuccess(hmsMessage)) + callback?.resolve(emitHMSMessageSuccess(hmsMessage)) } }, ) @@ -733,7 +741,7 @@ class HMSRNSDK( callback?.reject(error.code.toString(), error.message) } override fun onSuccess(hmsMessage: HMSMessage) { - callback?.resolve(emitHMSSuccess(hmsMessage)) + callback?.resolve(emitHMSMessageSuccess(hmsMessage)) } }, ) diff --git a/example/ExampleAppChangelog.txt b/example/ExampleAppChangelog.txt index cdd2b079d..e694882ba 100644 --- a/example/ExampleAppChangelog.txt +++ b/example/ExampleAppChangelog.txt @@ -1,8 +1,8 @@ -Board: https://github.com/100mslive/react-native-hms/projects/20 +Board: https://github.com/100mslive/react-native-hms/projects/21 -- Corrected applying HMSView scaletype -https://github.com/100mslive/react-native-hms/pull/1034 +- Add messageId to HMSMessage +https://github.com/100mslive/react-native-hms/pull/1044/ -React Native SDK: 1.6.1 -Android SDK: 2.6.3 +React Native SDK: 1.6.2 +Android SDK: 2.6.4 iOS SDK: 0.9.4 diff --git a/example/android/Gemfile.lock b/example/android/Gemfile.lock index ad410309c..858e6be1c 100644 --- a/example/android/Gemfile.lock +++ b/example/android/Gemfile.lock @@ -8,7 +8,7 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.764.0) + aws-partitions (1.765.0) aws-sdk-core (3.172.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.651.0) diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index b18f64df9..bcf3bae43 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -134,8 +134,8 @@ android { applicationId "live.hms.rn" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 200 - versionName "2.1.64" + versionCode 201 + versionName "2.1.65" missingDimensionStrategy 'react-native-camera', 'general' } splits { diff --git a/example/ios/Gemfile.lock b/example/ios/Gemfile.lock index 712ed6556..87aa22257 100644 --- a/example/ios/Gemfile.lock +++ b/example/ios/Gemfile.lock @@ -8,7 +8,7 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.764.0) + aws-partitions (1.765.0) aws-sdk-core (3.172.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.651.0) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index f94ed01ba..4523dc301 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -290,7 +290,7 @@ PODS: - React-Core - react-native-document-picker (8.2.1): - React-Core - - react-native-hms (1.6.1): + - react-native-hms (1.6.2): - HMSBroadcastExtensionSDK (= 0.0.9) - HMSSDK (= 0.9.4) - React-Core @@ -622,7 +622,7 @@ SPEC CHECKSUMS: react-native-camera: 3eae183c1d111103963f3dd913b65d01aef8110f react-native-cameraroll: 8ffb0af7a5e5de225fd667610e2979fc1f0c2151 react-native-document-picker: 69ca2094d8780cfc1e7e613894d15290fdc54bba - react-native-hms: 687061da689231515992d70ec6cb1b161cab1be2 + react-native-hms: eb0e01eed0ab02a719558602e18bcf7064e376b6 react-native-safe-area-context: 9e40fb181dac02619414ba1294d6c2a807056ab9 react-native-simple-toast: 8ee5d23f0b92b935ab7434cdb65159ce12dfb4b7 react-native-video: c26780b224543c62d5e1b2a7244a5cd1b50e8253 diff --git a/example/ios/RNHMSExample.xcodeproj/project.pbxproj b/example/ios/RNHMSExample.xcodeproj/project.pbxproj index 006d5b971..9dd7e8174 100644 --- a/example/ios/RNHMSExample.xcodeproj/project.pbxproj +++ b/example/ios/RNHMSExample.xcodeproj/project.pbxproj @@ -442,7 +442,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 200; + CURRENT_PROJECT_VERSION = 201; DEVELOPMENT_TEAM = 5N85PP82A9; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; @@ -484,7 +484,7 @@ CODE_SIGN_ENTITLEMENTS = RNHMSExample/RNHMSExample.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 200; + CURRENT_PROJECT_VERSION = 201; DEVELOPMENT_TEAM = 5N85PP82A9; ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; @@ -654,7 +654,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 200; + CURRENT_PROJECT_VERSION = 201; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 5N85PP82A9; ENABLE_BITCODE = NO; @@ -699,7 +699,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 200; + CURRENT_PROJECT_VERSION = 201; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 5N85PP82A9; ENABLE_BITCODE = NO; diff --git a/example/ios/RNHMSExample/Info.plist b/example/ios/RNHMSExample/Info.plist index aa6c4fcbf..3736677ae 100644 --- a/example/ios/RNHMSExample/Info.plist +++ b/example/ios/RNHMSExample/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.1.64 + 2.1.65 CFBundleSignature ???? CFBundleVersion - 200 + 201 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/example/package-lock.json b/example/package-lock.json index 653760001..371111be0 100644 --- a/example/package-lock.json +++ b/example/package-lock.json @@ -1,12 +1,12 @@ { "name": "RNHMSExample", - "version": "1.6.1", + "version": "1.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "RNHMSExample", - "version": "1.6.1", + "version": "1.7.0", "hasInstallScript": true, "dependencies": { "@miblanchard/react-native-slider": "^2.0.2", @@ -3640,9 +3640,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.5.tgz", - "integrity": "sha512-IvGD1CD/nego63ySR7vrAKEX3AJTcmrAN2kn+/sDNLi1Ff5kBzDeEdqWDplK+0HAEoLYej137Sk0cUU8OLOlMg==" + "version": "20.1.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", + "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -4932,9 +4932,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001487", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", - "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", + "version": "1.0.30001488", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz", + "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==", "funding": [ { "type": "opencollective", @@ -5628,9 +5628,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.396", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.396.tgz", - "integrity": "sha512-pqKTdqp/c5vsrc0xUPYXTDBo9ixZuGY8es4ZOjjd6HD6bFYbu5QA09VoW3fkY4LF1T0zYk86lN6bZnNlBuOpdQ==" + "version": "1.4.397", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.397.tgz", + "integrity": "sha512-jwnPxhh350Q/aMatQia31KAIQdhEsYS0fFZ0BQQlN9tfvOEwShu6ZNwI4kL/xBabjcB/nTy6lSt17kNIluJZ8Q==" }, "node_modules/eme-encryption-scheme-polyfill": { "version": "2.1.1", @@ -7710,9 +7710,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, diff --git a/example/package.json b/example/package.json index 97be4d00a..3149916dc 100644 --- a/example/package.json +++ b/example/package.json @@ -1,6 +1,6 @@ { "name": "RNHMSExample", - "version": "1.6.1", + "version": "1.7.0", "private": true, "scripts": { "preinstall": "cd ../ && npm install && cd ./example", diff --git a/example/src/components/ChatWindow.tsx b/example/src/components/ChatWindow.tsx index d9c0dc342..2826b9bf0 100644 --- a/example/src/components/ChatWindow.tsx +++ b/example/src/components/ChatWindow.tsx @@ -255,6 +255,12 @@ const ChatList = ({ /> )} + + {data.messageId} + {data.message} ); @@ -299,38 +305,60 @@ export const ChatWindow = ({localPeer}: {localPeer?: HMSLocalPeer}) => { }; const sendMessage = () => { - let hmsMessageRecipient: HMSMessageRecipient; - if (text.length > 0) { + if (text.length > 0 && hmsInstance) { + let hmsMessageRecipient: HMSMessageRecipient; + if (type === 'role') { hmsMessageRecipient = new HMSMessageRecipient({ recipientType: HMSMessageRecipientType.ROLES, recipientRoles: [receiverObject as HMSRole], }); - hmsInstance?.sendGroupMessage(text, [receiverObject as HMSRole]); } else if (type === 'direct') { hmsMessageRecipient = new HMSMessageRecipient({ recipientType: HMSMessageRecipientType.PEER, recipientPeer: receiverObject as HMSPeer, }); - hmsInstance?.sendDirectMessage(text, receiverObject as HMSPeer); } else { hmsMessageRecipient = new HMSMessageRecipient({ recipientType: HMSMessageRecipientType.BROADCAST, }); - hmsInstance?.sendBroadcastMessage(text); } - dispatch( - addMessage( - new HMSMessage({ - message: text, + + // Saving reference of `text` state to local variable + // to use the typed message after clearing state + const messageText = text; + + setText(''); + + const handleMessageID = ({ + messageId, + }: { + messageId: string | undefined; + }) => { + if (messageId) { + const localMessage = new HMSMessage({ + messageId: messageId, + message: messageText, type: HMSMessageType.CHAT, time: new Date(), sender: localPeer, recipient: hmsMessageRecipient, - }), - ), - ); - setText(''); + }); + dispatch(addMessage(localMessage)); + } + }; + + if (type === 'role') { + hmsInstance + .sendGroupMessage(messageText, [receiverObject as HMSRole]) + .then(handleMessageID); + } else if (type === 'direct') { + hmsInstance + .sendDirectMessage(messageText, receiverObject as HMSPeer) + .then(handleMessageID); + } else { + hmsInstance.sendBroadcastMessage(messageText).then(handleMessageID); + } } }; diff --git a/example/src/components/LiveButton.tsx b/example/src/components/LiveButton.tsx index 02213a7bc..bb0a84a30 100644 --- a/example/src/components/LiveButton.tsx +++ b/example/src/components/LiveButton.tsx @@ -20,7 +20,7 @@ export interface LiveButtonProps { isLive: boolean; onPress(): void; disabled?: boolean; - size?: 'normal' | 'small' + size?: 'normal' | 'small'; } const LiveButton: React.FC = ({ @@ -28,18 +28,22 @@ const LiveButton: React.FC = ({ isLive, onPress, disabled, - size = 'normal' + size = 'normal', }) => { - const textStyle: StyleProp = size !== 'normal' ? { fontSize: 10 } : null; - const indicatorStyle: StyleProp = size !== 'normal' ? { width: 4, height: 4, borderRadius: 2 } : null; - const pressableStyle: StyleProp = size !== 'normal' ? { padding: 4 } : null; + const textStyle: StyleProp = + size !== 'normal' ? {fontSize: 10} : null; + const indicatorStyle: StyleProp = + size !== 'normal' ? {width: 4, height: 4, borderRadius: 2} : null; + const pressableStyle: StyleProp = + size !== 'normal' ? {padding: 4} : null; return ( + disabled={disabled} + > { cancelModal(); - if (peerTrackNode.peer.isLocal) return; + if (peerTrackNode.peer.isLocal) { + return; + } hmsInstance?.changeTrackState( peerTrackNode.peer.audioTrack!!, @@ -71,7 +73,9 @@ export const PeerSettingsModalContent: React.FC< const toggleMuteVideo = () => { cancelModal(); - if (peerTrackNode.peer.isLocal) return; + if (peerTrackNode.peer.isLocal) { + return; + } hmsInstance?.changeTrackState( peerTrackNode.peer.videoTrack!!, diff --git a/example/src/components/StreamingQualityModalContent.tsx b/example/src/components/StreamingQualityModalContent.tsx index 04aa2cf90..cd0d1d293 100644 --- a/example/src/components/StreamingQualityModalContent.tsx +++ b/example/src/components/StreamingQualityModalContent.tsx @@ -65,13 +65,20 @@ export const StreamingQualityModalContent: React.FC< const changeStreamingQuality = async () => { cancelModal(); - if (!selectedLayer || !remoteVideoTrack || selectedLayer === originalLayer) + if ( + !selectedLayer || + !remoteVideoTrack || + selectedLayer === originalLayer + ) { return; + } remoteVideoTrack .setLayer(selectedLayer) .then(value => { - if (value) console.log('Set Layer Success: ', value); + if (value) { + console.log('Set Layer Success: ', value); + } }) .catch(e => console.log('Set Layer Error: ', e)); }; diff --git a/example/src/screens/MeetingScreen/Modals.tsx b/example/src/screens/MeetingScreen/Modals.tsx index 47573cc8a..bfa9442ff 100644 --- a/example/src/screens/MeetingScreen/Modals.tsx +++ b/example/src/screens/MeetingScreen/Modals.tsx @@ -670,11 +670,12 @@ export const SaveScreenshot = ({ // if source is local file on android device, then we copy source file to target path if (isSourceLocalFile) { - if (Platform.OS === 'android') + if (Platform.OS === 'android') { await RNFS.copyFile( source, // Source Dir targetLocation, // Target Dir ); + } } // if source is not local file, then we write to target path else { @@ -2208,7 +2209,9 @@ export const ChangeBulkRoleModal: React.FC = ({ const [rolesToChange, setRolesToChange] = useState([]); const changeRole = async () => { - if (!hmsInstance || !targetRole) return; + if (!hmsInstance || !targetRole) { + return; + } hmsInstance.changeRoleOfPeersWithRoles( rolesToChange.filter( diff --git a/example/src/screens/MeetingScreen/index.tsx b/example/src/screens/MeetingScreen/index.tsx index 1ab9edfd5..b8ec4035a 100644 --- a/example/src/screens/MeetingScreen/index.tsx +++ b/example/src/screens/MeetingScreen/index.tsx @@ -919,11 +919,13 @@ const DisplayView = (data: { useEffect(() => { // Check if instance of HMSSessionStore is available if (hmsSessionStore) { + let toastTimeoutId: NodeJS.Timeout | null = null; + const addSessionStoreListeners = () => { // Handle 'spotlight' key values const handleSpotlightIdChange = (id: HMSSessionStoreValue) => { // Scroll to start of the list - if (!!id) { + if (id) { gridViewRef.current ?.getFlatlistRef() .current?.scrollToOffset({animated: true, offset: 0}); @@ -971,6 +973,9 @@ const DisplayView = (data: { ), ); + let lastSpotlightValue: HMSSessionStoreValue = null; + let lastPinnedMessageValue: HMSSessionStoreValue = null; + // Add subscription for `spotlight` & `pinnedMessage` keys updates on Session Store const subscription = hmsSessionStore.addKeyChangeListener< ['spotlight', 'pinnedMessage'] @@ -989,10 +994,43 @@ const DisplayView = (data: { switch (data.key) { case 'spotlight': { handleSpotlightIdChange(data.value); + + // Showing Toast message if value has actually changed + if ( + data.value !== lastSpotlightValue && + (data.value || lastSpotlightValue) + ) { + Toast.showWithGravity( + `SessionStore: \`spotlight\` key's value changed to ${data.value}`, + Toast.LONG, + Toast.TOP, + ); + } + + lastSpotlightValue = data.value; break; } case 'pinnedMessage': { handlePinnedMessageChange(data.value); + + // Showing Toast message if value has actually changed + if ( + data.value !== lastPinnedMessageValue && + (data.value || lastPinnedMessageValue) + ) { + if (toastTimeoutId !== null) { + clearTimeout(toastTimeoutId); + } + toastTimeoutId = setTimeout(() => { + Toast.showWithGravity( + `SessionStore: \`pinnedMessage\` key's value changed to ${data.value}`, + Toast.LONG, + Toast.TOP, + ); + }, 1500); + } + + lastPinnedMessageValue = data.value; break; } } @@ -1008,6 +1046,8 @@ const DisplayView = (data: { return () => { // remove Session Store key update listener on cleanup sessionStoreListeners.current.forEach(listener => listener.remove()); + + if (toastTimeoutId !== null) clearTimeout(toastTimeoutId); }; } }, [hmsSessionStore]); diff --git a/ios/HMSRNSDK.swift b/ios/HMSRNSDK.swift index bff1acc9e..e36d9aea8 100644 --- a/ios/HMSRNSDK.swift +++ b/ios/HMSRNSDK.swift @@ -264,7 +264,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener { DispatchQueue.main.async { [weak self] in self?.hms?.sendBroadcastMessage(type: type, message: message, completion: { message, error in if error == nil { - resolve?(["success": true, "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]] as [String: Any]) + resolve?(["messageId": message?.messageID ?? "", "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]] as [String: Any]) return } else { if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true { @@ -292,7 +292,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener { let encodedTargetedRoles = HMSHelper.getRolesFromRoleNames(targetedRoles, roles: self?.hms?.roles) self?.hms?.sendGroupMessage(type: type, message: message, roles: encodedTargetedRoles, completion: { message, error in if error == nil { - resolve?(["success": true, "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]] as [String: Any]) + resolve?(["messageId": message?.messageID ?? "", "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]] as [String: Any]) return } else { if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true { @@ -320,7 +320,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener { guard let peer = HMSHelper.getRemotePeerFromPeerId(peerId, remotePeers: self?.hms?.remotePeers) else { return } self?.hms?.sendDirectMessage(type: type, message: message, peer: peer, completion: { message, error in if error == nil { - resolve?(["success": true, "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]] as [String: Any]) + resolve?(["messageId": message?.messageID ?? "", "data": ["sender": message?.sender?.name ?? "", "message": message?.message ?? "", "type": message?.type]] as [String: Any]) return } else { if self?.eventsEnableStatus[HMSConstants.ON_ERROR] == true { @@ -1432,7 +1432,7 @@ class HMSRNSDK: HMSUpdateListener, HMSPreviewListener { if eventsEnableStatus[HMSConstants.ON_MESSAGE] != true { return } - self.delegate?.emitEvent(HMSConstants.ON_MESSAGE, ["event": HMSConstants.ON_MESSAGE, "id": self.id, "sender": HMSDecoder.getHmsPeerSubset(message.sender), "recipient": HMSDecoder.getHmsMessageRecipient(message.recipient), "time": message.time.timeIntervalSince1970 * 1000, "message": message.message, "type": message.type]) + self.delegate?.emitEvent(HMSConstants.ON_MESSAGE, ["event": HMSConstants.ON_MESSAGE, "id": self.id, "sender": HMSDecoder.getHmsPeerSubset(message.sender), "recipient": HMSDecoder.getHmsMessageRecipient(message.recipient), "time": message.time.timeIntervalSince1970 * 1000, "message": message.message, "messageId": message.messageID, "type": message.type]) } func on(updated speakers: [HMSSpeaker]) { diff --git a/package-lock.json b/package-lock.json index 5555dccdc..7ceb5798f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@100mslive/react-native-hms", - "version": "1.6.1", + "version": "1.6.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@100mslive/react-native-hms", - "version": "1.6.1", + "version": "1.6.2", "license": "MIT", "devDependencies": { "@commitlint/config-conventional": "^11.0.0", @@ -24,6 +24,7 @@ "react": "17.0.1", "react-native": "0.64.4", "react-native-builder-bob": "^0.18.0", + "typedoc": "^0.24.7", "typescript": "^4.6.3" }, "peerDependencies": { @@ -4508,9 +4509,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.5.tgz", - "integrity": "sha512-IvGD1CD/nego63ySR7vrAKEX3AJTcmrAN2kn+/sDNLi1Ff5kBzDeEdqWDplK+0HAEoLYej137Sk0cUU8OLOlMg==", + "version": "20.1.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.7.tgz", + "integrity": "sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -4922,6 +4923,12 @@ "node": ">=8" } }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "dev": true + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -5773,9 +5780,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001487", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", - "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", + "version": "1.0.30001488", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz", + "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==", "dev": true, "funding": [ { @@ -6658,9 +6665,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.396", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.396.tgz", - "integrity": "sha512-pqKTdqp/c5vsrc0xUPYXTDBo9ixZuGY8es4ZOjjd6HD6bFYbu5QA09VoW3fkY4LF1T0zYk86lN6bZnNlBuOpdQ==", + "version": "1.4.397", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.397.tgz", + "integrity": "sha512-jwnPxhh350Q/aMatQia31KAIQdhEsYS0fFZ0BQQlN9tfvOEwShu6ZNwI4kL/xBabjcB/nTy6lSt17kNIluJZ8Q==", "dev": true }, "node_modules/emittery": { @@ -9089,9 +9096,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -11489,6 +11496,12 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -11695,6 +11708,12 @@ "yallist": "^3.0.2" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -11761,6 +11780,18 @@ "node": ">=0.10.0" } }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", @@ -15019,6 +15050,18 @@ "dev": true, "optional": true }, + "node_modules/shiki": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.2.tgz", + "integrity": "sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -16196,6 +16239,51 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typedoc": { + "version": "0.24.7", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.7.tgz", + "integrity": "sha512-zzfKDFIZADA+XRIp2rMzLe9xZ6pt12yQOhCr7cD7/PBTjhPmMyMvGrkZ2lPNJitg3Hj1SeiYFNzCsSDrlpxpKw==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 14.14" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -16557,6 +16645,18 @@ "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "dev": true }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", diff --git a/package.json b/package.json index cc0b60107..32dfb4b65 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@100mslive/react-native-hms", - "version": "1.6.1", + "version": "1.6.2", "description": "Integrate Real Time Audio and Video conferencing, Interactive Live Streaming, and Chat in your apps with 100ms React Native SDK. With support for HLS and RTMP Live Streaming and Recording, Picture-in-Picture (PiP), one-to-one Video Call Modes, Audio Rooms, Video Player and much more, add immersive real-time communications to your apps.", "main": "lib/commonjs/index", "module": "lib/module/index", @@ -30,7 +30,8 @@ "release": "release-it", "example": "yarn --cwd example", "pods": "cd example && pod-install --quiet", - "bootstrap": "yarn example && yarn && yarn pods" + "bootstrap": "yarn example && yarn && yarn pods", + "typedoc": "npx typedoc src/index.ts --excludePrivate --excludeProtected --excludeInternal" }, "keywords": [ "react-native", @@ -112,10 +113,11 @@ "husky": "^4.2.5", "jest": "^26.0.1", "prettier": "^2.0.5", - "react-native-builder-bob": "^0.18.0", - "typescript": "^4.6.3", "react": "17.0.1", - "react-native": "0.64.4" + "react-native": "0.64.4", + "react-native-builder-bob": "^0.18.0", + "typedoc": "^0.24.7", + "typescript": "^4.6.3" }, "peerDependencies": { "react": "*", diff --git a/sample-apps/rn-quickstart-app/package-lock.json b/sample-apps/rn-quickstart-app/package-lock.json index 0b1ba63ec..a1601b5d8 100644 --- a/sample-apps/rn-quickstart-app/package-lock.json +++ b/sample-apps/rn-quickstart-app/package-lock.json @@ -8,7 +8,7 @@ "name": "ReactNativeHms", "version": "0.0.1", "dependencies": { - "@100mslive/react-native-hms": "^1.5.0", + "@100mslive/react-native-hms": "^1.6.1", "@react-native-async-storage/async-storage": "^1.17.11", "@react-navigation/native": "^6.1.1", "@react-navigation/native-stack": "^6.9.7", @@ -46,9 +46,9 @@ } }, "node_modules/@100mslive/react-native-hms": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.5.0.tgz", - "integrity": "sha512-PTsY2sVqOkpk5BlOdlW+aDmSUl5TFhxYHHDgAjKU0gOGhxCvMgJoHAe//8XVz4mu4DZ5y456iPvAOEKTJEcNwg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.6.1.tgz", + "integrity": "sha512-Id2n/PrFH2GMognGXxH6jR7ZSTpF+HNVAi/UqAQFR8jLJgB+/GSsVlhv+JnzSo1plgtcmyY13+wx6bdUiNqDtA==", "peerDependencies": { "react": "*", "react-native": "*" @@ -16153,9 +16153,9 @@ }, "dependencies": { "@100mslive/react-native-hms": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.5.0.tgz", - "integrity": "sha512-PTsY2sVqOkpk5BlOdlW+aDmSUl5TFhxYHHDgAjKU0gOGhxCvMgJoHAe//8XVz4mu4DZ5y456iPvAOEKTJEcNwg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.6.1.tgz", + "integrity": "sha512-Id2n/PrFH2GMognGXxH6jR7ZSTpF+HNVAi/UqAQFR8jLJgB+/GSsVlhv+JnzSo1plgtcmyY13+wx6bdUiNqDtA==", "requires": {} }, "@ampproject/remapping": { diff --git a/sample-apps/rn-quickstart-app/package.json b/sample-apps/rn-quickstart-app/package.json index 2219662d1..5823e6233 100644 --- a/sample-apps/rn-quickstart-app/package.json +++ b/sample-apps/rn-quickstart-app/package.json @@ -10,7 +10,7 @@ "lint": "eslint . --ext .js,.jsx,.ts,.tsx" }, "dependencies": { - "@100mslive/react-native-hms": "^1.5.0", + "@100mslive/react-native-hms": "^1.6.1", "@react-native-async-storage/async-storage": "^1.17.11", "@react-navigation/native": "^6.1.1", "@react-navigation/native-stack": "^6.9.7", diff --git a/sample-apps/rn-quickstart-app/src/screens/MeetingScreen/hooks.ts b/sample-apps/rn-quickstart-app/src/screens/MeetingScreen/hooks.ts index bce417290..b1d574922 100644 --- a/sample-apps/rn-quickstart-app/src/screens/MeetingScreen/hooks.ts +++ b/sample-apps/rn-quickstart-app/src/screens/MeetingScreen/hooks.ts @@ -187,7 +187,9 @@ export const usePeerTrackNodes = () => { // We will create Tile for the Joined Peer when we receive HMSUpdateListenerActions.ON_TRACK_UPDATE. // We are chosing to not create Tiles for Peers which does not have any tracks - if (type === HMSPeerUpdate.PEER_JOINED) return; + if (type === HMSPeerUpdate.PEER_JOINED) { + return; + } if (type === HMSPeerUpdate.PEER_LEFT) { // Remove all Tiles which has peer same as the peer which just left the call/meeting. @@ -454,7 +456,9 @@ export const usePeerTrackNodes = () => { * Returning early if we don't have Room Code, as it is required to create Auth Token * For more info, Check out {@link https://www.100ms.live/docs/react-native/v2/quickstart/token#get-room-code-from-100ms-dashboard | Auth Token from Room Code concept} */ - if (!params.roomCode) return; + if (!params.roomCode) { + return; + } const joinMeeting = async () => { try { diff --git a/sample-apps/rn-quickstart-app/yarn.lock b/sample-apps/rn-quickstart-app/yarn.lock index b31c0e60b..f313d5c59 100644 --- a/sample-apps/rn-quickstart-app/yarn.lock +++ b/sample-apps/rn-quickstart-app/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@100mslive/react-native-hms@^1.5.0": - "integrity" "sha512-PTsY2sVqOkpk5BlOdlW+aDmSUl5TFhxYHHDgAjKU0gOGhxCvMgJoHAe//8XVz4mu4DZ5y456iPvAOEKTJEcNwg==" - "resolved" "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.5.0.tgz" - "version" "1.5.0" +"@100mslive/react-native-hms@^1.6.1": + "integrity" "sha512-Id2n/PrFH2GMognGXxH6jR7ZSTpF+HNVAi/UqAQFR8jLJgB+/GSsVlhv+JnzSo1plgtcmyY13+wx6bdUiNqDtA==" + "resolved" "https://registry.npmjs.org/@100mslive/react-native-hms/-/react-native-hms-1.6.1.tgz" + "version" "1.6.1" "@ampproject/remapping@^2.1.0": "integrity" "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==" diff --git a/sdk-versions.json b/sdk-versions.json index a19cde860..cf9b84551 100644 --- a/sdk-versions.json +++ b/sdk-versions.json @@ -1,5 +1,5 @@ { "ios": "0.9.4", "iOSBroadcastExtension": "0.0.9", - "android": "2.6.3" + "android": "2.6.4" } diff --git a/src/classes/HMSEncoder.ts b/src/classes/HMSEncoder.ts index c47b15224..eb5726156 100644 --- a/src/classes/HMSEncoder.ts +++ b/src/classes/HMSEncoder.ts @@ -528,6 +528,7 @@ export class HMSEncoder { if (data) { return new HMSMessage({ message: data?.message, + messageId: data?.messageId, type: data?.type, time: new Date(parseInt(data?.time)), sender: this.encodeHmsPeer(data?.sender), diff --git a/src/classes/HMSMessage.ts b/src/classes/HMSMessage.ts index 0bf36a912..eaf883a3a 100644 --- a/src/classes/HMSMessage.ts +++ b/src/classes/HMSMessage.ts @@ -3,8 +3,8 @@ import type { HMSMessageType } from './HMSMessageType'; import type { HMSPeer } from './HMSPeer'; export class HMSMessage { - // endpoint: string; public message: string; + public messageId: string; public type: HMSMessageType; public time: Date; public sender?: HMSPeer; @@ -12,12 +12,14 @@ export class HMSMessage { constructor(params: { message: string; + messageId: string; type: HMSMessageType; time: Date; sender?: HMSPeer; recipient: HMSMessageRecipient; }) { this.message = params.message; + this.messageId = params.messageId; this.type = params.type; this.time = params.time; this.sender = params.sender; diff --git a/src/classes/HMSSDK.tsx b/src/classes/HMSSDK.tsx index d476efc27..a2666663e 100644 --- a/src/classes/HMSSDK.tsx +++ b/src/classes/HMSSDK.tsx @@ -314,11 +314,14 @@ export class HMSSDK { type: type || null, id: this.id, }); - return await HMSManager.sendBroadcastMessage({ - message, - type: type || null, - id: this.id, - }); + const data: { messageId: string | undefined } = + await HMSManager.sendBroadcastMessage({ + message, + type: type || null, + id: this.id, + }); + + return data; }; /** @@ -340,12 +343,15 @@ export class HMSSDK { id: this.id, type: type || null, }); - return await HMSManager.sendGroupMessage({ - message, - roles: HMSHelper.getRoleNames(roles), - id: this.id, - type: type || null, - }); + const data: { messageId: string | undefined } = + await HMSManager.sendGroupMessage({ + message, + roles: HMSHelper.getRoleNames(roles), + id: this.id, + type: type || null, + }); + + return data; }; /** @@ -367,12 +373,15 @@ export class HMSSDK { id: this.id, type: type || null, }); - return await HMSManager.sendDirectMessage({ - message, - peerId: peer.peerID, - id: this.id, - type: type || null, - }); + const data: { messageId: string | undefined } = + await HMSManager.sendDirectMessage({ + message, + peerId: peer.peerID, + id: this.id, + type: type || null, + }); + + return data; }; /**