From 4dd2aa02ebbd0d13495713c40b3f691861c508c4 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Tue, 17 Feb 2026 14:10:34 -0300 Subject: [PATCH 1/8] refactor(CallView): Simplify call state management and UI components; introduce CallButtons component for action handling --- app/lib/services/voip/useCallStore.ts | 41 +++++---- app/views/CallView/CallView.stories.tsx | 11 --- app/views/CallView/components/CallButtons.tsx | 83 ++++++++++++++++++ .../CallView/components/CallStatusText.tsx | 34 -------- app/views/CallView/components/CallerInfo.tsx | 30 +------ app/views/CallView/index.tsx | 85 +------------------ app/views/CallView/styles.ts | 3 +- 7 files changed, 114 insertions(+), 173 deletions(-) create mode 100644 app/views/CallView/components/CallButtons.tsx delete mode 100644 app/views/CallView/components/CallStatusText.tsx diff --git a/app/lib/services/voip/useCallStore.ts b/app/lib/services/voip/useCallStore.ts index effa08ba00c..f8310cb6d68 100644 --- a/app/lib/services/voip/useCallStore.ts +++ b/app/lib/services/voip/useCallStore.ts @@ -184,21 +184,28 @@ export const useCallStore = create((set, get) => ({ } })); -// Selector hooks for better performance -export const useCallState = () => useCallStore(state => state.callState); +// const isConnecting = callState === 'none' || callState === 'ringing' || callState === 'accepted'; +// const isConnected = callState === 'active'; +export const useCallState = () => { + const callState = useCallStore(state => state.callState); + return callState === 'none' || callState === 'ringing' || callState === 'accepted'; +}; + +// // Selector hooks for better performance +// export const useCallState = () => useCallStore(state => state.callState); export const useCallContact = () => useCallStore(state => state.contact); -export const useCallControls = () => - useCallStore( - useShallow(state => ({ - isMuted: state.isMuted, - isOnHold: state.isOnHold, - isSpeakerOn: state.isSpeakerOn - })) - ); -export const useCallActions = () => - useCallStore(state => ({ - toggleMute: state.toggleMute, - toggleHold: state.toggleHold, - toggleSpeaker: state.toggleSpeaker, - endCall: state.endCall - })); +// export const useCallControls = () => +// useCallStore( +// useShallow(state => ({ +// isMuted: state.isMuted, +// isOnHold: state.isOnHold, +// isSpeakerOn: state.isSpeakerOn +// })) +// ); +// export const useCallActions = () => +// useCallStore(state => ({ +// toggleMute: state.toggleMute, +// toggleHold: state.toggleHold, +// toggleSpeaker: state.toggleSpeaker, +// endCall: state.endCall +// })); diff --git a/app/views/CallView/CallView.stories.tsx b/app/views/CallView/CallView.stories.tsx index d7bbaed81a4..ba192f8fd90 100644 --- a/app/views/CallView/CallView.stories.tsx +++ b/app/views/CallView/CallView.stories.tsx @@ -16,17 +16,6 @@ const styles = StyleSheet.create({ } }); -// Mock navigation -// jest.mock('@react-navigation/native', () => ({ -// ...jest.requireActual('@react-navigation/native'), -// useNavigation: () => ({ -// goBack: () => {} -// }), -// useRoute: () => ({ -// params: { callUUID: 'test-uuid' } -// }) -// })); - // Helper to set store state for stories const setStoreState = (overrides: Partial> = {}) => { const mockCall = { diff --git a/app/views/CallView/components/CallButtons.tsx b/app/views/CallView/components/CallButtons.tsx new file mode 100644 index 00000000000..5eddb2b786d --- /dev/null +++ b/app/views/CallView/components/CallButtons.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { View } from 'react-native'; + +import I18n from '../../../i18n'; +import { useCallStore } from '../../../lib/services/voip/useCallStore'; +import CallActionButton from './CallActionButton'; +import { styles } from '../styles'; +import { useTheme } from '../../../theme'; + +export const CallButtons = () => { + 'use memo'; + + const { colors } = useTheme(); + + const callState = useCallStore(state => state.callState); + const isMuted = useCallStore(state => state.isMuted); + const isOnHold = useCallStore(state => state.isOnHold); + const isSpeakerOn = useCallStore(state => state.isSpeakerOn); + + const toggleMute = useCallStore(state => state.toggleMute); + const toggleHold = useCallStore(state => state.toggleHold); + const toggleSpeaker = useCallStore(state => state.toggleSpeaker); + const endCall = useCallStore(state => state.endCall); + + const isConnecting = callState === 'none' || callState === 'ringing' || callState === 'accepted'; + + const handleMessage = () => { + // TODO: Navigate to chat with caller + // Navigation.navigate('RoomView', { rid, t: 'd' }); + alert('Message'); + }; + + const handleMore = () => { + // TODO: Show action sheet with more options (DTMF, transfer, etc.) + alert('More'); + }; + + const handleEndCall = () => { + endCall(); + }; + + return ( + + + + + + + + + + + + + + ); +}; diff --git a/app/views/CallView/components/CallStatusText.tsx b/app/views/CallView/components/CallStatusText.tsx deleted file mode 100644 index 305c4b66ea1..00000000000 --- a/app/views/CallView/components/CallStatusText.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import { Text } from 'react-native'; - -import I18n from '../../../i18n'; -import { styles } from '../styles'; -import { useCallControls } from '../../../lib/services/voip/useCallStore'; -import { useTheme } from '../../../theme'; - -const CallStatusText = (): React.ReactElement => { - 'use memo'; - - const { isMuted, isOnHold } = useCallControls(); - const { colors } = useTheme(); - - if (isOnHold && isMuted) { - return ( - <> - - {I18n.t('On_hold')}, {I18n.t('Muted')} - - - ); - } - if (isOnHold) { - return {I18n.t('On_hold')}; - } - if (isMuted) { - return {I18n.t('Muted')}; - } - - return  ; -}; - -export default CallStatusText; diff --git a/app/views/CallView/components/CallerInfo.tsx b/app/views/CallView/components/CallerInfo.tsx index c212e454435..32b5d856b7a 100644 --- a/app/views/CallView/components/CallerInfo.tsx +++ b/app/views/CallView/components/CallerInfo.tsx @@ -2,54 +2,28 @@ import React from 'react'; import { Text, View } from 'react-native'; import AvatarContainer from '../../../containers/Avatar'; -import { CustomIcon } from '../../../containers/CustomIcon'; import I18n from '../../../i18n'; import { useCallContact } from '../../../lib/services/voip/useCallStore'; import { styles } from '../styles'; import { useTheme } from '../../../theme'; -// import Status from '../../../containers/Status'; -import sharedStyles from '../../Styles'; -interface ICallerInfo { - isMuted?: boolean; -} - -const CallerInfo = ({ isMuted = false }: ICallerInfo): React.ReactElement => { +const CallerInfo = (): React.ReactElement => { const { colors } = useTheme(); const contact = useCallContact(); const name = contact.displayName || contact.username || I18n.t('Unknown'); - const extension = contact.sipExtension; const avatarText = contact.username || name; return ( - - - {/* */} - - + {name} - {isMuted && ( - - )} - {extension ? ( - - {extension} - - ) : null} ); }; diff --git a/app/views/CallView/index.tsx b/app/views/CallView/index.tsx index 5c455897fad..a6d13848c89 100644 --- a/app/views/CallView/index.tsx +++ b/app/views/CallView/index.tsx @@ -2,33 +2,18 @@ import React, { useEffect } from 'react'; import { View } from 'react-native'; import { activateKeepAwakeAsync, deactivateKeepAwake } from 'expo-keep-awake'; -import I18n from '../../i18n'; import { useCallStore } from '../../lib/services/voip/useCallStore'; import CallerInfo from './components/CallerInfo'; -import CallActionButton from './components/CallActionButton'; -import CallStatusText from './components/CallStatusText'; import { styles } from './styles'; import { useTheme } from '../../theme'; +import { CallButtons } from './components/CallButtons'; const CallView = (): React.ReactElement | null => { 'use memo'; const { colors } = useTheme(); - - // Get state from store const call = useCallStore(state => state.call); - const callState = useCallStore(state => state.callState); - const isMuted = useCallStore(state => state.isMuted); - const isOnHold = useCallStore(state => state.isOnHold); - const isSpeakerOn = useCallStore(state => state.isSpeakerOn); - - // Get actions from store - const toggleMute = useCallStore(state => state.toggleMute); - const toggleHold = useCallStore(state => state.toggleHold); - const toggleSpeaker = useCallStore(state => state.toggleSpeaker); - const endCall = useCallStore(state => state.endCall); - // Keep screen awake during call useEffect(() => { activateKeepAwakeAsync(); return () => { @@ -36,78 +21,14 @@ const CallView = (): React.ReactElement | null => { }; }, []); - const handleMessage = () => { - // TODO: Navigate to chat with caller - // Navigation.navigate('RoomView', { rid, t: 'd' }); - alert('Message'); - }; - - const handleMore = () => { - // TODO: Show action sheet with more options (DTMF, transfer, etc.) - alert('More'); - }; - - const handleEndCall = () => { - endCall(); - }; - if (!call) { return null; } - const isConnecting = callState === 'none' || callState === 'ringing' || callState === 'accepted'; - const isConnected = callState === 'active'; - return ( - {/* Caller Info */} - - - {/* Status Text */} - {isConnected && } - - {/* Action Buttons */} - - {/* First row of buttons */} - - - - - - - {/* Second row of buttons */} - - - - - - + + ); }; diff --git a/app/views/CallView/styles.ts b/app/views/CallView/styles.ts index 484af08e061..a22cd8ab119 100644 --- a/app/views/CallView/styles.ts +++ b/app/views/CallView/styles.ts @@ -50,7 +50,8 @@ export const styles = StyleSheet.create({ textAlign: 'center' }, buttonsContainer: { - padding: 24 + padding: 24, + borderTopWidth: StyleSheet.hairlineWidth }, buttonsRow: { flexDirection: 'row', From 19f7c0389fd6fb4af025c2ef337c3f605519f50b Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Tue, 17 Feb 2026 15:46:40 -0300 Subject: [PATCH 2/8] feat(CallHeader): Introduce Content and Subtitle components; refactor Title component for improved layout and state management --- app/containers/CallHeader/CallHeader.tsx | 7 +-- .../CallHeader/components/Collapse.tsx | 1 + .../CallHeader/components/Content.tsx | 11 ++++ .../CallHeader/components/Subtitle.tsx | 50 +++++++++++++++++++ .../CallHeader/components/Timer.tsx | 2 +- .../CallHeader/components/Title.tsx | 33 ++++++------ app/lib/services/voip/useCallStore.ts | 39 +++++---------- 7 files changed, 94 insertions(+), 49 deletions(-) create mode 100644 app/containers/CallHeader/components/Content.tsx create mode 100644 app/containers/CallHeader/components/Subtitle.tsx diff --git a/app/containers/CallHeader/CallHeader.tsx b/app/containers/CallHeader/CallHeader.tsx index 37f4f2d61ed..ea4960c3cac 100644 --- a/app/containers/CallHeader/CallHeader.tsx +++ b/app/containers/CallHeader/CallHeader.tsx @@ -1,11 +1,12 @@ import { StyleSheet, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { useShallow } from 'zustand/react/shallow'; import { useTheme } from '../../theme'; import Collapse from './components/Collapse'; -import Title from './components/Title'; import EndCall from './components/EndCall'; import { useCallStore } from '../../lib/services/voip/useCallStore'; +import { Content } from './components/Content'; const styles = StyleSheet.create({ header: { @@ -23,13 +24,13 @@ const CallHeader = () => { const { colors } = useTheme(); const insets = useSafeAreaInsets(); + const call = useCallStore(useShallow(state => state.call)); const defaultHeaderStyle = { backgroundColor: colors.surfaceNeutral, paddingTop: insets.top }; - const call = useCallStore(state => state.call); if (!call) { return ; } @@ -37,7 +38,7 @@ const CallHeader = () => { return ( - + <Content /> <EndCall /> </View> ); diff --git a/app/containers/CallHeader/components/Collapse.tsx b/app/containers/CallHeader/components/Collapse.tsx index 6332df73287..31c4d1e689b 100644 --- a/app/containers/CallHeader/components/Collapse.tsx +++ b/app/containers/CallHeader/components/Collapse.tsx @@ -9,6 +9,7 @@ const Collapse = () => { const { colors } = useTheme(); const focused = useCallStore(state => state.focused); const toggleFocus = useCallStore(state => state.toggleFocus); + return ( <HeaderButton.Container left> <HeaderButton.Item diff --git a/app/containers/CallHeader/components/Content.tsx b/app/containers/CallHeader/components/Content.tsx new file mode 100644 index 00000000000..ddae4eb9e10 --- /dev/null +++ b/app/containers/CallHeader/components/Content.tsx @@ -0,0 +1,11 @@ +import { View } from 'react-native'; + +import Title from './Title'; +import Subtitle from './Subtitle'; + +export const Content = () => ( + <View style={{ flex: 1, flexDirection: 'column', justifyContent: 'space-between', alignItems: 'center' }}> + <Title /> + <Subtitle /> + </View> +); diff --git a/app/containers/CallHeader/components/Subtitle.tsx b/app/containers/CallHeader/components/Subtitle.tsx new file mode 100644 index 00000000000..325b1ef7122 --- /dev/null +++ b/app/containers/CallHeader/components/Subtitle.tsx @@ -0,0 +1,50 @@ +import { StyleSheet, Text } from 'react-native'; + +import { useTheme } from '../../../theme'; +import { useCallStore } from '../../../lib/services/voip/useCallStore'; +import I18n from '../../../i18n'; +import sharedStyles from '../../../views/Styles'; + +const styles = StyleSheet.create({ + headerTitle: { + ...sharedStyles.textRegular, + fontSize: 12, + lineHeight: 16 + } +}); + +const Subtitle = () => { + 'use memo'; + + const { colors } = useTheme(); + const contact = useCallStore(state => state.contact); + const extension = contact.sipExtension; + const remoteHeld = useCallStore(state => state.remoteHeld); + const remoteMute = useCallStore(state => state.remoteMute); + const callState = useCallStore(state => state.callState); + const isConnected = callState === 'active'; + + let subtitle = ''; + + if (!isConnected) { + subtitle = I18n.t('Connecting'); + } else { + subtitle = extension ? `${extension} - ` : ''; + const remoteState = []; + remoteState.push(remoteHeld ? I18n.t('On_hold') : ''); + remoteState.push(remoteMute ? I18n.t('Muted') : ''); + subtitle += remoteState.filter(Boolean).join(', '); + } + + if (!subtitle) { + return null; + } + + return ( + <Text style={[styles.headerTitle, { color: colors.fontSecondaryInfo }]} testID='call-view-header-subtitle' numberOfLines={1}> + {subtitle} + </Text> + ); +}; + +export default Subtitle; diff --git a/app/containers/CallHeader/components/Timer.tsx b/app/containers/CallHeader/components/Timer.tsx index fa784cf864e..56981c57da6 100644 --- a/app/containers/CallHeader/components/Timer.tsx +++ b/app/containers/CallHeader/components/Timer.tsx @@ -29,7 +29,7 @@ const Timer = () => { return () => clearInterval(interval); }, [callStartTime]); - return <Text>{formatDuration(duration)}</Text>; + return <Text> - {formatDuration(duration)}</Text>; }; export default Timer; diff --git a/app/containers/CallHeader/components/Title.tsx b/app/containers/CallHeader/components/Title.tsx index 36885607bbe..216c466e4f6 100644 --- a/app/containers/CallHeader/components/Title.tsx +++ b/app/containers/CallHeader/components/Title.tsx @@ -1,13 +1,18 @@ -import { StyleSheet, Text } from 'react-native'; +import { StyleSheet, Text, View } from 'react-native'; import { useTheme } from '../../../theme'; import { useCallStore } from '../../../lib/services/voip/useCallStore'; -import I18n from '../../../i18n'; import sharedStyles from '../../../views/Styles'; import Timer from './Timer'; +import Status from '../../Status'; const styles = StyleSheet.create({ - headerTitle: { + headerTitleContainer: { + flexDirection: 'row', + alignItems: 'center', + gap: 4 + }, + headerTitleText: { ...sharedStyles.textSemibold, fontSize: 16, lineHeight: 24 @@ -23,24 +28,16 @@ const Title = () => { const contact = useCallStore(state => state.contact); const caller = contact.displayName || contact.username; - const isConnecting = callState === 'none' || callState === 'ringing' || callState === 'accepted'; const isConnected = callState === 'active'; - const getHeaderTitle = () => { - if (isConnecting) { - return I18n.t('Connecting'); - } - if (isConnected && callStartTime) { - return `${caller} – `; - } - return caller; - }; - return ( - <Text style={[styles.headerTitle, { color: colors.fontDefault }]} testID='call-view-header-title'> - {getHeaderTitle()} - <Timer /> - </Text> + <View style={styles.headerTitleContainer} testID='call-view-header-title'> + <Status id={contact.id || ''} size={12} /> + <Text style={[styles.headerTitleText, { color: colors.fontDefault }]} numberOfLines={1}> + {caller} + {isConnected && callStartTime ? <Timer /> : null} + </Text> + </View> ); }; diff --git a/app/lib/services/voip/useCallStore.ts b/app/lib/services/voip/useCallStore.ts index f8310cb6d68..b374b5d30aa 100644 --- a/app/lib/services/voip/useCallStore.ts +++ b/app/lib/services/voip/useCallStore.ts @@ -1,16 +1,9 @@ import { create } from 'zustand'; -import { useShallow } from 'zustand/react/shallow'; -import type { CallState, IClientMediaCall } from '@rocket.chat/media-signaling'; +import type { CallState, CallContact, IClientMediaCall } from '@rocket.chat/media-signaling'; import RNCallKeep from 'react-native-callkeep'; import Navigation from '../../navigation/appNavigation'; -interface CallContact { - displayName?: string; - username?: string; - sipExtension?: string; -} - interface CallStoreState { // Call reference call: IClientMediaCall | null; @@ -20,6 +13,8 @@ interface CallStoreState { callState: CallState; isMuted: boolean; isOnHold: boolean; + remoteMute: boolean; + remoteHeld: boolean; isSpeakerOn: boolean; callStartTime: number | null; focused: boolean; @@ -31,7 +26,6 @@ interface CallStoreState { interface CallStoreActions { setCallUUID: (callUUID: string | null) => void; setCall: (call: IClientMediaCall, callUUID: string) => void; - updateFromCall: () => void; toggleMute: () => void; toggleHold: () => void; toggleSpeaker: () => void; @@ -48,10 +42,12 @@ const initialState: CallStoreState = { callState: 'none', isMuted: false, isOnHold: false, + remoteMute: false, + remoteHeld: false, isSpeakerOn: false, callStartTime: null, contact: {}, - focused: false + focused: true }; export const useCallStore = create<CallStore>((set, get) => ({ @@ -69,8 +65,11 @@ export const useCallStore = create<CallStore>((set, get) => ({ callState: call.state, isMuted: call.muted, isOnHold: call.held, + remoteMute: call.remoteMute, + remoteHeld: call.remoteHeld, // isSpeakerOn: call. contact: { + id: call.contact.id, displayName: call.contact.displayName, username: call.contact.username, sipExtension: call.contact.sipExtension @@ -98,7 +97,9 @@ export const useCallStore = create<CallStore>((set, get) => ({ set({ isMuted: currentCall.muted, - isOnHold: currentCall.held + isOnHold: currentCall.held, + remoteMute: currentCall.remoteMute, + remoteHeld: currentCall.remoteHeld }); }; @@ -112,22 +113,6 @@ export const useCallStore = create<CallStore>((set, get) => ({ call.emitter.on('ended', handleEnded); }, - updateFromCall: () => { - const { call } = get(); - if (!call) return; - - set({ - callState: call.state, - isMuted: call.muted, - isOnHold: call.held, - contact: { - displayName: call.contact.displayName, - username: call.contact.username, - sipExtension: call.contact.sipExtension - } - }); - }, - toggleMute: () => { const { call, isMuted } = get(); if (!call) return; From 0803455d72250f175cc9b63c16f0d5620014caec Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Tue, 17 Feb 2026 15:54:09 -0300 Subject: [PATCH 3/8] rename CallHeader -> MediaCallHeader --- app/AppContainer.tsx | 4 ++-- .../CallHeader.tsx => MediaCallHeader/MediaCallHeader.tsx} | 4 ++-- .../{CallHeader => MediaCallHeader}/components/Collapse.tsx | 0 .../{CallHeader => MediaCallHeader}/components/Content.tsx | 0 .../{CallHeader => MediaCallHeader}/components/EndCall.tsx | 0 .../{CallHeader => MediaCallHeader}/components/Subtitle.tsx | 0 .../{CallHeader => MediaCallHeader}/components/Timer.tsx | 0 .../{CallHeader => MediaCallHeader}/components/Title.tsx | 0 8 files changed, 4 insertions(+), 4 deletions(-) rename app/containers/{CallHeader/CallHeader.tsx => MediaCallHeader/MediaCallHeader.tsx} (94%) rename app/containers/{CallHeader => MediaCallHeader}/components/Collapse.tsx (100%) rename app/containers/{CallHeader => MediaCallHeader}/components/Content.tsx (100%) rename app/containers/{CallHeader => MediaCallHeader}/components/EndCall.tsx (100%) rename app/containers/{CallHeader => MediaCallHeader}/components/Subtitle.tsx (100%) rename app/containers/{CallHeader => MediaCallHeader}/components/Timer.tsx (100%) rename app/containers/{CallHeader => MediaCallHeader}/components/Title.tsx (100%) diff --git a/app/AppContainer.tsx b/app/AppContainer.tsx index 8200dcb773f..53701f36def 100644 --- a/app/AppContainer.tsx +++ b/app/AppContainer.tsx @@ -19,7 +19,7 @@ import { ThemeContext } from './theme'; import { setCurrentScreen } from './lib/methods/helpers/log'; import { themes } from './lib/constants/colors'; import { emitter } from './lib/methods/helpers'; -import CallHeader from './containers/CallHeader/CallHeader'; +import MediaCallHeader from './containers/MediaCallHeader/MediaCallHeader'; const createStackNavigator = createNativeStackNavigator; @@ -53,7 +53,7 @@ const App = memo(({ root, isMasterDetail }: { root: string; isMasterDetail: bool return ( <> - <CallHeader /> + <MediaCallHeader /> <NavigationContainer theme={navTheme} ref={Navigation.navigationRef} diff --git a/app/containers/CallHeader/CallHeader.tsx b/app/containers/MediaCallHeader/MediaCallHeader.tsx similarity index 94% rename from app/containers/CallHeader/CallHeader.tsx rename to app/containers/MediaCallHeader/MediaCallHeader.tsx index ea4960c3cac..53360d1a249 100644 --- a/app/containers/CallHeader/CallHeader.tsx +++ b/app/containers/MediaCallHeader/MediaCallHeader.tsx @@ -19,7 +19,7 @@ const styles = StyleSheet.create({ } }); -const CallHeader = () => { +const MediaCallHeader = () => { 'use memo'; const { colors } = useTheme(); @@ -44,4 +44,4 @@ const CallHeader = () => { ); }; -export default CallHeader; +export default MediaCallHeader; diff --git a/app/containers/CallHeader/components/Collapse.tsx b/app/containers/MediaCallHeader/components/Collapse.tsx similarity index 100% rename from app/containers/CallHeader/components/Collapse.tsx rename to app/containers/MediaCallHeader/components/Collapse.tsx diff --git a/app/containers/CallHeader/components/Content.tsx b/app/containers/MediaCallHeader/components/Content.tsx similarity index 100% rename from app/containers/CallHeader/components/Content.tsx rename to app/containers/MediaCallHeader/components/Content.tsx diff --git a/app/containers/CallHeader/components/EndCall.tsx b/app/containers/MediaCallHeader/components/EndCall.tsx similarity index 100% rename from app/containers/CallHeader/components/EndCall.tsx rename to app/containers/MediaCallHeader/components/EndCall.tsx diff --git a/app/containers/CallHeader/components/Subtitle.tsx b/app/containers/MediaCallHeader/components/Subtitle.tsx similarity index 100% rename from app/containers/CallHeader/components/Subtitle.tsx rename to app/containers/MediaCallHeader/components/Subtitle.tsx diff --git a/app/containers/CallHeader/components/Timer.tsx b/app/containers/MediaCallHeader/components/Timer.tsx similarity index 100% rename from app/containers/CallHeader/components/Timer.tsx rename to app/containers/MediaCallHeader/components/Timer.tsx diff --git a/app/containers/CallHeader/components/Title.tsx b/app/containers/MediaCallHeader/components/Title.tsx similarity index 100% rename from app/containers/CallHeader/components/Title.tsx rename to app/containers/MediaCallHeader/components/Title.tsx From 2791f64bd019fb49563b916a48c7be4286b36773 Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Tue, 17 Feb 2026 16:38:36 -0300 Subject: [PATCH 4/8] Fix subtitle logic --- app/containers/MediaCallHeader/components/Subtitle.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/containers/MediaCallHeader/components/Subtitle.tsx b/app/containers/MediaCallHeader/components/Subtitle.tsx index 325b1ef7122..364886e31b6 100644 --- a/app/containers/MediaCallHeader/components/Subtitle.tsx +++ b/app/containers/MediaCallHeader/components/Subtitle.tsx @@ -29,10 +29,11 @@ const Subtitle = () => { if (!isConnected) { subtitle = I18n.t('Connecting'); } else { - subtitle = extension ? `${extension} - ` : ''; + subtitle = extension ? `${extension}` : ''; const remoteState = []; - remoteState.push(remoteHeld ? I18n.t('On_hold') : ''); - remoteState.push(remoteMute ? I18n.t('Muted') : ''); + remoteState.push(remoteHeld ? I18n.t('On_hold') : null); + remoteState.push(remoteMute ? I18n.t('Muted') : null); + subtitle += remoteState.filter(Boolean).length > 0 && extension ? ' - ' : ''; subtitle += remoteState.filter(Boolean).join(', '); } From 5efdc7bd29a94d811f45f147bc1e39ffea6e8a3b Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Tue, 17 Feb 2026 17:29:07 -0300 Subject: [PATCH 5/8] Add nav to room mock to MediaCallHeader --- .../MediaCallHeader/components/Content.tsx | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/app/containers/MediaCallHeader/components/Content.tsx b/app/containers/MediaCallHeader/components/Content.tsx index ddae4eb9e10..e4c8f0e054d 100644 --- a/app/containers/MediaCallHeader/components/Content.tsx +++ b/app/containers/MediaCallHeader/components/Content.tsx @@ -1,11 +1,22 @@ -import { View } from 'react-native'; +import { Pressable, StyleSheet, View } from 'react-native'; import Title from './Title'; import Subtitle from './Subtitle'; +const styles = StyleSheet.create({ + container: { + flex: 1, + flexDirection: 'column', + justifyContent: 'space-between', + alignItems: 'center' + } +}); + export const Content = () => ( - <View style={{ flex: 1, flexDirection: 'column', justifyContent: 'space-between', alignItems: 'center' }}> - <Title /> - <Subtitle /> - </View> + <Pressable onPress={() => alert('nav to call room')}> + <View style={styles.container}> + <Title /> + <Subtitle /> + </View> + </Pressable> ); From d3cd9aca52610382c146d88540dcb8731899cdc3 Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Tue, 17 Feb 2026 17:43:23 -0300 Subject: [PATCH 6/8] Align left --- app/containers/MediaCallHeader/MediaCallHeader.tsx | 3 +-- app/containers/MediaCallHeader/components/Content.tsx | 8 ++++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/containers/MediaCallHeader/MediaCallHeader.tsx b/app/containers/MediaCallHeader/MediaCallHeader.tsx index 53360d1a249..fe966d7f26f 100644 --- a/app/containers/MediaCallHeader/MediaCallHeader.tsx +++ b/app/containers/MediaCallHeader/MediaCallHeader.tsx @@ -13,8 +13,7 @@ const styles = StyleSheet.create({ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', - paddingHorizontal: 12, - paddingBottom: 4, + padding: 12, borderBottomWidth: StyleSheet.hairlineWidth } }); diff --git a/app/containers/MediaCallHeader/components/Content.tsx b/app/containers/MediaCallHeader/components/Content.tsx index e4c8f0e054d..7809fd9a10f 100644 --- a/app/containers/MediaCallHeader/components/Content.tsx +++ b/app/containers/MediaCallHeader/components/Content.tsx @@ -4,16 +4,20 @@ import Title from './Title'; import Subtitle from './Subtitle'; const styles = StyleSheet.create({ + button: { + flex: 1, + paddingHorizontal: 4 + }, container: { flex: 1, flexDirection: 'column', justifyContent: 'space-between', - alignItems: 'center' + alignItems: 'flex-start' } }); export const Content = () => ( - <Pressable onPress={() => alert('nav to call room')}> + <Pressable onPress={() => alert('nav to call room')} style={styles.button}> <View style={styles.container}> <Title /> <Subtitle /> From a48bf11f1caf9db9e82fc203bbf4417244cdc90d Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Tue, 17 Feb 2026 18:08:17 -0300 Subject: [PATCH 7/8] Add unit tests --- .../MediaCallHeader.stories.tsx | 104 + .../MediaCallHeader/MediaCallHeader.test.tsx | 172 ++ .../MediaCallHeader/MediaCallHeader.tsx | 9 +- .../MediaCallHeader.test.tsx.snap | 2094 +++++++++++++++++ .../MediaCallHeader/components/Collapse.tsx | 1 + .../MediaCallHeader/components/Content.tsx | 4 +- .../MediaCallHeader/components/EndCall.tsx | 8 +- app/views/CallView/CallView.stories.tsx | 6 +- .../__snapshots__/index.test.tsx.snap | 447 +--- .../components/CallerInfo.stories.tsx | 12 +- .../CallView/components/CallerInfo.test.tsx | 52 +- .../__snapshots__/CallerInfo.test.tsx.snap | 533 +---- app/views/CallView/index.test.tsx | 11 +- 13 files changed, 2462 insertions(+), 991 deletions(-) create mode 100644 app/containers/MediaCallHeader/MediaCallHeader.stories.tsx create mode 100644 app/containers/MediaCallHeader/MediaCallHeader.test.tsx create mode 100644 app/containers/MediaCallHeader/__snapshots__/MediaCallHeader.test.tsx.snap diff --git a/app/containers/MediaCallHeader/MediaCallHeader.stories.tsx b/app/containers/MediaCallHeader/MediaCallHeader.stories.tsx new file mode 100644 index 00000000000..ea8b5618ae2 --- /dev/null +++ b/app/containers/MediaCallHeader/MediaCallHeader.stories.tsx @@ -0,0 +1,104 @@ +import React from 'react'; +import { View, StyleSheet } from 'react-native'; + +import MediaCallHeader from './MediaCallHeader'; +import { useCallStore } from '../../lib/services/voip/useCallStore'; + +const styles = StyleSheet.create({ + container: { + flex: 1 + } +}); + +const mockCallStartTime = 1713340800000; + +// Helper to set store state for stories +const setStoreState = (overrides: Partial<ReturnType<typeof useCallStore.getState>> = {}) => { + const mockCall = { + state: 'active', + muted: false, + held: false, + contact: { + displayName: 'Bob Burnquist', + username: 'bob.burnquist', + sipExtension: '2244' + }, + setMuted: () => {}, + setHeld: () => {}, + hangup: () => {}, + reject: () => {}, + emitter: { + on: () => {}, + off: () => {} + } + } as any; + + useCallStore.setState({ + call: mockCall, + callUUID: 'test-uuid', + callState: 'active', + isMuted: false, + isOnHold: false, + isSpeakerOn: false, + callStartTime: mockCallStartTime, + contact: { + id: 'user-1', + displayName: 'Bob Burnquist', + username: 'bob.burnquist', + sipExtension: '2244' + }, + focused: true, + remoteMute: false, + remoteHeld: false, + ...overrides + }); +}; + +const Wrapper = ({ children }: { children: React.ReactNode }) => <View style={styles.container}>{children}</View>; + +export default { + title: 'MediaCallHeader', + component: MediaCallHeader, + decorators: [ + (Story: React.ComponentType) => ( + <Wrapper> + <Story /> + </Wrapper> + ) + ] +}; + +export const NoCall = () => { + useCallStore.setState({ call: null }); + return <MediaCallHeader />; +}; + +export const ActiveCall = () => { + setStoreState({ callState: 'active', callStartTime: mockCallStartTime }); + return <MediaCallHeader />; +}; + +export const ConnectingCall = () => { + setStoreState({ callState: 'accepted', callStartTime: null }); + return <MediaCallHeader />; +}; + +export const Focused = () => { + setStoreState({ focused: true }); + return <MediaCallHeader />; +}; + +export const Collapsed = () => { + setStoreState({ focused: false }); + return <MediaCallHeader />; +}; + +export const WithRemoteHeld = () => { + setStoreState({ callState: 'active', remoteHeld: true }); + return <MediaCallHeader />; +}; + +export const WithRemoteMuted = () => { + setStoreState({ callState: 'active', remoteMute: true }); + return <MediaCallHeader />; +}; diff --git a/app/containers/MediaCallHeader/MediaCallHeader.test.tsx b/app/containers/MediaCallHeader/MediaCallHeader.test.tsx new file mode 100644 index 00000000000..c63e829ac9e --- /dev/null +++ b/app/containers/MediaCallHeader/MediaCallHeader.test.tsx @@ -0,0 +1,172 @@ +import React from 'react'; +import { fireEvent, render } from '@testing-library/react-native'; +import { Provider } from 'react-redux'; + +import MediaCallHeader from './MediaCallHeader'; +import { useCallStore } from '../../lib/services/voip/useCallStore'; +import { mockedStore } from '../../reducers/mockedStore'; +import * as stories from './MediaCallHeader.stories'; +import { generateSnapshots } from '../../../.rnstorybook/generateSnapshots'; + +// Mock alert +global.alert = jest.fn(); + +// Helper to create a mock call +const createMockCall = (overrides: Record<string, unknown> = {}) => ({ + state: 'active', + muted: false, + held: false, + contact: { + displayName: 'Bob Burnquist', + username: 'bob.burnquist', + sipExtension: '2244' + }, + setMuted: jest.fn(), + setHeld: jest.fn(), + hangup: jest.fn(), + reject: jest.fn(), + emitter: { + on: jest.fn(), + off: jest.fn() + }, + ...overrides +}); + +// Helper to set store state for tests +const setStoreState = (overrides: Partial<ReturnType<typeof useCallStore.getState>> = {}) => { + const mockCall = createMockCall(); + useCallStore.setState({ + call: mockCall as any, + callUUID: 'test-uuid', + callState: 'active', + isMuted: false, + isOnHold: false, + isSpeakerOn: false, + callStartTime: Date.now(), + contact: { + id: 'user-1', + displayName: 'Bob Burnquist', + username: 'bob.burnquist', + sipExtension: '2244' + }, + focused: true, + remoteMute: false, + remoteHeld: false, + ...overrides + }); +}; + +const Wrapper = ({ children }: { children: React.ReactNode }) => ( + <Provider store={mockedStore}>{children}</Provider> +); + +describe('MediaCallHeader', () => { + beforeEach(() => { + useCallStore.getState().reset(); + jest.clearAllMocks(); + }); + + it('should render empty placeholder when there is no call', () => { + useCallStore.setState({ call: null }); + const { getByTestId, queryByTestId } = render( + <Wrapper> + <MediaCallHeader /> + </Wrapper> + ); + + expect(getByTestId('media-call-header-empty')).toBeTruthy(); + expect(queryByTestId('media-call-header')).toBeNull(); + expect(queryByTestId('media-call-header-collapse')).toBeNull(); + expect(queryByTestId('media-call-header-content')).toBeNull(); + expect(queryByTestId('media-call-header-end')).toBeNull(); + }); + + it('should render full header when call exists', () => { + setStoreState(); + const { getByTestId } = render( + <Wrapper> + <MediaCallHeader /> + </Wrapper> + ); + + expect(getByTestId('media-call-header')).toBeTruthy(); + expect(getByTestId('media-call-header-collapse')).toBeTruthy(); + expect(getByTestId('media-call-header-content')).toBeTruthy(); + expect(getByTestId('media-call-header-end')).toBeTruthy(); + }); + + it('should show caller name in Title', () => { + setStoreState({ + contact: { + id: 'user-1', + displayName: 'Alice Smith', + username: 'alice.smith', + sipExtension: '1234' + } + }); + const { getByTestId, getByText } = render( + <Wrapper> + <MediaCallHeader /> + </Wrapper> + ); + + expect(getByTestId('call-view-header-title')).toBeTruthy(); + // Title renders name plus optional Timer in nested Text; match by regex + expect(getByText(/Alice Smith/)).toBeTruthy(); + }); + + it('should show subtitle when connecting', () => { + setStoreState({ callState: 'ringing' }); + const { getByTestId } = render( + <Wrapper> + <MediaCallHeader /> + </Wrapper> + ); + + expect(getByTestId('call-view-header-subtitle')).toBeTruthy(); + }); + + it('should call toggleFocus when collapse button is pressed', () => { + setStoreState(); + const toggleFocus = jest.fn(); + useCallStore.setState({ toggleFocus }); + + const { getByTestId } = render( + <Wrapper> + <MediaCallHeader /> + </Wrapper> + ); + + fireEvent.press(getByTestId('media-call-header-collapse')); + expect(toggleFocus).toHaveBeenCalledTimes(1); + }); + + it('should call endCall when end button is pressed', () => { + setStoreState(); + const endCall = jest.fn(); + useCallStore.setState({ endCall }); + + const { getByTestId } = render( + <Wrapper> + <MediaCallHeader /> + </Wrapper> + ); + + fireEvent.press(getByTestId('media-call-header-end')); + expect(endCall).toHaveBeenCalledTimes(1); + }); + + it('should show alert when content is pressed', () => { + setStoreState(); + const { getByTestId } = render( + <Wrapper> + <MediaCallHeader /> + </Wrapper> + ); + + fireEvent.press(getByTestId('media-call-header-content')); + expect(global.alert).toHaveBeenCalledWith('nav to call room'); + }); +}); + +generateSnapshots(stories); diff --git a/app/containers/MediaCallHeader/MediaCallHeader.tsx b/app/containers/MediaCallHeader/MediaCallHeader.tsx index fe966d7f26f..a3a0fa3ad14 100644 --- a/app/containers/MediaCallHeader/MediaCallHeader.tsx +++ b/app/containers/MediaCallHeader/MediaCallHeader.tsx @@ -13,7 +13,7 @@ const styles = StyleSheet.create({ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', - padding: 12, + paddingHorizontal: 12, borderBottomWidth: StyleSheet.hairlineWidth } }); @@ -27,15 +27,16 @@ const MediaCallHeader = () => { const defaultHeaderStyle = { backgroundColor: colors.surfaceNeutral, - paddingTop: insets.top + paddingTop: insets.top + 12, + paddingBottom: 12 }; if (!call) { - return <View style={defaultHeaderStyle} />; + return <View style={defaultHeaderStyle} testID='media-call-header-empty' />; } return ( - <View style={[styles.header, { ...defaultHeaderStyle, borderBottomColor: colors.strokeLight }]}> + <View style={[styles.header, { ...defaultHeaderStyle, borderBottomColor: colors.strokeLight }]} testID='media-call-header'> <Collapse /> <Content /> <EndCall /> diff --git a/app/containers/MediaCallHeader/__snapshots__/MediaCallHeader.test.tsx.snap b/app/containers/MediaCallHeader/__snapshots__/MediaCallHeader.test.tsx.snap new file mode 100644 index 00000000000..46805f06c9a --- /dev/null +++ b/app/containers/MediaCallHeader/__snapshots__/MediaCallHeader.test.tsx.snap @@ -0,0 +1,2094 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Story Snapshots: ActiveCall should match snapshot 1`] = ` +<View + style={ + { + "flex": 1, + } + } +> + <View + style={ + [ + { + "alignItems": "center", + "borderBottomWidth": 0.5, + "flexDirection": "row", + "justifyContent": "space-between", + "paddingHorizontal": 12, + }, + { + "backgroundColor": "#E4E7EA", + "borderBottomColor": "#CBCED1", + "paddingBottom": 12, + "paddingTop": 12, + }, + ] + } + testID="media-call-header" + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginLeft": -5, + "marginRight": 0, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={13} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-collapse" + > + <View + accessibilityLabel="[missing "en.Minimize" translation]" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#2F343D", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + <View + accessibilityState={ + { + "busy": undefined, + "checked": undefined, + "disabled": undefined, + "expanded": undefined, + "selected": undefined, + } + } + accessibilityValue={ + { + "max": undefined, + "min": undefined, + "now": undefined, + "text": undefined, + } + } + accessible={true} + collapsable={false} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + style={ + { + "flex": 1, + "paddingHorizontal": 4, + } + } + testID="media-call-header-content" + > + <View + style={ + { + "alignItems": "flex-start", + "flex": 1, + "flexDirection": "column", + "justifyContent": "space-evenly", + } + } + > + <View + style={ + { + "alignItems": "center", + "flexDirection": "row", + "gap": 4, + } + } + testID="call-view-header-title" + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#6C727A", + "fontSize": 12, + }, + [ + { + "lineHeight": 12, + }, + [ + { + "height": 12, + "textAlignVertical": "center", + "width": 12, + }, + undefined, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "600", + "lineHeight": 24, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + ] + } + > + Bob Burnquist + <Text> + - + 16117:18:53 + </Text> + </Text> + </View> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#6C727A", + }, + ] + } + testID="call-view-header-subtitle" + > + 2244 + </Text> + </View> + </View> + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginRight": -5, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={14} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-end" + > + <View + accessibilityLabel="End" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#D40C26", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + </View> +</View> +`; + +exports[`Story Snapshots: Collapsed should match snapshot 1`] = ` +<View + style={ + { + "flex": 1, + } + } +> + <View + style={ + [ + { + "alignItems": "center", + "borderBottomWidth": 0.5, + "flexDirection": "row", + "justifyContent": "space-between", + "paddingHorizontal": 12, + }, + { + "backgroundColor": "#E4E7EA", + "borderBottomColor": "#CBCED1", + "paddingBottom": 12, + "paddingTop": 12, + }, + ] + } + testID="media-call-header" + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginLeft": -5, + "marginRight": 0, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={15} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-collapse" + > + <View + accessibilityLabel="[missing "en.Minimize" translation]" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#2F343D", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + <View + accessibilityState={ + { + "busy": undefined, + "checked": undefined, + "disabled": undefined, + "expanded": undefined, + "selected": undefined, + } + } + accessibilityValue={ + { + "max": undefined, + "min": undefined, + "now": undefined, + "text": undefined, + } + } + accessible={true} + collapsable={false} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + style={ + { + "flex": 1, + "paddingHorizontal": 4, + } + } + testID="media-call-header-content" + > + <View + style={ + { + "alignItems": "flex-start", + "flex": 1, + "flexDirection": "column", + "justifyContent": "space-evenly", + } + } + > + <View + style={ + { + "alignItems": "center", + "flexDirection": "row", + "gap": 4, + } + } + testID="call-view-header-title" + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#6C727A", + "fontSize": 12, + }, + [ + { + "lineHeight": 12, + }, + [ + { + "height": 12, + "textAlignVertical": "center", + "width": 12, + }, + undefined, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "600", + "lineHeight": 24, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + ] + } + > + Bob Burnquist + <Text> + - + 16117:18:53 + </Text> + </Text> + </View> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#6C727A", + }, + ] + } + testID="call-view-header-subtitle" + > + 2244 + </Text> + </View> + </View> + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginRight": -5, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={16} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-end" + > + <View + accessibilityLabel="End" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#D40C26", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + </View> +</View> +`; + +exports[`Story Snapshots: ConnectingCall should match snapshot 1`] = ` +<View + style={ + { + "flex": 1, + } + } +> + <View + style={ + [ + { + "alignItems": "center", + "borderBottomWidth": 0.5, + "flexDirection": "row", + "justifyContent": "space-between", + "paddingHorizontal": 12, + }, + { + "backgroundColor": "#E4E7EA", + "borderBottomColor": "#CBCED1", + "paddingBottom": 12, + "paddingTop": 12, + }, + ] + } + testID="media-call-header" + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginLeft": -5, + "marginRight": 0, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={17} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-collapse" + > + <View + accessibilityLabel="[missing "en.Minimize" translation]" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#2F343D", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + <View + accessibilityState={ + { + "busy": undefined, + "checked": undefined, + "disabled": undefined, + "expanded": undefined, + "selected": undefined, + } + } + accessibilityValue={ + { + "max": undefined, + "min": undefined, + "now": undefined, + "text": undefined, + } + } + accessible={true} + collapsable={false} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + style={ + { + "flex": 1, + "paddingHorizontal": 4, + } + } + testID="media-call-header-content" + > + <View + style={ + { + "alignItems": "flex-start", + "flex": 1, + "flexDirection": "column", + "justifyContent": "space-evenly", + } + } + > + <View + style={ + { + "alignItems": "center", + "flexDirection": "row", + "gap": 4, + } + } + testID="call-view-header-title" + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#6C727A", + "fontSize": 12, + }, + [ + { + "lineHeight": 12, + }, + [ + { + "height": 12, + "textAlignVertical": "center", + "width": 12, + }, + undefined, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "600", + "lineHeight": 24, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + ] + } + > + Bob Burnquist + </Text> + </View> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#6C727A", + }, + ] + } + testID="call-view-header-subtitle" + > + Connecting... + </Text> + </View> + </View> + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginRight": -5, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={18} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-end" + > + <View + accessibilityLabel="End" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#D40C26", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + </View> +</View> +`; + +exports[`Story Snapshots: Focused should match snapshot 1`] = ` +<View + style={ + { + "flex": 1, + } + } +> + <View + style={ + [ + { + "alignItems": "center", + "borderBottomWidth": 0.5, + "flexDirection": "row", + "justifyContent": "space-between", + "paddingHorizontal": 12, + }, + { + "backgroundColor": "#E4E7EA", + "borderBottomColor": "#CBCED1", + "paddingBottom": 12, + "paddingTop": 12, + }, + ] + } + testID="media-call-header" + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginLeft": -5, + "marginRight": 0, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={19} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-collapse" + > + <View + accessibilityLabel="[missing "en.Minimize" translation]" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#2F343D", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + <View + accessibilityState={ + { + "busy": undefined, + "checked": undefined, + "disabled": undefined, + "expanded": undefined, + "selected": undefined, + } + } + accessibilityValue={ + { + "max": undefined, + "min": undefined, + "now": undefined, + "text": undefined, + } + } + accessible={true} + collapsable={false} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + style={ + { + "flex": 1, + "paddingHorizontal": 4, + } + } + testID="media-call-header-content" + > + <View + style={ + { + "alignItems": "flex-start", + "flex": 1, + "flexDirection": "column", + "justifyContent": "space-evenly", + } + } + > + <View + style={ + { + "alignItems": "center", + "flexDirection": "row", + "gap": 4, + } + } + testID="call-view-header-title" + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#6C727A", + "fontSize": 12, + }, + [ + { + "lineHeight": 12, + }, + [ + { + "height": 12, + "textAlignVertical": "center", + "width": 12, + }, + undefined, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "600", + "lineHeight": 24, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + ] + } + > + Bob Burnquist + <Text> + - + 16117:18:53 + </Text> + </Text> + </View> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#6C727A", + }, + ] + } + testID="call-view-header-subtitle" + > + 2244 + </Text> + </View> + </View> + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginRight": -5, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={20} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-end" + > + <View + accessibilityLabel="End" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#D40C26", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + </View> +</View> +`; + +exports[`Story Snapshots: NoCall should match snapshot 1`] = ` +<View + style={ + { + "flex": 1, + } + } +> + <View + style={ + { + "backgroundColor": "#E4E7EA", + "paddingBottom": 12, + "paddingTop": 12, + } + } + testID="media-call-header-empty" + /> +</View> +`; + +exports[`Story Snapshots: WithRemoteHeld should match snapshot 1`] = ` +<View + style={ + { + "flex": 1, + } + } +> + <View + style={ + [ + { + "alignItems": "center", + "borderBottomWidth": 0.5, + "flexDirection": "row", + "justifyContent": "space-between", + "paddingHorizontal": 12, + }, + { + "backgroundColor": "#E4E7EA", + "borderBottomColor": "#CBCED1", + "paddingBottom": 12, + "paddingTop": 12, + }, + ] + } + testID="media-call-header" + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginLeft": -5, + "marginRight": 0, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={21} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-collapse" + > + <View + accessibilityLabel="[missing "en.Minimize" translation]" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#2F343D", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + <View + accessibilityState={ + { + "busy": undefined, + "checked": undefined, + "disabled": undefined, + "expanded": undefined, + "selected": undefined, + } + } + accessibilityValue={ + { + "max": undefined, + "min": undefined, + "now": undefined, + "text": undefined, + } + } + accessible={true} + collapsable={false} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + style={ + { + "flex": 1, + "paddingHorizontal": 4, + } + } + testID="media-call-header-content" + > + <View + style={ + { + "alignItems": "flex-start", + "flex": 1, + "flexDirection": "column", + "justifyContent": "space-evenly", + } + } + > + <View + style={ + { + "alignItems": "center", + "flexDirection": "row", + "gap": 4, + } + } + testID="call-view-header-title" + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#6C727A", + "fontSize": 12, + }, + [ + { + "lineHeight": 12, + }, + [ + { + "height": 12, + "textAlignVertical": "center", + "width": 12, + }, + undefined, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "600", + "lineHeight": 24, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + ] + } + > + Bob Burnquist + <Text> + - + 16117:18:53 + </Text> + </Text> + </View> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#6C727A", + }, + ] + } + testID="call-view-header-subtitle" + > + 2244 - On hold + </Text> + </View> + </View> + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginRight": -5, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={22} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-end" + > + <View + accessibilityLabel="End" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#D40C26", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + </View> +</View> +`; + +exports[`Story Snapshots: WithRemoteMuted should match snapshot 1`] = ` +<View + style={ + { + "flex": 1, + } + } +> + <View + style={ + [ + { + "alignItems": "center", + "borderBottomWidth": 0.5, + "flexDirection": "row", + "justifyContent": "space-between", + "paddingHorizontal": 12, + }, + { + "backgroundColor": "#E4E7EA", + "borderBottomColor": "#CBCED1", + "paddingBottom": 12, + "paddingTop": 12, + }, + ] + } + testID="media-call-header" + > + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginLeft": -5, + "marginRight": 0, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={23} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-collapse" + > + <View + accessibilityLabel="[missing "en.Minimize" translation]" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#2F343D", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + <View + accessibilityState={ + { + "busy": undefined, + "checked": undefined, + "disabled": undefined, + "expanded": undefined, + "selected": undefined, + } + } + accessibilityValue={ + { + "max": undefined, + "min": undefined, + "now": undefined, + "text": undefined, + } + } + accessible={true} + collapsable={false} + focusable={true} + onBlur={[Function]} + onClick={[Function]} + onFocus={[Function]} + onResponderGrant={[Function]} + onResponderMove={[Function]} + onResponderRelease={[Function]} + onResponderTerminate={[Function]} + onResponderTerminationRequest={[Function]} + onStartShouldSetResponder={[Function]} + style={ + { + "flex": 1, + "paddingHorizontal": 4, + } + } + testID="media-call-header-content" + > + <View + style={ + { + "alignItems": "flex-start", + "flex": 1, + "flexDirection": "column", + "justifyContent": "space-evenly", + } + } + > + <View + style={ + { + "alignItems": "center", + "flexDirection": "row", + "gap": 4, + } + } + testID="call-view-header-title" + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#6C727A", + "fontSize": 12, + }, + [ + { + "lineHeight": 12, + }, + [ + { + "height": 12, + "textAlignVertical": "center", + "width": 12, + }, + undefined, + ], + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 16, + "fontWeight": "600", + "lineHeight": 24, + "textAlign": "left", + }, + { + "color": "#2F343D", + }, + ] + } + > + Bob Burnquist + <Text> + - + 16117:18:53 + </Text> + </Text> + </View> + <Text + numberOfLines={1} + style={ + [ + { + "backgroundColor": "transparent", + "fontFamily": "Inter", + "fontSize": 12, + "fontWeight": "400", + "lineHeight": 16, + "textAlign": "left", + }, + { + "color": "#6C727A", + }, + ] + } + testID="call-view-header-subtitle" + > + 2244 - Muted + </Text> + </View> + </View> + <View + style={ + [ + { + "alignItems": "center", + "flexDirection": "row", + "justifyContent": "center", + }, + { + "marginRight": -5, + }, + {}, + ] + } + > + <RNGestureHandlerButton + activeOpacity={0.3} + borderless={true} + collapsable={false} + delayLongPress={600} + enabled={true} + handlerTag={24} + handlerType="NativeViewGestureHandler" + hitSlop={ + { + "bottom": 5, + "left": 5, + "right": 5, + "top": 5, + } + } + innerRef={null} + onActiveStateChange={[Function]} + onGestureHandlerEvent={[Function]} + onGestureHandlerStateChange={[Function]} + onPress={[MockFunction]} + style={ + [ + { + "opacity": 1, + "padding": 6, + }, + { + "cursor": undefined, + }, + ] + } + testID="media-call-header-end" + > + <View + accessibilityLabel="End" + accessible={true} + style={ + { + "opacity": 1, + } + } + > + <Text + allowFontScaling={false} + selectable={false} + style={ + [ + { + "color": "#D40C26", + "fontSize": 24, + }, + [ + { + "lineHeight": 24, + }, + undefined, + ], + { + "fontFamily": "custom", + "fontStyle": "normal", + "fontWeight": "normal", + }, + {}, + ] + } + > +  + </Text> + </View> + </RNGestureHandlerButton> + </View> + </View> +</View> +`; diff --git a/app/containers/MediaCallHeader/components/Collapse.tsx b/app/containers/MediaCallHeader/components/Collapse.tsx index 31c4d1e689b..1ad769c30c4 100644 --- a/app/containers/MediaCallHeader/components/Collapse.tsx +++ b/app/containers/MediaCallHeader/components/Collapse.tsx @@ -13,6 +13,7 @@ const Collapse = () => { return ( <HeaderButton.Container left> <HeaderButton.Item + testID='media-call-header-collapse' accessibilityLabel={I18n.t('Minimize')} onPress={toggleFocus} iconName={focused ? 'arrow-collapse' : 'arrow-expand'} diff --git a/app/containers/MediaCallHeader/components/Content.tsx b/app/containers/MediaCallHeader/components/Content.tsx index 7809fd9a10f..566918a42c2 100644 --- a/app/containers/MediaCallHeader/components/Content.tsx +++ b/app/containers/MediaCallHeader/components/Content.tsx @@ -11,13 +11,13 @@ const styles = StyleSheet.create({ container: { flex: 1, flexDirection: 'column', - justifyContent: 'space-between', + justifyContent: 'space-evenly', alignItems: 'flex-start' } }); export const Content = () => ( - <Pressable onPress={() => alert('nav to call room')} style={styles.button}> + <Pressable testID='media-call-header-content' onPress={() => alert('nav to call room')} style={styles.button}> <View style={styles.container}> <Title /> <Subtitle /> diff --git a/app/containers/MediaCallHeader/components/EndCall.tsx b/app/containers/MediaCallHeader/components/EndCall.tsx index 09f4caa10b3..9ba0968a3d0 100644 --- a/app/containers/MediaCallHeader/components/EndCall.tsx +++ b/app/containers/MediaCallHeader/components/EndCall.tsx @@ -10,7 +10,13 @@ const EndCall = () => { const endCall = useCallStore(state => state.endCall); return ( <HeaderButton.Container> - <HeaderButton.Item accessibilityLabel={I18n.t('End')} onPress={endCall} iconName='phone-end' color={colors.fontDanger} /> + <HeaderButton.Item + testID='media-call-header-end' + accessibilityLabel={I18n.t('End')} + onPress={endCall} + iconName='phone-end' + color={colors.fontDanger} + /> </HeaderButton.Container> ); }; diff --git a/app/views/CallView/CallView.stories.tsx b/app/views/CallView/CallView.stories.tsx index ba192f8fd90..1fe80b664df 100644 --- a/app/views/CallView/CallView.stories.tsx +++ b/app/views/CallView/CallView.stories.tsx @@ -16,6 +16,8 @@ const styles = StyleSheet.create({ } }); +const mockCallStartTime = 1713340800000; + // Helper to set store state for stories const setStoreState = (overrides: Partial<ReturnType<typeof useCallStore.getState>> = {}) => { const mockCall = { @@ -44,7 +46,7 @@ const setStoreState = (overrides: Partial<ReturnType<typeof useCallStore.getStat isMuted: false, isOnHold: false, isSpeakerOn: false, - callStartTime: Date.now(), + callStartTime: mockCallStartTime, contact: { displayName: 'Bob Burnquist', username: 'bob.burnquist', @@ -83,7 +85,7 @@ export default { }; export const ConnectedCall = () => { - setStoreState({ callState: 'active', callStartTime: new Date().getTime() - 61000 }); + setStoreState({ callState: 'active', callStartTime: mockCallStartTime - 61000 }); return <CallView />; }; diff --git a/app/views/CallView/__snapshots__/index.test.tsx.snap b/app/views/CallView/__snapshots__/index.test.tsx.snap index b0404418151..703e4a6d0c6 100644 --- a/app/views/CallView/__snapshots__/index.test.tsx.snap +++ b/app/views/CallView/__snapshots__/index.test.tsx.snap @@ -46,7 +46,7 @@ exports[`Story Snapshots: ConnectedCall should match snapshot 1`] = ` style={ [ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, }, @@ -56,7 +56,7 @@ exports[`Story Snapshots: ConnectedCall should match snapshot 1`] = ` testID="avatar" > <ViewManagerAdapter_ExpoImage - borderRadius={16} + borderRadius={2} containerViewRef={"[React.ref]"} contentFit="cover" contentPosition={ @@ -83,7 +83,7 @@ exports[`Story Snapshots: ConnectedCall should match snapshot 1`] = ` } style={ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, } @@ -91,21 +91,6 @@ exports[`Story Snapshots: ConnectedCall should match snapshot 1`] = ` transition={null} width={120} /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> </View> </View> <View @@ -140,47 +125,18 @@ exports[`Story Snapshots: ConnectedCall should match snapshot 1`] = ` Bob Burnquist </Text> </View> - <Text - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "marginBottom": 8, - "textAlign": "center", - }, - { - "color": "#6C727A", - }, - ] - } - testID="caller-info-extension" - > - 2244 - </Text> </View> - <Text - style={ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "textAlign": "center", - } - } - > -   - </Text> <View style={ - { - "padding": 24, - } + [ + { + "borderTopWidth": 0.5, + "padding": 24, + }, + { + "borderTopColor": "#EBECEF", + }, + ] } > <View @@ -842,7 +798,7 @@ exports[`Story Snapshots: ConnectingCall should match snapshot 1`] = ` style={ [ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, }, @@ -852,7 +808,7 @@ exports[`Story Snapshots: ConnectingCall should match snapshot 1`] = ` testID="avatar" > <ViewManagerAdapter_ExpoImage - borderRadius={16} + borderRadius={2} containerViewRef={"[React.ref]"} contentFit="cover" contentPosition={ @@ -879,7 +835,7 @@ exports[`Story Snapshots: ConnectingCall should match snapshot 1`] = ` } style={ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, } @@ -887,21 +843,6 @@ exports[`Story Snapshots: ConnectingCall should match snapshot 1`] = ` transition={null} width={120} /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> </View> </View> <View @@ -936,33 +877,18 @@ exports[`Story Snapshots: ConnectingCall should match snapshot 1`] = ` Bob Burnquist </Text> </View> - <Text - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "marginBottom": 8, - "textAlign": "center", - }, - { - "color": "#6C727A", - }, - ] - } - testID="caller-info-extension" - > - 2244 - </Text> </View> <View style={ - { - "padding": 24, - } + [ + { + "borderTopWidth": 0.5, + "padding": 24, + }, + { + "borderTopColor": "#EBECEF", + }, + ] } > <View @@ -1628,7 +1554,7 @@ exports[`Story Snapshots: MutedAndOnHold should match snapshot 1`] = ` style={ [ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, }, @@ -1638,7 +1564,7 @@ exports[`Story Snapshots: MutedAndOnHold should match snapshot 1`] = ` testID="avatar" > <ViewManagerAdapter_ExpoImage - borderRadius={16} + borderRadius={2} containerViewRef={"[React.ref]"} contentFit="cover" contentPosition={ @@ -1665,7 +1591,7 @@ exports[`Story Snapshots: MutedAndOnHold should match snapshot 1`] = ` } style={ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, } @@ -1673,21 +1599,6 @@ exports[`Story Snapshots: MutedAndOnHold should match snapshot 1`] = ` transition={null} width={120} /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> </View> </View> <View @@ -1721,93 +1632,20 @@ exports[`Story Snapshots: MutedAndOnHold should match snapshot 1`] = ` > Bob Burnquist </Text> - <Text - allowFontScaling={false} - selectable={false} - style={ - [ - { - "color": "#D40C26", - "fontSize": NaN, - }, - [ - { - "lineHeight": NaN, - }, - { - "marginLeft": 8, - }, - ], - { - "fontFamily": "custom", - "fontStyle": "normal", - "fontWeight": "normal", - }, - {}, - ] - } - testID="caller-info-muted" - > -  - </Text> </View> - <Text - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "marginBottom": 8, - "textAlign": "center", - }, - { - "color": "#6C727A", - }, - ] - } - testID="caller-info-extension" - > - 2244 - </Text> </View> - <Text + <View style={ [ { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "textAlign": "center", + "borderTopWidth": 0.5, + "padding": 24, }, { - "color": "#2F343D", + "borderTopColor": "#EBECEF", }, ] } - > - On hold - , - <Text - style={ - { - "color": "#8E6300", - } - } - > - Muted - </Text> - </Text> - <View - style={ - { - "padding": 24, - } - } > <View style={ @@ -2468,7 +2306,7 @@ exports[`Story Snapshots: MutedCall should match snapshot 1`] = ` style={ [ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, }, @@ -2478,7 +2316,7 @@ exports[`Story Snapshots: MutedCall should match snapshot 1`] = ` testID="avatar" > <ViewManagerAdapter_ExpoImage - borderRadius={16} + borderRadius={2} containerViewRef={"[React.ref]"} contentFit="cover" contentPosition={ @@ -2505,7 +2343,7 @@ exports[`Story Snapshots: MutedCall should match snapshot 1`] = ` } style={ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, } @@ -2513,21 +2351,6 @@ exports[`Story Snapshots: MutedCall should match snapshot 1`] = ` transition={null} width={120} /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> </View> </View> <View @@ -2561,83 +2384,20 @@ exports[`Story Snapshots: MutedCall should match snapshot 1`] = ` > Bob Burnquist </Text> - <Text - allowFontScaling={false} - selectable={false} - style={ - [ - { - "color": "#D40C26", - "fontSize": NaN, - }, - [ - { - "lineHeight": NaN, - }, - { - "marginLeft": 8, - }, - ], - { - "fontFamily": "custom", - "fontStyle": "normal", - "fontWeight": "normal", - }, - {}, - ] - } - testID="caller-info-muted" - > -  - </Text> </View> - <Text - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "marginBottom": 8, - "textAlign": "center", - }, - { - "color": "#6C727A", - }, - ] - } - testID="caller-info-extension" - > - 2244 - </Text> </View> - <Text + <View style={ [ { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "textAlign": "center", + "borderTopWidth": 0.5, + "padding": 24, }, { - "color": "#8E6300", + "borderTopColor": "#EBECEF", }, ] } - > - Muted - </Text> - <View - style={ - { - "padding": 24, - } - } > <View style={ @@ -3298,7 +3058,7 @@ exports[`Story Snapshots: OnHoldCall should match snapshot 1`] = ` style={ [ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, }, @@ -3308,7 +3068,7 @@ exports[`Story Snapshots: OnHoldCall should match snapshot 1`] = ` testID="avatar" > <ViewManagerAdapter_ExpoImage - borderRadius={16} + borderRadius={2} containerViewRef={"[React.ref]"} contentFit="cover" contentPosition={ @@ -3335,7 +3095,7 @@ exports[`Story Snapshots: OnHoldCall should match snapshot 1`] = ` } style={ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, } @@ -3343,21 +3103,6 @@ exports[`Story Snapshots: OnHoldCall should match snapshot 1`] = ` transition={null} width={120} /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> </View> </View> <View @@ -3392,53 +3137,19 @@ exports[`Story Snapshots: OnHoldCall should match snapshot 1`] = ` Bob Burnquist </Text> </View> - <Text - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "marginBottom": 8, - "textAlign": "center", - }, - { - "color": "#6C727A", - }, - ] - } - testID="caller-info-extension" - > - 2244 - </Text> </View> - <Text + <View style={ [ { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "textAlign": "center", + "borderTopWidth": 0.5, + "padding": 24, }, { - "color": "#2F343D", + "borderTopColor": "#EBECEF", }, ] } - > - On hold - </Text> - <View - style={ - { - "padding": 24, - } - } > <View style={ @@ -4099,7 +3810,7 @@ exports[`Story Snapshots: SpeakerOn should match snapshot 1`] = ` style={ [ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, }, @@ -4109,7 +3820,7 @@ exports[`Story Snapshots: SpeakerOn should match snapshot 1`] = ` testID="avatar" > <ViewManagerAdapter_ExpoImage - borderRadius={16} + borderRadius={2} containerViewRef={"[React.ref]"} contentFit="cover" contentPosition={ @@ -4136,7 +3847,7 @@ exports[`Story Snapshots: SpeakerOn should match snapshot 1`] = ` } style={ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, } @@ -4144,21 +3855,6 @@ exports[`Story Snapshots: SpeakerOn should match snapshot 1`] = ` transition={null} width={120} /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> </View> </View> <View @@ -4193,47 +3889,18 @@ exports[`Story Snapshots: SpeakerOn should match snapshot 1`] = ` Bob Burnquist </Text> </View> - <Text - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "marginBottom": 8, - "textAlign": "center", - }, - { - "color": "#6C727A", - }, - ] - } - testID="caller-info-extension" - > - 2244 - </Text> </View> - <Text - style={ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "textAlign": "center", - } - } - > -   - </Text> <View style={ - { - "padding": 24, - } + [ + { + "borderTopWidth": 0.5, + "padding": 24, + }, + { + "borderTopColor": "#EBECEF", + }, + ] } > <View diff --git a/app/views/CallView/components/CallerInfo.stories.tsx b/app/views/CallView/components/CallerInfo.stories.tsx index 595229ac548..c24c3ac1184 100644 --- a/app/views/CallView/components/CallerInfo.stories.tsx +++ b/app/views/CallView/components/CallerInfo.stories.tsx @@ -23,8 +23,7 @@ const setStoreState = (contact: { displayName?: string; username?: string; sipEx callState: 'active', isMuted: false, isOnHold: false, - isSpeakerOn: false, - callStartTime: Date.now() + isSpeakerOn: false }); }; @@ -45,15 +44,6 @@ export default { export const Default = () => <CallerInfo />; -export const WithOnlineStatus = () => <CallerInfo />; - -export const WithMutedIndicator = () => <CallerInfo isMuted />; - -export const NoExtension = () => { - setStoreState({ displayName: 'Alice Attali', username: 'alice.attali' }); - return <CallerInfo />; -}; - export const UsernameOnly = () => { setStoreState({ username: 'john.doe' }); return <CallerInfo />; diff --git a/app/views/CallView/components/CallerInfo.test.tsx b/app/views/CallView/components/CallerInfo.test.tsx index 7bd8bd55586..c411cfa5a3d 100644 --- a/app/views/CallView/components/CallerInfo.test.tsx +++ b/app/views/CallView/components/CallerInfo.test.tsx @@ -8,6 +8,8 @@ import { mockedStore } from '../../../reducers/mockedStore'; import * as stories from './CallerInfo.stories'; import { generateSnapshots } from '../../../../.rnstorybook/generateSnapshots'; +const mockCallStartTime = 1713340800000; + // Helper to set store state for tests const setStoreState = (contact: { displayName?: string; username?: string; sipExtension?: string }) => { useCallStore.setState({ @@ -18,7 +20,7 @@ const setStoreState = (contact: { displayName?: string; username?: string; sipEx isMuted: false, isOnHold: false, isSpeakerOn: false, - callStartTime: Date.now() + callStartTime: mockCallStartTime }); }; @@ -39,7 +41,6 @@ describe('CallerInfo', () => { expect(getByTestId('caller-info')).toBeTruthy(); expect(getByText('Bob Burnquist')).toBeTruthy(); - expect(getByText('2244')).toBeTruthy(); }); it('should render with username when no display name', () => { @@ -52,53 +53,6 @@ describe('CallerInfo', () => { expect(getByText('john.doe')).toBeTruthy(); }); - - it('should render status container (Status component is currently commented out)', () => { - setStoreState({ displayName: 'Test User' }); - const { getByTestId } = render( - <Wrapper> - <CallerInfo /> - </Wrapper> - ); - - // The status container exists but Status component is commented out - // Verify the component renders correctly - expect(getByTestId('caller-info')).toBeTruthy(); - expect(getByTestId('avatar')).toBeTruthy(); - }); - - it('should show muted indicator when isMuted is true', () => { - setStoreState({ displayName: 'Test User' }); - const { getByTestId } = render( - <Wrapper> - <CallerInfo isMuted /> - </Wrapper> - ); - - expect(getByTestId('caller-info-muted')).toBeTruthy(); - }); - - it('should not show muted indicator when isMuted is false', () => { - setStoreState({ displayName: 'Test User' }); - const { queryByTestId } = render( - <Wrapper> - <CallerInfo isMuted={false} /> - </Wrapper> - ); - - expect(queryByTestId('caller-info-muted')).toBeNull(); - }); - - it('should not show extension when not provided', () => { - setStoreState({ displayName: 'Test User' }); - const { queryByTestId } = render( - <Wrapper> - <CallerInfo /> - </Wrapper> - ); - - expect(queryByTestId('caller-info-extension')).toBeNull(); - }); }); generateSnapshots(stories); diff --git a/app/views/CallView/components/__snapshots__/CallerInfo.test.tsx.snap b/app/views/CallView/components/__snapshots__/CallerInfo.test.tsx.snap index a4633b97130..145e5f98944 100644 --- a/app/views/CallView/components/__snapshots__/CallerInfo.test.tsx.snap +++ b/app/views/CallView/components/__snapshots__/CallerInfo.test.tsx.snap @@ -35,7 +35,7 @@ exports[`Story Snapshots: Default should match snapshot 1`] = ` style={ [ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, }, @@ -45,7 +45,7 @@ exports[`Story Snapshots: Default should match snapshot 1`] = ` testID="avatar" > <ViewManagerAdapter_ExpoImage - borderRadius={16} + borderRadius={2} containerViewRef={"[React.ref]"} contentFit="cover" contentPosition={ @@ -72,7 +72,7 @@ exports[`Story Snapshots: Default should match snapshot 1`] = ` } style={ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, } @@ -80,21 +80,6 @@ exports[`Story Snapshots: Default should match snapshot 1`] = ` transition={null} width={120} /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> </View> </View> <View @@ -129,160 +114,6 @@ exports[`Story Snapshots: Default should match snapshot 1`] = ` Bob Burnquist </Text> </View> - <Text - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "marginBottom": 8, - "textAlign": "center", - }, - { - "color": "#6C727A", - }, - ] - } - testID="caller-info-extension" - > - 2244 - </Text> - </View> -</View> -`; - -exports[`Story Snapshots: NoExtension should match snapshot 1`] = ` -<View - style={ - { - "flex": 1, - "minHeight": 300, - "padding": 24, - } - } -> - <View - style={ - { - "alignItems": "center", - "flex": 1, - "justifyContent": "center", - "paddingHorizontal": 24, - } - } - testID="caller-info" - > - <View - style={ - { - "marginBottom": 16, - "position": "relative", - } - } - > - <View - accessibilityLabel="alice.attali's avatar" - accessible={true} - style={ - [ - { - "borderRadius": 16, - "height": 120, - "width": 120, - }, - undefined, - ] - } - testID="avatar" - > - <ViewManagerAdapter_ExpoImage - borderRadius={16} - containerViewRef={"[React.ref]"} - contentFit="cover" - contentPosition={ - { - "left": "50%", - "top": "50%", - } - } - height={120} - nativeViewRef={"[React.ref]"} - onError={[Function]} - onLoad={[Function]} - onLoadStart={[Function]} - onProgress={[Function]} - placeholder={[]} - priority="high" - source={ - [ - { - "headers": undefined, - "uri": "https://open.rocket.chat/avatar/alice.attali?format=png&size=240", - }, - ] - } - style={ - { - "borderRadius": 16, - "height": 120, - "width": 120, - } - } - transition={null} - width={120} - /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> - </View> - </View> - <View - style={ - { - "alignItems": "center", - "flexDirection": "row", - "justifyContent": "center", - } - } - > - <Text - numberOfLines={1} - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 24, - "fontWeight": "700", - "lineHeight": 32, - "marginBottom": 4, - "textAlign": "center", - }, - { - "color": "#2F343D", - }, - ] - } - testID="caller-info-name" - > - Alice Attali - </Text> - </View> </View> </View> `; @@ -322,7 +153,7 @@ exports[`Story Snapshots: UsernameOnly should match snapshot 1`] = ` style={ [ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, }, @@ -332,7 +163,7 @@ exports[`Story Snapshots: UsernameOnly should match snapshot 1`] = ` testID="avatar" > <ViewManagerAdapter_ExpoImage - borderRadius={16} + borderRadius={2} containerViewRef={"[React.ref]"} contentFit="cover" contentPosition={ @@ -359,7 +190,7 @@ exports[`Story Snapshots: UsernameOnly should match snapshot 1`] = ` } style={ { - "borderRadius": 16, + "borderRadius": 2, "height": 120, "width": 120, } @@ -367,21 +198,6 @@ exports[`Story Snapshots: UsernameOnly should match snapshot 1`] = ` transition={null} width={120} /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> </View> </View> <View @@ -419,340 +235,3 @@ exports[`Story Snapshots: UsernameOnly should match snapshot 1`] = ` </View> </View> `; - -exports[`Story Snapshots: WithMutedIndicator should match snapshot 1`] = ` -<View - style={ - { - "flex": 1, - "minHeight": 300, - "padding": 24, - } - } -> - <View - style={ - { - "alignItems": "center", - "flex": 1, - "justifyContent": "center", - "paddingHorizontal": 24, - } - } - testID="caller-info" - > - <View - style={ - { - "marginBottom": 16, - "position": "relative", - } - } - > - <View - accessibilityLabel="bob.burnquist's avatar" - accessible={true} - style={ - [ - { - "borderRadius": 16, - "height": 120, - "width": 120, - }, - undefined, - ] - } - testID="avatar" - > - <ViewManagerAdapter_ExpoImage - borderRadius={16} - containerViewRef={"[React.ref]"} - contentFit="cover" - contentPosition={ - { - "left": "50%", - "top": "50%", - } - } - height={120} - nativeViewRef={"[React.ref]"} - onError={[Function]} - onLoad={[Function]} - onLoadStart={[Function]} - onProgress={[Function]} - placeholder={[]} - priority="high" - source={ - [ - { - "headers": undefined, - "uri": "https://open.rocket.chat/avatar/bob.burnquist?format=png&size=240", - }, - ] - } - style={ - { - "borderRadius": 16, - "height": 120, - "width": 120, - } - } - transition={null} - width={120} - /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> - </View> - </View> - <View - style={ - { - "alignItems": "center", - "flexDirection": "row", - "justifyContent": "center", - } - } - > - <Text - numberOfLines={1} - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 24, - "fontWeight": "700", - "lineHeight": 32, - "marginBottom": 4, - "textAlign": "center", - }, - { - "color": "#2F343D", - }, - ] - } - testID="caller-info-name" - > - Bob Burnquist - </Text> - <Text - allowFontScaling={false} - selectable={false} - style={ - [ - { - "color": "#D40C26", - "fontSize": 20, - }, - [ - { - "lineHeight": 20, - }, - { - "marginLeft": 8, - }, - ], - { - "fontFamily": "custom", - "fontStyle": "normal", - "fontWeight": "normal", - }, - {}, - ] - } - testID="caller-info-muted" - > -  - </Text> - </View> - <Text - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "marginBottom": 8, - "textAlign": "center", - }, - { - "color": "#6C727A", - }, - ] - } - testID="caller-info-extension" - > - 2244 - </Text> - </View> -</View> -`; - -exports[`Story Snapshots: WithOnlineStatus should match snapshot 1`] = ` -<View - style={ - { - "flex": 1, - "minHeight": 300, - "padding": 24, - } - } -> - <View - style={ - { - "alignItems": "center", - "flex": 1, - "justifyContent": "center", - "paddingHorizontal": 24, - } - } - testID="caller-info" - > - <View - style={ - { - "marginBottom": 16, - "position": "relative", - } - } - > - <View - accessibilityLabel="bob.burnquist's avatar" - accessible={true} - style={ - [ - { - "borderRadius": 16, - "height": 120, - "width": 120, - }, - undefined, - ] - } - testID="avatar" - > - <ViewManagerAdapter_ExpoImage - borderRadius={16} - containerViewRef={"[React.ref]"} - contentFit="cover" - contentPosition={ - { - "left": "50%", - "top": "50%", - } - } - height={120} - nativeViewRef={"[React.ref]"} - onError={[Function]} - onLoad={[Function]} - onLoadStart={[Function]} - onProgress={[Function]} - placeholder={[]} - priority="high" - source={ - [ - { - "headers": undefined, - "uri": "https://open.rocket.chat/avatar/bob.burnquist?format=png&size=240", - }, - ] - } - style={ - { - "borderRadius": 16, - "height": 120, - "width": 120, - } - } - transition={null} - width={120} - /> - <View - style={ - [ - { - "borderRadius": 10, - "bottom": -2, - "position": "absolute", - "right": -2, - }, - { - "backgroundColor": "#F2F3F5", - }, - ] - } - /> - </View> - </View> - <View - style={ - { - "alignItems": "center", - "flexDirection": "row", - "justifyContent": "center", - } - } - > - <Text - numberOfLines={1} - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 24, - "fontWeight": "700", - "lineHeight": 32, - "marginBottom": 4, - "textAlign": "center", - }, - { - "color": "#2F343D", - }, - ] - } - testID="caller-info-name" - > - Bob Burnquist - </Text> - </View> - <Text - style={ - [ - { - "backgroundColor": "transparent", - "fontFamily": "Inter", - "fontSize": 18, - "fontWeight": "400", - "lineHeight": 26, - "marginBottom": 8, - "textAlign": "center", - }, - { - "color": "#6C727A", - }, - ] - } - testID="caller-info-extension" - > - 2244 - </Text> - </View> -</View> -`; diff --git a/app/views/CallView/index.test.tsx b/app/views/CallView/index.test.tsx index 66316d13e3e..f4e12d61268 100644 --- a/app/views/CallView/index.test.tsx +++ b/app/views/CallView/index.test.tsx @@ -287,7 +287,7 @@ describe('CallView', () => { expect(getByText('End')).toBeTruthy(); }); - it('should show muted indicator when call is muted and active', () => { + it('should render call view when call is muted and active', () => { setStoreState({ callState: 'active', isMuted: true }); const { getByTestId } = render( <Wrapper> @@ -295,18 +295,19 @@ describe('CallView', () => { </Wrapper> ); - expect(getByTestId('caller-info-muted')).toBeTruthy(); + expect(getByTestId('caller-info')).toBeTruthy(); + expect(getByTestId('call-view-mute')).toBeTruthy(); }); - it('should not show muted indicator when call is muted but not active', () => { + it('should render call view when call is muted but not yet active', () => { setStoreState({ callState: 'ringing', isMuted: true }); - const { queryByTestId } = render( + const { getByTestId } = render( <Wrapper> <CallView /> </Wrapper> ); - expect(queryByTestId('caller-info-muted')).toBeNull(); + expect(getByTestId('caller-info')).toBeTruthy(); }); it('should show correct icon for speaker button when speaker is on', () => { From f3c153557a5f9e3d5dda4993f16c07a35fd50cf4 Mon Sep 17 00:00:00 2001 From: Diego Mello <diegolmello@gmail.com> Date: Wed, 18 Feb 2026 16:31:25 -0300 Subject: [PATCH 8/8] toggle speaker working --- app/lib/services/voip/useCallStore.ts | 28 +- ios/Podfile.lock | 6 + ios/RocketChatRN.xcodeproj/project.pbxproj | 320 +++++++++++---------- package.json | 1 + yarn.lock | 5 + 5 files changed, 199 insertions(+), 161 deletions(-) diff --git a/app/lib/services/voip/useCallStore.ts b/app/lib/services/voip/useCallStore.ts index b374b5d30aa..c0b9a7568f8 100644 --- a/app/lib/services/voip/useCallStore.ts +++ b/app/lib/services/voip/useCallStore.ts @@ -1,6 +1,7 @@ import { create } from 'zustand'; import type { CallState, CallContact, IClientMediaCall } from '@rocket.chat/media-signaling'; import RNCallKeep from 'react-native-callkeep'; +import InCallManager from 'react-native-incall-manager'; import Navigation from '../../navigation/appNavigation'; @@ -77,6 +78,12 @@ export const useCallStore = create<CallStore>((set, get) => ({ callStartTime: call.state === 'active' ? Date.now() : null }); + try { + InCallManager.start({ media: 'audio' }); + } catch (error) { + console.error('[VoIP] InCallManager.start failed:', error); + } + // Subscribe to call events const handleStateChange = () => { const currentCall = get().call; @@ -129,10 +136,18 @@ export const useCallStore = create<CallStore>((set, get) => ({ set({ isOnHold: !isOnHold }); }, - toggleSpeaker: () => { - const { isSpeakerOn } = get(); - // TODO: Implement actual speaker toggle via RNCallKeep or WebRTC audio routing - set({ isSpeakerOn: !isSpeakerOn }); + toggleSpeaker: async () => { + const { callUUID, isSpeakerOn } = get(); + if (!callUUID) return; + + const newSpeakerOn = !isSpeakerOn; + + try { + await InCallManager.setForceSpeakerphoneOn(newSpeakerOn); + set({ isSpeakerOn: newSpeakerOn }); + } catch (error) { + console.error('[VoIP] Failed to toggle speaker:', error); + } }, toggleFocus: () => { @@ -165,6 +180,11 @@ export const useCallStore = create<CallStore>((set, get) => ({ }, reset: () => { + try { + InCallManager.stop(); + } catch (error) { + console.error('[VoIP] InCallManager.stop failed:', error); + } set(initialState); } })); diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 974116a738f..3c31f0c4908 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2166,6 +2166,8 @@ PODS: - React-logger (= 0.79.4) - React-perflogger (= 0.79.4) - React-utils (= 0.79.4) + - ReactNativeIncallManager (4.2.1): + - React-Core - RNBootSplash (6.3.8): - DoubleConversion - glog @@ -2743,6 +2745,7 @@ DEPENDENCIES: - ReactAppDependencyProvider (from `build/generated/ios`) - ReactCodegen (from `build/generated/ios`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - ReactNativeIncallManager (from `../node_modules/react-native-incall-manager`) - RNBootSplash (from `../node_modules/react-native-bootsplash`) - RNCallKeep (from `../node_modules/react-native-callkeep`) - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" @@ -3005,6 +3008,8 @@ EXTERNAL SOURCES: :path: build/generated/ios ReactCommon: :path: "../node_modules/react-native/ReactCommon" + ReactNativeIncallManager: + :path: "../node_modules/react-native-incall-manager" RNBootSplash: :path: "../node_modules/react-native-bootsplash" RNCallKeep: @@ -3174,6 +3179,7 @@ SPEC CHECKSUMS: ReactAppDependencyProvider: bf62814e0fde923f73fc64b7e82d76c63c284da9 ReactCodegen: 5c6b68a6cfdfce6b69a8b12d2eb93e1117d96113 ReactCommon: 177fca841e97b2c0e288e86097b8be04c6e7ae36 + ReactNativeIncallManager: dccd3e7499caa3bb73d3acfedf4fb0360f1a87d5 RNBootSplash: 1280eeb18d887de0a45bb4923d4fc56f25c8b99c RNCallKeep: 1930a01d8caf48f018be4f2db0c9f03405c2f977 RNCAsyncStorage: edb872909c88d8541c0bfade3f86cd7784a7c6b3 diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index a87645d11ae..8e0336f1f18 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -273,7 +273,6 @@ 1EFEB5982493B6640072EDC0 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFEB5972493B6640072EDC0 /* NotificationService.swift */; }; 1EFEB59C2493B6640072EDC0 /* NotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 1EFEB5952493B6640072EDC0 /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 24A2AEF2383D44B586D31C01 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 06BB44DD4855498082A744AD /* libz.tbd */; }; - 307FA80AF7CCE3A179785329 /* Pods_defaults_RocketChatRN.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B8C48663583BBD95FBC7EB7 /* Pods_defaults_RocketChatRN.framework */; }; 3F56D232A9EBA1C9C749F15D /* SecureStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B215A42CFB843397273C7EA /* SecureStorage.m */; }; 3F56D232A9EBA1C9C749F15E /* MMKVBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9B215A44CFB843397273C7EC /* MMKVBridge.mm */; }; 3F56D232A9EBA1C9C749F15F /* MMKVBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9B215A44CFB843397273C7EC /* MMKVBridge.mm */; }; @@ -289,7 +288,7 @@ 66C2701B2EBBCB570062725F /* MMKVKeyManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 66C2701A2EBBCB570062725F /* MMKVKeyManager.mm */; }; 66C2701C2EBBCB570062725F /* MMKVKeyManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 66C2701A2EBBCB570062725F /* MMKVKeyManager.mm */; }; 66C2701D2EBBCB570062725F /* MMKVKeyManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 66C2701A2EBBCB570062725F /* MMKVKeyManager.mm */; }; - 67709318BC12F95CFE0FD019 /* Pods_defaults_Rocket_Chat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C6C0223D4301331E4D2C432A /* Pods_defaults_Rocket_Chat.framework */; }; + 6C4CE0816C17C8809A449508 /* Pods_defaults_Rocket_Chat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 01825CC7557A559FA7F295DA /* Pods_defaults_Rocket_Chat.framework */; }; 79D8C97F8CE2EC1B6882826B /* SecureStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B215A42CFB843397273C7EA /* SecureStorage.m */; }; 7A0000012F1BAFA700B6B4BD /* VoipService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0000032F1BAFA700B6B4BD /* VoipService.swift */; }; 7A0000022F1BAFA700B6B4BD /* VoipModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A0000042F1BAFA700B6B4BD /* VoipModule.mm */; }; @@ -367,11 +366,12 @@ 7AE10C0628A59530003593CB /* Inter.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7AE10C0528A59530003593CB /* Inter.ttf */; }; 7AE10C0828A59530003593CB /* Inter.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7AE10C0528A59530003593CB /* Inter.ttf */; }; 85160EB6C143E0493FE5F014 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194D9A8897F4A486C2C6F89A /* ExpoModulesProvider.swift */; }; + 8E665E13D412E2A8E55F6E33 /* Pods_defaults_RocketChatRN.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E92D6258140274C6B2562E7C /* Pods_defaults_RocketChatRN.framework */; }; A2C6E2DD38F8BEE19BFB2E1D /* SecureStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B215A42CFB843397273C7EA /* SecureStorage.m */; }; A48B46D92D3FFBD200945489 /* A11yFlowModule.m in Sources */ = {isa = PBXBuildFile; fileRef = A48B46D82D3FFBD200945489 /* A11yFlowModule.m */; }; A48B46DA2D3FFBD200945489 /* A11yFlowModule.m in Sources */ = {isa = PBXBuildFile; fileRef = A48B46D82D3FFBD200945489 /* A11yFlowModule.m */; }; + AC6086DB073443D98330ED08 /* Pods_defaults_NotificationService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 112EC394C611BEEA2867A6D3 /* Pods_defaults_NotificationService.framework */; }; BC404914E86821389EEB543D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 391C4F7AA7023CD41EEBD106 /* ExpoModulesProvider.swift */; }; - BE62F5275DDCF37207935378 /* Pods_defaults_NotificationService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B914156975421F5AF8D982B /* Pods_defaults_NotificationService.framework */; }; DD2BA30A89E64F189C2C24AC /* libWatermelonDB.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BA7E862283664608B3894E34 /* libWatermelonDB.a */; }; /* End PBXBuildFile section */ @@ -471,8 +471,9 @@ /* Begin PBXFileReference section */ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file; path = main.jsbundle; sourceTree = "<group>"; }; + 01825CC7557A559FA7F295DA /* Pods_defaults_Rocket_Chat.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_defaults_Rocket_Chat.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 06BB44DD4855498082A744AD /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; - 0B914156975421F5AF8D982B /* Pods_defaults_NotificationService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_defaults_NotificationService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 112EC394C611BEEA2867A6D3 /* Pods_defaults_NotificationService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_defaults_NotificationService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07F961A680F5B00A75B9A /* Rocket.Chat Experimental.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Rocket.Chat Experimental.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RocketChatRN/Images.xcassets; sourceTree = "<group>"; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RocketChatRN/Info.plist; sourceTree = "<group>"; }; @@ -620,14 +621,14 @@ 1EFEB5992493B6640072EDC0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 1EFEB5A12493B67D0072EDC0 /* NotificationService.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NotificationService.entitlements; sourceTree = "<group>"; }; 391C4F7AA7023CD41EEBD106 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-defaults-Rocket.Chat/ExpoModulesProvider.swift"; sourceTree = "<group>"; }; - 3B8C48663583BBD95FBC7EB7 /* Pods_defaults_RocketChatRN.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_defaults_RocketChatRN.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45D5C142B655F8EFD006792C /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-defaults-RocketChatRN/ExpoModulesProvider.swift"; sourceTree = "<group>"; }; - 57DFA6D849BD9281E6E50D40 /* Pods-defaults-Rocket.Chat.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-Rocket.Chat.release.xcconfig"; path = "Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat.release.xcconfig"; sourceTree = "<group>"; }; + 502EF0FB778C0E7F43E5F002 /* Pods-defaults-Rocket.Chat.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-Rocket.Chat.debug.xcconfig"; path = "Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat.debug.xcconfig"; sourceTree = "<group>"; }; 60B2A6A31FC4588700BD58E5 /* RocketChatRN.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RocketChatRN.entitlements; path = RocketChatRN/RocketChatRN.entitlements; sourceTree = "<group>"; }; 65AD38362BFBDF4A00271B39 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; }; 65B9A7192AFC24190088956F /* ringtone.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = ringtone.mp3; sourceTree = "<group>"; }; 66C270192EBBCB570062725F /* MMKVKeyManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MMKVKeyManager.h; sourceTree = "<group>"; }; 66C2701A2EBBCB570062725F /* MMKVKeyManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MMKVKeyManager.mm; sourceTree = "<group>"; }; + 6D1EBBAC4E3123CB93511A8B /* Pods-defaults-RocketChatRN.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-RocketChatRN.debug.xcconfig"; path = "Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN.debug.xcconfig"; sourceTree = "<group>"; }; 7A0000032F1BAFA700B6B4BD /* VoipService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoipService.swift; sourceTree = "<group>"; }; 7A0000042F1BAFA700B6B4BD /* VoipModule.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = VoipModule.mm; sourceTree = "<group>"; }; 7A006F13229C83B600803143 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; }; @@ -647,19 +648,18 @@ 7ACD4853222860DE00442C55 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 7ACFE7D82DDE48760090D9BC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 7AE10C0528A59530003593CB /* Inter.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Inter.ttf; sourceTree = "<group>"; }; - 7DC5F24E96CE93D8C5FFE9BF /* Pods-defaults-NotificationService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-NotificationService.release.xcconfig"; path = "Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService.release.xcconfig"; sourceTree = "<group>"; }; - 8230DCE68AB8DE26A960AA9D /* Pods-defaults-RocketChatRN.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-RocketChatRN.release.xcconfig"; path = "Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN.release.xcconfig"; sourceTree = "<group>"; }; + 88E80C594F039C8B1DCC5B26 /* Pods-defaults-NotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-NotificationService.debug.xcconfig"; path = "Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService.debug.xcconfig"; sourceTree = "<group>"; }; 9B215A42CFB843397273C7EA /* SecureStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = SecureStorage.m; sourceTree = "<group>"; }; 9B215A44CFB843397273C7EC /* MMKVBridge.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = MMKVBridge.mm; path = Shared/RocketChat/MMKVBridge.mm; sourceTree = "<group>"; }; + 9BD1145A1612F5D6A655D75A /* Pods-defaults-RocketChatRN.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-RocketChatRN.release.xcconfig"; path = "Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN.release.xcconfig"; sourceTree = "<group>"; }; + A3FFA83FC7CA4F1C7C42F2A8 /* Pods-defaults-NotificationService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-NotificationService.release.xcconfig"; path = "Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService.release.xcconfig"; sourceTree = "<group>"; }; A48B46D72D3FFBD200945489 /* A11yFlowModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = A11yFlowModule.h; sourceTree = "<group>"; }; A48B46D82D3FFBD200945489 /* A11yFlowModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = A11yFlowModule.m; sourceTree = "<group>"; }; - A9D34C919F230A78C65B84D5 /* Pods-defaults-NotificationService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-NotificationService.debug.xcconfig"; path = "Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService.debug.xcconfig"; sourceTree = "<group>"; }; B179038FDD7AAF285047814B /* SecureStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = SecureStorage.h; sourceTree = "<group>"; }; B37C79D9BD0742CE936B6982 /* libc++.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; BA7E862283664608B3894E34 /* libWatermelonDB.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libWatermelonDB.a; sourceTree = "<group>"; }; - C6C0223D4301331E4D2C432A /* Pods_defaults_Rocket_Chat.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_defaults_Rocket_Chat.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C80C46CC53976257D922AA93 /* Pods-defaults-Rocket.Chat.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-Rocket.Chat.debug.xcconfig"; path = "Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat.debug.xcconfig"; sourceTree = "<group>"; }; - F4E678964EBBF99E850F1D6B /* Pods-defaults-RocketChatRN.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-RocketChatRN.debug.xcconfig"; path = "Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN.debug.xcconfig"; sourceTree = "<group>"; }; + C51A99C4635C7A2000B0AE81 /* Pods-defaults-Rocket.Chat.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-defaults-Rocket.Chat.release.xcconfig"; path = "Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat.release.xcconfig"; sourceTree = "<group>"; }; + E92D6258140274C6B2562E7C /* Pods_defaults_RocketChatRN.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_defaults_RocketChatRN.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -680,7 +680,7 @@ 7ACD4897222860DE00442C55 /* JavaScriptCore.framework in Frameworks */, 24A2AEF2383D44B586D31C01 /* libz.tbd in Frameworks */, DD2BA30A89E64F189C2C24AC /* libWatermelonDB.a in Frameworks */, - 307FA80AF7CCE3A179785329 /* Pods_defaults_RocketChatRN.framework in Frameworks */, + 8E665E13D412E2A8E55F6E33 /* Pods_defaults_RocketChatRN.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -702,7 +702,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BE62F5275DDCF37207935378 /* Pods_defaults_NotificationService.framework in Frameworks */, + AC6086DB073443D98330ED08 /* Pods_defaults_NotificationService.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -723,7 +723,7 @@ 7AAB3E3D257E6A6E00707CF6 /* JavaScriptCore.framework in Frameworks */, 7AAB3E3E257E6A6E00707CF6 /* libz.tbd in Frameworks */, 7AAB3E3F257E6A6E00707CF6 /* libWatermelonDB.a in Frameworks */, - 67709318BC12F95CFE0FD019 /* Pods_defaults_Rocket_Chat.framework in Frameworks */, + 6C4CE0816C17C8809A449508 /* Pods_defaults_Rocket_Chat.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1162,12 +1162,12 @@ 7AC2B09613AA7C3FEBAC9F57 /* Pods */ = { isa = PBXGroup; children = ( - A9D34C919F230A78C65B84D5 /* Pods-defaults-NotificationService.debug.xcconfig */, - 7DC5F24E96CE93D8C5FFE9BF /* Pods-defaults-NotificationService.release.xcconfig */, - C80C46CC53976257D922AA93 /* Pods-defaults-Rocket.Chat.debug.xcconfig */, - 57DFA6D849BD9281E6E50D40 /* Pods-defaults-Rocket.Chat.release.xcconfig */, - F4E678964EBBF99E850F1D6B /* Pods-defaults-RocketChatRN.debug.xcconfig */, - 8230DCE68AB8DE26A960AA9D /* Pods-defaults-RocketChatRN.release.xcconfig */, + 88E80C594F039C8B1DCC5B26 /* Pods-defaults-NotificationService.debug.xcconfig */, + A3FFA83FC7CA4F1C7C42F2A8 /* Pods-defaults-NotificationService.release.xcconfig */, + 502EF0FB778C0E7F43E5F002 /* Pods-defaults-Rocket.Chat.debug.xcconfig */, + C51A99C4635C7A2000B0AE81 /* Pods-defaults-Rocket.Chat.release.xcconfig */, + 6D1EBBAC4E3123CB93511A8B /* Pods-defaults-RocketChatRN.debug.xcconfig */, + 9BD1145A1612F5D6A655D75A /* Pods-defaults-RocketChatRN.release.xcconfig */, ); path = Pods; sourceTree = "<group>"; @@ -1257,9 +1257,9 @@ 7ACD4853222860DE00442C55 /* JavaScriptCore.framework */, B37C79D9BD0742CE936B6982 /* libc++.tbd */, 06BB44DD4855498082A744AD /* libz.tbd */, - 0B914156975421F5AF8D982B /* Pods_defaults_NotificationService.framework */, - C6C0223D4301331E4D2C432A /* Pods_defaults_Rocket_Chat.framework */, - 3B8C48663583BBD95FBC7EB7 /* Pods_defaults_RocketChatRN.framework */, + 112EC394C611BEEA2867A6D3 /* Pods_defaults_NotificationService.framework */, + 01825CC7557A559FA7F295DA /* Pods_defaults_Rocket_Chat.framework */, + E92D6258140274C6B2562E7C /* Pods_defaults_RocketChatRN.framework */, ); name = Frameworks; sourceTree = "<group>"; @@ -1279,7 +1279,7 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RocketChatRN" */; buildPhases = ( - 93EF7975E0C4C603BD18F87C /* [CP] Check Pods Manifest.lock */, + 504592CD551433A983430EBF /* [CP] Check Pods Manifest.lock */, 06C10D4F29CD7532492AD29E /* [Expo] Configure project */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, @@ -1289,8 +1289,8 @@ 1E1EA8082326CCE300E22452 /* ShellScript */, 1ED0389C2B507B4F00C007D4 /* Embed Watch Content */, 7AAE9EB32891A0D20024F559 /* Upload source maps to Bugsnag */, - 1840C56D2D066F638B2A748B /* [CP] Embed Pods Frameworks */, - 1199CD71D36A54C2713FCD3E /* [CP] Copy Pods Resources */, + 8F4AF0F46C8A7237DF8C16FA /* [CP] Embed Pods Frameworks */, + 8DEAC14DF3433A2019536C64 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1358,12 +1358,12 @@ isa = PBXNativeTarget; buildConfigurationList = 1EFEB5A02493B6640072EDC0 /* Build configuration list for PBXNativeTarget "NotificationService" */; buildPhases = ( - 480C35381BCFF59C9015726E /* [CP] Check Pods Manifest.lock */, + 8411AC317FC27278C916B5E8 /* [CP] Check Pods Manifest.lock */, 86A998705576AFA7CE938617 /* [Expo] Configure project */, 1EFEB5912493B6640072EDC0 /* Sources */, 1EFEB5922493B6640072EDC0 /* Frameworks */, 1EFEB5932493B6640072EDC0 /* Resources */, - 28340DD974173F56DB07A9FC /* [CP] Copy Pods Resources */, + 3DF9C309C5E980B085E69887 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1378,7 +1378,7 @@ isa = PBXNativeTarget; buildConfigurationList = 7AAB3E4F257E6A6E00707CF6 /* Build configuration list for PBXNativeTarget "Rocket.Chat" */; buildPhases = ( - FBF64C5737C1CD5B1ECC58DC /* [CP] Check Pods Manifest.lock */, + F7C5B37C9876312B8B0E5AD9 /* [CP] Check Pods Manifest.lock */, 6319FBDD06EF0030B48AD389 /* [Expo] Configure project */, 7AAB3E14257E6A6E00707CF6 /* Sources */, 7AAB3E32257E6A6E00707CF6 /* Frameworks */, @@ -1388,8 +1388,8 @@ 7A55BE3C2F1131C000D8744D /* ShellScript */, 1ED1ECE32B8699DD00F6620C /* Embed Watch Content */, 7A55BE3D2F11320C00D8744D /* Upload source maps to Bugsnag */, - 265F5F7FE4FE17B65751C48D /* [CP] Embed Pods Frameworks */, - 9C5D6D7D9D5E936CB1720CA9 /* [CP] Copy Pods Resources */, + 249DAF3363A5963431094167 /* [CP] Embed Pods Frameworks */, + 8CF4DBF996133696144F02A2 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -1582,102 +1582,6 @@ shellPath = /bin/sh; shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-defaults-RocketChatRN/expo-configure-project.sh\"\n"; }; - 1199CD71D36A54C2713FCD3E /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/BugsnagReactNative/Bugsnag.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXApplication/ExpoApplication_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXNotifications/ExpoNotifications_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ExpoDevice/ExpoDevice_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNDeviceInfo/RNDeviceInfoPrivacyInfo.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/RNImageCropPickerPrivacyInfo.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/react-native-cameraroll/RNCameraRollPrivacyInfo.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Bugsnag.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoApplication_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoNotifications_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoDevice_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNDeviceInfoPrivacyInfo.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNImageCropPickerPrivacyInfo.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCameraRollPrivacyInfo.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 1840C56D2D066F638B2A748B /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiWebRTC/WebRTC.framework/WebRTC", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 1E1EA8082326CCE300E22452 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1695,7 +1599,7 @@ shellPath = /bin/sh; shellScript = "echo \"Target architectures: $ARCHS\"\n\nAPP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\n\nfind \"$APP_PATH\" -name '*.framework' -type d | while read -r FRAMEWORK\ndo\nFRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\nFRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\necho \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\necho $(lipo -info \"$FRAMEWORK_EXECUTABLE_PATH\")\n\nFRAMEWORK_TMP_PATH=\"$FRAMEWORK_EXECUTABLE_PATH-tmp\"\n\n# remove simulator's archs if location is not simulator's directory\ncase \"${TARGET_BUILD_DIR}\" in\n*\"iphonesimulator\")\necho \"No need to remove archs\"\n;;\n*)\nif $(lipo \"$FRAMEWORK_EXECUTABLE_PATH\" -verify_arch \"i386\") ; then\nlipo -output \"$FRAMEWORK_TMP_PATH\" -remove \"i386\" \"$FRAMEWORK_EXECUTABLE_PATH\"\necho \"i386 architecture removed\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_TMP_PATH\" \"$FRAMEWORK_EXECUTABLE_PATH\"\nfi\nif $(lipo \"$FRAMEWORK_EXECUTABLE_PATH\" -verify_arch \"x86_64\") ; then\nlipo -output \"$FRAMEWORK_TMP_PATH\" -remove \"x86_64\" \"$FRAMEWORK_EXECUTABLE_PATH\"\necho \"x86_64 architecture removed\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_TMP_PATH\" \"$FRAMEWORK_EXECUTABLE_PATH\"\nfi\n;;\nesac\n\necho \"Completed for executable $FRAMEWORK_EXECUTABLE_PATH\"\necho $\n\ndone\n"; }; - 265F5F7FE4FE17B65751C48D /* [CP] Embed Pods Frameworks */ = { + 249DAF3363A5963431094167 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1715,7 +1619,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 28340DD974173F56DB07A9FC /* [CP] Copy Pods Resources */ = { + 3DF9C309C5E980B085E69887 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1791,7 +1695,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-NotificationService/Pods-defaults-NotificationService-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 480C35381BCFF59C9015726E /* [CP] Check Pods Manifest.lock */ = { + 504592CD551433A983430EBF /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1806,7 +1710,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-defaults-NotificationService-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-defaults-RocketChatRN-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -1875,7 +1779,7 @@ inputFileListPaths = ( ); inputPaths = ( - $TARGET_BUILD_DIR/$INFOPLIST_PATH, + "$TARGET_BUILD_DIR/$INFOPLIST_PATH", ); name = "Upload source maps to Bugsnag"; outputFileListPaths = ( @@ -1895,7 +1799,7 @@ inputFileListPaths = ( ); inputPaths = ( - $TARGET_BUILD_DIR/$INFOPLIST_PATH, + "$TARGET_BUILD_DIR/$INFOPLIST_PATH", ); name = "Upload source maps to Bugsnag"; outputFileListPaths = ( @@ -1907,48 +1811,48 @@ shellScript = "#SOURCE_MAP=\"$TMPDIR/$(md5 -qs \"$CONFIGURATION_BUILD_DIR\")-main.jsbundle.map\" ../node_modules/@bugsnag/react-native/bugsnag-react-native-xcode.sh\n"; showEnvVarsInLog = 0; }; - 86A998705576AFA7CE938617 /* [Expo] Configure project */ = { + 8411AC317FC27278C916B5E8 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "[Expo] Configure project"; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-defaults-NotificationService-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-defaults-NotificationService/expo-configure-project.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - 93EF7975E0C4C603BD18F87C /* [CP] Check Pods Manifest.lock */ = { + 86A998705576AFA7CE938617 /* [Expo] Configure project */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; + name = "[Expo] Configure project"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-defaults-RocketChatRN-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-defaults-NotificationService/expo-configure-project.sh\"\n"; }; - 9C5D6D7D9D5E936CB1720CA9 /* [CP] Copy Pods Resources */ = { + 8CF4DBF996133696144F02A2 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -2024,7 +1928,103 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-Rocket.Chat/Pods-defaults-Rocket.Chat-resources.sh\"\n"; showEnvVarsInLog = 0; }; - FBF64C5737C1CD5B1ECC58DC /* [CP] Check Pods Manifest.lock */ = { + 8DEAC14DF3433A2019536C64 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/BugsnagReactNative/Bugsnag.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/EXApplication/ExpoApplication_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/EXNotifications/ExpoNotifications_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/ExpoDevice/ExpoDevice_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCore/FirebaseCore_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreExtension/FirebaseCoreExtension_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCoreInternal/FirebaseCoreInternal_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseCrashlytics/FirebaseCrashlytics_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/FirebaseInstallations/FirebaseInstallations_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleDataTransport/GoogleDataTransport_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/GoogleUtilities/GoogleUtilities_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesObjC/FBLPromises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PromisesSwift/Promises_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNDeviceInfo/RNDeviceInfoPrivacyInfo.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/RNImageCropPickerPrivacyInfo.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNImageCropPicker/QBImagePicker.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/nanopb/nanopb_Privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/react-native-cameraroll/RNCameraRollPrivacyInfo.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Bugsnag.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoApplication_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoNotifications_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoDevice_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCore_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreExtension_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCoreInternal_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseCrashlytics_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FirebaseInstallations_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleDataTransport_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleUtilities_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FBLPromises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Promises_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNDeviceInfoPrivacyInfo.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNImageCropPickerPrivacyInfo.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/QBImagePicker.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/nanopb_Privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCameraRollPrivacyInfo.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 8F4AF0F46C8A7237DF8C16FA /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/JitsiWebRTC/WebRTC.framework/WebRTC", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-defaults-RocketChatRN/Pods-defaults-RocketChatRN-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + F7C5B37C9876312B8B0E5AD9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -2441,7 +2441,7 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F4E678964EBBF99E850F1D6B /* Pods-defaults-RocketChatRN.debug.xcconfig */; + baseConfigurationReference = 6D1EBBAC4E3123CB93511A8B /* Pods-defaults-RocketChatRN.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2506,7 +2506,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8230DCE68AB8DE26A960AA9D /* Pods-defaults-RocketChatRN.release.xcconfig */; + baseConfigurationReference = 9BD1145A1612F5D6A655D75A /* Pods-defaults-RocketChatRN.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -2613,7 +2613,7 @@ "$(inherited)", "$(SRCROOT)/../node_modules/rn-extensions-share/ios/**", "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", - $PODS_CONFIGURATION_BUILD_DIR/Firebase, + "$PODS_CONFIGURATION_BUILD_DIR/Firebase", ); INFOPLIST_FILE = ShareRocketChatRN/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; @@ -2689,7 +2689,7 @@ "$(inherited)", "$(SRCROOT)/../node_modules/rn-extensions-share/ios/**", "$(SRCROOT)/../node_modules/react-native-firebase/ios/RNFirebase/**", - $PODS_CONFIGURATION_BUILD_DIR/Firebase, + "$PODS_CONFIGURATION_BUILD_DIR/Firebase", ); INFOPLIST_FILE = ShareRocketChatRN/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; @@ -2921,7 +2921,7 @@ }; 1EFEB59D2493B6640072EDC0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A9D34C919F230A78C65B84D5 /* Pods-defaults-NotificationService.debug.xcconfig */; + baseConfigurationReference = 88E80C594F039C8B1DCC5B26 /* Pods-defaults-NotificationService.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(EMBEDDED_CONTENT_CONTAINS_SWIFT)"; CLANG_ANALYZER_NONNULL = YES; @@ -2973,7 +2973,7 @@ }; 1EFEB59E2493B6640072EDC0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7DC5F24E96CE93D8C5FFE9BF /* Pods-defaults-NotificationService.release.xcconfig */; + baseConfigurationReference = A3FFA83FC7CA4F1C7C42F2A8 /* Pods-defaults-NotificationService.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(EMBEDDED_CONTENT_CONTAINS_SWIFT)"; CLANG_ANALYZER_NONNULL = YES; @@ -3024,7 +3024,7 @@ }; 7AAB3E50257E6A6E00707CF6 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C80C46CC53976257D922AA93 /* Pods-defaults-Rocket.Chat.debug.xcconfig */; + baseConfigurationReference = 502EF0FB778C0E7F43E5F002 /* Pods-defaults-Rocket.Chat.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -3089,7 +3089,7 @@ }; 7AAB3E51257E6A6E00707CF6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 57DFA6D849BD9281E6E50D40 /* Pods-defaults-Rocket.Chat.release.xcconfig */; + baseConfigurationReference = C51A99C4635C7A2000B0AE81 /* Pods-defaults-Rocket.Chat.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; APPLICATION_EXTENSION_API_ONLY = NO; @@ -3214,7 +3214,10 @@ ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "$(inherited)"; OTHER_CPLUSPLUSFLAGS = "$(inherited)"; - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; @@ -3278,7 +3281,10 @@ MTL_ENABLE_DEBUG_INFO = NO; OTHER_CFLAGS = "$(inherited)"; OTHER_CPLUSPLUSFLAGS = "$(inherited)"; - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/package.json b/package.json index 930d35be551..7a5f6c31b4f 100644 --- a/package.json +++ b/package.json @@ -101,6 +101,7 @@ "react-native-file-viewer": "2.1.4", "react-native-gesture-handler": "2.24.0", "react-native-image-crop-picker": "RocketChat/react-native-image-crop-picker#5346870b0be10d300dc53924309dc6adc9946d50", + "react-native-incall-manager": "^4.2.1", "react-native-katex": "git+https://github.com/RocketChat/react-native-katex.git", "react-native-keyboard-controller": "^1.17.1", "react-native-linear-gradient": "2.6.2", diff --git a/yarn.lock b/yarn.lock index ec569a30add..f64c8f247ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12734,6 +12734,11 @@ react-native-image-crop-picker@RocketChat/react-native-image-crop-picker#5346870 version "0.50.1" resolved "https://codeload.github.com/RocketChat/react-native-image-crop-picker/tar.gz/5346870b0be10d300dc53924309dc6adc9946d50" +react-native-incall-manager@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/react-native-incall-manager/-/react-native-incall-manager-4.2.1.tgz#6a261693d8906f6e69c79356e5048e95d0e3e239" + integrity sha512-HTdtzQ/AswUbuNhcL0gmyZLAXo8VqBO7SIh+BwbeeM1YMXXlR+Q2MvKxhD4yanjJPeyqMfuRhryCQCJhPlsdAw== + react-native-is-edge-to-edge@1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.6.tgz#69ec13f70d76e9245e275eed4140d0873a78f902"