@cometchat/calls-sdk-react-native 4.4.1 → 5.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -19
- package/android/.gradle/8.9/checksums/checksums.lock +0 -0
- package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.9/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/build.gradle +13 -12
- package/android/src/main/AndroidManifest.xml +15 -6
- package/android/src/main/java/com/callingv5/AudioDeviceHandlerConnectionService.java +185 -0
- package/android/src/main/java/com/callingv5/AudioDeviceHandlerGeneric.java +254 -0
- package/android/src/main/java/com/{CometChatCalls → callingv5}/AudioModeModule.java +93 -56
- package/android/src/main/java/com/callingv5/ConnectionService.java +451 -0
- package/android/src/main/java/com/callingv5/KeepAwakeModule.java +53 -0
- package/android/src/main/java/com/callingv5/MyAppPackage.java +35 -0
- package/android/src/main/java/com/callingv5/RNConnectionService.java +244 -0
- package/android/src/main/java/com/callingv5/ToastModule.java +29 -0
- package/android/src/main/java/com/callingv5/utils/CometChatLogger.java +88 -0
- package/dist/index.d.mts +3940 -0
- package/dist/index.d.ts +3940 -9
- package/dist/index.js +10990 -127
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10959 -0
- package/dist/index.mjs.map +1 -0
- package/dist/polyfills/RTCPeerConnection.js +19 -0
- package/dist/polyfills/Storage.js +192 -0
- package/dist/polyfills/browser.js +337 -0
- package/dist/polyfills/index.js +1 -0
- package/dist/polyfills/ipv6utils.js +197 -0
- package/dist/polyfills/webrtc.js +11 -0
- package/package.json +18 -110
- package/LICENSE.md +0 -3
- package/android/src/main/java/com/CometChatCalls/AudioDeviceHandlerGeneric.java +0 -213
- package/android/src/main/java/com/CometChatCalls/AudioDeviceHandlerLegacy.java +0 -213
- package/android/src/main/java/com/CometChatCalls/BluetoothHeadsetMonitor.java +0 -187
- package/android/src/main/java/com/CometChatCalls/CallNotificationService.java +0 -93
- package/android/src/main/java/com/CometChatCalls/CallNotificationServiceModule.java +0 -48
- package/android/src/main/java/com/CometChatCalls/CometChatCallsPackage.java +0 -56
- package/android/src/main/java/com/CometChatCalls/CometChatCommonModule.java +0 -48
- package/android/src/main/java/com/CometChatCalls/PictureInPictureModule.java +0 -133
- package/android/src/main/res/drawable-mdpi/callingcomponent_icons_headphones_pluged.png +0 -0
- package/cometchat-calls-sdk-react-native.podspec +0 -21
- package/dist/CometChatErrorConstants.d.ts +0 -124
- package/dist/Constants.d.ts +0 -724
- package/dist/Helper copy.d.ts +0 -1
- package/dist/Helper.d.ts +0 -7
- package/dist/api/APIHandler.d.ts +0 -42
- package/dist/api/endpoints.d.ts +0 -7
- package/dist/api/helper.d.ts +0 -69
- package/dist/api/index.d.ts +0 -2
- package/dist/constants/CallConstants.d.ts +0 -136
- package/dist/constants/index.d.ts +0 -1
- package/dist/defaultCallsettings.d.ts +0 -2
- package/dist/models/CallAppSettings.d.ts +0 -42
- package/dist/models/CallGroup.d.ts +0 -14
- package/dist/models/CallLog.d.ts +0 -276
- package/dist/models/CallLogFilterParams.d.ts +0 -97
- package/dist/models/CallSettings.d.ts +0 -330
- package/dist/models/CallUser.d.ts +0 -14
- package/dist/models/CometChatCallLogs.d.ts +0 -193
- package/dist/models/CometChatCalls.d.ts +0 -110
- package/dist/models/CometChatCallsComponent.d.ts +0 -13
- package/dist/models/CometChatCallsComponentCore.d.ts +0 -18
- package/dist/models/CometChatCallsException.d.ts +0 -7
- package/dist/models/CometChatPresenterComponent.d.ts +0 -13
- package/dist/models/ErrorModel.d.ts +0 -11
- package/dist/models/Listner.d.ts +0 -69
- package/dist/models/ListnerHandler.d.ts +0 -10
- package/dist/models/MessageComponent.d.ts +0 -7
- package/dist/models/Participant.d.ts +0 -184
- package/dist/models/PresenterSettings.d.ts +0 -208
- package/dist/models/RTCUser.d.ts +0 -18
- package/dist/models/Recording.d.ts +0 -86
- package/dist/models/index.d.ts +0 -9
- package/dist/types/ICallAppSettings.d.ts +0 -6
- package/dist/types/ICallSettings.d.ts +0 -61
- package/dist/types/RTCUser.d.ts +0 -6
- package/dist/types/callEvents.d.ts +0 -54
- package/dist/types/common.d.ts +0 -18
- package/dist/types/index.d.ts +0 -2
- package/ios/AudioMode.h +0 -11
- package/ios/AudioMode.m +0 -418
- package/ios/CometChatCommonModule.h +0 -6
- package/ios/CometChatCommonModule.m +0 -29
- package/ios/JitsiAudioSession+Private.h +0 -25
- package/ios/JitsiAudioSession.h +0 -17
- package/ios/JitsiAudioSession.m +0 -34
- package/ios/LogUtils.h +0 -23
- package/ios/react-native-calls2.xcodeproj/project.pbxproj +0 -269
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["columnCount","rowCount","totalHorizontalGap","tileWidth","tileHeight","timeoutId: NodeJS.Timeout | null","layout","JitsiMeetJS","v","v","v","initialState: ConfigState","initialState","initialLocalParticipant: HumanParticipant","initialState: ParticipantsState","initialState","get","layout","initialState: ConferenceState","JitsiMeetJS","initialState","initialState: TracksState","initialState","get","track: Track","disposePromises: Promise<Result<unknown, Error>>[]","permissions","v","initialState: BaseState","initialState","get","layout","unsubscribeFunctions: (() => void)[]","initialState: ConnectionState","initialState","layout","constraints: Constraints","layout","videoSources","id: string","JitsiMeetJS","v","v","JitsiMeetJS","v","JitsiMeetJS","result: ReturnType<T>","JitsiMeetJS","release: () => void","reconnectTimeoutId: NodeJS.Timeout | null","JitsiMeetJS","initialState: TranslationState","enUS","initialState","result: unknown","v","CometChatEvent: MobileSDKEvents","NativeModules","EVENT_LISTENER_METHODS","constants","NativeModules","Platform","NativeEventEmitter","DeviceEventEmitter","subscriptions: any[]","AudioMode","AudioModeModule: AudioModeModuleInterface","NativeModules","NativeEventEmitter","KeepAwakeModule: KeepAwakeModuleInterface","NativeModules","permissions","StyleSheet","Avatar: React.FC<AvatarProps>","styles","View","Image","Text","StyleSheet","Icon: React.FC<IconProps>","Svg","Path","Animated","Modal","Pressable","styles","TouchableOpacity","Icon","Text","StyleSheet","styles","StyleSheet","MoreOptionButton: React.FC<MoreOptionButtonProps>","opts: { label: string; onPress: () => void; iconName?: IconName }[]","TouchableOpacity","styles","Icon","Icon","View","styles","Text","StyleSheet","VideoNative: React.FC<VideoNativeProps>","Animated","styles","RTCView","StyleSheet","React","StyleSheet","width","TouchableOpacity","styles","View","Avatar","Video","Label","MoreOptionButton","View","styles","Text","GroupAvatarTile: React.FC<GroupAvatarTileProps>","TouchableOpacity","Avatar","StyleSheet","React","View","styles","Tile","GroupAvatarTile","StyleSheet","Pan: React.FC<IPan>","layout","Animated","margin","PanResponder","styles","StyleSheet","spotlightParticipants: Participant[]","Tile","styles","StyleSheet","layout","FlatList","Tile","styles","StyleSheet","Animated","styles","ActivityIndicator","Text","StyleSheet","Animated","View","styles","Text","StyleSheet","layout","View","styles","TileLayout","SidebarLayout","RecordingIndicator","StyleSheet","Dimensions","styles","StyleSheet","Modal","Pressable","styles","View","Text","TouchableOpacity","Dimensions","BottomSheet: React.FC<BottomSheetProps>","Animated","TouchableWithoutFeedback","View","styles","ScrollView","StyleSheet","MenuItem: React.FC<MenuItemProps>","TouchableOpacity","styles","Icon","Text","StyleSheet","NativeModules","AudioModesMenu: React.FC<AudioModesMenuProps>","BottomSheet","ScrollView","Text","styles","MenuItem","StyleSheet","StyleSheet","AudioModeButton: React.FC","TouchableOpacity","Icon","AudioControl: React.FC","TouchableOpacity","Icon","VideoControl: React.FC","TouchableOpacity","Icon","LeaveSessionButton: React.FC","TouchableOpacity","Icon","MoreMenuButton: React.FC","TouchableOpacity","Icon","ControlPane: React.FC","View","AudioControl","VideoControl","AudioModeButton","MoreMenuButton","LeaveSessionButton","MenuItem","MoreMenu: React.FC<MoreMenuProps>","BottomSheet","ScrollView","Text","styles","ScreenShareButton","MenuItem","StyleSheet","FullScreenDialog: React.FC<FullScreenDialogProps>","Animated","styles","StyleSheet","styles","StyleSheet","ChangeLayout: React.FC","layout","TouchableOpacity","styles","Icon","TouchableOpacity","styles","Icon","View","Text","StyleSheet","TouchableOpacity","styles","Icon","StyleSheet","Text","styles","Header: React.FC","View","SwitchCamera","ChangeLayout","ChatButton","IdealTimeoutModal: React.FC<IdealTimeoutModalProps>","Animated","Modal","TouchableWithoutFeedback","styles","View","Text","TouchableOpacity","StyleSheet","View","styles","TouchableOpacity","Icon","Text","StyleSheet","QUALITY_COLOR_MAP: Record<number, string>","Icon","ParticipantItem: React.FC<ParticipantItemProps>","View","styles","Avatar","Text","Icon","ConnectionQualityIndicator","MoreOptionButton","Text","styles","ParticipantList: React.FC","View","TouchableOpacity","Icon","ShareInviteButton","TextInput","FlatList","ParticipantItem","StyleSheet","Tile","styles","StyleSheet","newToast: ToastItem","styles","Animated","Text","Pressable","View","Platform","AudioModeModule","PiPTile","View","styles","Header","CallStage","ControlPane","FullScreenDialog","ParticipantList","MoreMenu","AudioModesMenu","IdealTimeoutModal","StyleSheet","View","Text","StyleSheet","v5Props: Partial<ConfigStateMobile & ConfigStateBoth>","v","fetchOptions: RequestInit","v","React","listeners: (() => void)[]","InfoView","CallUI","falsyvalues: any","map: { [key: string]: string }","params: CallLogFilterParams","callLogList: CallLog[]","callLog: CallLog","React","View","Text","React","CometChatCalls","View","React","CometChatCalls","CometChatCallsComponent","callLogs: Array<CallLog>","v"],"sources":["../calls-sdk-core/event-manager/event-bus.ts","../calls-sdk-core/utils/constants.ts","../calls-sdk-core/utils/calculate-tile-layout.ts","../calls-sdk-core/utils/common.ts","../calls-sdk-core/utils/try-catch.ts","../calls-sdk-core/utils/debounce.ts","../calls-sdk-core/utils/session-methods-core.ts","../calls-sdk-core/handlers/track.ts","../calls-sdk-core/types/InternalSettingSchema.ts","../calls-sdk-core/types/sdk-events.ts","../calls-sdk-core/utils/send-participant-event.ts","../calls-sdk-core/store/config.ts","../calls-sdk-core/store/participants.ts","../calls-sdk-core/store/conference.ts","../calls-sdk-core/store/tracks.ts","../calls-sdk-core/utils/update-config.ts","../calls-sdk-core/store/base.ts","../calls-sdk-core/store/connection.ts","../calls-sdk-core/store/utils/hooks.ts","../calls-sdk-core/store/utils/switch-camera.ts","../calls-sdk-core/handlers/constraints.ts","../calls-sdk-core/event-listeners/conference-listener.ts","../calls-sdk-core/utils/schema/human-participant.ts","../calls-sdk-core/utils/schema/user-info-command.ts","../calls-sdk-core/handlers/conference.ts","../calls-sdk-core/handlers/connection.ts","../calls-sdk-core/utils/run-once-hof.ts","../calls-sdk-core/handlers/devices.ts","../calls-sdk-core/handlers/screen-share.ts","../calls-sdk-core/store/utils/reset.ts","../calls-sdk-core/utils/mutex.ts","../calls-sdk-core/handlers/init.ts","../calls-sdk-core/handlers/session.ts","../calls-sdk-core/event-listeners/onTrack.ts","../calls-sdk-core/i18n/translations/en-US.json","../calls-sdk-core/i18n/state.ts","../calls-sdk-core/i18n/hook.ts","../src/app-settings.ts","../src/native-communication/js-to-native.ts","../src/native-communication/native-to-js.native.ts","../src/native-communication/AudioModeModule.ts","../src/native-only/background.ts","../src/native-communication/KeepAwakeModule.ts","../src/native-only/keep-awake.ts","../src/native-only/permissions.ts","../src/ui/theme/style-variables.ts","../src/ui/avatar/Avatar.native.tsx","../src/ui/icon/icon-paths-24x24.ts","../src/ui/icon/Icon.native.tsx","../src/ui/shared/Popup.tsx","../src/ui/participants/participant-item/styles.ts","../src/ui/participants/participant-item/MoreOptionButton.tsx","../src/ui/shared/Label.native.tsx","../src/ui/video/Video.native.tsx","../src/ui/tile/Tile.native.tsx","../src/ui/layout/GroupAvatarTile.native.tsx","../src/ui/layout/SidebarLayout.native.tsx","../src/ui/pan/Pan.native.tsx","../src/ui/layout/Spotlight.native.tsx","../src/ui/layout/TileLayout.tsx","../src/ui/processing-overlay/ProcessingOverlay.native.tsx","../src/ui/recording-indicator/RecordingIndicator.native.tsx","../src/ui/CallStage.native.tsx","../src/ui/confirmation-dialog/confirmation-dialog-state.ts","../src/ui/confirmation-dialog/styles.ts","../src/ui/confirmation-dialog/ConfirmationDialog.tsx","../src/ui/bottom-sheet/BottomSheet.native.tsx","../src/ui/control-pane/MenuItem.native.tsx","../src/ui/control-pane/AudioModesMenu.native.tsx","../src/ui/control-pane/styles.native.tsx","../src/ui/control-pane/AudioModeButton.tsx","../src/ui/control-pane/controls/Audio.native.tsx","../src/ui/control-pane/controls/Video.native.tsx","../src/ui/control-pane/LeaveSessionButton.native.tsx","../src/ui/control-pane/MoreMenuButton.tsx","../src/ui/control-pane/ControlPane.native.tsx","../src/ui/control-pane/ScreenShareButton.tsx","../src/ui/control-pane/MoreMenu.native.tsx","../src/ui/full-screen-dialog/FullScreenDialog.native.tsx","../src/ui/header/styles.ts","../src/ui/header/ChangeLayout.tsx","../src/ui/header/ChatButton.tsx","../src/ui/header/SwitchCamera.tsx","../src/ui/header/Header.native.tsx","../src/ui/ideal-timeout/IdealTimeoutModal.native.tsx","../src/ui/shared/ShareInviteButton.native.tsx","../src/ui/participants/participant-item/ConnectionQualityIndicator.native.tsx","../src/ui/participants/participant-item/ParticipantItem.native.tsx","../src/ui/participants/ParticipantList.native.tsx","../src/ui/PiPTile.tsx","../src/ui/toast/styles.ts","../src/ui/toast/toast-state.ts","../src/ui/toast/Toast.native.tsx","../src/ui/index.native.tsx","../src/ui/InfoView.native.tsx","../src/v4/convert-props.ts","../src/http-request.ts","../src/verify-token.ts","../src/AppRN.tsx","../src/v4/Constants.ts","../src/v4/Helper.ts","../src/v4/models/Listner.ts","../src/v4/models/ListnerHandler.ts","../src/v4/models/CometChatCallsException.ts","../src/v4/models/CallAppSettings.ts","../src/v4/api/endpoints.ts","../src/v4/api/helper.ts","../src/v4/api/APIHandler.ts","../src/v4/CometChatErrorConstants.ts","../src/v4/models/CallGroup.ts","../src/v4/models/CallUser.ts","../src/v4/models/Participant.ts","../src/v4/models/Recording.ts","../src/v4/models/CallLog.ts","../src/v4/models/CallSettings.ts","../src/v4/models/CallLogFilterParams.ts","../src/v4/models/CometChatCallLogs.ts","../src/v4/models/MessageComponent.tsx","../src/v4/models/PresenterSettings.ts","../src/v4/models/CometChatCallsComponentCore.tsx","../src/v4/models/CometChatPresenterComponent.tsx","../src/v4/models/CometChatCalls.ts","../src/v4/models/RTCUser.ts","../src/v4/models/index.ts","../src/CometChatCalls.ts"],"sourcesContent":["import { type AllEvents } from '../types';\n\ntype EventBusAction<K extends keyof AllEvents = keyof AllEvents> =\n K extends keyof AllEvents\n ? AllEvents[K] extends () => void\n ? { type: K }\n : AllEvents[K] extends (payload: infer P) => void\n ? { type: K; payload: P }\n : never\n : never;\n\nclass EventBus {\n actionListenersMap: Map<keyof AllEvents, Array<AllEvents[keyof AllEvents]>>;\n emittingEvents: boolean = false;\n constructor() {\n this.actionListenersMap = new Map();\n }\n\n startEmitting() {\n this.emittingEvents = true;\n }\n\n stopEmitting() {\n this.emittingEvents = false;\n }\n\n publish<K extends keyof AllEvents>(\n action: EventBusAction<K>,\n forceEmit = false,\n ) {\n const isInternalEvent = action.type.startsWith('internal.');\n if (!this.emittingEvents && !forceEmit && !isInternalEvent) {\n return;\n }\n const listeners = this.actionListenersMap.get(action.type);\n if (!listeners) {\n return;\n }\n\n for (const listener of listeners) {\n if (typeof listener === 'function') {\n // Use type discrimination to call the listener correctly\n if ('payload' in action) {\n // We know this is a listener that expects a payload\n const payloadListener = listener as (\n payload: Parameters<AllEvents[K]>[0],\n ) => void;\n payloadListener(action.payload);\n } else {\n // We know this is a listener that expects no parameters\n const noPayloadListener = listener as () => void;\n noPayloadListener();\n }\n }\n }\n }\n\n // Subscribe to actions\n subscribe<K extends keyof AllEvents>(actionType: K, listener: AllEvents[K]) {\n if (!this.actionListenersMap.get(actionType)) {\n this.actionListenersMap.set(actionType, []);\n }\n this.actionListenersMap.get(actionType)?.push(listener);\n\n // Return an unsubscribe function\n return () => {\n const listenersList = this.actionListenersMap.get(actionType);\n if (listenersList) {\n this.actionListenersMap.set(\n actionType,\n listenersList.filter(l => l !== listener),\n );\n }\n };\n }\n}\n\n// Export a singleton instance\nexport const eventBus = new EventBus();\n","export const MIN_ASPECT_RATIO = 3 / 4;\nexport const MAX_ASPECT_RATIO = 16 / 9;\nexport const GRID_GAP = 8; // pixels between tiles\nexport const MIN_TILE_WIDTH = 240;\n\nexport const PARTICIPANT_ROLE = {\n MODERATOR: 'moderator',\n NONE: 'none',\n} as const;\n\nexport const MEDIA_TYPE = {\n AUDIO: 'audio',\n VIDEO: 'video',\n SCREENSHARE: 'screenshare',\n} as const;\n\nexport const LAYOUT = {\n TILE: 'TILE',\n SIDEBAR: 'SIDEBAR',\n SPOTLIGHT: 'SPOTLIGHT',\n} as const;\n\nexport const SESSION_TYPE = {\n VOICE: 'VOICE',\n VIDEO: 'VIDEO',\n} as const;\n\nexport const CAMERA_FACING = {\n FRONT: 'FRONT',\n REAR: 'REAR',\n} as const;\n\nexport const CAMERA_FACING_INTERNAL = {\n USER: 'user',\n ENVIRONMENT: 'environment',\n} as const;\n\nexport const VIDEO_PAUSE_AUTHORITY = {\n USER: 1 << 0,\n BACKGROUND: 1 << 1,\n SCREEN_SHARE: 1 << 2,\n};\n\nexport const CONFERENCE_COMMANDS = {\n userInfo: 'user-info',\n};\n\nexport const VIDEO_QUALITY_LEVELS = {\n ULTRA: 2160,\n HIGH: 720,\n STANDARD: 360,\n LOW: 180,\n NONE: 0,\n};\n\nexport const PLATFORM = {\n WEB: 'web',\n ANDROID: 'android',\n IOS: 'ios',\n} as const;\n\nexport const EVENT_LISTENER_METHODS = {\n SessionStatusListener: {\n onSessionJoined: 'onSessionJoined',\n onSessionLeft: 'onSessionLeft',\n onConnectionLost: 'onConnectionLost',\n onConnectionRestored: 'onConnectionRestored',\n onConnectionClosed: 'onConnectionClosed',\n onSessionTimedOut: 'onSessionTimedOut',\n },\n MediaEventsListener: {\n onAudioMuted: 'onAudioMuted',\n onAudioUnMuted: 'onAudioUnMuted',\n onVideoPaused: 'onVideoPaused',\n onVideoResumed: 'onVideoResumed',\n onRecordingStarted: 'onRecordingStarted',\n onRecordingStopped: 'onRecordingStopped',\n onScreenShareStarted: 'onScreenShareStarted',\n onScreenShareStopped: 'onScreenShareStopped',\n },\n ParticipantEventsListner: {\n onParticipantJoined: 'onParticipantJoined',\n onParticipantLeft: 'onParticipantLeft',\n onParticipantAudioMuted: 'onParticipantAudioMuted',\n onParticipantAudioUnmuted: 'onParticipantAudioUnmuted',\n onParticipantVideoPaused: 'onParticipantVideoPaused',\n onParticipantVideoResumed: 'onParticipantVideoResumed',\n onParticipantHandRaised: 'onParticipantHandRaised',\n onParticipantHandLowered: 'onParticipantHandLowered',\n onParticipantStartedScreenShare: 'onParticipantStartedScreenShare',\n onParticipantStoppedScreenShare: 'onParticipantStoppedScreenShare',\n onParticipantStartedRecording: 'onParticipantStartedRecording',\n onParticipantStoppedRecording: 'onParticipantStoppedRecording',\n onDominantSpeakerChanged: 'onDominantSpeakerChanged',\n onParticipantListChanged: 'onParticipantListChanged',\n },\n ButtonClickListener: {\n onLeaveSessionButtonClicked: 'onLeaveSessionButtonClicked',\n onRaiseHandButtonClicked: 'onRaiseHandButtonClicked',\n onShareInviteButtonClicked: 'onShareInviteButtonClicked',\n onChangeLayoutButtonClicked: 'onChangeLayoutButtonClicked',\n onParticipantListButtonClicked: 'onParticipantListButtonClicked',\n onToggleAudioButtonClicked: 'onToggleAudioButtonClicked',\n onToggleVideoButtonClicked: 'onToggleVideoButtonClicked',\n onRecordingToggleButtonClicked: 'onRecordingToggleButtonClicked',\n onScreenShareButtonClicked: 'onScreenShareButtonClicked',\n onChatButtonClicked: 'onChatButtonClicked',\n },\n CallLayoutListener: {\n onCallLayoutChanged: 'onCallLayoutChanged',\n onParticipantListVisible: 'onParticipantListVisible',\n onParticipantListHidden: 'onParticipantListHidden',\n },\n} as const;\n\nexport const EVENT_LISTENER_METHODS_WEB = {\n ...EVENT_LISTENER_METHODS,\n MediaEventsListener: {\n ...EVENT_LISTENER_METHODS.MediaEventsListener,\n onAudioInputDeviceChanged: 'onAudioInputDeviceChanged',\n onVideoInputDeviceChanged: 'onVideoInputDeviceChanged',\n onAudioOutputDeviceChanged: 'onAudioOutputDeviceChanged',\n onAudioInputDevicesChanged: 'onAudioInputDevicesChanged',\n onVideoInputDevicesChanged: 'onVideoInputDevicesChanged',\n onAudioOutputDevicesChanged: 'onAudioOutputDevicesChanged',\n },\n} as const;\n\nexport const EVENT_LISTENER_METHODS_MOBILE = {\n ...EVENT_LISTENER_METHODS,\n MediaEventsListener: {\n ...EVENT_LISTENER_METHODS.MediaEventsListener,\n onAudioModeChanged: 'onAudioModeChanged',\n onCameraFacingChanged: 'onCameraFacingChanged',\n },\n ButtonClickListener: {\n ...EVENT_LISTENER_METHODS.ButtonClickListener,\n onSwitchCameraButtonClicked: 'onSwitchCameraButtonClicked',\n },\n CallLayoutListener: {\n ...EVENT_LISTENER_METHODS.CallLayoutListener,\n onPictureInPictureLayoutEnabled: 'onPictureInPictureLayoutEnabled',\n onPictureInPictureLayoutDisabled: 'onPictureInPictureLayoutDisabled',\n },\n} as const;\n\nexport const INTERNAL_EVENTS = {\n connectionWillClose: 'internal.sessionWillClose',\n onConnectionEstablished: 'internal.onConnectionEstablished',\n onSessionJoined: 'internal.onSessionJoined',\n notification: 'internal.notification',\n queryPermission: 'internal.queryPermission',\n lifecycle: {\n componentDidMount: 'internal.componentDidMount',\n componentWillUnmount: 'internal.componentWillUnmount',\n SDKInitialized: 'internal.SDKInitialized',\n },\n} as const;\n","import {\n GRID_GAP,\n MAX_ASPECT_RATIO,\n MIN_ASPECT_RATIO,\n MIN_TILE_WIDTH,\n} from './constants';\n\nexport interface TileLayout {\n rows: number;\n columns: number;\n tileWidth: number;\n tileHeight: number;\n paddingVertical: number;\n allocatedWidth: number;\n allocatedHeight: number;\n}\n\n/**\n * Calculates the optimal tile layout for a container\n * @param containerWidth - Width of the container\n * @param containerHeight - Height of the container\n * @param numberOfTiles - Total number of tiles to arrange\n * @returns TileLayout object containing rows, columns, and tile dimensions\n * @throws Error if input parameters are invalid\n */\nexport function calculateTileLayout(\n containerWidth: number,\n containerHeight: number,\n numberOfTiles: number,\n): TileLayout {\n // Input validation\n if (containerWidth <= 0 || containerHeight <= 0 || numberOfTiles <= 0) {\n throw new Error(\n 'Container dimensions and number of tiles must be positive',\n );\n }\n\n const totalArea = containerWidth * containerHeight;\n const tileArea = totalArea / numberOfTiles;\n const minArea = MIN_TILE_WIDTH * MIN_TILE_WIDTH * MIN_ASPECT_RATIO;\n if (tileArea < minArea) {\n const columnCount = Math.floor(containerWidth / MIN_TILE_WIDTH);\n const rowCount = Math.ceil(numberOfTiles / columnCount);\n const totalHorizontalGap = columnCount * GRID_GAP;\n const tileWidth = (containerWidth - totalHorizontalGap) / columnCount;\n const tileHeight = tileWidth * MIN_ASPECT_RATIO;\n\n return {\n rows: rowCount,\n columns: columnCount,\n tileWidth,\n tileHeight,\n paddingVertical: 0,\n allocatedWidth: containerWidth,\n allocatedHeight: containerHeight,\n };\n }\n\n // Initial grid calculation\n const squareRoot = Math.sqrt(numberOfTiles);\n let rowCount = Math.floor(squareRoot);\n let columnCount = Math.ceil(numberOfTiles / rowCount);\n\n // Adjust grid based on aspect ratio constraints\n let currentAspectRatio = getCalculatedAspectRatio(\n containerWidth,\n containerHeight,\n columnCount,\n rowCount,\n );\n\n // Optimize for tall containers\n if (currentAspectRatio < MIN_ASPECT_RATIO) {\n while (currentAspectRatio < MIN_ASPECT_RATIO && columnCount > 1) {\n columnCount--;\n rowCount = Math.ceil(numberOfTiles / columnCount);\n currentAspectRatio = getCalculatedAspectRatio(\n containerWidth,\n containerHeight,\n columnCount,\n rowCount,\n );\n }\n }\n // Optimize for wide containers\n else {\n while (\n currentAspectRatio > MAX_ASPECT_RATIO &&\n columnCount < numberOfTiles\n ) {\n columnCount++;\n rowCount = Math.ceil(numberOfTiles / columnCount);\n currentAspectRatio = getCalculatedAspectRatio(\n containerWidth,\n containerHeight,\n columnCount,\n rowCount,\n );\n }\n }\n\n // Optimize column count if possible\n const potentialRowCount = Math.ceil(numberOfTiles / (columnCount - 1));\n if (potentialRowCount === rowCount) {\n columnCount--;\n }\n\n // Calculate tile dimensions\n const totalHorizontalGap = columnCount * GRID_GAP;\n const totalVerticalGap = rowCount * GRID_GAP;\n\n let tileWidth = (containerWidth - totalHorizontalGap) / columnCount;\n let tileHeight = (containerHeight - totalVerticalGap) / rowCount;\n let paddingVertical = 0;\n\n // Adjust tile dimensions to maintain aspect ratio\n const tileAspectRatio = tileWidth / tileHeight;\n if (tileAspectRatio < 9 / 16) {\n // For extremely tall tiles\n paddingVertical =\n ((tileHeight - tileWidth * MAX_ASPECT_RATIO) * rowCount) / 2;\n tileHeight = tileWidth * MAX_ASPECT_RATIO;\n } else if (tileAspectRatio > MAX_ASPECT_RATIO) {\n // For extremely wide tiles\n tileWidth = tileHeight * MAX_ASPECT_RATIO;\n }\n\n // Calculate effective dimensions including gaps\n const allocatedWidth = tileWidth * columnCount + totalHorizontalGap;\n const allocatedHeight = tileHeight * rowCount + totalVerticalGap;\n\n return {\n rows: rowCount,\n columns: columnCount,\n tileWidth,\n tileHeight,\n paddingVertical,\n allocatedWidth,\n allocatedHeight,\n };\n}\n\nfunction getCalculatedAspectRatio(\n containerWidth: number,\n containerHeight: number,\n columnCount: number,\n rowCount: number,\n): number {\n const totalHorizontalGap = columnCount * GRID_GAP;\n const totalVerticalGap = rowCount * GRID_GAP;\n const calculatedTileWidth =\n (containerWidth - totalHorizontalGap) / columnCount;\n const calculatedTileHeight = (containerHeight - totalVerticalGap) / rowCount;\n return calculatedTileWidth / calculatedTileHeight;\n}\n","import { shallow } from 'zustand/shallow';\nimport { type MediaType } from '../types';\nimport { MEDIA_TYPE } from './constants';\n\nexport const getAvatarTextInitials = (fullName: string) =>\n fullName\n .split(' ')\n .map(n => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n\nexport const miliSecondsToMMSS = (ms: number) => {\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n const paddedMinutes = minutes.toString().padStart(2, '0');\n const paddedSeconds = seconds.toString().padStart(2, '0');\n\n if (hours > 0) {\n const paddedHours = hours.toString().padStart(2, '0');\n return `${paddedHours}:${paddedMinutes}:${paddedSeconds}`;\n }\n\n return `${paddedMinutes}:${paddedSeconds}`;\n};\n\nexport function getHueFromName(name: string): number {\n let hash = 0;\n\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n // Convert hash to 0–360 range\n const hue = Math.abs(hash) % 360;\n return hue;\n}\n\nfunction hsvToRgb(h: number, s: number, v: number) {\n s /= 100;\n v /= 100;\n\n let c = v * s;\n let x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n let m = v - c;\n\n let r = 0,\n g = 0,\n b = 0;\n\n if (h >= 0 && h < 60) {\n [r, g, b] = [c, x, 0];\n } else if (h >= 60 && h < 120) {\n [r, g, b] = [x, c, 0];\n } else if (h >= 120 && h < 180) {\n [r, g, b] = [0, c, x];\n } else if (h >= 180 && h < 240) {\n [r, g, b] = [0, x, c];\n } else if (h >= 240 && h < 300) {\n [r, g, b] = [x, 0, c];\n } else if (h >= 300 && h < 360) {\n [r, g, b] = [c, 0, x];\n }\n\n return `rgb(${Math.round((r + m) * 255)}, ${Math.round((g + m) * 255)}, ${Math.round((b + m) * 255)})`;\n}\n\nexport function getColorFromName(name: string): string {\n const hue = getHueFromName(name);\n return hsvToRgb(hue, 45, 35);\n}\n\nexport function safeParseJson<T>(jsonString: string): T | null {\n try {\n return JSON.parse(jsonString) as T;\n } catch (error) {\n console.error('Failed to parse JSON:', error);\n return null;\n }\n}\n\nexport const getMediaType = (track: any): MediaType => {\n if (track.getType() === 'audio') {\n return MEDIA_TYPE.AUDIO;\n }\n if (track.getVideoType() === 'desktop') {\n return MEDIA_TYPE.SCREENSHARE;\n }\n return MEDIA_TYPE.VIDEO;\n};\n\nexport function differenceBy<T, U>(\n array: T[],\n values: U[],\n iteratee: (value: T | U) => any,\n): T[] {\n const valuesToExclude = new Set(values.map(iteratee));\n return array.filter(item => !valuesToExclude.has(iteratee(item)));\n}\n\nexport function sleep(ms: number = 1000): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport function isArrayOfObjEqual(arr1: any[], arr2: any[]): boolean {\n if (arr1.length !== arr2.length) {\n return false;\n }\n\n for (let i = 0; i < arr1.length; i++) {\n if (!shallow(arr1[i], arr2[i])) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function isDeviceEqual(\n device1: MediaDeviceInfo | undefined,\n device2: MediaDeviceInfo | undefined,\n) {\n return (\n device1?.deviceId === device2?.deviceId && device1?.label === device2?.label\n );\n}\n\nexport function getDefaultDevice<T extends MediaDeviceInfo>(devices: T[]) {\n return devices.find(device => device.deviceId === 'default') || devices[0];\n}\n","// Types for the result object with discriminated union\ntype Success<T> = {\n data: T;\n error: null;\n};\n\ntype Failure<E> = {\n data: null;\n error: E;\n};\n\ntype Result<T, E = Error> = Success<T> | Failure<E>;\n\n// Main wrapper function\nexport async function tryCatch<T, E = Error>(\n promise: Promise<T>,\n): Promise<Result<T, E>> {\n try {\n const data = await promise;\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as E };\n }\n}\n\nexport function tryCatchSync<T, E = Error>(fn: () => T): Result<T, E> {\n try {\n const data = fn();\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as E };\n }\n}\n","import { tryCatchSync } from './try-catch';\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number,\n): (...args: Parameters<T>) => void {\n let timeoutId: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n tryCatchSync(() => func(...args));\n }, delay);\n };\n}\n","import {\n leaveSession,\n muteParticipant,\n pauseParticipantVideo,\n startScreenSharing,\n stopScreenSharing,\n} from '../handlers';\nimport {\n disablePictureInPictureLayout,\n enablePictureInPictureLayout,\n lowerHandLocal,\n muteAudioTrack,\n type Participant,\n pauseVideoTrack,\n pinParticipant,\n raisedHandLocal,\n resumeVideoTrack,\n setChatButtonUnreadCount,\n setLayout,\n switchCamera,\n unMuteAudioTrack,\n unpinParticipant,\n} from '../store';\nimport { type Layout } from '../types';\n\nexport class SessionMethodsCore {\n public static muteAudio() {\n muteAudioTrack();\n }\n\n public static unmuteAudio() {\n unMuteAudioTrack();\n }\n\n public static pauseVideo() {\n pauseVideoTrack();\n }\n\n public static resumeVideo() {\n resumeVideoTrack();\n }\n\n public static leaveSession() {\n leaveSession();\n }\n\n public static startScreenSharing() {\n startScreenSharing();\n }\n\n public static stopScreenSharing() {\n stopScreenSharing();\n }\n\n public static raiseHand() {\n raisedHandLocal();\n }\n\n public static lowerHand() {\n lowerHandLocal();\n }\n\n public static switchCamera() {\n switchCamera();\n }\n\n public static setLayout(layout: Layout) {\n setLayout(layout);\n }\n\n public static startRecording() {\n // Method yet to be implemented\n }\n\n public static stopRecording() {\n // Method yet to be implemented\n }\n\n public static enablePictureInPictureLayout() {\n enablePictureInPictureLayout();\n }\n\n public static disablePictureInPictureLayout() {\n disablePictureInPictureLayout();\n }\n\n public static pinParticipant(\n participantId: string,\n type: Participant['type'],\n ) {\n pinParticipant(participantId, type);\n }\n\n public static unpinParticipant() {\n unpinParticipant();\n }\n\n public static muteParticipant(participantId: string) {\n muteParticipant(participantId);\n }\n\n public static pauseParticipantVideo(participantId: string) {\n pauseParticipantVideo(participantId);\n }\n\n public static setChatButtonUnreadCount(count: number) {\n setChatButtonUnreadCount(count);\n }\n\n // Legacy Methods\n\n /**\n * @deprecated use startScreenSharing() instead\n */\n public static startScreenShare() {\n this.startScreenSharing();\n }\n\n /**\n * @deprecated use stopScreenSharing() instead\n */\n public static stopScreenShare() {\n this.stopScreenSharing();\n }\n\n // /**\n // * @deprecated use setLayout() instead\n // */\n // public static setMode(\n // mode: (typeof CallConstants.MODE)[keyof typeof CallConstants.MODE],\n // ) {\n // const layout = mode === 'DEFAULT' ? 'SIDEBAR' : mode;\n // this.setLayout(layout);\n // }\n\n /**\n * @deprecated switchToVideoCall is deprecated and not supported\n */\n public static switchToVideoCall() {\n console.error('switchToVideoCall method deprecated and not supported.');\n }\n\n /**\n * @deprecated use leaveSession() instead\n */\n public static endSession() {\n this.leaveSession();\n }\n\n /**\n * Retrieves call details for a given session ID and auth token.\n * @param sessionID - The session ID of the call.\n * @param authToken - The authentication token required to make the API call.\n * @returns A Promise that resolves to a CallLog object containing the call details.\n * @throws {CometChatCallsException} If there is an error retrieving the call details.\n * @deprecated This method is deprecated and not supported.\n */\n public static getCallDetails(_sessionID: string, _authToken: string) {\n throw new Error('This method is deprecated and not supported.');\n }\n}\n","import { onTrack } from '../event-listeners/onTrack';\nimport { eventBus } from '../event-manager';\nimport JitsiMeetJS from '../lib-jitsi-meet';\nimport {\n type AudioInputDevice,\n getLocalTrack,\n muteAudioTrack,\n pauseVideoTrack,\n useBaseStore,\n useConferenceStore,\n useConfigStore,\n type VideoInputDevice,\n} from '../store';\nimport type { CameraFacingInternal, ITrackOptions } from '../types';\nimport {\n CAMERA_FACING_INTERNAL,\n INTERNAL_EVENTS,\n MEDIA_TYPE,\n tryCatch,\n} from '../utils';\n\n/**\n * Gets the real device ID for a 'default' device by matching groupId.\n * This is needed because of a Chrome bug where passing 'default' to getUserMedia\n * doesn't return the correct MediaStreamTrack.\n * @see https://bugs.chromium.org/p/chromium/issues/detail?id=997689\n */\nfunction getRealDeviceId(\n deviceId: string | null,\n type: 'audio' | 'video',\n): string | null {\n if (deviceId !== 'default') {\n return deviceId;\n }\n\n const devices =\n type === 'audio'\n ? useBaseStore.getState().audioInputDevices\n : useBaseStore.getState().videoInputDevices;\n\n const defaultDevice = devices.find(d => d.deviceId === 'default');\n if (!defaultDevice) {\n return deviceId;\n }\n\n // Find the device with a matching groupId that isn't the 'default' device\n const matchingDevice = devices.find(\n d => d.deviceId !== 'default' && d.groupId === defaultDevice.groupId,\n );\n\n return matchingDevice?.deviceId ?? deviceId;\n}\n\nexport async function createLocalTrackF(\n type: 'audio' | 'video',\n deviceId: string | null = null,\n timeout: number | null = null,\n additionalOptions: ITrackOptions = {},\n) {\n const iAmRecorder = useConfigStore.getState().iAmRecorder;\n if (iAmRecorder) {\n return;\n }\n const { data: tracks, error } = await tryCatch<any>(\n JitsiMeetJS.createLocalTracks({\n devices: [type],\n cameraDeviceId: deviceId,\n micDeviceId: deviceId,\n timeout: timeout,\n ...additionalOptions,\n }),\n );\n if (error) {\n throw error;\n }\n return tracks[0];\n}\n\nexport async function createLocalTrack(\n type: 'audio' | 'video',\n deviceId: string | null = null,\n cameraFacing: CameraFacingInternal = CAMERA_FACING_INTERNAL.USER,\n) {\n const isMobile = useBaseStore.getState().isMobile();\n const effectiveDeviceId = isMobile ? null : deviceId;\n\n // When 'default' is selected, pass the real device ID to getUserMedia\n // to work around Chrome bug: https://bugs.chromium.org/p/chromium/issues/detail?id=997689\n const realDeviceId = getRealDeviceId(effectiveDeviceId, type);\n\n const { data: track, error } = await tryCatch<any>(\n createLocalTrackF(type, realDeviceId, null, {\n facingMode: cameraFacing,\n }),\n );\n if (track) {\n if (effectiveDeviceId === 'default') {\n track._realDeviceId = track.deviceId = 'default';\n }\n onTrack(track);\n } else {\n if (type === 'video') {\n pauseVideoTrack();\n } else if (type === 'audio') {\n muteAudioTrack();\n }\n if (error instanceof Error) {\n if (error.name === 'gum.permission_denied') {\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'error',\n message: `Permission denied for ${type} track. Please allow access to your device.`,\n },\n });\n }\n }\n }\n}\n\nexport function updateAudioInputDevice(deviceId: string) {\n const audioInputDevices = useBaseStore\n .getState()\n .audioInputDevices.filter(device => device.deviceId !== '');\n if (audioInputDevices.length > 0) {\n createLocalTrack('audio', deviceId);\n }\n}\n\n// TODO: Maybe move this function to web only.\nexport function updateAudioInputDeviceState(\n device?: AudioInputDevice,\n skipSubscribe = false,\n) {\n const isMobileSDK = useBaseStore.getState().isMobileSDK();\n if (isMobileSDK) {\n return;\n }\n if (device) {\n useBaseStore.setState({\n audioInputDevice: device\n ? { ...device.toJSON(), skipSubscribe }\n : undefined,\n });\n }\n}\n\nexport async function updateVideoInputDevice(\n deviceId: string | null,\n cameraFacing?: CameraFacingInternal,\n) {\n const videoInputDevices = useBaseStore\n .getState()\n .videoInputDevices.filter(device => device.deviceId !== '');\n if (videoInputDevices.length > 0) {\n createLocalTrack('video', deviceId, cameraFacing);\n } else if (deviceId === null) {\n const videoTrack = getLocalTrack(MEDIA_TYPE.VIDEO)?.originalTrack;\n if (videoTrack) {\n await videoTrack.dispose();\n const conference = useConferenceStore.getState().conference;\n if (conference) {\n conference.replaceTrack(videoTrack, null);\n }\n }\n createLocalTrack('video', deviceId, cameraFacing);\n }\n}\n\n// TODO: Maybe move this function to web only.\nexport function updateVideoInputDeviceState(\n device?: VideoInputDevice,\n skipSubscribe = false,\n) {\n const isMobileSDK = useBaseStore.getState().isMobileSDK();\n if (isMobileSDK) {\n return;\n }\n if (device) {\n const deviceJson = device.toJSON ? device.toJSON() : device;\n useBaseStore.setState({\n videoInputDevice: { ...deviceJson, skipSubscribe },\n });\n }\n}\n\nexport function updateAudioOutputDevice(deviceId: string) {\n if (!JitsiMeetJS.mediaDevices.isDeviceChangeAvailable('output')) {\n console.warn('Adjusting audio output is not supported');\n return;\n }\n JitsiMeetJS.mediaDevices.setAudioOutputDevice(deviceId).then(() => {\n const audioOutputDevices = useBaseStore.getState().audioOutputDevices;\n const device = audioOutputDevices.find(d => d.deviceId === deviceId);\n if (device) {\n useBaseStore.setState({\n audioOutputDevice: device,\n });\n }\n });\n}\n","import * as v from 'valibot';\n\n// Video bitrates schema\nconst MaxBitratesVideoSchema = v.object({\n low: v.optional(v.number()),\n standard: v.optional(v.number()),\n high: v.optional(v.number()),\n fullHd: v.optional(v.number()),\n ultraHd: v.optional(v.number()),\n ssHigh: v.optional(v.number()),\n});\n\n// Codec config schema\nconst CodecConfigSchema = v.object({\n maxBitratesVideo: v.optional(MaxBitratesVideoSchema),\n scalabilityModeEnabled: v.optional(v.boolean()),\n useSimulcast: v.optional(v.boolean()),\n useKSVC: v.optional(v.boolean()),\n});\n\n// Video quality schema\nconst VideoQualitySchema = v.object({\n codecPreferenceOrder: v.optional(v.array(v.string())),\n screenshareCodec: v.optional(v.string()),\n mobileScreenshareCodec: v.optional(v.string()),\n enableAdaptiveMode: v.optional(v.boolean()),\n av1: v.optional(CodecConfigSchema),\n h264: v.optional(CodecConfigSchema),\n vp8: v.optional(CodecConfigSchema),\n vp9: v.optional(CodecConfigSchema),\n minHeightForQualityLvl: v.optional(v.record(v.string(), v.string())),\n mobileCodecPreferenceOrder: v.optional(v.array(v.string())),\n});\n\n// User schema\nconst UserSchema = v.object({\n uid: v.string(),\n name: v.string(),\n avatar: v.optional(v.string()),\n status: v.optional(v.string()),\n role: v.optional(v.string()),\n lastActiveAt: v.optional(v.number()),\n});\n\n// Settings schema\nconst SettingsSchema = v.object({\n WEBRTC_HOST: v.optional(v.string()),\n ANALYTICS_HOST: v.optional(v.string()),\n ANALYTICS_VERSION: v.optional(v.string()),\n PRESENTER_MODE_ENABLED: v.optional(v.boolean()),\n connectionConfig: v.object({\n audioQuality: v.optional(\n v.object({\n stereo: v.optional(v.boolean()),\n }),\n ),\n\n bridgeChannel: v.optional(\n v.object({\n preferSctp: v.optional(v.boolean()),\n }),\n ),\n constraints: v.optional(\n v.object({\n video: v.optional(\n v.object({\n height: v.optional(\n v.object({\n ideal: v.optional(v.number()),\n max: v.optional(v.number()),\n min: v.optional(v.number()),\n }),\n ),\n width: v.optional(\n v.object({\n ideal: v.optional(v.number()),\n max: v.optional(v.number()),\n min: v.optional(v.number()),\n }),\n ),\n }),\n ),\n }),\n ),\n e2ee: v.optional(v.array(v.unknown())),\n e2eping: v.optional(\n v.object({\n enabled: v.optional(v.boolean()),\n }),\n ),\n flags: v.optional(\n v.object({\n receiveMultipleVideoStreams: v.optional(v.boolean()),\n sendMultipleVideoStreams: v.optional(v.boolean()),\n sourceNameSignaling: v.optional(v.boolean()),\n ssrcRewritingEnabled: v.optional(v.boolean()),\n }),\n ),\n hosts: v.object({\n domain: v.optional(v.string()),\n muc: v.optional(v.string()),\n }),\n hiddenDomain: v.optional(v.string()),\n bosh: v.optional(v.string()),\n websocket: v.optional(v.string()),\n serviceUrl: v.string(),\n p2p: v.object({\n enabled: v.boolean(),\n }),\n resolution: v.optional(v.number()),\n videoQuality: v.optional(VideoQualitySchema),\n }),\n});\n\n// Root schema\nexport const InternalSettingSchema = v.object({\n callToken: v.string(),\n settings: SettingsSchema,\n sessionId: v.string(),\n user: UserSchema,\n});\n\n// Inferred TypeScript type\nexport type InternalSetting = v.InferOutput<typeof InternalSettingSchema>;\n","import * as v from 'valibot';\nimport { EVENT_LISTENER_METHODS, INTERNAL_EVENTS } from '../utils';\nimport type {\n AudioMode,\n CameraFacing,\n Layout,\n NotificationType,\n ValueOf,\n} from './common';\nimport type { UnionToArray } from './union-to-array';\n\n// TODO: Add more properties later, ensure these are same across all platforms\nexport const ParticipantSchema = v.object({\n pid: v.string(),\n name: v.string(),\n uid: v.string(),\n // audioMuted: v.boolean(),\n // videoPaused: v.boolean(),\n avatar: v.optional(v.string()),\n});\n\ntype Participant = v.InferOutput<typeof ParticipantSchema>;\n\ntype _SDKEvents = {\n [k in ValueOf<\n typeof EVENT_LISTENER_METHODS.SessionStatusListener\n >]: () => void;\n} & {\n [k in ValueOf<typeof EVENT_LISTENER_METHODS.MediaEventsListener>]: () => void;\n} & {\n [k in ValueOf<typeof EVENT_LISTENER_METHODS.ParticipantEventsListner>]: (\n payload: Participant,\n ) => void;\n} & {\n [k in ValueOf<typeof EVENT_LISTENER_METHODS.ButtonClickListener>]: () => void;\n};\n\nexport type SDKEvents = Omit<_SDKEvents, 'onParticipantListChanged'> & {\n onCallLayoutChanged: (payload: Layout) => void;\n onParticipantListVisible: () => void;\n onParticipantListHidden: () => void;\n onParticipantListChanged: (payload: Participant[]) => void;\n};\n\nexport type MobileSDKEvents = SDKEvents & {\n onAudioModeChanged: (payload: AudioMode['type']) => void; // TODO: TEST\n onCameraFacingChanged: (payload: CameraFacing) => void; // TODO: TEST iOS\n onSwitchCameraButtonClicked: () => void;\n onPictureInPictureLayoutEnabled: () => void;\n onPictureInPictureLayoutDisabled: () => void;\n};\n\nexport type WebSDKEvents = SDKEvents & {\n onAudioInputDeviceChanged: (device: MediaDeviceInfo) => void;\n onVideoInputDeviceChanged: (device: MediaDeviceInfo) => void;\n onAudioOutputDeviceChanged: (device: MediaDeviceInfo) => void;\n onAudioInputDevicesChanged: (device: MediaDeviceInfo[]) => void;\n onVideoInputDevicesChanged: (device: MediaDeviceInfo[]) => void;\n onAudioOutputDevicesChanged: (device: MediaDeviceInfo[]) => void;\n};\n\nexport type InternalEvents = {\n [INTERNAL_EVENTS.onConnectionEstablished]: () => void;\n [INTERNAL_EVENTS.connectionWillClose]: () => void;\n [INTERNAL_EVENTS.notification]: (payload: {\n message: string;\n type: NotificationType;\n duration?: number;\n position?: 'top' | 'bottom';\n action?: { label: string; onPress: () => void };\n }) => void;\n [INTERNAL_EVENTS.lifecycle.componentDidMount]: () => void;\n [INTERNAL_EVENTS.lifecycle.componentWillUnmount]: () => void;\n [INTERNAL_EVENTS.onSessionJoined]: () => void;\n [INTERNAL_EVENTS.lifecycle.SDKInitialized]: () => void;\n [INTERNAL_EVENTS.queryPermission]: () => void;\n};\n\ntype AllSDKEvents = MobileSDKEvents & WebSDKEvents;\n\nexport type AllEvents = AllSDKEvents & InternalEvents;\n\ntype _NativeListenerActions = {\n [K in keyof AllSDKEvents]: {\n type: K;\n } & (Parameters<AllSDKEvents[K]>[0] extends undefined\n ? {}\n : { payload: Parameters<AllSDKEvents[K]>[0] });\n};\n\nexport type NativeListenerActions = UnionToArray<\n _NativeListenerActions[keyof _NativeListenerActions]\n>;\n","import * as v from 'valibot';\nimport { eventBus } from '../event-manager';\nimport { useParticipantStore } from '../store';\nimport { ParticipantSchema, type ValueOf } from '../types';\nimport { EVENT_LISTENER_METHODS } from './constants';\n\ntype SendParticipantEventType = Exclude<\n ValueOf<typeof EVENT_LISTENER_METHODS.ParticipantEventsListner>,\n 'onParticipantListChanged'\n>;\n\nexport function sendParticipantEvent(\n type: SendParticipantEventType,\n participantId: string,\n) {\n const participant = useParticipantStore\n .getState()\n .getParticipantById(participantId);\n if (participant) {\n const validatedParticipant = v.safeParse(ParticipantSchema, participant);\n if (validatedParticipant.success) {\n eventBus.publish({\n type,\n payload: validatedParticipant.output,\n });\n }\n }\n}\n\nexport function sendParticipantListChangedEvent() {\n const participants = useParticipantStore.getState().participants;\n const validatedParticipants = v.safeParse(\n v.array(ParticipantSchema),\n participants,\n );\n if (validatedParticipants.success) {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantListChanged,\n payload: validatedParticipants.output,\n });\n }\n}\n","import { create } from 'zustand';\nimport { combine, subscribeWithSelector } from 'zustand/middleware';\nimport type { AudioMode, CameraFacing, Layout, SessionType } from '../types';\nimport { LAYOUT } from '../utils';\n\nexport type ConfigStateInternal = {\n devSessionId: string;\n internalSettings?: string;\n sessionId?: string;\n iAmRecorder: boolean;\n showFrameRate: boolean;\n};\n\nexport type ConfigStateMobile = {\n audioMode?: AudioMode['type'];\n hideAudioModeButton: boolean;\n};\n\nexport type ConfigStateWeb = {\n enableNoiseReduction: boolean;\n audioInputDeviceId?: string;\n audioOutputDeviceId?: string;\n videoInputDeviceId?: string;\n hideVirtualBackgroundButton: boolean;\n};\n\nexport type ConfigStateBoth = {\n sessionType: SessionType;\n layout: Layout;\n initialCameraFacing?: CameraFacing;\n autoStartRecording: boolean;\n hideRecordingButton: boolean;\n hideControlPanel: boolean;\n hideLeaveSessionButton: boolean;\n hideHeaderPanel: boolean;\n hideRaiseHandButton: boolean;\n hideShareInviteButton: boolean;\n hideChangeLayoutButton: boolean;\n hideToggleAudioButton: boolean;\n hideToggleVideoButton: boolean;\n hideParticipantListButton: boolean;\n hideSwitchLayoutButton: boolean;\n hideChatButton: boolean;\n hideScreenSharingButton: boolean;\n hideSessionTimer: boolean;\n hideNetworkIndicator: boolean;\n hideRecordingStatusIndicator: boolean;\n hideSwitchCameraButton: boolean;\n enableParticipantContextMenu: boolean;\n // lowBandwidthMode: boolean;\n displayName: string;\n startAudioMuted: boolean;\n startVideoPaused: boolean;\n title: string;\n idleTimeoutPeriodBeforePrompt: number;\n idleTimeoutPeriodAfterPrompt: number;\n enableSpotlightDrag: boolean;\n enableSpotlightSwap: boolean;\n};\n\nexport type ConfigState = ConfigStateInternal &\n ConfigStateMobile &\n ConfigStateWeb &\n ConfigStateBoth;\n\ntype Actions = {\n reset: () => void;\n};\n\nconst initialState: ConfigState = {\n sessionType: 'VIDEO',\n autoStartRecording: false,\n layout: LAYOUT.TILE,\n hideRecordingButton: true,\n hideVirtualBackgroundButton: false,\n hideAudioModeButton: false,\n hideSwitchCameraButton: false,\n devSessionId: 'dev-session',\n iAmRecorder: false,\n hideControlPanel: false,\n hideHeaderPanel: false,\n hideRaiseHandButton: false,\n hideShareInviteButton: true,\n hideChangeLayoutButton: false,\n hideLeaveSessionButton: false,\n hideToggleAudioButton: false,\n hideParticipantListButton: false,\n hideSwitchLayoutButton: false,\n hideChatButton: true,\n hideToggleVideoButton: false,\n hideScreenSharingButton: false,\n hideSessionTimer: false,\n hideNetworkIndicator: true,\n hideRecordingStatusIndicator: false,\n enableParticipantContextMenu: true,\n // lowBandwidthMode: false,\n displayName: '',\n startAudioMuted: false,\n startVideoPaused: false,\n title: '',\n enableNoiseReduction: false,\n idleTimeoutPeriodBeforePrompt: 60000,\n idleTimeoutPeriodAfterPrompt: 180000,\n enableSpotlightDrag: true,\n enableSpotlightSwap: true,\n showFrameRate: false,\n};\n\nexport const useConfigStore = create<ConfigState & Actions>()(\n subscribeWithSelector(\n combine(initialState, set => ({\n reset: () => set(initialState),\n })),\n ),\n);\n\nexport const setConfig = (config: Partial<ConfigState>) => {\n useConfigStore.setState(config);\n};\n","import { useMemo } from 'react';\nimport { create } from 'zustand';\nimport { combine, subscribeWithSelector } from 'zustand/middleware';\nimport { eventBus } from '../event-manager/event-bus';\nimport {\n differenceBy,\n EVENT_LISTENER_METHODS,\n isArrayOfObjEqual,\n LAYOUT,\n MEDIA_TYPE,\n} from '../utils';\nimport { type HumanParticipant } from '../utils/schema/human-participant';\nimport {\n sendParticipantEvent,\n sendParticipantListChangedEvent,\n} from '../utils/send-participant-event';\nimport { setLayout, useBaseStore } from './base';\nimport { useConfigStore } from './config';\nimport { useTracksStore } from './tracks';\n\nexport interface VirtualParticipant\n extends Omit<HumanParticipant, 'role' | 'type'> {\n type: 'screen-share';\n}\n\nexport type Participant = HumanParticipant | VirtualParticipant;\n\ninterface ParticipantsState {\n localParticipant: HumanParticipant;\n participants: HumanParticipant[];\n virtualParticipants: VirtualParticipant[];\n dominantSpeakers: string[];\n pinnedParticipant?: Participant;\n}\n\ntype Actions = {\n addParticipant: (participant: HumanParticipant) => void;\n addVirtualParticipant: (participant: VirtualParticipant) => void;\n removeParticipant: (pid: string) => void;\n removeVirtualParticipant: (\n pid: string,\n type?: VirtualParticipant['type'],\n ) => void;\n clearParticipants: () => void;\n updateLocalParticipant: (participant: Partial<HumanParticipant>) => void;\n updateParticipant: (\n participantId: string,\n participant: Partial<HumanParticipant>,\n ) => void;\n updateParticipantRole: (pid: string, role: HumanParticipant['role']) => void;\n pinParticipant: (pid: string, type: Participant['type']) => void;\n unpinParticipant: () => void;\n getParticipantById: (pid: string) => HumanParticipant | undefined;\n reset: () => void;\n};\n\nconst initialLocalParticipant: HumanParticipant = {\n avatar: undefined,\n isLocal: true,\n name: '',\n pid: 'local',\n ruid: 'local-human',\n role: 'none',\n sources: new Map(),\n type: 'human',\n uid: 'unknown',\n};\n\nconst initialState: ParticipantsState = {\n dominantSpeakers: [],\n localParticipant: initialLocalParticipant,\n participants: [],\n virtualParticipants: [],\n};\n\nexport const useParticipantStore = create<ParticipantsState & Actions>()(\n subscribeWithSelector(\n combine(initialState, (set, get) => ({\n addParticipant: participant => {\n set(state => ({\n participants: [...state.participants, participant],\n }));\n },\n addVirtualParticipant: (participant: VirtualParticipant) => {\n set(state => ({\n virtualParticipants: [...state.virtualParticipants, participant],\n }));\n },\n clearParticipants: () =>\n set({ participants: [], virtualParticipants: [] }),\n removeParticipant: pid => {\n const participants = useParticipantStore.getState().participants;\n const removedParticipant = participants.find(p => p.pid === pid);\n if (removedParticipant) {\n sendParticipantEvent(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantLeft,\n removedParticipant.pid,\n );\n\n // TODO: Maybe move this logic to the single place where pinning is handled\n const pinnedParticipant =\n useParticipantStore.getState().pinnedParticipant;\n if (pinnedParticipant?.pid === removedParticipant.pid) {\n useParticipantStore.getState().unpinParticipant();\n }\n }\n set(state => ({\n participants: state.participants.filter(p => p.pid !== pid),\n }));\n },\n removeVirtualParticipant: (\n pid: string,\n type: VirtualParticipant['type'] = 'screen-share',\n ) => {\n const pinnedParticipant =\n useParticipantStore.getState().pinnedParticipant;\n if (pinnedParticipant?.pid === pid && pinnedParticipant.type === type) {\n useParticipantStore.getState().unpinParticipant();\n }\n set(state => ({\n virtualParticipants: state.virtualParticipants.filter(\n p => !(p.pid === pid && p.type === type),\n ),\n }));\n },\n updateLocalParticipant: participant => {\n set(state => ({\n localParticipant: {\n ...state.localParticipant,\n ...participant,\n },\n }));\n },\n updateParticipant: (participantId, participant) => {\n set(state => {\n if (participantId === state.localParticipant.pid) {\n return {\n localParticipant: {\n ...state.localParticipant,\n ...participant,\n },\n };\n }\n return {\n participants: state.participants.map(p =>\n p.pid === participantId ? { ...p, ...participant } : p,\n ),\n };\n });\n },\n updateParticipantRole: (pid, role) => {\n set(state => ({\n participants: state.participants.map(p =>\n p.pid === pid ? { ...p, role } : p,\n ),\n }));\n },\n pinParticipant: (pid, type) => {\n const allParticipants = getAllParticipants();\n const participant = allParticipants.find(\n p => p.pid === pid && p.type === type,\n );\n if (participant) {\n set({ pinnedParticipant: participant });\n } else {\n console.warn(`Participant with id ${pid} not found to pin. `);\n }\n },\n unpinParticipant: () => {\n set({ pinnedParticipant: undefined });\n },\n getParticipantById: pid => {\n const localParticipant = get().localParticipant;\n if (pid === localParticipant.pid) {\n return localParticipant;\n }\n return get().participants.find(p => p.pid === pid);\n },\n reset: () => set(initialState),\n })),\n ),\n);\n\nexport function useAllParticipants(): Participant[] {\n const localParticipant = useParticipantStore(state => state.localParticipant);\n const participants = useParticipantStore(state => state.participants);\n const virtualParticipants = useParticipantStore(\n state => state.virtualParticipants,\n );\n const iAmRecorder = useConfigStore.getState().iAmRecorder;\n\n return useMemo(() => {\n if (iAmRecorder) {\n return [...virtualParticipants, ...participants];\n }\n return [localParticipant, ...virtualParticipants, ...participants];\n }, [iAmRecorder, localParticipant, participants, virtualParticipants]);\n}\n\nexport function getAllParticipants(): Participant[] {\n const localParticipant = useParticipantStore.getState().localParticipant;\n const participants = useParticipantStore.getState().participants;\n const virtualParticipants =\n useParticipantStore.getState().virtualParticipants;\n\n return [localParticipant, ...virtualParticipants, ...participants];\n}\n\nconst updateDominantSpeakers = () => {\n const dominantSpeakers = useParticipantStore.getState().dominantSpeakers;\n const participants = useParticipantStore.getState().participants;\n useParticipantStore.setState({\n dominantSpeakers: dominantSpeakers.filter(pid =>\n participants.some(p => p.pid === pid),\n ),\n });\n};\n\nexport const pinParticipant = (\n participantId: string,\n type: Participant['type'],\n) => {\n useParticipantStore.getState().pinParticipant(participantId, type);\n};\n\nexport const unpinParticipant = () => {\n useParticipantStore.getState().unpinParticipant();\n};\n\nexport const togglePinParticipant = (\n participantId: string,\n type: Participant['type'],\n) => {\n const pinnedParticipant = useParticipantStore.getState().pinnedParticipant;\n if (\n pinnedParticipant?.pid === participantId &&\n pinnedParticipant.type === type\n ) {\n useParticipantStore.getState().unpinParticipant();\n } else {\n useParticipantStore.getState().pinParticipant(participantId, type);\n }\n};\n\nuseParticipantStore.subscribe(\n state => state.virtualParticipants,\n virtualParticipants => {\n console.log('Virtual participants updated:', virtualParticipants);\n if (virtualParticipants && virtualParticipants.length > 0) {\n setLayout(LAYOUT.SIDEBAR, true);\n } else {\n const sidebarLayoutSetProgrammatically =\n useBaseStore.getState().sidebarLayoutSetProgrammatically;\n if (sidebarLayoutSetProgrammatically) {\n setLayout(LAYOUT.TILE);\n }\n }\n },\n);\n\nuseParticipantStore.subscribe(\n state => state.participants.length,\n () => {\n updateDominantSpeakers();\n },\n);\n\nuseParticipantStore.subscribe(\n state =>\n state.participants.map(({ pid, name, avatar, uid }) => ({\n pid,\n name,\n avatar,\n uid,\n })),\n () => {\n sendParticipantListChangedEvent();\n },\n {\n equalityFn: isArrayOfObjEqual,\n },\n);\n\nuseParticipantStore.subscribe(\n state => state.localParticipant.pid,\n localParticipantId => {\n useTracksStore.getState().updateLocalTrack(MEDIA_TYPE.AUDIO, {\n pid: localParticipantId,\n });\n useTracksStore.getState().updateLocalTrack(MEDIA_TYPE.VIDEO, {\n pid: localParticipantId,\n });\n },\n);\n\nuseParticipantStore.subscribe(\n state => Boolean(state.pinnedParticipant),\n pinnedParticipant => {\n if (pinnedParticipant) {\n const layout = useBaseStore.getState().layout;\n if (layout === LAYOUT.TILE) {\n setLayout(LAYOUT.SIDEBAR, true);\n }\n } else {\n const sidebarLayoutSetProgrammatically =\n useBaseStore.getState().sidebarLayoutSetProgrammatically;\n if (sidebarLayoutSetProgrammatically) {\n setLayout(LAYOUT.TILE);\n }\n }\n },\n);\n\nuseParticipantStore.subscribe(\n state => state.participants.length,\n participantsCount => {\n if (participantsCount === 0) {\n useBaseStore.getState().restartIdealTimeoutTimer();\n } else {\n useBaseStore.getState().clearIdealTimeoutTimer();\n }\n },\n);\n\neventBus.subscribe(\n EVENT_LISTENER_METHODS.SessionStatusListener.onSessionJoined,\n () => {\n const participantsCount =\n useParticipantStore.getState().participants.length;\n if (participantsCount === 0) {\n useBaseStore.getState().restartIdealTimeoutTimer();\n }\n },\n);\n\nexport const getMainParticipantFromState = (state: {\n pinnedParticipant?: Participant;\n participants: Participant[];\n virtualParticipants: Participant[];\n dominantSpeakers: string[];\n localParticipant: HumanParticipant;\n}): Participant => {\n const {\n pinnedParticipant,\n participants,\n virtualParticipants,\n dominantSpeakers,\n localParticipant,\n } = state;\n\n // If there is a pinned participant, that participant is always the main participant\n if (pinnedParticipant) {\n return pinnedParticipant;\n }\n\n if (virtualParticipants.length > 0) {\n return virtualParticipants[0];\n }\n\n for (const dominantSpeakerId of dominantSpeakers) {\n const dominantSpeaker = participants.find(p => p.pid === dominantSpeakerId);\n if (dominantSpeaker) {\n return dominantSpeaker;\n }\n }\n\n // Find first participant excluding local participant\n if (participants.length > 0) {\n return participants[0];\n }\n\n // If no other participants, return local participant\n return localParticipant;\n};\n\nuseParticipantStore.subscribe(\n state => state.participants.filter(p => p.uid),\n (participants, previousParticipants) => {\n if (participants.length > previousParticipants.length) {\n const participantsToAdd = differenceBy(\n participants,\n previousParticipants,\n x => x.uid,\n );\n participantsToAdd.forEach(participant => {\n sendParticipantEvent(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantJoined,\n participant.pid,\n );\n });\n }\n },\n);\n","import { useEffect, useState } from 'react';\nimport { create } from 'zustand';\nimport { combine, subscribeWithSelector } from 'zustand/middleware';\nimport { eventBus } from '../event-manager/event-bus';\nimport JitsiMeetJS from '../lib-jitsi-meet/lib';\nimport { type ValueOf } from '../types';\nimport {\n CONFERENCE_COMMANDS,\n EVENT_LISTENER_METHODS,\n INTERNAL_EVENTS,\n tryCatch,\n} from '../utils';\nimport { sendParticipantEvent } from '../utils/send-participant-event';\nimport { useConfigStore } from './config';\nimport { useParticipantStore } from './participants';\n\ntype ConferenceState = {\n conferenceError?: string;\n conference: any;\n conferenceJoined: boolean;\n conferenceJoinedAt: number | null;\n conferenceStartedAt: number | null;\n p2p: boolean;\n conferenceStatus:\n | 'initial'\n | 'joining'\n | 'joined'\n | 'error'\n | 'interrupted'\n | 'left'\n | 'restored'\n | 'reconnecting';\n connectionQuality: Map<string, number>;\n raiseHandMap: Map<string, number>;\n recording: {\n status: ValueOf<typeof JitsiMeetJS.constants.recording.status>;\n mode: ValueOf<typeof JitsiMeetJS.constants.recording.mode>;\n error?: string;\n sessionId?: string;\n initiator?: any;\n };\n isRecording: boolean;\n};\n\ntype Actions = {\n reset: () => void;\n conferenceWillJoin: (conference: any) => void;\n raiseHand: (participantId: string, timestamp: number) => void;\n lowerHand: (participantId: string) => void;\n leaveConference: () => Promise<void>;\n stopRecording: () => Promise<void>;\n};\n\nconst initialState: ConferenceState = {\n conference: null,\n conferenceJoined: false,\n conferenceJoinedAt: null,\n conferenceStartedAt: null,\n conferenceStatus: 'initial',\n p2p: false,\n connectionQuality: new Map(),\n raiseHandMap: new Map(),\n recording: {\n status: JitsiMeetJS.constants.recording.status.OFF,\n mode: JitsiMeetJS.constants.recording.mode.FILE,\n },\n isRecording: false,\n};\n\nexport const useConferenceStore = create<ConferenceState & Actions>()(\n subscribeWithSelector(\n combine(initialState, set => ({\n conferenceWillJoin: (conference: any) => {\n if (typeof window?.APP !== 'undefined') {\n window.APP.conference._room = conference;\n }\n set({ conference, conferenceStatus: 'joining' });\n },\n reset: () => {\n set(initialState);\n },\n raiseHand: (participantId: string, timestamp: number) => {\n set(state => ({\n raiseHandMap: new Map(state.raiseHandMap).set(\n participantId,\n timestamp,\n ),\n }));\n sendParticipantEvent(\n EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantHandRaised,\n participantId,\n );\n },\n lowerHand: (participantId: string) => {\n set(state => {\n const raiseHandMap = new Map(state.raiseHandMap);\n raiseHandMap.delete(participantId);\n return { raiseHandMap };\n });\n sendParticipantEvent(\n EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantHandLowered,\n participantId,\n );\n },\n leaveConference: async () => {\n const conference = useConferenceStore.getState().conference;\n if (conference) {\n const { error } = await tryCatch(conference.leave());\n if (error) {\n console.warn('Error leaving conference:', error);\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.SessionStatusListener.onSessionLeft,\n });\n }\n }\n },\n stopRecording: async () => {\n const conference = useConferenceStore.getState().conference;\n if (conference) {\n const recording = useConferenceStore.getState().recording;\n if (recording.sessionId) {\n const { error } = await tryCatch(\n conference.stopRecording(recording.sessionId),\n );\n if (error) {\n console.warn('Error stopping recording:', error);\n }\n }\n }\n },\n })),\n ),\n);\n\nexport const useSessionTimer = () => {\n const [conferenceElapsedTime, setConferenceElapsedTime] = useState(0);\n const conferenceStartedAt = useConferenceStore(\n state => state.conferenceStartedAt,\n );\n\n useEffect(() => {\n const interval = setInterval(() => {\n if (!conferenceStartedAt) {\n setConferenceElapsedTime(0); // Reset if not started\n return;\n }\n setConferenceElapsedTime(Math.max(Date.now() - conferenceStartedAt, 0));\n }, 1000);\n return () => clearInterval(interval);\n }, [conferenceStartedAt]);\n\n return conferenceElapsedTime;\n};\n\nexport function raisedHandLocal() {\n const conference = useConferenceStore.getState().conference;\n if (conference) {\n const currentTime = Date.now();\n const localParticipantId =\n useParticipantStore.getState().localParticipant.pid;\n conference?.setLocalParticipantProperty('raisedHand', currentTime);\n useConferenceStore.getState().raiseHand(localParticipantId, currentTime);\n }\n}\n\nexport function lowerHandLocal() {\n const conference = useConferenceStore.getState().conference;\n if (conference) {\n const localParticipantId =\n useParticipantStore.getState().localParticipant.pid;\n conference.setLocalParticipantProperty('raisedHand', 0);\n\n useConferenceStore.getState().lowerHand(localParticipantId);\n }\n}\n\nexport function toggleRaiseHand() {\n const conference = useConferenceStore.getState().conference;\n const raisedHand = conference?.getLocalParticipantProperty('raisedHand');\n if (raisedHand) {\n lowerHandLocal();\n } else {\n raisedHandLocal();\n }\n}\nexport const useIsRecording = () => {\n const isRecording = useConferenceStore(state => state.isRecording);\n const iAmRecorder = useConfigStore(state => state.iAmRecorder);\n return !iAmRecorder && isRecording;\n};\n\nuseConferenceStore.subscribe(\n state => state.recording,\n recording => {\n const recordingStatus = recording.status;\n const recordingMode = recording.mode;\n const recordingError = recording.error;\n const initiator = recording.initiator;\n const isRecording =\n !recordingError &&\n initiator &&\n recordingMode === JitsiMeetJS.constants.recording.mode.FILE &&\n (recordingStatus === JitsiMeetJS.constants.recording.status.ON ||\n recordingStatus === JitsiMeetJS.constants.recording.status.PENDING);\n if (isRecording) {\n useConferenceStore.setState({ isRecording: true });\n } else {\n useConferenceStore.setState({ isRecording: false });\n }\n },\n);\n\nuseConferenceStore.subscribe(\n state => state.isRecording,\n isRecording => {\n const initiator = useConferenceStore\n .getState()\n .recording.initiator?.getId?.();\n const localParticipantId =\n useParticipantStore.getState().localParticipant.pid;\n if (isRecording) {\n if (initiator && initiator !== localParticipantId) {\n sendParticipantEvent(\n EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantStartedRecording,\n initiator,\n );\n } else {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.MediaEventsListener.onRecordingStarted,\n });\n }\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'info',\n // TODO: Localize this message\n message: 'The session is being recorded',\n },\n });\n } else {\n if (initiator && initiator !== localParticipantId) {\n sendParticipantEvent(\n EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantStoppedRecording,\n initiator,\n );\n } else {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.MediaEventsListener.onRecordingStopped,\n });\n }\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'info',\n // TODO: Localize this message\n message: 'Recording has been stopped',\n },\n });\n }\n },\n);\n\nexport async function startRecording() {\n const conference = useConferenceStore.getState().conference;\n if (conference) {\n const { data, error } = await tryCatch(\n conference.startRecording({\n mode: JitsiMeetJS.constants.recording.mode.FILE,\n appData: JSON.stringify({\n startedAt: Date.now(),\n }),\n }),\n );\n if (data) {\n console.log('Recording started successfully:', data);\n }\n if (error) {\n // TODO: Show a notification or alert to the user\n }\n }\n}\n\nexport async function stopRecording() {\n useConferenceStore.getState().stopRecording();\n}\n\nexport async function toggleRecording() {\n const isRecording = useConferenceStore.getState().isRecording;\n if (isRecording) {\n await stopRecording();\n } else {\n await startRecording();\n }\n}\n\nexport const getIsConferenceJoined = () => {\n const conferenceStatus = useConferenceStore.getState().conferenceStatus;\n return conferenceStatus === 'joined' || conferenceStatus === 'restored';\n};\n\nuseConferenceStore.subscribe(\n state => state.conference,\n conference => {\n if (conference) {\n const localParticipant = useParticipantStore.getState().localParticipant;\n\n conference?.sendCommand(CONFERENCE_COMMANDS.userInfo, {\n value: JSON.stringify(localParticipant),\n });\n }\n },\n);\n","import { useMemo } from 'react';\nimport { create } from 'zustand';\nimport { combine, subscribeWithSelector } from 'zustand/middleware';\nimport { type Result } from '../../src/types';\nimport { eventBus } from '../event-manager';\nimport {\n addScreenShareParticipant,\n initDeviceList,\n removeScreenShareParticipant,\n updateAudioInputDeviceState,\n updateVideoInputDeviceState,\n} from '../handlers';\nimport { createLocalTrack } from '../handlers/track';\nimport { type MediaType } from '../types';\nimport {\n differenceBy,\n EVENT_LISTENER_METHODS,\n getMediaType,\n INTERNAL_EVENTS,\n isArrayOfObjEqual,\n MEDIA_TYPE,\n tryCatch,\n VIDEO_PAUSE_AUTHORITY,\n} from '../utils';\nimport { sendParticipantEvent } from '../utils/send-participant-event';\nimport { useBaseStore } from './base';\nimport { useConferenceStore } from './conference';\nimport { useParticipantStore } from './participants';\n\ntype Track = {\n // isReceivingData: boolean;\n local: boolean;\n mediaType: MediaType;\n // mirror: boolean;\n muted: number;\n pid: string;\n videoType: 'desktop' | 'camera' | null;\n originalTrack?: any;\n};\n\ntype TracksState = {\n tracks: Track[];\n permissions: {\n audio: boolean;\n video: boolean;\n initialized: boolean;\n };\n};\n\ntype Actions = {\n reset: () => void;\n addTrack: (originalTrack: any) => void;\n removeTrack: (originalTrack: any) => void;\n updateTrack: (originalTrack: any, updatedTrack: Partial<Track>) => void;\n updateLocalTrack: (\n mediaType: MediaType,\n updatedTrack: Partial<Track>,\n ) => void;\n};\n\nconst initialState: TracksState = {\n tracks: [],\n permissions: {\n audio: false,\n video: false,\n initialized: false,\n },\n};\n\nexport const useTracksStore = create<TracksState & Actions>()(\n subscribeWithSelector(\n combine(initialState, (set, get) => ({\n reset: () =>\n set({\n ...initialState,\n // Preserve permissions across resets - they're queried once at SDK init\n // and shouldn't be lost when joining/leaving sessions\n permissions: get().permissions,\n }),\n addTrack: (originalTrack: any) =>\n set(state => {\n const isLocal = originalTrack.isLocal();\n const participantId = (() => {\n if (originalTrack.getParticipantId()) {\n return originalTrack.getParticipantId();\n }\n if (isLocal) {\n return useParticipantStore.getState().localParticipant?.pid;\n }\n return originalTrack.getId();\n })();\n const track: Track = {\n local: isLocal,\n mediaType: getMediaType(originalTrack),\n pid: participantId,\n videoType: originalTrack.getVideoType(),\n muted: originalTrack.isMuted() ? 1 : 0,\n originalTrack,\n };\n return {\n tracks: [...state.tracks, track],\n };\n }),\n removeTrack: (originalTrack: any) =>\n set(state => ({\n tracks: state.tracks.filter(\n track => track.originalTrack !== originalTrack,\n ),\n })),\n updateTrack: (originalTrack: any, updatedTrack: Partial<Track>) =>\n set(state => {\n return {\n tracks: state.tracks.map(track =>\n track.originalTrack === originalTrack\n ? {\n ...track,\n mediaType: track.mediaType ?? getMediaType(originalTrack),\n videoType: track.videoType ?? originalTrack.getVideoType(),\n ...updatedTrack,\n }\n : track,\n ),\n };\n }),\n updateLocalTrack: (mediaType: MediaType, updatedTrack: Partial<Track>) =>\n set(state => {\n const localTrack = state.tracks.find(\n track => track.local && track.mediaType === mediaType,\n );\n if (!localTrack) {\n const localParticipant =\n useParticipantStore.getState().localParticipant;\n return {\n tracks: [\n ...state.tracks,\n {\n local: true,\n mediaType,\n pid: localParticipant.pid,\n videoType:\n mediaType === MEDIA_TYPE.SCREENSHARE\n ? 'desktop'\n : mediaType === MEDIA_TYPE.VIDEO\n ? 'camera'\n : null,\n muted: updatedTrack.muted ?? 0,\n ...updatedTrack,\n },\n ],\n };\n }\n\n return {\n tracks: state.tracks.map(track =>\n track === localTrack\n ? {\n ...track,\n ...updatedTrack,\n mediaType: mediaType,\n videoType:\n mediaType === MEDIA_TYPE.SCREENSHARE\n ? 'desktop'\n : mediaType === MEDIA_TYPE.VIDEO\n ? 'camera'\n : null,\n }\n : track,\n ),\n };\n }),\n })),\n ),\n);\n\nexport const useTrackByParticipantId = (\n participantId: string,\n mediaType: MediaType = MEDIA_TYPE.VIDEO,\n) => {\n const tracks = useTracksStore(state => state.tracks);\n\n const track = useMemo(\n () =>\n tracks.find(t => t.pid === participantId && t.mediaType === mediaType),\n [tracks, participantId, mediaType],\n );\n return track;\n};\n\nexport const getTrackByParticipantId = (\n participantId: string,\n mediaType: MediaType = MEDIA_TYPE.VIDEO,\n) => {\n const tracks = useTracksStore.getState().tracks;\n\n return tracks.find(t => t.pid === participantId && t.mediaType === mediaType);\n};\n\nexport const useLocalTrack = (mediaType: MediaType = MEDIA_TYPE.VIDEO) => {\n const tracks = useTracksStore(state => state.tracks);\n return useMemo(\n () => tracks.find(t => t.local && t.mediaType === mediaType),\n [tracks, mediaType],\n );\n};\n\nexport const getLocalTrack = (mediaType: MediaType = MEDIA_TYPE.VIDEO) => {\n const tracks = useTracksStore.getState().tracks;\n return tracks.find(t => t.local && t.mediaType === mediaType);\n};\n\nexport const disposeLocalTracks = async () => {\n const allLocalTracks = useTracksStore\n .getState()\n .tracks.filter(track => track.local);\n const disposePromises: Promise<Result<unknown, Error>>[] = [];\n for (const { originalTrack } of allLocalTracks) {\n if (originalTrack && originalTrack.disposed !== true) {\n disposePromises.push(tryCatch(originalTrack.dispose()));\n }\n }\n const result = await Promise.all(disposePromises);\n for (const { error } of result) {\n if (error) {\n console.error('Error disposing track:', error);\n }\n }\n};\n\nexport const muteAudioTrack = () => {\n useTracksStore.getState().updateLocalTrack(MEDIA_TYPE.AUDIO, {\n muted: 1,\n });\n};\n\nexport const unMuteAudioTrack = async () => {\n let localAudioTrack = getLocalTrack(MEDIA_TYPE.AUDIO);\n const permissions = useTracksStore.getState().permissions;\n const isMobileSDK = useBaseStore.getState().isMobileSDK();\n if (!permissions.audio && permissions.initialized && !isMobileSDK) {\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'error',\n message:\n 'Permission denied for audio track. Please allow access to your device.',\n },\n });\n eventBus.publish({\n type: INTERNAL_EVENTS.queryPermission,\n });\n return;\n }\n if (!localAudioTrack?.originalTrack) {\n await createLocalTrack('audio');\n localAudioTrack = getLocalTrack(MEDIA_TYPE.AUDIO);\n }\n if (!localAudioTrack?.originalTrack) {\n return;\n }\n useTracksStore.getState().updateLocalTrack(MEDIA_TYPE.AUDIO, {\n muted: 0,\n });\n};\n\nexport const toggleAudioTrack = () => {\n const muted = getLocalTrack(MEDIA_TYPE.AUDIO)?.muted;\n if (muted) {\n unMuteAudioTrack();\n } else {\n muteAudioTrack();\n }\n};\n\nexport const pauseVideoTrack = (authority = VIDEO_PAUSE_AUTHORITY.USER) => {\n const muted = (getLocalTrack(MEDIA_TYPE.VIDEO)?.muted || 0) | authority;\n useTracksStore.getState().updateLocalTrack(MEDIA_TYPE.VIDEO, {\n muted: muted,\n });\n};\n\nexport const resumeVideoTrack = async (\n authority = VIDEO_PAUSE_AUTHORITY.USER,\n) => {\n let localVideoTrack = getLocalTrack(MEDIA_TYPE.VIDEO);\n const permissions = useTracksStore.getState().permissions;\n const isMobileSDK = useBaseStore.getState().isMobileSDK();\n if (!permissions.video && permissions.initialized && !isMobileSDK) {\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'error',\n message:\n 'Permission denied for video track. Please allow access to your device.',\n },\n });\n eventBus.publish({\n type: INTERNAL_EVENTS.queryPermission,\n });\n return;\n }\n if (!localVideoTrack?.originalTrack) {\n await createLocalTrack(MEDIA_TYPE.VIDEO);\n localVideoTrack = getLocalTrack(MEDIA_TYPE.VIDEO);\n }\n if (!localVideoTrack?.originalTrack) {\n return;\n }\n const muted = localVideoTrack.muted & ~authority;\n useTracksStore.getState().updateLocalTrack(MEDIA_TYPE.VIDEO, {\n muted: muted,\n });\n};\n\nexport const toggleVideoTrack = () => {\n const videoMuted = getLocalTrack(MEDIA_TYPE.VIDEO)?.muted;\n if (videoMuted) {\n resumeVideoTrack();\n } else {\n pauseVideoTrack();\n }\n};\n\nuseTracksStore.subscribe(\n state =>\n state.tracks.find(t => t.mediaType === MEDIA_TYPE.AUDIO && t.local)?.muted,\n (muted, prevMuted) => {\n console.log(\n 'Local participant muted state changed audio:',\n muted,\n prevMuted,\n );\n const audioTrack = getLocalTrack(MEDIA_TYPE.AUDIO)?.originalTrack;\n if (muted && audioTrack) {\n audioTrack.mute();\n } else if (audioTrack) {\n audioTrack.unmute();\n }\n if (typeof muted === 'number' && typeof prevMuted === 'number') {\n eventBus.publish({\n type: muted\n ? EVENT_LISTENER_METHODS.MediaEventsListener.onAudioMuted\n : EVENT_LISTENER_METHODS.MediaEventsListener.onAudioUnMuted,\n });\n }\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks.find(t => t.mediaType === MEDIA_TYPE.VIDEO && t.local)?.muted,\n (videoMuted, prevVideoMuted) => {\n console.log('Local participant muted state changed video:', videoMuted);\n const videoTrack = getLocalTrack(MEDIA_TYPE.VIDEO)?.originalTrack;\n if (videoMuted && videoTrack) {\n videoTrack.mute();\n } else if (videoTrack) {\n videoTrack.unmute();\n }\n if (typeof videoMuted === 'number' && typeof prevVideoMuted === 'number') {\n eventBus.publish({\n type: videoMuted\n ? EVENT_LISTENER_METHODS.MediaEventsListener.onVideoPaused\n : EVENT_LISTENER_METHODS.MediaEventsListener.onVideoResumed,\n });\n }\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks.find(t => t.mediaType === MEDIA_TYPE.SCREENSHARE && t.local)\n ?.muted,\n muted => {\n const track = getLocalTrack(MEDIA_TYPE.SCREENSHARE)?.originalTrack;\n if (muted && track) {\n track.mute();\n }\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks.find(t => t.mediaType === MEDIA_TYPE.AUDIO && t.local)\n ?.originalTrack,\n audioTrack => {\n if (audioTrack) {\n const muted = getLocalTrack(MEDIA_TYPE.AUDIO)?.muted;\n if (muted) {\n audioTrack.mute();\n } else {\n audioTrack.unmute();\n }\n }\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks.find(t => t.mediaType === MEDIA_TYPE.VIDEO && t.local)\n ?.originalTrack,\n videoTrack => {\n if (videoTrack) {\n const videoMuted = getLocalTrack(MEDIA_TYPE.VIDEO)?.muted;\n if (videoMuted) {\n videoTrack.mute();\n } else {\n videoTrack.unmute();\n }\n }\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks.find(t => t.mediaType === MEDIA_TYPE.AUDIO && t.local)\n ?.originalTrack,\n (track, prevTrack) => {\n const conference = useConferenceStore.getState().conference;\n if (conference) {\n if (prevTrack && track) {\n conference.replaceTrack(prevTrack, track);\n } else if (track) {\n conference.addTrack(track);\n }\n }\n if (track) {\n const deviceId = track.getDeviceId();\n const device = useBaseStore\n .getState()\n .audioInputDevices.find(d => d.deviceId === deviceId);\n updateAudioInputDeviceState(device, true);\n }\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks.find(t => t.mediaType === MEDIA_TYPE.VIDEO && t.local)\n ?.originalTrack,\n (track, prevTrack) => {\n const conference = useConferenceStore.getState().conference;\n if (conference) {\n if (prevTrack && track) {\n conference.replaceTrack(prevTrack, track);\n } else if (track) {\n conference.addTrack(track);\n }\n }\n if (track) {\n const deviceId = track.getDeviceId();\n const device = useBaseStore\n .getState()\n .videoInputDevices.find(d => d.deviceId === deviceId);\n updateVideoInputDeviceState(device, true);\n }\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks.find(t => t.mediaType === MEDIA_TYPE.SCREENSHARE && t.local)\n ?.originalTrack,\n (track, prevTrack) => {\n const conference = useConferenceStore.getState().conference;\n if (conference) {\n if (prevTrack && track) {\n conference.replaceTrack(prevTrack, track).then(() => {\n // Clean up event listeners and dispose the old track after replacement\n prevTrack.removeAllListeners();\n prevTrack.dispose();\n });\n } else if (track) {\n conference.addTrack(track);\n }\n }\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks.filter(t => t.mediaType === MEDIA_TYPE.SCREENSHARE && !t.muted)\n .length,\n () => {\n const screenShareTracks = useTracksStore\n .getState()\n .tracks.filter(t => t.mediaType === MEDIA_TYPE.SCREENSHARE && !t.muted);\n const vitualParticipants = useParticipantStore\n .getState()\n .virtualParticipants.filter(p => p.type === 'screen-share');\n\n const tracksToAdd = differenceBy(\n screenShareTracks,\n vitualParticipants,\n x => x.pid,\n );\n const tracksToRemove = differenceBy(\n vitualParticipants,\n screenShareTracks,\n x => x.pid,\n );\n tracksToRemove.forEach(track => {\n removeScreenShareParticipant(track.pid);\n });\n tracksToAdd.forEach(t => addScreenShareParticipant(t.originalTrack));\n },\n);\n\nuseTracksStore.subscribe(\n state => state.permissions,\n (permissions, prevPermissions) => {\n const conferenceStatus = useConferenceStore.getState().conferenceStatus;\n if (conferenceStatus !== 'joined' && conferenceStatus !== 'restored') {\n return;\n }\n if (permissions.audio === false && prevPermissions.audio === true) {\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'error',\n message:\n 'Permission denied for audio track. Please allow access to your device.',\n },\n });\n muteAudioTrack();\n }\n if (permissions.video === false && prevPermissions.video === true) {\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'error',\n message:\n 'Permission denied for video track. Please allow access to your device.',\n },\n });\n pauseVideoTrack();\n }\n },\n);\n\nuseTracksStore.subscribe(\n state => state.permissions.audio || state.permissions.video,\n anyPermissionGranted => {\n if (anyPermissionGranted) {\n initDeviceList();\n }\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks\n .filter(t => t.mediaType === MEDIA_TYPE.AUDIO && !t.local)\n .map(t => ({\n muted: t.muted,\n pid: t.pid,\n })),\n (tracks, prevTracks) => {\n prevTracks.forEach(prevTrack => {\n const newTrack = tracks.find(t => t.pid === prevTrack.pid);\n if (newTrack && newTrack.muted !== prevTrack.muted) {\n sendParticipantEvent(\n newTrack.muted\n ? EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantAudioMuted\n : EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantAudioUnmuted,\n newTrack.pid,\n );\n }\n });\n },\n {\n equalityFn: isArrayOfObjEqual,\n },\n);\n\nuseTracksStore.subscribe(\n state =>\n state.tracks\n .filter(t => t.mediaType === MEDIA_TYPE.VIDEO && !t.local)\n .map(t => ({\n muted: t.muted,\n pid: t.pid,\n })),\n (tracks, prevTracks) => {\n prevTracks.forEach(prevTrack => {\n const newTrack = tracks.find(t => t.pid === prevTrack.pid);\n if (newTrack && newTrack.muted !== prevTrack.muted) {\n sendParticipantEvent(\n newTrack.muted\n ? EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantVideoPaused\n : EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantVideoResumed,\n newTrack.pid,\n );\n }\n });\n },\n {\n equalityFn: isArrayOfObjEqual,\n },\n);\n","import * as v from 'valibot';\nimport {\n setConfig,\n setLayout,\n useBaseStore,\n useConfigStore,\n useConnectionStore,\n useParticipantStore,\n type ConfigState,\n} from '../store';\nimport { useTracksStore } from '../store/tracks';\nimport {\n InternalSettingSchema,\n type InternalSetting,\n} from '../types/InternalSettingSchema';\nimport { safeParseJson } from './common';\nimport {\n CAMERA_FACING,\n CAMERA_FACING_INTERNAL,\n MEDIA_TYPE,\n VIDEO_PAUSE_AUTHORITY,\n} from './constants';\n\n// TODO: Remove this\n\nexport function updateConfig(config: Partial<ConfigState>) {\n setConfig(config);\n if (config.layout) {\n setLayout(config.layout);\n }\n console.log('updateConfig ::: ', config.internalSettings);\n if (typeof config.internalSettings === 'string') {\n const _internalSettings = safeParseJson<{ data: InternalSetting }>(\n config.internalSettings,\n );\n if (!_internalSettings?.data) {\n return;\n }\n const internalSettings = v.safeParse(\n InternalSettingSchema,\n _internalSettings.data,\n );\n if (internalSettings.success) {\n useParticipantStore.getState().updateLocalParticipant({\n name: internalSettings.output.user.name,\n avatar: internalSettings.output.user.avatar,\n uid: internalSettings.output.user.uid,\n });\n useConfigStore.setState({\n sessionId: internalSettings.output.sessionId,\n });\n useConnectionStore.setState({\n jwt: internalSettings.output.callToken,\n });\n useConnectionStore.setState({\n connectionConfig: internalSettings.output.settings.connectionConfig,\n });\n } else {\n console.error('Invalid internal setting data:', internalSettings.issues);\n }\n }\n if (config.devSessionId) {\n useConfigStore.setState({\n sessionId: config.devSessionId,\n });\n }\n if (config.initialCameraFacing) {\n useBaseStore.setState({\n cameraFacing:\n config.initialCameraFacing === CAMERA_FACING.REAR\n ? CAMERA_FACING_INTERNAL.ENVIRONMENT\n : CAMERA_FACING_INTERNAL.USER,\n });\n }\n if (config.displayName) {\n useParticipantStore.getState().updateLocalParticipant({\n name: config.displayName,\n avatar: undefined,\n });\n }\n if (typeof config.startAudioMuted === 'boolean') {\n useTracksStore.getState().updateLocalTrack(MEDIA_TYPE.AUDIO, {\n muted: config.startAudioMuted ? 1 : 0,\n });\n }\n if (typeof config.startVideoPaused === 'boolean') {\n useTracksStore.getState().updateLocalTrack(MEDIA_TYPE.VIDEO, {\n muted: config.startVideoPaused ? VIDEO_PAUSE_AUTHORITY.USER : 0,\n });\n }\n if (typeof config.enableNoiseReduction === 'boolean') {\n useBaseStore.setState({\n enableNoiseReduction: config.enableNoiseReduction,\n });\n }\n}\n","import { type AppStateStatus } from 'react-native';\nimport { create } from 'zustand';\nimport { combine, persist, subscribeWithSelector } from 'zustand/middleware';\nimport { eventBus } from '../event-manager/event-bus';\nimport {\n updateAudioInputDeviceState,\n updateVideoInputDevice,\n updateVideoInputDeviceState,\n} from '../handlers';\nimport type {\n AudioMode,\n CameraFacingInternal,\n Layout,\n Platform,\n WebOSName,\n} from '../types/common';\nimport {\n CAMERA_FACING,\n CAMERA_FACING_INTERNAL,\n EVENT_LISTENER_METHODS,\n EVENT_LISTENER_METHODS_MOBILE,\n getDefaultDevice,\n LAYOUT,\n MEDIA_TYPE,\n PLATFORM,\n} from '../utils';\nimport { getIsConferenceJoined } from './conference';\nimport { useConfigStore } from './config';\nimport { useParticipantStore } from './participants';\nimport { getLocalTrack } from './tracks';\n\nexport type AudioInputDevice = MediaDeviceInfo & {\n kind: Extract<MediaDeviceKind, 'audioinput'>;\n};\n\nexport type AudioOutputDevice = MediaDeviceInfo & {\n kind: Extract<MediaDeviceKind, 'audiooutput'>;\n};\n\nexport type VideoInputDevice = MediaDeviceInfo & {\n kind: Extract<MediaDeviceKind, 'videoinput'>;\n};\n\ntype BaseState = {\n participantListVisible: boolean;\n moreMenuVisible: boolean;\n subscriptions: any[];\n isPIPLayoutEnabled: boolean;\n audioModes: AudioMode[];\n audioInputDevices: AudioInputDevice[];\n audioOutputDevices: AudioOutputDevice[];\n videoInputDevices: VideoInputDevice[];\n audioInputDevice?: AudioInputDevice & { skipSubscribe: boolean };\n audioOutputDevice?: AudioOutputDevice;\n videoInputDevice?: VideoInputDevice & { skipSubscribe: boolean };\n previewVideoInputDevice?: VideoInputDevice;\n selectedAudioModeType?: AudioMode['type'];\n audioModeMenuVisible: boolean;\n layout: Layout;\n sidebarLayoutSetProgrammatically: boolean;\n cameraFacing: CameraFacingInternal;\n connectionRetryCount: number;\n settingsDialogVisible: boolean;\n virtualBackgroundDialogVisible: boolean;\n idealTimeoutTimer?: NodeJS.Timeout;\n idleTimeoutModalVisible: boolean;\n mirrorLocalVideo: boolean;\n isDesktopSharingEnabled: boolean;\n isBlurSupported: boolean;\n appState?: AppStateStatus;\n desktopSharingFrameRate: 5 | 15 | 30;\n chatButtonUnreadCount: number;\n enableNoiseReduction: boolean;\n sdkPlatform: Platform;\n webOSName?: WebOSName;\n previewVideoTrack?: any;\n isMobileBrowser: boolean;\n mainAreaDimension: {\n width: number;\n height: number;\n };\n tileDimensions: {\n tileWidth: number;\n tileHeight: number;\n };\n callContainerDimension: {\n width: number;\n height: number;\n };\n visibleParticipants: {\n startIndex: number;\n endIndex: number;\n };\n};\n\ntype Actions = {\n toggleParticipantListVisible: () => void;\n reset: () => void;\n toggleMoreMenuVisible: () => void;\n addSubscriptions: (subscriptions: any[]) => void;\n incrementConnectionRetryCount: () => void;\n clearIdealTimeoutTimer: () => void;\n restartIdealTimeoutTimer: () => void;\n isMobileSDK: () => boolean;\n isMobile: () => boolean;\n};\n\nconst initialState: BaseState = {\n audioModeMenuVisible: false,\n audioModes: [],\n audioInputDevices: [],\n audioOutputDevices: [],\n videoInputDevices: [],\n cameraFacing: CAMERA_FACING_INTERNAL.USER,\n isPIPLayoutEnabled: false,\n layout: LAYOUT.TILE,\n sidebarLayoutSetProgrammatically: false,\n mainAreaDimension: {\n height: 0,\n width: 0,\n },\n tileDimensions: {\n tileHeight: 0,\n tileWidth: 0,\n },\n callContainerDimension: {\n height: 0,\n width: 0,\n },\n moreMenuVisible: false,\n participantListVisible: false,\n subscriptions: [],\n connectionRetryCount: 0,\n settingsDialogVisible: false,\n virtualBackgroundDialogVisible: false,\n idleTimeoutModalVisible: false,\n mirrorLocalVideo: true,\n isDesktopSharingEnabled: false,\n isBlurSupported: false,\n desktopSharingFrameRate: 5,\n chatButtonUnreadCount: 0,\n enableNoiseReduction: true,\n sdkPlatform: PLATFORM.WEB,\n webOSName: 'unknown',\n isMobileBrowser: false,\n visibleParticipants: {\n startIndex: 0,\n endIndex: 0,\n },\n};\nexport const useBaseStore = create<BaseState & Actions>()(\n subscribeWithSelector(\n persist(\n combine(initialState, (set, get) => ({\n addSubscriptions: (subscriptions: any[]) => {\n useBaseStore.setState(state => ({\n subscriptions: [...state.subscriptions, ...subscriptions],\n }));\n },\n reset: () =>\n set(state => ({\n ...initialState,\n // Preserve persisted properties\n audioInputDevice: state.audioInputDevice,\n audioOutputDevice: state.audioOutputDevice,\n videoInputDevice: state.videoInputDevice,\n enableNoiseReduction: state.enableNoiseReduction,\n isMobileBrowser: state.isMobileBrowser,\n })),\n toggleMoreMenuVisible: () =>\n set(state => ({\n moreMenuVisible: !state.moreMenuVisible,\n })),\n toggleParticipantListVisible: () =>\n set(state => ({\n participantListVisible: !state.participantListVisible,\n })),\n incrementConnectionRetryCount: () =>\n set(state => ({\n connectionRetryCount: state.connectionRetryCount + 1,\n })),\n isMobileSDK: () => {\n const isMobileSDK =\n get().sdkPlatform === 'android' || get().sdkPlatform === 'ios';\n return isMobileSDK;\n },\n isMobile: () => {\n const isMobileSDK =\n get().sdkPlatform === 'android' || get().sdkPlatform === 'ios';\n const isMobileBrowser = get().isMobileBrowser;\n return isMobileSDK || isMobileBrowser;\n },\n clearIdealTimeoutTimer: () => {\n const timer = get().idealTimeoutTimer;\n if (timer) {\n clearTimeout(timer);\n set({\n idealTimeoutTimer: undefined,\n idleTimeoutModalVisible: false,\n });\n }\n },\n restartIdealTimeoutTimer: () => {\n useBaseStore.getState().clearIdealTimeoutTimer();\n const iAmRecorder = useConfigStore.getState().iAmRecorder;\n if (iAmRecorder) {\n return;\n }\n const participantsCount =\n useParticipantStore.getState().participants.length;\n if (participantsCount > 0) {\n return;\n }\n const isConferenceJoined = getIsConferenceJoined();\n if (!isConferenceJoined) {\n return;\n }\n const idleTimeoutPeriodBeforePrompt =\n useConfigStore.getState().idleTimeoutPeriodBeforePrompt;\n const timer = setTimeout(() => {\n set({\n idleTimeoutModalVisible: true,\n });\n }, idleTimeoutPeriodBeforePrompt);\n set({ idealTimeoutTimer: timer });\n },\n })),\n {\n name: 'base-store',\n partialize: state => ({\n audioInputDevice: state.audioInputDevice,\n audioOutputDevice: state.audioOutputDevice,\n videoInputDevice: state.videoInputDevice,\n enableNoiseReduction: state.enableNoiseReduction,\n }),\n },\n ),\n ),\n);\n\nexport const toggleParticipantListVisible =\n useBaseStore.getState().toggleParticipantListVisible;\n\nexport const hideParticipantList = () =>\n useBaseStore.setState({ participantListVisible: false });\n\nexport const showParticipantList = () =>\n useBaseStore.setState({ participantListVisible: true });\n\nexport const toggleMoreMenuVisible =\n useBaseStore.getState().toggleMoreMenuVisible;\n\nexport const toggleAudioModeMenuVisible = () => {\n useBaseStore.setState(state => ({\n audioModeMenuVisible: !state.audioModeMenuVisible,\n }));\n};\n\nexport const setLayout = (\n layout: Layout,\n sidebarLayoutSetProgrammatically = false,\n) => {\n if (layout !== LAYOUT.SIDEBAR) {\n useParticipantStore.setState({ pinnedParticipant: undefined });\n }\n useBaseStore.setState({ layout, sidebarLayoutSetProgrammatically });\n};\n\nexport const hideAllBottomSheets = () => {\n useBaseStore.setState({\n audioModeMenuVisible: false,\n moreMenuVisible: false,\n });\n};\n\nexport const enablePictureInPictureLayout = () =>\n useBaseStore.setState({ isPIPLayoutEnabled: true });\nexport const disablePictureInPictureLayout = () =>\n useBaseStore.setState({ isPIPLayoutEnabled: false });\n\nexport const showSettingsDialog = () => {\n useBaseStore.setState({ settingsDialogVisible: true });\n};\nexport const hideSettingsDialog = () => {\n useBaseStore.setState({ settingsDialogVisible: false });\n};\nexport const toggleSettingsDialog = () => {\n useBaseStore.setState(state => ({\n settingsDialogVisible: !state.settingsDialogVisible,\n }));\n};\n\nexport const showVirtualBackgroundDialog = () => {\n useBaseStore.setState({\n virtualBackgroundDialogVisible: true,\n participantListVisible: false,\n });\n};\nexport const hideVirtualBackgroundDialog = () => {\n useBaseStore.setState({ virtualBackgroundDialogVisible: false });\n};\n\nexport const toggleMirrorLocalVideo = () => {\n useBaseStore.setState(state => ({\n mirrorLocalVideo: !state.mirrorLocalVideo,\n }));\n};\nexport const toggleEnableNoiseReduction = () => {\n useBaseStore.setState(state => ({\n enableNoiseReduction: !state.enableNoiseReduction,\n }));\n};\n\nexport const setChatButtonUnreadCount = (count: number) => {\n useBaseStore.setState({ chatButtonUnreadCount: count });\n};\n\nexport const getLayout = () => {\n return useBaseStore.getState().layout;\n};\n\nexport function initBaseStoreSubscriptions() {\n const unsubscribeFunctions: (() => void)[] = [];\n\n const unsubscribeAudioModes = useBaseStore.subscribe(\n state => state.audioModes,\n audioModes => {\n if (audioModes.length > 0) {\n const selectedAudioMode =\n audioModes.find(mode => mode.selected) ?? audioModes[0];\n useBaseStore.setState({\n selectedAudioModeType: selectedAudioMode.type,\n });\n }\n },\n );\n unsubscribeFunctions.push(unsubscribeAudioModes);\n\n const unsubscribeSelectedAudioModeType = useBaseStore.subscribe(\n state => state.selectedAudioModeType,\n selectedAudioModeType => {\n if (selectedAudioModeType) {\n eventBus.publish({\n payload: selectedAudioModeType,\n type: EVENT_LISTENER_METHODS_MOBILE.MediaEventsListener\n .onAudioModeChanged,\n });\n }\n },\n );\n unsubscribeFunctions.push(unsubscribeSelectedAudioModeType);\n\n const unsubscribeLayout = useBaseStore.subscribe(\n state => state.layout,\n layout => {\n eventBus.publish({\n payload: layout,\n type: EVENT_LISTENER_METHODS.CallLayoutListener.onCallLayoutChanged,\n });\n },\n );\n unsubscribeFunctions.push(unsubscribeLayout);\n\n const unsubscribeParticipantListVisible = useBaseStore.subscribe(\n state => state.participantListVisible,\n participantListVisible => {\n if (participantListVisible) {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS_MOBILE.CallLayoutListener\n .onParticipantListVisible,\n });\n } else {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS_MOBILE.CallLayoutListener\n .onParticipantListHidden,\n });\n }\n },\n );\n unsubscribeFunctions.push(unsubscribeParticipantListVisible);\n\n const unsubscribePIPLayout = useBaseStore.subscribe(\n state => state.isPIPLayoutEnabled,\n isPIPLayoutEnabled => {\n if (isPIPLayoutEnabled) {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS_MOBILE.CallLayoutListener\n .onPictureInPictureLayoutEnabled,\n });\n } else {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS_MOBILE.CallLayoutListener\n .onPictureInPictureLayoutDisabled,\n });\n }\n },\n );\n unsubscribeFunctions.push(unsubscribePIPLayout);\n\n const unsubscribeCameraFacing = useBaseStore.subscribe(\n state => state.cameraFacing,\n cameraFacing => {\n eventBus.publish({\n payload:\n cameraFacing === CAMERA_FACING_INTERNAL.USER\n ? CAMERA_FACING.FRONT\n : CAMERA_FACING.REAR,\n type: EVENT_LISTENER_METHODS_MOBILE.MediaEventsListener\n .onCameraFacingChanged,\n });\n const videoTrack = getLocalTrack(MEDIA_TYPE.VIDEO)?.originalTrack;\n if (videoTrack) {\n const currentCameraFacing = videoTrack.getCameraFacingMode();\n if (currentCameraFacing !== cameraFacing) {\n const isMobileBrowser = useBaseStore.getState().isMobileBrowser;\n if (isMobileBrowser) {\n updateVideoInputDevice(null, cameraFacing);\n } else {\n videoTrack._switchCamera();\n }\n }\n }\n },\n );\n unsubscribeFunctions.push(unsubscribeCameraFacing);\n\n const unsubscribeAudioInputDevices = useBaseStore.subscribe(\n state => state.audioInputDevices,\n audioInputDevices => {\n if (audioInputDevices.length > 0) {\n const audioInputDevice = useBaseStore.getState().audioInputDevice;\n if (audioInputDevice) {\n const deviceExists = audioInputDevices.some(\n device =>\n device.deviceId === audioInputDevice.deviceId &&\n device.label === audioInputDevice.label,\n );\n if (!deviceExists) {\n updateAudioInputDeviceState(getDefaultDevice(audioInputDevices));\n }\n } else {\n updateAudioInputDeviceState(\n getDefaultDevice(audioInputDevices),\n true,\n );\n }\n }\n },\n );\n unsubscribeFunctions.push(unsubscribeAudioInputDevices);\n\n const unsubscribeAudioOutputDevices = useBaseStore.subscribe(\n state => state.audioOutputDevices,\n audioOutputDevices => {\n if (audioOutputDevices.length > 0) {\n const audioOutputDevice = useBaseStore.getState().audioOutputDevice;\n if (!audioOutputDevice) {\n useBaseStore.setState({\n audioOutputDevice: getDefaultDevice(audioOutputDevices),\n });\n } else {\n const deviceExists = audioOutputDevices.some(\n device =>\n device.deviceId === audioOutputDevice.deviceId &&\n device.label === audioOutputDevice.label,\n );\n if (!deviceExists) {\n useBaseStore.setState({\n audioOutputDevice: getDefaultDevice(audioOutputDevices),\n });\n }\n }\n }\n },\n );\n unsubscribeFunctions.push(unsubscribeAudioOutputDevices);\n\n const unsubscribeVideoInputDevices = useBaseStore.subscribe(\n state => state.videoInputDevices,\n videoInputDevices => {\n if (videoInputDevices.length > 0) {\n const videoInputDevice = useBaseStore.getState().videoInputDevice;\n if (videoInputDevice) {\n const deviceExists = videoInputDevices.some(\n device =>\n device.deviceId === videoInputDevice.deviceId &&\n device.label === videoInputDevice.label,\n );\n if (!deviceExists) {\n updateVideoInputDeviceState(getDefaultDevice(videoInputDevices));\n }\n } else {\n updateVideoInputDeviceState(\n getDefaultDevice(videoInputDevices),\n true,\n );\n }\n }\n },\n );\n unsubscribeFunctions.push(unsubscribeVideoInputDevices);\n\n useBaseStore.subscribe(\n state => state.previewVideoTrack,\n (previewVideoTrack, prevPreviewVideoTrack) => {\n console.log('Preview video track updated:', {\n previewVideoTrack,\n prevPreviewVideoTrack,\n });\n if (prevPreviewVideoTrack) {\n if (prevPreviewVideoTrack.disposed !== true) {\n prevPreviewVideoTrack.dispose();\n }\n }\n },\n );\n\n useBaseStore.getState().addSubscriptions(unsubscribeFunctions);\n}\n\ninitBaseStoreSubscriptions();\n","import { create } from 'zustand';\nimport { combine, subscribeWithSelector } from 'zustand/middleware';\nimport { eventBus } from '../event-manager';\nimport { type InternalSetting } from '../types/InternalSettingSchema';\nimport { EVENT_LISTENER_METHODS, INTERNAL_EVENTS, tryCatch } from '../utils';\n\ntype ConnectionState = {\n connection: any;\n error: any;\n timeEstablished: number | undefined;\n jwt?: string;\n connectionConfig?: InternalSetting['settings']['connectionConfig'];\n connectionStatus:\n | 'initial'\n | 'connecting'\n | 'connected'\n | 'error'\n | 'disconnecting';\n};\n\ntype Actions = {\n connectionWillConnect: (connection: any) => void;\n connectionEstablished: (connection: any) => void;\n connectionFailed: (error: any) => void;\n disconnect: () => Promise<void>;\n reset: () => void;\n};\n\nconst initialState: ConnectionState = {\n connection: undefined,\n connectionStatus: 'initial',\n error: undefined,\n timeEstablished: undefined,\n};\n\nexport const useConnectionStore = create<ConnectionState & Actions>()(\n subscribeWithSelector(\n combine(initialState, set => ({\n connectionEstablished: (connection: any) =>\n set({\n connection: connection,\n connectionStatus: 'connected',\n error: undefined,\n timeEstablished: Date.now(),\n }),\n connectionFailed: (error: any) =>\n set({\n connectionStatus: 'error',\n error,\n timeEstablished: undefined,\n }),\n connectionWillConnect: (connection: any) => {\n if (typeof window?.APP !== 'undefined') {\n window.APP.connection = connection;\n }\n connection.addFeature('http://jitsi.org/protocol/jibri');\n set({\n connection: connection,\n connectionStatus: 'connecting',\n error: undefined,\n timeEstablished: undefined,\n });\n },\n disconnect: async () => {\n const connection = useConnectionStore.getState().connection;\n const connectionStatus = useConnectionStore.getState().connectionStatus;\n if (connection && connectionStatus !== 'disconnecting') {\n set({\n connectionStatus: 'disconnecting',\n });\n eventBus.publish({\n type: INTERNAL_EVENTS.connectionWillClose,\n });\n eventBus.stopEmitting();\n await tryCatch(connection.disconnect());\n eventBus.publish(\n {\n type: EVENT_LISTENER_METHODS.SessionStatusListener\n .onConnectionClosed,\n },\n true,\n );\n set(initialState);\n }\n },\n reset: () => set(initialState),\n })),\n ),\n);\n","import { type MediaType } from '../../types';\nimport { LAYOUT, MEDIA_TYPE, SESSION_TYPE } from '../../utils';\nimport { type HumanParticipant } from '../../utils/schema/human-participant';\nimport { useBaseStore } from '../base';\nimport { useConferenceStore } from '../conference';\nimport { useConfigStore } from '../config';\nimport { useConnectionStore } from '../connection';\nimport {\n getMainParticipantFromState,\n type Participant,\n useAllParticipants,\n useParticipantStore,\n} from '../participants';\nimport {\n getLocalTrack,\n useLocalTrack,\n useTrackByParticipantId,\n useTracksStore,\n} from '../tracks';\n\nexport const useHideMuteAudioButton = () => {\n const hideMuteAudioButton = useConfigStore(\n state => state.hideToggleAudioButton,\n );\n\n return hideMuteAudioButton;\n};\n\nexport const useHideToggleVideoButton = () => {\n const hideToggleVideoButton = useConfigStore(\n state => state.hideToggleVideoButton,\n );\n const type = useConfigStore(state => state.sessionType);\n\n return hideToggleVideoButton || type !== SESSION_TYPE.VIDEO;\n};\n\nexport const useIsConferenceJoined = () => {\n const conferenceStatus = useConferenceStore(state => state.conferenceStatus);\n return conferenceStatus === 'joined' || conferenceStatus === 'restored';\n};\n\nexport const useHideScreenSharingButton = () => {\n const hideScreenSharingButton = useConfigStore(\n state => state.hideScreenSharingButton,\n );\n const isAndroid = useBaseStore(state => state.sdkPlatform === 'android');\n const isDesktopSharingEnabled = useBaseStore(\n state => state.isDesktopSharingEnabled,\n );\n const isConferenceJoined = useIsConferenceJoined();\n const isMobileSDK = useBaseStore.getState().isMobileSDK();\n\n return (\n hideScreenSharingButton ||\n isMobileSDK ||\n !isConferenceJoined ||\n (isAndroid ? false : !isDesktopSharingEnabled)\n );\n};\n\nexport const useHideSwitchCameraButton = () => {\n const videoTrack = getLocalTrack(MEDIA_TYPE.VIDEO);\n const hideSwitchCameraButton = useConfigStore(\n state => state.hideSwitchCameraButton,\n );\n return hideSwitchCameraButton || !videoTrack;\n};\n\nexport const useHideChatButton = () => {\n const hideChatButton = useConfigStore(state => state.hideChatButton);\n return hideChatButton;\n};\n\nexport const useLocalParticipant = <T = HumanParticipant>(\n selector?: (local: HumanParticipant) => T,\n): T => {\n return useParticipantStore(state =>\n selector ? selector(state.localParticipant) : (state.localParticipant as T),\n );\n};\n\nexport const useScreenShareRunning = () => {\n const screenShareTrack = useLocalTrack(MEDIA_TYPE.SCREENSHARE);\n return screenShareTrack?.originalTrack && !screenShareTrack.muted;\n};\n\nexport const useTrackMuted = (mediaType: MediaType, participantId?: string) => {\n const localParticipant = useLocalParticipant();\n const track = useTrackByParticipantId(\n participantId ?? localParticipant.pid,\n mediaType,\n );\n return track ? Boolean(track.muted) : true;\n};\n\nexport const useMainParticipant = (): Participant => {\n const pinnedParticipant = useParticipantStore(\n state => state.pinnedParticipant,\n );\n const participants = useParticipantStore(state => state.participants);\n const virtualParticipants = useParticipantStore(\n state => state.virtualParticipants,\n );\n const dominantSpeakers = useParticipantStore(state => state.dominantSpeakers);\n const localParticipant = useLocalParticipant();\n\n return getMainParticipantFromState({\n pinnedParticipant,\n participants,\n virtualParticipants,\n dominantSpeakers,\n localParticipant,\n });\n};\n\nexport const getMainParticipant = (): Participant => {\n const state = useParticipantStore.getState();\n return getMainParticipantFromState({\n pinnedParticipant: state.pinnedParticipant,\n participants: state.participants,\n virtualParticipants: state.virtualParticipants,\n dominantSpeakers: state.dominantSpeakers,\n localParticipant: state.localParticipant,\n });\n};\n\nexport const useIsReconnecting = () => {\n const connectionStatus = useConnectionStore(state => state.connectionStatus);\n const conferenceStatus = useConferenceStore(state => state.conferenceStatus);\n\n const reconnecting =\n connectionStatus === 'connected' && conferenceStatus === 'interrupted';\n\n return reconnecting;\n};\n\nexport const useHideRecordingButton = () => {\n const hideRecordingButton = useConfigStore(\n state => state.hideRecordingButton,\n );\n const isConferenceJoined = useIsConferenceJoined();\n const localParticipant = useLocalParticipant();\n return (\n hideRecordingButton ||\n !isConferenceJoined ||\n localParticipant.role !== 'moderator'\n );\n};\n\nexport const useHideVirtualBackgroundButton = () => {\n const hideVirtualBackgroundButton = useConfigStore(\n state => state.hideVirtualBackgroundButton,\n );\n const videoTrack = getLocalTrack(MEDIA_TYPE.VIDEO);\n const isBlurSupported = useBaseStore(state => state.isBlurSupported);\n return (\n hideVirtualBackgroundButton ||\n !videoTrack?.originalTrack ||\n !isBlurSupported\n );\n};\n\nexport const useLayout = () => {\n const layout = useBaseStore(state => state.layout);\n return layout;\n};\n\nexport const useEnableParticipantContextMenu = () => {\n const enableParticipantContextMenu = useConfigStore(\n state => state.enableParticipantContextMenu,\n );\n const isPIPLayoutEnabled = useBaseStore(state => state.isPIPLayoutEnabled);\n const layout = useLayout();\n const isSpotlightLayout = layout === LAYOUT.SPOTLIGHT;\n if (isSpotlightLayout || isPIPLayoutEnabled) {\n return false;\n }\n return enableParticipantContextMenu;\n};\n\nexport const useRaisedHandTimestamp = (\n participantId?: string,\n type: Participant['type'] = 'human',\n) => {\n const localParticipant = useLocalParticipant();\n const raisedHandTimestamp = useConferenceStore(state =>\n state.raiseHandMap.get(participantId ?? localParticipant.pid),\n );\n return type === 'human' ? raisedHandTimestamp : undefined;\n};\n\nexport const useIsParticipantPinned = (\n participantId: string,\n type: Participant['type'],\n) => {\n const pinnedParticipant = useParticipantStore(\n state => state.pinnedParticipant,\n );\n if (\n pinnedParticipant &&\n pinnedParticipant.pid === participantId &&\n pinnedParticipant.type === type\n ) {\n return true;\n }\n return false;\n};\n\nexport const useOrderedParticipants = () => {\n const participants = useAllParticipants();\n const raiseHandMap = useConferenceStore(state => state.raiseHandMap);\n const orderedParticipants = participants.sort((a, b) => {\n const aRaisedHand = raiseHandMap.get(a.pid);\n const bRaisedHand = raiseHandMap.get(b.pid);\n if (aRaisedHand && !bRaisedHand) {\n return -1;\n }\n if (!aRaisedHand && bRaisedHand) {\n return 1;\n }\n return a.name.localeCompare(b.name);\n });\n return orderedParticipants;\n};\n\nexport const useNonRecoverableError = () => {\n const conferenceError = useConferenceStore(state => state.conferenceError);\n const connectionError = useConnectionStore(state => state.error);\n\n return conferenceError || connectionError;\n};\n\nexport const useIsSwitchCameraEnabledBrowser = () => {\n const isMobileBrowser = useBaseStore(state => state.isMobileBrowser);\n const videoTrack = getLocalTrack(MEDIA_TYPE.VIDEO);\n\n return isMobileBrowser && videoTrack?.originalTrack;\n};\n\nexport const useIsAudioInputSelectionSupported = () => {\n const hasAudioPermission = useTracksStore(state => state.permissions.audio);\n const audioInputDevices = useBaseStore(state => state.audioInputDevices);\n const isAudioInputSelectionSupported =\n hasAudioPermission && audioInputDevices.length > 0;\n return isAudioInputSelectionSupported;\n};\n\nexport const useIsVideoInputSelectionSupported = () => {\n const hasVideoPermission = useTracksStore(state => state.permissions.video);\n const videoInputDevices = useBaseStore(state => state.videoInputDevices);\n const isVideoInputSelectionSupported =\n hasVideoPermission && videoInputDevices.length > 0;\n return isVideoInputSelectionSupported;\n};\n","import { CAMERA_FACING_INTERNAL } from '../../utils';\nimport { useBaseStore } from '../base';\n\nexport const switchCamera = () => {\n useBaseStore.setState(state => ({\n cameraFacing:\n state.cameraFacing === CAMERA_FACING_INTERNAL.USER\n ? CAMERA_FACING_INTERNAL.ENVIRONMENT\n : CAMERA_FACING_INTERNAL.USER,\n }));\n};\n","import {\n getAllParticipants,\n getLayout,\n getMainParticipant,\n getMainParticipantFromState,\n useBaseStore,\n useConferenceStore,\n useParticipantStore,\n} from '../store';\nimport { debounce, VIDEO_QUALITY_LEVELS } from '../utils';\n\ntype Constraints = {\n constraints: Record<string, { maxHeight: number }>;\n defaultConstraints: { maxHeight: number };\n lastN: number;\n onStageSources: string[];\n selectedSources: string[];\n};\n\nfunction getNearestVideoQualityLevel(height: number): number {\n if (height <= VIDEO_QUALITY_LEVELS.LOW) {\n return VIDEO_QUALITY_LEVELS.LOW;\n } else if (height <= VIDEO_QUALITY_LEVELS.STANDARD) {\n return VIDEO_QUALITY_LEVELS.STANDARD;\n }\n return VIDEO_QUALITY_LEVELS.HIGH;\n}\n\nfunction setReceiverConstraintsInternal() {\n const constraints: Constraints = {\n constraints: {},\n defaultConstraints: { maxHeight: VIDEO_QUALITY_LEVELS.NONE },\n lastN: -1,\n onStageSources: [],\n selectedSources: [],\n };\n const layout = getLayout();\n if (layout === 'SPOTLIGHT') {\n const mainParticipantSources = getMainParticipant().sources?.get('video');\n if (mainParticipantSources) {\n Array.from(mainParticipantSources.keys()).forEach(source => {\n constraints.constraints[source] = {\n maxHeight: 720,\n };\n constraints.onStageSources.push(source);\n });\n }\n } else if (layout === 'TILE') {\n const tileHeight = getNearestVideoQualityLevel(\n useBaseStore.getState().tileDimensions.tileHeight,\n );\n const visibleParticipants = useBaseStore.getState().visibleParticipants;\n const participants = getAllParticipants().slice(\n visibleParticipants.startIndex,\n visibleParticipants.endIndex + 1,\n );\n\n participants.forEach(participant => {\n const isLocal = participant.isLocal;\n const videoSources = participant.sources?.get('video');\n if (!isLocal && videoSources) {\n Array.from(videoSources.keys()).forEach(source => {\n constraints.constraints[source] = {\n maxHeight: tileHeight,\n };\n });\n }\n });\n } else if (layout === 'SIDEBAR') {\n const participants = useParticipantStore.getState().participants;\n participants.forEach(participant => {\n const videoSources = participant.sources?.get('video');\n if (videoSources) {\n Array.from(videoSources.keys()).forEach(source => {\n constraints.constraints[source] = {\n maxHeight: 180,\n };\n });\n }\n });\n\n const mainParticipant = getMainParticipant();\n const videoSources = mainParticipant.sources?.get('video');\n if (videoSources) {\n Array.from(videoSources.keys()).forEach(source => {\n constraints.constraints[source] = {\n maxHeight: 720,\n };\n constraints.onStageSources.push(source);\n });\n }\n }\n\n const conference = useConferenceStore.getState().conference;\n if (conference && Object.keys(constraints.constraints).length > 0) {\n conference.setReceiverConstraints(constraints);\n }\n}\n\n// Debounced version of setReceiverConstraints with 100ms delay\nexport const setReceiverConstraints = debounce(\n setReceiverConstraintsInternal,\n 200,\n);\n\nuseBaseStore.subscribe(\n state => state.visibleParticipants,\n () => {\n setReceiverConstraints();\n },\n);\n\nuseBaseStore.subscribe(\n state => state.layout,\n () => {\n setReceiverConstraints();\n },\n);\n\nuseParticipantStore.subscribe(\n state => getMainParticipantFromState(state).pid,\n () => {\n const layout = useBaseStore.getState().layout;\n if (layout === 'SPOTLIGHT' || layout === 'SIDEBAR') {\n setReceiverConstraints();\n }\n },\n);\n","import { eventBus } from '../event-manager/event-bus';\nimport { setReceiverConstraints } from '../handlers/constraints';\nimport JitsiMeetJS from '../lib-jitsi-meet';\nimport type { ConnectionStats } from '../lib-jitsi-meet/type';\nimport {\n lowerHandLocal,\n startRecording,\n useConferenceStore,\n useConfigStore,\n useConnectionStore,\n useParticipantStore,\n} from '../store';\nimport { getLocalTrack, useTracksStore } from '../store/tracks';\nimport {\n EVENT_LISTENER_METHODS,\n INTERNAL_EVENTS,\n MEDIA_TYPE,\n PARTICIPANT_ROLE,\n} from '../utils';\nimport { sendParticipantEvent } from '../utils/send-participant-event';\nimport { onTrack } from './onTrack';\n\nconst AUDIO_LEVEL_THRESHOLD_TO_LOWER_HAND = 0.2;\n\nclass ConferenceListener {\n public onConferenceJoined() {\n useConferenceStore.setState({\n conferenceJoined: true,\n conferenceStatus: 'joined',\n conferenceJoinedAt: Date.now(),\n });\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.SessionStatusListener.onSessionJoined,\n });\n eventBus.publish({\n type: INTERNAL_EVENTS.onSessionJoined,\n });\n\n const autoStartRecording = useConfigStore.getState().autoStartRecording;\n if (autoStartRecording) {\n setTimeout(() => {\n console.log('Starting recording');\n startRecording();\n }, 500);\n }\n }\n\n public async onConferenceLeft() {\n useConferenceStore.setState({\n conferenceJoined: false,\n conferenceStatus: 'left',\n });\n console.log('Conference left');\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.SessionStatusListener.onSessionLeft,\n });\n await useConnectionStore.getState().disconnect();\n }\n\n public onTrackAdded(track: any) {\n if (track.isLocal()) {\n return;\n }\n onTrack(track);\n }\n\n public onUserJoined(_id: string, participant: any) {\n const id: string = participant.getId();\n const displayName = participant.getDisplayName();\n const role = participant.getRole();\n\n if (participant.isHidden()) {\n return;\n }\n\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'info',\n message: `${displayName} has joined the conference`,\n },\n });\n\n useParticipantStore.getState().addParticipant({\n name: displayName ?? 'Unknown',\n pid: id,\n ruid: `${id}-human`,\n role: role,\n isLocal: false,\n sources: participant.getSources(),\n type: 'human',\n });\n }\n\n public onUserLeft(_id: string, participant: any) {\n if (participant.isHidden()) {\n return;\n }\n\n const id: string = participant.getId();\n\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'info',\n message: `${participant.getDisplayName()} has left the conference`,\n },\n });\n\n useParticipantStore.getState().removeParticipant(id);\n }\n\n public onTrackRemoved(track: any) {\n if (track.isLocal()) {\n // This is because for local tracks, we don't want the other information to go away such as muted.\n // So in case the track is recreated, it is still muted/unmuted based on the previous state.\n const localTrack = getLocalTrack(track.getType());\n if (localTrack?.originalTrack === track) {\n useTracksStore.getState().updateLocalTrack(track.getType(), {\n originalTrack: undefined,\n });\n }\n } else {\n useTracksStore.getState().removeTrack(track);\n }\n track.removeAllListeners(JitsiMeetJS.events.track.TRACK_MUTE_CHANGED);\n track.removeAllListeners(JitsiMeetJS.events.track.TRACK_VIDEOTYPE_CHANGED);\n track.removeAllListeners(JitsiMeetJS.events.track.NO_DATA_FROM_SOURCE);\n }\n\n public onConferenceJoinInProgress() {\n // This event is triggered when the conference is in the process of joining.\n }\n\n public onConferenceFailed(_conference: any, error: string, message: string) {\n console.error('Conference failed:', error, message);\n\n useConferenceStore.setState({\n conferenceStatus: 'error',\n conferenceJoined: false,\n conferenceError: message?.toString() || 'Unknown error',\n });\n }\n\n public onRecorderStateChanged(session: any) {\n console.log(\n 'Recorder state changed onRecorderStateChanged:',\n session,\n session.getStatus(),\n );\n if (session) {\n const sessionId = session.getID();\n if (sessionId) {\n const status = session.getStatus();\n const mode = session.getMode();\n const error = session.getError();\n const initiator = session.getInitiator();\n useConferenceStore.setState({\n recording: {\n status,\n mode,\n error,\n sessionId,\n initiator,\n },\n });\n const conference = useConferenceStore.getState().conference;\n const localParticipant =\n useParticipantStore.getState().localParticipant;\n\n // For v4 compatibility\n conference.sendCommandOnce('START_SCREEN_RECORDING', {\n attributes: {\n recordId: sessionId,\n ...localParticipant,\n id: localParticipant.pid,\n },\n });\n }\n }\n }\n\n public onConnectionEstablished() {\n useConferenceStore.setState({\n conferenceStatus: 'joined',\n });\n }\n\n public onConnectionInterrupted() {\n useConferenceStore.setState({\n conferenceStatus: 'interrupted',\n });\n }\n\n public onConnectionRestored() {\n useConferenceStore.setState({\n conferenceStatus: 'restored',\n });\n }\n\n public onP2PStatus(_conference: any, p2p: boolean) {\n useConferenceStore.setState({\n p2p,\n });\n }\n\n public onTrackMuteChanged(track: any, participantThatMutedUs: any) {\n if (participantThatMutedUs) {\n useTracksStore.getState().updateTrack(track, {\n muted: track.isMuted() ? 1 : 0,\n });\n const displayName = participantThatMutedUs.getDisplayName();\n if (displayName) {\n eventBus.publish({\n type: INTERNAL_EVENTS.notification,\n payload: {\n type: 'info',\n message: `${displayName} has muted you.`,\n },\n });\n }\n }\n }\n\n public onParticipantSourceUpdated(participant: any) {\n console.log('SOURCE_UPDATED', participant);\n setReceiverConstraints();\n }\n\n public onConferenceCreatedTimestamp(timestamp: number) {\n useConferenceStore.setState({\n conferenceStartedAt: timestamp,\n });\n }\n\n onDominantSpeakerChanged(\n dominant: string,\n previous: string[] | undefined,\n _silent: boolean | string,\n ) {\n useParticipantStore.setState({\n dominantSpeakers: [dominant, ...(previous ?? [])],\n });\n sendParticipantEvent(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onDominantSpeakerChanged,\n dominant,\n );\n\n const localParticipant = useParticipantStore.getState().localParticipant;\n if (dominant === localParticipant.pid) {\n lowerHandLocal();\n }\n }\n\n onLocalStatsUpdated(stats: ConnectionStats) {\n console.log('LOCAL_STATS_UPDATED', stats);\n const localParticipant = useParticipantStore.getState().localParticipant;\n if (stats.connectionQuality) {\n useConferenceStore.setState(state => {\n const connectionQuality = new Map(state.connectionQuality);\n connectionQuality.set(localParticipant.pid, stats.connectionQuality);\n return { connectionQuality };\n });\n }\n }\n\n onRemoteStatsUpdated(id: string, stats: ConnectionStats) {\n console.log('REMOTE_STATS_UPDATED', id, stats);\n if (stats.connectionQuality) {\n useConferenceStore.setState(state => {\n const connectionQuality = new Map(state.connectionQuality);\n connectionQuality.set(id, stats.connectionQuality);\n return { connectionQuality };\n });\n }\n }\n\n onParticipantPropertyChanged(\n participant: any,\n propertyName: string,\n _oldValue: string,\n newValue: string,\n ) {\n const participantId = participant.getId();\n if (participantId && propertyName === 'raisedHand') {\n if (newValue) {\n useConferenceStore\n .getState()\n .raiseHand(participantId, parseInt(newValue, 10));\n } else {\n useConferenceStore.getState().lowerHand(participantId);\n }\n }\n }\n\n onUserRoleChanged(participantId: any, newRole: string) {\n if (\n typeof participantId === 'string' &&\n (newRole === PARTICIPANT_ROLE.MODERATOR ||\n newRole === PARTICIPANT_ROLE.NONE)\n ) {\n useParticipantStore.getState().updateParticipant(participantId, {\n role: newRole,\n });\n }\n }\n\n onTalkWhileMuted() {}\n\n onConferenceError(error: any) {\n console.error('Conference error:', error);\n if (error instanceof Error) {\n useConferenceStore.setState({\n conferenceStatus: 'error',\n conferenceJoined: false,\n conferenceError: error.message,\n });\n } else {\n useConferenceStore.setState({\n conferenceStatus: 'error',\n conferenceJoined: false,\n conferenceError: error.toString(),\n });\n }\n }\n\n onTrackAudioLevelChanged(participantId: string, audioLevel: number) {\n const localParticipant = useParticipantStore.getState().localParticipant;\n if (participantId !== localParticipant.pid) {\n return;\n }\n\n const localAudioTrack = getLocalTrack(MEDIA_TYPE.AUDIO);\n if (localAudioTrack?.muted) {\n return;\n }\n\n const raiseHandMap = useConferenceStore.getState().raiseHandMap;\n const hasRaisedHand = raiseHandMap.has(localParticipant.pid);\n\n if (hasRaisedHand && audioLevel > AUDIO_LEVEL_THRESHOLD_TO_LOWER_HAND) {\n lowerHandLocal();\n }\n }\n}\n\nexport const conferenceListener = new ConferenceListener();\n","import * as v from 'valibot';\nimport { PARTICIPANT_ROLE } from '../constants';\n\nexport const HumanParticipantSchema = v.object({\n name: v.string(),\n pid: v.string(),\n ruid: v.string(),\n role: v.picklist(Object.values(PARTICIPANT_ROLE)),\n uid: v.optional(v.string()),\n avatar: v.optional(v.string()),\n isLocal: v.boolean(),\n sources: v.optional(\n v.map(\n v.union([v.literal('video'), v.literal('audio')]),\n v.map(v.string(), v.any()),\n ),\n ),\n type: v.literal('human'),\n});\n\nexport type HumanParticipant = v.InferInput<typeof HumanParticipantSchema>;\n","import * as v from 'valibot';\nimport { HumanParticipantSchema } from './human-participant';\n\nexport const UserInfoCommandSchema = v.pick(HumanParticipantSchema, [\n 'avatar',\n 'uid',\n]);\n","import * as v from 'valibot';\nimport { conferenceListener } from '../event-listeners/conference-listener';\nimport JitsiMeetJS from '../lib-jitsi-meet';\nimport { useConnectionStore } from '../store';\nimport { useConferenceStore } from '../store/conference';\nimport { useParticipantStore } from '../store/participants';\nimport { getLocalTrack } from '../store/tracks';\nimport { CONFERENCE_COMMANDS, MEDIA_TYPE, safeParseJson } from '../utils';\nimport { UserInfoCommandSchema } from '../utils/schema/user-info-command';\n\nfunction addConferenceListeners(conference: any) {\n conference.on(\n JitsiMeetJS.events.conference.USER_JOINED,\n conferenceListener.onUserJoined,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.USER_LEFT,\n conferenceListener.onUserLeft,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.TRACK_ADDED,\n conferenceListener.onTrackAdded,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.TRACK_REMOVED,\n conferenceListener.onTrackRemoved,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.CONFERENCE_JOIN_IN_PROGRESS,\n conferenceListener.onConferenceJoinInProgress,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.CONFERENCE_FAILED,\n conferenceListener.onConferenceFailed,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.RECORDER_STATE_CHANGED,\n conferenceListener.onRecorderStateChanged,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.CONNECTION_ESTABLISHED,\n conferenceListener.onConnectionEstablished,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.CONNECTION_INTERRUPTED,\n conferenceListener.onConnectionInterrupted,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.CONNECTION_RESTORED,\n conferenceListener.onConnectionRestored,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.P2P_STATUS,\n conferenceListener.onP2PStatus,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.TRACK_MUTE_CHANGED,\n conferenceListener.onTrackMuteChanged,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.CONFERENCE_JOINED,\n conferenceListener.onConferenceJoined,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.CONFERENCE_LEFT,\n conferenceListener.onConferenceLeft,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.PARTICIPANT_SOURCE_UPDATED,\n conferenceListener.onParticipantSourceUpdated,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.CONFERENCE_CREATED_TIMESTAMP,\n conferenceListener.onConferenceCreatedTimestamp,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.DOMINANT_SPEAKER_CHANGED,\n conferenceListener.onDominantSpeakerChanged,\n );\n\n conference.on(\n JitsiMeetJS.events.connectionQuality.LOCAL_STATS_UPDATED,\n conferenceListener.onLocalStatsUpdated,\n );\n\n conference.on(\n JitsiMeetJS.events.connectionQuality.REMOTE_STATS_UPDATED,\n conferenceListener.onRemoteStatsUpdated,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.PARTICIPANT_PROPERTY_CHANGED,\n conferenceListener.onParticipantPropertyChanged,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.USER_ROLE_CHANGED,\n conferenceListener.onUserRoleChanged,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.TALK_WHILE_MUTED,\n conferenceListener.onTalkWhileMuted,\n );\n\n conference.on(\n JitsiMeetJS.events.conference.TRACK_AUDIO_LEVEL_CHANGED,\n conferenceListener.onTrackAudioLevelChanged,\n );\n\n conference.addCommandListener(\n CONFERENCE_COMMANDS.userInfo,\n (data: { value: string }, id: string) => {\n const vData = v.safeParse(\n UserInfoCommandSchema,\n safeParseJson(data.value),\n );\n if (vData.success) {\n useParticipantStore.getState().updateParticipant(id, {\n avatar: vData.output.avatar,\n uid: vData.output.uid,\n });\n }\n },\n );\n}\n\nexport async function createConference(connection: any, roomName: string) {\n if (!connection) {\n throw new Error('No connection available');\n }\n const existingConference = useConferenceStore.getState().conference;\n if (existingConference) {\n console.log('Conference already exists, skipping creation');\n return;\n }\n const connectionConfig = useConnectionStore.getState().connectionConfig;\n const conference = connection.initJitsiConference(roomName, connectionConfig);\n\n const localAudioTrack = getLocalTrack(MEDIA_TYPE.AUDIO)?.originalTrack;\n const localVideoTrack = getLocalTrack(MEDIA_TYPE.VIDEO)?.originalTrack;\n\n if (localAudioTrack) {\n conference.addTrack(localAudioTrack);\n }\n if (localVideoTrack) {\n conference.addTrack(localVideoTrack);\n }\n\n useParticipantStore.getState().updateLocalParticipant({\n pid: conference.myUserId(),\n });\n addConferenceListeners(conference);\n useConferenceStore.getState().conferenceWillJoin(conference);\n conference.setDisplayName(\n useParticipantStore.getState().localParticipant.name,\n );\n conference.join();\n}\n\nexport function muteParticipant(participantId: string) {\n const conference = useConferenceStore.getState().conference;\n conference?.muteParticipant(participantId, 'audio');\n}\n\nexport function pauseParticipantVideo(participantId: string) {\n const conference = useConferenceStore.getState().conference;\n conference?.muteParticipant(participantId, 'video');\n}\n","import { eventBus } from '../event-manager';\nimport JitsiMeetJS from '../lib-jitsi-meet';\nimport { useConferenceStore, useConfigStore } from '../store';\nimport { useConnectionStore } from '../store/connection';\nimport { INTERNAL_EVENTS } from '../utils';\nimport { tryCatch } from '../utils/try-catch';\nimport { createConference } from './conference';\n\nexport function connect(roomName: string) {\n const options = useConnectionStore.getState().connectionConfig;\n const jwt = useConnectionStore.getState().jwt;\n const iAmRecorder = useConfigStore.getState().iAmRecorder;\n\n if (options && iAmRecorder) {\n options.p2p = {\n enabled: false,\n };\n }\n\n const connection = new JitsiMeetJS.JitsiConnection(null, jwt, options);\n\n useConnectionStore.getState().connectionWillConnect(connection);\n\n connection.addEventListener(\n JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED,\n onConnectionEstablished,\n );\n connection.addEventListener(\n JitsiMeetJS.events.connection.CONNECTION_FAILED,\n onConnectionFailed,\n );\n connection.addEventListener(\n JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED,\n onDisconnected,\n );\n connection.addEventListener(\n JitsiMeetJS.events.connection.PROPERTIES_UPDATED,\n onPropertiesUpdated,\n );\n\n async function onConnectionEstablished() {\n useConnectionStore.getState().connectionEstablished(connection);\n eventBus.publish({\n type: INTERNAL_EVENTS.onConnectionEstablished,\n });\n const result = await tryCatch(createConference(connection, roomName));\n if (result.error) {\n console.error('Error creating conference', result.error);\n useConferenceStore.setState({\n conferenceStatus: 'error',\n conferenceJoined: false,\n conferenceError: result.error.message,\n });\n }\n }\n\n function onConnectionFailed(err: string, message: string, ...args: any[]) {\n unsubscribe();\n console.error('Connection failed', err, message, args);\n // err === 'connection.passwordRequired'\n // err === 'connection.otherError'\n\n // TODO: handle args options properly\n // const todoArgs = [\n // 'connection.otherError',\n // 'The WebSocket connection could not be established or was disconnected.',\n // null,\n // {\n // suspend_time: 22147,\n // time_since_last_success: 51900,\n // },\n // ];\n useConnectionStore.getState().connectionFailed(message);\n // reconnectSession();\n // leaveSession();\n }\n\n function onDisconnected() {}\n\n function onPropertiesUpdated(properties: any) {\n // TODO: check if this is needed\n console.log('Properties updated', properties);\n }\n\n function unsubscribe() {\n connection.removeEventListener(\n JitsiMeetJS.events.connection.PROPERTIES_UPDATED,\n onPropertiesUpdated,\n );\n connection.removeEventListener(\n JitsiMeetJS.events.connection.CONNECTION_FAILED,\n onConnectionFailed,\n );\n connection.removeEventListener(\n JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED,\n onDisconnected,\n );\n }\n\n const xmpp_username_override = localStorage.getItem('xmpp_username_override');\n const xmpp_password_override = localStorage.getItem('xmpp_password_override');\n\n if (xmpp_username_override && xmpp_password_override) {\n connection.addFeature('http://jitsi.org/protocol/jibri');\n connection.connect({\n id: xmpp_username_override,\n password: xmpp_password_override,\n });\n } else {\n connection.connect();\n }\n}\n","export function runOnce<T extends (...args: any[]) => any>(fn: T): T {\n let called = false;\n let result: ReturnType<T>;\n\n return function (this: any, ...args: Parameters<T>): ReturnType<T> {\n if (!called) {\n called = true;\n result = fn.apply(this, args);\n }\n return result;\n } as T;\n}\n","import JitsiMeetJS from '../lib-jitsi-meet';\nimport { useBaseStore, useConfigStore } from '../store';\nimport { runOnce } from '../utils/run-once-hof';\n\nexport function areDevicesDifferent(\n existingDevices: MediaDeviceInfo[] = [],\n newDevices: MediaDeviceInfo[] = [],\n) {\n if (existingDevices.length !== newDevices.length) {\n return true;\n }\n\n for (let existingDevice of existingDevices) {\n const found = newDevices.find(\n ({ deviceId, groupId, kind, label }) =>\n existingDevice.deviceId === deviceId &&\n existingDevice.groupId === groupId &&\n existingDevice.kind === kind &&\n existingDevice.label === label,\n );\n\n if (!found) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isLabelEmpty() {\n const audioInputDevices = useBaseStore.getState().audioInputDevices;\n const videoInputDevices = useBaseStore.getState().videoInputDevices;\n const devices = [...audioInputDevices, ...videoInputDevices];\n const sessionType = useConfigStore.getState().sessionType;\n if (\n devices\n .filter(device => device.kind === 'audioinput' || sessionType === 'VIDEO')\n .some(device => device.label === '')\n ) {\n return true;\n }\n return false;\n}\n\nexport function updateInputOutputDevices(onlyUpdateIfLabelIsEmpty = false) {\n if (onlyUpdateIfLabelIsEmpty && isLabelEmpty()) {\n return;\n }\n\n const { mediaDevices } = JitsiMeetJS;\n\n if (mediaDevices.isDeviceChangeAvailable()) {\n mediaDevices.enumerateDevices((devices: MediaDeviceInfo[]) => {\n const audioInputDevices = devices.filter(\n (device): device is MediaDeviceInfo & { kind: 'audioinput' } =>\n device.kind === 'audioinput' && device.deviceId !== '',\n );\n const audioOutputDevices = devices.filter(\n (device): device is MediaDeviceInfo & { kind: 'audiooutput' } =>\n device.kind === 'audiooutput' && device.deviceId !== '',\n );\n const videoInputDevices = devices.filter(\n (device): device is MediaDeviceInfo & { kind: 'videoinput' } =>\n device.kind === 'videoinput' && device.deviceId !== '',\n );\n useBaseStore.setState({\n audioInputDevices: audioInputDevices,\n audioOutputDevices: audioOutputDevices,\n videoInputDevices: videoInputDevices,\n });\n });\n }\n}\n\nfunction _initDeviceList() {\n const { mediaDevices } = JitsiMeetJS;\n mediaDevices.addEventListener(\n JitsiMeetJS.events.mediaDevices.DEVICE_LIST_CHANGED,\n (devices: MediaDeviceInfo[]) => {\n const existingAudioInputDevices = useBaseStore.getState()\n .audioInputDevices as MediaDeviceInfo[];\n const existingAudioOutputDevices = useBaseStore.getState()\n .audioOutputDevices as MediaDeviceInfo[];\n const existingVideoInputDevices = useBaseStore.getState()\n .videoInputDevices as MediaDeviceInfo[];\n const existingDevices = existingAudioInputDevices.concat(\n existingAudioOutputDevices,\n existingVideoInputDevices,\n );\n setTimeout(() => {\n if (areDevicesDifferent(existingDevices, devices)) {\n updateInputOutputDevices();\n }\n }, 0);\n },\n );\n\n updateInputOutputDevices();\n}\n\nexport const initDeviceList = runOnce(_initDeviceList);\n","import { onTrack } from '../event-listeners';\nimport { eventBus } from '../event-manager';\nimport JitsiMeetJS from '../lib-jitsi-meet';\nimport { useBaseStore, useParticipantStore, useTracksStore } from '../store';\nimport { EVENT_LISTENER_METHODS, MEDIA_TYPE } from '../utils';\nimport { sendParticipantEvent } from '../utils/send-participant-event';\n\nexport function startScreenSharing() {\n const desktopSharingFrameRate =\n useBaseStore.getState().desktopSharingFrameRate;\n JitsiMeetJS.createLocalTracks({\n devices: ['desktop'],\n desktopSharingFrameRate,\n })\n .then((tracks: any) => {\n const desktopVideoTrack = tracks.find(\n (track: any) => track.getType() === 'video',\n );\n const desktopAudioTrack = tracks.find(\n (track: any) => track.getType() === 'audio',\n );\n if (desktopAudioTrack) {\n // TODO: Handle audio track\n // We need to implement AudioMixer etc.\n desktopAudioTrack.dispose();\n }\n if (desktopVideoTrack) {\n onTrack(desktopVideoTrack);\n }\n })\n .catch((error: any) => {\n console.error('Error starting screen share:', error);\n });\n}\n\nexport function stopScreenSharing() {\n useTracksStore.getState().updateLocalTrack(MEDIA_TYPE.SCREENSHARE, {\n muted: 1,\n });\n}\n\nexport function addScreenShareParticipant(track: any) {\n if (!track || track.isMuted()) {\n return;\n }\n const participants = useParticipantStore.getState().participants;\n const localParticipant = useParticipantStore.getState().localParticipant;\n const participant = track.isLocal()\n ? localParticipant\n : participants.find(p => p.pid === track.getParticipantId());\n if (!participant) {\n console.error('Participant not found:', track.getParticipantId());\n return;\n }\n useParticipantStore.getState().addVirtualParticipant({\n ...participant,\n type: 'screen-share',\n name: participant.name,\n ruid: `${participant.pid}-screen-share`,\n });\n // Auto-pin the screen share participant\n useParticipantStore\n .getState()\n .pinParticipant(participant.pid, 'screen-share');\n if (track.isLocal()) {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.MediaEventsListener.onScreenShareStarted,\n });\n } else {\n sendParticipantEvent(\n EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantStartedScreenShare,\n participant.pid,\n );\n }\n}\n\nexport function removeScreenShareParticipant(participantId: string) {\n useParticipantStore\n .getState()\n .removeVirtualParticipant(participantId, 'screen-share');\n const localParticipantId =\n useParticipantStore.getState().localParticipant.pid;\n if (localParticipantId === participantId) {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.MediaEventsListener.onScreenShareStopped,\n });\n } else {\n sendParticipantEvent(\n EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantStoppedScreenShare,\n participantId,\n );\n }\n}\n","import { useBaseStore } from '../base';\nimport { useConferenceStore } from '../conference';\nimport { useConfigStore } from '../config';\nimport { useConnectionStore } from '../connection';\nimport { useParticipantStore } from '../participants';\nimport { useTracksStore } from '../tracks';\n\n// Reset all stores to their initial state\nexport function resetAllStores() {\n useBaseStore.getState().reset();\n useConferenceStore.getState().reset();\n useConfigStore.getState().reset();\n useConnectionStore.getState().reset();\n useParticipantStore.getState().reset();\n useTracksStore.getState().reset();\n}\n","export class Mutex {\n private lock: Promise<void> = Promise.resolve();\n\n /**\n * Runs the provided function exclusively, ensuring\n * only one runs at a time in order of requests.\n */\n async run<T>(fn: () => Promise<T> | T): Promise<T> {\n let release: () => void;\n\n // Create a promise that resolves when this lock is released\n const wait = new Promise<void>(resolve => {\n release = resolve;\n });\n\n // Store the current lock so the next call waits for it\n const previousLock = this.lock;\n this.lock = previousLock.then(() => wait);\n\n // Wait for previous execution to complete\n await previousLock;\n\n try {\n // Execute the provided function and return its result\n return await fn();\n } finally {\n // Release the lock so the next queued call can proceed\n release!();\n }\n }\n}\n","import JitsiMeetJS from '../lib-jitsi-meet';\n\nexport function initializeLib() {\n JitsiMeetJS.init();\n console.log('JitsiMeetJS initialized successfully.');\n}\n","import { eventBus } from '../event-manager';\nimport {\n disposeLocalTracks,\n useBaseStore,\n useConfigStore,\n useConnectionStore,\n useTracksStore,\n} from '../store';\nimport { useConferenceStore } from '../store/conference';\nimport { resetAllStores } from '../store/utils/reset';\nimport { SESSION_TYPE, tryCatchSync } from '../utils';\nimport { Mutex } from '../utils/mutex';\nimport { connect } from './connection';\nimport { initDeviceList } from './devices';\nimport { initializeLib } from './init';\nimport { createLocalTrack, updateAudioOutputDevice } from './track';\n\nlet isSessionStarted = false;\nlet reconnectTimeoutId: NodeJS.Timeout | null = null;\nconst RECONNECT_DEBOUNCE_DELAY = 3000;\n\nexport function startSession() {\n const sessionId = useConfigStore.getState().sessionId;\n if (!sessionId) {\n console.error('Session ID is required to start a session');\n return;\n }\n if (isSessionStarted) {\n console.log('Session already started');\n return;\n }\n isSessionStarted = true;\n console.log(`Session started in room: ${sessionId}`);\n initializeLib();\n const audioInputDeviceId =\n useConfigStore.getState().audioInputDeviceId ??\n useBaseStore.getState().audioInputDevice?.deviceId;\n createLocalTrack('audio', audioInputDeviceId);\n const sessionType = useConfigStore.getState().sessionType;\n if (sessionType === SESSION_TYPE.VIDEO) {\n const videoInputDeviceIdP1 = useConfigStore.getState().videoInputDeviceId;\n const videoInputDeviceIdP2 =\n useBaseStore.getState().videoInputDevice?.deviceId;\n const initialCameraFacingP1 = useConfigStore.getState().initialCameraFacing;\n const initialCameraFacingP2 = useBaseStore.getState().cameraFacing;\n\n if (videoInputDeviceIdP1) {\n createLocalTrack('video', videoInputDeviceIdP1);\n } else if (initialCameraFacingP1) {\n createLocalTrack('video', null, initialCameraFacingP2);\n } else {\n createLocalTrack('video', videoInputDeviceIdP2, initialCameraFacingP2);\n }\n }\n const audioOutputDeviceId =\n useConfigStore.getState().audioOutputDeviceId ??\n useBaseStore.getState().audioOutputDevice?.deviceId;\n if (audioOutputDeviceId) {\n updateAudioOutputDevice(audioOutputDeviceId);\n }\n eventBus.startEmitting();\n const test = tryCatchSync(() => connect(sessionId));\n if (test.error) {\n console.error('Error connecting to session:', test.error);\n // TODO: Handle connection error\n useConnectionStore.getState().connectionFailed(test.error.message);\n return;\n }\n initDeviceList();\n}\n\nasync function _leaveSession() {\n if (isSessionStarted === false) {\n return;\n }\n isSessionStarted = false;\n await Promise.all([\n disposeLocalTracks(),\n useConferenceStore.getState().leaveConference(),\n ]);\n await useConnectionStore.getState().disconnect();\n}\n\nconst sessionMutex = new Mutex();\nexport function leaveSession() {\n return sessionMutex.run(async () => {\n useBaseStore.getState().clearIdealTimeoutTimer();\n cancelPendingReconnect();\n await _leaveSession();\n resetAllStores();\n });\n}\n\nexport async function leaveSessionDueToIdleTimeout() {\n eventBus.publish({\n type: 'onSessionTimedOut',\n });\n await leaveSession();\n}\n\nexport async function reconnectSession() {\n // Clear any existing timeout to debounce rapid calls\n if (reconnectTimeoutId) {\n clearTimeout(reconnectTimeoutId);\n reconnectTimeoutId = null;\n }\n\n // Debounce the function call\n return new Promise<void>((resolve, reject) => {\n reconnectTimeoutId = setTimeout(async () => {\n try {\n await _reconnectSession();\n resolve();\n } catch (error) {\n reject(error);\n } finally {\n reconnectTimeoutId = null;\n }\n }, RECONNECT_DEBOUNCE_DELAY);\n });\n}\n\nexport function cancelPendingReconnect() {\n if (reconnectTimeoutId) {\n clearTimeout(reconnectTimeoutId);\n reconnectTimeoutId = null;\n console.log('Cancelled pending reconnect');\n }\n}\n\nasync function _reconnectSession() {\n const retryCount = useBaseStore.getState().connectionRetryCount;\n if (retryCount >= 3 && isSessionStarted === true) {\n console.warn('Maximum retry attempts reached. Leaving session.');\n await leaveSession();\n return;\n }\n useBaseStore.getState().incrementConnectionRetryCount();\n await _leaveSession();\n useConnectionStore.getState().reset();\n useConferenceStore.getState().reset();\n useTracksStore.getState().reset();\n startSession();\n}\n","import { stopScreenSharing, updateInputOutputDevices } from '../handlers';\nimport JitsiMeetJS from '../lib-jitsi-meet';\nimport { getLocalTrack, useTracksStore } from '../store/tracks';\nimport { getMediaType } from '../utils';\n\nexport function onTrack(track: any) {\n if (track.isLocal()) {\n updateInputOutputDevices(true);\n const muted = getLocalTrack(track.getType())?.muted;\n useTracksStore.getState().updateLocalTrack(getMediaType(track), {\n originalTrack: track,\n ...(track.getVideoType() === 'desktop'\n ? {\n muted: 0,\n }\n : typeof muted === 'boolean'\n ? { muted }\n : {}),\n });\n track.on(JitsiMeetJS.events.track.LOCAL_TRACK_STOPPED, (t: any) => {\n if (t.getVideoType() === 'desktop') {\n stopScreenSharing();\n }\n });\n } else {\n useTracksStore.getState().addTrack(track);\n }\n\n // Remove existing listeners before adding new ones to prevent memory leaks\n // This can happen during P2P to JVB transitions when tracks are re-added\n track.removeAllListeners(JitsiMeetJS.events.track.TRACK_MUTE_CHANGED);\n track.removeAllListeners(JitsiMeetJS.events.track.TRACK_VIDEOTYPE_CHANGED);\n\n track.on(JitsiMeetJS.events.track.TRACK_MUTE_CHANGED, (t: any) => {\n if (t.isLocal()) {\n return;\n }\n useTracksStore.getState().updateTrack(t, {\n muted: t.isMuted() ? 1 : 0,\n });\n });\n track.on(\n JitsiMeetJS.events.track.TRACK_VIDEOTYPE_CHANGED,\n (type: 'desktop' | 'camera') => {\n useTracksStore.getState().updateTrack(track, {\n videoType: type,\n mediaType: type === 'desktop' ? 'screenshare' : 'video',\n });\n },\n );\n}\n","{\n \"header\": {\n \"layouts\": {\n \"tileView\": \"Tile View\",\n \"sideLayout\": \"Side Layout\",\n \"spotlight\": \"Spotlight\"\n }\n },\n \"controlPanel\": {\n \"audioControl\": {\n \"muteMicrophone\": \"Mute microphone\",\n \"unmuteMicrophone\": \"Unmute microphone\",\n \"audioDeviceOptions\": \"Audio device options\",\n \"audioSettings\": \"Audio settings\"\n },\n \"videoControl\": {\n \"turnOffCamera\": \"Turn off camera\",\n \"turnOnCamera\": \"Turn on camera\",\n \"videoDeviceOptions\": \"Video device options\",\n \"videoSettings\": \"Video settings\"\n },\n \"settingsDialog\": {\n \"todo\": \"// TODO: Revisit this section\",\n \"title\": \"Settings\",\n \"tabs\": {\n \"audio\": \"Audio\",\n \"video\": \"Video\"\n },\n \"deviceLabels\": {\n \"microphone\": \"Microphone\",\n \"speaker\": \"Speaker\",\n \"camera\": \"Camera\",\n \"frameRate\": \"Desktop sharing frame rate\"\n },\n \"deviceStates\": {\n \"noMicrophoneSelected\": \"No microphone selected\",\n \"noSpeakerSelected\": \"No speaker selected\",\n \"noCameraSelected\": \"No camera selected\"\n },\n \"audioSettings\": {\n \"enableNoiseReduction\": \"Enable noise reduction\"\n },\n \"videoSettings\": {\n \"mirrorMyVideo\": \"Mirror my video\",\n \"selectCameraToSeePreview\": \"Select a camera to see preview\",\n \"loadingCameraPreview\": \"Loading camera preview...\",\n \"frameRateUnit\": \"frames per second\",\n \"frameRateNotice\": \"You need to restart the screen share for the new settings to take effect.\"\n },\n \"permissions\": {\n \"errorTitle\": \"Some permissions are missing\",\n \"microphoneBlocked\": \"Access to your microphone is blocked. Please check your browser settings.\",\n \"cameraBlocked\": \"Access to your camera is blocked. Please check your browser settings.\",\n \"microphoneAndCameraBlocked\": \"Access to your microphone and camera is blocked. Please check your browser settings.\"\n },\n \"buttons\": {\n \"cancel\": \"Cancel\",\n \"done\": \"Done\"\n }\n },\n \"recording\": {\n \"startRecording\": \"Start recording\",\n \"stopRecording\": \"Stop recording\",\n \"startRecordingConfirmation\": \"Recording will capture video, audio, and screen sharing from this call.\",\n \"stopRecordingConfirmation\": \"Stopping will end the recording of video, audio, and screen sharing from this call.\",\n \"cancel\": \"Cancel\"\n },\n \"raiseHand\": \"Raise hand\",\n \"lowerHand\": \"Lower hand\",\n \"startScreenSharing\": \"Start screen sharing\",\n \"stopScreenSharing\": \"Stop screen sharing\",\n \"moreOptions\": \"More options\",\n \"leaveSession\": \"Leave session\",\n \"reactions\": \"Reactions\"\n },\n \"idealTimeout\": {\n \"title\": \"Are you still there?\",\n \"subtitle\": \"You are the only one here, so this call will end in less than {minutes} minute{plural}. Do you want to stay in this call?\",\n \"buttons\": {\n \"stayInCall\": \"Stay in the call\",\n \"leaveNow\": \"Leave now\"\n }\n },\n \"participantList\": {\n \"header\": {\n \"title\": \"Participants\",\n \"closeButton\": \"Close participants list\"\n },\n \"search\": {\n \"placeholder\": \"Search Participant\"\n },\n \"emptyState\": {\n \"title\": \"No participants found\",\n \"subtitle\": \"No participants match your search\"\n }\n },\n \"virtualBackground\": {\n \"title\": \"Virtual Background\",\n \"addBackground\": \"Add Background\",\n \"noCameraFeed\": \"No camera feed detected\",\n \"buttons\": {\n \"cancel\": \"Cancel\",\n \"done\": \"Done\"\n }\n },\n \"general\": {\n \"error\": \"Something went wrong, please try again.\"\n },\n \"other\": {}\n}\n","import { create } from 'zustand';\nimport { combine, subscribeWithSelector } from 'zustand/middleware';\nimport enUS from './translations/en-US.json';\n\ntype CometChatSupportedLocale = 'en-US';\n\nexport type TranslationResource = typeof enUS;\n\ninterface TranslationState {\n translations: Record<string, typeof enUS>;\n currentLocale:\n | CometChatSupportedLocale\n | Omit<string, CometChatSupportedLocale>;\n}\n\nconst initialState: TranslationState = {\n translations: {\n 'en-US': enUS,\n },\n currentLocale: 'en-US',\n};\n\nexport const useTranslationStore = create(\n subscribeWithSelector(\n combine(initialState, set => ({\n reset: () => set(initialState),\n setLocale: (locale: CometChatSupportedLocale) =>\n set(() => ({\n currentLocale: locale,\n })),\n })),\n ),\n);\n","import type { Paths } from '@cometchat/calls-sdk-core';\nimport { useTranslationStore, type TranslationResource } from './state';\n\nfunction get(obj: Record<string, TranslationResource>, path: string) {\n const keys = path.split('.');\n let result: unknown = obj;\n\n for (const key of keys) {\n if (result == null || typeof result !== 'object') {\n return '';\n }\n result = (result as Record<string, unknown>)[key];\n }\n\n return result as string;\n}\n\nexport const useTranslation = () => {\n const { translations, currentLocale } = useTranslationStore();\n\n const t = (key: Paths<TranslationResource>): string => {\n return get(translations, `${currentLocale}.${key}`);\n };\n\n return {\n t,\n currentLocale,\n translations,\n };\n};\n","import * as v from 'valibot';\n\nconst RegionLiteralSchema = v.union([\n v.literal('eu'),\n v.literal('us'),\n v.literal('in'),\n v.literal('EU'),\n v.literal('US'),\n v.literal('IN'),\n]);\n\nexport const RegionSchema = v.pipe(\n v.string(),\n v.transform(value => value.toLowerCase()),\n RegionLiteralSchema,\n);\n\nexport const CallAppSettingsSchema = v.object({\n appId: v.string(),\n region: RegionSchema,\n authKey: v.optional(v.string()),\n adminHost: v.optional(v.string()),\n clientHost: v.optional(v.string()),\n host: v.optional(v.string()),\n});\n\nexport type CallAppSettings = v.InferOutput<typeof CallAppSettingsSchema>;\n","import {\n EVENT_LISTENER_METHODS_MOBILE as EVENT_LISTENER_METHODS,\n eventBus,\n MobileSDKEvents,\n} from '@cometchat/calls-sdk-core';\nimport { NativeModules } from 'react-native';\n\nconst CometChatEvent: MobileSDKEvents = new Proxy(\n NativeModules.CometChatEvent ?? {},\n {\n get: (\n target: Partial<MobileSDKEvents>,\n property: keyof MobileSDKEvents,\n ) => {\n if (typeof target[property] === 'function') {\n return target[property];\n }\n return () => {\n // console.error(\n // `CometChatEvent.${property} is not a function or does not exist.`,\n // );\n };\n },\n },\n);\n\n// SessionStatusListener\neventBus.subscribe(\n EVENT_LISTENER_METHODS.SessionStatusListener.onSessionJoined,\n CometChatEvent.onSessionJoined,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.SessionStatusListener.onSessionLeft,\n CometChatEvent.onSessionLeft,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.SessionStatusListener.onConnectionLost,\n CometChatEvent.onConnectionLost,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.SessionStatusListener.onConnectionRestored,\n CometChatEvent.onConnectionRestored,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.SessionStatusListener.onConnectionClosed,\n CometChatEvent.onConnectionClosed,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.SessionStatusListener.onSessionTimedOut,\n CometChatEvent.onSessionTimedOut,\n);\n\n// MediaEventsListener\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onAudioMuted,\n CometChatEvent.onAudioMuted,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onAudioUnMuted,\n CometChatEvent.onAudioUnMuted,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onVideoPaused,\n CometChatEvent.onVideoPaused,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onVideoResumed,\n CometChatEvent.onVideoResumed,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onRecordingStarted,\n CometChatEvent.onRecordingStarted,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onRecordingStopped,\n CometChatEvent.onRecordingStopped,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onScreenShareStarted,\n CometChatEvent.onScreenShareStarted,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onScreenShareStopped,\n CometChatEvent.onScreenShareStopped,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onAudioModeChanged,\n CometChatEvent.onAudioModeChanged,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.MediaEventsListener.onCameraFacingChanged,\n CometChatEvent.onCameraFacingChanged,\n);\n\n// ParticipantEventsListner\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantJoined,\n CometChatEvent.onParticipantJoined,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantLeft,\n CometChatEvent.onParticipantLeft,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantAudioMuted,\n CometChatEvent.onParticipantAudioMuted,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantAudioUnmuted,\n CometChatEvent.onParticipantAudioUnmuted,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantVideoPaused,\n CometChatEvent.onParticipantVideoPaused,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantVideoResumed,\n CometChatEvent.onParticipantVideoResumed,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantHandRaised,\n CometChatEvent.onParticipantHandRaised,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantHandLowered,\n CometChatEvent.onParticipantHandLowered,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantStartedScreenShare,\n CometChatEvent.onParticipantStartedScreenShare,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner\n .onParticipantStoppedScreenShare,\n CometChatEvent.onParticipantStoppedScreenShare,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantStartedRecording,\n CometChatEvent.onParticipantStartedRecording,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantStoppedRecording,\n CometChatEvent.onParticipantStoppedRecording,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onDominantSpeakerChanged,\n CometChatEvent.onDominantSpeakerChanged,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ParticipantEventsListner.onParticipantListChanged,\n CometChatEvent.onParticipantListChanged,\n);\n\n// ButtonClickListener\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onLeaveSessionButtonClicked,\n CometChatEvent.onLeaveSessionButtonClicked,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onRaiseHandButtonClicked,\n CometChatEvent.onRaiseHandButtonClicked,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onShareInviteButtonClicked,\n CometChatEvent.onShareInviteButtonClicked,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onChangeLayoutButtonClicked,\n CometChatEvent.onChangeLayoutButtonClicked,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onParticipantListButtonClicked,\n CometChatEvent.onParticipantListButtonClicked,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onToggleAudioButtonClicked,\n CometChatEvent.onToggleAudioButtonClicked,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onToggleVideoButtonClicked,\n CometChatEvent.onToggleVideoButtonClicked,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onSwitchCameraButtonClicked,\n CometChatEvent.onSwitchCameraButtonClicked,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onChatButtonClicked,\n CometChatEvent.onChatButtonClicked,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.ButtonClickListener.onRecordingToggleButtonClicked,\n CometChatEvent.onRecordingToggleButtonClicked,\n);\n\n// CallLayoutListener\neventBus.subscribe(\n EVENT_LISTENER_METHODS.CallLayoutListener.onCallLayoutChanged,\n CometChatEvent.onCallLayoutChanged,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.CallLayoutListener.onParticipantListVisible,\n CometChatEvent.onParticipantListVisible,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.CallLayoutListener.onParticipantListHidden,\n CometChatEvent.onParticipantListHidden,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.CallLayoutListener.onPictureInPictureLayoutEnabled,\n CometChatEvent.onPictureInPictureLayoutEnabled,\n);\neventBus.subscribe(\n EVENT_LISTENER_METHODS.CallLayoutListener.onPictureInPictureLayoutDisabled,\n CometChatEvent.onPictureInPictureLayoutDisabled,\n);\n","import {\n disablePictureInPictureLayout,\n enablePictureInPictureLayout,\n leaveSession,\n muteAudioTrack,\n muteParticipant,\n pauseParticipantVideo,\n pauseVideoTrack,\n resumeVideoTrack,\n setChatButtonUnreadCount,\n switchCamera,\n unMuteAudioTrack,\n useBaseStore,\n} from '@cometchat/calls-sdk-core';\nimport {\n DeviceEventEmitter,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nconst constants = {\n MUTE_AUDIO: 'MUTE_AUDIO',\n UNMUTE_AUDIO: 'UNMUTE_AUDIO',\n\n PAUSE_VIDEO: 'PAUSE_VIDEO',\n RESUME_VIDEO: 'RESUME_VIDEO',\n\n ENABLE_PICTURE_IN_PICTURE_LAYOUT: 'ENABLE_PICTURE_IN_PICTURE_LAYOUT',\n DISABLE_PICTURE_IN_PICTURE_LAYOUT: 'DISABLE_PICTURE_IN_PICTURE_LAYOUT',\n\n LEAVE_SESSION: 'LEAVE_SESSION',\n\n RAISE_HAND: 'RAISE_HAND',\n LOWER_HAND: 'LOWER_HAND',\n\n MUTE_PARTICIPANT: 'MUTE_PARTICIPANT',\n PAUSE_PARTICIPANT_VIDEO: 'PAUSE_PARTICIPANT_VIDEO',\n\n PIN_PARTICIPANT: 'PIN_PARTICIPANT',\n UNPIN_PARTICIPANT: 'UNPIN_PARTICIPANT',\n\n SET_AUDIO_MODE: 'SET_AUDIO_MODE',\n SET_LAYOUT: 'SET_LAYOUT',\n SWITCH_CAMERA: 'SWITCH_CAMERA',\n\n START_RECORDING: 'START_RECORDING',\n STOP_RECORDING: 'STOP_RECORDING',\n\n START_SCREEN_SHARE: 'START_SCREEN_SHARE',\n STOP_SCREEN_SHARE: 'STOP_SCREEN_SHARE',\n\n SET_CHAT_BUTTON_UNREAD_COUNT: 'SET_CHAT_BUTTON_UNREAD_COUNT',\n};\n\nexport function setupNativeEventListeners() {\n const { CometChatEventEmitter } = NativeModules;\n\n const eventEmitter = Platform.select({\n default: CometChatEventEmitter\n ? new NativeEventEmitter(CometChatEventEmitter)\n : null,\n android: DeviceEventEmitter,\n });\n const subscriptions: any[] = [];\n\n if (!eventEmitter) {\n return;\n }\n\n const muteAudioSub = eventEmitter.addListener(constants.MUTE_AUDIO, event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.MUTE_AUDIO,\n event,\n );\n muteAudioTrack();\n });\n subscriptions.push(muteAudioSub);\n\n const unMuteAudioSub = eventEmitter.addListener(\n constants.UNMUTE_AUDIO,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.UNMUTE_AUDIO,\n event,\n );\n unMuteAudioTrack();\n },\n );\n subscriptions.push(unMuteAudioSub);\n\n const pauseVideoSub = eventEmitter.addListener(\n constants.PAUSE_VIDEO,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.PAUSE_VIDEO,\n event,\n );\n pauseVideoTrack();\n },\n );\n subscriptions.push(pauseVideoSub);\n\n const resumeVideoSub = eventEmitter.addListener(\n constants.RESUME_VIDEO,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.RESUME_VIDEO,\n event,\n );\n resumeVideoTrack();\n },\n );\n subscriptions.push(resumeVideoSub);\n\n const enablePiPSub = eventEmitter.addListener(\n constants.ENABLE_PICTURE_IN_PICTURE_LAYOUT,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.ENABLE_PICTURE_IN_PICTURE_LAYOUT,\n event,\n );\n enablePictureInPictureLayout();\n },\n );\n subscriptions.push(enablePiPSub);\n\n const disablePiPSub = eventEmitter.addListener(\n constants.DISABLE_PICTURE_IN_PICTURE_LAYOUT,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.DISABLE_PICTURE_IN_PICTURE_LAYOUT,\n event,\n );\n disablePictureInPictureLayout();\n },\n );\n subscriptions.push(disablePiPSub);\n\n const leaveSessionSub = eventEmitter.addListener(\n constants.LEAVE_SESSION,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.LEAVE_SESSION,\n event,\n );\n leaveSession();\n },\n );\n subscriptions.push(leaveSessionSub);\n\n const raiseHandSub = eventEmitter.addListener(constants.RAISE_HAND, event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.RAISE_HAND,\n event,\n );\n });\n subscriptions.push(raiseHandSub);\n\n const lowerHandSub = eventEmitter.addListener(constants.LOWER_HAND, event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.LOWER_HAND,\n event,\n );\n });\n subscriptions.push(lowerHandSub);\n\n const muteParticipantSub = eventEmitter.addListener(\n constants.MUTE_PARTICIPANT,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.MUTE_PARTICIPANT,\n event,\n );\n if (typeof event.pid === 'string') {\n muteParticipant(event.pid);\n }\n },\n );\n subscriptions.push(muteParticipantSub);\n\n const pauseParticipantVideoSub = eventEmitter.addListener(\n constants.PAUSE_PARTICIPANT_VIDEO,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.PAUSE_PARTICIPANT_VIDEO,\n event,\n );\n if (typeof event.pid === 'string') {\n pauseParticipantVideo(event.pid);\n }\n },\n );\n subscriptions.push(pauseParticipantVideoSub);\n\n const pinParticipantSub = eventEmitter.addListener(\n constants.PIN_PARTICIPANT,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.PIN_PARTICIPANT,\n event,\n );\n },\n );\n subscriptions.push(pinParticipantSub);\n\n const unPinParticipantSub = eventEmitter.addListener(\n constants.UNPIN_PARTICIPANT,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.UNPIN_PARTICIPANT,\n event,\n );\n },\n );\n subscriptions.push(unPinParticipantSub);\n\n const setAudioModeSub = eventEmitter.addListener(\n constants.SET_AUDIO_MODE,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.SET_AUDIO_MODE,\n event,\n );\n },\n );\n subscriptions.push(setAudioModeSub);\n\n const setLayoutSub = eventEmitter.addListener(constants.SET_LAYOUT, event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.SET_LAYOUT,\n event,\n );\n });\n subscriptions.push(setLayoutSub);\n\n const switchCameraSub = eventEmitter.addListener(\n constants.SWITCH_CAMERA,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.SWITCH_CAMERA,\n event,\n );\n switchCamera();\n },\n );\n subscriptions.push(switchCameraSub);\n\n const startRecordingSub = eventEmitter.addListener(\n constants.START_RECORDING,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.START_RECORDING,\n event,\n );\n },\n );\n subscriptions.push(startRecordingSub);\n\n const stopRecordingSub = eventEmitter.addListener(\n constants.STOP_RECORDING,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.STOP_RECORDING,\n event,\n );\n },\n );\n subscriptions.push(stopRecordingSub);\n\n const startScreenSharingSub = eventEmitter.addListener(\n constants.START_SCREEN_SHARE,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.START_SCREEN_SHARE,\n event,\n );\n },\n );\n subscriptions.push(startScreenSharingSub);\n\n const stopScreenShareSub = eventEmitter.addListener(\n constants.STOP_SCREEN_SHARE,\n event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.STOP_SCREEN_SHARE,\n event,\n );\n },\n );\n subscriptions.push(stopScreenShareSub);\n\n eventEmitter.addListener(constants.SET_CHAT_BUTTON_UNREAD_COUNT, event => {\n console.log(\n 'Event received from EventEmitter:',\n constants.SET_CHAT_BUTTON_UNREAD_COUNT,\n event,\n );\n if (typeof event.count === 'number') {\n setChatButtonUnreadCount(event.count);\n }\n });\n\n // TODO: Remove subscriptions when the component unmounts or when conference ends or when needed\n useBaseStore.getState().addSubscriptions(subscriptions);\n}\n\n// eventBus.subscribe('onSessionJoined', setupNativeEventListeners);\nsetupNativeEventListeners();\n","import { NativeEventEmitter, NativeModules } from 'react-native';\n\n/**\n * Audio device types supported by the AudioMode module\n */\nexport type AudioDevice = 'BLUETOOTH' | 'EARPIECE' | 'HEADPHONES' | 'SPEAKER';\n\n/**\n * Audio modes supported by the AudioMode module\n */\nexport enum AudioMode {\n /** Default mode used before and after calls */\n DEFAULT = 0,\n /** Audio-only calls mode (uses earpiece by default) */\n AUDIO_CALL = 1,\n /** Video calls mode (uses speaker by default) */\n VIDEO_CALL = 2,\n}\n\n/**\n * Device information structure returned in device change events\n */\nexport interface AudioDeviceInfo {\n type: AudioDevice;\n selected: boolean;\n}\n\ninterface AudioModeModuleInterface {\n /**\n * Audio mode constants\n */\n readonly DEFAULT: number;\n readonly AUDIO_CALL: number;\n readonly VIDEO_CALL: number;\n readonly DEVICE_CHANGE_EVENT: string;\n\n /**\n * Add a listener for React Native events (required for RN built-in Event Emitter)\n * @param eventName - The name of the event to listen for\n */\n addListener: (eventName: string) => void;\n\n /**\n * Remove listeners for React Native events (required for RN built-in Event Emitter)\n * @param count - The number of listeners to remove\n */\n removeListeners: (count: number) => void;\n\n /**\n * Sets the user selected audio device as the active audio device\n * @param device - The desired audio device to activate\n */\n setAudioDevice: (device: AudioDevice) => void;\n\n /**\n * Sets the current audio mode\n * @param mode - The desired audio mode (DEFAULT, AUDIO_CALL, or VIDEO_CALL)\n * @returns Promise that resolves if successful, rejects with error message if failed\n */\n setMode: (mode: AudioMode | number) => Promise<void>;\n\n /**\n * Sets whether ConnectionService should be used for audio mode management\n * @param use - Boolean indicating whether to use ConnectionService\n */\n setUseConnectionService: (use: boolean) => void;\n\n /**\n * Updates the list of available audio devices\n */\n updateDeviceList: () => void;\n}\n\nconst AudioModeModule: AudioModeModuleInterface = NativeModules.AudioMode;\n\n/**\n * Event emitter for AudioMode module events\n */\nexport const AudioModeEventEmitter = new NativeEventEmitter(AudioModeModule);\n\nexport default AudioModeModule;\n","import {\n eventBus,\n INTERNAL_EVENTS,\n pauseVideoTrack,\n resumeVideoTrack,\n useBaseStore,\n VIDEO_PAUSE_AUTHORITY,\n} from '@cometchat/calls-sdk-core';\nimport { AppState } from 'react-native';\n\neventBus.subscribe(INTERNAL_EVENTS.lifecycle.componentDidMount, () => {\n AppState.addEventListener('change', appState => {\n useBaseStore.setState({\n appState: appState,\n });\n });\n});\n\nuseBaseStore.subscribe(\n state => state.appState,\n appState => {\n if (appState === 'active') {\n resumeVideoTrack(VIDEO_PAUSE_AUTHORITY.BACKGROUND);\n } else {\n pauseVideoTrack(VIDEO_PAUSE_AUTHORITY.BACKGROUND);\n }\n },\n);\n","import { NativeModules } from 'react-native';\n\ninterface KeepAwakeModuleInterface {\n activateKeepAwake: () => void;\n deactivateKeepAwake: () => void;\n}\n\nconst KeepAwakeModule: KeepAwakeModuleInterface = NativeModules.KeepAwakeModule;\n\nexport default KeepAwakeModule;\n","import { useConferenceStore } from '@cometchat/calls-sdk-core';\nimport KeepAwakeModule from '../native-communication/KeepAwakeModule';\n\nuseConferenceStore.subscribe(\n state => state.conferenceStatus,\n conferenceStatus => {\n if (conferenceStatus === 'joined' || conferenceStatus === 'restored') {\n KeepAwakeModule.activateKeepAwake();\n } else {\n KeepAwakeModule.deactivateKeepAwake();\n }\n },\n);\n","import {\n eventBus,\n INTERNAL_EVENTS,\n useTracksStore,\n} from '@cometchat/calls-sdk-core';\nimport { permissions } from 'react-native-webrtc';\n\nasync function queryPermissions() {\n try {\n const [cameraPermission, microphonePermission] = await Promise.all([\n permissions.query({ name: 'microphone' as PermissionName }),\n permissions.query({ name: 'camera' as PermissionName }),\n ]);\n\n useTracksStore.setState(state => ({\n permissions: {\n ...state.permissions,\n video: cameraPermission === 'granted',\n audio: microphonePermission === 'granted',\n initialized: true,\n },\n }));\n } catch (error) {\n console.warn('Failed to query permissions:', error);\n }\n}\n\neventBus.subscribe(INTERNAL_EVENTS.lifecycle.componentDidMount, () => {\n queryPermissions();\n});\n\neventBus.subscribe(INTERNAL_EVENTS.queryPermission, () => {\n queryPermissions();\n});\n","import { StyleSheet } from 'react-native';\n\n// Spacing Units\n// Define consistent spacing units to be used throughout the application\nexport const spacing = {\n base: 2,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 7: 28,\n 8: 32,\n 9: 36,\n 10: 40,\n 11: 44,\n 12: 48,\n 13: 52,\n 14: 56,\n 15: 60,\n 16: 64,\n 17: 68,\n 18: 72,\n 19: 76,\n 20: 80,\n max: 1000,\n} as const;\n\n// Padding values mapped to spacing units\nexport const padding = {\n base: spacing.base,\n 1: spacing[1],\n 2: spacing[2],\n 3: spacing[3],\n 4: spacing[4],\n 5: spacing[5],\n 6: spacing[6],\n 7: spacing[7],\n 8: spacing[8],\n 9: spacing[9],\n 10: spacing[10],\n} as const;\n\n// Margin values mapped to spacing units\nexport const margin = {\n base: spacing.base,\n 1: spacing[1],\n 2: spacing[2],\n 3: spacing[3],\n 4: spacing[4],\n 5: spacing[5],\n 6: spacing[6],\n 7: spacing[7],\n 8: spacing[8],\n 9: spacing[9],\n 10: spacing[10],\n 11: spacing[11],\n 12: spacing[12],\n 13: spacing[13],\n 14: spacing[14],\n 15: spacing[15],\n 16: spacing[16],\n 17: spacing[17],\n 18: spacing[18],\n 19: spacing[19],\n 20: spacing[20],\n} as const;\n\n// Border Radius values\nexport const borderRadius = {\n base: spacing.base,\n 1: spacing[1],\n 2: spacing[2],\n 3: spacing[3],\n 4: spacing[4],\n 5: spacing[5],\n 6: spacing[6],\n max: spacing.max,\n} as const;\n\n// Font Family\nexport const fontFamily = {\n primary: 'Roboto',\n} as const;\n\n// Typography styles\nexport const typography = {\n title: {\n bold: {\n fontFamily: fontFamily.primary,\n fontWeight: '700' as const,\n fontSize: 32,\n lineHeight: 38.4,\n },\n medium: {\n fontFamily: fontFamily.primary,\n fontWeight: '500' as const,\n fontSize: 32,\n lineHeight: 38.4,\n },\n regular: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 32,\n lineHeight: 38.4,\n },\n },\n heading1: {\n bold: {\n fontFamily: fontFamily.primary,\n fontWeight: '700' as const,\n fontSize: 24,\n lineHeight: 28.8,\n },\n medium: {\n fontFamily: fontFamily.primary,\n fontWeight: '500' as const,\n fontSize: 24,\n lineHeight: 28.8,\n },\n regular: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 24,\n lineHeight: 28.8,\n },\n },\n heading2: {\n bold: {\n fontFamily: fontFamily.primary,\n fontWeight: '700' as const,\n fontSize: 20,\n lineHeight: 24,\n },\n medium: {\n fontFamily: fontFamily.primary,\n fontWeight: '500' as const,\n fontSize: 20,\n lineHeight: 24,\n },\n regular: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 20,\n lineHeight: 24,\n },\n },\n heading3: {\n bold: {\n fontFamily: fontFamily.primary,\n fontWeight: '700' as const,\n fontSize: 18,\n lineHeight: 21.6,\n },\n medium: {\n fontFamily: fontFamily.primary,\n fontWeight: '500' as const,\n fontSize: 18,\n lineHeight: 21.6,\n },\n regular: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 18,\n lineHeight: 21.6,\n },\n },\n heading4: {\n bold: {\n fontFamily: fontFamily.primary,\n fontWeight: '700' as const,\n fontSize: 16,\n lineHeight: 19.2,\n },\n medium: {\n fontFamily: fontFamily.primary,\n fontWeight: '500' as const,\n fontSize: 16,\n lineHeight: 19.2,\n },\n regular: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 16,\n lineHeight: 19.2,\n },\n },\n body: {\n bold: {\n fontFamily: fontFamily.primary,\n fontWeight: '700' as const,\n fontSize: 14,\n lineHeight: 16.8,\n },\n medium: {\n fontFamily: fontFamily.primary,\n fontWeight: '500' as const,\n fontSize: 14,\n lineHeight: 16.8,\n },\n regular: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 14,\n lineHeight: 16.8,\n },\n },\n caption1: {\n bold: {\n fontFamily: fontFamily.primary,\n fontWeight: '700' as const,\n fontSize: 12,\n lineHeight: 14.4,\n },\n medium: {\n fontFamily: fontFamily.primary,\n fontWeight: '500' as const,\n fontSize: 12,\n lineHeight: 14.4,\n },\n regular: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 12,\n lineHeight: 14.4,\n },\n },\n caption2: {\n bold: {\n fontFamily: fontFamily.primary,\n fontWeight: '700' as const,\n fontSize: 10,\n lineHeight: 12,\n },\n medium: {\n fontFamily: fontFamily.primary,\n fontWeight: '500' as const,\n fontSize: 10,\n lineHeight: 12,\n },\n regular: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 10,\n lineHeight: 12,\n },\n },\n button: {\n bold: {\n fontFamily: fontFamily.primary,\n fontWeight: '700' as const,\n fontSize: 14,\n lineHeight: 16.8,\n },\n medium: {\n fontFamily: fontFamily.primary,\n fontWeight: '500' as const,\n fontSize: 14,\n lineHeight: 16.8,\n },\n regular: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 14,\n lineHeight: 16.8,\n },\n },\n link: {\n fontFamily: fontFamily.primary,\n fontWeight: '400' as const,\n fontSize: 14,\n lineHeight: 19.6,\n },\n} as const;\n\n// Color Palette\nexport const colors = {\n primary: '#6852d6',\n extendedPrimary: {\n 50: '#15102b',\n 100: '#1d173c',\n 200: '#251e4d',\n 300: '#2e245e',\n 400: '#362b6f',\n 500: '#3e3180',\n 600: '#473892',\n 700: '#4f3ea3',\n 800: '#5745b4',\n 900: '#7460d9',\n },\n neutral: {\n 50: '#141414',\n 100: '#1a1a1a',\n 200: '#272727',\n 300: '#383838',\n 400: '#4c4c4c',\n 500: '#858585',\n 600: '#989898',\n 700: '#a8a8a8',\n 800: '#c8c8c8',\n 900: '#ffffff',\n },\n alert: {\n successBackground: '#ceecdf',\n warningBackground: '#fff5cf',\n errorBackground: '#f4d8d8',\n permissionErrorColor: '#ff977d',\n permissionErrorBackground: '#391716',\n info: '#0d66bf',\n warning: '#d08d04',\n success: '#0b9f5d',\n messageSeen: '#56e8a7',\n error: '#c73c3e',\n callControlActiveBackground: '#f4cccc',\n },\n static: {\n black: '#141414',\n white: '#ffffff',\n },\n background: {\n 1: '#141414', // neutral.50\n 2: '#1a1a1a', // neutral.100\n 3: '#272727', // neutral.200\n 4: '#383838', // neutral.300\n },\n border: {\n light: '#272727', // neutral.200\n default: '#383838', // neutral.300\n dark: '#4c4c4c', // neutral.400\n highlight: '#6852d6', // primary\n },\n text: {\n primary: '#ffffff', // neutral.900\n secondary: '#989898', // neutral.600\n tertiary: '#858585', // neutral.500\n disabled: '#4c4c4c', // neutral.400\n white: '#141414', // neutral.50\n highlight: '#6852d6', // primary\n },\n icon: {\n primary: '#ffffff', // neutral.900\n secondary: '#858585', // neutral.500\n tertiary: '#4c4c4c', // neutral.400\n white: '#141414', // neutral.50\n highlight: '#6852d6', // primary\n },\n shimmer: {\n background: '#141414', // background.1\n gradient: ['#383838', '#272727'], // For gradients in React Native\n },\n button: {\n primaryBackground: '#6852d6', // primary\n primaryText: '#ffffff', // static.white\n primaryIcon: '#ffffff', // static.white\n secondaryBackground: '#ffffff', // neutral.900\n secondaryText: '#ffffff', // neutral.900\n secondaryIcon: '#ffffff', // neutral.900\n link: '#0d66bf', // info\n fabBackground: '#6852d6', // primary\n fabIcon: '#ffffff', // static.white\n whiteHover: '#1a1a1a', // neutral.100\n whitePressed: '#383838', // neutral.300\n },\n} as const;\n\n// Layout Constants\nexport const layout = {\n participantsList: {\n width: 360,\n },\n callHeader: {\n height: 56,\n },\n callFooter: {\n height: 88,\n },\n} as const;\n\n// Common StyleSheet for reusable styles\nexport const commonStyles = StyleSheet.create({\n // Text styles\n titleBold: typography.title.bold,\n titleMedium: typography.title.medium,\n titleRegular: typography.title.regular,\n\n heading1Bold: typography.heading1.bold,\n heading1Medium: typography.heading1.medium,\n heading1Regular: typography.heading1.regular,\n\n heading2Bold: typography.heading2.bold,\n heading2Medium: typography.heading2.medium,\n heading2Regular: typography.heading2.regular,\n\n heading3Bold: typography.heading3.bold,\n heading3Medium: typography.heading3.medium,\n heading3Regular: typography.heading3.regular,\n\n heading4Bold: typography.heading4.bold,\n heading4Medium: typography.heading4.medium,\n heading4Regular: typography.heading4.regular,\n\n bodyBold: typography.body.bold,\n bodyMedium: typography.body.medium,\n bodyRegular: typography.body.regular,\n\n caption1Bold: typography.caption1.bold,\n caption1Medium: typography.caption1.medium,\n caption1Regular: typography.caption1.regular,\n\n caption2Bold: typography.caption2.bold,\n caption2Medium: typography.caption2.medium,\n caption2Regular: typography.caption2.regular,\n\n buttonBold: typography.button.bold,\n buttonMedium: typography.button.medium,\n buttonRegular: typography.button.regular,\n\n link: typography.link,\n\n // Background colors\n backgroundPrimary: {\n backgroundColor: colors.background[1],\n },\n backgroundSecondary: {\n backgroundColor: colors.background[2],\n },\n backgroundTertiary: {\n backgroundColor: colors.background[3],\n },\n backgroundQuaternary: {\n backgroundColor: colors.background[4],\n },\n\n // Text colors\n textPrimary: {\n color: colors.text.primary,\n },\n textSecondary: {\n color: colors.text.secondary,\n },\n textTertiary: {\n color: colors.text.tertiary,\n },\n textDisabled: {\n color: colors.text.disabled,\n },\n textHighlight: {\n color: colors.text.highlight,\n },\n\n // Border styles\n borderLight: {\n borderColor: colors.border.light,\n },\n borderDefault: {\n borderColor: colors.border.default,\n },\n borderDark: {\n borderColor: colors.border.dark,\n },\n borderHighlight: {\n borderColor: colors.border.highlight,\n },\n\n // Common layouts\n flex1: {\n flex: 1,\n },\n flexRow: {\n flexDirection: 'row',\n },\n flexColumn: {\n flexDirection: 'column',\n },\n center: {\n justifyContent: 'center',\n alignItems: 'center',\n },\n spaceBetween: {\n justifyContent: 'space-between',\n },\n spaceAround: {\n justifyContent: 'space-around',\n },\n\n // Padding styles\n paddingSmall: {\n padding: padding[2],\n },\n paddingMedium: {\n padding: padding[4],\n },\n paddingLarge: {\n padding: padding[6],\n },\n\n // Margin styles\n marginSmall: {\n margin: margin[2],\n },\n marginMedium: {\n margin: margin[4],\n },\n marginLarge: {\n margin: margin[6],\n },\n\n // Border radius styles\n radiusSmall: {\n borderRadius: borderRadius[2],\n },\n radiusMedium: {\n borderRadius: borderRadius[4],\n },\n radiusLarge: {\n borderRadius: borderRadius[6],\n },\n});\n","import {\n getAvatarTextInitials,\n getColorFromName,\n} from '@cometchat/calls-sdk-core';\nimport React, { useMemo } from 'react';\nimport {\n Image,\n StyleProp,\n StyleSheet,\n Text,\n TextStyle,\n View,\n ViewStyle,\n} from 'react-native';\nimport { colors, commonStyles } from '../theme/style-variables';\n\ninterface AvatarProps {\n name: string;\n imageUrl?: string;\n size?: number;\n fontSize?: number;\n containerStyle?: StyleProp<ViewStyle>;\n textStyle?: StyleProp<TextStyle>;\n}\n\nconst Avatar: React.FC<AvatarProps> = ({\n name,\n imageUrl,\n size,\n fontSize,\n containerStyle,\n textStyle,\n}) => {\n const wrapperStyle = size\n ? { width: size, height: size }\n : styles.avatarWrapper;\n const fallbackTextStyle = fontSize\n ? { fontSize, lineHeight: fontSize * 1.2 }\n : {};\n\n const backgroundStyle = useMemo(() => {\n if (imageUrl) {\n return {};\n }\n return { backgroundColor: getColorFromName(name) };\n }, [imageUrl, name]);\n\n return (\n <View\n style={[\n styles.avatarWrapper,\n backgroundStyle,\n wrapperStyle,\n containerStyle,\n ]}>\n {imageUrl ? (\n <Image\n source={{ uri: imageUrl }}\n style={styles.avatarImage}\n resizeMode=\"cover\"\n />\n ) : (\n <Text\n style={[\n commonStyles.heading2Bold,\n styles.avatarText,\n textStyle,\n fallbackTextStyle,\n ]}>\n {getAvatarTextInitials(name)}\n </Text>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n avatarWrapper: {\n overflow: 'hidden',\n backgroundColor: '#3a3a3a',\n alignItems: 'center',\n justifyContent: 'center',\n width: 48,\n height: 48,\n borderRadius: 1000,\n },\n avatarImage: {\n width: '100%',\n height: '100%',\n },\n avatarText: {\n color: colors.text.primary,\n },\n});\n\nexport default Avatar;\n","/*eslint sort-keys: [\"error\", \"asc\", {caseSensitive: false}]*/\n\nexport const PATH_MAP = {\n 'arrow-up':\n 'M12.0005 10.4538L7.9275 14.527C7.789 14.6653 7.61492 14.7362 7.40525 14.7395C7.19575 14.7427 7.0185 14.6718 6.8735 14.527C6.72867 14.382 6.65625 14.2063 6.65625 14C6.65625 13.7937 6.72867 13.618 6.8735 13.473L11.3678 8.97876C11.5486 8.7981 11.7595 8.70776 12.0005 8.70776C12.2415 8.70776 12.4524 8.7981 12.6333 8.97876L17.1275 13.473C17.2658 13.6115 17.3367 13.7856 17.34 13.9953C17.3432 14.2048 17.2723 14.382 17.1275 14.527C16.9825 14.6718 16.8068 14.7443 16.6005 14.7443C16.3942 14.7443 16.2185 14.6718 16.0735 14.527L12.0005 10.4538Z',\n bluetooth:\n 'M17.65 6.99663L13.36 2.70663C12.73 2.07663 11.65 2.51663 11.65 3.40663V9.58663L7.76 5.69663C7.37 5.30663 6.74 5.30663 6.35 5.69663C5.96 6.08663 5.96 6.71663 6.35 7.10663L11.24 11.9966L6.35 16.8866C5.96 17.2766 5.96 17.9066 6.35 18.2966C6.74 18.6866 7.37 18.6866 7.76 18.2966L11.65 14.4066V20.5866C11.65 21.4766 12.73 21.9266 13.36 21.2966L17.65 16.9966C18.04 16.6066 18.04 15.9766 17.65 15.5866L14.06 11.9966L17.65 8.41663C18.04 8.02663 18.04 7.38663 17.65 6.99663ZM13.65 5.82663L15.53 7.70663L13.65 9.58663V5.82663ZM15.53 16.2866L13.65 18.1666V14.4066L15.53 16.2866Z',\n 'call-end':\n 'M4.58108 16.0302L6.58108 14.4402C7.06108 14.0602 7.34108 13.4802 7.34108 12.8702V10.2702C10.3611 9.29016 13.6311 9.28016 16.6611 10.2702V12.8802C16.6611 13.4902 16.9411 14.0702 17.4211 14.4502L19.4111 16.0302C20.2111 16.6602 21.3511 16.6002 22.0711 15.8802L23.2911 14.6602C24.0911 13.8602 24.0911 12.5302 23.2411 11.7802C16.8311 6.12016 7.17108 6.12016 0.76108 11.7802C-0.0889204 12.5302 -0.0889204 13.8602 0.71108 14.6602L1.93108 15.8802C2.64108 16.6002 3.78108 16.6602 4.58108 16.0302Z',\n car: 'M18.92 5.01C18.72 4.42 18.16 4 17.5 4H6.5C5.84 4 5.29 4.42 5.08 5.01L3.11 10.68C3.04 10.89 3 11.11 3 11.34V18.5C3 19.33 3.67 20 4.5 20C5.33 20 6 19.33 6 18.5V18H18V18.5C18 19.32 18.67 20 19.5 20C20.32 20 21 19.33 21 18.5V11.34C21 11.12 20.96 10.89 20.89 10.68L18.92 5.01ZM6.5 15C5.67 15 5 14.33 5 13.5C5 12.67 5.67 12 6.5 12C7.33 12 8 12.67 8 13.5C8 14.33 7.33 15 6.5 15ZM17.5 15C16.67 15 16 14.33 16 13.5C16 12.67 16.67 12 17.5 12C18.33 12 19 12.67 19 13.5C19 14.33 18.33 15 17.5 15ZM5 10L6.27 6.18C6.41 5.78 6.79 5.5 7.22 5.5H16.78C17.21 5.5 17.59 5.78 17.73 6.18L19 10H5Z',\n chat: 'M20 2H4C2.9 2 2.01 2.9 2.01 4L2 22L6 18H20C21.1 18 22 17.1 22 16V4C22 2.9 21.1 2 20 2ZM7 9H17C17.55 9 18 9.45 18 10C18 10.55 17.55 11 17 11H7C6.45 11 6 10.55 6 10C6 9.45 6.45 9 7 9ZM13 14H7C6.45 14 6 13.55 6 13C6 12.45 6.45 12 7 12H13C13.55 12 14 12.45 14 13C14 13.55 13.55 14 13 14ZM17 8H7C6.45 8 6 7.55 6 7C6 6.45 6.45 6 7 6H17C17.55 6 18 6.45 18 7C18 7.55 17.55 8 17 8Z',\n 'check-fill':\n 'M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM9.29 16.29L5.7 12.7C5.31 12.31 5.31 11.68 5.7 11.29C6.09 10.9 6.72 10.9 7.11 11.29L10 14.17L16.88 7.29C17.27 6.9 17.9 6.9 18.29 7.29C18.68 7.68 18.68 8.31 18.29 8.7L10.7 16.29C10.32 16.68 9.68 16.68 9.29 16.29Z',\n close:\n 'M11.999 13.1163L6.89479 18.2203C6.73379 18.3815 6.54629 18.4614 6.33229 18.4601C6.11845 18.4586 5.93379 18.3773 5.77829 18.2163C5.61995 18.0552 5.54287 17.8697 5.54704 17.6601C5.5512 17.4502 5.62962 17.269 5.78229 17.1163L10.8823 11.9996L5.78229 6.88283C5.62962 6.73016 5.55329 6.54891 5.55329 6.33908C5.55329 6.12941 5.62962 5.944 5.78229 5.78283C5.93512 5.62183 6.11845 5.54058 6.33229 5.53908C6.54629 5.53775 6.73379 5.61483 6.89479 5.77033L11.999 10.8828L17.1115 5.77033C17.267 5.61483 17.4518 5.53775 17.6658 5.53908C17.8796 5.54058 18.0671 5.62183 18.2283 5.78283C18.381 5.944 18.4552 6.12941 18.451 6.33908C18.4469 6.54891 18.3685 6.73016 18.2158 6.88283L13.1158 11.9996L18.2158 17.1163C18.3685 17.269 18.4448 17.4502 18.4448 17.6601C18.4448 17.8697 18.3685 18.0552 18.2158 18.2163C18.063 18.3773 17.8796 18.4586 17.6658 18.4601C17.4518 18.4614 17.267 18.3815 17.1115 18.2203L11.999 13.1163Z',\n earpiece:\n 'M19.7885 11.7299C19.5858 11.7299 19.4076 11.658 19.2538 11.5144C19.0999 11.3709 19.0096 11.1927 18.9828 10.9799C18.7661 9.36569 18.0863 7.98719 16.9433 6.84436C15.8003 5.70136 14.4218 5.02153 12.8078 4.80486C12.5949 4.77786 12.4167 4.69003 12.273 4.54136C12.1295 4.39269 12.0578 4.21194 12.0578 3.99911C12.0578 3.78628 12.1321 3.60811 12.2808 3.46461C12.4294 3.32094 12.6051 3.26261 12.8078 3.28961C14.8436 3.51011 16.5792 4.33794 18.0145 5.77311C19.4497 7.20844 20.2775 8.94403 20.498 10.9799C20.525 11.1824 20.4667 11.358 20.323 11.5069C20.1795 11.6555 20.0013 11.7299 19.7885 11.7299ZM15.652 11.7299C15.4865 11.7299 15.3413 11.6741 15.2163 11.5626C15.0913 11.4511 14.9968 11.3024 14.9328 11.1164C14.7801 10.5754 14.5002 10.0981 14.0933 9.68461C13.6863 9.27111 13.2123 8.99136 12.6713 8.84536C12.4853 8.78119 12.3365 8.68661 12.225 8.56161C12.1135 8.43661 12.0578 8.28628 12.0578 8.11061C12.0578 7.86061 12.1439 7.65869 12.3163 7.50486C12.4888 7.35103 12.6846 7.30103 12.9038 7.35486C13.7794 7.55869 14.5339 7.97728 15.1673 8.61061C15.8006 9.24394 16.2224 10.0016 16.4328 10.8836C16.4866 11.1029 16.4324 11.2988 16.2703 11.4711C16.1081 11.6436 15.902 11.7299 15.652 11.7299ZM19.4403 20.4991C17.5558 20.4991 15.6625 20.0609 13.7605 19.1846C11.8587 18.3083 10.1097 17.0721 8.5135 15.4761C6.92383 13.8799 5.69083 12.1324 4.8145 10.2336C3.93817 8.33494 3.5 6.44336 3.5 4.55886C3.5 4.25886 3.6 4.00719 3.8 3.80386C4 3.60069 4.25 3.49911 4.55 3.49911H7.8115C8.064 3.49911 8.28675 3.58153 8.47975 3.74636C8.67275 3.91103 8.7955 4.11453 8.848 4.35686L9.42125 7.29911C9.46092 7.57211 9.45258 7.80669 9.39625 8.00286C9.33975 8.19903 9.23842 8.36378 9.09225 8.49711L6.78275 10.7454C7.15442 11.426 7.57908 12.0699 8.05675 12.6771C8.53425 13.2841 9.05125 13.8639 9.60775 14.4164C10.1564 14.9652 10.7398 15.4749 11.3578 15.9454C11.9757 16.4159 12.6431 16.8537 13.3598 17.2589L15.6038 14.9954C15.7603 14.8325 15.9498 14.7184 16.1723 14.6529C16.3946 14.5875 16.6257 14.5715 16.8655 14.6049L19.6423 15.1704C19.8948 15.237 20.1008 15.3659 20.2605 15.5569C20.4202 15.7479 20.5 15.9645 20.5 16.2069V19.4491C20.5 19.7491 20.3984 19.9991 20.1953 20.1991C19.9919 20.3991 19.7403 20.4991 19.4403 20.4991Z',\n 'empty-search':\n 'M11.0001 11.6921C10.0348 11.6921 9.2101 11.3501 8.5261 10.6661C7.8421 9.98228 7.5001 9.15761 7.5001 8.19211C7.5001 7.22678 7.8421 6.40211 8.5261 5.71811C9.2101 5.03411 10.0348 4.69211 11.0001 4.69211C11.9654 4.69211 12.7901 5.03411 13.4741 5.71811C14.1581 6.40211 14.5001 7.22678 14.5001 8.19211C14.5001 9.15761 14.1581 9.98228 13.4741 10.6661C12.7901 11.3501 11.9654 11.6921 11.0001 11.6921ZM21.1308 22.1844L18.7271 19.7806C18.3899 19.9934 18.0341 20.1601 17.6596 20.2806C17.2853 20.4011 16.8988 20.4614 16.5001 20.4614C15.3976 20.4614 14.4617 20.0768 13.6923 19.3076C12.9232 18.5383 12.5386 17.6024 12.5386 16.4999C12.5386 15.3974 12.9232 14.4614 13.6923 13.6921C14.4617 12.9229 15.3976 12.5384 16.5001 12.5384C17.6026 12.5384 18.5385 12.9229 19.3078 13.6921C20.077 14.4614 20.4616 15.3974 20.4616 16.4999C20.4616 16.8985 20.4013 17.285 20.2808 17.6594C20.1603 18.0339 19.9937 18.3897 19.7808 18.7269L22.1846 21.1306C22.3231 21.2691 22.3939 21.4431 22.3971 21.6526C22.4003 21.8623 22.3294 22.0395 22.1846 22.1844C22.0398 22.3292 21.8642 22.4016 21.6578 22.4016C21.4513 22.4016 21.2757 22.3292 21.1308 22.1844ZM16.5001 18.9614C17.1938 18.9614 17.7774 18.7245 18.2511 18.2509C18.7248 17.7772 18.9616 17.1935 18.9616 16.4999C18.9616 15.8062 18.7248 15.2225 18.2511 14.7489C17.7774 14.2752 17.1938 14.0384 16.5001 14.0384C15.8064 14.0384 15.2228 14.2752 14.7491 14.7489C14.2754 15.2225 14.0386 15.8062 14.0386 16.4999C14.0386 17.1935 14.2754 17.7772 14.7491 18.2509C15.2228 18.7245 15.8064 18.9614 16.5001 18.9614ZM5.01935 19.3076C4.59751 19.3076 4.23885 19.1599 3.94335 18.8644C3.64785 18.5687 3.5001 18.21 3.5001 17.7884V17.0999C3.5001 16.6037 3.6306 16.1476 3.8916 15.7316C4.15243 15.3156 4.51043 14.9922 4.9656 14.7614C5.66426 14.4037 6.49018 14.0842 7.44335 13.8029C8.39651 13.5214 9.43726 13.3614 10.5656 13.3229C10.7591 13.3127 10.9058 13.3944 11.0058 13.5681C11.1058 13.7418 11.1174 13.9254 11.0406 14.1191C10.8764 14.5038 10.7518 14.8977 10.6666 15.3009C10.5813 15.704 10.5386 16.1114 10.5386 16.5229C10.5386 16.8472 10.5648 17.1741 10.6173 17.5036C10.67 17.8331 10.7592 18.1498 10.8848 18.4536C10.9592 18.6678 10.9396 18.8636 10.8261 19.0411C10.7126 19.2188 10.5488 19.3076 10.3348 19.3076H5.01935Z',\n error:\n 'M9.16602 12.5003H10.8327V14.167H9.16602V12.5003ZM9.16602 5.83366H10.8327V10.8337H9.16602V5.83366ZM9.99102 1.66699C5.39102 1.66699 1.66602 5.40033 1.66602 10.0003C1.66602 14.6003 5.39102 18.3337 9.99102 18.3337C14.5993 18.3337 18.3327 14.6003 18.3327 10.0003C18.3327 5.40033 14.5993 1.66699 9.99102 1.66699ZM9.99935 16.667C6.31602 16.667 3.33268 13.6837 3.33268 10.0003C3.33268 6.31699 6.31602 3.33366 9.99935 3.33366C13.6827 3.33366 16.666 6.31699 16.666 10.0003C16.666 13.6837 13.6827 16.667 9.99935 16.667Z',\n headphones:\n 'M3 12V19C3 20.1 3.9 21 5 21H7C8.1 21 9 20.1 9 19V15C9 13.9 8.1 13 7 13H5V12C5 8.13 8.13 5 12 5C15.87 5 19 8.13 19 12V13H17C15.9 13 15 13.9 15 15V19C15 20.1 15.9 21 17 21H19C20.1 21 21 20.1 21 19V12C21 7.03 16.97 3 12 3C7.03 3 3 7.03 3 12Z',\n mic: 'M12 14.5C13.66 14.5 15 13.16 15 11.5V5.5C15 3.84 13.66 2.5 12 2.5C10.34 2.5 9 3.84 9 5.5V11.5C9 13.16 10.34 14.5 12 14.5ZM11 5.5C11 4.95 11.45 4.5 12 4.5C12.55 4.5 13 4.95 13 5.5V11.5C13 12.05 12.55 12.5 12 12.5C11.45 12.5 11 12.05 11 11.5V5.5ZM17 11.5C17 14.26 14.76 16.5 12 16.5C9.24 16.5 7 14.26 7 11.5H5C5 15.03 7.61 17.93 11 18.42V21.5H13V18.42C16.39 17.93 19 15.03 19 11.5H17Z',\n 'mic-fill':\n 'M11.999 14.5C13.659 14.5 14.999 13.16 14.999 11.5V5.5C14.999 3.84 13.659 2.5 11.999 2.5C10.339 2.5 8.99901 3.84 8.99901 5.5V11.5C8.99901 13.16 10.339 14.5 11.999 14.5ZM17.909 11.5C17.419 11.5 17.009 11.86 16.929 12.35C16.519 14.7 14.469 16.5 11.999 16.5C9.52901 16.5 7.47901 14.7 7.06901 12.35C6.98901 11.86 6.57901 11.5 6.08901 11.5C5.47901 11.5 4.99901 12.04 5.08901 12.64C5.57901 15.64 7.97901 17.99 10.999 18.42V20.5C10.999 21.05 11.449 21.5 11.999 21.5C12.549 21.5 12.999 21.05 12.999 20.5V18.42C16.019 17.99 18.419 15.64 18.909 12.64C19.009 12.04 18.519 11.5 17.909 11.5Z',\n 'mic-off':\n 'M10.7219 5.38999C10.7219 4.72999 11.2619 4.18999 11.9219 4.18999C12.5819 4.18999 13.1219 4.72999 13.1219 5.38999L13.1119 9.29999L14.9219 11.09V5.48999C14.9219 3.82999 13.5819 2.48999 11.9219 2.48999C10.3819 2.48999 9.13188 3.64999 8.96187 5.13999L10.7219 6.89999V5.38999ZM18.9219 11.49H17.2219C17.2219 12.07 17.1219 12.62 16.9519 13.13L18.2219 14.4C18.6619 13.52 18.9219 12.53 18.9219 11.49ZM4.33187 3.34999L2.92188 4.75999L8.92188 10.76V11.49C8.92188 13.15 10.2619 14.49 11.9219 14.49C12.1519 14.49 12.3619 14.46 12.5719 14.41L14.2319 16.07C13.5219 16.4 12.7319 16.59 11.9219 16.59C9.16187 16.59 6.62187 14.49 6.62187 11.49H4.92188C4.92188 14.9 7.64188 17.72 10.9219 18.21V21.49H12.9219V18.21C13.8319 18.08 14.6919 17.76 15.4719 17.31L19.6719 21.51L21.0819 20.1L4.33187 3.34999Z',\n 'mic-off-fill':\n 'M16.5203 13.9018C16.3446 13.8069 16.2282 13.6557 16.171 13.448C16.114 13.2403 16.133 13.0487 16.2278 12.873C16.3253 12.7025 16.4003 12.5211 16.4528 12.3287C16.5055 12.1364 16.5452 11.9416 16.572 11.7443C16.6195 11.5314 16.715 11.3542 16.8585 11.2125C17.0022 11.0708 17.1805 11 17.3933 11C17.6061 11 17.7817 11.0776 17.92 11.2327C18.0585 11.3877 18.1175 11.5717 18.097 11.7845C18.0599 12.0973 17.998 12.4067 17.9115 12.7125C17.825 13.0182 17.7042 13.3088 17.549 13.5845C17.4542 13.7667 17.3045 13.8888 17.1 13.951C16.8955 14.0132 16.7023 13.9968 16.5203 13.9018ZM12.8278 9.7385L9.67029 6.5615C9.50612 6.39733 9.37729 6.20408 9.28379 5.98175C9.19012 5.75925 9.14329 5.5275 9.14329 5.2865V5C9.14329 4.30133 9.38529 3.71 9.86929 3.226C10.3533 2.742 10.9446 2.5 11.6433 2.5C12.342 2.5 12.9333 2.742 13.4173 3.226C13.9013 3.71 14.1433 4.30133 14.1433 5V9.1865C14.1433 9.534 13.9855 9.77442 13.67 9.90775C13.3547 10.0411 13.074 9.98467 12.8278 9.7385ZM10.8933 20V17.4578C9.40479 17.2832 8.12912 16.6704 7.06629 15.6193C6.00346 14.5679 5.38104 13.2865 5.19904 11.775C5.17221 11.5622 5.22796 11.3798 5.36629 11.228C5.50479 11.076 5.68046 11 5.89329 11C6.10612 11 6.28429 11.0734 6.42779 11.2203C6.57146 11.3669 6.66696 11.5467 6.71429 11.7595C6.89646 12.984 7.45646 13.9968 8.39429 14.798C9.33212 15.5993 10.4151 16 11.6433 16C12.2868 16 12.8916 15.8852 13.4578 15.6557C14.0238 15.4262 14.5247 15.1083 14.9605 14.702L16.0298 15.771C15.5465 16.225 14.9965 16.5988 14.3798 16.8923C13.7631 17.1859 13.101 17.3744 12.3933 17.4578V20C12.3933 20.2128 12.3215 20.391 12.1778 20.5345C12.0343 20.6782 11.8561 20.75 11.6433 20.75C11.4305 20.75 11.2522 20.6782 11.1085 20.5345C10.965 20.391 10.8933 20.2128 10.8933 20ZM19.3395 21.1885L2.20479 4.05375C2.06629 3.91525 1.99546 3.74125 1.99229 3.53175C1.98912 3.32208 2.05996 3.14483 2.20479 3C2.34962 2.85517 2.52529 2.78275 2.73179 2.78275C2.93812 2.78275 3.11371 2.85517 3.25854 3L20.3933 20.1345C20.5318 20.273 20.6026 20.4471 20.6058 20.6568C20.609 20.8663 20.5381 21.0435 20.3933 21.1885C20.2485 21.3333 20.0728 21.4058 19.8663 21.4058C19.66 21.4058 19.4844 21.3333 19.3395 21.1885Z',\n 'mood-fill':\n 'M15.406 10.8077C15.77 10.8077 16.0786 10.6803 16.3318 10.4255C16.5849 10.1708 16.7115 9.86158 16.7115 9.49775C16.7115 9.13392 16.5842 8.82542 16.3295 8.57225C16.0748 8.31892 15.7655 8.19225 15.4015 8.19225C15.0377 8.19225 14.7292 8.31967 14.476 8.5745C14.2228 8.82917 14.0962 9.13842 14.0962 9.50225C14.0962 9.86608 14.2236 10.1746 14.4783 10.4277C14.7329 10.6811 15.0422 10.8077 15.406 10.8077ZM8.5985 10.8077C8.96233 10.8077 9.27083 10.6803 9.524 10.4255C9.77717 10.1708 9.90375 9.86158 9.90375 9.49775C9.90375 9.13392 9.77642 8.82542 9.52175 8.57225C9.26708 8.31892 8.95783 8.19225 8.594 8.19225C8.23 8.19225 7.92142 8.31967 7.66825 8.5745C7.41508 8.82917 7.2885 9.13842 7.2885 9.50225C7.2885 9.86608 7.41583 10.1746 7.6705 10.4277C7.92517 10.6811 8.2345 10.8077 8.5985 10.8077ZM12.0017 21.5C10.6877 21.5 9.45267 21.2507 8.2965 20.752C7.14033 20.2533 6.13467 19.5766 5.2795 18.7218C4.42433 17.8669 3.74725 16.8617 3.24825 15.706C2.74942 14.5503 2.5 13.3156 2.5 12.0017C2.5 10.6877 2.74933 9.45267 3.248 8.2965C3.74667 7.14033 4.42342 6.13467 5.27825 5.2795C6.13308 4.42433 7.13833 3.74725 8.294 3.24825C9.44967 2.74942 10.6844 2.5 11.9983 2.5C13.3123 2.5 14.5473 2.74933 15.7035 3.248C16.8597 3.74667 17.8653 4.42342 18.7205 5.27825C19.5757 6.13308 20.2528 7.13833 20.7518 8.294C21.2506 9.44967 21.5 10.6844 21.5 11.9983C21.5 13.3123 21.2507 14.5473 20.752 15.7035C20.2533 16.8597 19.5766 17.8653 18.7218 18.7205C17.8669 19.5757 16.8617 20.2528 15.706 20.7518C14.5503 21.2506 13.3156 21.5 12.0017 21.5ZM12 17.1923C12.8975 17.1923 13.7254 16.9798 14.4837 16.5548C15.2421 16.1298 15.8578 15.5532 16.331 14.825C16.4257 14.643 16.4227 14.46 16.322 14.276C16.2215 14.092 16.0642 14 15.85 14H8.15C7.93583 14 7.7785 14.092 7.678 14.276C7.57733 14.46 7.57433 14.643 7.669 14.825C8.14217 15.5532 8.76183 16.1298 9.528 16.5548C10.294 16.9798 11.118 17.1923 12 17.1923Z',\n more: 'M12 8C13.1 8 14 7.1 14 6C14 4.9 13.1 4 12 4C10.9 4 10 4.9 10 6C10 7.1 10.9 8 12 8ZM12 10C10.9 10 10 10.9 10 12C10 13.1 10.9 14 12 14C13.1 14 14 13.1 14 12C14 10.9 13.1 10 12 10ZM12 16C10.9 16 10 16.9 10 18C10 19.1 10.9 20 12 20C13.1 20 14 19.1 14 18C14 16.9 13.1 16 12 16Z',\n 'noise-reduction': [\n 'M15.6204 16.45C15.9804 15.8 15.4704 15 14.7204 15C14.3804 15 14.0404 15.16 13.8804 15.47C13.7204 15.78 13.3804 16 13.0004 16C12.5704 16 12.1904 15.73 12.0504 15.32C11.9004 14.88 11.6504 14.24 11.1204 13.71L9.76039 12.35C9.28039 11.87 9.00039 11.19 9.00039 10.5C9.00039 9.12 10.1204 8 11.5004 8C12.4804 8 13.3404 8.57 13.7404 9.4C13.9204 9.76 14.2604 10 14.6504 10C15.4004 10 15.8704 9.21 15.5404 8.54C14.8204 7.04 13.2804 6 11.5004 6C8.61038 6 6.35038 8.74 7.17038 11.76C7.39038 12.56 7.85038 13.27 8.44038 13.86L9.71039 15.13C9.86039 15.29 9.99039 15.51 10.1104 15.84C10.5204 16.97 11.4904 17.88 12.6904 18C13.9504 18.11 15.0704 17.46 15.6204 16.45Z',\n 'M13.5004 14C14.3288 14 15.0004 13.3284 15.0004 12.5C15.0004 11.6716 14.3288 11 13.5004 11C12.672 11 12.0004 11.6716 12.0004 12.5C12.0004 13.3284 12.672 14 13.5004 14Z',\n 'M12.0004 4C12.5527 4 13.0004 3.55228 13.0004 3C13.0004 2.44772 12.5527 2 12.0004 2C11.4481 2 11.0004 2.44772 11.0004 3C11.0004 3.55228 11.4481 4 12.0004 4Z',\n 'M12.0004 22C12.5527 22 13.0004 21.5523 13.0004 21C13.0004 20.4477 12.5527 20 12.0004 20C11.4481 20 11.0004 20.4477 11.0004 21C11.0004 21.5523 11.4481 22 12.0004 22Z',\n 'M5.75038 7.01C6.09038 6.58 6.02039 5.95 5.59038 5.6C5.16038 5.26 4.53038 5.33 4.18038 5.77C3.84038 6.2 3.91038 6.83 4.34038 7.17C4.77039 7.51 5.40038 7.44 5.75038 7.01Z',\n 'M18.2504 16.99C17.9104 17.42 17.9804 18.05 18.4104 18.4C18.8404 18.75 19.4704 18.67 19.8204 18.24C20.1604 17.81 20.0904 17.18 19.6604 16.83C19.2304 16.49 18.6004 16.56 18.2504 16.99Z',\n 'M4.20038 13.78C4.08038 13.24 3.54038 12.9 3.00038 13.03C2.46038 13.16 2.12038 13.69 2.25038 14.23C2.37038 14.77 2.91038 15.11 3.45038 14.98C3.99038 14.86 4.32038 14.32 4.20038 13.78Z',\n 'M19.8004 10.22C19.9204 10.76 20.4604 11.1 21.0004 10.97C21.5404 10.84 21.8804 10.31 21.7504 9.77C21.6204 9.23 21.0904 8.89 20.5504 9.02C20.0104 9.14 19.6804 9.68 19.8004 10.22Z',\n 'M8.53038 19.21C8.03038 18.97 7.43038 19.18 7.20038 19.68C6.96038 20.18 7.17038 20.78 7.67038 21.01C8.17038 21.25 8.77038 21.04 9.00038 20.54C9.24038 20.05 9.03038 19.45 8.53038 19.21Z',\n 'M15.4704 4.79C15.9704 5.03 16.5704 4.82 16.8004 4.32C17.0404 3.82 16.8304 3.22 16.3304 2.99C15.8304 2.75 15.2304 2.96 15.0004 3.46C14.7604 3.95 14.9704 4.55 15.4704 4.79Z',\n 'M15.4704 19.21C14.9704 19.45 14.7604 20.05 15.0004 20.54C15.2404 21.03 15.8404 21.25 16.3304 21.01C16.8304 20.77 17.0404 20.17 16.8004 19.68C16.5704 19.18 15.9704 18.97 15.4704 19.21Z',\n 'M8.53038 4.79C9.03038 4.55 9.23038 3.96 9.00038 3.46C8.76039 2.96 8.16039 2.75 7.67038 2.99C7.18038 3.23 6.95039 3.83 7.19038 4.33C7.43038 4.83 8.03038 5.03 8.53038 4.79Z',\n 'M21.0004 13.03C20.4604 12.91 19.9304 13.24 19.8004 13.78C19.6804 14.32 20.0104 14.85 20.5504 14.98C21.0904 15.1 21.6204 14.77 21.7504 14.23C21.8704 13.69 21.5404 13.15 21.0004 13.03Z',\n 'M3.00038 10.97C3.54038 11.09 4.07038 10.76 4.20038 10.22C4.32038 9.68 3.99038 9.15 3.45038 9.02C2.91038 8.89 2.38038 9.23 2.25038 9.77C2.13038 10.31 2.46038 10.85 3.00038 10.97Z',\n 'M19.6604 7.17C20.0904 6.83 20.1604 6.2 19.8204 5.76C19.4804 5.32 18.8504 5.26 18.4104 5.6C17.9804 5.94 17.9104 6.57 18.2504 7.01C18.6004 7.44 19.2304 7.51 19.6604 7.17Z',\n 'M4.34038 16.83C3.91038 17.17 3.84038 17.8 4.18038 18.24C4.52038 18.67 5.15038 18.74 5.59038 18.4C6.02039 18.06 6.09038 17.43 5.75038 16.99C5.41038 16.55 4.77039 16.49 4.34038 16.83Z',\n ],\n participants:\n 'M1.79688 17.0837C1.79688 16.5683 1.92987 16.1084 2.19588 15.7039C2.46188 15.2994 2.81713 14.9847 3.26163 14.7599C4.21196 14.2951 5.16754 13.9367 6.12838 13.6847C7.08938 13.4328 8.14546 13.3069 9.29663 13.3069C10.448 13.3069 11.504 13.4328 12.4649 13.6847C13.4259 13.9367 14.3815 14.2951 15.3319 14.7599C15.7764 14.9847 16.1316 15.2994 16.3976 15.7039C16.6636 16.1084 16.7966 16.5683 16.7966 17.0837V17.7877C16.7966 18.1902 16.6489 18.544 16.3534 18.8492C16.0579 19.1543 15.6992 19.3069 15.2774 19.3069H3.31588C2.89421 19.3069 2.53563 19.1592 2.24013 18.8637C1.94463 18.568 1.79688 18.2093 1.79688 17.7877V17.0837ZM18.4101 19.3069C18.5358 19.0774 18.6316 18.8332 18.6976 18.5742C18.7636 18.3152 18.7966 18.053 18.7966 17.7877V16.9607C18.7966 16.3043 18.636 15.6787 18.3146 15.0839C17.9931 14.4892 17.5371 13.979 16.9466 13.5532C17.6171 13.6532 18.2537 13.8079 18.8564 14.0174C19.4589 14.2271 20.0339 14.4748 20.5814 14.7607C21.098 15.0363 21.497 15.3612 21.7784 15.7354C22.0597 16.1094 22.2004 16.5178 22.2004 16.9607V17.7877C22.2004 18.2093 22.0526 18.568 21.7571 18.8637C21.4616 19.1592 21.103 19.3069 20.6814 19.3069H18.4101ZM9.29663 11.6914C8.33413 11.6914 7.51021 11.3487 6.82488 10.6634C6.13954 9.97791 5.79688 9.15391 5.79688 8.19141C5.79688 7.22891 6.13954 6.40499 6.82488 5.71966C7.51021 5.03416 8.33413 4.69141 9.29663 4.69141C10.2591 4.69141 11.0831 5.03416 11.7686 5.71966C12.454 6.40499 12.7966 7.22891 12.7966 8.19141C12.7966 9.15391 12.454 9.97791 11.7686 10.6634C11.0831 11.3487 10.2591 11.6914 9.29663 11.6914ZM17.9311 8.19141C17.9311 9.15391 17.5885 9.97791 16.9031 10.6634C16.2178 11.3487 15.3939 11.6914 14.4314 11.6914C14.3185 11.6914 14.175 11.6786 14.0006 11.6529C13.8261 11.6272 13.6825 11.5991 13.5699 11.5684C13.9642 11.0942 14.2673 10.5682 14.4791 9.99041C14.6908 9.41257 14.7966 8.81257 14.7966 8.19041C14.7966 7.56807 14.6886 6.97032 14.4726 6.39716C14.2566 5.82416 13.9557 5.29666 13.5699 4.81466C13.7134 4.76332 13.857 4.72999 14.0006 4.71466C14.1441 4.69916 14.2877 4.69141 14.4314 4.69141C15.3939 4.69141 16.2178 5.03416 16.9031 5.71966C17.5885 6.40499 17.9311 7.22891 17.9311 8.19141Z',\n pin: 'M15.4994 5.6V12.8115L17.0647 14.377C17.139 14.4513 17.1949 14.535 17.2322 14.628C17.2694 14.7208 17.2879 14.8168 17.2879 14.916V15.3435C17.2879 15.5542 17.2151 15.7329 17.0694 15.8797C16.9239 16.0266 16.7435 16.1 16.5282 16.1H12.7494V21.4885C12.7494 21.701 12.6775 21.8791 12.5337 22.0227C12.3899 22.1664 12.2117 22.2382 11.9992 22.2382C11.7865 22.2382 11.6084 22.1664 11.4649 22.0227C11.3213 21.8791 11.2494 21.701 11.2494 21.4885V16.1H7.47069C7.25535 16.1 7.07494 16.0266 6.92944 15.8797C6.78377 15.7329 6.71094 15.5542 6.71094 15.3435V14.916C6.71094 14.8168 6.72952 14.7208 6.76669 14.628C6.80402 14.535 6.85985 14.4513 6.93419 14.377L8.49944 12.8115V5.6H8.24944C8.03694 5.6 7.85885 5.52808 7.71519 5.38425C7.57135 5.24041 7.49944 5.06225 7.49944 4.84975C7.49944 4.63708 7.57135 4.459 7.71519 4.3155C7.85885 4.17183 8.03694 4.1 8.24944 4.1H15.7494C15.9619 4.1 16.14 4.17192 16.2837 4.31575C16.4275 4.45958 16.4994 4.63775 16.4994 4.85025C16.4994 5.06292 16.4275 5.241 16.2837 5.3845C16.14 5.52817 15.9619 5.6 15.7494 5.6H15.4994Z',\n 'raise-hand':\n 'M18.37 23.9949H11.82C10.74 23.9949 9.68 23.5449 8.93 22.7649L1.63 15.1549L3.7 13.3249C4.32 12.7749 5.23 12.6649 5.96 13.0549L8.37 14.3349V4.78488C8.37 3.40488 9.49 2.28488 10.87 2.28488C11.04 2.28488 11.21 2.30488 11.38 2.33488C11.47 1.03488 12.55 0.00488281 13.87 0.00488281C14.73 0.00488281 15.48 0.434883 15.93 1.09488C16.22 0.974883 16.54 0.914883 16.87 0.914883C18.25 0.914883 19.37 2.03488 19.37 3.41488V3.69488C19.53 3.66488 19.7 3.64488 19.87 3.64488C21.25 3.64488 22.37 4.76488 22.37 6.14488V19.9949C22.37 22.2049 20.58 23.9949 18.37 23.9949ZM4.51 15.2749L10.37 21.3749C10.75 21.7649 11.27 21.9949 11.81 21.9949H18.37C19.47 21.9949 20.37 21.0949 20.37 19.9949V6.14488C20.37 5.86488 20.15 5.64488 19.87 5.64488C19.59 5.64488 19.37 5.86488 19.37 6.14488V11.9949H17.37V3.41488C17.37 3.13488 17.15 2.91488 16.87 2.91488C16.59 2.91488 16.37 3.13488 16.37 3.41488V11.9949H14.37V2.50488C14.37 2.22488 14.15 2.00488 13.87 2.00488C13.59 2.00488 13.37 2.22488 13.37 2.50488V11.9949H11.37V4.78488C11.37 4.50488 11.15 4.28488 10.87 4.28488C10.59 4.28488 10.37 4.51488 10.37 4.78488V17.6549L5.02 14.8249L4.51 15.2749Z',\n 'raise-hand-fill':\n 'M21.1818 4C20.3518 4 19.6818 4.67 19.6818 5.5V10.5C19.6818 10.78 19.4618 11 19.1818 11C18.9018 11 18.6818 10.78 18.6818 10.5V2.5C18.6818 1.67 18.0118 1 17.1818 1C16.3518 1 15.6818 1.67 15.6818 2.5V10.5C15.6818 10.78 15.4618 11 15.1818 11C14.9018 11 14.6818 10.78 14.6818 10.5V1.5C14.6818 0.67 14.0118 0 13.1818 0C12.3518 0 11.6818 0.67 11.6818 1.5V10.49C11.6818 10.77 11.4618 10.99 11.1818 10.99C10.9018 10.99 10.6818 10.77 10.6818 10.49V4.5C10.6818 3.67 10.0118 3 9.18176 3C8.35176 3 7.68176 3.67 7.68176 4.5V15.91L3.56176 13.56C2.98176 13.23 2.26176 13.32 1.78176 13.78C1.18176 14.36 1.16176 15.32 1.75176 15.91L8.53176 22.8C9.28176 23.57 10.3018 24 11.3818 24H18.6818C20.8918 24 22.6818 22.21 22.6818 20V5.5C22.6818 4.67 22.0118 4 21.1818 4Z',\n 'record-fill':\n 'M12 16.5C13.2487 16.5 14.3108 16.0622 15.1865 15.1865C16.0622 14.3108 16.5 13.2487 16.5 12C16.5 10.7513 16.0622 9.68917 15.1865 8.8135C14.3108 7.93783 13.2487 7.5 12 7.5C10.7513 7.5 9.68917 7.93783 8.8135 8.8135C7.93783 9.68917 7.5 10.7513 7.5 12C7.5 13.2487 7.93783 14.3108 8.8135 15.1865C9.68917 16.0622 10.7513 16.5 12 16.5ZM12.0017 21.5C10.6877 21.5 9.45267 21.2507 8.2965 20.752C7.14033 20.2533 6.13467 19.5766 5.2795 18.7218C4.42433 17.8669 3.74725 16.8617 3.24825 15.706C2.74942 14.5503 2.5 13.3156 2.5 12.0017C2.5 10.6877 2.74933 9.45267 3.248 8.2965C3.74667 7.14033 4.42342 6.13467 5.27825 5.2795C6.13308 4.42433 7.13833 3.74725 8.294 3.24825C9.44967 2.74942 10.6844 2.5 11.9983 2.5C13.3123 2.5 14.5473 2.74933 15.7035 3.248C16.8597 3.74667 17.8653 4.42342 18.7205 5.27825C19.5757 6.13308 20.2528 7.13833 20.7518 8.294C21.2506 9.44967 21.5 10.6844 21.5 11.9983C21.5 13.3123 21.2507 14.5473 20.752 15.7035C20.2533 16.8597 19.5766 17.8653 18.7218 18.7205C17.8669 19.5757 16.8617 20.2528 15.706 20.7518C14.5503 21.2506 13.3156 21.5 12.0017 21.5ZM12 20C14.2333 20 16.125 19.225 17.675 17.675C19.225 16.125 20 14.2333 20 12C20 9.76667 19.225 7.875 17.675 6.325C16.125 4.775 14.2333 4 12 4C9.76667 4 7.875 4.775 6.325 6.325C4.775 7.875 4 9.76667 4 12C4 14.2333 4.775 16.125 6.325 17.675C7.875 19.225 9.76667 20 12 20Z',\n 'record-stop-fill':\n 'M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM15 16H9C8.45 16 8 15.55 8 15V9C8 8.45 8.45 8 9 8H15C15.55 8 16 8.45 16 9V15C16 15.55 15.55 16 15 16Z',\n recording: [\n 'M12 2C6.48 2 2 6.48 2 12C2 17.52 6.48 22 12 22C17.52 22 22 17.52 22 12C22 6.48 17.52 2 12 2ZM12 20C7.58 20 4 16.42 4 12C4 7.58 7.58 4 12 4C16.42 4 20 7.58 20 12C20 16.42 16.42 20 12 20Z',\n 'M12 17C14.7614 17 17 14.7614 17 12C17 9.23858 14.7614 7 12 7C9.23858 7 7 9.23858 7 12C7 14.7614 9.23858 17 12 17Z',\n ],\n remove:\n 'M12.0022 21.8335C10.6404 21.8335 9.36222 21.5752 8.16772 21.0587C6.97322 20.5421 5.9323 19.8407 5.04497 18.9545C4.15747 18.0683 3.45605 17.0284 2.94072 15.8347C2.42555 14.6409 2.16797 13.3631 2.16797 12.0012C2.16797 10.6394 2.42622 9.36124 2.94272 8.16674C3.45939 6.97224 4.1608 5.93133 5.04697 5.04399C5.93314 4.15649 6.97305 3.45508 8.16672 2.93974C9.36055 2.42458 10.6384 2.16699 12.0002 2.16699C13.3621 2.16699 14.6402 2.42524 15.8347 2.94174C17.0292 3.45841 18.0701 4.15983 18.9575 5.04599C19.845 5.93216 20.5464 6.97208 21.0617 8.16574C21.5769 9.35958 21.8345 10.6374 21.8345 11.9992C21.8345 13.3611 21.5762 14.6392 21.0597 15.8337C20.5431 17.0282 19.8416 18.0692 18.9555 18.9565C18.0693 19.844 17.0294 20.5454 15.8357 21.0607C14.6419 21.5759 13.3641 21.8335 12.0022 21.8335ZM12.0012 20.2502C12.9807 20.2502 13.9197 20.0877 14.8182 19.7627C15.7169 19.4377 16.5335 18.9669 17.268 18.3502L5.65472 6.73349C5.04689 7.47799 4.57764 8.29791 4.24697 9.19324C3.91647 10.0886 3.75122 11.0242 3.75122 12.0002C3.75122 14.3016 4.55089 16.2519 6.15022 17.8512C7.74955 19.4506 9.69989 20.2502 12.0012 20.2502ZM18.3312 17.267C18.9279 16.5337 19.3971 15.7175 19.7387 14.8185C20.0804 13.9195 20.2512 12.9801 20.2512 12.0002C20.2512 9.69891 19.4516 7.74858 17.8522 6.14924C16.2529 4.54991 14.3026 3.75024 12.0012 3.75024C11.0257 3.75024 10.0905 3.91549 9.19547 4.24599C8.30047 4.57666 7.48014 5.05033 6.73447 5.66699L18.3312 17.267Z',\n 'screen-share':\n 'M11.1348 10.8075H13.1348V11.919C13.1348 12.0228 13.1799 12.094 13.2703 12.1325C13.3606 12.1708 13.4443 12.1516 13.5213 12.0747L15.2173 10.3785C15.3109 10.285 15.3578 10.178 15.3578 10.0575C15.3578 9.93697 15.3109 9.82989 15.2173 9.73622L13.5213 8.04022C13.4443 7.96322 13.3606 7.94397 13.2703 7.98247C13.1799 8.02097 13.1348 8.09214 13.1348 8.19597V9.30747H11.1348C10.3719 9.30747 9.72285 9.57505 9.18752 10.1102C8.65235 10.6456 8.38477 11.2946 8.38477 12.0575V13.3075C8.38477 13.5203 8.45652 13.6985 8.60002 13.842C8.74368 13.9856 8.92193 14.0575 9.13477 14.0575C9.34743 14.0575 9.5256 13.9856 9.66927 13.842C9.81277 13.6985 9.88452 13.5203 9.88452 13.3075V12.0575C9.88452 11.71 10.006 11.4147 10.249 11.1717C10.492 10.9289 10.7873 10.8075 11.1348 10.8075ZM2.13477 20.2305C1.92193 20.2305 1.74368 20.1586 1.60002 20.015C1.45652 19.8715 1.38477 19.6933 1.38477 19.4805C1.38477 19.2676 1.45652 19.0895 1.60002 18.946C1.74368 18.8023 1.92193 18.7305 2.13477 18.7305H21.8653C22.0781 18.7305 22.2563 18.8023 22.4 18.946C22.5435 19.0895 22.6153 19.2676 22.6153 19.4805C22.6153 19.6933 22.5435 19.8715 22.4 20.015C22.2563 20.1586 22.0781 20.2305 21.8653 20.2305H2.13477ZM4.30777 17.7305C3.8026 17.7305 3.37502 17.5555 3.02502 17.2055C2.67502 16.8555 2.50002 16.4279 2.50002 15.9227V5.53822C2.50002 5.03305 2.67502 4.60547 3.02502 4.25547C3.37502 3.90547 3.8026 3.73047 4.30777 3.73047H19.6923C20.1974 3.73047 20.625 3.90547 20.975 4.25547C21.325 4.60547 21.5 5.03305 21.5 5.53822V15.9227C21.5 16.4279 21.325 16.8555 20.975 17.2055C20.625 17.5555 20.1974 17.7305 19.6923 17.7305H4.30777Z',\n 'screen-share-stop':\n 'M23 17.8602H21.8L23.59 19.6502C23.83 19.4702 24 19.1902 24 18.8602C24 18.3102 23.55 17.8602 23 17.8602ZM3.23 2.14016C2.84 1.75016 2.2 1.75016 1.81 2.14016C1.42 2.53016 1.42 3.16016 1.81 3.55016L2.65 4.41016C2.65 4.41016 1.99 4.98016 1.99 5.88016C2 6.78016 2 15.8602 2 15.8602L2.01 15.8702C2.01 16.9602 2.89 17.8502 3.98 17.8602H1C0.45 17.8602 0 18.3102 0 18.8602C0 19.4102 0.45 19.8602 1 19.8602H18.13L20.13 21.8602C20.52 22.2502 21.15 22.2502 21.54 21.8602C21.93 21.4702 21.93 20.8402 21.54 20.4502L3.23 2.14016ZM7 14.8602C7.31 13.3802 7.94 11.9302 9.08 10.8102L10.67 12.4002C9.13 12.7802 7.96 13.5702 7 14.8602ZM13 8.99016V8.01016C13 7.57016 13.52 7.35016 13.84 7.64016L15 8.73016L16.61 10.2302C16.82 10.4302 16.82 10.7602 16.61 10.9602L15.72 11.7902L21.3 17.3702C21.73 17.0002 22 16.4702 22 15.8602V5.86016C22 4.77016 21.11 3.88016 20.02 3.88016H7.8L12.94 9.01016C12.96 9.00016 12.98 8.99016 13 8.99016Z',\n search:\n 'M9.50244 15.7502C7.7266 15.7502 6.22369 15.1352 4.99369 13.9052C3.76352 12.675 3.14844 11.1847 3.14844 9.43419C3.14844 7.68369 3.76194 6.19319 4.98894 4.96269C6.21594 3.73219 7.70902 3.11694 9.46819 3.11694C11.2274 3.11694 12.7194 3.73228 13.9444 4.96294C15.1694 6.19361 15.7819 7.68553 15.7819 9.43869C15.7819 10.1464 15.6666 10.8287 15.4359 11.4857C15.2054 12.1425 14.8721 12.7474 14.4359 13.3002L20.3014 19.1204C20.4551 19.2743 20.5319 19.4635 20.5319 19.6882C20.5319 19.9129 20.4528 20.1058 20.2944 20.2669C20.1361 20.4279 19.9432 20.5084 19.7157 20.5084C19.4882 20.5084 19.3002 20.429 19.1517 20.2702L13.3067 14.4209C12.8124 14.8488 12.2363 15.1773 11.5784 15.4064C10.9204 15.6356 10.2284 15.7502 9.50244 15.7502ZM9.48194 14.1669C10.7929 14.1669 11.9068 13.7062 12.8234 12.7847C13.7401 11.8632 14.1984 10.7458 14.1984 9.43244C14.1984 8.11928 13.7401 7.00228 12.8234 6.08144C11.9068 5.16061 10.7915 4.70019 9.47769 4.70019C8.15452 4.70019 7.03277 5.16094 6.11244 6.08244C5.1921 7.00394 4.73194 8.12128 4.73194 9.43444C4.73194 10.7478 5.19235 11.8649 6.11319 12.7857C7.03402 13.7065 8.15694 14.1669 9.48194 14.1669Z',\n settings:\n 'M19.5006 12C19.5006 11.77 19.4906 11.55 19.4706 11.32L21.3306 9.91C21.7306 9.61 21.8406 9.05 21.5906 8.61L19.7206 5.38C19.4706 4.94 18.9306 4.76 18.4706 4.96L16.3206 5.87C15.9506 5.61 15.5606 5.38 15.1506 5.19L14.8606 2.88C14.8006 2.38 14.3706 2 13.8706 2H10.1406C9.63064 2 9.20064 2.38 9.14064 2.88L8.85064 5.19C8.44064 5.38 8.05064 5.61 7.68064 5.87L5.53064 4.96C5.07064 4.76 4.53064 4.94 4.28064 5.38L2.41064 8.62C2.16064 9.06 2.27064 9.61 2.67064 9.92L4.53064 11.33C4.51064 11.55 4.50064 11.77 4.50064 12C4.50064 12.23 4.51064 12.45 4.53064 12.68L2.67064 14.09C2.27064 14.39 2.16064 14.95 2.41064 15.39L4.28064 18.62C4.53064 19.06 5.07064 19.24 5.53064 19.04L7.68064 18.13C8.05064 18.39 8.44064 18.62 8.85064 18.81L9.14064 21.12C9.20064 21.62 9.63064 22 10.1306 22H13.8606C14.3606 22 14.7906 21.62 14.8506 21.12L15.1406 18.81C15.5506 18.62 15.9406 18.39 16.3106 18.13L18.4606 19.04C18.9206 19.24 19.4606 19.06 19.7106 18.62L21.5806 15.39C21.8306 14.95 21.7206 14.4 21.3206 14.09L19.4606 12.68C19.4906 12.45 19.5006 12.23 19.5006 12ZM12.0406 15.5C10.1106 15.5 8.54064 13.93 8.54064 12C8.54064 10.07 10.1106 8.5 12.0406 8.5C13.9706 8.5 15.5406 10.07 15.5406 12C15.5406 13.93 13.9706 15.5 12.0406 15.5Z',\n share:\n 'M18 16.1191C17.24 16.1191 16.56 16.4191 16.04 16.8891L8.91 12.7391C8.96 12.5091 9 12.2791 9 12.0391C9 11.7991 8.96 11.5691 8.91 11.3391L15.96 7.22906C16.5 7.72906 17.21 8.03906 18 8.03906C19.66 8.03906 21 6.69906 21 5.03906C21 3.37906 19.66 2.03906 18 2.03906C16.34 2.03906 15 3.37906 15 5.03906C15 5.27906 15.04 5.50906 15.09 5.73906L8.04 9.84906C7.5 9.34906 6.79 9.03906 6 9.03906C4.34 9.03906 3 10.3791 3 12.0391C3 13.6991 4.34 15.0391 6 15.0391C6.79 15.0391 7.5 14.7291 8.04 14.2291L15.16 18.3891C15.11 18.5991 15.08 18.8191 15.08 19.0391C15.08 20.6491 16.39 21.9591 18 21.9591C19.61 21.9591 20.92 20.6491 20.92 19.0391C20.92 17.4291 19.61 16.1191 18 16.1191Z',\n sidebar:\n 'M15 20H3C2.45 20 2 19.55 2 19V5C2 4.45 2.45 4 3 4H15C15.55 4 16 4.45 16 5V19C16 19.55 15.55 20 15 20ZM19 8H21C21.55 8 22 7.55 22 7V5C22 4.45 21.55 4 21 4H19C18.45 4 18 4.45 18 5V7C18 7.55 18.45 8 19 8ZM19 20H21C21.55 20 22 19.55 22 19V17C22 16.45 21.55 16 21 16H19C18.45 16 18 16.45 18 17V19C18 19.55 18.45 20 19 20ZM19 14H21C21.55 14 22 13.55 22 13V11C22 10.45 21.55 10 21 10H19C18.45 10 18 10.45 18 11V13C18 13.55 18.45 14 19 14Z',\n signal:\n 'M18 4C18.83 4 19.5 4.67 19.5 5.5V18.5C19.5 19.33 18.83 20 18 20C17.17 20 16.5 19.33 16.5 18.5V5.5C16.5 4.67 17.17 4 18 4ZM6 14C6.83 14 7.5 14.67 7.5 15.5V18.5C7.5 19.33 6.83 20 6 20C5.17 20 4.5 19.33 4.5 18.5V15.5C4.5 14.67 5.17 14 6 14ZM12 9C12.83 9 13.5 9.67 13.5 10.5V18.5C13.5 19.33 12.83 20 12 20C11.17 20 10.5 19.33 10.5 18.5V10.5C10.5 9.67 11.17 9 12 9Z',\n 'speaker-fill':\n 'M3 10.002V14.002C3 14.552 3.45 15.002 4 15.002H7L10.29 18.292C10.92 18.922 12 18.472 12 17.582V6.41204C12 5.52204 10.92 5.07204 10.29 5.70204L7 9.00204H4C3.45 9.00204 3 9.45204 3 10.002ZM16.5 12.002C16.5 10.232 15.48 8.71204 14 7.97204V16.022C15.48 15.292 16.5 13.772 16.5 12.002ZM14 4.45204V4.65204C14 5.03204 14.25 5.36204 14.6 5.50204C17.18 6.53204 19 9.06204 19 12.002C19 14.942 17.18 17.472 14.6 18.502C14.24 18.642 14 18.972 14 19.352V19.552C14 20.182 14.63 20.622 15.21 20.402C18.6 19.112 21 15.842 21 12.002C21 8.16204 18.6 4.89204 15.21 3.60204C14.63 3.37204 14 3.82204 14 4.45204Z',\n spotlight:\n 'M2 6V18C2 19.1 2.9 20 4 20H20C21.1 20 22 19.1 22 18V6C22 4.9 21.1 4 20 4H4C2.9 4 2 4.9 2 6Z',\n stats:\n 'M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3ZM8 17C7.45 17 7 16.55 7 16V11C7 10.45 7.45 10 8 10C8.55 10 9 10.45 9 11V16C9 16.55 8.55 17 8 17ZM12 17C11.45 17 11 16.55 11 16V8C11 7.45 11.45 7 12 7C12.55 7 13 7.45 13 8V16C13 16.55 12.55 17 12 17ZM16 17C15.45 17 15 16.55 15 16V14C15 13.45 15.45 13 16 13C16.55 13 17 13.45 17 14V16C17 16.55 16.55 17 16 17Z',\n 'switch-camera':\n 'M4.30775 20.5C3.80258 20.5 3.375 20.325 3.025 19.975C2.675 19.625 2.5 19.1974 2.5 18.6923V7.30775C2.5 6.80258 2.675 6.375 3.025 6.025C3.375 5.675 3.80258 5.5 4.30775 5.5H7.3615L8.66925 4.08275C8.83342 3.90192 9.03183 3.75958 9.2645 3.65575C9.49717 3.55192 9.74233 3.5 10 3.5H14C14.2577 3.5 14.5028 3.55192 14.7355 3.65575C14.9682 3.75958 15.1666 3.90192 15.3307 4.08275L16.6385 5.5H19.6923C20.1974 5.5 20.625 5.675 20.975 6.025C21.325 6.375 21.5 6.80258 21.5 7.30775V18.6923C21.5 19.1974 21.325 19.625 20.975 19.975C20.625 20.325 20.1974 20.5 19.6923 20.5H4.30775ZM15.6038 13.0345C15.5166 14.0333 15.1384 14.8863 14.4693 15.5933C13.8001 16.3003 12.977 16.6538 12 16.6538C11.8603 16.6538 11.7206 16.6438 11.5808 16.624C11.4411 16.6042 11.3013 16.5776 11.1615 16.5443C11.041 16.5173 10.9153 16.5204 10.7845 16.5538C10.6538 16.5871 10.5513 16.6506 10.477 16.7443C10.3513 16.8891 10.3119 17.057 10.3588 17.248C10.4054 17.439 10.5166 17.5666 10.6923 17.6308C10.9064 17.7141 11.1228 17.7708 11.3413 17.801C11.5599 17.8312 11.7795 17.8463 12 17.8463C13.3167 17.8463 14.4292 17.3748 15.3375 16.4318C16.2458 15.4888 16.7321 14.3461 16.7962 13.0038L17.2807 13.4443C17.4051 13.5519 17.5464 13.6042 17.7048 13.601C17.8631 13.5978 17.9961 13.5423 18.1038 13.4345C18.2281 13.3102 18.2928 13.1679 18.298 13.0078C18.3032 12.8474 18.2436 12.7051 18.1193 12.5808L16.8828 11.3443C16.7123 11.1738 16.5013 11.0885 16.25 11.0885C15.9987 11.0885 15.7878 11.1738 15.6173 11.3443L14.3807 12.5808C14.2564 12.7051 14.1943 12.8448 14.1943 13C14.1943 13.1552 14.2564 13.2949 14.3807 13.4193C14.5051 13.5436 14.6448 13.6058 14.8 13.6058C14.9552 13.6058 15.0949 13.5436 15.2193 13.4193L15.6038 13.0345ZM7.20375 12.9963L6.71925 12.5558C6.59492 12.4481 6.45358 12.3958 6.29525 12.399C6.13692 12.4022 6.00392 12.4577 5.89625 12.5655C5.77192 12.6898 5.70717 12.8321 5.702 12.9923C5.69683 13.1526 5.75642 13.2949 5.88075 13.4193L7.11725 14.6558C7.28775 14.8263 7.49867 14.9115 7.75 14.9115C8.00133 14.9115 8.21225 14.8263 8.38275 14.6558L9.61925 13.4193C9.74358 13.2949 9.80575 13.1552 9.80575 13C9.80575 12.8448 9.74358 12.7051 9.61925 12.5808C9.49492 12.4564 9.35517 12.3943 9.2 12.3943C9.04483 12.3943 8.90508 12.4564 8.78075 12.5808L8.39625 12.9655C8.48342 11.9667 8.86158 11.1138 9.53075 10.4068C10.1999 9.69975 11.023 9.34625 12 9.34625C12.1397 9.34625 12.2794 9.35617 12.4192 9.376C12.5589 9.39583 12.6954 9.42242 12.8288 9.45575C12.9493 9.48908 13.0765 9.48908 13.2105 9.45575C13.3445 9.42242 13.4487 9.35575 13.523 9.25575C13.6487 9.11092 13.6897 8.943 13.6462 8.752C13.6026 8.561 13.4929 8.43342 13.3173 8.36925C13.0968 8.29875 12.8788 8.24525 12.6635 8.20875C12.4482 8.17208 12.227 8.15375 12 8.15375C10.6833 8.15375 9.57083 8.62525 8.6625 9.56825C7.75417 10.5113 7.26792 11.6539 7.20375 12.9963Z',\n 'tile-fill':\n 'M5 11C4.591 11 4.23875 10.8523 3.94325 10.5568C3.64775 10.2613 3.5 9.909 3.5 9.5V5C3.5 4.591 3.64775 4.23875 3.94325 3.94325C4.23875 3.64775 4.591 3.5 5 3.5H9.5C9.909 3.5 10.2613 3.64775 10.5568 3.94325C10.8523 4.23875 11 4.591 11 5V9.5C11 9.909 10.8523 10.2613 10.5568 10.5568C10.2613 10.8523 9.909 11 9.5 11H5ZM5 20.5C4.591 20.5 4.23875 20.3523 3.94325 20.0568C3.64775 19.7613 3.5 19.409 3.5 19V14.5C3.5 14.091 3.64775 13.7388 3.94325 13.4433C4.23875 13.1478 4.591 13 5 13H9.5C9.909 13 10.2613 13.1478 10.5568 13.4433C10.8523 13.7388 11 14.091 11 14.5V19C11 19.409 10.8523 19.7613 10.5568 20.0568C10.2613 20.3523 9.909 20.5 9.5 20.5H5ZM14.5 11C14.091 11 13.7388 10.8523 13.4433 10.5568C13.1478 10.2613 13 9.909 13 9.5V5C13 4.591 13.1478 4.23875 13.4433 3.94325C13.7388 3.64775 14.091 3.5 14.5 3.5H19C19.409 3.5 19.7613 3.64775 20.0568 3.94325C20.3523 4.23875 20.5 4.591 20.5 5V9.5C20.5 9.909 20.3523 10.2613 20.0568 10.5568C19.7613 10.8523 19.409 11 19 11H14.5ZM14.5 20.5C14.091 20.5 13.7388 20.3523 13.4433 20.0568C13.1478 19.7613 13 19.409 13 19V14.5C13 14.091 13.1478 13.7388 13.4433 13.4433C13.7388 13.1478 14.091 13 14.5 13H19C19.409 13 19.7613 13.1478 20.0568 13.4433C20.3523 13.7388 20.5 14.091 20.5 14.5V19C20.5 19.409 20.3523 19.7613 20.0568 20.0568C19.7613 20.3523 19.409 20.5 19 20.5H14.5Z',\n unpin:\n 'M14.1851 11.3595L7.56988 4.74425C7.49172 4.66608 7.43655 4.58658 7.40438 4.50575C7.37238 4.42508 7.35638 4.33791 7.35638 4.24425C7.35638 4.05458 7.42022 3.88308 7.54788 3.72975C7.67538 3.57658 7.8513 3.5 8.07563 3.5H15.7506C15.9631 3.5 16.1412 3.57216 16.2849 3.7165C16.4287 3.86066 16.5006 4.03941 16.5006 4.25275C16.5006 4.45341 16.4135 4.59991 16.2391 4.69225C16.0648 4.78458 15.902 4.88716 15.7506 5H15.5006V10.8077C15.5006 11.1531 15.343 11.3929 15.0276 11.5272C14.7121 11.6616 14.4313 11.6057 14.1851 11.3595ZM11.2506 21V15.5H8.17963C7.81247 15.5 7.51872 15.3717 7.29838 15.1152C7.07822 14.8589 6.96813 14.5731 6.96813 14.2577C6.96813 14.1001 6.99955 13.9438 7.06238 13.789C7.12522 13.6343 7.22647 13.4867 7.36613 13.3462L8.50063 12.2115V10.6385L2.65838 4.76525C2.51988 4.62691 2.44647 4.4555 2.43813 4.251C2.4298 4.0465 2.50388 3.866 2.66038 3.7095C2.80388 3.566 2.97888 3.49425 3.18538 3.49425C3.39172 3.49425 3.5673 3.56666 3.71213 3.7115L19.8891 19.8885C20.0378 20.0372 20.1111 20.2137 20.1091 20.4182C20.1073 20.6227 20.0288 20.8032 19.8736 20.9597C19.7185 21.1032 19.5428 21.1775 19.3466 21.1825C19.1506 21.1877 18.975 21.1127 18.8199 20.9575L13.3621 15.5H12.7506V21C12.7506 21.2125 12.6787 21.3906 12.5349 21.5342C12.391 21.6781 12.2129 21.75 12.0004 21.75C11.7877 21.75 11.6096 21.6781 11.4661 21.5342C11.3225 21.3906 11.2506 21.2125 11.2506 21Z',\n video:\n 'M15 8V16H5V8H15ZM16 6H4C3.45 6 3 6.45 3 7V17C3 17.55 3.45 18 4 18H16C16.55 18 17 17.55 17 17V13.5L21 17.5V6.5L17 10.5V7C17 6.45 16.55 6 16 6Z',\n 'video-fill':\n 'M17.332 10.5V7C17.332 6.45 16.882 6 16.332 6H4.33203C3.78203 6 3.33203 6.45 3.33203 7V17C3.33203 17.55 3.78203 18 4.33203 18H16.332C16.882 18 17.332 17.55 17.332 17V13.5L19.622 15.79C20.252 16.42 21.332 15.97 21.332 15.08V8.91C21.332 8.02 20.252 7.57 19.622 8.2L17.332 10.5Z',\n 'video-off':\n 'M9.98969 8.57005L7.98969 6.57005L3.83969 2.43005L2.42969 3.84005L5.15969 6.57005H4.42969C3.87969 6.57005 3.42969 7.02005 3.42969 7.57005V17.5701C3.42969 18.1201 3.87969 18.5701 4.42969 18.5701H16.4297C16.6397 18.5701 16.8197 18.4901 16.9797 18.3901L20.1597 21.5701L21.5697 20.1601L12.7097 11.3001L9.98969 8.57005ZM5.42969 16.5701V8.57005H7.15969L15.1597 16.5701H5.42969ZM15.4297 8.57005V11.1801L21.4297 17.1801V7.07005L17.4297 11.0701V7.57005C17.4297 7.02005 16.9797 6.57005 16.4297 6.57005H10.8197L12.8197 8.57005H15.4297Z',\n 'video-off-fill':\n 'M17.768 10.8844L20.514 8.13811C20.6615 7.99061 20.8273 7.95378 21.0113 8.02761C21.1953 8.10128 21.2873 8.24194 21.2873 8.44961V15.5496C21.2873 15.7573 21.1953 15.8979 21.0113 15.9716C20.8273 16.0454 20.6615 16.0086 20.514 15.8611L17.6603 13.0074V13.1804C17.5578 13.4522 17.3523 13.6275 17.044 13.7064C16.7357 13.7852 16.4648 13.7079 16.2315 13.4746L8.79301 6.03611C8.64551 5.88878 8.56092 5.73144 8.53926 5.56411C8.51742 5.39678 8.54176 5.23103 8.61226 5.06686C8.68276 4.90286 8.78659 4.76728 8.92376 4.66011C9.06092 4.55311 9.23334 4.49961 9.44101 4.49961H15.9603C16.4654 4.49961 16.893 4.67461 17.243 5.02461C17.593 5.37461 17.768 5.80219 17.768 6.30736V10.8844ZM19.4448 21.6304L2.06026 4.24586C1.92192 4.10736 1.85109 3.93328 1.84776 3.72361C1.84459 3.51411 1.91542 3.33686 2.06026 3.19186C2.20526 3.04703 2.38092 2.97461 2.58726 2.97461C2.79359 2.97461 2.96926 3.04703 3.11426 3.19186L20.4988 20.5764C20.6373 20.7149 20.7081 20.8889 20.7113 21.0986C20.7144 21.3083 20.6436 21.4855 20.4988 21.6304C20.3539 21.7752 20.1783 21.8476 19.9718 21.8476C19.7654 21.8476 19.5898 21.7752 19.4448 21.6304ZM4.44101 4.51886L17.7488 17.8266C17.7168 18.2933 17.5305 18.6888 17.19 19.0131C16.8497 19.3374 16.4398 19.4996 15.9603 19.4996H4.57576C4.07059 19.4996 3.64301 19.3246 3.29301 18.9746C2.94301 18.6246 2.76801 18.197 2.76801 17.6919V6.30736C2.76801 5.82786 2.93017 5.41794 3.25451 5.07761C3.57884 4.73711 3.97434 4.55086 4.44101 4.51886Z',\n 'virtual-background':\n 'M4 5C4 4.45 4.45 4 5 4H10C10.55 4 11 3.55 11 3C11 2.45 10.55 2 10 2H4C2.9 2 2 2.9 2 4V10C2 10.55 2.45 11 3 11C3.55 11 4 10.55 4 10V5ZM9.61 13.49L6.65 17.19C6.39 17.52 6.62 18 7.04 18H17C17.41 18 17.65 17.53 17.4 17.2L15.4 14.53C15.2 14.26 14.8 14.26 14.6 14.53L12.97 16.71L10.39 13.49C10.19 13.24 9.81 13.24 9.61 13.49ZM17 8.5C17 7.67 16.33 7 15.5 7C14.67 7 14 7.67 14 8.5C14 9.33 14.67 10 15.5 10C16.33 10 17 9.33 17 8.5ZM20 2H14C13.45 2 13 2.45 13 3C13 3.55 13.45 4 14 4H19C19.55 4 20 4.45 20 5V10C20 10.55 20.45 11 21 11C21.55 11 22 10.55 22 10V4C22 2.9 21.1 2 20 2ZM20 19C20 19.55 19.55 20 19 20H14C13.45 20 13 20.45 13 21C13 21.55 13.45 22 14 22H20C21.1 22 22 21.1 22 20V14C22 13.45 21.55 13 21 13C20.45 13 20 13.45 20 14V19ZM3 13C2.45 13 2 13.45 2 14V20C2 21.1 2.9 22 4 22H10C10.55 22 11 21.55 11 21C11 20.45 10.55 20 10 20H5C4.45 20 4 19.55 4 19V14C4 13.45 3.55 13 3 13Z',\n wave: 'M7.375 16.8077V7.19225C7.375 6.97975 7.44692 6.80167 7.59075 6.658C7.73458 6.51417 7.91275 6.44225 8.12525 6.44225C8.33792 6.44225 8.516 6.51417 8.6595 6.658C8.80317 6.80167 8.875 6.97975 8.875 7.19225V16.8077C8.875 17.0203 8.80308 17.1983 8.65925 17.342C8.51542 17.4858 8.33725 17.5577 8.12475 17.5577C7.91208 17.5577 7.734 17.4858 7.5905 17.342C7.44683 17.1983 7.375 17.0203 7.375 16.8077ZM11.25 20.75V3.25C11.25 3.0375 11.3219 2.85942 11.4658 2.71575C11.6096 2.57192 11.7878 2.5 12.0003 2.5C12.2129 2.5 12.391 2.57192 12.5345 2.71575C12.6782 2.85942 12.75 3.0375 12.75 3.25V20.75C12.75 20.9625 12.6781 21.1406 12.5343 21.2843C12.3904 21.4281 12.2122 21.5 11.9998 21.5C11.7871 21.5 11.609 21.4281 11.4655 21.2843C11.3218 21.1406 11.25 20.9625 11.25 20.75ZM3.5 12.9038V11.0962C3.5 10.8837 3.57192 10.7056 3.71575 10.5617C3.85958 10.4181 4.03775 10.3462 4.25025 10.3462C4.46292 10.3462 4.641 10.4181 4.7845 10.5617C4.92817 10.7056 5 10.8837 5 11.0962V12.9038C5 13.1163 4.92808 13.2944 4.78425 13.4383C4.64042 13.5819 4.46225 13.6538 4.24975 13.6538C4.03708 13.6538 3.859 13.5819 3.7155 13.4383C3.57183 13.2944 3.5 13.1163 3.5 12.9038ZM15.125 16.8077V7.19225C15.125 6.97975 15.1969 6.80167 15.3408 6.658C15.4846 6.51417 15.6628 6.44225 15.8753 6.44225C16.0879 6.44225 16.266 6.51417 16.4095 6.658C16.5532 6.80167 16.625 6.97975 16.625 7.19225V16.8077C16.625 17.0203 16.5531 17.1983 16.4093 17.342C16.2654 17.4858 16.0872 17.5577 15.8748 17.5577C15.6621 17.5577 15.484 17.4858 15.3405 17.342C15.1968 17.1983 15.125 17.0203 15.125 16.8077ZM19 12.9038V11.0962C19 10.8837 19.0719 10.7056 19.2158 10.5617C19.3596 10.4181 19.5378 10.3462 19.7502 10.3462C19.9629 10.3462 20.141 10.4181 20.2845 10.5617C20.4282 10.7056 20.5 10.8837 20.5 11.0962V12.9038C20.5 13.1163 20.4281 13.2944 20.2843 13.4383C20.1404 13.5819 19.9622 13.6538 19.7498 13.6538C19.5371 13.6538 19.359 13.5819 19.2155 13.4383C19.0718 13.2944 19 13.1163 19 12.9038Z',\n} as const;\n\nexport type IconName = keyof typeof PATH_MAP;\n","import React from 'react';\nimport Svg, { Path } from 'react-native-svg';\nimport { IconName, PATH_MAP } from './icon-paths-24x24';\n\ntype IconProps = {\n name: IconName;\n size?: number;\n fill?: string;\n};\n\nconst Icon: React.FC<IconProps> = ({ name, size = 24, fill }) => {\n const paths =\n typeof PATH_MAP[name] === 'string' ? [PATH_MAP[name]] : PATH_MAP[name];\n return (\n <Svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n {paths.map((path, index) => (\n <Path key={index} d={path} fill={fill} />\n ))}\n </Svg>\n );\n};\n\nexport default Icon;\n","import { useBaseStore } from '@cometchat/calls-sdk-core';\nimport React, { useRef } from 'react';\nimport {\n Animated,\n Modal,\n Pressable,\n StyleSheet,\n Text,\n TouchableOpacity,\n} from 'react-native';\nimport Icon from '../icon/Icon.native';\nimport { IconName } from '../icon/icon-paths-24x24';\nimport { commonStyles } from '../theme/style-variables';\n\nconst POPUP_MENU_WIDTH = 180;\nconst DISABLED_OPTION_OPACITY = 0.5;\n\nexport const PopupMenu = ({\n visible,\n onClose,\n options,\n anchorLayout,\n}: {\n visible: boolean;\n onClose: () => void;\n options: {\n label: string;\n onPress: () => void;\n iconName?: IconName;\n selected?: boolean;\n }[];\n anchorLayout: { x: number; y: number; width: number; height: number };\n}) => {\n const scaleAnim = useRef(new Animated.Value(0.7)).current;\n const callContainerDimension = useBaseStore(\n state => state.callContainerDimension,\n );\n\n React.useEffect(() => {\n if (visible) {\n Animated.spring(scaleAnim, {\n toValue: 1,\n useNativeDriver: true,\n friction: 12,\n tension: 200,\n }).start();\n } else {\n scaleAnim.setValue(0.7);\n }\n }, [scaleAnim, visible]);\n\n if (!visible || !anchorLayout) {\n return null;\n }\n\n const { x, y, height } = anchorLayout;\n const minLeft = callContainerDimension.width - POPUP_MENU_WIDTH - 10;\n const isBelowMiddle = callContainerDimension.height >> 1 < y;\n\n return (\n <Modal transparent animationType=\"none\" onRequestClose={onClose}>\n <Pressable style={styles.backdrop} onPress={onClose}>\n <Animated.View\n style={[\n styles.menu,\n {\n [isBelowMiddle ? 'bottom' : 'top']: isBelowMiddle\n ? callContainerDimension.height - (y - 4)\n : y + height + 4,\n left: Math.min(minLeft, x),\n transform: [\n { scale: scaleAnim },\n {\n translateY: scaleAnim.interpolate({\n inputRange: [0.7, 1],\n outputRange: [-40, 0],\n }),\n },\n ],\n },\n ]}>\n {options.map((option, index) => (\n <TouchableOpacity\n key={index}\n onPress={e => {\n if (option.selected) {\n e.stopPropagation();\n return;\n }\n option.onPress();\n onClose();\n }}\n activeOpacity={option.selected ? DISABLED_OPTION_OPACITY : 0.2}\n style={[\n styles.menuItem,\n option.selected ? styles.menuItemSelected : {},\n ]}>\n {option.iconName && (\n <Icon name={option.iconName} size={24} fill=\"#858585\" />\n )}\n <Text style={[commonStyles.bodyRegular, styles.menuText]}>\n {option.label}\n </Text>\n </TouchableOpacity>\n ))}\n </Animated.View>\n </Pressable>\n </Modal>\n );\n};\n\nconst styles = StyleSheet.create({\n backdrop: {\n flex: 1,\n },\n menu: {\n position: 'absolute',\n backgroundColor: '#141414',\n borderWidth: 1,\n borderColor: '#383838',\n borderRadius: 16,\n paddingVertical: 8,\n width: POPUP_MENU_WIDTH,\n shadowColor: '#000',\n shadowOpacity: 0.3,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 4 },\n elevation: 8,\n overflow: 'hidden',\n },\n menuItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 8,\n paddingHorizontal: 16,\n height: 40,\n gap: 8,\n },\n menuItemSelected: {\n opacity: DISABLED_OPTION_OPACITY,\n },\n menuText: {\n color: '#FFFFFF',\n flex: 1,\n },\n iconPlaceholder: {\n width: 24,\n height: 24,\n backgroundColor: '#858585',\n borderRadius: 4,\n },\n});\n\nexport default PopupMenu;\n","import { StyleSheet } from 'react-native';\n\nexport const styles = StyleSheet.create({\n participantItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 12,\n paddingHorizontal: 16,\n gap: 12,\n backgroundColor: '#1A1A1A',\n },\n participantText: {\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 4,\n flexGrow: 1,\n flexShrink: 1,\n },\n participantName: {\n color: '#ffffff',\n },\n participantDescription: {\n color: '#989898',\n },\n participantIcons: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n flexShrink: 0,\n },\n avatar: {\n backgroundColor: '#3E3180',\n },\n moreButton: {\n width: 28,\n height: 28,\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 1000,\n backgroundColor: '#262626',\n },\n});\n","import {\n MEDIA_TYPE,\n muteParticipant,\n pinParticipant,\n unpinParticipant,\n useAllParticipants,\n useIsParticipantPinned,\n useLocalParticipant,\n useTrackMuted,\n} from '@cometchat/calls-sdk-core';\nimport React, { useMemo, useRef, useState } from 'react';\nimport { TouchableOpacity, View } from 'react-native';\nimport { IconName } from '../../icon/icon-paths-24x24';\nimport Icon from '../../icon/Icon.native';\nimport { PopupMenu } from '../../shared/Popup';\nimport { styles } from './styles';\n\ninterface MoreOptionButtonProps {\n ruid: string;\n}\n\nconst MoreOptionButton: React.FC<MoreOptionButtonProps> = ({ ruid }) => {\n const [menuVisible, setMenuVisible] = useState(false);\n const buttonRef = useRef<View>(null);\n const [anchorLayout, setAnchorLayout] = useState({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n });\n const participant = useAllParticipants().find(p => p.ruid === ruid)!;\n const localParticipant = useLocalParticipant();\n const isParticipantPinned = useIsParticipantPinned(\n participant?.pid,\n participant?.type,\n );\n const muted = useTrackMuted(MEDIA_TYPE.AUDIO, participant?.pid);\n\n const options = useMemo(() => {\n const opts: { label: string; onPress: () => void; iconName?: IconName }[] =\n [\n {\n label: isParticipantPinned ? 'Unpin' : 'Pin',\n iconName: isParticipantPinned ? 'unpin' : 'pin',\n onPress: () => {\n if (isParticipantPinned) {\n unpinParticipant();\n } else {\n pinParticipant(participant.pid, participant.type);\n }\n },\n },\n ];\n if (!participant) {\n return opts;\n }\n\n if (\n localParticipant.role === 'moderator' &&\n participant.pid !== localParticipant.pid\n ) {\n if (!muted) {\n opts.push({\n label: 'Mute Audio',\n iconName: 'mic-off',\n onPress: () => {\n muteParticipant(participant.pid);\n },\n });\n }\n }\n return opts;\n }, [\n isParticipantPinned,\n participant,\n localParticipant.role,\n localParticipant.pid,\n muted,\n ]);\n\n if (!participant) {\n return null;\n }\n\n const showMenu = () => {\n if (buttonRef.current) {\n buttonRef.current.measureInWindow((x, y, width, height) => {\n setAnchorLayout({ x, y, width, height });\n setMenuVisible(true);\n });\n }\n };\n\n return (\n <>\n <TouchableOpacity\n ref={buttonRef}\n style={styles.moreButton}\n onPress={showMenu}>\n <Icon name=\"more\" size={20} fill=\"#767676\" />\n </TouchableOpacity>\n <PopupMenu\n visible={menuVisible}\n anchorLayout={anchorLayout}\n onClose={() => setMenuVisible(false)}\n options={options}\n />\n </>\n );\n};\n\nexport default MoreOptionButton;\n","import {\n MEDIA_TYPE,\n Participant,\n useIsParticipantPinned,\n useRaisedHandTimestamp,\n useTrackMuted,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { StyleProp, StyleSheet, Text, View, ViewStyle } from 'react-native';\nimport Icon from '../icon/Icon.native';\nimport { commonStyles } from '../theme/style-variables';\n\ninterface LabelProps {\n participant: Participant;\n style?: StyleProp<ViewStyle>;\n}\n\nconst LabelIcon = ({\n type,\n muted,\n raisedHandTimestamp,\n}: {\n type: Participant['type'];\n muted?: boolean;\n raisedHandTimestamp?: number;\n}) => {\n if (type === 'screen-share') {\n return <Icon name=\"screen-share\" size={16} fill=\"#858585\" />;\n }\n if (raisedHandTimestamp) {\n return <Icon name=\"raise-hand-fill\" size={16} fill=\"#141414\" />;\n }\n if (muted) {\n return <Icon name=\"mic-off-fill\" size={16} fill=\"#858585\" />;\n }\n return <Icon name=\"wave\" size={16} fill=\"#0B9F5D\" />;\n};\n\nconst Label = ({ participant, style }: LabelProps) => {\n const { name, isLocal, type, pid } = participant;\n const muted = useTrackMuted(MEDIA_TYPE.AUDIO, pid);\n const raisedHandTimestamp = useRaisedHandTimestamp(pid, type);\n const isParticipantPinned = useIsParticipantPinned(pid, type);\n\n return (\n <View\n style={[\n styles.userLabel,\n raisedHandTimestamp ? styles.userLabelRaisedHand : {},\n style,\n ]}>\n {isParticipantPinned && (\n <Icon\n name=\"pin\"\n size={16}\n fill={raisedHandTimestamp ? '#141414' : '#FFF'}\n />\n )}\n <LabelIcon\n type={type}\n muted={muted}\n raisedHandTimestamp={raisedHandTimestamp}\n />\n <Text\n style={[\n commonStyles.caption1Regular,\n styles.userName,\n raisedHandTimestamp ? styles.userNameRaisedHand : {},\n ]}\n numberOfLines={1}\n ellipsizeMode=\"tail\">\n {name} {isLocal && '(You)'}\n </Text>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n userLabel: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'flex-start',\n alignItems: 'center',\n padding: 4,\n position: 'absolute',\n left: 4,\n bottom: 4,\n backgroundColor: '#141414CC',\n borderRadius: 4,\n gap: 2,\n maxWidth: '95%',\n },\n userLabelRaisedHand: {\n backgroundColor: '#FFFFFF',\n borderRadius: 1000,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 4 },\n shadowOpacity: 0.2,\n shadowRadius: 10,\n elevation: 5,\n },\n userName: {\n color: '#ffffff',\n flexShrink: 1,\n },\n userNameRaisedHand: {\n color: '#141414',\n },\n});\n\nexport default Label;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Animated, StyleProp, StyleSheet, ViewStyle } from 'react-native';\nimport { RTCView } from 'react-native-webrtc';\n\ninterface VideoNativeProps {\n videoTrack: any;\n style?: StyleProp<ViewStyle>;\n objectFit?: 'cover' | 'contain';\n mirror?: boolean;\n muted?: boolean;\n zOrder?: number;\n}\n\nconst VideoNative: React.FC<VideoNativeProps> = ({\n videoTrack,\n style,\n objectFit = 'cover',\n mirror = false,\n muted = false,\n zOrder = 0,\n}) => {\n const [streamURL, setStreamURL] = useState<any | null>(null);\n const fadeAnim = useRef(new Animated.Value(muted ? 0 : 1)).current;\n\n useEffect(() => {\n if (videoTrack) {\n setStreamURL(videoTrack.getOriginalStream());\n }\n }, [videoTrack]);\n\n useEffect(() => {\n Animated.timing(fadeAnim, {\n toValue: muted ? 0 : 1,\n duration: 300,\n useNativeDriver: true,\n }).start();\n }, [muted, fadeAnim]);\n\n if (!streamURL) {\n return null;\n }\n\n return (\n <Animated.View style={[styles.videoContainer, { opacity: fadeAnim }]}>\n <RTCView\n streamURL={streamURL.toURL()}\n style={[styles.video, style]}\n objectFit={objectFit}\n mirror={mirror}\n zOrder={zOrder}\n />\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n videoContainer: {\n height: '100%',\n width: '100%',\n ...StyleSheet.absoluteFillObject,\n },\n video: {\n width: '100%',\n height: '100%',\n },\n});\n\nexport default VideoNative;\n","import {\n MEDIA_TYPE,\n Participant,\n togglePinParticipant,\n useEnableParticipantContextMenu,\n useTrackByParticipantId,\n useTrackMuted,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport {\n StyleProp,\n StyleSheet,\n TouchableOpacity,\n View,\n ViewStyle,\n} from 'react-native';\nimport Avatar from '../avatar/Avatar.native';\nimport MoreOptionButton from '../participants/participant-item/MoreOptionButton';\nimport Label from '../shared/Label.native';\nimport Video from '../video/Video.native';\n\ninterface TileProps {\n participant: Participant;\n style?: StyleProp<ViewStyle>;\n zOrder?: number;\n showLabel?: boolean;\n disablePress?: boolean;\n}\n\nconst Tile = ({\n participant,\n style,\n zOrder,\n showLabel = true,\n disablePress = false,\n}: TileProps) => {\n const { name, avatar, type, pid, ruid, isLocal } = participant;\n const videoTrack = useTrackByParticipantId(\n pid,\n type === 'screen-share' ? MEDIA_TYPE.SCREENSHARE : MEDIA_TYPE.VIDEO,\n )?.originalTrack;\n const videoMuted = useTrackMuted(\n type === 'screen-share' ? MEDIA_TYPE.SCREENSHARE : MEDIA_TYPE.VIDEO,\n pid,\n );\n const enableParticipantContextMenu = useEnableParticipantContextMenu();\n\n const [size, fontSize] = React.useMemo(() => {\n const flatStyle = StyleSheet.flatten(style);\n const width = flatStyle?.width;\n const height = flatStyle?.height;\n if (typeof width === 'number' && typeof height === 'number') {\n const calculatedSize = Math.min(Math.min(width, height) >> 1, 120);\n return [calculatedSize, calculatedSize >> 1];\n }\n return [48, 24];\n }, [style]);\n\n return (\n <TouchableOpacity\n onPress={() => {\n togglePinParticipant(participant.pid, participant.type);\n }}\n activeOpacity={1}\n disabled={disablePress}\n style={[styles.callScreen, style]}>\n <View style={styles.tileAvatar}>\n <Avatar name={name} imageUrl={avatar} size={size} fontSize={fontSize} />\n </View>\n <Video\n videoTrack={videoTrack}\n objectFit={type === 'screen-share' ? 'contain' : 'cover'}\n muted={videoMuted}\n zOrder={zOrder}\n mirror={isLocal}\n />\n {showLabel && <Label participant={participant} />}\n {enableParticipantContextMenu && (\n <View style={styles.rightTopButton}>\n <MoreOptionButton ruid={ruid} />\n </View>\n )}\n </TouchableOpacity>\n );\n};\n\nconst styles = StyleSheet.create({\n callScreen: {\n width: '100%',\n height: '100%',\n backgroundColor: '#272727',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 8,\n overflow: 'hidden',\n },\n tileAvatar: {\n width: '100%',\n height: '100%',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n },\n screenShareVideo: {\n objectFit: 'contain',\n },\n rightTopButton: {\n position: 'absolute',\n top: 4,\n right: 4,\n },\n});\n\nexport default Tile;\n","import {\n GRID_GAP,\n toggleParticipantListVisible,\n useAllParticipants,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport {\n StyleProp,\n StyleSheet,\n Text,\n TouchableOpacity,\n View,\n ViewStyle,\n} from 'react-native';\nimport Avatar from '../avatar/Avatar.native';\nimport { commonStyles } from '../theme/style-variables';\n\nexport interface GroupAvatarTileProps {\n startIndex?: number;\n style?: StyleProp<ViewStyle>;\n}\n\nconst Badge = ({ size = 40, text }: { size: number; text: string }) => {\n return (\n <View\n style={[\n styles.overflowCircle,\n { width: size, height: size, borderRadius: size / 2 },\n ]}>\n <Text style={[commonStyles.heading4Medium, styles.overflowText]}>\n {text}\n </Text>\n </View>\n );\n};\n\nconst GroupAvatarTile: React.FC<GroupAvatarTileProps> = ({\n startIndex = 4,\n style,\n}) => {\n const participants = useAllParticipants();\n const participantCount = participants.length;\n\n const overflowCount = Math.max(0, participantCount - startIndex - 3);\n const visible = participants.slice(\n startIndex,\n startIndex + (overflowCount === 1 ? 4 : 3),\n );\n\n return (\n <TouchableOpacity\n style={[styles.container, style]}\n onPress={toggleParticipantListVisible}>\n {/* first row */}\n <View style={styles.row}>\n {visible.slice(0, 2).map(item => (\n <Avatar\n key={item.ruid}\n size={40}\n name={item.name}\n imageUrl={item.avatar}\n />\n ))}\n </View>\n\n {/* second row */}\n <View style={styles.row}>\n {visible[2] && (\n <Avatar\n size={40}\n name={visible[2].name}\n imageUrl={visible[2].avatar}\n />\n )}\n {visible[3] ? (\n <Avatar\n size={40}\n name={visible[3].name}\n imageUrl={visible[3].avatar}\n />\n ) : null}\n\n {/* overflow badge */}\n {overflowCount > 1 && <Badge size={40} text={`+${overflowCount}`} />}\n </View>\n </TouchableOpacity>\n );\n};\n\nexport default GroupAvatarTile;\n\nconst styles = StyleSheet.create({\n container: {\n justifyContent: 'center',\n alignItems: 'center',\n gap: GRID_GAP,\n backgroundColor: '#272727',\n borderRadius: 8,\n },\n row: {\n flexDirection: 'row',\n gap: GRID_GAP,\n },\n overflowCircle: {\n backgroundColor: '#3E3180',\n alignItems: 'center',\n justifyContent: 'center',\n },\n overflowText: {\n color: 'white',\n },\n});\n","import {\n GRID_GAP,\n useAllParticipants,\n useBaseStore,\n useMainParticipant,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { StyleSheet, View } from 'react-native';\nimport Tile from '../tile/Tile.native';\nimport GroupAvatarTile from './GroupAvatarTile.native';\n\nconst useSidebarTileLayout = () => {\n let participantsCount = useAllParticipants().length;\n const mainAreaDimension = useBaseStore(state => state.mainAreaDimension);\n\n return React.useMemo(() => {\n if (participantsCount > 1) {\n // This is to avoid 2 participants view in sidebar layout\n participantsCount++;\n }\n let tileWidthFirst = mainAreaDimension.width;\n let tileHeightFirst = mainAreaDimension.height;\n let tileWidthOther = 0;\n let tileHeightOther = 0;\n let numberOfRows = 1;\n let numberOfCols = 1;\n if (participantsCount === 2) {\n tileWidthOther = mainAreaDimension.width;\n tileHeightOther = tileWidthOther * (9 / 16);\n tileHeightFirst = mainAreaDimension.height - GRID_GAP - tileHeightOther;\n } else if (participantsCount === 3) {\n tileWidthOther = (mainAreaDimension.width - GRID_GAP) / 2;\n tileHeightOther = tileWidthOther * (3 / 4);\n tileHeightFirst = mainAreaDimension.height - GRID_GAP - tileHeightOther;\n numberOfCols = 2;\n } else if (participantsCount === 4) {\n tileWidthOther = (mainAreaDimension.width - GRID_GAP * 2) / 3;\n tileHeightOther = tileWidthOther;\n tileHeightFirst = mainAreaDimension.height - GRID_GAP - tileHeightOther;\n numberOfCols = 3;\n } else if (participantsCount >= 5) {\n tileWidthOther = (mainAreaDimension.width - GRID_GAP) / 2;\n tileHeightOther = tileWidthOther * (3 / 4);\n tileHeightFirst =\n mainAreaDimension.height - GRID_GAP * 2 - tileHeightOther * 2;\n numberOfRows = 2;\n numberOfCols = 2;\n }\n return {\n tileWidthFirst,\n tileHeightFirst,\n tileWidthOther,\n tileHeightOther,\n numberOfRows,\n numberOfCols,\n };\n }, [participantsCount, mainAreaDimension.width, mainAreaDimension.height]);\n};\n\nfunction SidebarLayout(): React.JSX.Element {\n const allParticipants = useAllParticipants();\n const participantsLayout = useSidebarTileLayout();\n const mainParticipant = useMainParticipant();\n\n const participants =\n allParticipants.length > 1\n ? [mainParticipant].concat(allParticipants)\n : [mainParticipant];\n\n return (\n <View style={styles.container}>\n <Tile\n participant={participants[0]}\n style={{\n width: participantsLayout.tileWidthFirst,\n height: participantsLayout.tileHeightFirst,\n }}\n />\n {participantsLayout.numberOfRows >= 1 && (\n <View style={styles.row}>\n {participants\n .slice(1, 1 + participantsLayout.numberOfCols)\n .map(participant => (\n <Tile\n key={participant.ruid}\n participant={participant}\n style={{\n width: participantsLayout.tileWidthOther,\n height: participantsLayout.tileHeightOther,\n }}\n />\n ))}\n </View>\n )}\n {participantsLayout.numberOfRows >= 2 && (\n <View style={styles.row}>\n <Tile\n key={participants[3].ruid}\n participant={participants[3]}\n style={{\n width: participantsLayout.tileWidthOther,\n height: participantsLayout.tileHeightOther,\n }}\n />\n {participants.length === 5 && (\n <Tile\n key={participants[4].ruid}\n participant={participants[4]}\n style={{\n width: participantsLayout.tileWidthOther,\n height: participantsLayout.tileHeightOther,\n }}\n />\n )}\n {participants.length > 5 && (\n <GroupAvatarTile\n startIndex={4}\n style={{\n width: participantsLayout.tileWidthOther,\n height: participantsLayout.tileHeightOther,\n }}\n />\n )}\n </View>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n gap: GRID_GAP,\n },\n row: {\n flexDirection: 'row',\n justifyContent: 'center',\n gap: GRID_GAP,\n },\n});\n\nexport default SidebarLayout;\n","import React, { useEffect, useRef } from 'react';\nimport { Animated, PanResponder, StyleSheet } from 'react-native';\n\ninterface IPan {\n layout: { width: number; height: number };\n children: React.ReactNode;\n margin?: number;\n disableDrag?: boolean;\n}\n\nexport const Pan: React.FC<IPan> = ({\n layout,\n children,\n margin = 8,\n disableDrag = false,\n}) => {\n const BOX_WIDTH = layout.width / 4;\n const BOX_HEIGHT = layout.height / 4;\n const pan = useRef(\n new Animated.ValueXY({\n x: layout.width - BOX_WIDTH - margin,\n y: layout.height - BOX_HEIGHT - margin,\n }),\n ).current;\n const panResponder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderGrant: () => {\n pan.extractOffset(); // Save current value to offset, reset value to 0\n },\n onPanResponderMove: Animated.event([null, { dx: pan.x, dy: pan.y }], {\n useNativeDriver: false,\n }),\n onPanResponderRelease: () => {\n pan.flattenOffset();\n },\n }),\n ).current;\n\n useEffect(() => {\n pan.setValue({\n x: layout.width - BOX_WIDTH - margin,\n y: layout.height - BOX_HEIGHT - margin,\n });\n }, [layout, pan, BOX_WIDTH, BOX_HEIGHT, margin]);\n\n if (\n layout.width < BOX_WIDTH + margin * 2 ||\n layout.height < BOX_HEIGHT + margin * 2\n ) {\n return null;\n }\n return (\n <Animated.View\n {...(disableDrag ? {} : panResponder.panHandlers)}\n style={[\n styles.box,\n {\n width: BOX_WIDTH,\n height: BOX_HEIGHT,\n },\n {\n transform: [\n {\n translateX: pan.x.interpolate({\n inputRange: [margin, layout.width - BOX_WIDTH - margin],\n outputRange: [margin, layout.width - BOX_WIDTH - margin],\n extrapolate: 'clamp',\n }),\n },\n {\n translateY: pan.y.interpolate({\n inputRange: [margin, layout.height - BOX_HEIGHT - margin],\n outputRange: [margin, layout.height - BOX_HEIGHT - margin],\n extrapolate: 'clamp',\n }),\n },\n ],\n },\n ]}>\n {children}\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n box: {\n position: 'absolute',\n borderRadius: 10,\n overflow: 'hidden',\n },\n});\n","import {\n Participant,\n useAllParticipants,\n useBaseStore,\n useConfigStore,\n useMainParticipant,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { StyleSheet } from 'react-native';\nimport { Pan } from '../pan/Pan.native';\nimport Tile from '../tile/Tile.native';\n\nexport const Spotlight = () => {\n const mainParticipant = useMainParticipant();\n const allParticipants = useAllParticipants();\n const mainAreaDimension = useBaseStore(state => state.mainAreaDimension);\n const enableSpotlightDrag = useConfigStore(\n state => state.enableSpotlightDrag,\n );\n const enableSpotlightSwap = useConfigStore(\n state => state.enableSpotlightSwap,\n );\n\n const spotlightParticipants: Participant[] = [mainParticipant];\n const otherParticipant = allParticipants.find(\n participant => participant.ruid !== mainParticipant.ruid,\n );\n if (otherParticipant) {\n spotlightParticipants.push(otherParticipant);\n }\n\n return (\n <>\n <Tile\n key={spotlightParticipants[0].ruid}\n participant={spotlightParticipants[0]}\n disablePress={true}\n />\n {spotlightParticipants[1] && (\n <Pan\n disableDrag={!enableSpotlightDrag}\n layout={{\n width: mainAreaDimension.width,\n height: mainAreaDimension.height,\n }}>\n <Tile\n key={spotlightParticipants[1].ruid}\n showLabel={false}\n disablePress={!enableSpotlightSwap}\n participant={spotlightParticipants[1]}\n style={styles.panTile}\n zOrder={1}\n />\n </Pan>\n )}\n </>\n );\n};\n\nconst styles = StyleSheet.create({\n panTile: {\n borderColor: '#1A1A1A',\n borderWidth: 2,\n },\n});\n","import {\n GRID_GAP,\n useAllParticipants,\n useBaseStore,\n useMainParticipant,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { FlatList, StyleSheet } from 'react-native';\nimport Tile from '../tile/Tile.native';\n\nconst getTileDimensions = ({\n layout,\n participantCount,\n}: {\n layout: { width: number; height: number };\n participantCount: number;\n}) => {\n if (participantCount < 4) {\n return {\n tileWidth: layout.width,\n tileHeight:\n (layout.height - GRID_GAP * (participantCount - 1)) / participantCount,\n };\n }\n const tileWidth = layout.width / 2;\n const tileHeight = Math.max(\n layout.height / Math.ceil(participantCount / 2),\n (tileWidth * 9) / 16,\n );\n\n return {\n tileWidth,\n tileHeight,\n };\n};\n\nfunction TileLayout(): React.JSX.Element {\n const participants = useAllParticipants();\n const isPIPLayoutEnabled = useBaseStore(state => state.isPIPLayoutEnabled);\n const mainParticipant = useMainParticipant();\n const mainArea = useBaseStore(state => state.mainAreaDimension);\n\n const tileLayout = getTileDimensions({\n layout: mainArea,\n participantCount: isPIPLayoutEnabled ? 1 : participants.length,\n });\n\n return (\n <FlatList\n data={isPIPLayoutEnabled ? [mainParticipant] : participants}\n renderItem={({ item }) => (\n <Tile\n participant={item}\n style={{\n width: tileLayout.tileWidth,\n height: tileLayout.tileHeight,\n }}\n />\n )}\n keyExtractor={item => item.ruid}\n contentContainerStyle={styles.contentContainerStyle}\n showsVerticalScrollIndicator={false}\n onViewableItemsChanged={e => {\n if (e.viewableItems.length === 0) {\n return;\n }\n console.log(\n 'onViewableItemsChanged',\n e.viewableItems[0].key,\n e.viewableItems[e.viewableItems.length - 1].key,\n );\n }}\n showsHorizontalScrollIndicator={false}\n horizontal={false}\n key={participants.length < 4 ? 1 : 2}\n numColumns={participants.length < 4 ? 1 : 2}\n {...(participants.length < 4 ? {} : { columnWrapperStyle: { gap: 8 } })}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n // margin: 20,\n // justifyContent: 'center',\n // alignItems: 'center',\n backgroundColor: '#1A1A1A',\n },\n contentContainerStyle: {\n alignItems: 'center',\n gap: GRID_GAP,\n paddingHorizontal: 20,\n },\n});\n\nexport default TileLayout;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { ActivityIndicator, Animated, StyleSheet, Text } from 'react-native';\nimport { commonStyles } from '../theme/style-variables';\n\ninterface ProcessingOverlayProps {\n message: string;\n visible?: boolean;\n animated?: boolean;\n}\n\nexport function ProcessingOverlay({\n message,\n visible = true,\n animated = false,\n}: ProcessingOverlayProps) {\n const opacity = useRef(new Animated.Value(1)).current;\n const [shouldRender, setShouldRender] = useState(true);\n\n useEffect(() => {\n if (visible) {\n opacity.setValue(1);\n setShouldRender(true);\n } else {\n if (animated) {\n Animated.timing(opacity, {\n toValue: 0,\n duration: 300,\n useNativeDriver: true,\n }).start(() => {\n // Animation completed, unmount the component\n setShouldRender(false);\n });\n } else {\n setShouldRender(false);\n }\n }\n }, [opacity, visible, animated]);\n\n // Return null to unmount the component when opacity reaches zero\n if (!shouldRender) {\n return null;\n }\n\n return (\n <Animated.View style={[styles.overlay, { opacity }]}>\n <ActivityIndicator size=\"large\" color=\"#fff\" />\n <Text style={[commonStyles.bodyRegular, styles.text]}>{message}</Text>\n </Animated.View>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '#1A1A1A',\n\n // This renders below other components in case of Voice call if zIndex is not set or 1\n zIndex: 2,\n },\n text: {\n color: '#fff',\n textAlign: 'center',\n margin: 16,\n },\n});\n","import { useConfigStore, useIsRecording } from '@cometchat/calls-sdk-core';\nimport React, { useEffect, useRef } from 'react';\nimport { Animated, StyleSheet, Text, View } from 'react-native';\nimport { commonStyles } from '../theme/style-variables';\n\ninterface RecordingIndicatorProps {\n style?: any;\n}\n\nconst RecordingIndicator = ({ style }: RecordingIndicatorProps) => {\n const pulseAnimation = useRef(new Animated.Value(1)).current;\n const isRecording = useIsRecording();\n const hideRecordingStatusIndicator = useConfigStore(\n state => state.hideRecordingStatusIndicator,\n );\n\n useEffect(() => {\n if (isRecording) {\n const pulse = () => {\n Animated.sequence([\n Animated.timing(pulseAnimation, {\n toValue: 1.1,\n duration: 1000,\n useNativeDriver: true,\n }),\n Animated.timing(pulseAnimation, {\n toValue: 1,\n duration: 1000,\n useNativeDriver: true,\n }),\n ]).start(() => pulse());\n };\n pulse();\n }\n }, [isRecording, pulseAnimation]);\n\n if (!isRecording || hideRecordingStatusIndicator) {\n return null;\n }\n\n return (\n <View style={[styles.container, style]}>\n <View style={styles.recordingIndicator}>\n <Animated.View\n style={[\n styles.dot,\n {\n transform: [{ scale: pulseAnimation }],\n },\n ]}\n />\n <Text style={[commonStyles.caption1Bold, styles.text]}>REC</Text>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n position: 'absolute',\n top: 8,\n left: 8,\n },\n recordingIndicator: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n paddingVertical: 6,\n paddingHorizontal: 8,\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\n borderRadius: 8,\n borderWidth: 1,\n borderColor: 'rgba(0, 0, 0, 0.1)',\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 2,\n },\n shadowOpacity: 0.1,\n shadowRadius: 4,\n elevation: 3,\n },\n dot: {\n width: 8,\n height: 8,\n backgroundColor: '#FF3B30',\n borderRadius: 4,\n },\n text: {\n color: '#FF3B30',\n letterSpacing: 0.5,\n },\n});\n\nexport default RecordingIndicator;\n","import {\n LAYOUT,\n useBaseStore,\n useIsReconnecting,\n useLayout,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { StyleSheet, View } from 'react-native';\nimport SidebarLayout from './layout/SidebarLayout.native';\nimport { Spotlight } from './layout/Spotlight.native';\nimport TileLayout from './layout/TileLayout';\nimport { ProcessingOverlay } from './processing-overlay/ProcessingOverlay.native';\nimport RecordingIndicator from './recording-indicator/RecordingIndicator.native';\n\nfunction CallStage() {\n const mainArea = useBaseStore(state => state.mainAreaDimension);\n const layout = useLayout();\n const isReconnecting = useIsReconnecting();\n\n const mainAreaAvailable = mainArea.width > 0 && mainArea.height > 0;\n\n return (\n <View\n style={styles.container}\n onLayout={e => {\n useBaseStore.setState({\n mainAreaDimension: {\n width: e.nativeEvent.layout.width,\n height: e.nativeEvent.layout.height,\n },\n });\n }}>\n {layout === LAYOUT.TILE && mainAreaAvailable && <TileLayout />}\n {layout === LAYOUT.SPOTLIGHT && mainAreaAvailable && <Spotlight />}\n {layout === LAYOUT.SIDEBAR && mainAreaAvailable && <SidebarLayout />}\n <RecordingIndicator />\n {isReconnecting && (\n <ProcessingOverlay message=\"You've been disconnected. Attempting to reconnect…\" />\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n marginHorizontal: 20,\n marginVertical: 8,\n },\n});\n\nexport default CallStage;\n","import { create } from 'zustand';\nimport { combine } from 'zustand/middleware';\n\nconst initialState = {\n title: '',\n description: '',\n cancelText: '',\n confirmText: '',\n visible: false,\n};\n\nexport const useConfirmationDialogStore = create(\n combine(initialState, set => ({\n onCancel: () => {\n set({ visible: false });\n },\n onConfirm: () => {\n set({ visible: false });\n },\n onBackdropClick: () => {\n set({ visible: false });\n },\n reset: () => {\n set(initialState);\n },\n })),\n);\n\nfunction reset() {\n useConfirmationDialogStore.setState(initialState);\n useConfirmationDialogStore.setState({\n onCancel: () => {\n useConfirmationDialogStore.setState({ visible: false });\n },\n onConfirm: () => {\n useConfirmationDialogStore.setState({ visible: false });\n },\n onBackdropClick: () => {\n useConfirmationDialogStore.setState({ visible: false });\n },\n });\n}\n\nexport function showConfirmationDialog(\n title: string,\n description: string,\n confirmText: string,\n cancelText: string,\n onConfirm: () => void = () => {},\n onCancel: () => void = () => {},\n) {\n useConfirmationDialogStore.setState({\n title,\n description,\n confirmText,\n cancelText,\n onConfirm: () => {\n onConfirm();\n reset();\n },\n onCancel: () => {\n onCancel();\n reset();\n },\n visible: true,\n });\n}\n","import { Dimensions, StyleSheet } from 'react-native';\nimport {\n borderRadius,\n colors,\n commonStyles,\n padding,\n spacing,\n} from '../theme/style-variables';\n\nconst { width } = Dimensions.get('window');\n\nexport const styles = StyleSheet.create({\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0, 0, 0, 0.8)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 1000,\n },\n dialog: {\n maxWidth: 372,\n width: width * 0.9,\n backgroundColor: colors.background[1],\n borderWidth: 1,\n borderColor: colors.border.default,\n borderRadius: spacing[3],\n paddingTop: padding[8],\n paddingHorizontal: padding[5],\n paddingBottom: padding[5],\n\n // For iOS\n shadowColor: '#101828',\n shadowOffset: {\n width: 0,\n height: 4,\n },\n shadowOpacity: 0.08,\n shadowRadius: 6,\n\n // For Android\n elevation: 4,\n },\n content: {\n alignItems: 'center',\n gap: spacing[5],\n },\n textContainer: {\n alignItems: 'flex-start',\n gap: spacing[2],\n width: '100%',\n },\n title: {\n ...commonStyles.heading2Medium,\n color: colors.text.primary,\n textAlign: 'center',\n width: '100%',\n },\n description: {\n ...commonStyles.bodyRegular,\n color: colors.text.secondary,\n textAlign: 'center',\n width: '100%',\n lineHeight: 16.8,\n },\n buttonsContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: spacing[3],\n width: '100%',\n },\n button: {\n height: 40,\n paddingVertical: padding[2],\n paddingHorizontal: padding[5],\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: borderRadius[2],\n flex: 1,\n borderWidth: 1,\n },\n buttonSecondary: {\n backgroundColor: 'transparent',\n borderColor: colors.border.dark,\n },\n buttonPrimary: {\n backgroundColor: colors.button.primaryBackground,\n borderColor: colors.button.primaryBackground,\n },\n buttonText: {\n ...commonStyles.buttonMedium,\n textAlign: 'center',\n },\n buttonTextSecondary: {\n color: colors.button.secondaryText,\n },\n buttonTextPrimary: {\n color: colors.button.primaryText,\n },\n});\n","import React from 'react';\nimport { Modal, Pressable, Text, TouchableOpacity, View } from 'react-native';\nimport { useConfirmationDialogStore } from './confirmation-dialog-state';\nimport { styles } from './styles';\n\nexport function ConfirmationDialog() {\n const {\n title,\n description,\n cancelText,\n confirmText,\n onCancel,\n onConfirm,\n onBackdropClick,\n visible,\n } = useConfirmationDialogStore();\n\n const handleBackdropPress = () => {\n if (onBackdropClick) {\n onBackdropClick();\n }\n };\n\n return (\n <Modal\n visible={visible}\n transparent={true}\n animationType=\"fade\"\n onRequestClose={handleBackdropPress}>\n <Pressable style={styles.backdrop} onPress={handleBackdropPress}>\n <View style={styles.dialog}>\n <View style={styles.content}>\n <View style={styles.textContainer}>\n <Text style={styles.title}>{title}</Text>\n <Text style={styles.description}>{description}</Text>\n </View>\n <View style={styles.buttonsContainer}>\n <TouchableOpacity\n style={[styles.button, styles.buttonSecondary]}\n onPress={onCancel}\n testID=\"cometchat-confirmation-dialog-cancel-button\">\n <Text style={[styles.buttonText, styles.buttonTextSecondary]}>\n {cancelText}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[styles.button, styles.buttonPrimary]}\n onPress={onConfirm}\n testID=\"cometchat-confirmation-dialog-confirm-button\">\n <Text style={[styles.buttonText, styles.buttonTextPrimary]}>\n {confirmText}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Pressable>\n </Modal>\n );\n}\n","// filepath: /Users/cometchat/Documents/demo/callingv5/src/ui/bottom-sheet/BottomSheet.tsx\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport {\n Animated,\n Dimensions,\n ScrollView,\n StyleSheet,\n TouchableWithoutFeedback,\n View,\n} from 'react-native';\n\nconst SCREEN_HEIGHT = Dimensions.get('window').height;\n\ninterface BottomSheetProps {\n children: React.ReactNode;\n isVisible: boolean;\n onClose: () => void;\n maxHeight?: number;\n}\n\nconst BottomSheet: React.FC<BottomSheetProps> = ({\n children,\n isVisible,\n onClose,\n maxHeight = SCREEN_HEIGHT * 0.4,\n}) => {\n const visibleTranslateY = SCREEN_HEIGHT - maxHeight;\n\n const hiddenTranslateY = useRef(SCREEN_HEIGHT).current;\n const animatedValue = useRef(new Animated.Value(hiddenTranslateY)).current;\n\n const springAnimation = useCallback(\n (direction: 'up' | 'down') => {\n const toValue = direction === 'up' ? visibleTranslateY : hiddenTranslateY;\n Animated.spring(animatedValue, {\n toValue,\n useNativeDriver: true,\n bounciness: 0,\n }).start();\n },\n [animatedValue, hiddenTranslateY, visibleTranslateY],\n );\n\n useEffect(() => {\n if (isVisible) {\n springAnimation('up');\n } else {\n springAnimation('down');\n }\n }, [isVisible, springAnimation]);\n\n const bottomSheetAnimation = {\n transform: [\n {\n translateY: animatedValue,\n },\n ],\n };\n\n // Conditionally render the backdrop and sheet to allow animation even when isVisible becomes false\n // The component itself will be controlled by its parent for complete unmounting if needed.\n return (\n <>\n {isVisible && (\n <TouchableWithoutFeedback onPress={onClose}>\n <View style={styles.backdrop} />\n </TouchableWithoutFeedback>\n )}\n <Animated.View\n style={[\n styles.bottomSheet,\n bottomSheetAnimation,\n { height: maxHeight },\n ]}>\n <View style={styles.draggableArea}>\n <View style={styles.dragHandle} />\n </View>\n <ScrollView>{children}</ScrollView>\n </Animated.View>\n </>\n );\n};\n\nconst styles = StyleSheet.create({\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: 1,\n },\n bottomSheet: {\n position: 'absolute',\n width: '100%',\n backgroundColor: '#1A1A1A',\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n paddingBottom: 8,\n borderWidth: 1,\n borderColor: '#383838',\n zIndex: 2,\n // bottom: 0, // Not needed as translateY handles positioning from the top\n left: 0,\n right: 0,\n top: 0, // Initial top position, translateY will move it down\n // Shadow for iOS\n shadowColor: '#101828',\n shadowOffset: {\n width: 0,\n height: -6,\n },\n shadowOpacity: 0.08,\n shadowRadius: 10,\n // Elevation for Android\n elevation: 8,\n },\n draggableArea: {\n width: '100%',\n alignItems: 'center',\n paddingVertical: 10,\n borderTopLeftRadius: 20,\n borderTopRightRadius: 20,\n },\n dragHandle: {\n width: 32,\n height: 4,\n backgroundColor: '#A1A1A1',\n borderRadius: 1000,\n },\n});\n\nexport default BottomSheet;\n","import { hideAllBottomSheets } from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { StyleSheet, Text, TouchableOpacity } from 'react-native';\nimport Icon from '../icon/Icon.native';\nimport { IconName } from '../icon/icon-paths-24x24';\nimport { colors, commonStyles } from '../theme/style-variables';\n\ninterface MenuItemProps {\n iconName: IconName;\n label: string;\n onPress: () => void;\n selected?: boolean;\n}\n\nconst MenuItem: React.FC<MenuItemProps> = ({\n iconName,\n label,\n onPress,\n selected = false,\n}) => {\n return (\n <TouchableOpacity\n onPress={() => {\n hideAllBottomSheets();\n onPress();\n }}\n style={[styles.menuItem, selected && styles.menuItemSelected]}>\n <Icon name={iconName} size={24} fill=\"#858585\" />\n <Text style={[commonStyles.heading4Regular, styles.menuLabel]}>\n {label}\n </Text>\n </TouchableOpacity>\n );\n};\n\nconst styles = StyleSheet.create({\n menuItem: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 12,\n gap: 8,\n },\n menuItemSelected: {\n backgroundColor: '#383838',\n },\n menuLabel: {\n color: colors.text.primary,\n textTransform: 'capitalize',\n },\n});\n\nexport default MenuItem;\n","import { useBaseStore } from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { NativeModules, ScrollView, StyleSheet, Text } from 'react-native';\nimport BottomSheet from '../bottom-sheet/BottomSheet.native';\nimport { colors, commonStyles } from '../theme/style-variables';\nimport MenuItem from './MenuItem.native';\nconst { AudioMode } = NativeModules;\n\ninterface AudioModesMenuProps {\n isVisible: boolean;\n onClose: () => void;\n}\n\nconst AUDIO_MODE_TYPE_ICON_MAP = {\n BLUETOOTH: 'bluetooth',\n CAR: 'car',\n EARPIECE: 'earpiece',\n HEADPHONES: 'headphones',\n SPEAKER: 'speaker-fill',\n} as const;\n\nconst AudioModesMenu: React.FC<AudioModesMenuProps> = ({\n isVisible,\n onClose,\n}) => {\n const audioModes = useBaseStore(state => state.audioModes);\n\n const bottomSheetMaxHeight = 124 + Math.max(audioModes.length, 1) * 48;\n\n return (\n <BottomSheet\n maxHeight={bottomSheetMaxHeight}\n isVisible={isVisible}\n onClose={onClose}>\n <ScrollView>\n {audioModes.length === 0 && (\n <Text style={[commonStyles.bodyRegular, styles.noItemsText]}>\n No audio modes available\n </Text>\n )}\n {audioModes.map((mode, index) => (\n <MenuItem\n key={index}\n iconName={AUDIO_MODE_TYPE_ICON_MAP[mode.type]}\n label={mode.type}\n selected={mode.selected}\n onPress={() => {\n AudioMode.setAudioDevice(mode.uid || mode.type);\n }}\n />\n ))}\n </ScrollView>\n </BottomSheet>\n );\n};\n\nconst styles = StyleSheet.create({\n noItemsText: {\n padding: 16,\n textAlign: 'center',\n color: colors.text.secondary,\n },\n});\n\nexport default AudioModesMenu;\n","import { StyleSheet } from 'react-native';\nimport { colors } from '../theme/style-variables';\n\nexport const controlPaneStyles = StyleSheet.create({\n controlPane: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 16,\n paddingHorizontal: 20,\n gap: 12,\n },\n controlButton: {\n // width: 56,\n flex: 1,\n maxWidth: 72,\n height: 56,\n borderRadius: 28,\n backgroundColor: '#272727',\n alignItems: 'center',\n justifyContent: 'center',\n },\n leaveSessionButton: {\n backgroundColor: '#C73C3E',\n },\n toggledButton: {\n backgroundColor: colors.alert.errorBackground,\n },\n});\n","import {\n toggleAudioModeMenuVisible,\n useConfigStore,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { TouchableOpacity } from 'react-native';\nimport Icon from '../icon/Icon.native';\nimport { controlPaneStyles } from './styles.native';\n\nconst AudioModeButton: React.FC = () => {\n const hideAudioModeButton = useConfigStore(\n state => state.hideAudioModeButton,\n );\n\n if (hideAudioModeButton) {\n return null;\n }\n\n return (\n <TouchableOpacity\n style={controlPaneStyles.controlButton}\n onPress={toggleAudioModeMenuVisible}\n activeOpacity={0.7}>\n <Icon name=\"speaker-fill\" fill=\"#FFF\" size={24} />\n </TouchableOpacity>\n );\n};\n\nexport default AudioModeButton;\n","// /Users/cometchat/Documents/demo/callingv5/src/ui/control-pane/controls/Audio.native.tsx\nimport {\n EVENT_LISTENER_METHODS,\n eventBus,\n MEDIA_TYPE,\n toggleAudioTrack,\n useHideMuteAudioButton,\n useTrackMuted,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { TouchableOpacity } from 'react-native';\nimport Icon from '../../icon/Icon.native'; // Assuming this is RN compatible\nimport { controlPaneStyles } from '../styles.native';\n\nconst AudioControl: React.FC = () => {\n const muted = useTrackMuted(MEDIA_TYPE.AUDIO);\n const hideMuteAudioButton = useHideMuteAudioButton();\n\n if (hideMuteAudioButton) {\n return null;\n }\n\n const onPress = () => {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.ButtonClickListener\n .onToggleAudioButtonClicked,\n });\n toggleAudioTrack();\n };\n\n return (\n <TouchableOpacity\n style={[\n controlPaneStyles.controlButton,\n muted && controlPaneStyles.toggledButton,\n ]}\n onPress={onPress}\n activeOpacity={0.7}>\n <Icon\n name={muted ? 'mic-off-fill' : 'mic-fill'}\n fill={muted ? '#9F3032' : '#FFF'}\n size={24}\n />\n </TouchableOpacity>\n );\n};\n\nexport default AudioControl;\n","import {\n EVENT_LISTENER_METHODS,\n eventBus,\n MEDIA_TYPE,\n toggleVideoTrack,\n useHideToggleVideoButton,\n useTrackMuted,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { TouchableOpacity } from 'react-native';\nimport Icon from '../../icon/Icon.native'; // Assuming this is RN compatible\nimport { controlPaneStyles } from '../styles.native';\n\nconst VideoControl: React.FC = () => {\n const hidePauseVideoButton = useHideToggleVideoButton();\n const videoMuted = useTrackMuted(MEDIA_TYPE.VIDEO);\n\n if (hidePauseVideoButton) {\n return null;\n }\n\n const onPress = () => {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.ButtonClickListener\n .onToggleVideoButtonClicked,\n });\n toggleVideoTrack();\n };\n\n return (\n <TouchableOpacity\n style={[\n controlPaneStyles.controlButton,\n videoMuted && controlPaneStyles.toggledButton,\n ]}\n onPress={onPress}\n activeOpacity={0.7}>\n <Icon\n name={videoMuted ? 'video-off-fill' : 'video-fill'}\n fill={videoMuted ? '#9F3032' : '#FFF'}\n size={24}\n />\n </TouchableOpacity>\n );\n};\n\nexport default VideoControl;\n","import {\n EVENT_LISTENER_METHODS,\n eventBus,\n leaveSession,\n useConfigStore,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { TouchableOpacity } from 'react-native';\nimport Icon from '../icon/Icon.native'; // Assuming this is RN compatible\nimport { controlPaneStyles } from './styles.native';\n\nconst LeaveSessionButton: React.FC = () => {\n const hideLeaveSessionButton = useConfigStore(\n state => state.hideLeaveSessionButton,\n );\n\n if (hideLeaveSessionButton) {\n return null;\n }\n\n const onPress = () => {\n leaveSession();\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.ButtonClickListener\n .onLeaveSessionButtonClicked,\n });\n };\n\n return (\n <TouchableOpacity\n style={[\n controlPaneStyles.controlButton,\n controlPaneStyles.leaveSessionButton,\n ]}\n onPress={onPress}\n activeOpacity={0.7}>\n <Icon name=\"call-end\" fill=\"#FFF\" size={24} />\n </TouchableOpacity>\n );\n};\n\nexport default LeaveSessionButton;\n","import { toggleMoreMenuVisible } from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { TouchableOpacity } from 'react-native';\nimport Icon from '../icon/Icon.native';\nimport { controlPaneStyles } from './styles.native';\n\nconst MoreMenuButton: React.FC = () => {\n return (\n <TouchableOpacity\n style={controlPaneStyles.controlButton}\n onPress={toggleMoreMenuVisible}\n activeOpacity={0.7}>\n <Icon name=\"more\" fill=\"#FFF\" size={24} />\n </TouchableOpacity>\n );\n};\n\nexport default MoreMenuButton;\n","import { useConfigStore } from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { View } from 'react-native';\nimport AudioModeButton from './AudioModeButton';\nimport AudioControl from './controls/Audio.native';\nimport VideoControl from './controls/Video.native';\nimport LeaveSessionButton from './LeaveSessionButton.native';\nimport MoreMenuButton from './MoreMenuButton';\nimport { controlPaneStyles } from './styles.native';\n\nconst ControlPane: React.FC = () => {\n const hideControlPanel = useConfigStore(state => state.hideControlPanel);\n if (hideControlPanel) {\n return null;\n }\n return (\n <View style={controlPaneStyles.controlPane}>\n <AudioControl />\n <VideoControl />\n <AudioModeButton />\n <MoreMenuButton />\n <LeaveSessionButton />\n </View>\n );\n};\n\nexport default ControlPane;\n","import {\n startScreenSharing,\n stopScreenSharing,\n useScreenShareRunning,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport MenuItem from './MenuItem.native';\n\nconst ScreenShareButton = () => {\n const isScreenShareRunning = useScreenShareRunning();\n\n return (\n <MenuItem\n iconName={isScreenShareRunning ? 'screen-share-stop' : 'screen-share'}\n selected={isScreenShareRunning}\n label={\n isScreenShareRunning ? 'Stop screen sharing' : 'Start Screen Sharing'\n }\n onPress={isScreenShareRunning ? stopScreenSharing : startScreenSharing}\n />\n );\n};\n\nexport default ScreenShareButton;\n","import {\n EVENT_LISTENER_METHODS,\n eventBus,\n toggleParticipantListVisible,\n toggleRaiseHand,\n toggleRecording,\n useConfigStore,\n useHideRecordingButton,\n useHideScreenSharingButton,\n useIsRecording,\n useRaisedHandTimestamp,\n useTranslation,\n} from '@cometchat/calls-sdk-core';\nimport React, { useCallback } from 'react';\nimport { ScrollView, StyleSheet, Text } from 'react-native';\nimport BottomSheet from '../bottom-sheet/BottomSheet.native';\nimport { showConfirmationDialog } from '../confirmation-dialog/confirmation-dialog-state';\nimport { commonStyles } from '../theme/style-variables';\nimport MenuItem from './MenuItem.native';\nimport ScreenShareButton from './ScreenShareButton';\n\ninterface MoreMenuProps {\n isVisible: boolean;\n onClose: () => void;\n}\n\nconst MoreMenu: React.FC<MoreMenuProps> = ({ isVisible, onClose }) => {\n const raiseHandTimestamp = useRaisedHandTimestamp();\n const hideRecordingButton = useHideRecordingButton();\n const { t } = useTranslation();\n\n const isRecording = useIsRecording();\n\n const hideRaiseHandButton = useConfigStore(\n state => state.hideRaiseHandButton,\n );\n\n const hideParticipantListButton = useConfigStore(\n state => state.hideParticipantListButton,\n );\n\n const hideScreenSharingButton = useHideScreenSharingButton();\n\n let numberOfVisibleItems = 0;\n if (hideRecordingButton === false) {\n numberOfVisibleItems++;\n }\n if (hideRaiseHandButton === false) {\n numberOfVisibleItems++;\n }\n if (hideParticipantListButton === false) {\n numberOfVisibleItems++;\n }\n if (hideScreenSharingButton === false) {\n numberOfVisibleItems++;\n }\n const bottomSheetMaxHeight = 124 + Math.max(numberOfVisibleItems, 1) * 48;\n\n const onRaiseHandPress = useCallback(() => {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.ButtonClickListener.onRaiseHandButtonClicked,\n });\n toggleRaiseHand();\n }, []);\n\n const onParticipantListPress = useCallback(() => {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.ButtonClickListener\n .onParticipantListButtonClicked,\n });\n toggleParticipantListVisible();\n }, []);\n\n return (\n <BottomSheet\n maxHeight={bottomSheetMaxHeight}\n isVisible={isVisible}\n onClose={onClose}>\n <ScrollView>\n {numberOfVisibleItems === 0 && (\n <Text style={[commonStyles.bodyRegular, styles.noItemsText]}>\n No options available\n </Text>\n )}\n {!hideScreenSharingButton && <ScreenShareButton />}\n {!hideRaiseHandButton && (\n <MenuItem\n iconName=\"raise-hand-fill\"\n label={raiseHandTimestamp ? 'Lower Hand' : 'Raise Hand'}\n onPress={onRaiseHandPress}\n selected={Boolean(raiseHandTimestamp)}\n />\n )}\n {!hideRecordingButton && (\n <MenuItem\n iconName={isRecording ? 'record-stop-fill' : 'record-fill'}\n label={isRecording ? 'Stop Recording' : 'Start Recording'}\n onPress={() => {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.ButtonClickListener\n .onRecordingToggleButtonClicked,\n });\n showConfirmationDialog(\n isRecording\n ? t('controlPanel.recording.stopRecording')\n : t('controlPanel.recording.startRecording'),\n isRecording\n ? t('controlPanel.recording.stopRecordingConfirmation')\n : t('controlPanel.recording.startRecordingConfirmation'),\n isRecording\n ? t('controlPanel.recording.stopRecording')\n : t('controlPanel.recording.startRecording'),\n t('controlPanel.recording.cancel'),\n () => {\n toggleRecording();\n },\n );\n }}\n />\n )}\n {!hideParticipantListButton && (\n <MenuItem\n iconName=\"participants\"\n label=\"Participants\"\n onPress={onParticipantListPress}\n />\n )}\n </ScrollView>\n </BottomSheet>\n );\n};\n\nconst styles = StyleSheet.create({\n noItemsText: {\n padding: 16,\n textAlign: 'center',\n color: '#888',\n },\n});\n\nexport default MoreMenu;\n","import React, { ReactNode, useEffect, useRef, useState } from 'react';\nimport { StyleSheet, Animated } from 'react-native';\n\ninterface FullScreenDialogProps {\n children: ReactNode;\n visible?: boolean;\n}\n\nconst FullScreenDialog: React.FC<FullScreenDialogProps> = ({\n children,\n visible = false,\n}) => {\n const [showDialog, setShowDialog] = useState(visible);\n const fadeAnim = useRef(new Animated.Value(0)).current; // Initial value for opacity: 0\n\n useEffect(() => {\n if (visible) {\n setShowDialog(true);\n Animated.timing(fadeAnim, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }).start();\n } else {\n Animated.timing(fadeAnim, {\n toValue: 0,\n duration: 300,\n useNativeDriver: true,\n }).start(() => {\n setShowDialog(false);\n });\n }\n }, [visible, fadeAnim]);\n\n if (!showDialog) {\n return null;\n }\n\n return (\n <Animated.View style={[styles.container, { opacity: fadeAnim }]}>\n {children}\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 1000, // Ensure it's on top of other content\n },\n});\n\nexport default FullScreenDialog;\n","import { StyleSheet } from 'react-native';\n\nexport const styles = StyleSheet.create({\n headerContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingVertical: 8,\n paddingHorizontal: 20,\n justifyContent: 'space-between',\n width: '100%',\n },\n meetingInfo: {\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'flex-start',\n gap: 4,\n flex: 1,\n },\n meetingTitle: {\n color: '#FFFFFF',\n },\n meetingTime: {\n color: '#FFFFFF',\n },\n iconControls: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n alignItems: 'center',\n gap: 12,\n flexShrink: 0,\n },\n iconButton: {\n justifyContent: 'center',\n alignItems: 'center',\n width: 40,\n height: 40,\n backgroundColor: '#272727',\n borderRadius: 1000,\n flexShrink: 0,\n },\n activeButton: {\n backgroundColor: '#383838',\n },\n});\n","import {\n EVENT_LISTENER_METHODS,\n eventBus,\n LAYOUT,\n useBaseStore,\n useConfigStore,\n useLayout,\n} from '@cometchat/calls-sdk-core';\nimport React, { useRef, useState } from 'react';\nimport { TouchableOpacity, View } from 'react-native';\nimport Icon from '../icon/Icon.native';\nimport { PopupMenu } from '../shared/Popup';\nimport { styles } from './styles';\n\nconst ChangeLayout: React.FC = () => {\n const hideChangeLayoutButton = useConfigStore(\n state => state.hideChangeLayoutButton,\n );\n const [menuVisible, setMenuVisible] = useState(false);\n const layout = useLayout();\n const buttonRef = useRef<View>(null);\n const [anchorLayout, setAnchorLayout] = useState({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n });\n\n if (hideChangeLayoutButton) {\n return null;\n }\n\n const showMenu = () => {\n if (buttonRef.current) {\n buttonRef.current.measureInWindow((x, y, width, height) => {\n setAnchorLayout({ x, y, width, height });\n setMenuVisible(true);\n });\n }\n };\n return (\n <>\n <TouchableOpacity\n ref={buttonRef}\n style={[styles.iconButton]}\n onPress={() => {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS.ButtonClickListener\n .onChangeLayoutButtonClicked,\n });\n showMenu();\n }}>\n <Icon name=\"tile-fill\" fill={'#FFFFFF'} />\n </TouchableOpacity>\n <PopupMenu\n visible={menuVisible}\n anchorLayout={anchorLayout}\n onClose={() => setMenuVisible(false)}\n options={[\n {\n label: 'Tile View',\n iconName: 'tile-fill',\n selected: layout === LAYOUT.TILE,\n onPress: () => {\n useBaseStore.setState({ layout: LAYOUT.TILE });\n },\n },\n {\n label: 'Sidebar View',\n iconName: 'sidebar',\n selected: layout === LAYOUT.SIDEBAR,\n onPress: () => {\n useBaseStore.setState({ layout: LAYOUT.SIDEBAR });\n },\n },\n {\n label: 'Spotlight View',\n iconName: 'spotlight',\n selected: layout === LAYOUT.SPOTLIGHT,\n onPress: () => {\n useBaseStore.setState({ layout: LAYOUT.SPOTLIGHT });\n },\n },\n ]}\n />\n </>\n );\n};\n\nexport default ChangeLayout;\n","import {\n EVENT_LISTENER_METHODS_MOBILE,\n eventBus,\n useBaseStore,\n useHideChatButton,\n} from '@cometchat/calls-sdk-core';\nimport React, { useCallback } from 'react';\nimport { StyleSheet, Text, TouchableOpacity, View } from 'react-native';\nimport Icon from '../icon/Icon.native';\nimport {\n borderRadius,\n colors,\n commonStyles,\n padding,\n} from '../theme/style-variables';\n\nconst ChatButton = () => {\n const hideChatButton = useHideChatButton();\n const chatButtonUnreadCount = useBaseStore(\n state => state.chatButtonUnreadCount,\n );\n\n const onPress = useCallback(() => {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS_MOBILE.ButtonClickListener\n .onChatButtonClicked,\n });\n }, []);\n\n if (hideChatButton) {\n return null;\n }\n\n return (\n <TouchableOpacity style={[styles.iconButton]} onPress={onPress}>\n <Icon name=\"chat\" fill={'#FFFFFF'} />\n {chatButtonUnreadCount > 0 && (\n <View style={styles.badge}>\n <Text style={styles.badgeText}>\n {chatButtonUnreadCount > 99 ? '99+' : chatButtonUnreadCount}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n};\n\nconst styles = StyleSheet.create({\n iconButton: {\n justifyContent: 'center',\n alignItems: 'center',\n width: 40,\n height: 40,\n backgroundColor: '#272727',\n borderRadius: 1000,\n flexShrink: 0,\n },\n badge: {\n position: 'absolute',\n top: -1,\n right: -1,\n backgroundColor: colors.primary,\n borderRadius: borderRadius.max,\n minWidth: 18,\n height: 18,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: padding[1],\n },\n badgeText: {\n color: colors.static.white,\n textAlign: 'center',\n ...commonStyles.caption1Bold,\n },\n});\n\nexport default ChatButton;\n","import {\n EVENT_LISTENER_METHODS_MOBILE,\n eventBus,\n MEDIA_TYPE,\n switchCamera,\n useHideSwitchCameraButton,\n useTrackMuted,\n} from '@cometchat/calls-sdk-core';\nimport React, { useCallback } from 'react';\nimport { StyleSheet, TouchableOpacity } from 'react-native';\nimport Icon from '../icon/Icon.native';\n\nconst SwitchCamera = () => {\n const videoMuted = useTrackMuted(MEDIA_TYPE.VIDEO);\n const disabled = Boolean(videoMuted);\n\n const hideSwitchCameraButton = useHideSwitchCameraButton();\n\n const onPress = useCallback(() => {\n eventBus.publish({\n type: EVENT_LISTENER_METHODS_MOBILE.ButtonClickListener\n .onSwitchCameraButtonClicked,\n });\n switchCamera();\n }, []);\n\n if (hideSwitchCameraButton) {\n return null;\n }\n\n return (\n <TouchableOpacity\n disabled={disabled}\n style={[styles.iconButton, disabled && styles.iconButtonDisabled]}\n onPress={onPress}>\n <Icon name=\"switch-camera\" fill={'#FFFFFF'} />\n </TouchableOpacity>\n );\n};\n\nconst styles = StyleSheet.create({\n iconButton: {\n justifyContent: 'center',\n alignItems: 'center',\n width: 40,\n height: 40,\n backgroundColor: '#272727',\n borderRadius: 1000,\n flexShrink: 0,\n },\n iconButtonDisabled: {\n opacity: 0.5,\n },\n});\n\nexport default SwitchCamera;\n","import {\n miliSecondsToMMSS,\n useConfigStore,\n useSessionTimer,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { Text, View } from 'react-native';\nimport { commonStyles } from '../theme/style-variables';\nimport ChangeLayout from './ChangeLayout';\nimport ChatButton from './ChatButton';\nimport { styles } from './styles';\nimport SwitchCamera from './SwitchCamera';\n\nconst SessionTimer = () => {\n const conferenceElapsedTime = useSessionTimer();\n const hideSessionTimer = useConfigStore(state => state.hideSessionTimer);\n\n if (hideSessionTimer) {\n return null;\n }\n\n return (\n <Text style={[commonStyles.caption1Regular, styles.meetingTime]}>\n {miliSecondsToMMSS(conferenceElapsedTime)}\n </Text>\n );\n};\n\nconst Header: React.FC = () => {\n const title = useConfigStore(state => state.title);\n const hideHeaderPanel = useConfigStore(state => state.hideHeaderPanel);\n\n if (hideHeaderPanel) {\n return null;\n }\n\n return (\n <View style={styles.headerContainer}>\n {/* Left Section: Meeting Info */}\n <View style={styles.meetingInfo}>\n {title && (\n <Text\n style={[commonStyles.heading4Medium, styles.meetingTitle]}\n numberOfLines={1}\n ellipsizeMode=\"tail\">\n {title}\n </Text>\n )}\n <SessionTimer />\n </View>\n\n {/* Right Section: Icon Controls */}\n <View style={styles.iconControls}>\n <SwitchCamera />\n <ChangeLayout />\n <ChatButton />\n </View>\n </View>\n );\n};\n\nexport default Header;\n","import {\n leaveSession,\n leaveSessionDueToIdleTimeout,\n useBaseStore,\n useConfigStore,\n} from '@cometchat/calls-sdk-core';\nimport React, { useEffect, useRef, useState } from 'react';\nimport {\n Animated,\n Modal,\n StyleSheet,\n Text,\n TouchableOpacity,\n TouchableWithoutFeedback,\n View,\n} from 'react-native';\nimport { commonStyles } from '../theme/style-variables';\n\nexport interface IdealTimeoutModalProps {\n style?: any;\n}\n\nfunction getFormattedTime(ms: number): string {\n const minutes = Math.floor(ms / 60000)\n .toString()\n .padStart(2, '0');\n const seconds = Math.floor((ms % 60000) / 1000)\n .toString()\n .padStart(2, '0');\n return `${minutes}:${seconds}`;\n}\n\nconst IdealTimeoutModal: React.FC<IdealTimeoutModalProps> = ({\n style = {},\n}) => {\n const idleTimeoutModalVisible = useBaseStore(\n state => state.idleTimeoutModalVisible,\n );\n const idleTimeoutPeriodAfterPrompt = useConfigStore(\n state => state.idleTimeoutPeriodAfterPrompt,\n );\n const [ms, setMs] = useState(idleTimeoutPeriodAfterPrompt);\n const formattedTime = getFormattedTime(ms);\n const fadeAnim = useRef(new Animated.Value(0)).current;\n const scaleAnim = useRef(new Animated.Value(0.8)).current;\n\n const ceilMinutes = Math.ceil(ms / 60000);\n\n const onStayInCall = () => {\n useBaseStore.getState().restartIdealTimeoutTimer();\n };\n\n const handleOverlayPress = () => {\n onStayInCall();\n };\n\n useEffect(() => {\n if (idleTimeoutModalVisible) {\n Animated.parallel([\n Animated.timing(fadeAnim, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n Animated.spring(scaleAnim, {\n toValue: 1,\n tension: 100,\n friction: 8,\n useNativeDriver: true,\n }),\n ]).start();\n } else {\n Animated.parallel([\n Animated.timing(fadeAnim, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(scaleAnim, {\n toValue: 0.8,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start();\n }\n }, [idleTimeoutModalVisible, fadeAnim, scaleAnim]);\n\n useEffect(() => {\n const timer = setInterval(() => {\n console.log('setInterval is running for IdealTimeoutModal');\n if (!idleTimeoutModalVisible) {\n clearInterval(timer);\n return;\n }\n setMs(prev => {\n if (prev <= 1000) {\n clearInterval(timer);\n leaveSessionDueToIdleTimeout();\n return 0;\n }\n return prev - 1000;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [idleTimeoutModalVisible]);\n\n useEffect(() => {\n if (idleTimeoutModalVisible) {\n setMs(idleTimeoutPeriodAfterPrompt);\n }\n }, [idleTimeoutModalVisible, idleTimeoutPeriodAfterPrompt]);\n\n if (!idleTimeoutModalVisible) {\n return null;\n }\n\n return (\n <Modal\n transparent\n visible={idleTimeoutModalVisible}\n animationType=\"none\"\n statusBarTranslucent>\n <TouchableWithoutFeedback onPress={handleOverlayPress}>\n <Animated.View style={[styles.overlay, { opacity: fadeAnim }]}>\n <TouchableWithoutFeedback>\n <Animated.View\n style={[\n styles.modal,\n style,\n {\n opacity: fadeAnim,\n transform: [{ scale: scaleAnim }],\n },\n ]}>\n <View style={styles.content}>\n {/* Timer Icon */}\n <View style={styles.timerIcon}>\n <Text style={[commonStyles.heading3Bold, styles.timerText]}>\n {formattedTime}\n </Text>\n </View>\n\n {/* Text Content */}\n <View style={styles.textContent}>\n <Text style={[commonStyles.heading2Medium, styles.title]}>\n Are you still there?\n </Text>\n <Text style={[commonStyles.bodyRegular, styles.subtitle]}>\n You are the only one here, so this call will end in less\n than {ceilMinutes} minute{ceilMinutes > 1 ? 's' : ''}. Do\n you want to stay in this call?\n </Text>\n </View>\n\n {/* Action Buttons */}\n <View style={styles.actions}>\n <TouchableOpacity\n style={[styles.button, styles.buttonSecondary]}\n onPress={onStayInCall}\n activeOpacity={0.8}>\n <Text\n style={[\n commonStyles.bodyMedium,\n styles.buttonSecondaryText,\n ]}>\n Stay on the call\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[styles.button, styles.buttonPrimary]}\n onPress={leaveSession}\n activeOpacity={0.8}>\n <Text\n style={[\n commonStyles.bodyMedium,\n styles.buttonPrimaryText,\n ]}>\n Leave now\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </Animated.View>\n </TouchableWithoutFeedback>\n </Animated.View>\n </TouchableWithoutFeedback>\n </Modal>\n );\n};\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 20,\n },\n modal: {\n backgroundColor: '#141414',\n borderRadius: 20,\n borderWidth: 1,\n borderColor: '#383838',\n width: '100%',\n paddingTop: 32,\n paddingHorizontal: 20,\n paddingBottom: 20,\n shadowColor: '#000',\n shadowOffset: {\n width: 0,\n height: 12,\n },\n shadowOpacity: 0.08,\n shadowRadius: 16,\n elevation: 8,\n },\n content: {\n alignItems: 'center',\n gap: 20,\n },\n timerIcon: {\n width: 80,\n height: 80,\n borderRadius: 40,\n backgroundColor: '#473892',\n justifyContent: 'center',\n alignItems: 'center',\n },\n timerText: {\n color: '#FFFFFF',\n textAlign: 'center',\n },\n textContent: {\n alignItems: 'center',\n gap: 8,\n width: '100%',\n },\n title: {\n color: '#FFFFFF',\n textAlign: 'center',\n width: '100%',\n },\n subtitle: {\n color: '#B8B8B8',\n textAlign: 'center',\n lineHeight: 20,\n width: '100%',\n },\n actions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n },\n button: {\n flex: 1,\n height: 40,\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 8,\n },\n buttonSecondary: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: '#383838',\n },\n buttonSecondaryText: {\n color: '#FFFFFF',\n },\n buttonPrimary: {\n backgroundColor: '#C73C3E',\n },\n buttonPrimaryText: {\n color: '#FFFFFF',\n },\n});\n\nexport default IdealTimeoutModal;\n","import { eventBus, useConfigStore } from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { StyleSheet, Text, TouchableOpacity, View } from 'react-native';\nimport Icon from '../icon/Icon.native';\nimport { commonStyles } from '../theme/style-variables';\n\nconst ShareInviteButton = () => {\n const hideShareInviteButton = useConfigStore(\n state => state.hideShareInviteButton,\n );\n\n if (hideShareInviteButton) {\n return null;\n }\n\n return (\n <View style={styles.shareButtonContainer}>\n <TouchableOpacity\n style={styles.shareButton}\n onPress={() => {\n eventBus.publish({\n type: 'onShareInviteButtonClicked',\n });\n }}>\n <Icon name=\"share\" size={24} fill=\"#FFFFFF\" />\n <Text style={[commonStyles.heading4Medium, styles.shareButtonText]}>\n Share Invite\n </Text>\n </TouchableOpacity>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n shareButtonContainer: {\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n shareButton: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#8C78F0',\n borderRadius: 8,\n paddingVertical: 12,\n paddingHorizontal: 16,\n gap: 8,\n },\n shareButtonText: {\n color: '#FFFFFF',\n },\n});\n\nexport default ShareInviteButton;\n","import { Participant, useConferenceStore } from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport Icon from '../../icon/Icon.native';\n\nconst QUALITY_COLOR_MAP: Record<number, string> = {\n 1: '#C73C3E',\n 2: '#D08D04',\n 3: '#0B9F5D',\n 4: '#0B9F5D',\n};\n\nconst ConnectionQualityIndicator = ({\n participantId,\n}: {\n participantId: Participant['pid'];\n}) => {\n const connectionQuality = useConferenceStore(state =>\n state.connectionQuality.get(participantId),\n );\n if (connectionQuality === undefined) {\n return null;\n }\n const quality = (connectionQuality >> 5) + 1;\n const signalColor = QUALITY_COLOR_MAP[quality];\n return <Icon name=\"signal\" size={24} fill={signalColor} />;\n};\n\nexport default ConnectionQualityIndicator;\n","import {\n MEDIA_TYPE,\n Participant,\n useRaisedHandTimestamp,\n useTrackMuted,\n} from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport { Text, View } from 'react-native';\nimport Avatar from '../../avatar/Avatar.native';\nimport Icon from '../../icon/Icon.native';\nimport { commonStyles } from '../../theme/style-variables';\nimport ConnectionQualityIndicator from './ConnectionQualityIndicator.native';\nimport MoreOptionButton from './MoreOptionButton';\nimport { styles } from './styles';\n\ninterface ParticipantItemProps {\n participant: Participant;\n}\n\nconst ParticipantItem: React.FC<ParticipantItemProps> = ({ participant }) => {\n const { pid, name, avatar, type, ruid } = participant;\n const muted = useTrackMuted(MEDIA_TYPE.AUDIO, participant.pid);\n\n const description = participant.type === 'screen-share' ? 'Presentation' : '';\n\n const micIconName = muted ? 'mic-off' : 'mic';\n const micIconColor = muted ? '#858585' : '#6852D6';\n const raisedHandTimestamp = useRaisedHandTimestamp(pid, type);\n\n return (\n <View style={styles.participantItem}>\n <Avatar\n name={name}\n imageUrl={avatar}\n fontSize={18}\n size={48}\n containerStyle={styles.avatar}\n textStyle={commonStyles.heading3Bold}\n />\n <View style={styles.participantText}>\n <Text\n style={[commonStyles.bodyMedium, styles.participantName]}\n numberOfLines={1}\n ellipsizeMode=\"tail\">\n {name}\n </Text>\n {description && (\n <Text\n style={[\n commonStyles.caption1Regular,\n styles.participantDescription,\n ]}\n numberOfLines={1}\n ellipsizeMode=\"tail\">\n {description}\n </Text>\n )}\n </View>\n <View style={styles.participantIcons}>\n {raisedHandTimestamp ? (\n <Icon name=\"raise-hand-fill\" size={20} fill=\"#fff\" />\n ) : (\n <ConnectionQualityIndicator participantId={pid} />\n )}\n <Icon name={micIconName} size={24} fill={micIconColor} />\n <MoreOptionButton ruid={ruid} />\n </View>\n </View>\n );\n};\n\nexport default ParticipantItem;\n","import {\n toggleParticipantListVisible,\n useOrderedParticipants,\n} from '@cometchat/calls-sdk-core';\nimport React, { useState } from 'react';\nimport {\n FlatList,\n StyleSheet,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n} from 'react-native';\nimport Icon from '../icon/Icon.native';\nimport ShareInviteButton from '../shared/ShareInviteButton.native';\nimport { colors, commonStyles } from '../theme/style-variables';\nimport ParticipantItem from './participant-item/ParticipantItem.native'; // Adjusted import path\n\nconst ListEmptyComponent = () => (\n <Text style={[commonStyles.heading3Bold, styles.noResults]}>\n No participants found.\n </Text>\n);\n\nconst ParticipantList: React.FC = () => {\n const [searchTerm, setSearchTerm] = useState('');\n const participants = useOrderedParticipants();\n\n const filteredParticipants = participants.filter(p =>\n p.name.toLowerCase().includes(searchTerm.toLowerCase()),\n );\n\n return (\n <View style={styles.participantListContainer}>\n {/* Header */}\n <View style={styles.participantListHeader}>\n <Text style={[commonStyles.heading2Bold, styles.headerTitle]}>\n Participants ({filteredParticipants.length})\n </Text>\n <TouchableOpacity\n onPress={toggleParticipantListVisible}\n accessibilityLabel=\"Close participants list\">\n <Icon name=\"close\" size={24} fill=\"#FFFFFF\" />\n </TouchableOpacity>\n </View>\n\n <ShareInviteButton />\n\n {/* Search Bar */}\n <View style={styles.searchContainer}>\n <View style={styles.searchInputWrapper}>\n <Icon name=\"search\" size={24} fill=\"#858585\" />\n <TextInput\n placeholder=\"Search Participant\"\n style={styles.searchInput}\n value={searchTerm}\n onChangeText={setSearchTerm} // Use onChangeText for TextInput\n placeholderTextColor=\"#858585\"\n />\n </View>\n </View>\n\n {/* Participant List Area */}\n <FlatList\n data={filteredParticipants}\n renderItem={({ item }) => <ParticipantItem participant={item} />}\n keyExtractor={item => item.ruid}\n ListEmptyComponent={ListEmptyComponent}\n />\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n participantListContainer: {\n flex: 1,\n backgroundColor: '#1A1A1A',\n },\n participantListHeader: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 16,\n gap: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#383838',\n },\n headerTitle: {\n color: '#ffffff',\n },\n searchContainer: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n paddingVertical: 12,\n paddingHorizontal: 16,\n },\n searchInputWrapper: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n gap: 8,\n height: 40,\n backgroundColor: '#272727',\n borderWidth: 1,\n borderColor: '#272727',\n borderRadius: 1000,\n flex: 1,\n },\n searchInput: {\n ...commonStyles.heading4Regular,\n flex: 1,\n color: '#ffffff',\n },\n noResults: {\n padding: 20,\n textAlign: 'center',\n width: '100%',\n color: colors.text.primary,\n },\n});\n\nexport default ParticipantList;\n","import { useMainParticipant } from '@cometchat/calls-sdk-core';\nimport React from 'react';\nimport Tile from './tile/Tile.native';\n\nfunction PiPTile(): React.JSX.Element {\n const mainParticipant = useMainParticipant();\n\n return <Tile participant={mainParticipant} />;\n}\n\nexport default PiPTile;\n","import { StyleSheet } from 'react-native';\nimport {\n borderRadius,\n colors,\n commonStyles,\n padding,\n spacing,\n} from '../theme/style-variables';\n\nexport const styles = StyleSheet.create({\n containerTop: {\n position: 'absolute',\n top: spacing[4],\n left: spacing[4],\n right: spacing[4],\n zIndex: 9999,\n alignItems: 'center',\n gap: spacing[2],\n },\n containerBottom: {\n position: 'absolute',\n bottom: spacing[4],\n left: spacing[4],\n right: spacing[4],\n zIndex: 9999,\n alignItems: 'center',\n gap: spacing[2],\n },\n toast: {\n width: '100%',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: padding[3],\n paddingHorizontal: padding[4],\n borderRadius: borderRadius[2],\n borderWidth: 1,\n\n // Shadow for iOS\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n\n // Shadow for Android\n elevation: 6,\n },\n toastInfo: {\n backgroundColor: colors.background[3],\n borderColor: colors.border.default,\n },\n toastSuccess: {\n backgroundColor: '#0d2818',\n borderColor: colors.alert.success,\n },\n toastWarning: {\n backgroundColor: '#2b2000',\n borderColor: colors.alert.warning,\n },\n toastError: {\n backgroundColor: '#2b0f0f',\n borderColor: colors.alert.error,\n },\n message: {\n ...commonStyles.bodyRegular,\n color: colors.text.primary,\n flex: 1,\n },\n actionButton: {\n marginLeft: spacing[3],\n paddingVertical: padding[1],\n paddingHorizontal: padding[3],\n borderRadius: borderRadius[1],\n backgroundColor: 'transparent',\n },\n actionText: {\n ...commonStyles.buttonMedium,\n color: colors.primary,\n },\n});\n","import type { NotificationType } from '@cometchat/calls-sdk-core';\nimport { create } from 'zustand';\n\nconst MAX_TOASTS = 3;\n\nexport interface ToastAction {\n label: string;\n onPress: () => void;\n}\n\nexport interface ToastItem {\n id: string;\n message: string;\n type: NotificationType;\n duration: number;\n position: 'top' | 'bottom';\n action?: ToastAction;\n createdAt: number;\n}\n\ninterface ToastState {\n toasts: ToastItem[];\n}\n\ninterface ToastActions {\n addToast: (toast: Omit<ToastItem, 'id' | 'createdAt'>) => string;\n removeToast: (id: string) => void;\n clearAll: () => void;\n}\n\nlet counter = 0;\n\nexport const useToastStore = create<ToastState & ToastActions>(set => ({\n toasts: [],\n\n addToast: toast => {\n const id = `toast-${++counter}-${Date.now()}`;\n const newToast: ToastItem = {\n ...toast,\n id,\n createdAt: Date.now(),\n };\n\n set(state => {\n const updated = [...state.toasts, newToast];\n // Keep only the latest MAX_TOASTS\n if (updated.length > MAX_TOASTS) {\n return { toasts: updated.slice(-MAX_TOASTS) };\n }\n return { toasts: updated };\n });\n\n return id;\n },\n\n removeToast: id => {\n set(state => ({\n toasts: state.toasts.filter(t => t.id !== id),\n }));\n },\n\n clearAll: () => {\n set({ toasts: [] });\n },\n}));\n\nexport function showToast(params: {\n message: string;\n type?: NotificationType;\n duration?: number;\n position?: 'top' | 'bottom';\n action?: ToastAction;\n}): string {\n return useToastStore.getState().addToast({\n message: params.message,\n type: params.type ?? 'info',\n duration: params.duration ?? 3000,\n position: params.position ?? 'bottom',\n action: params.action,\n });\n}\n","import { eventBus, INTERNAL_EVENTS } from '@cometchat/calls-sdk-core';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { Animated, Pressable, Text, View } from 'react-native';\nimport { styles } from './styles';\nimport { type ToastItem, useToastStore } from './toast-state';\n\nconst SLIDE_IN_DURATION = 300;\nconst SLIDE_OUT_DURATION = 200;\n\nconst typeStyleMap = {\n info: styles.toastInfo,\n success: styles.toastSuccess,\n warning: styles.toastWarning,\n error: styles.toastError,\n} as const;\n\nfunction ToastItemView({\n toast,\n onDismiss,\n}: {\n toast: ToastItem;\n onDismiss: (id: string) => void;\n}) {\n const opacity = useRef(new Animated.Value(0)).current;\n const translateY = useRef(\n new Animated.Value(toast.position === 'top' ? -20 : 20),\n ).current;\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const dismiss = useCallback(() => {\n Animated.parallel([\n Animated.timing(opacity, {\n toValue: 0,\n duration: SLIDE_OUT_DURATION,\n useNativeDriver: true,\n }),\n Animated.timing(translateY, {\n toValue: toast.position === 'top' ? -20 : 20,\n duration: SLIDE_OUT_DURATION,\n useNativeDriver: true,\n }),\n ]).start(() => {\n onDismiss(toast.id);\n });\n }, [onDismiss, opacity, toast.id, toast.position, translateY]);\n\n useEffect(() => {\n // Slide in\n Animated.parallel([\n Animated.timing(opacity, {\n toValue: 1,\n duration: SLIDE_IN_DURATION,\n useNativeDriver: true,\n }),\n Animated.timing(translateY, {\n toValue: 0,\n duration: SLIDE_IN_DURATION,\n useNativeDriver: true,\n }),\n ]).start();\n\n // Auto-dismiss\n timerRef.current = setTimeout(dismiss, toast.duration);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, [dismiss, opacity, toast.duration, translateY]);\n\n const handleActionPress = () => {\n toast.action?.onPress();\n dismiss();\n };\n\n return (\n <Animated.View\n style={[\n styles.toast,\n typeStyleMap[toast.type],\n { opacity, transform: [{ translateY }] },\n ]}>\n <Text style={styles.message}>{toast.message}</Text>\n {toast.action && (\n <Pressable style={styles.actionButton} onPress={handleActionPress}>\n <Text style={styles.actionText}>{toast.action.label}</Text>\n </Pressable>\n )}\n </Animated.View>\n );\n}\n\nexport function Toast() {\n const toasts = useToastStore(state => state.toasts);\n const removeToast = useToastStore(state => state.removeToast);\n\n useEffect(() => {\n const unsubscribe = eventBus.subscribe(\n INTERNAL_EVENTS.notification,\n payload => {\n useToastStore.getState().addToast({\n message: payload.message,\n type: payload.type,\n duration: payload.duration ?? 3000,\n position: payload.position ?? 'bottom',\n action: payload.action,\n });\n },\n );\n\n return unsubscribe;\n }, []);\n\n const topToasts = toasts.filter(t => t.position === 'top');\n const bottomToasts = toasts.filter(t => t.position === 'bottom');\n\n return (\n <>\n {topToasts.length > 0 && (\n <View style={styles.containerTop} pointerEvents=\"box-none\">\n {topToasts.map(toast => (\n <ToastItemView\n key={toast.id}\n toast={toast}\n onDismiss={removeToast}\n />\n ))}\n </View>\n )}\n {bottomToasts.length > 0 && (\n <View style={styles.containerBottom} pointerEvents=\"box-none\">\n {bottomToasts.map(toast => (\n <ToastItemView\n key={toast.id}\n toast={toast}\n onDismiss={removeToast}\n />\n ))}\n </View>\n )}\n </>\n );\n}\n","import {\n ConfigStateBoth,\n ConfigStateInternal,\n ConfigStateMobile,\n eventBus,\n GRID_GAP,\n INTERNAL_EVENTS,\n SESSION_TYPE,\n startSession,\n toggleAudioModeMenuVisible,\n toggleMoreMenuVisible,\n updateConfig,\n useBaseStore,\n useConfigStore,\n useIsConferenceJoined,\n} from '@cometchat/calls-sdk-core';\nimport React, { useEffect, useLayoutEffect } from 'react';\nimport { Platform, StyleSheet, View } from 'react-native';\nimport AudioModeModule, {\n AudioModeEventEmitter,\n} from '../native-communication/AudioModeModule';\nimport '../native-only';\nimport CallStage from './CallStage.native';\nimport { ConfirmationDialog } from './confirmation-dialog/ConfirmationDialog';\nimport AudioModesMenu from './control-pane/AudioModesMenu.native';\nimport ControlPane from './control-pane/ControlPane.native';\nimport MoreMenu from './control-pane/MoreMenu.native';\nimport FullScreenDialog from './full-screen-dialog/FullScreenDialog.native';\nimport Header from './header/Header.native';\nimport IdealTimeoutModal from './ideal-timeout/IdealTimeoutModal.native';\nimport ParticipantList from './participants/ParticipantList.native';\nimport PiPTile from './PiPTile';\nimport { ProcessingOverlay } from './processing-overlay/ProcessingOverlay.native';\nimport { Toast } from './toast/Toast.native';\n\ninterface CallUIProps {\n callSettings: Partial<\n ConfigStateInternal & ConfigStateMobile & ConfigStateBoth\n >;\n}\n\nfunction CallUI(props: CallUIProps): React.JSX.Element {\n const moreMenuVisible = useBaseStore(state => state.moreMenuVisible);\n const participantListVisible = useBaseStore(\n state => state.participantListVisible,\n );\n const isPIPLayoutEnabled = useBaseStore(state => state.isPIPLayoutEnabled);\n const audioModeMenuVisible = useBaseStore(\n state => state.audioModeMenuVisible,\n );\n const type = useConfigStore(state => state.sessionType);\n const isConferenceJoined = useIsConferenceJoined();\n\n useLayoutEffect(() => {\n eventBus.publish({\n type: INTERNAL_EVENTS.lifecycle.componentDidMount,\n });\n updateConfig(props.callSettings);\n return () => {\n eventBus.publish(\n {\n type: INTERNAL_EVENTS.lifecycle.componentWillUnmount,\n },\n true,\n );\n };\n }, [props.callSettings]);\n\n useEffect(() => {\n useBaseStore.setState({\n sdkPlatform: Platform.OS as 'android' | 'ios',\n });\n startSession();\n }, []);\n\n useEffect(() => {\n const sub = AudioModeEventEmitter.addListener(\n AudioModeModule.DEVICE_CHANGE_EVENT,\n e => {\n console.log('AudioMode.DEVICE_CHANGE_EVENT', e);\n useBaseStore.setState({\n audioModes: e,\n });\n },\n );\n\n return () => {\n sub.remove();\n };\n }, []);\n\n useEffect(() => {\n if (Platform.OS === 'android') {\n AudioModeModule.setMode(\n type === SESSION_TYPE.VOICE\n ? AudioModeModule.AUDIO_CALL\n : AudioModeModule.VIDEO_CALL,\n );\n if (props.callSettings.audioMode) {\n AudioModeModule.setAudioDevice(props.callSettings.audioMode);\n }\n } else if (Platform.OS === 'ios') {\n AudioModeModule.updateDeviceList();\n }\n }, [props.callSettings.audioMode, type]);\n\n if (isPIPLayoutEnabled) {\n return <PiPTile />;\n }\n\n return (\n <View\n style={styles.container}\n onLayout={e => {\n useBaseStore.setState({\n callContainerDimension: {\n width: e.nativeEvent.layout.width,\n height: e.nativeEvent.layout.height,\n },\n });\n }}>\n <Header />\n <CallStage />\n <ControlPane />\n <FullScreenDialog visible={participantListVisible}>\n <ParticipantList />\n </FullScreenDialog>\n <MoreMenu isVisible={moreMenuVisible} onClose={toggleMoreMenuVisible} />\n <AudioModesMenu\n isVisible={audioModeMenuVisible}\n onClose={toggleAudioModeMenuVisible}\n />\n <IdealTimeoutModal />\n <ProcessingOverlay\n message=\"Connecting...\"\n visible={!isConferenceJoined}\n />\n <ConfirmationDialog />\n <Toast />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n // margin: 20,\n // justifyContent: 'center',\n // alignItems: 'center',\n backgroundColor: '#1A1A1A',\n },\n contentContainerStyle: {\n alignItems: 'center',\n gap: GRID_GAP,\n paddingHorizontal: 20,\n },\n loadingContainer: {\n ...StyleSheet.absoluteFillObject,\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '#000',\n zIndex: 1000,\n },\n});\n\nexport default CallUI;\n","import React from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { commonStyles } from './theme/style-variables';\n\nconst InfoView = ({ text }: { text: string }) => {\n return (\n <View style={styles.container}>\n <Text style={[commonStyles.bodyRegular, styles.message]}>{text}</Text>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n width: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '#272727',\n padding: 20,\n },\n message: {\n color: '#FFF',\n },\n});\n\nexport default InfoView;\n","import { ConfigStateBoth, ConfigStateMobile } from '@cometchat/calls-sdk-core';\nimport { CallSettings as LegacyCallSettings } from './models/CallSettings';\n\nexport const convertLegacyCallSettingsToV5Props = (\n callSettings:\n | LegacyCallSettings\n | Partial<ConfigStateMobile & ConfigStateBoth>,\n) => {\n const v5Props: Partial<ConfigStateMobile & ConfigStateBoth> = {};\n const cs = callSettings as any;\n\n if (typeof cs.defaultLayout === 'boolean') {\n v5Props.hideControlPanel = !cs.defaultLayout;\n }\n\n if (typeof cs.isAudioOnly === 'boolean') {\n v5Props.sessionType = cs.isAudioOnly ? 'VOICE' : 'VIDEO';\n }\n\n if (typeof cs.ShowEndCallButton === 'boolean') {\n v5Props.hideLeaveSessionButton = !cs.ShowEndCallButton;\n }\n\n if (typeof cs.ShowSwitchCameraButton === 'boolean') {\n v5Props.hideSwitchCameraButton = !cs.ShowSwitchCameraButton;\n }\n\n if (typeof cs.ShowMuteAudioButton === 'boolean') {\n v5Props.hideToggleAudioButton = !cs.ShowMuteAudioButton;\n }\n\n if (typeof cs.ShowPauseVideoButton === 'boolean') {\n v5Props.hideToggleVideoButton = !cs.ShowPauseVideoButton;\n }\n\n if (typeof cs.ShowAudioModeButton === 'boolean') {\n v5Props.hideAudioModeButton = !cs.ShowAudioModeButton;\n }\n\n if (typeof cs.StartAudioMuted === 'boolean') {\n v5Props.startAudioMuted = cs.StartAudioMuted;\n }\n\n if (typeof cs.StartVideoMuted === 'boolean') {\n v5Props.startVideoPaused = cs.StartVideoMuted;\n }\n\n if (typeof cs.ShowRecordingButton === 'boolean') {\n v5Props.hideRecordingButton = !cs.ShowRecordingButton;\n }\n\n if (typeof cs.StartRecordingOnCallStart === 'boolean') {\n v5Props.autoStartRecording = cs.StartRecordingOnCallStart;\n }\n\n if (typeof cs.enableDraggableVideoTile === 'boolean') {\n v5Props.enableSpotlightDrag = cs.enableDraggableVideoTile;\n }\n\n if (typeof cs.EnableVideoTileClick === 'boolean') {\n v5Props.enableSpotlightSwap = cs.EnableVideoTileClick;\n }\n\n if (\n cs.defaultAudioMode === 'BLUETOOTH' ||\n cs.defaultAudioMode === 'EARPIECE' ||\n cs.defaultAudioMode === 'HEADPHONES' ||\n cs.defaultAudioMode === 'SPEAKER'\n ) {\n v5Props.audioMode = cs.defaultAudioMode;\n }\n\n if (cs.mode === 'SPOTLIGHT') {\n v5Props.layout = 'SPOTLIGHT';\n } else {\n v5Props.layout = 'SIDEBAR';\n }\n\n if (cs.idleTimeoutPeriod) {\n v5Props.idleTimeoutPeriodAfterPrompt = 60000;\n v5Props.idleTimeoutPeriodBeforePrompt = Math.max(\n (cs.idleTimeoutPeriod - 60) * 1000,\n 60000,\n );\n }\n\n return v5Props;\n};\n\n// export class CallSettings {\n// public static readonly POSITION_TOP_LEFT = 'top-left';\n// public static readonly POSITION_TOP_RIGHT = 'top-right';\n// public static readonly POSITION_BOTTOM_LEFT = 'bottom-left';\n// public static readonly POSITION_BOTTOM_RIGHT = 'bottom-right';\n// public static readonly ASPECT_RATIO_DEFAULT = 'default';\n// public static readonly ASPECT_RATIO_CONTAIN = 'contain';\n// public static readonly ASPECT_RATIO_COVER = 'cover';\n// public static readonly POSITION = {\n// TOP_LEFT: 'top-left',\n// TOP_RIGHT: 'top-right',\n// BOTTOM_LEFT: 'bottom-left',\n// BOTTOM_RIGHT: 'bottom-right',\n// } as const;\n// public static readonly ASPECT_RATIO = {\n// DEFAULT: 'default',\n// CONTAIN: 'contain',\n// COVER: 'cover',\n// } as const;\n\n// private defaultLayout: boolean; done\n// private isAudioOnly: boolean; done\n// private listener: OngoingCallListener;\n// private mode: string;\n// private ShowEndCallButton: boolean; done\n// private ShowSwitchCameraButton: boolean; not needed\n// private ShowMuteAudioButton: boolean; done\n// private ShowPauseVideoButton: boolean; done\n// private ShowAudioModeButton: boolean; done\n// private StartAudioMuted: boolean; done\n// private StartVideoMuted: boolean; done\n// private defaultAudioMode: string; todo\n// private ShowSwitchToVideoCallButton: boolean; not needed\n// private AvatarMode: string;\n// private ShowRecordingButton: boolean;\n// private idleTimeoutPeriod: number;\n// private StartRecordingOnCallStart: boolean;\n// private MainVideoContainerSetting: MainVideoContainerSetting;\n// private EnableVideoTileClick: boolean;\n// private enableDraggableVideoTile: boolean;\n\n// public constructor(builder: CallSettingsBuilder) {\n// this.defaultLayout = builder.defaultLayout;\n// this.isAudioOnly = builder.isAudioOnly;\n// this.listener = builder.listener;\n// this.mode = builder.mode;\n// this.ShowEndCallButton = builder.ShowEndCallButton;\n// this.ShowSwitchCameraButton = builder.ShowSwitchCameraButton;\n// this.ShowMuteAudioButton = builder.ShowMuteAudioButton;\n// this.ShowPauseVideoButton = builder.ShowPauseVideoButton;\n// this.ShowAudioModeButton = builder.ShowAudioModeButton;\n// this.StartAudioMuted = builder.StartAudioMuted;\n// this.StartVideoMuted = builder.StartVideoMuted;\n// this.defaultAudioMode = builder.defaultAudioMode;\n// this.ShowSwitchToVideoCallButton = builder.ShowSwitchToVideoCallButton;\n// this.AvatarMode = builder.AvatarMode;\n// this.ShowRecordingButton = builder.ShowRecordingButton;\n// this.idleTimeoutPeriod = builder.idleTimeoutPeriod;\n// this.StartRecordingOnCallStart = builder.StartRecordingOnCallStart;\n// this.MainVideoContainerSetting = builder.MainVideoContainerSetting;\n// this.EnableVideoTileClick = builder.EnableVideoTileClick;\n// this.enableDraggableVideoTile = builder.enableDraggableVideoTile;\n// }\n\n// public isAudioOnlyCall() {\n// return this.isAudioOnly;\n// }\n\n// public isDefaultLayoutEnabled() {\n// return this.defaultLayout;\n// }\n\n// public getCallEventListener() {\n// return this.listener;\n// }\n\n// public getMode() {\n// return this.mode;\n// }\n\n// public isEndCallButtonEnabled(): boolean {\n// return this.ShowEndCallButton;\n// }\n\n// public isSwitchCameraButtonEnabled(): boolean {\n// return this.ShowSwitchCameraButton;\n// }\n\n// public isMuteAudioButtonEnabled(): boolean {\n// return this.ShowMuteAudioButton;\n// }\n\n// public isPauseVideoButtonEnabled(): boolean {\n// return this.ShowPauseVideoButton;\n// }\n\n// public isAudioModeButtonEnabled(): boolean {\n// return this.ShowAudioModeButton;\n// }\n\n// public getStartWithAudioMuted(): boolean {\n// return this.StartAudioMuted;\n// }\n\n// public getStartWithVideoMuted(): boolean {\n// return this.StartVideoMuted;\n// }\n\n// public getDefaultAudioMode(): string {\n// return this.defaultAudioMode;\n// }\n\n// public isAudioToVideoButtonEnabled(): boolean {\n// return this.ShowSwitchToVideoCallButton;\n// }\n\n// public getAvatarMode(): string {\n// return this.AvatarMode;\n// }\n\n// public isRecordingButtonEnabled(): boolean {\n// return this.ShowRecordingButton;\n// }\n\n// public getIdleTimeoutPeriod(): number {\n// return this.idleTimeoutPeriod;\n// }\n\n// public shouldStartRecordingOnCallStart(): boolean {\n// return this.StartRecordingOnCallStart;\n// }\n\n// public getMainVideoContainerSetting(): MainVideoContainerSetting {\n// return this.MainVideoContainerSetting;\n// }\n\n// public isVideoTileClickEnabled(): boolean {\n// return this.EnableVideoTileClick;\n// }\n\n// public isVideoTileDragEnabled(): boolean {\n// return this.enableDraggableVideoTile;\n// }\n// }\n","import { tryCatch } from '@cometchat/calls-sdk-core';\nimport * as v from 'valibot';\nimport type { Result } from './types';\n\nconst CometChatAPIErrorSchema = v.object({\n message: v.string(),\n devMessage: v.string(),\n source: v.string(),\n code: v.string(),\n});\n\nexport type CometChatAPIError = v.InferInput<typeof CometChatAPIErrorSchema>;\n\nexport interface CometChatAPIException extends Error {\n readonly name:\n | 'COMET_CHAT_API_ERROR'\n | 'NETWORK_ERROR'\n | 'VALIDATION_ERROR'\n | 'BAD_RESPONSE'\n | 'UNKNOWN_ERROR';\n readonly details?: unknown;\n readonly timestamp: number;\n}\n\nexport const HTTPRequestConfigSchema = v.object({\n baseURL: v.string(),\n method: v.optional(\n v.union([\n v.literal('GET'),\n v.literal('POST'),\n v.literal('PUT'),\n v.literal('DELETE'),\n ]),\n 'GET',\n ),\n endpoint: v.string(),\n headers: v.record(v.string(), v.string()),\n body: v.optional(v.unknown()),\n});\n\nexport type HTTPRequestConfig = v.InferInput<typeof HTTPRequestConfigSchema>;\n\nexport async function executeHTTPRequest<T = unknown>({\n baseURL,\n method = 'GET',\n endpoint,\n headers,\n body,\n}: HTTPRequestConfig): Promise<Result<T, CometChatAPIException>> {\n // Validate input parameters\n const validationResult = v.safeParse(HTTPRequestConfigSchema, {\n baseURL,\n method,\n endpoint,\n headers,\n body,\n });\n\n if (!validationResult.success) {\n return {\n data: null,\n error: {\n name: 'VALIDATION_ERROR',\n message:\n 'Invalid request parameters: ' +\n validationResult.issues.map(issue => issue.message).join(', '),\n timestamp: Date.now(),\n },\n };\n }\n\n // Construct the CometChat API URL\n const apiUrl = `${baseURL}/${endpoint}`;\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n\n // Include body for non-GET requests\n if (body && method !== 'GET') {\n fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n // Execute the HTTP request with error handling\n const { data: response, error: fetchError } = await tryCatch(\n fetch(apiUrl, fetchOptions),\n );\n\n if (fetchError) {\n return {\n data: null,\n error: {\n name: 'NETWORK_ERROR',\n message: `Network request failed: ${fetchError.message}`,\n details: fetchError,\n timestamp: Date.now(),\n },\n };\n }\n\n // Parse JSON response with error handling\n const { data: responseJson, error: jsonError } = await tryCatch(\n response.json(),\n );\n\n if (jsonError) {\n return {\n data: null,\n error: {\n name: 'UNKNOWN_ERROR',\n message: `Failed to parse response JSON: ${jsonError.message}`,\n timestamp: Date.now(),\n },\n };\n }\n\n // Handle API-level errors from CometChat server\n if (responseJson.error) {\n const apiErrorValidation = v.safeParse(\n CometChatAPIErrorSchema,\n responseJson.error,\n );\n\n if (!apiErrorValidation.success) {\n return {\n data: null,\n error: {\n name: 'UNKNOWN_ERROR',\n message: 'Unknown API error format received from server',\n timestamp: Date.now(),\n },\n };\n }\n\n return {\n data: null,\n error: {\n name: 'COMET_CHAT_API_ERROR',\n message: apiErrorValidation.output.message,\n details: apiErrorValidation.output,\n timestamp: Date.now(),\n },\n };\n }\n\n // Return successful response data\n return {\n data: responseJson.data,\n error: null,\n };\n}\n","import { InternalSettingSchema } from '@cometchat/calls-sdk-core';\nimport * as v from 'valibot';\nimport { executeHTTPRequest, type CometChatAPIException } from './http-request';\nimport type { Result } from './types';\n\nconst VerifyTokenArgsSchema = v.object({\n appId: v.string(),\n region: v.string(),\n calltoken: v.string(),\n baseURL: v.string(),\n});\n\nconst VerifyTokenResponseSchema = InternalSettingSchema;\n\ntype VerifyTokenResponse = v.InferInput<typeof VerifyTokenResponseSchema>;\n\nexport type VerifyTokenArgs = v.InferInput<typeof VerifyTokenArgsSchema>;\n\nexport interface VerifyTokenException extends Error {\n name: CometChatAPIException['name'];\n details?: unknown;\n}\n\nexport async function callVerifyTokenAPI({\n appId,\n region,\n calltoken,\n baseURL,\n}: VerifyTokenArgs): Promise<\n Result<VerifyTokenResponse, VerifyTokenException>\n> {\n const result = v.safeParse(VerifyTokenArgsSchema, {\n appId,\n region,\n calltoken,\n baseURL,\n });\n if (!result.success) {\n return {\n data: null,\n error: {\n name: 'VALIDATION_ERROR',\n message: result.issues.map(issue => issue.message).join(', '),\n },\n };\n }\n const response = await executeHTTPRequest({\n baseURL,\n method: 'GET',\n endpoint: 'call_tokens?configVersion=1',\n headers: {\n calltoken,\n appId,\n },\n });\n if (response.error) {\n return response;\n }\n const parseResult = v.safeParse(VerifyTokenResponseSchema, response.data);\n if (!parseResult.success) {\n return {\n data: null,\n error: {\n name: 'BAD_RESPONSE',\n message: parseResult.issues.map(issue => issue.message).join(', '),\n },\n };\n }\n return {\n data: parseResult.output,\n error: null,\n };\n}\n","import {\n ConfigStateBoth,\n ConfigStateMobile,\n eventBus,\n} from '@cometchat/calls-sdk-core';\nimport React, { useEffect } from 'react';\nimport { CometChatCalls } from './CometChatCalls';\nimport './native-communication/js-to-native';\nimport './native-communication/native-to-js.native';\nimport CallUI from './ui/index.native';\nimport InfoView from './ui/InfoView.native';\nimport { ProcessingOverlay } from './ui/processing-overlay/ProcessingOverlay.native';\nimport { convertLegacyCallSettingsToV5Props } from './v4/convert-props';\nimport { CallSettings as LegacyCallSettings } from './v4/models/CallSettings';\nimport { callVerifyTokenAPI } from './verify-token';\n\ninterface AppProps extends Partial<ConfigStateMobile & ConfigStateBoth> {\n callToken: string;\n callSettings?:\n | LegacyCallSettings\n | Partial<ConfigStateMobile & ConfigStateBoth>;\n}\n\nfunction App(props: AppProps) {\n const [internalSettings, setInternalSettings] = React.useState<string | null>(\n null,\n );\n const [infoMessage, setInfoMessage] = React.useState<string | null>(null);\n\n useEffect(() => {\n return eventBus.subscribe('onConnectionClosed', () => {\n setTimeout(() => {\n setInfoMessage('The session has ended.');\n }, 0);\n });\n }, []);\n\n useEffect(() => {\n const listeners: (() => void)[] = [];\n const cs = (props.callSettings ?? {}) as any;\n if (cs.listener?.onUserJoined) {\n listeners.push(\n CometChatCalls.addEventListener(\n 'onParticipantJoined',\n cs.listener.onUserJoined,\n ),\n );\n }\n\n if (cs.listener?.onUserLeft) {\n listeners.push(\n CometChatCalls.addEventListener(\n 'onParticipantLeft',\n cs.listener.onUserLeft,\n ),\n );\n }\n\n if (cs.listener?.onUserListUpdated) {\n listeners.push(\n CometChatCalls.addEventListener(\n 'onParticipantListChanged',\n cs.listener.onUserListUpdated,\n ),\n );\n }\n\n if (cs.listener?.onRecordingStarted) {\n listeners.push(\n CometChatCalls.addEventListener(\n 'onRecordingStarted',\n cs.listener.onRecordingStarted,\n ),\n );\n }\n\n if (cs.listener?.onRecordingStopped) {\n listeners.push(\n CometChatCalls.addEventListener(\n 'onRecordingStopped',\n cs.listener.onRecordingStopped,\n ),\n );\n }\n\n if (cs.listener?.onUserMuted) {\n listeners.push(\n CometChatCalls.addEventListener(\n 'onParticipantAudioMuted',\n cs.listener.onUserMuted,\n ),\n );\n }\n\n if (cs.listener?.onCallEnded) {\n listeners.push(\n CometChatCalls.addEventListener(\n 'onSessionLeft',\n cs.listener.onCallEnded,\n ),\n );\n listeners.push(\n CometChatCalls.addEventListener('onParticipantListChanged', list => {\n if (list.length === 0) {\n cs.listener.onCallEnded();\n }\n }),\n );\n }\n\n if (cs.listener?.onCallEndButtonPressed) {\n listeners.push(\n CometChatCalls.addEventListener(\n 'onLeaveSessionButtonClicked',\n cs.listener.onCallEndButtonPressed,\n ),\n );\n }\n\n if (cs.listener?.onSessionTimeout) {\n listeners.push(\n CometChatCalls.addEventListener(\n 'onSessionTimedOut',\n cs.listener.onSessionTimeout,\n ),\n );\n }\n\n return () => {\n listeners.forEach(listener => {\n listener();\n });\n };\n }, [props.callSettings]);\n\n useEffect(() => {\n callVerifyTokenAPI({\n appId: (CometChatCalls as any).appSettings?.appId || '',\n region: (CometChatCalls as any).appSettings?.region || '',\n calltoken: props.callToken,\n baseURL: (CometChatCalls as any).getBaseURL?.(),\n })\n .then(response => {\n console.log('Token verification response:', response);\n if (response.data) {\n setInternalSettings(JSON.stringify(response));\n } else if (response.error.message) {\n setInfoMessage(response.error.message);\n } else {\n setInfoMessage('Token verification failed.');\n }\n })\n .catch(error => {\n console.error('Token verification error:', error);\n });\n }, [props.callToken]);\n\n if (infoMessage) {\n return <InfoView text={infoMessage} />;\n }\n\n if (!internalSettings) {\n return <ProcessingOverlay message=\"Authenticating...\" visible={true} />;\n }\n\n return (\n <CallUI\n callSettings={{\n ...props.callSettings,\n ...convertLegacyCallSettingsToV5Props(props?.callSettings ?? {}),\n internalSettings: internalSettings,\n }}\n />\n );\n}\n\nexport default App;\n\nexport const AppComponent = App;\n","export const constants = {\n DEFAULT_STORE: 'cometchat',\n MSG_VER_PRE: 'store-ver-pre',\n MSG_VER_POST: 'store-ver-post',\n};\n\nexport const ERROR_CODES = {\n API_ERROR: {\n code: 'API_ERROR',\n },\n};\n\nexport const REGION = {\n us: 'us',\n eu: 'eu',\n in: 'in',\n US: 'us',\n EU: 'eu',\n IN: 'in',\n} as const;\n\nexport const DEFAULT_VALUES = {\n ZERO: 0,\n MSGS_LIMIT: 30,\n MSGS_MAX_LIMIT: 100,\n USERS_LIMIT: 30,\n USERS_MAX_LIMIT: 100,\n GROUPS_LIMIT: 30,\n GROUPS_MAX_LIMIT: 100,\n CONVERSATION_MAX_LIMIT: 50,\n CALL_TIMEOUT: 45,\n DEFAULT_MSG_ID: 0,\n DEFAULT_MAX_TYPING_INDICATOR_LIMIT: 5,\n REGION_DEFAULT: 'eu',\n REGION_DEFAULT_EU: 'eu',\n REGION_DEFAULT_US: 'us',\n REGION_DEFAULT_IN: 'in',\n REGION_DEFAULT_PRIVATE: 'private',\n};\n\nexport enum GroupType {\n Public = 'public',\n Private = 'private',\n Protected = 'protected',\n Password = 'password',\n}\n\nexport const GROUP_TYPE = {\n PUBLIC: 'public',\n PRIVATE: 'private',\n PROTECTED: 'password',\n PASSWORD: 'password',\n};\n\nexport enum GroupMemberScope {\n Admin = 'admin',\n Moderator = 'moderator',\n Member = 'member',\n}\n\nexport const GROUP_MEMBER_SCOPE = {\n ADMIN: 'admin',\n MODERATOR: 'moderator',\n PARTICIPANT: 'participant',\n};\n\nexport const APPINFO = {\n platform: 'REACT_NATIVE',\n sdkVersion: 'v3.0.11',\n apiVersion: 'v3.0',\n sdkVersionWithUnderScore: '3_0_11',\n userAgent: 'cc_react_native_sdk',\n};\n\nexport const SDKHeader = {\n platform: 'react-native',\n sdkVersion: '3.0.11',\n sdk: '%s@%s',\n};\n\nexport const WS = {\n CONVERSATION: {\n TYPE: {\n CHAT: 'chat',\n GROUP_CHAT: 'groupchat',\n },\n },\n};\n\nexport const ANALYTICS = {\n analyticsHost: 'metrics-%s.cometchat.io',\n analyticsVersion: 'v1',\n};\n\nexport const LOCAL_STORE = {\n COMMON_STORE: 'common_store',\n MESSAGE_LISTENERS_LIST: 'message_listeners_list',\n USERS_STORE: 'users_store',\n MESSAGES_STORE: 'messages_store',\n KEYS_STORE: 'keys_store',\n STORE_STRING: '%s:%s',\n KEY_STRING: '%s/%s',\n KEY_USER: 'user',\n KEY_APP_SETTINGS: 'app_settings',\n KEY_APP_ID: 'appId',\n KEY_DEVICE_ID: 'deviceId',\n KEY_MESSAGE_LISTENER_LIST: 'all',\n};\n\nexport const ResponseConstants = {\n RESPONSE_KEYS: {\n KEY_DATA: 'data',\n KEY_META: 'meta',\n KEY_CURSOR: 'cursor',\n KEY_ACTION: 'action',\n KEY_MESSAGE: 'message',\n KEY_ERROR: 'error',\n KEY_ERROR_DETAILS: 'details',\n KEY_ERROR_CODE: 'code',\n KEY_ERROR_MESSAGE: 'message',\n KEY_AUTH_TOKEN: 'authToken',\n KEY_WS_CHANNEL: 'wsChannel',\n KEY_IDENTITY: 'identity',\n KEY_SERVICE: 'identity',\n KEY_ENTITIES: 'entities',\n KEY_ENTITITY: 'entity',\n KEY_ENTITYTYPE: 'entityType',\n KEY_ATTACHMENTS: 'attachments',\n CODE_REQUEST_OK: 200,\n CODE_BAD_REQUEST: 401,\n UNREAD_UNDELIVERED_KEYS: {\n ENTITY: 'entity',\n ENTITY_TYPE: 'entityType',\n ENTITY_Id: 'entityId',\n COUNT: 'count',\n },\n GROUP_MEMBERS_RESPONSE: {\n SUCCESS: 'success',\n ERROR: 'error',\n MESSAGE: 'message',\n },\n KEY_ENTITY_TYPE: {\n USER: 'user',\n GROUP: 'group',\n },\n },\n};\n\nexport const DELIVERY_RECEIPTS = {\n RECEIVER_ID: 'receiverId',\n RECEIVER_TYPE: 'type',\n RECIPIENT: 'recipient',\n MESSAGE_ID: 'messageId',\n RECEIVED: 'delivered',\n DELIVERED_AT: 'deliveredAt',\n ID: 'id',\n TIME: 'time',\n DELIVERED_TO_ME_AT: 'deliveredToMeAt',\n};\n\nexport const READ_RECEIPTS = {\n RECEIVER_ID: 'receiverId',\n RECEIVER_TYPE: 'type',\n RECIPIENT: 'recipient',\n MESSAGE_ID: 'messageId',\n READ: 'read',\n READ_AT: 'readAt',\n ID: 'id',\n TIME: 'time',\n READ_BY_ME_AT: 'readByMeAt',\n};\n\nexport const MessageConstatnts = {\n TYPE: {\n TEXT: 'text',\n MEDIA: 'media',\n IMAGE: 'image',\n VIDEO: 'video',\n AUDIO: 'audio',\n FILE: 'file',\n CUSTOM: 'custom',\n },\n CATEGORY: {\n MESSAGE: 'message',\n ACTION: 'action',\n CALL: 'call',\n CUSTOM: 'custom',\n },\n RECEIVER_TYPE: {\n USER: 'user',\n GROUP: 'group',\n },\n KEYS: {\n ATTATCHMENT: 'attatchment',\n ATTATCHMENTS: 'attachments',\n ACTION: 'action',\n TYPE: 'type',\n DATA: 'data',\n ID: 'id',\n MUID: 'muid',\n SENDER: 'sender',\n RECEIVER: 'receiver',\n RECEIVER_ID: 'receiverId',\n CATEGORY: 'category',\n RECEIVER_TYPE: 'receiverType',\n SENT_AT: 'sentAt',\n STATUS: 'status',\n TEXT: 'text',\n URL: 'url',\n METADATA: 'metadata',\n RECEIPTS: 'receipts',\n MY_RECEIPTS: 'myReceipt',\n CUSTOM_DATA: 'customData',\n CUSTOM_SUB_TYPE: 'subType',\n RESOURCE: 'resource',\n },\n KNOWN_MEDIA_TYPE: {\n IMAGE: [],\n VIDEO: [],\n AUDIO: [],\n FILE: [],\n },\n PAGINATION: {\n AFFIX: {\n APPEND: 'append',\n PREPEND: 'prepend',\n },\n CURSOR_FILEDS: {\n ID: 'id',\n SENT_AT: 'sentAt',\n },\n CURSOR_AFFIX_DEFAULT: 'prepend',\n CURSOR_FIELD_DEFAULT: 'sentAt',\n KEYS: {\n PER_PAGE: 'per_page',\n CURSOR_AFFIX: 'cursorAffix',\n AFFIX: 'affix',\n CURSOR_FIELD: 'cursorField',\n CURSOR_VALUE: 'cursorValue',\n UID: 'uid',\n SENT_AT: 'sentAt',\n ID: 'id',\n CURRENT_PAGE: 'page',\n UNREAD: 'unread',\n HIDE_MESSAGES_FROM_BLOCKED_USER: 'hideMessagesFromBlockedUsers',\n SEARCH_KEY: 'searchKey',\n ONLY_UPDATES: 'onlyUpdates',\n UPDATED_AT: 'updatedAt',\n CATEGORY: 'category',\n CATEGORIES: 'categories',\n TYPE: 'type',\n TYPES: 'types',\n HIDE_REPLIES: 'hideReplies',\n HIDE_DELETED_MESSAGES: 'hideDeleted',\n WITH_TAGS: 'withTags',\n TAGS: 'tags',\n },\n },\n};\n\nexport const ATTACHMENTS_CONSTANTS = {\n KEYS: {\n EXTENSION: 'extension',\n MIME_TYPE: 'mimeType',\n NAME: 'name',\n SIZE: 'size',\n URL: 'url',\n },\n};\n\nexport enum MessageCategory {\n ACTION = 'action',\n MESSAGE = 'message',\n CALL = 'call',\n CUSTOM = 'custom',\n}\n\nexport const TYPING_NOTIFICATION = {\n RECEIVER_ID: 'receiverId',\n RECEIVER_TYPE: 'receiverType',\n META: 'metadata',\n KEYS: {\n TYPING_NOTIFICATION: 'typingNotification',\n TIMESTAMP: 'timestamp',\n },\n ACTIONS: {\n STARTED: 'started',\n ENDED: 'ended',\n },\n};\n\nexport const ActionConstatnts = {\n ACTION_SUBJECTS: {\n ACTION_ON: 'on',\n ACTION_BY: 'by',\n ACTION_FOR: 'for',\n },\n ACTION_ENTITY_TYPE: {\n GROUP_USER: 'groupuser',\n USER: 'user',\n GROUP: 'group',\n MESSAGE: 'message',\n },\n ACTION_KEYS: {\n ACTION_CREATED: 'created',\n ACTION_UPDATED: 'updated',\n ACTION_DELETED: 'deleted',\n ENTITIES: 'entities',\n ENTITY: 'entity',\n ENTITY_TYPE: 'entityType',\n TYPE_MEMBER_JOINED: 'joined',\n TYPE_MEMBER_LEFT: 'left',\n TYPE_MEMBER_KICKED: 'kicked',\n TYPE_MEMBER_BANNED: 'banned',\n TYPE_MEMBER_UNBANNED: 'unbanned',\n TYPE_MEMBER_INVITED: 'invited',\n TYPE_MEMBER_ADDED: 'added',\n ACTION_SCOPE_CHANGED: 'scopeChanged',\n ACTION_TYPE_USER: 'user',\n ACTION_TYPE_GROUP: 'group',\n ACTION_TYPE_GROUP_MEMBER: 'groupMember',\n TYPE_MESSAGE_EDITED: 'edited',\n TYPE_MESSAGE_DELETED: 'deleted',\n ACTION_TYPE_CALL: 'call',\n EXTRAS: 'extras',\n SCOPE: 'scope',\n NEW: 'new',\n OLD: 'old',\n },\n ActionMessages: {\n ACTION_GROUP_JOINED_MESSAGE: '%s joined',\n ACTION_GROUP_LEFT_MESSAGE: '%s left',\n ACTION_MEMBER_KICKED_MESSAGE: '%s kicked %s',\n ACTION_MEMBER_BANNED_MESSAGE: '%s banned %s',\n ACTION_MEMBER_UNBANNED_MESSAGE: '%s unbanned %s',\n ACTION_MEMBER_INVITED_MESSAGE: '%s banned %s',\n ACTION_MESSAGE_EDITED_MESSAGE: ' Message Edited',\n ACTION_MESSAGE_DELETED_MESSAGE: 'Message Deleted',\n ACTION_MEMBER_SCOPE_CHANGED: '%s made %s %s',\n ACTION_MEMBER_ADDED_TO_GROUP: '%s added %s',\n },\n ACTION_TYPE: {\n TYPE_MEMBER_JOINED: 'joined',\n TYPE_MEMBER_LEFT: 'left',\n TYPE_MEMBER_KICKED: 'kicked',\n TYPE_MEMBER_BANNED: 'banned',\n TYPE_MEMBER_UNBANNED: 'unbanned',\n TYPE_MEMBER_INVITED: 'invited',\n TYPE_MEMBER_SCOPE_CHANGED: 'scopeChanged',\n TYPE_MESSAGE: 'message',\n TYPE_MESSAGE_EDITED: 'edited',\n TYPE_MESSAGE_DELETED: 'deleted',\n TYPE_MEMBER_ADDED: 'added',\n },\n ACTIONS: {\n MEMBER_ADDED: 'added',\n MEMBER_JOINED: 'joined',\n MEMBER_LEFT: 'left',\n MEMBER_KICKED: 'kicked',\n MEMBER_BANNED: 'banned',\n MEMBER_UNBANNED: 'unbanned',\n MEMBER_INVITED: 'invited',\n MEMBER_SCOPE_CHANGED: 'scopeChanged',\n MESSAGE_EDITED: 'edited',\n MESSSAGE_DELETED: 'deleted',\n TYPE_USER: 'user',\n TYPE_GROUP: 'group',\n TYPE_GROUP_MEMBER: 'groupMember',\n },\n};\n\nexport const BlockedUsersConstants = {\n REQUEST_KEYS: {\n DIRECTIONS: {\n BOTH: 'both',\n HAS_BLOCKED_ME: 'hasBlockedMe',\n BLOCKED_BY_ME: 'blockedByMe',\n },\n },\n};\n\nexport const CallConstants = {\n CALL_MODE: {\n DEFAULT: 'DEFAULT',\n SPOTLIGHT: 'SPOTLIGHT',\n },\n AUDIO_MODE: {\n SPEAKER: 'SPEAKER',\n EARPIECE: 'EARPIECE',\n BLUETOOTH: 'BLUETOOTH',\n HEADPHONES: 'HEADPHONES',\n },\n CALL_TYPE: {\n AUDIO: 'audio',\n VIDEO: 'video',\n },\n RECEIVER_TYPE_GROUP: 'group',\n RECEIVER_TYPE_USER: 'user',\n\n CALL_KEYS: {\n CALL_DATA: 'data',\n CALL_ID: 'id',\n CALL_SESSION_ID: 'sessionid',\n CALL_RECEIVER: 'receiver',\n CALL_SENDER: 'sender',\n CALL_INITIATOR: 'initiator',\n CALL_RECEIVER_TYPE: 'receiverType',\n CALL_STATUS: 'status',\n CALL_TYPE: 'type',\n CALL_INITIATED_AT: 'initiatedAt',\n CALL_JOINED_AT: 'joinedAt',\n CALL_LEFT_AT: 'leftAt',\n CALL_METADATA: 'metadata',\n CALL_ENTITIES: 'entities',\n CALL_ENTITY_TYPE: 'entityType',\n CALL_ENTITY: 'entity',\n CALL_ENTITY_USER: 'user',\n CALL_ENTITY_GROUP: 'group',\n },\n CALL_STATUS: {\n INITIATED: 'initiated',\n ONGOING: 'ongoing',\n UNANSWERED: 'unanswered',\n REJECTED: 'rejected',\n BUSY: 'busy',\n CANCELLED: 'cancelled',\n ENDED: 'ended',\n },\n ZOOM_BUTTON_DEFAULT_PARAMS: {\n position: 'bottom-right',\n visible: true,\n },\n FULL_SCREEN_BUTTON_DEFAULT_PARAMS: {\n position: 'bottom-right',\n visible: true,\n },\n USER_LIST_BUTTON_DEFAULT_PARAMS: {\n position: 'bottom-right',\n visible: true,\n },\n NAME_LABEL_DEFAULT_PARAMS: {\n position: 'bottom-left',\n visible: true,\n color: '#333333',\n },\n MAIN_VIDEO_CONTAINER_SETTINGS: {\n KEYS: {\n POSITION: 'position',\n VISIBILITY: 'visibility',\n COLOR: 'color',\n },\n },\n} as const;\n\nexport const GroupConstants = {\n KEYS: {\n NAME: 'name',\n GUID: 'guid',\n TYPE: 'type',\n PASSWORD: 'password',\n ICON: 'icon',\n DESCRIPTION: 'description',\n OWNER: 'owner',\n METADATA: 'metadata',\n CREATED_AT: 'createdAt',\n UPDATED_AT: 'updatedAt',\n HAS_JOINED: 'hasJoined',\n WS_CHANNEL: 'wsChannel',\n TAGS: 'tags',\n },\n};\n\nexport const GroupMemersConstans = {\n KEYS: {\n SCOPE: 'scope',\n UID: 'uid',\n GUID: 'guid',\n USER: 'user',\n NAME: 'name',\n },\n};\n\nexport const UserConstants = {\n UID: 'uid',\n NAME: 'name',\n AUTH_TOKEN: 'authToken',\n AVATAR: 'avatar',\n LAST_ACTIVE_AT: 'lastActiveAt',\n LINK: 'link',\n META_DATA: 'metadata',\n ROLE: 'role',\n STATUS: 'status',\n STATUS_MESSAGE: 'statusMessage',\n USER_NAME: 'user_name',\n TAGS: 'tags',\n SORT_BY: {\n NAME: 'name',\n STATUS: 'status',\n },\n SORT_ORDER: {\n ASCENDING: 'asc',\n DESCENDING: 'desc',\n },\n};\n\nexport const Errors = {\n ERROR_IO_EXCEPTION: 'ERROR_IO_EXCEPTION',\n ERROR_JSON_EXCEPTION: 'ERROR_JSON_EXCEPTION',\n ERROR_PASSWORD_MISSING: 'ERROR_PASSWORD_MISSING',\n ERROR_LIMIT_EXCEEDED: 'ERROR_LIMIT_EXCEEDED',\n ERROR_USER_NOT_LOGGED_IN: 'ERROR_USER_NOT_LOGGED_IN',\n ERROR_INVALID_GUID: 'ERROR_INVALID_GUID',\n\n ERROR_PASSWORD_MISSING_MESSAGE: 'Password is mandatory for a password group',\n ERROR_LIMIT_EXCEEDED_MESSAGE: 'Limit Exceeded Max limit of %s',\n ERROR_USER_NOT_LOGGED_IN_MESSAGE:\n 'Please log in to CometChat before calling this method',\n ERROR_INVALID_GUID_MESSAGE: 'Please provide a valid GUID',\n ERROR_DEFAULT_MESSAGE: 'Something went wrong',\n ERR_SETTINGS_HASH_OUTDATED: 'ERR_SETTINGS_HASH_OUTDATED',\n ERR_NO_AUTH: 'ERR_NO_AUTH',\n};\n\nexport const CALL_ERROR = {\n CALL_ALREADY_INITIATED: {\n code: 'CALL_ALREADY_INITIATED',\n name: 'CALL_ALREADY_INITIATED',\n message: 'There is already call in progress',\n details: {},\n },\n ERROR_IN_CALLING: {\n code: 'CALL_IN_PROGRESS',\n name: 'CALL_ALREADY_INITIATED',\n message: 'There is already call in progress',\n details: {},\n },\n CANNOT_ACCEPT_CALL: {\n code: 'OTHER_CALL_ONGOING',\n name: 'OTHER_CALL_ONGOING',\n message: 'There is already a call in progress',\n details: {},\n },\n NOT_INITIALIZED: {\n code: 'NOT_INITIALIZED',\n name: 'NOT_INITIALIZED',\n message:\n 'Please call the CometChat.init() method before calling any other methods related to CometChat.',\n details: {},\n },\n NOT_LOGGED_IN: {\n code: 'NOT_LOGGED_IN',\n name: 'NOT_LOGGED_IN',\n message: 'Please login before starting a call.',\n details: {},\n },\n SESSION_ID_REQUIRED: {\n code: 'SESSION_ID_REQUIRED',\n name: 'SESSION_ID_REQUIRED',\n message: 'Please make sure you are passing correct session id.',\n details: {},\n },\n JWT_NOT_FOUND: {\n code: 'JWT_NOT_FOUND',\n name: 'JWT_NOT_FOUND',\n message: 'There was some issue while fetching JWT from API.',\n details: {},\n },\n MODULE_NOT_INSTALLED: {\n code: 'ERROR_CALL_MODULE_NOT_FOUND',\n name: 'ERROR_CALL_MODULE_NOT_FOUND',\n message:\n 'CometChat Calling module not found. Please add the CometChat Calling dependency and try again.',\n details: {},\n },\n};\n\nexport const PARAMETER_ERROR = {\n PARAMETER_REQUIRED: {\n code: '%s_NOT_PROVIDED',\n name: '%s_NOT_PROVIDED',\n message: 'please provide the %s.',\n details: {},\n },\n};\n\nexport const GENERAL_ERROR = {\n GENERIC_EXCEPTION: {\n code: 'GENERIC_EXCEPTION',\n },\n INVALID_ARGUMENT_EXCEPTION: {\n code: 'INVALID_ARGUMENT_EXCEPTION',\n },\n INVALID_PROP_EXCEPTION: {\n code: 'INVALID_PROP_EXCEPTION',\n },\n API_ERROR: {\n code: 'API_ERROR',\n },\n ERROR_PRESENTER_MODE: {\n code: 'ERROR_PRESENTER_MODE',\n message:\n 'Presenter mode is disabled. To use presenter mode, please enable it from the CometChat Apps Dashboard',\n },\n UNKNOWN_API_ERROR: {\n code: 'UNKNOWN_API_ERROR',\n message:\n 'There is an unknown issue with the API request. Please check your internet connection and verify the api call.',\n },\n // MUST_BE_A_STRING:{\n // \tcode: \"INVALID_%s\",\n // \tname: \"INVALID_%s\",\n // \tmessage: \"%s should be a string.\",\n // \tdetails: {}\n // },\n // MUST_BE_A_NUMBER:{\n // \tcode: \"INVALID_%s\",\n // \tname: \"INVALID_%s\",\n // \tmessage: \"%s should be a number.\",\n // \tdetails: {},\n // },\n // MUST_BE_A_OBJECT:{\n // \tcode: \"INVALID_%s\",\n // \tname: \"INVALID_%s\",\n // \tmessage: \"%s should be a object.\",\n // \tdetails: {}\n // },\n // MUST_BE_AN_ARRAY:{\n // \tcode: \"INVALID_%s\",\n // \tname: \"INVALID_%s\",\n // \tmessage: \"%s should be an array.\",\n // \tdetails: {}\n // },\n // MUST_BE_A_BOOLEAN:{\n // \tcode: \"INVALID_%s\",\n // \tname: \"INVALID_%s\",\n // \tmessage: \"%s should be a boolean.\",\n // \tdetails: {}\n // },\n // INVALID:{\n // \tcode: \"INVALID_%s\",\n // \tname: \"INVALID_%s\",\n // \tmessage: \"Invalid %s. Please provide a valid %s.\",\n // \tdetails: {}\n // },\n // METHOD_COMPULSORY:{\n // \tcode: \"%s_IS_COMPULSORY\",\n // \tname: \"%s_IS_COMPULSORY\",\n // \tmessage: \"%s is required.\",\n // \tdetails: {}\n // },\n // EMPTY_STRING:{\n // \tcode: \"INVALID_%s\",\n // \tname: \"INVALID_%s\",\n // \tmessage: \"%s cannot be empty.\",\n // \tdetails: {}\n // },\n // MISSING_KEY:{\n // \tcode: \"MISSING_KEY\",\n // \tname: \"MISSING_KEY\",\n // \tmessage: \"The key %s is missing from the %s object.\",\n // \tdetails: {}\n // },\n} as const;\n\nexport const ReceiptErrors = {\n MISSING_PARAMETERS: {\n code: 'MISSING_PARAMETERS',\n name: 'MISSING_PARAMETERS',\n message: 'Expected 4 parameters received 3',\n details: {},\n },\n INVALID_PARAMETER: {\n code: 'INVALID_%s',\n name: 'INVALID_%s',\n message: '%s',\n details: {},\n },\n NO_WEBSOCKET_CONNECTION: {\n code: 'NO_WEBSOCKET_CONNECTION',\n name: 'NO_WEBSOCKET_CONNECTION',\n message:\n 'Connection to our Websockets server is broken. Please retry after some time.',\n details: {},\n },\n RECEIPTS_TEMPORARILY_BLOCKED: {\n code: 'RECEIPTS_TEMPORARILY_BLOCKED',\n name: 'RECEIPTS_TEMPORARILY_BLOCKED',\n message: 'Due to high load. Receipts have been blocked for your app.',\n details: {},\n },\n UNKNOWN_ERROR_OCCURRED: {\n code: 'UNKNOWN_ERROR_OCCURRED',\n name: 'UNKNOWN_ERROR_OCCURRED',\n message: 'Unknown error occurred while marking a message as read.',\n details: {},\n },\n};\n\nexport const APP_SETTINGS = {\n APP_SETTINGS: 'app_settings',\n KEYS: {\n CHAT_HOST: 'CHAT_HOST',\n CHAT_USE_SSL: 'CHAT_USE_SSL',\n GROUP_SERVICE: 'GROUP_SERVICE',\n CALL_SERVICE: 'CALL_SERVICE',\n CHAT_WS_PORT: 'CHAT_WS_PORT',\n CHAT_WSS_PORT: 'CHAT_WSS_PORT',\n CHAT_HTTP_BIND_PORT: 'CHAT_HTTP_BIND_PORT',\n CHAT_HTTPS_BIND_PORT: 'CHAT_HTTPS_BIND_PORT',\n ADMIN_API_HOST: 'ADMIN_API_HOST',\n CLIENT_API_HOST: 'CLIENT_API_HOST',\n WEBRTC_HOST: 'WEBRTC_HOST',\n WEBRTC_USE_SSL: 'WEBRTC_USE_SSL',\n WEBRTC_WS_PORT: 'WEBRTC_WS_PORT',\n WEBRTC_WSS_PORT: 'WEBRTC_WSS_PORT',\n WEBRTC_HTTP_BIND_PORT: 'WEBRTC_HTTP_BIND_PORT',\n WEBRTC_HTTPS_BIND_PORT: 'WEBRTC_HTTPS_BIND_PORT',\n EXTENSION_LIST: 'extensions',\n EXTENSION_KEYS: {\n ID: 'id',\n NAME: 'name',\n },\n JID_HOST_OVERRIDE: 'JID_HOST_OVERRIDE',\n CHAT_HOST_OVERRIDE: 'CHAT_HOST_OVERRIDE',\n CHAT_HOST_APP_SPECIFIC: 'CHAT_HOST_APP_SPECIFIC',\n MODE: 'MODE',\n CONNECTION_TYPE: 'connection_type',\n DEFAULT_MODE: 'DEFAULT',\n LIMITED_TRANSIENT: 'LIMITED_TRANSIENT',\n NO_TRANSIENT: 'NO_TRANSIENT',\n POLLING_ENABLED: 'POLLING_ENABLED',\n POLLING_INTERVAL: 'POLLING_INTERVAL',\n ANALYTICS_PING_DISABLED: 'ANALYTICS_PING_DISABLED',\n ANALYTICS_HOST: 'ANALYTICS_HOST',\n ANALYTICS_VERSION: 'ANALYTICS_VERSION',\n ANALYTICS_USE_SSL: 'ANALYTICS_USE_SSL',\n SETTINGS_HASH: 'settingsHash',\n SETTINGS_HASH_RECEIVED_AT: 'settingsHashReceivedAt',\n DENY_FALLBACK_TO_POLLING: 'DENY_FALLBACK_TO_POLLING',\n APP_VERSION: 'APP_VERSION',\n MAIN_DOMAIN: 'MAIN_DOMAIN',\n CHAT_API_VERSION: 'CHAT_API_VERSION',\n WS_API_VERSION: 'WS_API_VERSION',\n REGION: 'REGION',\n EXTENSION_DOMAIN: 'EXTENSION_DOMAIN',\n WEBRTC_API_SUBDOMAIN: 'WEBRTC_API_SUBDOMAIN',\n },\n};\n\nexport const COMMON_UTILITY_CONSTANTS = {\n TYPE_CONSTANTS: {\n BOOLEAN: 'boolean',\n STRING: 'string',\n OBJECT: 'object',\n NUMBER: 'number',\n },\n};\n\nexport const CONNECTION_STATUS = {\n CONNECTED: 'connected',\n CONNECTING: 'connecting',\n DISCONNECTED: 'disconnected',\n FEATURE_THROTTLED: 'featureThrottled',\n};\n\nexport const API_ERROR_CODES = {\n AUTH_ERR_AUTH_TOKEN_NOT_FOUND: 'AUTH_ERR_AUTH_TOKEN_NOT_FOUND',\n};\n\nexport const PROSODY_API = {\n DOMAIN_PREFIX: 'xmpp',\n PATH: {\n ROOM: 'room',\n ROOM_SIZE: 'room-size',\n SESSIONS: 'sessions',\n },\n RESPONSE: {\n PARTICIPANTS: 'participants',\n },\n QUERY_PARAMETERS: {\n DOMAIN: 'domain',\n ROOM: 'room',\n },\n};\n\nexport const ProsodyApiErrors = {\n INVALID_SESSIONID: {\n code: 'ERROR_INVALID_SESSIONID',\n name: 'ERROR_INVALID_SESSIONID',\n message:\n 'The provided sessionId cannot be null or empty. Please provide a valid sessionId.',\n details: '',\n },\n INVALID_TYPE: {\n code: 'ERROR_INVALID_TYPE',\n name: 'ERROR_INVALID_TYPE',\n message:\n 'The provided type cannot be null or empty. Please provide a valid type.',\n details: '',\n },\n};\n\nexport const JWT_API = {\n KEYS: {\n PASSTHROUGH: 'passthrough',\n EXPAND: 'expand',\n },\n};\n\nexport const ONLINE_MEMBER_COUNT_API = {\n ENDPOINTS: {\n GET_ONLINE_MEMBER_COUNT: 'api/%s/online-members',\n },\n RESPONSE: {\n ONLINE_USERS_COUNT: 'onlineUsersCount',\n GROUPS: 'groups',\n },\n ERRORS: {\n INVALID_GROUPLIST: {\n code: 'ERROR_INVALID_GROUPLIST',\n name: 'ERROR_INVALID_GROUPLIST',\n message: 'Grouplist cannot be null or empty.',\n details: '',\n },\n },\n};\n","import { GENERAL_ERROR } from './Constants';\nimport { CometChatCallsException } from './models/CometChatCallsException';\n\nexport function isFalsy($false) {\n if ($false != null) {\n if (typeof $false == 'string') $false = $false.trim();\n if (typeof $false == 'object' && Object.keys($false).length === 0)\n $false = undefined;\n }\n let falsyvalues: any = [\n '',\n 0,\n '0',\n false,\n null,\n 'null',\n undefined,\n 'undefined',\n ];\n return falsyvalues.includes($false);\n}\n\nfunction isJSON(obj) {\n try {\n JSON.stringify(obj);\n return true;\n } catch (error) {\n return false;\n }\n}\n\nexport class Logger {\n static log(TAG: string, message) {\n console.log(TAG, message);\n }\n static error(TAG: string, message) {\n console.log(TAG, message);\n }\n static info(TAG: string, message) {\n console.info(TAG, message);\n }\n}\n\nexport function throwGenericException(err: any) {\n if (typeof err?.toString === 'function' || typeof err === 'string') {\n console.error(err.toString());\n // throw new CometChatCallsException({\n // code: GENERAL_ERROR.GENERIC_EXCEPTION.code,\n // message: err.toString(),\n // details: err,\n // });\n } else if (isJSON(err)) {\n console.error(err?.message ? err?.message : JSON.stringify(err));\n // throw new CometChatCallsException({\n // code: GENERAL_ERROR.GENERIC_EXCEPTION.code,\n // message: err?.message ? err?.message : JSON.stringify(err),\n // details: err,\n // });\n } else {\n console.error(err);\n // throw new CometChatCallsException({\n // code: GENERAL_ERROR.GENERIC_EXCEPTION.code,\n // message: 'Unknown error',\n // details: err,\n // });\n }\n}\n","/**\n *\n * @module Listener\n */\nimport { isFalsy } from '../Helper';\nimport { ICallEventsData } from '../types/callEvents';\nimport { CometChatCallsException } from './CometChatCallsException';\n\n// onUserJoined\n// onUserLeft\n// onUserListUpdated\n// onAudioModesUpdated\n// onCallEnded\n// onError\n// onRecordingStarted\n// onRecordingStopped\n// onUserMuted\n// onCallSwitchedToVideo\n\ninterface IOngoingCallListener {\n onUserJoined: (user: Partial<ICallEventsData['onUserJoined']>) => void;\n onUserLeft: (user: Partial<ICallEventsData['onUserLeft']>) => void;\n onUserListUpdated: (\n userList: Partial<ICallEventsData['onUserListUpdated']>,\n ) => void;\n onMediaDeviceListUpdated: (\n devices: Partial<ICallEventsData['onMediaDeviceListUpdated']>,\n ) => void;\n onRecordingStarted: (\n data: Partial<ICallEventsData['onRecordingStarted']>,\n ) => void;\n onRecordingStopped: (\n data: Partial<ICallEventsData['onRecordingStopped']>,\n ) => void;\n onUserMuted: (test: Partial<ICallEventsData['onUserMuted']>) => void;\n onCallSwitchedToVideo: (\n data: Partial<ICallEventsData['onCallSwitchedToVideo']>,\n ) => void;\n onCallEnded: () => void;\n onSessionTimeout: () => void;\n onCallEndButtonPressed: () => void;\n onAudioModesUpdated: (any) => void;\n onError: (error: CometChatCallsException) => void;\n}\n\nexport class OngoingCallListener {\n /**\n * This event is triggered when a user joins the call.\n */\n onUserJoined?: IOngoingCallListener['onUserJoined'];\n\n /**\n * This event is triggered when a user leaves the call.\n */\n onUserLeft?: IOngoingCallListener['onUserLeft'];\n\n /**\n * This event is triggered when the participant list of the call changes.\n */\n onUserListUpdated?: IOngoingCallListener['onUserListUpdated'];\n\n /**\n * This event is triggered when an audio mode is updated.\n */\n onAudioModesUpdated?: IOngoingCallListener['onAudioModesUpdated'];\n\n /**\n * This event is triggered when the call is ended.\n */\n onCallEnded?: IOngoingCallListener['onCallEnded'];\n\n /**\n * This event is triggered when the call is ended due to session timeout.\n */\n onSessionTimeout?: IOngoingCallListener['onSessionTimeout'];\n\n /**\n * This event is triggered when end call button is pressed.\n */\n onCallEndButtonPressed?: IOngoingCallListener['onCallEndButtonPressed'];\n\n /**\n * This event is triggered when an error occurs.\n */\n onError?: IOngoingCallListener['onError'];\n\n /**\n * This event is triggered when someone starts recording the call.\n */\n onRecordingStarted?: IOngoingCallListener['onRecordingStarted'];\n\n /**\n * This event is triggered when someone stops recording the call.\n */\n onRecordingStopped?: IOngoingCallListener['onRecordingStopped'];\n\n /**\n * This event is triggered when a user is muted.\n */\n onUserMuted?: IOngoingCallListener['onUserMuted'];\n\n /**\n * This event is triggered when an audio call is switched to a video call.\n */\n onCallSwitchedToVideo?: IOngoingCallListener['onCallSwitchedToVideo'];\n\n constructor(eventObj: Partial<IOngoingCallListener>) {\n if (!isFalsy(eventObj['onUserJoined']))\n this.onUserJoined = eventObj['onUserJoined'];\n if (!isFalsy(eventObj['onUserLeft']))\n this.onUserLeft = eventObj['onUserLeft'];\n if (!isFalsy(eventObj['onUserListUpdated']))\n this.onUserListUpdated = eventObj['onUserListUpdated'];\n if (!isFalsy(eventObj['onAudioModesUpdated']))\n this.onAudioModesUpdated = eventObj['onAudioModesUpdated'];\n if (!isFalsy(eventObj['onCallEnded']))\n this.onCallEnded = eventObj['onCallEnded'];\n if (!isFalsy(eventObj['onSessionTimeout']))\n this.onSessionTimeout = eventObj['onSessionTimeout'];\n if (!isFalsy(eventObj['onCallEndButtonPressed']))\n this.onCallEndButtonPressed = eventObj['onCallEndButtonPressed'];\n if (!isFalsy(eventObj['onError'])) this.onError = eventObj['onError'];\n if (!isFalsy(eventObj['onRecordingStarted']))\n this.onRecordingStarted = eventObj['onRecordingStarted'];\n if (!isFalsy(eventObj['onRecordingStopped']))\n this.onRecordingStopped = eventObj['onRecordingStopped'];\n if (!isFalsy(eventObj['onUserMuted']))\n this.onUserMuted = eventObj['onUserMuted'];\n if (!isFalsy(eventObj['onCallSwitchedToVideo']))\n this.onCallSwitchedToVideo = eventObj['onCallSwitchedToVideo'];\n }\n}\n","import { OngoingCallListener } from './Listner';\ninterface IMultiOngoingCallListener extends OngoingCallListener {\n _name: string;\n}\nexport class ListenerHandlers {\n public static callHandlers?: IMultiOngoingCallListener[] = [];\n\n static addCallEventListener(name: string, callListener: OngoingCallListener) {\n try {\n ListenerHandlers.callHandlers = ListenerHandlers?.callHandlers.filter(\n listener => {\n return listener._name != name;\n },\n );\n ListenerHandlers.callHandlers = [\n ...ListenerHandlers.callHandlers,\n { _name: name, ...new OngoingCallListener(callListener) },\n ];\n } catch (err) {\n console.error('ListenerHandlers: addCallEventListener', err);\n }\n }\n\n static removeCallEventListener(handler: string) {\n try {\n ListenerHandlers.callHandlers = ListenerHandlers?.callHandlers.filter(\n listener => {\n return listener._name !== handler;\n },\n );\n } catch (err) {\n console.error('ListenerHandlers: removeCallEventListener', err);\n }\n }\n}\n","import { ErrorModel } from './ErrorModel';\n\nexport class CometChatCallsException {\n code: ErrorModel['code'];\n message?: ErrorModel['message'];\n details?: ErrorModel['details'];\n constructor(errorModel: ErrorModel) {\n if ('code' in errorModel) this.code = errorModel.code;\n if ('message' in errorModel) this.message = errorModel.message;\n if ('details' in errorModel) this.details = errorModel.details;\n }\n}\n","import { REGION } from '../Constants';\nimport { Host, Region } from '../types/common';\nimport { CometChatCallsException } from './CometChatCallsException';\n\nexport class CallAppSettings {\n private appId: string;\n private region: Region;\n\n // host is an optional parameter, it will be used for on-premises support.\n private host?: Host;\n\n public constructor(builder?: CallAppSettingsBuilder) {\n this.appId = builder.appId;\n this.region = builder.region;\n this.host = builder.host;\n }\n\n public setAppId(appId: string): this {\n this.appId = appId;\n return this;\n }\n\n public setRegion(region: Region): this {\n this.region = region;\n return this;\n }\n\n public setHost(host: Host): this {\n this.host = host;\n return this;\n }\n\n public getAppId() {\n return this.appId;\n }\n\n public getRegion() {\n return this.region;\n }\n\n public getHost() {\n return this.host;\n }\n}\n\nexport class CallAppSettingsBuilder {\n public appId: string;\n public region: Region;\n\n // host is an optional parameter, it will be used for on-premises support.\n public host?: Host;\n\n /**\n * Method to set appId of the app.\n * @param {string} appId appId of the app\n * @returns\n */\n public setAppId(appId: string): this {\n this.appId = appId;\n return this;\n }\n\n /**\n * Method to set region of the app.\n * @param {Region} region region of the app.\n * @returns {void}\n */\n public setRegion(region: Region): this {\n this.region = region;\n return this;\n }\n\n /**\n * Method to set host/domain of the app.\n * @param {string} host host/domain of the app.\n * @returns {void}\n */\n public setHost(host: Host): this {\n this.host = host;\n return this;\n }\n\n /**\n * This method will return an object of the CallsAppSettings class.\n * @returns {CallAppSettings} Returns the CallsAppSettings instance\n */\n public build(): CallAppSettings {\n return new CallAppSettings(this);\n }\n}\n\nexport function validateCallAppSettings(\n appSettings: CallAppSettings,\n): Promise<true> {\n return new Promise((resolve, reject) => {\n const exceptionToThrow = new CometChatCallsException({\n code: 'INVALID_CALL_APP_SETTINGS',\n });\n if (!(appSettings instanceof CallAppSettings)) {\n exceptionToThrow.message =\n 'appSettings must be an instance of CallAppSettings class';\n reject(exceptionToThrow);\n return;\n }\n const appId = appSettings.getAppId();\n const region = appSettings.getRegion();\n const host = appSettings.getHost();\n if (typeof appId !== 'string' || appId.length === 0) {\n exceptionToThrow.message =\n 'Invalid app id, please check your appSettings';\n reject(exceptionToThrow);\n return;\n }\n if (typeof region !== 'string' || !REGION[region]) {\n exceptionToThrow.message =\n 'Invalid region, please check your appSettings';\n reject(exceptionToThrow);\n return;\n }\n if (host !== null && host !== undefined && typeof host !== 'string') {\n exceptionToThrow.message = 'Invalid host, please check your appSettings';\n reject(exceptionToThrow);\n return;\n }\n resolve(true);\n });\n}\n","export const apiEndpoints = {\n CALL_TOKENS: 'call_tokens',\n CALL_LIST: 'calls',\n};\n\nexport const APP_ID_SPACE = '__APP_ID__';\nexport const REGION_SPACE = '__REGION__';\n\nexport const BASE_URL = `https://${APP_ID_SPACE}.call-${REGION_SPACE}.cometchat.io/v3.0/`;\n","import type { Region, Host } from '../types/common';\n\ninterface StringMap {\n [key: string]: string;\n}\n\ninterface IGETReqObj {\n url: string;\n headers?: StringMap;\n}\n\ninterface IPOSTReqObj extends IGETReqObj {\n data?: Record<string, unknown>;\n}\n\nexport interface IGenerateTokenAPIResult {\n error?: null | Record<string, unknown>;\n data?: null | {\n data: {\n token: string;\n };\n error: {\n message: string;\n devMessage: string;\n source: 'chat-api' | Omit<string, 'chat-api'>;\n code: 'AUTH_ERR_AUTH_TOKEN_NOT_FOUND' | string;\n };\n };\n}\n\nexport interface IVerifyTokenAPIResult {\n error?: null | Record<string, unknown>;\n data?: null | {\n data?: {\n callToken: string;\n settings: {\n PRESENTER_MODE_ENABLED: boolean;\n WEBRTC_HOST: Host;\n ANALYTICS_HOST: string;\n ANALYTICS_VERSION: string;\n };\n payload: {\n data: {\n appId: string;\n region: Region;\n authToken: string;\n user: {\n uid: string;\n name: string;\n avatar: string;\n };\n sessionId: string;\n passthrough: any;\n };\n room: string;\n };\n };\n error?: {\n message: string;\n devMessage: string;\n source: 'chat-api' | Omit<string, 'chat-api'>;\n // TODO: Get error codes from sachin\n code: 'AUTH_ERR_AUTH_TOKEN_NOT_FOUND' | string;\n };\n };\n}\n\nexport const postAPI = (\n postReqObj: IPOSTReqObj,\n): Promise<IGenerateTokenAPIResult> => {\n return new Promise(resolve => {\n const apiHeaders = new Headers();\n apiHeaders.append('content-Type', 'application/json');\n apiHeaders.append('Accept', 'application/json');\n if (typeof postReqObj.headers === 'object') {\n for (const key in postReqObj.headers) {\n apiHeaders.append(key, postReqObj.headers[key]);\n }\n }\n\n const requestOptions = {\n method: 'POST',\n headers: apiHeaders,\n body: JSON.stringify(postReqObj.data),\n };\n\n fetch(postReqObj.url, requestOptions)\n .then(response => response.json())\n .then(res => {\n resolve({\n error: null,\n data: res,\n });\n })\n .catch(error => {\n console.log(error);\n resolve({\n error: error,\n data: null,\n });\n });\n });\n};\n\nexport const getAPI = (\n getReqObj: IGETReqObj,\n): Promise<IVerifyTokenAPIResult> => {\n return new Promise(resolve => {\n const apiHeaders = new Headers();\n apiHeaders.append('Accept', 'application/json');\n if (typeof getReqObj.headers === 'object') {\n for (const key in getReqObj.headers) {\n apiHeaders.append(key, getReqObj.headers[key]);\n }\n }\n\n const requestOptions = {\n method: 'GET',\n headers: apiHeaders,\n };\n\n fetch(getReqObj.url, requestOptions)\n .then(response => response.json())\n .then(res => {\n resolve({\n error: null,\n data: res,\n });\n })\n .catch(error => {\n console.log(error);\n resolve({\n error: error,\n data: null,\n });\n });\n });\n};\n\n/**\n * Encodes the given data object into a query string.\n * @param data - The data object to be encoded.\n * @returns The encoded query string.\n */\nexport function encodeQueryData(data) {\n const ret = [];\n for (let d in data)\n ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));\n return ret.join('&');\n}\n","/**\n * APIHandler class for handling API requests related to CometChat Calls.\n */\nimport { CallAppSettings, CallLogFilterParams } from '../models';\nimport {\n apiEndpoints,\n APP_ID_SPACE,\n BASE_URL,\n REGION_SPACE,\n} from './endpoints';\nimport type { IGenerateTokenAPIResult, IVerifyTokenAPIResult } from './helper';\nimport { encodeQueryData, getAPI, postAPI } from './helper';\n\nexport class APIHandler {\n private static appSettings: CallAppSettings;\n\n /**\n * Sets the app settings for the APIHandler class.\n * @param appSettings - The CallAppSettings object containing the app settings.\n */\n public static setAppSettings(appSettings: CallAppSettings) {\n this.appSettings = appSettings;\n }\n\n /**\n * Generates a call token for the given session ID and app settings.\n * @param authToken - The authentication token.\n * @param sessionID - The session ID for which the token is to be generated.\n * @param appSettings - The CallAppSettings object containing the app settings.\n * @returns A Promise that resolves to an IGenerateTokenAPIResult object.\n */\n public static async generateToken(\n authToken: string,\n sessionID: string,\n appSettings: CallAppSettings,\n ): Promise<IGenerateTokenAPIResult> {\n let url = BASE_URL.replace(APP_ID_SPACE, appSettings.getAppId()).replace(\n REGION_SPACE,\n appSettings.getRegion() as string,\n );\n\n if (appSettings.getHost()) {\n url = appSettings.getHost() as string;\n }\n\n return postAPI({\n url: `${url}${apiEndpoints.CALL_TOKENS}`,\n headers: {\n authToken,\n },\n data: {\n sessionId: sessionID,\n },\n });\n }\n\n /**\n * Verifies the given call token for the given app settings.\n * @param callToken - The call token to be verified.\n * @param appSettings - The CallAppSettings object containing the app settings.\n * @returns A Promise that resolves to an IVerifyTokenAPIResult object.\n */\n public static async verifyToken(\n callToken: string,\n appSettings: CallAppSettings,\n ): Promise<IVerifyTokenAPIResult> {\n let url = BASE_URL.replace(APP_ID_SPACE, appSettings.getAppId()).replace(\n REGION_SPACE,\n appSettings.getRegion() as string,\n );\n\n if (appSettings.getHost()) {\n url = appSettings.getHost() as string;\n }\n\n return getAPI({\n url: `${url}${apiEndpoints.CALL_TOKENS}`,\n headers: {\n callToken,\n },\n });\n }\n\n /**\n * Gets the call log list for the given filter parameters and authentication token.\n * @param params - The CallLogFilterParams object containing the filter parameters.\n * @param authToken - The authentication token.\n * @returns A Promise that resolves to an array of call log objects.\n */\n public static async getCallLogList(\n params: CallLogFilterParams,\n authToken: string,\n ): Promise<any> {\n let url = BASE_URL.replace(\n APP_ID_SPACE,\n this.appSettings.getAppId(),\n ).replace(REGION_SPACE, this.appSettings.getRegion() as string);\n\n if (this.appSettings.getHost()) {\n url = this.appSettings.getHost() as string;\n }\n\n const querystring = encodeQueryData(params);\n const finalEndpoint = `${url}${apiEndpoints.CALL_LIST}?${querystring}`;\n\n return getAPI({\n url: finalEndpoint,\n headers: {\n authToken,\n },\n });\n }\n\n /**\n * Gets the call details for the given session ID and authentication token.\n * @param sessionID - The session ID for which the call details are to be fetched.\n * @param authToken - The authentication token.\n * @returns A Promise that resolves to a call details object.\n */\n public static async getCallDetails(\n sessionID: string,\n authToken: string,\n ): Promise<any> {\n let url = BASE_URL.replace(\n APP_ID_SPACE,\n this.appSettings.getAppId(),\n ).replace(REGION_SPACE, this.appSettings.getRegion() as string);\n\n if (this.appSettings.getHost()) {\n url = this.appSettings.getHost() as string;\n }\n\n return getAPI({\n url: `${url}${apiEndpoints.CALL_LIST}/${sessionID}`,\n headers: {\n authToken,\n },\n });\n }\n}\n","export const SERVER_ERRORS = {\n AUTH_ERR: {\n code: 'AUTH_ERR_AUTH_TOKEN_NOT_FOUND',\n message:\n 'The auth token %s% does not exist. Please make sure you are logged in and have a valid auth token or try login again.',\n },\n};\nexport const ERRORS = {\n PARAMETER_MISSING: {\n code: 'MISSING_PARAMETERS',\n name: 'Invalid or no parameter passed to the method.',\n },\n};\n\nexport const INIT_ERROR = {\n NO_APP_ID: {\n code: ERRORS.PARAMETER_MISSING.code,\n name: ERRORS.PARAMETER_MISSING.name,\n message: 'AppID cannot be empty. Please specify a valid appID.',\n details: {},\n },\n};\n\nexport const GROUP_CREATION_ERRORS = {\n EMPTY_PASSWORD: {\n code: 'ERR_EMPTY_GROUP_PASS',\n details: undefined,\n message: 'Password is mandatory to join a group.',\n name: undefined,\n },\n};\n\nexport const USERS_REQUEST_ERRORS = {\n EMPTY_USERS_LIST: {\n code: 'EMPTY_USERS_LIST',\n name: 'EMPTY_USERS_LIST',\n message: 'The users list needs to have atleast one UID.',\n details: {},\n },\n};\nexport const MESSAGES_REQUEST_ERRORS = {\n REQUEST_IN_PROGRESS_ERROR: {\n code: 'REQUEST_IN_PROGRESS',\n name: 'REQUEST_IN_PROGRESS',\n message: 'Request in progress.',\n details: {},\n },\n NOT_ENOUGH_PARAMS: {\n code: 'NOT_ENOUGH_PARAMETERS',\n name: 'NOT_ENOUGH_PARAMETERS',\n message:\n \"`Timestamp`, `MessageId` or `updatedAfter` is required to use the 'fetchNext()' method.\",\n details: {},\n },\n};\nexport const MESSAGE_ERRORS = {\n INVALID_CUSTOM_DATA: {\n code: '-1',\n name: '%s_CUSTOM_DATA',\n message: '',\n details: {},\n },\n};\nexport const LOGIN_ERROR = {\n NOT_INITIALIZED: {\n code: '-1',\n name: 'COMETCHAT_INITIALIZATION_NOT_DONE',\n message: 'please initialize the cometchat before using login method.',\n details: {},\n },\n UNAUTHORISED: {\n code: 401,\n name: 'USER_NOT_AUTHORISED',\n message:\n 'The `authToken` of the user is not authorised. Please verify again.',\n details: {},\n },\n WS_CONNECTION_FAIL: {\n code: -1,\n name: 'WS_CONNECTION_FAIL',\n message: 'WS Connection failed. %s',\n details: {},\n },\n WS_CONNECTION_FAIL_PORT_ERROR: {\n code: -1,\n name: 'WS_CONNECTION_FAIL',\n message: 'WS Connection failed. Trying to connect with port: %s',\n details: {},\n },\n WS_CONNECTION_FALLBACK_FAIL_PORT_ERROR: {\n code: -1,\n name: 'WS_CONNECTION_FALLBACK_FAIL',\n message: 'WS Connection fallback failed. Trying to connect with port: %s',\n details: {},\n },\n WS_AUTH_FAIL: {\n code: -1,\n name: 'WS_AUTH_FAIL',\n message: 'WS username/password not correct.',\n details: {},\n },\n NO_INTERNET: {\n code: -1,\n name: 'NO_INTERNET_CONNECTION',\n message: 'You do not have internet connection.',\n details: {},\n },\n REQUEST_IN_PROGRESS: {\n code: -1,\n name: 'LOGIN_IN_PROGRESS',\n message: 'Please wait until the previous login request ends.',\n details: {},\n },\n};\nexport const TYPINGNOTIFICATION_CONSTANTS = {\n TOO_MANY_REQUEST: {\n code: 'TOO_MANY_REQUEST',\n name: 'TOO MANY REQUEST',\n message:\n 'too many request, wait for `%s` seconds before sending next request.',\n details: {},\n },\n};\n\nexport const FETCH_ERROR = {\n ERROR_IN_API_CALL: {\n code: 'FAILED_TO_FETCH',\n name: 'FAILED_TO_FETCH',\n message:\n 'There is an unknown issue with the API request. Please check your internet connection and verify the api call.',\n details: {},\n },\n};\n","export class CallGroup {\n protected guid: string;\n protected name: string;\n protected icon: string;\n\n constructor(object: any) {\n Object.assign(this, object);\n }\n\n getGuid(): string {\n return this.guid;\n }\n\n setGuid(guid: string): void {\n this.guid = guid;\n }\n\n getName(): string {\n return this.name;\n }\n\n setName(name: string): void {\n this.name = name;\n }\n\n getIcon(): string {\n return this.icon;\n }\n\n setIcon(icon: string): void {\n this.icon = icon;\n }\n\n toString(): string {\n return `CallGroup{ guid='${this.guid}', name='${this.name}', icon='${this.icon}' }`;\n }\n\n static getGroupFromJson(object: any): CallGroup {\n let callGroup = new CallGroup(object);\n return callGroup;\n }\n}\n","export class CallUser {\n protected uid: string;\n protected name: string;\n protected avatar: string;\n\n constructor(object: any) {\n Object.assign(this, object);\n }\n\n getUid(): string {\n return this.uid;\n }\n\n setUid(uid: string): void {\n this.uid = uid;\n }\n\n getName(): string {\n return this.name;\n }\n\n setName(name: string): void {\n this.name = name;\n }\n\n getAvatar(): string {\n return this.avatar;\n }\n\n setAvatar(avatar: string): void {\n this.avatar = avatar;\n }\n\n toString(): string {\n return `CallUser{ uid='${this.uid}', name='${this.name}', avatar='${this.avatar}' }`;\n }\n static getUserFromJson(object: any): CallUser {\n let callUser = new CallUser(object);\n return callUser;\n }\n}\n","/**\n * Represents a participant in a call.\n */\nexport class Participant {\n /**\n * The unique identifier of the participant.\n */\n private uid: string;\n /**\n * The name of the participant.\n */\n private name: string;\n /**\n * The avatar of the participant.\n */\n private avatar: string;\n /**\n * The total audio minutes of the participant.\n */\n private totalAudioMinutes: number;\n /**\n * The total video minutes of the participant.\n */\n private totalVideoMinutes: number;\n /**\n * The total duration in minutes of the participant.\n */\n private totalDurationInMinutes: number;\n /**\n * The device ID of the participant.\n */\n private deviceID: string;\n /**\n * Whether the participant has joined the call or not.\n */\n private hasJoined: boolean;\n /**\n * The timestamp when the participant joined the call.\n */\n private joinedAt: number;\n /**\n * The timestamp when the participant left the call.\n */\n private leftAt: number;\n /**\n * The media ID of the participant.\n */\n private mid: string;\n /**\n * The state of the participant.\n */\n private state: string;\n\n /**\n * Creates a new instance of Participant.\n * @param object - The object containing the participant data.\n */\n constructor(object: any) {\n Object.assign(this, object);\n }\n\n /**\n * Gets the unique identifier of the participant.\n * @returns The unique identifier of the participant.\n */\n getUid(): string {\n return this.uid;\n }\n\n /**\n * Sets the unique identifier of the participant.\n * @param value - The unique identifier of the participant.\n */\n setUid(value: string) {\n this.uid = value;\n }\n\n /**\n * Gets the name of the participant.\n * @returns The name of the participant.\n */\n getName(): string {\n return this.name;\n }\n\n /**\n * Sets the name of the participant.\n * @param value - The name of the participant.\n */\n setName(value: string) {\n this.name = value;\n }\n\n /**\n * Gets the avatar of the participant.\n * @returns The avatar of the participant.\n */\n getAvatar(): string {\n return this.avatar;\n }\n\n /**\n * Sets the avatar of the participant.\n * @param value - The avatar of the participant.\n */\n setAvatar(value: string) {\n this.avatar = value;\n }\n\n /**\n * Gets the total audio minutes of the participant.\n * @returns The total audio minutes of the participant.\n */\n getTotalAudioMinutes(): number {\n return this.totalAudioMinutes;\n }\n\n /**\n * Sets the total audio minutes of the participant.\n * @param value - The total audio minutes of the participant.\n */\n setTotalAudioMinutes(value: number) {\n this.totalAudioMinutes = value;\n }\n\n /**\n * Gets the total video minutes of the participant.\n * @returns The total video minutes of the participant.\n */\n getTotalVideoMinutes(): number {\n return this.totalVideoMinutes;\n }\n\n /**\n * Sets the total video minutes of the participant.\n * @param value - The total video minutes of the participant.\n */\n setTotalVideoMinutes(value: number) {\n this.totalVideoMinutes = value;\n }\n\n /**\n * Gets the total duration in minutes of the participant.\n * @returns The total duration in minutes of the participant.\n */\n getTotalDurationInMinutes(): number {\n return this.totalDurationInMinutes;\n }\n\n /**\n * Sets the total duration in minutes of the participant.\n * @param value - The total duration in minutes of the participant.\n */\n setTotalDurationInMinutes(value: number) {\n this.totalDurationInMinutes = value;\n }\n\n /**\n * Gets the device ID of the participant.\n * @returns The device ID of the participant.\n */\n getDeviceID(): string {\n return this.deviceID;\n }\n\n /**\n * Sets the device ID of the participant.\n * @param value - The device ID of the participant.\n */\n setDeviceID(value: string) {\n this.deviceID = value;\n }\n\n /**\n * Gets whether the participant has joined the call or not.\n * @returns Whether the participant has joined the call or not.\n */\n getHasJoined(): boolean {\n return this.hasJoined;\n }\n\n /**\n * Sets whether the participant has joined the call or not.\n * @param value - Whether the participant has joined the call or not.\n */\n setHasJoined(value: boolean) {\n this.hasJoined = value;\n }\n\n /**\n * Gets the timestamp when the participant joined the call.\n * @returns The timestamp when the participant joined the call.\n */\n getJoinedAt(): number {\n return this.joinedAt;\n }\n\n /**\n * Sets the timestamp when the participant joined the call.\n * @param value - The timestamp when the participant joined the call.\n */\n setJoinedAt(value: number) {\n this.joinedAt = value;\n }\n\n /**\n * Gets the timestamp when the participant left the call.\n * @returns The timestamp when the participant left the call.\n */\n getLeftAt(): number {\n return this.leftAt;\n }\n\n /**\n * Sets the timestamp when the participant left the call.\n * @param value - The timestamp when the participant left the call.\n */\n setLeftAt(value: number) {\n this.leftAt = value;\n }\n\n /**\n * Gets the media ID of the participant.\n * @returns The media ID of the participant.\n */\n getMid(): string {\n return this.mid;\n }\n\n /**\n * Sets the media ID of the participant.\n * @param value - The media ID of the participant.\n */\n setMid(value: string) {\n this.mid = value;\n }\n\n /**\n * Gets the state of the participant.\n * @returns The state of the participant.\n */\n getState(): string {\n return this.state;\n }\n\n /**\n * Sets the state of the participant.\n * @param value - The state of the participant.\n */\n setState(value: string) {\n this.state = value;\n }\n\n /**\n * Creates a new instance of Participant from a JSON object.\n * @param object - The JSON object containing the participant data.\n * @returns A new instance of Participant.\n */\n static getParticipantFromJson(object: any): Participant {\n let participant = new Participant(object);\n return participant;\n }\n}\n","/**\n * Represents a recording object.\n */\nexport class Recording {\n /**\n * The recording ID.\n */\n private rid: string;\n /**\n * The URL of the recording.\n */\n private recording_url: string;\n /**\n * The start time of the recording.\n */\n private startTime: number;\n /**\n * The end time of the recording.\n */\n private endTime: number;\n /**\n * The duration of the recording.\n */\n private duration: number;\n\n /**\n * Creates a new instance of the Recording class.\n * @param data - The data to initialize the recording object.\n */\n constructor(data: any) {\n Object.assign(this, data);\n }\n\n /**\n * Gets the recording ID.\n * @returns The recording ID.\n */\n getRid(): string {\n return this.rid;\n }\n\n /**\n * Sets the recording ID.\n * @param value - The recording ID to set.\n */\n setRid(value: string) {\n this.rid = value;\n }\n\n /**\n * Gets the recording URL.\n * @returns The recording URL.\n */\n getRecordingURL(): string {\n return this.recording_url;\n }\n\n /**\n * Sets the recording URL.\n * @param value - The recording URL to set.\n */\n setRecordingURL(value: string) {\n this.recording_url = value;\n }\n\n /**\n * Gets the start time of the recording.\n * @returns The start time of the recording.\n */\n getStartTime(): number {\n return this.startTime;\n }\n\n /**\n * Sets the start time of the recording.\n * @param value - The start time of the recording to set.\n */\n setStartTime(value: number) {\n this.startTime = value;\n }\n\n /**\n * Gets the end time of the recording.\n * @returns The end time of the recording.\n */\n getEndTime(): number {\n return this.endTime;\n }\n\n /**\n * Sets the end time of the recording.\n * @param value - The end time of the recording to set.\n */\n setEndTime(value: number) {\n this.endTime = value;\n }\n\n /**\n * Gets the duration of the recording.\n * @returns The duration of the recording.\n */\n getDuration(): number {\n return this.duration;\n }\n\n /**\n * Sets the duration of the recording.\n * @param value - The duration of the recording to set.\n */\n setDuration(value: number) {\n this.duration = value;\n }\n\n /**\n * Creates a new Recording object from the given JSON data.\n * @param data - The JSON data to create the Recording object from.\n * @returns A new Recording object.\n */\n static getRecordingFromJson(data: any): Recording {\n let recording = new Recording(data);\n return recording;\n }\n}\n","import { CallConstants } from '../Constants';\nimport { CallGroup } from './CallGroup';\nimport { CallUser } from './CallUser';\nimport { Participant } from './Participant';\nimport { Recording } from './Recording';\n\n/**\n * Represents a call log.\n */\nexport class CallLog {\n /**\n * The session ID of the call log.\n */\n private sessionId: string;\n /**\n * The total audio minutes of the call log.\n */\n private totalAudioMinutes: number;\n /**\n * The total video minutes of the call log.\n */\n private totalVideoMinutes: number;\n /**\n * The total duration of the call log.\n */\n private totalDuration: string;\n /**\n * Whether the call log has a recording.\n */\n private hasRecording: boolean;\n /**\n * The time the call was initiated at.\n */\n private initiatedAt: number;\n /**\n * The call category of the call log.\n */\n private callCategory: string;\n /**\n * @type {CallUser}\n * The initiator of the call log.\n */\n private initiator: CallUser;\n /**\n * @type {CallUser | CallGroup}\n * The receiver of the call log.\n */\n private receiver: CallUser | CallGroup;\n /**\n * The receiver type of the call log.\n */\n private receiverType: string;\n /**\n * The status of the call log.\n */\n private status: string;\n /**\n * The total duration in minutes of the call log.\n */\n private totalDurationInMinutes: number;\n /**\n * The total number of participants in the call log.\n */\n private totalParticipants: number;\n /**\n * The type of the call log.\n */\n private type: string;\n /**\n * The message ID of the call log.\n */\n private mid: string;\n /**\n * The time the call ended at.\n */\n private endedAt: number;\n /**\n * @type {Participant[]}\n * The participants of the call log.\n */\n private participants: Participant[];\n /**\n * @type {Recording[]}\n * The recordings of the call log.\n */\n private recordings: Recording[];\n\n /**\n * Creates a new instance of CallLog.\n * @param data - The data to initialize the call log with.\n */\n constructor(data: any) {\n Object.assign(this, data);\n }\n\n /**\n * Gets the session ID of the call log.\n * @returns The session ID of the call log.\n */\n getSessionID(): string {\n return this.sessionId;\n }\n\n /**\n * Sets the session ID of the call log.\n * @param value - The session ID to set.\n */\n setSessionID(value: string) {\n this.sessionId = value;\n }\n\n /**\n * Gets the total audio minutes of the call log.\n * @returns The total audio minutes of the call log.\n */\n getTotalAudioMinutes(): number {\n return this.totalAudioMinutes;\n }\n\n /**\n * Sets the total audio minutes of the call log.\n * @param value - The total audio minutes to set.\n */\n setTotalAudioMinutes(value: number) {\n this.totalAudioMinutes = value;\n }\n\n /**\n * Gets the total video minutes of the call log.\n * @returns The total video minutes of the call log.\n */\n getTotalVideoMinutes(): number {\n return this.totalVideoMinutes;\n }\n\n /**\n * Sets the total video minutes of the call log.\n * @param value - The total video minutes to set.\n */\n setTotalVideoMinutes(value: number) {\n this.totalVideoMinutes = value;\n }\n\n /**\n * Gets the total duration of the call log.\n * @returns The total duration of the call log.\n */\n getTotalDuration(): string {\n return this.totalDuration;\n }\n\n /**\n * Sets the total duration of the call log.\n * @param value - The total duration to set.\n */\n setTotalDuration(value: string) {\n this.totalDuration = value;\n }\n\n /**\n * Gets whether the call log has a recording.\n * @returns Whether the call log has a recording.\n */\n getHasRecording(): boolean {\n return this.hasRecording;\n }\n\n /**\n * Sets whether the call log has a recording.\n * @param value - Whether the call log has a recording.\n */\n setHasRecording(value: boolean) {\n this.hasRecording = value;\n }\n\n /**\n * Gets the time the call was initiated at.\n * @returns The time the call was initiated at.\n */\n getInitiatedAt(): number {\n return this.initiatedAt;\n }\n\n /**\n * Sets the time the call was initiated at.\n * @param value - The time the call was initiated at.\n */\n setInitiatedAt(value: number) {\n this.initiatedAt = value;\n }\n\n /**\n * Gets the call category of the call log.\n * @returns The call category of the call log.\n */\n getCallCategory(): string {\n return this.callCategory;\n }\n\n /**\n * Sets the call category of the call log.\n * @param value - The call category to set.\n */\n setCallCategory(value: string) {\n this.callCategory = value;\n }\n\n /**\n * Gets the initiator of the call log.\n * @returns The initiator of the call log.\n */\n getInitiator(): CallUser {\n return this.initiator;\n }\n\n /**\n * Sets the initiator of the call log.\n * @param value - The initiator to set.\n */\n setInitiator(value: CallUser) {\n this.initiator = value;\n }\n\n /**\n * Gets the receiver of the call log.\n * @returns The receiver of the call log.\n */\n getReceiver(): CallUser | CallGroup {\n return this.receiver;\n }\n\n /**\n * Sets the receiver of the call log.\n * @param value - The receiver to set.\n */\n setReceiver(value: CallUser | CallGroup) {\n this.receiver = value;\n }\n\n /**\n * Gets the receiver type of the call log.\n * @returns The receiver type of the call log.\n */\n getReceiverType(): string {\n return this.receiverType;\n }\n\n /**\n * Sets the receiver type of the call log.\n * @param value - The receiver type to set.\n */\n setReceiverType(value: string) {\n this.receiverType = value;\n }\n\n /**\n * Gets the status of the call log.\n * @returns The status of the call log.\n */\n getStatus(): string {\n return this.status;\n }\n\n /**\n * Sets the status of the call log.\n * @param value - The status to set.\n */\n setStatus(value: string) {\n this.status = value;\n }\n\n /**\n * Gets the total duration in minutes of the call log.\n * @returns The total duration in minutes of the call log.\n */\n getTotalDurationInMinutes(): number {\n return this.totalDurationInMinutes;\n }\n\n /**\n * Sets the total duration in minutes of the call log.\n * @param value - The total duration in minutes to set.\n */\n setTotalDurationInMinutes(value: number) {\n this.totalDurationInMinutes = value;\n }\n\n /**\n * Gets the total number of participants in the call log.\n * @returns The total number of participants in the call log.\n */\n getTotalParticipants(): number {\n return this.totalParticipants;\n }\n\n /**\n * Sets the total number of participants in the call log.\n * @param value - The total number of participants to set.\n */\n setTotalParticipants(value: number) {\n this.totalParticipants = value;\n }\n\n /**\n * Gets the type of the call log.\n * @returns The type of the call log.\n */\n getType(): string {\n return this.type;\n }\n\n /**\n * Sets the type of the call log.\n * @param value - The type to set.\n */\n setType(value: string) {\n this.type = value;\n }\n\n /**\n * Gets the message ID of the call log.\n * @returns The message ID of the call log.\n */\n getMid(): string {\n return this.mid;\n }\n\n /**\n * Sets the message ID of the call log.\n * @param value - The message ID to set.\n */\n setMid(value: string) {\n this.mid = value;\n }\n\n /**\n * Gets the time the call ended at.\n * @returns The time the call ended at.\n */\n getEndedAt(): number {\n return this.endedAt;\n }\n\n /**\n * Sets the time the call ended at.\n * @param value - The time the call ended at.\n */\n setEndedAt(value: number) {\n this.endedAt = value;\n }\n\n /**\n * Gets the participants of the call log.\n * @returns The participants of the call log.\n */\n getParticipants(): Participant[] {\n return this.participants;\n }\n\n /**\n * Sets the participants of the call log.\n * @param value - The participants to set.\n */\n setParticipants(value: Participant[]) {\n this.participants = value;\n }\n\n /**\n * Gets the recordings of the call log.\n * @returns The recordings of the call log.\n */\n getRecordings(): Recording[] {\n return this.recordings;\n }\n\n /**\n * Sets the recordings of the call log.\n * @param value - The recordings to set.\n */\n setRecordings(value: Recording[]) {\n this.recordings = value;\n }\n\n /**\n * Creates a new instance of CallLog from JSON data.\n * @param data - The JSON data to create the call log from.\n * @returns A new instance of CallLog created from the JSON data.\n */\n static callLogFromJson(data: any): CallLog {\n let callLog = new CallLog(data);\n if (data.participants) {\n callLog.participants = data.participants.map((participant: any) =>\n Participant.getParticipantFromJson(participant),\n );\n }\n if (data.recordings) {\n callLog.recordings = data.recordings.map((recording: any) =>\n Recording.getRecordingFromJson(recording),\n );\n }\n if (data.initiator) {\n if (\n data[CallConstants.CALL_KEYS.CALL_DATA] &&\n data[CallConstants.CALL_KEYS.CALL_DATA][\n CallConstants.CALL_KEYS.CALL_ENTITIES\n ] &&\n data[CallConstants.CALL_KEYS.CALL_DATA][\n CallConstants.CALL_KEYS.CALL_ENTITIES\n ][CallConstants.CALL_KEYS.CALL_INITIATOR] &&\n data[CallConstants.CALL_KEYS.CALL_DATA][\n CallConstants.CALL_KEYS.CALL_ENTITIES\n ][CallConstants.CALL_KEYS.CALL_INITIATOR][\n CallConstants.CALL_KEYS.CALL_ENTITY\n ]\n ) {\n let initiatorObj =\n data[CallConstants.CALL_KEYS.CALL_DATA][\n CallConstants.CALL_KEYS.CALL_ENTITIES\n ][CallConstants.CALL_KEYS.CALL_INITIATOR][\n CallConstants.CALL_KEYS.CALL_ENTITY\n ];\n callLog.initiator = CallUser.getUserFromJson(initiatorObj);\n }\n }\n if (data.receiver) {\n if (\n data[CallConstants.CALL_KEYS.CALL_DATA] &&\n data[CallConstants.CALL_KEYS.CALL_DATA][\n CallConstants.CALL_KEYS.CALL_ENTITIES\n ] &&\n data[CallConstants.CALL_KEYS.CALL_DATA][\n CallConstants.CALL_KEYS.CALL_ENTITIES\n ][CallConstants.CALL_KEYS.CALL_RECEIVER] &&\n data[CallConstants.CALL_KEYS.CALL_DATA][\n CallConstants.CALL_KEYS.CALL_ENTITIES\n ][CallConstants.CALL_KEYS.CALL_RECEIVER][\n CallConstants.CALL_KEYS.CALL_ENTITY\n ]\n ) {\n let receiverObj =\n data[CallConstants.CALL_KEYS.CALL_DATA][\n CallConstants.CALL_KEYS.CALL_ENTITIES\n ][CallConstants.CALL_KEYS.CALL_RECEIVER][\n CallConstants.CALL_KEYS.CALL_ENTITY\n ];\n if (data.receiverType == CallConstants.RECEIVER_TYPE_USER) {\n callLog.receiver = CallUser.getUserFromJson(receiverObj);\n } else {\n callLog.receiver = CallGroup.getGroupFromJson(receiverObj);\n }\n }\n }\n return callLog;\n }\n}\n","import { CallConstants } from '../Constants';\nimport { isFalsy } from '../Helper';\nimport { AspectRatio, Position } from '../types/common';\nimport { OngoingCallListener } from './Listner';\n\nexport class CallSettings {\n public static readonly POSITION_TOP_LEFT = 'top-left';\n public static readonly POSITION_TOP_RIGHT = 'top-right';\n public static readonly POSITION_BOTTOM_LEFT = 'bottom-left';\n public static readonly POSITION_BOTTOM_RIGHT = 'bottom-right';\n public static readonly ASPECT_RATIO_DEFAULT = 'default';\n public static readonly ASPECT_RATIO_CONTAIN = 'contain';\n public static readonly ASPECT_RATIO_COVER = 'cover';\n public static readonly POSITION = {\n TOP_LEFT: 'top-left',\n TOP_RIGHT: 'top-right',\n BOTTOM_LEFT: 'bottom-left',\n BOTTOM_RIGHT: 'bottom-right',\n } as const;\n public static readonly ASPECT_RATIO = {\n DEFAULT: 'default',\n CONTAIN: 'contain',\n COVER: 'cover',\n } as const;\n\n private defaultLayout: boolean;\n private isAudioOnly: boolean;\n private listener: OngoingCallListener;\n private mode: string;\n private ShowEndCallButton: boolean;\n private ShowSwitchCameraButton: boolean;\n private ShowMuteAudioButton: boolean;\n private ShowPauseVideoButton: boolean;\n private ShowAudioModeButton: boolean;\n private StartAudioMuted: boolean;\n private StartVideoMuted: boolean;\n private defaultAudioMode: string;\n private ShowSwitchToVideoCallButton: boolean;\n private AvatarMode: string;\n private ShowRecordingButton: boolean;\n private idleTimeoutPeriod: number;\n private StartRecordingOnCallStart: boolean;\n private MainVideoContainerSetting: MainVideoContainerSetting;\n private EnableVideoTileClick: boolean;\n private enableDraggableVideoTile: boolean;\n\n public constructor(builder: CallSettingsBuilder) {\n this.defaultLayout = builder.defaultLayout;\n this.isAudioOnly = builder.isAudioOnly;\n this.listener = builder.listener;\n this.mode = builder.mode;\n this.ShowEndCallButton = builder.ShowEndCallButton;\n this.ShowSwitchCameraButton = builder.ShowSwitchCameraButton;\n this.ShowMuteAudioButton = builder.ShowMuteAudioButton;\n this.ShowPauseVideoButton = builder.ShowPauseVideoButton;\n this.ShowAudioModeButton = builder.ShowAudioModeButton;\n this.StartAudioMuted = builder.StartAudioMuted;\n this.StartVideoMuted = builder.StartVideoMuted;\n this.defaultAudioMode = builder.defaultAudioMode;\n this.ShowSwitchToVideoCallButton = builder.ShowSwitchToVideoCallButton;\n this.AvatarMode = builder.AvatarMode;\n this.ShowRecordingButton = builder.ShowRecordingButton;\n this.idleTimeoutPeriod = builder.idleTimeoutPeriod;\n this.StartRecordingOnCallStart = builder.StartRecordingOnCallStart;\n this.MainVideoContainerSetting = builder.MainVideoContainerSetting;\n this.EnableVideoTileClick = builder.EnableVideoTileClick;\n this.enableDraggableVideoTile = builder.enableDraggableVideoTile;\n }\n\n public isAudioOnlyCall() {\n return this.isAudioOnly;\n }\n\n public isDefaultLayoutEnabled() {\n return this.defaultLayout;\n }\n\n public getCallEventListener() {\n return this.listener;\n }\n\n public getMode() {\n return this.mode;\n }\n\n public isEndCallButtonEnabled(): boolean {\n return this.ShowEndCallButton;\n }\n\n public isSwitchCameraButtonEnabled(): boolean {\n return this.ShowSwitchCameraButton;\n }\n\n public isMuteAudioButtonEnabled(): boolean {\n return this.ShowMuteAudioButton;\n }\n\n public isPauseVideoButtonEnabled(): boolean {\n return this.ShowPauseVideoButton;\n }\n\n public isAudioModeButtonEnabled(): boolean {\n return this.ShowAudioModeButton;\n }\n\n public getStartWithAudioMuted(): boolean {\n return this.StartAudioMuted;\n }\n\n public getStartWithVideoMuted(): boolean {\n return this.StartVideoMuted;\n }\n\n public getDefaultAudioMode(): string {\n return this.defaultAudioMode;\n }\n\n public isAudioToVideoButtonEnabled(): boolean {\n return this.ShowSwitchToVideoCallButton;\n }\n\n public getAvatarMode(): string {\n return this.AvatarMode;\n }\n\n public isRecordingButtonEnabled(): boolean {\n return this.ShowRecordingButton;\n }\n\n public getIdleTimeoutPeriod(): number {\n return this.idleTimeoutPeriod;\n }\n\n public shouldStartRecordingOnCallStart(): boolean {\n return this.StartRecordingOnCallStart;\n }\n\n public getMainVideoContainerSetting(): MainVideoContainerSetting {\n return this.MainVideoContainerSetting;\n }\n\n public isVideoTileClickEnabled(): boolean {\n return this.EnableVideoTileClick;\n }\n\n public isVideoTileDragEnabled(): boolean {\n return this.enableDraggableVideoTile;\n }\n}\n\ntype CallModes =\n (typeof CallConstants.CALL_MODE)[keyof typeof CallConstants.CALL_MODE];\n\nexport class CallSettingsBuilder {\n /** @private */ defaultLayout: boolean = true;\n /** @private */ isAudioOnly: boolean = false;\n /** @private */ listener: OngoingCallListener;\n /** @private */ mode: CallModes = CallConstants.CALL_MODE.DEFAULT;\n /** @private */ ShowEndCallButton: boolean = true;\n /** @private */ ShowSwitchCameraButton: boolean = true;\n /** @private */ ShowMuteAudioButton: boolean = true;\n /** @private */ ShowPauseVideoButton: boolean = true;\n /** @private */ ShowAudioModeButton: boolean = true;\n /** @private */ StartAudioMuted: boolean = false;\n /** @private */ StartVideoMuted: boolean = false;\n /** @private */ defaultAudioMode: (typeof CallConstants.AUDIO_MODE)[keyof typeof CallConstants.AUDIO_MODE];\n /** @private */ ShowSwitchToVideoCallButton: boolean = true;\n /** @private */ AvatarMode: string = 'circle';\n /** @private */ ShowRecordingButton: boolean = false;\n /** @private */ idleTimeoutPeriod: number = 180;\n /** @private */ StartRecordingOnCallStart: boolean = false;\n /** @private */ MainVideoContainerSetting: MainVideoContainerSetting =\n new MainVideoContainerSetting();\n /** @private */ EnableVideoTileClick: boolean = true;\n /** @private */ enableDraggableVideoTile: boolean = true;\n\n /**\n *\n * @param {boolean} defaultLayout\n * This methods shows/hides the default button layout.\n * If set to true the default button layout will be shown.\n * If set to false the default button layout will be hidden.\n * Default value is true\n * @returns\n */\n public enableDefaultLayout(defaultLayout: boolean): this {\n this.defaultLayout = defaultLayout;\n return this;\n }\n\n /**\n *\n * @param {boolean} isAudioOnly\n * This methods sets the type(audio/video) of the call.\n * If set to true, the call will be strictly an audio call.\n * If set to false, the call will be an audio-video call.\n * Default value is false\n * @returns\n */\n public setIsAudioOnlyCall(isAudioOnly: boolean): this {\n this.isAudioOnly = isAudioOnly;\n return this;\n }\n\n /**\n *\n * @param {OngoingCallListener} listener\n * This method sets the call event listener.\n * @returns\n */\n public setCallEventListener(listener: OngoingCallListener): this {\n this.listener = listener;\n return this;\n }\n\n /**\n *\n * @param {string} mode\n * This method sets the mode of the call.\n * @returns\n */\n public setMode(mode: CallModes): this {\n this.mode = mode;\n return this;\n }\n\n /**\n *\n * @param {boolean} showEndCallButton\n * This method shows/hides the end call button.\n * If set to true it will display the end call button.\n * If set to false it will hide the end call button.\n * Default value is true.\n * @returns\n */\n public showEndCallButton(showEndCallButton: boolean = true): this {\n this.ShowEndCallButton = showEndCallButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} showSwitchCameraButton\n * This method shows/hides the switch camera button.\n * If set to true it will display the switch camera button.\n * If set to false it will hide the switch camera button.\n * Note: For video call it remains hidden regardless of its value.\n * Default value is true.\n * @returns\n */\n public showSwitchCameraButton(showSwitchCameraButton: boolean = true): this {\n this.ShowSwitchCameraButton = showSwitchCameraButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} showMuteAudioButton\n * This method shows/hides the mute audio button.\n * If set to true it will display the mute audio button.\n * If set to false it will hide the mute audio button.\n * Default value is true.\n * @returns\n */\n public showMuteAudioButton(showMuteAudioButton: boolean = true): this {\n this.ShowMuteAudioButton = showMuteAudioButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} showPauseVideoButton\n * This method shows/hides the pause video button.\n * If set to true it will display the pause video button.\n * If set to false it will hide the pause video button.\n * Note: For video call it remains hidden regardless of its value.\n * Default value is true.\n * @returns\n */\n public showPauseVideoButton(showPauseVideoButton: boolean = true): this {\n this.ShowPauseVideoButton = showPauseVideoButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} showAudioModeButton\n * This method shows/hides the audio mode button.\n * If set to true it will display the audio mode button.\n * If set to false it will hide the audio mode button.\n * Default value is true.\n * @returns\n */\n public showAudioModeButton(showAudioModeButton: boolean = true): this {\n this.ShowAudioModeButton = showAudioModeButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} audioMuted\n * This method allows the call to be started with audio muted.\n * If set to true, the call will start with audio muted.\n * Default value is false.\n * @returns\n */\n public startWithAudioMuted(audioMuted: boolean = false): this {\n this.StartAudioMuted = audioMuted;\n return this;\n }\n\n /**\n *\n * @param {boolean} videoMuted\n * This method allows the call to be started with video muted.\n * If set to true, the call will start with video muted.\n * Note: This method has no effect for audio calls.\n * Default value is false.\n * @returns\n */\n public startWithVideoMuted(videoMuted: boolean = false): this {\n this.StartVideoMuted = videoMuted;\n return this;\n }\n\n /**\n *\n * @param {string} audioMode\n * This method will set the default audio mode.\n * @returns\n */\n public setDefaultAudioMode(\n audioMode: (typeof CallConstants.AUDIO_MODE)[keyof typeof CallConstants.AUDIO_MODE],\n ): this {\n this.defaultAudioMode = audioMode;\n return this;\n }\n\n /**\n *\n * @param {boolean} showAudioToVideoSwitchButton\n * This method is obsolete and doesn't have any effect.\n * @deprecated\n * @returns\n */\n public showSwitchToVideoCallButton(\n showAudioToVideoSwitchButton: boolean = true,\n ): this {\n this.ShowSwitchToVideoCallButton = showAudioToVideoSwitchButton;\n return this;\n }\n\n /**\n *\n * @param {string} mode\n * This method is obsolete and doesn't have any effect.\n * @deprecated\n * @returns\n */\n public setAvatarMode(mode: 'circle' | 'square' | 'fullscreen' = 'circle') {\n this.AvatarMode = mode;\n return this;\n }\n\n /**\n *\n * @param {boolean} showRecordingButton\n * This method shows/hides the recording button.\n * If set to true it will display the recording button.\n * If set to false it will hide the recording button.\n * Default value is false.\n * @returns\n */\n public showRecordingButton(showRecordingButton: boolean = false): this {\n this.ShowRecordingButton = showRecordingButton;\n return this;\n }\n\n /**\n *\n * @param {number} idleTimeoutPeriod\n * This method sets the idle timeout period for the call.\n * If set and you are the only one in call, the call will end\n * after the idle timeout period, giving you the option to\n * extend the call 60 seconds before the call ends.\n * Default value is 180 seconds.\n * @returns\n */\n public setIdleTimeoutPeriod(idleTimeoutPeriod: number = 180): this {\n this.idleTimeoutPeriod = idleTimeoutPeriod;\n return this;\n }\n\n /**\n *\n * @param {boolean} startRecordingOnCallStart\n * This method starts the recording as soon as the call start.\n * If set to true it will start the recording as soon as the call start.\n * Default value is false.\n * @returns\n */\n public startRecordingOnCallStart(\n startRecordingOnCallStart: boolean = false,\n ): this {\n this.StartRecordingOnCallStart = startRecordingOnCallStart;\n return this;\n }\n\n /**\n *\n * This method is obsolete and doesn't have any effect.\n * @param {any} ...args\n * @deprecated\n * @returns\n */\n public setMainVideoContainerSetting(...args: any[]): this {\n return this;\n }\n\n /**\n *\n * @param {boolean} enableVideoTileClick\n * This method can be used to enable/disable video tile click functionality in Spotlight mode.\n * By default the video tile is clickable.\n * @returns\n */\n public enableVideoTileClick(enableVideoTileClick: boolean = true): this {\n this.EnableVideoTileClick = enableVideoTileClick;\n return this;\n }\n\n /**\n *\n * @param {boolean} enableVideoTileDrag\n * This method can be used to enable/disable video tile drag functionality in Spotlight mode.\n * By default the video tile is draggable.\n * @returns\n */\n public enableVideoTileDrag(enableVideoTileDrag: boolean = true): this {\n this.enableDraggableVideoTile = enableVideoTileDrag;\n return this;\n }\n /**\n * This method will return an object of the CallSettings class.\n * @returns {CallSettings}\n */\n public build(): CallSettings {\n return new CallSettings(this);\n }\n}\n\nexport class MainVideoContainerSetting {\n private videoFit: AspectRatio = CallSettings.ASPECT_RATIO_CONTAIN;\n private zoomButton: Object = CallConstants.ZOOM_BUTTON_DEFAULT_PARAMS;\n private fullScreenButton: Object =\n CallConstants.FULL_SCREEN_BUTTON_DEFAULT_PARAMS;\n private userListButton: Object =\n CallConstants.USER_LIST_BUTTON_DEFAULT_PARAMS;\n private nameLabel: Object = CallConstants.NAME_LABEL_DEFAULT_PARAMS;\n\n /**\n *\n * @param {string} mainVideoAspectRatio\n * This method is used to set the aspect ratio of main video.\n * The default value is `contain`.\n * @returns\n */\n public setMainVideoAspectRatio(\n mainVideoAspectRatio: AspectRatio = 'contain',\n ) {\n this.videoFit = mainVideoAspectRatio;\n }\n\n /**\n *\n * @param {Position} position\n * @param {boolean} visibility\n * This method is used to set the position & visibility parameter of the full screen button.\n * By default the full screen button is visible in the `bottom-right` position.\n * @returns\n */\n public setFullScreenButtonParams(\n position: Position = CallSettings.POSITION_BOTTOM_RIGHT,\n visibility: boolean = true,\n ) {\n if (!isFalsy(position)) {\n this.fullScreenButton[\n CallConstants.MAIN_VIDEO_CONTAINER_SETTINGS.KEYS.POSITION\n ] = position;\n }\n\n if (visibility != undefined && visibility != null) {\n this.fullScreenButton[\n CallConstants.MAIN_VIDEO_CONTAINER_SETTINGS.KEYS.VISIBILITY\n ] = visibility;\n }\n }\n\n /**\n *\n * @param {Position} position\n * @param {boolean} visibility\n * @param {string} backgroundColor\n * This method is used to set the position, visibility & background color of the name label.\n * By default the name label is visible in the `bottom-left` position with a background-color `#333333`\n * @returns\n */\n public setNameLabelParams(\n position: Position = CallSettings.POSITION_BOTTOM_LEFT,\n visibility: boolean = true,\n backgroundColor: string = '#333333',\n ) {\n if (!isFalsy(position)) {\n this.nameLabel[\n CallConstants.MAIN_VIDEO_CONTAINER_SETTINGS.KEYS.POSITION\n ] = position;\n }\n\n if (visibility != undefined && visibility != null) {\n this.nameLabel[\n CallConstants.MAIN_VIDEO_CONTAINER_SETTINGS.KEYS.VISIBILITY\n ] = visibility;\n }\n\n if (!isFalsy(backgroundColor)) {\n this.nameLabel[CallConstants.MAIN_VIDEO_CONTAINER_SETTINGS.KEYS.COLOR] =\n backgroundColor;\n }\n }\n\n /**\n *\n * @param {Position} position\n * @param {boolean} visibility\n * This method is used to set the position & visibility parameter of the zoom button.\n * By default the zoom button is visible in the `bottom-right` position.\n * @returns\n */\n public setZoomButtonParams(\n position: Position = CallSettings.POSITION_BOTTOM_RIGHT,\n visibility: boolean = true,\n ) {\n if (!isFalsy(position)) {\n this.zoomButton[\n CallConstants.MAIN_VIDEO_CONTAINER_SETTINGS.KEYS.POSITION\n ] = position;\n }\n\n if (visibility != undefined && visibility != null) {\n this.zoomButton[\n CallConstants.MAIN_VIDEO_CONTAINER_SETTINGS.KEYS.VISIBILITY\n ] = visibility;\n }\n }\n\n /**\n *\n * @param {Position} position\n * @param {boolean} visibility\n * This method is used to set the position & visibility parameter of the user list button.\n * By default the user list button is visible in the `bottom-right` position.\n * @returns\n */\n public setUserListButtonParams(\n position: Position = CallSettings.POSITION_BOTTOM_RIGHT,\n visibility: boolean = true,\n ) {\n if (!isFalsy(position)) {\n this.userListButton[\n CallConstants.MAIN_VIDEO_CONTAINER_SETTINGS.KEYS.POSITION\n ] = position;\n }\n\n if (visibility != undefined && visibility != null) {\n this.userListButton[\n CallConstants.MAIN_VIDEO_CONTAINER_SETTINGS.KEYS.VISIBILITY\n ] = visibility;\n }\n }\n}\n","/**\n * Represents the parameters used to filter call logs.\n */\nexport class CallLogFilterParams {\n /**\n * The number of items to display per page.\n */\n private perPage: number = -1;\n /**\n * The page number to display.\n */\n private page: number = -1;\n /**\n * The mode of the call.\n */\n private mode: string;\n /**\n * The type of the call.\n */\n private type: string;\n /**\n * The status of the call.\n */\n private status: string;\n /**\n * The direction of the call.\n */\n private direction: string;\n /**\n * Whether the call has recordings.\n */\n private hasRecording: boolean;\n /**\n * The user ID.\n */\n private uid: string;\n /**\n * The group ID.\n */\n private guid: string;\n\n /**\n * Creates a new instance of the CallLogFilterParams class.\n * @param data - The data to initialize the call log filter parameters object.\n */\n // constructor(data: any) {\n // Object.assign(this, data);\n // }\n\n /**\n * Sets the direction of the call.\n * @param value - The direction of the call.\n */\n setDirection(value: string) {\n this.direction = value;\n }\n\n /**\n * Sets the status of the call.\n * @param value - The status of the call.\n */\n setStatus(value: string) {\n this.status = value;\n }\n\n /**\n * Sets the type of the call.\n * @param value - The type of the call.\n */\n setType(value: string) {\n this.type = value;\n }\n\n /**\n * Sets the number of items to display per page.\n * @param value - The number of items to display per page.\n */\n setPerPage(value: number) {\n this.perPage = value;\n }\n\n /**\n * Sets the page number to display.\n * @param value - The page number to display.\n */\n setPage(value: number) {\n this.page = value;\n }\n\n /**\n * Sets the mode of the call.\n * @param value - The mode of the call.\n */\n setMode(value: string) {\n this.mode = value;\n }\n\n /**\n * Sets whether the call has recordings.\n * @param value - Whether the call has recordings.\n */\n setHasRecordings(value: boolean) {\n this.hasRecording = value;\n }\n\n /**\n * Sets the user ID.\n * @param value - The user ID.\n */\n setUid(value: string) {\n this.uid = value;\n }\n\n /**\n * Sets the group ID.\n * @param value - The group ID.\n */\n setGuid(value: string) {\n this.guid = value;\n }\n\n /**\n * Converts the filter parameters to a map of key-value pairs.\n * @returns A map of key-value pairs representing the filter parameters.\n */\n toMap(): { [key: string]: string } {\n let map: { [key: string]: string } = {};\n\n if (this.perPage !== -1) map['perPage'] = String(this.perPage);\n\n if (this.page !== -1) map['page'] = String(this.page);\n\n if (this.mode) map['mode'] = this.mode;\n\n if (this.type) map['type'] = this.type;\n\n if (this.status) map['status'] = this.status;\n\n if (this.direction) map['direction'] = this.direction;\n\n if (this.uid) map['uid'] = this.uid;\n\n if (this.guid) map['guid'] = this.guid;\n\n if (this.hasRecording !== null) {\n map['hasRecording'] = this.hasRecording ? 'true' : 'false';\n }\n\n return map;\n }\n}\n","import { MESSAGES_REQUEST_ERRORS } from '../CometChatErrorConstants';\nimport { DEFAULT_VALUES } from '../Constants';\nimport { APIHandler } from '../api';\nimport { CallLog } from './CallLog';\nimport { CallLogFilterParams } from './CallLogFilterParams';\nimport { CometChatCallsException } from './CometChatCallsException';\nimport { ErrorModel } from './ErrorModel';\n\n/**\n * Represents a request to fetch call logs.\n */\nclass CallLogRequest {\n /**\n * The maximum number of call logs to fetch.\n */\n private limit: number = 30;\n /**\n * The total number of pages of call logs.\n */\n private totalPages: number = 0;\n /**\n * The current page of call logs.\n */\n private currentPage: number = 0;\n /**\n * The type of call to filter by.\n */\n private callType: string;\n /**\n * The status of call to filter by.\n */\n private callStatus: string;\n /**\n * Whether the call has a recording or not.\n */\n private hasRecording: boolean;\n /**\n * The category of call to filter by.\n */\n private callCategory: string;\n /**\n * The direction of call to filter by.\n */\n private callDirection: string;\n /**\n * The user ID to filter by.\n */\n private uid: string;\n /**\n * The group ID to filter by.\n */\n private guid: string;\n /**\n * The authentication token to use for the API call.\n */\n private authToken: string;\n\n /**\n * Whether an API call is currently in progress.\n */\n private inProgress: boolean = false;\n /**\n * The timestamp of the last update.\n */\n private updatedAt: any = 0;\n /**\n * Whether to only fetch updates.\n */\n private onlyUpdates: number = 0;\n /**\n * The timestamp of the call log.\n */\n private timestamp?: number = 0;\n /**\n * The ID of the call log.\n */\n private id?: number = DEFAULT_VALUES.DEFAULT_MSG_ID;\n /**\n * The affix of the call log.\n */\n private affix: string;\n /**\n * The last affix of the call log.\n */\n private lastAffix: string;\n /**\n * The current method of the call log.\n */\n private currentMethod: string;\n /**\n * The pagination metadata of the call log.\n */\n private paginationMeta: any = {};\n\n /**\n * Creates a new CallLogRequest instance.\n * @param builder The builder object to use for constructing the request.\n */\n public constructor(builder: CallLogRequestBuilder) {\n this.limit = builder.limit;\n this.callType = builder.callType;\n this.callStatus = builder.callStatus;\n this.hasRecording = builder.hasRecording;\n this.callCategory = builder.callCategory;\n this.callDirection = builder.callDirection;\n this.uid = builder.uid;\n this.guid = builder.guid;\n this.authToken = builder.authToken;\n }\n\n /**\n * Fetches the next page of call logs.\n * @returns A promise that resolves to an array of CallLog objects, or rejects with a CometChatCallsException if there was an error.\n */\n public fetchNext(): Promise<CallLog[]> {\n return this.makeAPICall(true);\n }\n\n /**\n * Fetches the previous page of call logs.\n * @returns A promise that resolves to an array of CallLog objects, or an empty array if there are no previous pages, or rejects with a CometChatCallsException if there was an error..\n */\n public fetchPrevious(): Promise<CallLog[] | []> {\n return this.makeAPICall();\n }\n\n /**\n * Makes an API call to fetch call logs.\n * @param isFetchNext Whether to fetch the next page of call logs.\n * @returns A promise that resolves to an array of CallLog objects, or rejects with a CometChatCallsException if there was an error.\n */\n private makeAPICall(isFetchNext?: boolean): Promise<CallLog[]> {\n return new Promise(async (resolve, reject) => {\n try {\n //TODO: How do I get CallInstance? I need to check if the CCcall is initialized or not.\n const condition = isFetchNext\n ? this.totalPages != 0 && this.totalPages == this.currentPage\n : this.currentPage == 1;\n if (condition) {\n this.inProgress = false;\n resolve([]);\n return;\n }\n\n if (this.inProgress) {\n this.inProgress = false;\n reject(\n new CometChatCallsException(\n MESSAGES_REQUEST_ERRORS.REQUEST_IN_PROGRESS_ERROR as ErrorModel,\n ),\n );\n return;\n }\n this.inProgress = true;\n if (!this.authToken) {\n this.inProgress = false;\n reject(\n new CometChatCallsException({\n code: MESSAGES_REQUEST_ERRORS.NOT_ENOUGH_PARAMS.code,\n message:\n \"`Auth Token` is required to use the 'fetchNext()' method.\",\n }),\n );\n return;\n }\n try {\n let logs = await APIHandler.getCallLogList(\n this.getParams(isFetchNext),\n this.authToken,\n );\n if (logs?.data?.error) {\n this.inProgress = false;\n reject(new CometChatCallsException(logs.data.error as ErrorModel));\n return;\n }\n let callLogList = this.getCallLogList(JSON.stringify(logs.data));\n resolve(callLogList);\n this.inProgress = false;\n } catch (e) {\n this.inProgress = false;\n reject(new CometChatCallsException(e as ErrorModel));\n }\n } catch (err) {\n this.inProgress = false;\n reject(\n new CometChatCallsException({\n code: 'UNKNOWN ERROR',\n message: 'Unknown error',\n }),\n );\n }\n });\n }\n\n /**\n * Gets the filter parameters for the API call.\n * @param isNext Whether to fetch the next page of call logs.\n * @returns The filter parameters object.\n */\n private getParams(isNext?: boolean): CallLogFilterParams {\n let params: CallLogFilterParams = new CallLogFilterParams();\n\n if (isNext) {\n params.setPage(this.currentPage + 1);\n } else {\n params.setPage(this.currentPage - 1);\n }\n\n params.setPerPage(this.limit);\n\n this.hasRecording && params.setHasRecordings(this.hasRecording);\n\n this.callStatus && params.setStatus(this.callStatus);\n\n this.callType && params.setType(this.callType);\n\n this.callCategory && params.setMode(this.callCategory);\n\n this.callDirection && params.setDirection(this.callDirection);\n\n this.uid && params.setUid(this.uid);\n\n this.guid && params.setGuid(this.guid);\n\n return params;\n }\n\n /**\n * Parses the API response and returns an array of CallLog objects.\n * @param response The API response string.\n * @returns An array of CallLog objects.\n */\n private getCallLogList(response: string): CallLog[] {\n let callLogList: CallLog[] = [];\n\n let responseJson = JSON.parse(response);\n let metaObject = responseJson['meta'];\n\n if (metaObject.pagination) {\n let paginationObject = metaObject.pagination;\n if (paginationObject.total_pages) {\n this.totalPages = paginationObject.total_pages;\n this.currentPage = paginationObject.current_page;\n }\n }\n\n let array = responseJson.data;\n\n for (let i = 0; i < array.length; i++) {\n let object = array[i];\n let callLog: CallLog = CallLog.callLogFromJson(object);\n callLogList.push(callLog);\n }\n\n return callLogList;\n }\n}\n\n/**\n * A builder class for creating a request to fetch call logs.\n */\nexport class CallLogRequestBuilder {\n limit: number = 30;\n callType: string;\n callStatus: string;\n hasRecording: boolean;\n callCategory: string;\n callDirection: string;\n uid: string;\n guid: string;\n authToken: string;\n\n /**\n * Sets the limit of call logs to be fetched.\n * @param limit - The number of call logs to be fetched.\n * @returns The CallLogRequestBuilder object.\n */\n setLimit(limit: number): this {\n this.limit = limit;\n return this;\n }\n\n /**\n * Sets the type of call to be fetched.\n * @param callType - The type of call to be fetched. Can be either 'video' or 'audio'.\n * @returns The CallLogRequestBuilder object.\n */\n setCallType(callType: 'video' | 'audio'): this {\n this.callType = callType;\n return this;\n }\n\n /**\n * Sets the status of call to be fetched.\n * @param callStatus - The status of call to be fetched. Can be either 'ongoing', 'busy', 'rejected', 'cancelled', 'ended' or 'missed'.\n * @returns The CallLogRequestBuilder object.\n */\n setCallStatus(\n callStatus:\n | 'ongoing'\n | 'busy'\n | 'rejected'\n | 'cancelled'\n | 'ended'\n | 'missed',\n ): this {\n this.callStatus = callStatus;\n return this;\n }\n\n /**\n * Sets whether the call has recording or not.\n * @param hasRecording - Whether the call has recording or not.\n * @returns The CallLogRequestBuilder object.\n */\n setHasRecording(hasRecording: boolean): this {\n this.hasRecording = hasRecording;\n return this;\n }\n\n /**\n * Sets the category of call to be fetched.\n * @param callCategory - The category of call to be fetched. Can be either 'call' or 'meet'.\n * @returns The CallLogRequestBuilder object.\n */\n setCallCategory(callCategory: 'call' | 'meet'): this {\n this.callCategory = callCategory;\n return this;\n }\n\n /**\n * Sets the direction of call to be fetched.\n * @param callDirection - The direction of call to be fetched. Can be either 'incoming' or 'outgoing'.\n * @returns The CallLogRequestBuilder object.\n */\n setCallDirection(callDirection: 'incoming' | 'outgoing'): this {\n this.callDirection = callDirection;\n return this;\n }\n\n /**\n * Sets the user ID of the call logs to be fetched.\n * @param uid - The user ID of the call logs to be fetched.\n * @returns The CallLogRequestBuilder object.\n */\n setUid(uid: string): this {\n this.uid = uid;\n return this;\n }\n\n /**\n * Sets the group ID of the call logs to be fetched.\n * @param guid - The group ID of the call logs to be fetched.\n * @returns The CallLogRequestBuilder object.\n */\n setGuid(guid: string): this {\n this.guid = guid;\n return this;\n }\n\n /**\n * Sets the authorization token for the request.\n * @param authToken - The authorization token for the request.\n * @returns The CallLogRequestBuilder object.\n */\n setAuthToken(authToken: string): this {\n this.authToken = authToken;\n return this;\n }\n\n /**\n * Builds and returns the CallLogRequest object.\n * @returns The CallLogRequest object.\n */\n build(): CallLogRequest {\n return new CallLogRequest(this);\n }\n}\n","import React from 'react';\nimport { View, Text } from 'react-native';\n\nexport class MessageComponent extends React.Component<{ message: string }> {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n <View\n style={{\n flex: 1,\n backgroundColor: '#000',\n justifyContent: 'center',\n alignItems: 'center',\n padding: 20,\n }}>\n <Text style={{ color: '#FFF' }}>{this.props.message}</Text>\n </View>\n );\n }\n}\n","import { OngoingCallListener } from './Listner';\nimport { CallConstants } from '../Constants';\n\nexport class PresenterSettings {\n public static readonly POSITION_TOP_LEFT = 'top-left';\n public static readonly POSITION_TOP_RIGHT = 'top-right';\n public static readonly POSITION_BOTTOM_LEFT = 'bottom-left';\n public static readonly POSITION_BOTTOM_RIGHT = 'bottom-right';\n public static readonly ASPECT_RATIO_DEFAULT = 'default';\n public static readonly ASPECT_RATIO_CONTAIN = 'contain';\n public static readonly ASPECT_RATIO_COVER = 'cover';\n public static readonly POSITION = {\n TOP_LEFT: 'top-left',\n TOP_RIGHT: 'top-right',\n BOTTOM_LEFT: 'bottom-left',\n BOTTOM_RIGHT: 'bottom-right',\n } as const;\n public static readonly ASPECT_RATIO = {\n DEFAULT: 'default',\n CONTAIN: 'contain',\n COVER: 'cover',\n } as const;\n\n private defaultLayout: boolean;\n private isAudioOnly: boolean;\n private isPresenter: boolean;\n private listener: OngoingCallListener;\n private ShowEndCallButton: boolean;\n private ShowSwitchCameraButton: boolean;\n private ShowMuteAudioButton: boolean;\n private ShowPauseVideoButton: boolean;\n private ShowAudioModeButton: boolean;\n private StartAudioMuted: boolean;\n private StartVideoMuted: boolean;\n private defaultAudioMode: string;\n private ShowRecordingButton: boolean;\n private idleTimeoutPeriod: number;\n\n public constructor(builder: PresenterSettingsBuilder) {\n this.defaultLayout = builder.defaultLayout;\n this.isAudioOnly = builder.isAudioOnly;\n this.isPresenter = builder.isPresenter;\n this.listener = builder.listener;\n this.ShowEndCallButton = builder.ShowEndCallButton;\n this.ShowSwitchCameraButton = builder.ShowSwitchCameraButton;\n this.ShowMuteAudioButton = builder.ShowMuteAudioButton;\n this.ShowPauseVideoButton = builder.ShowPauseVideoButton;\n this.ShowAudioModeButton = builder.ShowAudioModeButton;\n this.StartAudioMuted = builder.StartAudioMuted;\n this.StartVideoMuted = builder.StartVideoMuted;\n this.defaultAudioMode = builder.defaultAudioMode;\n this.ShowRecordingButton = builder.ShowRecordingButton;\n this.idleTimeoutPeriod = builder.idleTimeoutPeriod;\n }\n\n public isAudioOnlyCall() {\n return this.isAudioOnly;\n }\n\n public getIsPresenter() {\n return this.isPresenter;\n }\n\n public isDefaultLayoutEnabled() {\n return this.defaultLayout;\n }\n\n public getCallEventListener() {\n return this.listener;\n }\n\n public isEndCallButtonEnabled(): boolean {\n return this.ShowEndCallButton;\n }\n\n public isSwitchCameraButtonEnabled(): boolean {\n return this.ShowSwitchCameraButton;\n }\n\n public isMuteAudioButtonEnabled(): boolean {\n return this.ShowMuteAudioButton;\n }\n\n public isPauseVideoButtonEnabled(): boolean {\n return this.ShowPauseVideoButton;\n }\n\n public isAudioModeButtonEnabled(): boolean {\n return this.ShowAudioModeButton;\n }\n\n public getStartWithAudioMuted(): boolean {\n return this.StartAudioMuted;\n }\n\n public getStartWithVideoMuted(): boolean {\n return this.StartVideoMuted;\n }\n\n public getDefaultAudioMode(): string {\n return this.defaultAudioMode;\n }\n\n public isRecordingButtonEnabled(): boolean {\n return this.ShowRecordingButton;\n }\n\n public getIdleTimeoutPeriod(): number {\n return this.idleTimeoutPeriod;\n }\n}\n\ntype CallModes =\n (typeof CallConstants.CALL_MODE)[keyof typeof CallConstants.CALL_MODE];\n\nexport class PresenterSettingsBuilder {\n /** @private */ defaultLayout: boolean = true;\n /** @private */ isAudioOnly: boolean = false;\n /** @private */ isPresenter: boolean = false;\n /** @private */ listener: OngoingCallListener;\n /** @private */ ShowEndCallButton: boolean = true;\n /** @private */ ShowSwitchCameraButton: boolean = true;\n /** @private */ ShowMuteAudioButton: boolean = true;\n /** @private */ ShowPauseVideoButton: boolean = true;\n /** @private */ ShowAudioModeButton: boolean = true;\n /** @private */ StartAudioMuted: boolean = false;\n /** @private */ StartVideoMuted: boolean = false;\n /** @private */ defaultAudioMode: (typeof CallConstants.AUDIO_MODE)[keyof typeof CallConstants.AUDIO_MODE];\n /** @private */ ShowRecordingButton: boolean = false;\n /** @private */ idleTimeoutPeriod: number = 180;\n\n /**\n *\n * @param {boolean} defaultLayout\n * This methods shows/hides the default button layout.\n * If set to true the default button layout will be shown.\n * If set to false the default button layout will be hidden.\n * Default value is true\n * @returns\n */\n public enableDefaultLayout(defaultLayout: boolean): this {\n this.defaultLayout = defaultLayout;\n return this;\n }\n\n /**\n *\n * @param {boolean} isAudioOnly\n * This methods sets the type(audio/video) of the call.\n * If set to true, the call will be strictly an audio call.\n * If set to false, the call will be an audio-video call.\n * Default value is false\n * @returns\n */\n public setIsAudioOnlyCall(isAudioOnly: boolean): this {\n this.isAudioOnly = isAudioOnly;\n return this;\n }\n\n /**\n *\n * @param {boolean} isPresenter\n * This methods sets if the user is a presenter.\n * If set to true, the user will be a presenter (allowed to share video/audio).\n * If set to false, the user will not be a presenter (restricted).\n * Default value is false\n * @returns\n */\n public setIsPresenter(isPresenter: boolean): this {\n this.isPresenter = isPresenter;\n return this;\n }\n\n /**\n *\n * @param {OngoingCallListener} listener\n * This method sets the call event listener.\n * @returns\n */\n public setCallEventListener(listener: OngoingCallListener): this {\n this.listener = listener;\n return this;\n }\n\n /**\n *\n * @param {boolean} showEndCallButton\n * This method shows/hides the end call button.\n * If set to true it will display the end call button.\n * If set to false it will hide the end call button.\n * Default value is true.\n * @returns\n */\n public showEndCallButton(showEndCallButton: boolean = true): this {\n this.ShowEndCallButton = showEndCallButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} showSwitchCameraButton\n * This method shows/hides the switch camera button.\n * If set to true it will display the switch camera button.\n * If set to false it will hide the switch camera button.\n * Note: For video call it remains hidden regardless of its value.\n * Default value is true.\n * @returns\n */\n public showSwitchCameraButton(showSwitchCameraButton: boolean = true): this {\n this.ShowSwitchCameraButton = showSwitchCameraButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} showMuteAudioButton\n * This method shows/hides the mute audio button.\n * If set to true it will display the mute audio button.\n * If set to false it will hide the mute audio button.\n * Default value is true.\n * @returns\n */\n public showMuteAudioButton(showMuteAudioButton: boolean = true): this {\n this.ShowMuteAudioButton = showMuteAudioButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} showPauseVideoButton\n * This method shows/hides the pause video button.\n * If set to true it will display the pause video button.\n * If set to false it will hide the pause video button.\n * Note: For video call it remains hidden regardless of its value.\n * Default value is true.\n * @returns\n */\n public showPauseVideoButton(showPauseVideoButton: boolean = true): this {\n this.ShowPauseVideoButton = showPauseVideoButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} showAudioModeButton\n * This method shows/hides the audio mode button.\n * If set to true it will display the audio mode button.\n * If set to false it will hide the audio mode button.\n * Default value is true.\n * @returns\n */\n public showAudioModeButton(showAudioModeButton: boolean = true): this {\n this.ShowAudioModeButton = showAudioModeButton;\n return this;\n }\n\n /**\n *\n * @param {boolean} audioMuted\n * This method allows the call to be started with audio muted.\n * If set to true, the call will start with audio muted.\n * Default value is false.\n * @returns\n */\n public startWithAudioMuted(audioMuted: boolean = false): this {\n this.StartAudioMuted = audioMuted;\n return this;\n }\n\n /**\n *\n * @param {boolean} videoMuted\n * This method allows the call to be started with video muted.\n * If set to true, the call will start with video muted.\n * Note: This method has no effect for audio calls.\n * Default value is false.\n * @returns\n */\n public startWithVideoMuted(videoMuted: boolean = false): this {\n this.StartVideoMuted = videoMuted;\n return this;\n }\n\n /**\n *\n * @param {string} audioMode\n * This method will set the default audio mode.\n * @returns\n */\n public setDefaultAudioMode(\n audioMode: (typeof CallConstants.AUDIO_MODE)[keyof typeof CallConstants.AUDIO_MODE],\n ): this {\n this.defaultAudioMode = audioMode;\n return this;\n }\n\n /**\n *\n * @param {boolean} showRecordingButton\n * This method shows/hides the recording button.\n * If set to true it will display the recording button.\n * If set to false it will hide the recording button.\n * Default value is false.\n * @returns\n */\n public showRecordingButton(showRecordingButton: boolean = false): this {\n this.ShowRecordingButton = showRecordingButton;\n return this;\n }\n\n /**\n *\n * @param {number} idleTimeoutPeriod\n * This method sets the idle timeout period for the call.\n * If set and you are the only one in call, the call will end\n * after the idle timeout period, giving you the option to\n * extend the call 60 seconds before the call ends.\n * Default value is 180 seconds.\n * @returns\n */\n public setIdleTimeoutPeriod(idleTimeoutPeriod: number): this {\n this.idleTimeoutPeriod = idleTimeoutPeriod;\n return this;\n }\n\n /**\n * This method will return an object of the CallSettings class.\n * @returns {PresenterSettings}\n */\n public build(): PresenterSettings {\n return new PresenterSettings(this);\n }\n}\n","import React from 'react';\nimport { View } from 'react-native';\nimport { APIHandler } from '../api';\nimport { GENERAL_ERROR } from '../Constants';\nimport { validateCallAppSettings } from './CallAppSettings';\nimport { CallSettings } from './CallSettings';\nimport { CometChatCalls } from './CometChatCalls';\nimport { CometChatCallsException } from './CometChatCallsException';\nimport { ListenerHandlers } from './ListnerHandler';\nimport { MessageComponent } from './MessageComponent';\nimport { PresenterSettings } from './PresenterSettings';\n\ntype MyState = { shouldLoad: boolean; errored: boolean };\n\nexport class CometChatCallsComponentCore extends React.Component<\n {\n callSettings: CallSettings | PresenterSettings;\n callToken: string;\n presenterMode?: boolean;\n },\n MyState\n> {\n public static ref: any = null;\n callsettings: CallSettings | PresenterSettings;\n constructor(props) {\n super(props);\n this.state = {\n shouldLoad: false,\n errored: false,\n };\n this.callsettings = props.callSettings;\n if (\n !this.callsettings ||\n !(\n this.callsettings instanceof CallSettings ||\n this.callsettings instanceof PresenterSettings\n )\n ) {\n this.state = { ...this.state, errored: true };\n console.error(\n new CometChatCallsException({\n code: GENERAL_ERROR.INVALID_PROP_EXCEPTION.code,\n message: 'Component requires valid callSettings.',\n details: 'Component requires valid callSettings.',\n }),\n );\n return;\n }\n validateCallAppSettings(CometChatCalls.getAppSettings())\n .then(() => {\n if (typeof props.callToken !== 'string' || props.callToken === '') {\n const errToThrow = new CometChatCallsException({\n code: GENERAL_ERROR.INVALID_ARGUMENT_EXCEPTION.code,\n message: 'Invalid callToken passed, please verify.',\n });\n console.error(errToThrow);\n this.callsettings.getCallEventListener()?.onError?.(errToThrow);\n return;\n }\n APIHandler.verifyToken(props.callToken, CometChatCalls.getAppSettings())\n .then(res => {\n if (res?.data?.error?.message) {\n console.error(res.data.error.message);\n this.callsettings.getCallEventListener()?.onError?.(\n new CometChatCallsException({\n code: GENERAL_ERROR.API_ERROR.code,\n message: res?.data?.error?.message,\n }),\n );\n return;\n }\n (this.callsettings as any).user = {\n ...res.data.data.payload.data.user,\n jwt: this.props.callToken,\n };\n (this.callsettings as any).sessionID = res.data.data.payload.room;\n (this.callsettings as any).appId = res.data.data.payload.data.appId;\n (this.callsettings as any).domain =\n res.data.data.settings.WEBRTC_HOST;\n\n if (\n typeof (this.callsettings as any).analyticsSettings !== 'object'\n ) {\n (this.callsettings as any).analyticsSettings = {};\n }\n\n if (res?.data?.data?.settings?.ANALYTICS_HOST) {\n (this.callsettings as any).analyticsSettings.ANALYTICS_HOST =\n res.data.data.settings.ANALYTICS_HOST;\n }\n if (res?.data?.data?.settings?.ANALYTICS_VERSION) {\n (this.callsettings as any).analyticsSettings.ANALYTICS_VERSION =\n res.data.data.settings.ANALYTICS_VERSION;\n }\n if (props.presenterMode) {\n if (res?.data?.data?.settings?.PRESENTER_MODE_ENABLED === true) {\n this.setState({ shouldLoad: true, errored: false });\n } else {\n let err = new CometChatCallsException({\n code: GENERAL_ERROR.ERROR_PRESENTER_MODE.code,\n message: GENERAL_ERROR.ERROR_PRESENTER_MODE.message,\n });\n this.callsettings.getCallEventListener()?.onError?.(err);\n ListenerHandlers?.callHandlers?.map(item => {\n item?.onError?.(err);\n });\n console.error(err);\n this.setState({ shouldLoad: false, errored: true });\n }\n } else {\n this.setState({ shouldLoad: true, errored: false });\n }\n })\n .catch(err => {\n this.callsettings.getCallEventListener()?.onError?.(\n new CometChatCallsException({\n code: GENERAL_ERROR.API_ERROR.code,\n message: 'Unknown API error',\n details: err,\n }),\n );\n console.error(err);\n this.setState({ errored: true });\n });\n })\n .catch(err => {\n console.error(err);\n this.callsettings.getCallEventListener()?.onError?.(\n new CometChatCallsException({\n code: GENERAL_ERROR.API_ERROR.code,\n message: 'Unknown API error',\n details: err,\n }),\n );\n this.setState({ errored: true });\n });\n }\n\n render() {\n if (this.state.errored) {\n return (\n <MessageComponent message=\"Something went wrong! Please check logs for more details.\" />\n );\n }\n if (!this.state.shouldLoad)\n return <MessageComponent message=\"Initializing...\" />;\n return <View style={{ flex: 1, backgroundColor: '#000' }}></View>;\n }\n}\n","import React from 'react';\nimport { PresenterSettings } from './PresenterSettings';\nimport { CometChatCallsException } from './CometChatCallsException';\nimport { GENERAL_ERROR } from '../Constants';\nimport { CometChatCallsComponentCore } from './CometChatCallsComponentCore';\nimport { MessageComponent } from './MessageComponent';\n\ntype MyState = { errored: boolean };\n\nexport class CometChatPresenterComponent extends React.Component<\n { presenterSettings: PresenterSettings; callToken: string },\n MyState\n> {\n constructor(props) {\n super(props);\n this.state = {\n errored: false,\n };\n (this.props.presenterSettings as any).mode = 'PRESENTER';\n if (!(this.props.presenterSettings instanceof PresenterSettings)) {\n this.state = { ...this.state, errored: true };\n console.error(\n new CometChatCallsException({\n code: GENERAL_ERROR.INVALID_PROP_EXCEPTION.code,\n message: 'Component requires valid presenterSettings.',\n details: 'Component requires valid presenterSettings.',\n }),\n );\n }\n }\n\n render() {\n if (this.state.errored) {\n return (\n <MessageComponent message=\"Something went wrong! Please check logs for more details.\" />\n );\n }\n return (\n <CometChatCallsComponentCore\n callSettings={this.props.presenterSettings}\n callToken={this.props.callToken}\n presenterMode={true}\n />\n );\n }\n}\n","import { APIHandler } from '../api';\nimport { MESSAGES_REQUEST_ERRORS } from '../CometChatErrorConstants';\nimport { CallConstants, GENERAL_ERROR } from '../Constants';\nimport { Logger, throwGenericException } from '../Helper';\nimport { AudioMode } from '../types/common';\nimport {\n CallAppSettings,\n CallAppSettingsBuilder,\n validateCallAppSettings,\n} from './CallAppSettings';\nimport { CallGroup } from './CallGroup';\nimport { CallLog } from './CallLog';\nimport { CallSettings, CallSettingsBuilder } from './CallSettings';\nimport { CallUser } from './CallUser';\nimport { CallLogRequestBuilder } from './CometChatCallLogs';\nimport { CometChatCallsComponentCore as CometChatCallsComponent } from './CometChatCallsComponentCore';\nimport { CometChatCallsException } from './CometChatCallsException';\nimport { CometChatPresenterComponent } from './CometChatPresenterComponent';\nimport { ErrorModel } from './ErrorModel';\nimport { OngoingCallListener } from './Listner';\nimport { ListenerHandlers } from './ListnerHandler';\nimport { Participant } from './Participant';\nimport {\n PresenterSettings,\n PresenterSettingsBuilder,\n} from './PresenterSettings';\nimport { Recording } from './Recording';\n\nexport class CometChatCalls {\n private static appSettings: CallAppSettings;\n private static inProgress: boolean = false;\n\n public static CALL_MODE = CallConstants.CALL_MODE;\n public static AUDIO_MODE = CallConstants.AUDIO_MODE;\n public static addCallEventListener = ListenerHandlers.addCallEventListener;\n public static removeCallEventListener =\n ListenerHandlers.removeCallEventListener;\n public static OngoingCallListener = OngoingCallListener;\n public static CallSettingsBuilder = CallSettingsBuilder;\n public static CallSettings = CallSettings;\n public static PresenterSettingsBuilder = PresenterSettingsBuilder;\n public static PresenterSettings = PresenterSettings;\n public static CallAppSettingsBuilder = CallAppSettingsBuilder;\n public static CallAppSettings = CallAppSettings;\n public static Component = CometChatCallsComponent;\n public static PresenterComponent = CometChatPresenterComponent;\n public static CallLogRequestBuilder = CallLogRequestBuilder;\n public static CallLog = CallLog;\n public static CallUser = CallUser;\n public static CallGroup = CallGroup;\n public static Participant = Participant;\n public static Recording = Recording;\n\n public static async generateToken(sessionID: string, authToken: string) {\n await validateCallAppSettings(this.appSettings);\n if (!authToken || !sessionID) {\n throw new CometChatCallsException({\n code: GENERAL_ERROR.INVALID_ARGUMENT_EXCEPTION.code,\n message: 'Authtoken and session is required.',\n });\n }\n const result = await APIHandler.generateToken(\n authToken,\n sessionID,\n this.appSettings,\n );\n if (!result?.data?.data) {\n if (result?.data?.error?.message) {\n throw new CometChatCallsException({\n code: GENERAL_ERROR.API_ERROR.code,\n message: result?.data?.error?.message,\n });\n }\n throw new CometChatCallsException({\n code: GENERAL_ERROR.UNKNOWN_API_ERROR.code,\n message: GENERAL_ERROR.UNKNOWN_API_ERROR.message,\n });\n }\n return result.data.data;\n }\n\n public static async init(appSettings: CallAppSettings) {\n await validateCallAppSettings(appSettings);\n this.appSettings = appSettings;\n APIHandler.setAppSettings(appSettings);\n }\n\n /**\n * Method end on-going call.\n * @returns {void}\n */\n public static endSession() {\n try {\n CometChatCallsComponent?.ref?.endCall();\n } catch (error) {\n Logger.log('CometChatCalls :: endCall', error);\n throwGenericException(error);\n }\n }\n\n /**\n * Method to mute/unmute audio stream.\n * @param {boolean} muteAudio\n * @returns {void}\n */\n public static muteAudio(muteAudio: boolean) {\n try {\n if (muteAudio) {\n CometChatCallsComponent?.ref?.muteAudio();\n } else {\n CometChatCallsComponent?.ref?.unmuteAudio();\n }\n } catch (error) {\n Logger.log('CometChatCalls :: muteAudio', error);\n throwGenericException(error);\n }\n }\n\n /**\n * Method to pause/unpause video stream.\n * @param {boolean} pauseVideo\n * @returns {void}\n */\n public static pauseVideo(pauseVideo: boolean) {\n try {\n if (pauseVideo) {\n CometChatCallsComponent?.ref?.pauseVideo();\n } else {\n CometChatCallsComponent?.ref?.unPauseVideo();\n }\n } catch (error) {\n Logger.log('CometChatCalls :: pauseVideo', error);\n throwGenericException(error);\n }\n }\n\n /**\n * Method to resume video stream.\n * @returns {void}\n */\n public static resumeVideo() {\n try {\n CometChatCallsComponent?.ref?.unPauseVideo();\n } catch (error) {\n Logger.log('CometChatCalls :: resumeVideo', error);\n throwGenericException(error);\n }\n }\n\n /**\n * Method to set audio mode.\n * @param {string} mode\n * @returns {void}\n */\n public static setAudioMode(mode: string) {\n try {\n if (mode) {\n CometChatCallsComponent?.ref?.setAudioMode(mode);\n }\n } catch (error) {\n Logger.log('CometChatCalls :: setAudioMode', error);\n throwGenericException(error);\n }\n }\n\n /**\n * Method to switch camera.\n * @returns {void}\n */\n public static switchCamera() {\n try {\n CometChatCallsComponent?.ref?.switchCamera?.();\n } catch (error) {\n Logger.log('CometChatCalls :: switchCamera', error);\n throwGenericException(error);\n }\n }\n\n /**\n * Method to get all the available audio output devices.\n * @returns {Promise<AudioMode[]>}\n */\n public static getAudioOutputModes(): Promise<AudioMode[]> {\n try {\n return new Promise((resolve, reject) => {\n CometChatCallsComponent?.ref?.getAudioModes().then(\n modesObject => {\n resolve(modesObject);\n },\n error => {\n reject(error);\n },\n );\n });\n } catch (error) {\n Logger.log('CometChatCalls :: getAudioOutputModes', error);\n throwGenericException(error);\n }\n }\n\n /**\n * Method to switch from audio call to video call.\n * @returns {void}\n */\n public static switchToVideoCall() {\n try {\n CometChatCallsComponent?.ref?.switchToVideoCall();\n } catch (error) {\n Logger.log('CometChatCalls :: switchToVideoCall', error);\n throwGenericException(error);\n }\n }\n\n /**\n * Method to Start Call Recording.\n * @returns {void}\n */\n public static startRecording() {\n try {\n CometChatCallsComponent?.ref?.startRecording();\n } catch (error) {\n Logger.log('CometChatCalls :: startRecording', error);\n throwGenericException(error);\n }\n }\n\n /**\n * Method to Stop Call Recording.\n * @returns {void}\n */\n public static stopRecording() {\n try {\n CometChatCallsComponent?.ref?.stopRecording();\n } catch (error) {\n Logger.log('CometChatCalls :: stopRecording', error);\n throwGenericException(error);\n }\n }\n\n /** @internal */\n public static getAppSettings() {\n return this.appSettings;\n }\n\n /**\n * Retrieves call details for a given session ID and auth token.\n * @param sessionID - The session ID of the call.\n * @param authToken - The authentication token required to make the API call.\n * @returns A Promise that resolves to a CallLog object containing the call details.\n * @throws {CometChatCallsException} If there is an error retrieving the call details.\n */\n public static getCallDetails(\n sessionID: string,\n authToken: string,\n ): Promise<Array<CallLog>> {\n return new Promise(async (resolve, reject) => {\n try {\n if (this.inProgress) {\n reject(\n new CometChatCallsException(\n MESSAGES_REQUEST_ERRORS.REQUEST_IN_PROGRESS_ERROR as ErrorModel,\n ),\n );\n this.inProgress = false;\n return;\n }\n\n this.inProgress = true;\n if (!authToken) {\n this.inProgress = false;\n reject(\n new CometChatCallsException({\n code: MESSAGES_REQUEST_ERRORS.NOT_ENOUGH_PARAMS.code,\n message:\n \"`Auth Token` is required to use the 'fetchNext()' method.\",\n }),\n );\n return;\n }\n if (!sessionID) {\n this.inProgress = false;\n reject(\n new CometChatCallsException({\n code: MESSAGES_REQUEST_ERRORS.NOT_ENOUGH_PARAMS.code,\n message:\n \"`Session ID` is required to use the 'fetchNext()' method.\",\n }),\n );\n return;\n }\n try {\n let callDetail = await APIHandler.getCallDetails(\n sessionID,\n authToken,\n );\n if (callDetail?.data?.error) {\n this.inProgress = false;\n reject(\n new CometChatCallsException(callDetail.data.error as ErrorModel),\n );\n return;\n }\n let callLogs: Array<CallLog> = (callDetail?.data?.data || []).map(\n (item: CallLog) => CallLog.callLogFromJson(item),\n );\n resolve(callLogs);\n this.inProgress = false;\n } catch (e) {\n this.inProgress = false;\n reject(new CometChatCallsException(e as ErrorModel));\n }\n } catch (err) {\n this.inProgress = false;\n reject(\n new CometChatCallsException({\n code: 'UNKNOWN ERROR',\n message: 'Unknown error',\n }),\n );\n }\n });\n }\n}\n","/**\n *\n * @module RTCUser\n */\nimport { isFalsy } from '../Helper';\n\nexport class RTCUser {\n private uid: string;\n private avatar: string = '';\n private name: string;\n private jwt: string;\n private resource: string;\n\n constructor(uid: string) {\n if (!isFalsy(uid)) {\n this.uid = uid.toString();\n }\n }\n\n public setUID(uid: string) {\n this.uid = uid ? uid.toString() : '';\n }\n\n public getUID(): string {\n return this.uid.toString();\n }\n\n public setName(name: string) {\n this.name = name ? name.toString() : '';\n }\n\n public getName(): string {\n return this.name.toString();\n }\n\n public setAvatar(avatar: string) {\n this.avatar = avatar ? avatar.toString() : '';\n }\n\n public getAvatar(): string {\n return this.avatar.toString();\n }\n\n public setJWT(jwt: string) {\n this.jwt = jwt ? jwt.toString() : '';\n }\n\n public getJWT(): string {\n return this.jwt.toString();\n }\n\n public setResource(resource: string) {\n this.resource = resource ? resource.toString() : '';\n }\n\n public getResource() {\n return this.resource.toString();\n }\n}\n","import { ListenerHandlers } from './ListnerHandler';\nexport const addCallEventListener = ListenerHandlers.addCallEventListener;\nexport const removeCallEventListener = ListenerHandlers.removeCallEventListener;\n\nexport * from './CallAppSettings';\nexport * from './CometChatCalls';\nexport * from './ErrorModel';\nexport * from './RTCUser';\nexport * from './CometChatCallLogs';\nexport * from './CallLogFilterParams';\n","import {\n AllEvents,\n eventBus,\n SessionMethodsCore,\n WebSDKEvents,\n} from '@cometchat/calls-sdk-core';\nimport * as v from 'valibot';\nimport { CallAppSettings, CallAppSettingsSchema } from './app-settings';\nimport { AppComponent } from './AppRN';\nimport { executeHTTPRequest } from './http-request';\nimport { CallConstants } from './v4/Constants';\nimport {\n CallAppSettingsBuilder,\n CallAppSettings as LegacyCallAppSettings,\n} from './v4/models';\nimport { CallSettingsBuilder } from './v4/models/CallSettings';\nimport { OngoingCallListener } from './v4/models/Listner';\nimport { callVerifyTokenAPI } from './verify-token';\n\ninterface User {\n uid: string;\n name: string;\n status?: string;\n authToken?: string;\n lastActiveAt?: number;\n avatar?: string; // URL to user avatar image\n role?: string;\n hasBlockedMe?: boolean;\n blockedByMe?: boolean;\n deactivatedAt?: number;\n wsChannel?: {\n identity: string;\n };\n jwt?: string;\n // Add other user properties as needed\n}\n\ninterface CometChatException {\n errorCode: string;\n errorDescription: string;\n message?: string;\n}\n\ninterface LoginListener {\n onLoginSuccess?: (user: User) => void;\n onLoginFailure?: (error: CometChatException) => void;\n onLogoutSuccess?: () => void;\n onLogoutFailure?: (error: CometChatException) => void;\n}\n\nexport class CometChatCalls extends SessionMethodsCore {\n private static appSettings: CallAppSettings | null = null;\n private static isInitialized: boolean = false;\n private static loginInProgress: boolean = false;\n private static loggedInUser: User | null = null;\n private static loginListeners: Map<string, LoginListener> = new Map();\n\n public static CALL_MODE = CallConstants.CALL_MODE;\n public static AUDIO_MODE = CallConstants.AUDIO_MODE;\n // public static addCallEventListener = ListenerHandlers.addCallEventListener;\n // public static removeCallEventListener = ListenerHandlers.removeCallEventListener;\n public static OngoingCallListener = OngoingCallListener;\n public static CallSettingsBuilder = CallSettingsBuilder;\n // public static CallSettings = CallSettings;\n // public static PresenterSettingsBuilder = PresenterSettingsBuilder;\n // public static PresenterSettings = PresenterSettings;\n public static CallAppSettingsBuilder = CallAppSettingsBuilder;\n // public static CallAppSettings = CallAppSettings;\n public static Component = AppComponent;\n // public static PresenterComponent = CometChatPresenterComponent;\n // public static CallLogRequestBuilder = CallLogRequestBuilder;\n // public static CallLog = CallLog;\n // public static CallUser = CallUser;\n // public static CallGroup = CallGroup;\n // public static Participant = Participant;\n // public static Recording = Recording;\n\n // Initialize the SDK\n public static async init(\n appSettings: CallAppSettings | LegacyCallAppSettings,\n ) {\n const parsedAppSettings = v.safeParse(CallAppSettingsSchema, appSettings);\n if (!parsedAppSettings.success) {\n console.error(\n 'App settings validation failed:',\n parsedAppSettings.issues,\n );\n return {\n success: false,\n error: {\n name: 'VALIDATION_ERROR',\n message: `Invalid app settings: ${parsedAppSettings.issues.map(issue => issue.message).join(', ')}`,\n timestamp: Date.now(),\n },\n } as const;\n }\n\n this.appSettings = parsedAppSettings.output;\n this.isInitialized = true;\n\n // Check if user was previously logged in (from localStorage/sessionStorage)\n const savedUser = this.getSavedUser();\n if (savedUser) {\n let parsedUser;\n if (typeof savedUser === 'string') {\n try {\n parsedUser = JSON.parse(savedUser);\n } catch (_e) {\n parsedUser = savedUser;\n }\n } else {\n parsedUser = savedUser;\n }\n this.loggedInUser = parsedUser;\n }\n return {\n success: true,\n error: null,\n } as const;\n }\n\n // Login with UID and Auth Key\n public static async login(uid: string, authKey?: string): Promise<User> {\n try {\n // Validation checks\n if (this.loginInProgress) {\n throw {\n errorCode: 'ERROR_LOGIN_IN_PROGRESS',\n errorDescription: 'Login is already in progress',\n };\n }\n\n if (!uid || uid.trim() === '') {\n throw {\n errorCode: 'ERROR_INVALID_UID',\n errorDescription: 'UID cannot be empty',\n };\n }\n\n if (uid.includes(' ')) {\n throw {\n errorCode: 'ERROR_UID_WITH_SPACE',\n errorDescription: 'UID cannot contain spaces',\n };\n }\n\n const resolvedAuthKey = authKey || this.appSettings?.authKey;\n\n if (!resolvedAuthKey || resolvedAuthKey.trim() === '') {\n throw {\n errorCode: 'ERROR_API_KEY_NOT_FOUND',\n errorDescription: 'Auth Key cannot be empty',\n };\n }\n\n if (!this.isInitialized) {\n throw {\n errorCode: 'ERROR_SDK_NOT_INITIALIZED',\n errorDescription: 'SDK not initialized. Call init() first',\n };\n }\n\n this.loginInProgress = true;\n\n // Check if user is already logged in with same UID\n if (\n this.loggedInUser &&\n this.loggedInUser.uid === uid &&\n this.loggedInUser.authToken\n ) {\n this.loginInProgress = false;\n this.notifyLoginSuccess(this.loggedInUser);\n return this.loggedInUser;\n }\n\n // If different user is logged in, logout first\n if (this.loggedInUser && this.loggedInUser.uid !== uid) {\n await this.logoutInternal();\n }\n\n console.log('Logging in user with UID:', uid);\n\n // Perform login API call to get auth token\n const authToken = await this.loginWithUID(uid, resolvedAuthKey);\n\n // Authenticate with the received token to get user details\n const user = await this.authenticateWithToken(authToken);\n\n this.loginInProgress = false;\n this.loggedInUser = user;\n this.saveUser(user);\n this.notifyLoginSuccess(user);\n return user;\n } catch (error) {\n this.loginInProgress = false;\n const cometChatError = this.createError(error);\n this.notifyLoginFailure(cometChatError);\n throw cometChatError;\n }\n }\n\n // Login with auth token directly\n public static async loginWithAuthToken(authToken: string): Promise<User> {\n try {\n if (this.loginInProgress) {\n throw {\n errorCode: 'ERROR_LOGIN_IN_PROGRESS',\n errorDescription: 'Login is already in progress',\n };\n }\n\n if (!authToken || authToken.trim() === '') {\n throw {\n errorCode: 'ERROR_BLANK_AUTHTOKEN',\n errorDescription: 'Auth token cannot be empty',\n };\n }\n\n if (authToken.includes(' ')) {\n throw {\n errorCode: 'ERROR_AUTHTOKEN_WITH_SPACE',\n errorDescription: 'Auth token cannot contain spaces',\n };\n }\n\n this.loginInProgress = true;\n\n // Check if same token is already used\n if (this.loggedInUser && this.loggedInUser.authToken === authToken) {\n this.loginInProgress = false;\n this.notifyLoginSuccess(this.loggedInUser);\n return this.loggedInUser;\n }\n\n // If different user is logged in, logout first\n if (this.loggedInUser && this.loggedInUser.authToken !== authToken) {\n await this.logoutInternal();\n }\n\n const user = await this.authenticateWithToken(authToken);\n\n this.loginInProgress = false;\n this.loggedInUser = user;\n this.saveUser(user);\n this.notifyLoginSuccess(user);\n return user;\n } catch (error) {\n this.loginInProgress = false;\n const cometChatError = this.createError(error);\n this.notifyLoginFailure(cometChatError);\n throw cometChatError;\n }\n }\n\n // Logout functionality\n public static async logout(): Promise<string> {\n try {\n if (!this.loggedInUser) {\n throw {\n errorCode: 'ERROR_NO_USER_LOGGED_IN',\n errorDescription: 'No user is currently logged in',\n };\n }\n\n await this.logoutInternal();\n this.notifyLogoutSuccess();\n return 'Logout successful';\n } catch (error) {\n const cometChatError = this.createError(error);\n this.notifyLogoutFailure(cometChatError);\n throw cometChatError;\n }\n }\n\n // Get logged in user\n public static getLoggedInUser(): User | null {\n // Verify it's always an object\n if (this.loggedInUser && typeof this.loggedInUser === 'string') {\n this.loggedInUser = JSON.parse(this.loggedInUser);\n }\n return this.loggedInUser;\n }\n\n // Get user auth token\n public static getUserAuthToken(): string | null {\n return this.loggedInUser?.authToken || null;\n }\n\n // Check if user is logged in\n public static isUserLoggedIn(): boolean {\n return (\n this.loggedInUser !== null && this.loggedInUser.authToken !== undefined\n );\n }\n\n // Add login listener\n public static addLoginListener(\n listenerId: string,\n listener: LoginListener,\n ): void {\n this.loginListeners.set(listenerId, listener);\n }\n\n // Remove login listener\n public static removeLoginListener(listenerId: string): void {\n this.loginListeners.delete(listenerId);\n }\n\n // Generate token (enhanced to use logged-in user's authToken)\n public static async generateToken(sessionId: string, authToken?: string) {\n try {\n if (!sessionId || sessionId.trim() === '') {\n throw {\n errorCode: 'ERROR_SESSION_ID_MISSING',\n errorDescription: 'Session ID cannot be empty',\n };\n }\n\n // Use provided authToken or get from logged-in user\n const tokenToUse = authToken || this.getUserAuthToken();\n\n if (!tokenToUse) {\n throw {\n errorCode: 'ERROR_AUTH_TOKEN_MISSING',\n errorDescription:\n 'Auth token is required. Please login first or provide authToken.',\n };\n }\n\n if (!this.isInitialized) {\n throw {\n errorCode: 'ERROR_SDK_NOT_INITIALIZED',\n errorDescription: 'SDK not initialized',\n };\n }\n\n // Make API call to generate token\n const token = await this.callGenerateTokenAPI(sessionId, tokenToUse);\n return { token };\n } catch (error) {\n throw this.createError(error);\n }\n }\n\n private static getBaseURL(\n subdomain: 'call' | 'api' | 'apiclient' = 'call',\n ): string {\n if (subdomain === 'call' && this.appSettings?.host) {\n return this.appSettings.host;\n }\n if (subdomain === 'api' && this.appSettings?.adminHost) {\n return this.appSettings.adminHost;\n }\n if (subdomain === 'apiclient' && this.appSettings?.clientHost) {\n return this.appSettings.clientHost;\n }\n const appId = this.appSettings?.appId || '';\n const region = this.appSettings?.region || '';\n const domain = 'cometchat.io';\n return `https://${appId}.${subdomain}-${region}.${domain}/v3.0`;\n }\n\n // Private helper methods\n private static async loginWithUID(\n uid: string,\n authKey: string,\n ): Promise<string> {\n const appId = this.appSettings?.appId || '';\n\n const response = await executeHTTPRequest<{ authToken: string }>({\n baseURL: this.getBaseURL('api'),\n method: 'POST',\n endpoint: `users/${uid}/auth_tokens`,\n headers: {\n 'Content-Type': 'application/json',\n apiKey: authKey,\n appId,\n },\n body: {\n platform: 'web',\n deviceId: this.generateDeviceId(),\n },\n });\n\n if (response.error) {\n throw new Error(`Login failed: ${response.error.message}`);\n }\n\n return response.data.authToken;\n }\n\n private static async authenticateWithToken(authToken: string): Promise<User> {\n const appId = this.appSettings?.appId || '';\n\n const response = await executeHTTPRequest<{\n uid: string;\n name: string;\n status?: string;\n avatar?: string;\n lastActiveAt?: number;\n role?: string;\n jwt?: string;\n }>({\n baseURL: this.getBaseURL('apiclient'),\n method: 'PUT',\n endpoint: 'me',\n headers: {\n 'Content-Type': 'application/json',\n authToken,\n appId,\n },\n body: {\n platform: 'web',\n deviceId: this.generateDeviceId(),\n },\n });\n\n if (response.error) {\n throw new Error(`Authentication failed: ${response.error.message}`);\n }\n\n const data = response.data;\n return {\n uid: data.uid,\n name: data.name,\n authToken: authToken,\n status: data.status || 'online',\n avatar: data.avatar || '',\n lastActiveAt: data.lastActiveAt || Date.now(),\n role: data.role || 'default',\n hasBlockedMe: false,\n blockedByMe: false,\n deactivatedAt: 0,\n wsChannel: {\n identity: `[${appId}]${data.uid}`,\n },\n jwt: data.jwt,\n };\n }\n\n private static async logoutInternal(): Promise<void> {\n if (this.loggedInUser?.authToken) {\n // Make logout API call\n try {\n await executeHTTPRequest({\n baseURL: this.getBaseURL('apiclient'),\n method: 'DELETE',\n endpoint: 'me',\n headers: {\n authToken: this.loggedInUser.authToken,\n appId: this.appSettings?.appId || '',\n },\n });\n } catch (error) {\n console.warn('Logout API call failed:', error);\n }\n }\n\n // Clear local data\n this.loggedInUser = null;\n this.clearSavedUser();\n }\n\n private static async callGenerateTokenAPI(\n sessionId: string,\n authToken: string,\n ): Promise<string> {\n const appId = this.appSettings?.appId || '';\n\n const response = await executeHTTPRequest<{ token: string }>({\n baseURL: this.getBaseURL(),\n method: 'POST',\n endpoint: 'call_tokens',\n headers: {\n 'Content-Type': 'application/json',\n authToken,\n appId,\n },\n body: {\n sessionId,\n },\n });\n\n if (response.error) {\n throw new Error(`Token generation failed: ${response.error.message}`);\n }\n\n return response.data.token;\n }\n\n private static async callVerifyTokenAPI(calltoken: string) {\n return callVerifyTokenAPI({\n appId: this.appSettings?.appId || '',\n region: this.appSettings?.region || '',\n calltoken: calltoken,\n baseURL: this.getBaseURL(),\n });\n }\n\n private static saveUser(user: User): void {\n try {\n const key = `${this.appSettings?.appId}:common_store/user`;\n const userWithDefaults = {\n hasBlockedMe: false,\n blockedByMe: false,\n deactivatedAt: 0,\n ...user,\n role: user.role || 'default',\n wsChannel: user.wsChannel || {\n identity: `[${this.appSettings?.appId}]${user.uid}`,\n },\n };\n localStorage.setItem(key, JSON.stringify(userWithDefaults));\n } catch (error) {\n console.warn('Failed to save user to localStorage:', error);\n }\n }\n\n private static getSavedUser(): string | null {\n try {\n const key = `${this.appSettings?.appId}:common_store/user`;\n const savedUser = localStorage.getItem(key);\n return savedUser ? savedUser : null;\n } catch (error) {\n console.warn('Failed to get saved user from localStorage:', error);\n return null;\n }\n }\n\n private static clearSavedUser(): void {\n try {\n const key = `${this.appSettings?.appId}:common_store/user`;\n localStorage.removeItem(key);\n } catch (error) {\n console.warn('Failed to clear saved user from localStorage:', error);\n }\n }\n\n private static generateDeviceId(): string {\n return 'web_' + Math.random().toString(36).substr(2, 9);\n }\n\n private static createError(error: any): CometChatException {\n if (error.errorCode && error.errorDescription) {\n return error;\n }\n return {\n errorCode: 'ERROR_UNKNOWN',\n errorDescription: error.message || 'An unknown error occurred',\n };\n }\n\n // Notification methods for listeners\n private static notifyLoginSuccess(user: User): void {\n this.loginListeners.forEach(listener => {\n if (listener.onLoginSuccess) {\n try {\n listener.onLoginSuccess(user);\n } catch (error) {\n console.error('Error in login success listener:', error);\n }\n }\n });\n }\n\n private static notifyLoginFailure(error: CometChatException): void {\n this.loginListeners.forEach(listener => {\n if (listener.onLoginFailure) {\n try {\n listener.onLoginFailure(error);\n } catch (err) {\n console.error('Error in login failure listener:', err);\n }\n }\n });\n }\n\n private static notifyLogoutSuccess(): void {\n this.loginListeners.forEach(listener => {\n if (listener.onLogoutSuccess) {\n try {\n listener.onLogoutSuccess();\n } catch (error) {\n console.error('Error in logout success listener:', error);\n }\n }\n });\n }\n\n private static notifyLogoutFailure(error: CometChatException): void {\n this.loginListeners.forEach(listener => {\n if (listener.onLogoutFailure) {\n try {\n listener.onLogoutFailure(error);\n } catch (err) {\n console.error('Error in logout failure listener:', err);\n }\n }\n });\n }\n\n public static addEventListener<K extends keyof WebSDKEvents>(\n eventType: K,\n listener: WebSDKEvents[K],\n ) {\n return eventBus.subscribe(eventType, listener as AllEvents[K]);\n }\n}\n"],"mappings":"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"}
|