@ethora/chat-component-rn 26.5.10 → 26.5.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/CHANGELOG.md +65 -1
  2. package/README.md +30 -1
  3. package/lib/commonjs/assets/icons.js +7 -1
  4. package/lib/commonjs/assets/icons.js.map +1 -1
  5. package/lib/commonjs/components/MainComponents/ChatHeader.js +31 -16
  6. package/lib/commonjs/components/MainComponents/ChatHeader.js.map +1 -1
  7. package/lib/commonjs/components/MainComponents/ChatRoom.js +34 -4
  8. package/lib/commonjs/components/MainComponents/ChatRoom.js.map +1 -1
  9. package/lib/commonjs/components/MainComponents/ChatWrapper.js +17 -14
  10. package/lib/commonjs/components/MainComponents/ChatWrapper.js.map +1 -1
  11. package/lib/commonjs/components/MainComponents/MediaMessage.js +298 -12
  12. package/lib/commonjs/components/MainComponents/MediaMessage.js.map +1 -1
  13. package/lib/commonjs/components/MessageBubble/InteractionsOverlay.js +119 -0
  14. package/lib/commonjs/components/MessageBubble/InteractionsOverlay.js.map +1 -0
  15. package/lib/commonjs/components/MessageBubble/Message.js +39 -3
  16. package/lib/commonjs/components/MessageBubble/Message.js.map +1 -1
  17. package/lib/commonjs/components/MessageBubble/MessageInteractions.js +87 -39
  18. package/lib/commonjs/components/MessageBubble/MessageInteractions.js.map +1 -1
  19. package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js +153 -62
  20. package/lib/commonjs/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
  21. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js +20 -5
  22. package/lib/commonjs/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  23. package/lib/commonjs/components/Modals/FilePreviewModal/DocumentViewer.js +5 -44
  24. package/lib/commonjs/components/Modals/FilePreviewModal/DocumentViewer.js.map +1 -1
  25. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js +40 -3
  26. package/lib/commonjs/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  27. package/lib/commonjs/components/Modals/FilePreviewModal/GViewWebView.js +149 -0
  28. package/lib/commonjs/components/Modals/FilePreviewModal/GViewWebView.js.map +1 -0
  29. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js +4 -17
  30. package/lib/commonjs/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  31. package/lib/commonjs/components/Modals/ModalHeaderComponent.js +10 -0
  32. package/lib/commonjs/components/Modals/ModalHeaderComponent.js.map +1 -1
  33. package/lib/commonjs/components/Modals/styledModalComponents.js +13 -4
  34. package/lib/commonjs/components/Modals/styledModalComponents.js.map +1 -1
  35. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js +19 -33
  36. package/lib/commonjs/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  37. package/lib/commonjs/components/styled/AudioMessage.js +643 -66
  38. package/lib/commonjs/components/styled/AudioMessage.js.map +1 -1
  39. package/lib/commonjs/components/styled/Button.js +9 -3
  40. package/lib/commonjs/components/styled/Button.js.map +1 -1
  41. package/lib/commonjs/components/styled/SendInput.js +239 -40
  42. package/lib/commonjs/components/styled/SendInput.js.map +1 -1
  43. package/lib/commonjs/components/styled/StyledComponents.js +6 -3
  44. package/lib/commonjs/components/styled/StyledComponents.js.map +1 -1
  45. package/lib/commonjs/components/styled/StyledInputComponents/MediaComponents.js +31 -18
  46. package/lib/commonjs/components/styled/StyledInputComponents/MediaComponents.js.map +1 -1
  47. package/lib/commonjs/components/styled/UnsupportedType.js +47 -5
  48. package/lib/commonjs/components/styled/UnsupportedType.js.map +1 -1
  49. package/lib/commonjs/components/styled/VideoMessage.js +44 -25
  50. package/lib/commonjs/components/styled/VideoMessage.js.map +1 -1
  51. package/lib/commonjs/context/xmppProvider.js +5 -2
  52. package/lib/commonjs/context/xmppProvider.js.map +1 -1
  53. package/lib/commonjs/helpers/keyboardLayout.js +5 -3
  54. package/lib/commonjs/helpers/keyboardLayout.js.map +1 -1
  55. package/lib/commonjs/helpers/mimeToExtension.js +123 -0
  56. package/lib/commonjs/helpers/mimeToExtension.js.map +1 -1
  57. package/lib/commonjs/hooks/useEventHandlers.js +1 -1
  58. package/lib/commonjs/hooks/useEventHandlers.js.map +1 -1
  59. package/lib/commonjs/hooks/useLogout.js +33 -8
  60. package/lib/commonjs/hooks/useLogout.js.map +1 -1
  61. package/lib/commonjs/hooks/useSendMessage.js +6 -3
  62. package/lib/commonjs/hooks/useSendMessage.js.map +1 -1
  63. package/lib/commonjs/networking/api-requests/rooms.api.js +29 -4
  64. package/lib/commonjs/networking/api-requests/rooms.api.js.map +1 -1
  65. package/lib/commonjs/roomStore/roomsSlice.js +6 -0
  66. package/lib/commonjs/roomStore/roomsSlice.js.map +1 -1
  67. package/lib/module/assets/icons.js +7 -1
  68. package/lib/module/assets/icons.js.map +1 -1
  69. package/lib/module/components/MainComponents/ChatHeader.js +31 -16
  70. package/lib/module/components/MainComponents/ChatHeader.js.map +1 -1
  71. package/lib/module/components/MainComponents/ChatRoom.js +36 -6
  72. package/lib/module/components/MainComponents/ChatRoom.js.map +1 -1
  73. package/lib/module/components/MainComponents/ChatWrapper.js +17 -14
  74. package/lib/module/components/MainComponents/ChatWrapper.js.map +1 -1
  75. package/lib/module/components/MainComponents/MediaMessage.js +301 -15
  76. package/lib/module/components/MainComponents/MediaMessage.js.map +1 -1
  77. package/lib/module/components/MessageBubble/InteractionsOverlay.js +112 -0
  78. package/lib/module/components/MessageBubble/InteractionsOverlay.js.map +1 -0
  79. package/lib/module/components/MessageBubble/Message.js +40 -4
  80. package/lib/module/components/MessageBubble/Message.js.map +1 -1
  81. package/lib/module/components/MessageBubble/MessageInteractions.js +89 -41
  82. package/lib/module/components/MessageBubble/MessageInteractions.js.map +1 -1
  83. package/lib/module/components/Modals/AttachSheet/AttachSheet.js +155 -64
  84. package/lib/module/components/Modals/AttachSheet/AttachSheet.js.map +1 -1
  85. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js +20 -5
  86. package/lib/module/components/Modals/ChatProfileModal/ChatProfileModal.js.map +1 -1
  87. package/lib/module/components/Modals/FilePreviewModal/DocumentViewer.js +5 -45
  88. package/lib/module/components/Modals/FilePreviewModal/DocumentViewer.js.map +1 -1
  89. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js +41 -4
  90. package/lib/module/components/Modals/FilePreviewModal/FilePreviewModal.js.map +1 -1
  91. package/lib/module/components/Modals/FilePreviewModal/GViewWebView.js +144 -0
  92. package/lib/module/components/Modals/FilePreviewModal/GViewWebView.js.map +1 -0
  93. package/lib/module/components/Modals/FilePreviewModal/PdfView.js +3 -17
  94. package/lib/module/components/Modals/FilePreviewModal/PdfView.js.map +1 -1
  95. package/lib/module/components/Modals/ModalHeaderComponent.js +10 -0
  96. package/lib/module/components/Modals/ModalHeaderComponent.js.map +1 -1
  97. package/lib/module/components/Modals/styledModalComponents.js +13 -4
  98. package/lib/module/components/Modals/styledModalComponents.js.map +1 -1
  99. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js +20 -34
  100. package/lib/module/components/RoomComponents/styled/LastAudioMessage.js.map +1 -1
  101. package/lib/module/components/styled/AudioMessage.js +644 -67
  102. package/lib/module/components/styled/AudioMessage.js.map +1 -1
  103. package/lib/module/components/styled/Button.js +9 -3
  104. package/lib/module/components/styled/Button.js.map +1 -1
  105. package/lib/module/components/styled/SendInput.js +240 -42
  106. package/lib/module/components/styled/SendInput.js.map +1 -1
  107. package/lib/module/components/styled/StyledComponents.js +6 -3
  108. package/lib/module/components/styled/StyledComponents.js.map +1 -1
  109. package/lib/module/components/styled/StyledInputComponents/MediaComponents.js +31 -18
  110. package/lib/module/components/styled/StyledInputComponents/MediaComponents.js.map +1 -1
  111. package/lib/module/components/styled/UnsupportedType.js +47 -5
  112. package/lib/module/components/styled/UnsupportedType.js.map +1 -1
  113. package/lib/module/components/styled/VideoMessage.js +45 -26
  114. package/lib/module/components/styled/VideoMessage.js.map +1 -1
  115. package/lib/module/context/xmppProvider.js +5 -2
  116. package/lib/module/context/xmppProvider.js.map +1 -1
  117. package/lib/module/helpers/keyboardLayout.js +4 -2
  118. package/lib/module/helpers/keyboardLayout.js.map +1 -1
  119. package/lib/module/helpers/mimeToExtension.js +119 -0
  120. package/lib/module/helpers/mimeToExtension.js.map +1 -1
  121. package/lib/module/hooks/useEventHandlers.js +1 -1
  122. package/lib/module/hooks/useEventHandlers.js.map +1 -1
  123. package/lib/module/hooks/useLogout.js +33 -8
  124. package/lib/module/hooks/useLogout.js.map +1 -1
  125. package/lib/module/hooks/useSendMessage.js +6 -3
  126. package/lib/module/hooks/useSendMessage.js.map +1 -1
  127. package/lib/module/networking/api-requests/rooms.api.js +29 -4
  128. package/lib/module/networking/api-requests/rooms.api.js.map +1 -1
  129. package/lib/module/roomStore/roomsSlice.js +6 -0
  130. package/lib/module/roomStore/roomsSlice.js.map +1 -1
  131. package/lib/typescript/assets/icons.d.ts.map +1 -1
  132. package/lib/typescript/components/MainComponents/ChatHeader.d.ts.map +1 -1
  133. package/lib/typescript/components/MainComponents/ChatRoom.d.ts.map +1 -1
  134. package/lib/typescript/components/MainComponents/ChatWrapper.d.ts.map +1 -1
  135. package/lib/typescript/components/MainComponents/MediaMessage.d.ts.map +1 -1
  136. package/lib/typescript/components/MessageBubble/InteractionsOverlay.d.ts +13 -0
  137. package/lib/typescript/components/MessageBubble/InteractionsOverlay.d.ts.map +1 -0
  138. package/lib/typescript/components/MessageBubble/Message.d.ts.map +1 -1
  139. package/lib/typescript/components/MessageBubble/MessageInteractions.d.ts.map +1 -1
  140. package/lib/typescript/components/Modals/AttachSheet/AttachSheet.d.ts.map +1 -1
  141. package/lib/typescript/components/Modals/ChatProfileModal/ChatProfileModal.d.ts.map +1 -1
  142. package/lib/typescript/components/Modals/FilePreviewModal/DocumentViewer.d.ts +0 -7
  143. package/lib/typescript/components/Modals/FilePreviewModal/DocumentViewer.d.ts.map +1 -1
  144. package/lib/typescript/components/Modals/FilePreviewModal/FilePreviewModal.d.ts.map +1 -1
  145. package/lib/typescript/components/Modals/FilePreviewModal/GViewWebView.d.ts +8 -0
  146. package/lib/typescript/components/Modals/FilePreviewModal/GViewWebView.d.ts.map +1 -0
  147. package/lib/typescript/components/Modals/FilePreviewModal/PdfView.d.ts.map +1 -1
  148. package/lib/typescript/components/Modals/ModalHeaderComponent.d.ts.map +1 -1
  149. package/lib/typescript/components/Modals/styledModalComponents.d.ts.map +1 -1
  150. package/lib/typescript/components/RoomComponents/styled/LastAudioMessage.d.ts.map +1 -1
  151. package/lib/typescript/components/styled/AudioMessage.d.ts +8 -2
  152. package/lib/typescript/components/styled/AudioMessage.d.ts.map +1 -1
  153. package/lib/typescript/components/styled/Button.d.ts.map +1 -1
  154. package/lib/typescript/components/styled/SendInput.d.ts.map +1 -1
  155. package/lib/typescript/components/styled/StyledComponents.d.ts.map +1 -1
  156. package/lib/typescript/components/styled/StyledInputComponents/MediaComponents.d.ts +5 -1
  157. package/lib/typescript/components/styled/StyledInputComponents/MediaComponents.d.ts.map +1 -1
  158. package/lib/typescript/components/styled/UnsupportedType.d.ts +5 -0
  159. package/lib/typescript/components/styled/UnsupportedType.d.ts.map +1 -1
  160. package/lib/typescript/components/styled/VideoMessage.d.ts.map +1 -1
  161. package/lib/typescript/context/xmppProvider.d.ts.map +1 -1
  162. package/lib/typescript/helpers/keyboardLayout.d.ts +3 -1
  163. package/lib/typescript/helpers/keyboardLayout.d.ts.map +1 -1
  164. package/lib/typescript/helpers/mimeToExtension.d.ts +38 -0
  165. package/lib/typescript/helpers/mimeToExtension.d.ts.map +1 -1
  166. package/lib/typescript/hooks/useLogout.d.ts +23 -1
  167. package/lib/typescript/hooks/useLogout.d.ts.map +1 -1
  168. package/lib/typescript/hooks/useSendMessage.d.ts.map +1 -1
  169. package/lib/typescript/networking/api-requests/rooms.api.d.ts.map +1 -1
  170. package/lib/typescript/roomStore/roomsSlice.d.ts.map +1 -1
  171. package/lib/typescript/types/models/modal.model.d.ts +3 -0
  172. package/lib/typescript/types/models/modal.model.d.ts.map +1 -1
  173. package/lib/typescript/types/types.d.ts +29 -0
  174. package/lib/typescript/types/types.d.ts.map +1 -1
  175. package/package.json +11 -4
  176. package/src/assets/icons.tsx +30 -25
  177. package/src/components/MainComponents/ChatHeader.tsx +46 -15
  178. package/src/components/MainComponents/ChatRoom.tsx +38 -3
  179. package/src/components/MainComponents/ChatWrapper.tsx +28 -21
  180. package/src/components/MainComponents/MediaMessage.tsx +304 -11
  181. package/src/components/MessageBubble/InteractionsOverlay.tsx +121 -0
  182. package/src/components/MessageBubble/Message.tsx +44 -3
  183. package/src/components/MessageBubble/MessageInteractions.tsx +103 -52
  184. package/src/components/Modals/AttachSheet/AttachSheet.tsx +144 -51
  185. package/src/components/Modals/ChatProfileModal/ChatProfileModal.tsx +25 -3
  186. package/src/components/Modals/FilePreviewModal/DocumentViewer.tsx +3 -40
  187. package/src/components/Modals/FilePreviewModal/FilePreviewModal.tsx +48 -4
  188. package/src/components/Modals/FilePreviewModal/GViewWebView.tsx +142 -0
  189. package/src/components/Modals/FilePreviewModal/PdfView.tsx +2 -18
  190. package/src/components/Modals/ModalHeaderComponent.tsx +8 -1
  191. package/src/components/Modals/styledModalComponents.tsx +13 -4
  192. package/src/components/RoomComponents/styled/LastAudioMessage.tsx +20 -35
  193. package/src/components/styled/AudioMessage.tsx +724 -59
  194. package/src/components/styled/Button.tsx +20 -11
  195. package/src/components/styled/SendInput.tsx +255 -46
  196. package/src/components/styled/StyledComponents.ts +6 -3
  197. package/src/components/styled/StyledInputComponents/MediaComponents.tsx +29 -18
  198. package/src/components/styled/UnsupportedType.tsx +60 -6
  199. package/src/components/styled/VideoMessage.tsx +21 -5
  200. package/src/context/xmppProvider.tsx +6 -2
  201. package/src/helpers/keyboardLayout.ts +5 -1
  202. package/src/helpers/mimeToExtension.ts +178 -0
  203. package/src/hooks/useEventHandlers.tsx +1 -1
  204. package/src/hooks/useLogout.tsx +33 -10
  205. package/src/hooks/useSendMessage.tsx +12 -6
  206. package/src/networking/api-requests/rooms.api.ts +31 -7
  207. package/src/roomStore/roomsSlice.ts +7 -0
  208. package/src/types/models/modal.model.ts +3 -0
  209. package/src/types/types.ts +29 -0
@@ -0,0 +1,142 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { ActivityIndicator, StyleSheet, View } from 'react-native';
3
+ import { WebView } from 'react-native-webview';
4
+
5
+ interface GViewWebViewProps {
6
+ url: string;
7
+ onError?: () => void;
8
+ }
9
+
10
+ const MAX_ATTEMPTS = 6;
11
+ const LOAD_BUDGET_MS = 8000;
12
+ const ATTEMPT_TIMEOUT_MS = 3000;
13
+
14
+ const RENDER_POLLER = `
15
+ (function () {
16
+ if (window.__ethoraGviewProbe) { return; }
17
+ window.__ethoraGviewProbe = true;
18
+ var tries = 0;
19
+ function rendered() {
20
+ try {
21
+ var imgs = document.querySelectorAll('img');
22
+ for (var i = 0; i < imgs.length; i++) {
23
+ // naturalHeight is readable even for cross-origin images; gview's
24
+ // page images are tall, the preparing page has none.
25
+ if (imgs[i].naturalHeight > 80) { return true; }
26
+ }
27
+ // Some gview render paths paint pages into <canvas> instead.
28
+ var canvases = document.querySelectorAll('canvas');
29
+ for (var j = 0; j < canvases.length; j++) {
30
+ if (canvases[j].height > 80) { return true; }
31
+ }
32
+ var txt = ((document.body && document.body.innerText) || '').trim();
33
+ return txt.length > 80;
34
+ } catch (e) {
35
+ return false;
36
+ }
37
+ }
38
+ function tick() {
39
+ tries++;
40
+ if (rendered()) {
41
+ try {
42
+ window.ReactNativeWebView.postMessage(JSON.stringify({ rendered: true }));
43
+ } catch (e) {}
44
+ return;
45
+ }
46
+ if (tries < 40) { setTimeout(tick, 500); }
47
+ }
48
+ tick();
49
+ })();
50
+ true;
51
+ `;
52
+
53
+ const GViewWebView: React.FC<GViewWebViewProps> = ({ url, onError }) => {
54
+ const [attempt, setAttempt] = useState(0);
55
+ const [ready, setReady] = useState(false);
56
+ const readyRef = useRef(false);
57
+ const attemptRef = useRef(0);
58
+ const watchdog = useRef<ReturnType<typeof setTimeout> | null>(null);
59
+
60
+ const viewerUrl = `https://docs.google.com/gview?embedded=true&url=${encodeURIComponent(
61
+ url
62
+ )}`;
63
+
64
+ const clearWatchdog = () => {
65
+ if (watchdog.current) {
66
+ clearTimeout(watchdog.current);
67
+ watchdog.current = null;
68
+ }
69
+ };
70
+
71
+ const giveUpAttempt = useCallback(() => {
72
+ if (readyRef.current) {return;}
73
+ if (attemptRef.current < MAX_ATTEMPTS - 1) {
74
+ attemptRef.current += 1;
75
+ setAttempt(attemptRef.current);
76
+ } else {
77
+ readyRef.current = true;
78
+ setReady(true);
79
+ }
80
+ }, []);
81
+
82
+ useEffect(() => {
83
+ if (readyRef.current) {return;}
84
+ clearWatchdog();
85
+ watchdog.current = setTimeout(giveUpAttempt, LOAD_BUDGET_MS);
86
+ return clearWatchdog;
87
+ }, [attempt, giveUpAttempt]);
88
+
89
+ const handleLoadEnd = useCallback(() => {
90
+ if (readyRef.current) {return;}
91
+ clearWatchdog();
92
+ watchdog.current = setTimeout(giveUpAttempt, ATTEMPT_TIMEOUT_MS);
93
+ }, [giveUpAttempt]);
94
+
95
+ const handleMessage = useCallback((e: any) => {
96
+ let isRendered = false;
97
+ try {
98
+ isRendered = !!JSON.parse(e.nativeEvent.data)?.rendered;
99
+ } catch {
100
+ isRendered = false;
101
+ }
102
+ if (isRendered && !readyRef.current) {
103
+ clearWatchdog();
104
+ readyRef.current = true;
105
+ setReady(true);
106
+ }
107
+ }, []);
108
+
109
+ return (
110
+ <View style={styles.container}>
111
+ <WebView
112
+ key={attempt}
113
+ source={{ uri: viewerUrl }}
114
+ style={styles.webview}
115
+ originWhitelist={['*']}
116
+ injectedJavaScript={RENDER_POLLER}
117
+ onLoadEnd={handleLoadEnd}
118
+ onMessage={handleMessage}
119
+ onError={onError}
120
+ onHttpError={onError}
121
+ />
122
+ {!ready && (
123
+ <View style={styles.loadingOverlay} pointerEvents="none">
124
+ <ActivityIndicator size="large" />
125
+ </View>
126
+ )}
127
+ </View>
128
+ );
129
+ };
130
+
131
+ export default GViewWebView;
132
+
133
+ const styles = StyleSheet.create({
134
+ container: { flex: 1, width: '100%', backgroundColor: '#fff' },
135
+ webview: { flex: 1, backgroundColor: '#fff' },
136
+ loadingOverlay: {
137
+ ...StyleSheet.absoluteFillObject,
138
+ justifyContent: 'center',
139
+ alignItems: 'center',
140
+ backgroundColor: '#ffffff',
141
+ },
142
+ });
@@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react';
2
2
  import { ActivityIndicator, Platform, StyleSheet, Text, View } from 'react-native';
3
3
  import { WebView } from 'react-native-webview';
4
4
  import * as FileSystem from 'expo-file-system/legacy';
5
+ import GViewWebView from './GViewWebView';
5
6
 
6
7
  interface PdfViewerProps {
7
8
  pdfUrl: string;
@@ -40,24 +41,7 @@ const PdfViewer: React.FC<PdfViewerProps> = ({ pdfUrl }) => {
40
41
  }, [pdfUrl, isAndroid]);
41
42
 
42
43
  if (isAndroid) {
43
- const gviewUrl = `https://docs.google.com/gview?embedded=true&url=${encodeURIComponent(
44
- pdfUrl
45
- )}`;
46
- return (
47
- <View style={styles.container}>
48
- <WebView
49
- source={{ uri: gviewUrl }}
50
- style={styles.webview}
51
- originWhitelist={['*']}
52
- startInLoadingState
53
- renderLoading={() => (
54
- <View style={styles.center}>
55
- <ActivityIndicator size="large" />
56
- </View>
57
- )}
58
- />
59
- </View>
60
- );
44
+ return <GViewWebView url={pdfUrl} />;
61
45
  }
62
46
 
63
47
  if (error) {
@@ -7,6 +7,7 @@ import {
7
7
  import { BackIcon, MoreIcon, QrIcon } from '../../assets/icons';
8
8
  import Button from '../styled/Button';
9
9
  import { Text } from 'react-native';
10
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
10
11
 
11
12
  interface ModalHeaderComponentProps {
12
13
  handleCloseModal?: any;
@@ -21,8 +22,14 @@ const ModalHeaderComponent: React.FC<ModalHeaderComponentProps> = ({
21
22
  rightMenu,
22
23
  leftMenu,
23
24
  }) => {
25
+ // The library's full-screen modals are an absolute-fill overlay inside
26
+ // ModalBackground (NOT a native Modal), so the OS doesn't apply any
27
+ // status-bar inset automatically — we have to. SafeAreaProvider is
28
+ // mounted by ReduxWrapper, so this reads the live per-device inset
29
+ // (notch / Dynamic Island / nothing).
30
+ const insets = useSafeAreaInsets();
24
31
  return (
25
- <HeaderContainer>
32
+ <HeaderContainer style={{ paddingTop: insets.top + 8 }}>
26
33
  <HeaderLeft>
27
34
  {leftMenu ? (
28
35
  leftMenu
@@ -72,10 +72,19 @@ export const HeaderContainer = styled.View`
72
72
  position: relative;
73
73
  top: 0;
74
74
  width: 100%;
75
- padding: 2px 8px;
76
- padding-top: 62px;
77
- max-height: 24px;
78
- min-height: 24px;
75
+ /* The previous incarnation had padding-top:62px (hard-coded status-bar
76
+ * offset) clamped to min/max-height:24px — content overflowed the
77
+ * visible band and the back arrow hugged the bottom edge. The earlier
78
+ * fix dropped the clamp but kept a hard-coded 56px top inset, which on
79
+ * top of this modal's absolute-fill overlay (no system inset is auto-
80
+ * applied) made the header eat far more space than it should.
81
+ *
82
+ * Now: compact 8px vertical padding here; the dynamic top inset for
83
+ * the status bar / Dynamic Island is supplied by ModalHeaderComponent
84
+ * via useSafeAreaInsets() — accurate per-device (~59px on a 16 Pro,
85
+ * 20px on an SE). Together that's status-bar + 8px above the back
86
+ * button and 8px below — properly sized and properly centered. */
87
+ padding: 8px 16px;
79
88
  background-color: #fff;
80
89
  border-bottom-width: 1px;
81
90
  border-bottom-color: #f0f0f0;
@@ -3,58 +3,43 @@ import {
3
3
  LastRoomMessageContainer,
4
4
  LastRoomMessageName,
5
5
  LastRoomMessageText,
6
- ShadeWrapper,
7
6
  } from './StyledRoomComponents';
8
7
  import { LastMessage } from '../../../types/types';
9
8
  import styled from 'styled-components/native';
10
- import { Text, View } from 'react-native';
9
+ import { View } from 'react-native';
10
+ import { PlayIcon } from '../../../assets/icons';
11
11
 
12
12
  interface LastMessageEmojiProps extends Pick<LastMessage, 'user' | 'body'> {}
13
13
 
14
14
  const PlayButton = styled.View`
15
- position: absolute;
16
- width: 8px;
17
- height: 9px;
18
- border-radius: 50%;
15
+ width: 20px;
16
+ height: 20px;
17
+ border-radius: 10px;
19
18
  display: flex;
20
19
  justify-content: center;
21
20
  align-items: center;
22
- color: white;
23
- font-size: 10px;
24
- pointer-events: none;
25
- z-index: 100;
21
+ background-color: #d8ecff;
22
+ margin-top: 1px;
26
23
  `;
27
24
 
28
- const PhotoContainer = styled.View`
29
- position: relative;
30
- width: 20px;
31
- height: 20px;
32
- overflow: hidden;
33
- border-radius: 8px;
34
- width: 20px;
35
- height: 20px;
36
- object-fit: cover;
37
- pointer-events: none;
25
+ const AudioRow = styled.View`
26
+ flex-direction: row;
27
+ align-items: center;
28
+ gap: 6px;
38
29
  `;
39
30
 
40
31
  const LastAudioMessage: FC<LastMessageEmojiProps> = ({ user, body }) => {
41
32
  return (
42
33
  <LastRoomMessageContainer>
43
- <LastRoomMessageName>{user?.name ?? ''}</LastRoomMessageName>
44
- <View
45
- style={{
46
- display: 'flex',
47
- flexDirection: 'row',
48
- gap: '4px',
49
- }}
50
- >
51
- <PhotoContainer>
52
- <ShadeWrapper>
53
- <PlayButton><Text>▶</Text></PlayButton>
54
- </ShadeWrapper>
55
- </PhotoContainer>
56
- <LastRoomMessageText>audio</LastRoomMessageText>
57
- </View>
34
+ <LastRoomMessageName numberOfLines={1}>{user?.name ?? ''}</LastRoomMessageName>
35
+ <AudioRow>
36
+ <PlayButton>
37
+ <PlayIcon width={10} height={10} color="#1F2937" />
38
+ </PlayButton>
39
+ <LastRoomMessageText numberOfLines={1}>
40
+ {body?.trim() ? body : 'audio'}
41
+ </LastRoomMessageText>
42
+ </AudioRow>
58
43
  </LastRoomMessageContainer>
59
44
  );
60
45
  };