@messenger-box/platform-mobile 10.0.3-alpha.17 → 10.0.3-alpha.19

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 (25) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/screens/inbox/components/CachedImage/consts.js +1 -1
  3. package/lib/screens/inbox/components/CachedImage/consts.js.map +1 -1
  4. package/lib/screens/inbox/components/CachedImage/index.js +125 -16
  5. package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
  6. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +32 -21
  7. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
  8. package/lib/screens/inbox/containers/ConversationView.js +1174 -403
  9. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  10. package/lib/screens/inbox/containers/ThreadConversationView.js +1284 -361
  11. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  12. package/lib/screens/inbox/containers/workflow/conversation-xstate.js +380 -0
  13. package/lib/screens/inbox/containers/workflow/conversation-xstate.js.map +1 -0
  14. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js +438 -0
  15. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js.map +1 -0
  16. package/package.json +2 -2
  17. package/src/screens/inbox/components/CachedImage/consts.ts +4 -3
  18. package/src/screens/inbox/components/CachedImage/index.tsx +137 -17
  19. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +35 -9
  20. package/src/screens/inbox/containers/ConversationView.tsx +1512 -647
  21. package/src/screens/inbox/containers/ThreadConversationView.tsx +1720 -296
  22. package/src/screens/inbox/containers/workflow/apollo/handleResult.ts +20 -0
  23. package/src/screens/inbox/containers/workflow/conversation-xstate.ts +313 -0
  24. package/src/screens/inbox/containers/workflow/dialogs-xstate.ts +196 -0
  25. package/src/screens/inbox/containers/workflow/thread-conversation-xstate.ts +401 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [10.0.3-alpha.19](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.18...v10.0.3-alpha.19) (2025-04-10)
7
+
8
+ **Note:** Version bump only for package @messenger-box/platform-mobile
9
+
10
+ ## [10.0.3-alpha.18](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.17...v10.0.3-alpha.18) (2025-04-10)
11
+
12
+ **Note:** Version bump only for package @messenger-box/platform-mobile
13
+
6
14
  ## [10.0.3-alpha.17](https://github.com/CDEBase/messenger-box/compare/v10.0.3-alpha.16...v10.0.3-alpha.17) (2025-04-08)
7
15
 
8
16
  **Note:** Version bump only for package @messenger-box/platform-mobile
@@ -1 +1 @@
1
- import*as FileSystem from'expo-file-system';const IMAGE_CACHE_FOLDER = `${FileSystem.cacheDirectory}`;export{IMAGE_CACHE_FOLDER,IMAGE_CACHE_FOLDER as default};//# sourceMappingURL=consts.js.map
1
+ import*as FileSystem from'expo-file-system';const IMAGE_CACHE_FOLDER = `${FileSystem.cacheDirectory}/image-cache/`;export{IMAGE_CACHE_FOLDER,IMAGE_CACHE_FOLDER as default};//# sourceMappingURL=consts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"consts.js","sources":["../../../../../src/screens/inbox/components/CachedImage/consts.ts"],"sourcesContent":["import * as FileSystem from \"expo-file-system\"\n\nexport const IMAGE_CACHE_FOLDER = `${FileSystem.cacheDirectory}`\n// export const IMAGE_CACHE_FOLDER = `${FileSystem.documentDirectory}images/`\nexport default IMAGE_CACHE_FOLDER\n"],"names":[],"mappings":"4CACa,MAAA,kBAAA,GAAqB,GAAG,UAAW,CAAA,cAAA,CAAA"}
1
+ {"version":3,"file":"consts.js","sources":["../../../../../src/screens/inbox/components/CachedImage/consts.ts"],"sourcesContent":["import * as FileSystem from 'expo-file-system';\n\n// Make sure cache directory path ends with a slash\nexport const IMAGE_CACHE_FOLDER = `${FileSystem.cacheDirectory}/image-cache/`;\n// export const IMAGE_CACHE_FOLDER = `${FileSystem.documentDirectory}images/`\nexport default IMAGE_CACHE_FOLDER;\n"],"names":[],"mappings":"4CAGa,MAAA,kBAAA,GAAqB,GAAG,UAAW,CAAA,cAAA,CAAA,aAAA"}
@@ -1,4 +1,4 @@
1
- import React__default,{useState,useRef,useEffect}from'react';import {Image}from'react-native';import*as FileSystem from'expo-file-system';import {IMAGE_CACHE_FOLDER}from'./consts.js';var __defProp = Object.defineProperty;
1
+ import React__default,{useState,useRef,useEffect}from'react';import {Image,View,Text}from'react-native';import*as FileSystem from'expo-file-system';import {IMAGE_CACHE_FOLDER}from'./consts.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -17,6 +17,31 @@ var __spreadValues = (a, b) => {
17
17
  return a;
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const ensureCacheDirectory = async () => {
21
+ try {
22
+ const dirInfo = await FileSystem.getInfoAsync(IMAGE_CACHE_FOLDER);
23
+ if (!dirInfo.exists) {
24
+ console.log("Creating cache directory:", IMAGE_CACHE_FOLDER);
25
+ await FileSystem.makeDirectoryAsync(IMAGE_CACHE_FOLDER, {
26
+ intermediates: true
27
+ });
28
+ }
29
+ } catch (error) {
30
+ console.error("Failed to create cache directory:", error);
31
+ }
32
+ };
33
+ const validateImageUri = (uri) => {
34
+ if (!uri)
35
+ return null;
36
+ uri = uri.trim();
37
+ try {
38
+ new URL(uri);
39
+ } catch (e) {
40
+ console.log("Invalid URL format:", uri);
41
+ return null;
42
+ }
43
+ return uri;
44
+ };
20
45
  const CachedImage = (props) => {
21
46
  const {
22
47
  source,
@@ -24,27 +49,42 @@ const CachedImage = (props) => {
24
49
  placeholderContent
25
50
  } = props;
26
51
  const {
27
- uri,
52
+ uri: originalUri,
28
53
  headers,
29
54
  expiresIn
30
55
  } = source;
56
+ const uri = validateImageUri(originalUri);
31
57
  const fileURI = `${IMAGE_CACHE_FOLDER}${cacheKey}`;
32
58
  const [imgUri, setImgUri] = useState(fileURI);
59
+ const [loadError, setLoadError] = useState(false);
60
+ const [useFallbackUri, setUseFallbackUri] = useState(false);
33
61
  const componentIsMounted = useRef(true);
34
62
  const requestOption = headers ? {
35
63
  headers
36
64
  } : {};
37
65
  const _callback = (downloadProgress) => {
66
+ var _a;
38
67
  if (componentIsMounted.current === false) {
39
- downloadResumableRef.current.pauseAsync();
68
+ (_a = downloadResumableRef.current) == null ? void 0 : _a.pauseAsync();
40
69
  FileSystem.deleteAsync(fileURI, {
41
70
  idempotent: true
42
71
  });
43
72
  }
44
73
  };
45
- const downloadResumableRef = useRef(FileSystem.createDownloadResumable(uri, fileURI, requestOption, _callback));
74
+ const downloadResumableRef = useRef(uri ? FileSystem.createDownloadResumable(uri, fileURI, requestOption, _callback) : null);
46
75
  useEffect(() => {
47
- loadImage();
76
+ const initCache = async () => {
77
+ await ensureCacheDirectory();
78
+ if (uri) {
79
+ loadImage();
80
+ } else {
81
+ console.log("Image URI is invalid, not loading");
82
+ setLoadError(true);
83
+ }
84
+ };
85
+ console.log("CachedImage loading with URI:", uri);
86
+ console.log("Cache key:", cacheKey);
87
+ initCache();
48
88
  return () => {
49
89
  componentIsMounted.current = false;
50
90
  };
@@ -53,6 +93,17 @@ const CachedImage = (props) => {
53
93
  try {
54
94
  const metadata = await FileSystem.getInfoAsync(fileURI);
55
95
  const expired = expiresIn && new Date().getTime() / 1e3 - (metadata == null ? void 0 : metadata.modificationTime) > expiresIn;
96
+ console.log({
97
+ expiresIn,
98
+ expired
99
+ });
100
+ console.log({
101
+ modificationTime: metadata.modificationTime,
102
+ currentTime: new Date().getTime() / 1e3
103
+ });
104
+ console.log({
105
+ metadata
106
+ });
56
107
  if (!metadata.exists || (metadata == null ? void 0 : metadata.size) === 0 || expired) {
57
108
  if (componentIsMounted.current) {
58
109
  setImgUri(null);
@@ -62,28 +113,86 @@ const CachedImage = (props) => {
62
113
  });
63
114
  }
64
115
  setImgUri(null);
65
- const response = await downloadResumableRef.current.downloadAsync();
66
- if (componentIsMounted.current && response.status === 200) {
67
- setImgUri(`${fileURI}?`);
116
+ console.log("Downloading image from URI:", uri);
117
+ if (!uri) {
118
+ console.log("Image URI is undefined or null");
119
+ setLoadError(true);
120
+ return;
68
121
  }
69
- if (response.status !== 200) {
70
- FileSystem.deleteAsync(fileURI, {
71
- idempotent: true
72
- });
122
+ if (!downloadResumableRef.current) {
123
+ console.log("Download resumable is null");
124
+ setUseFallbackUri(true);
125
+ setImgUri(uri);
126
+ return;
127
+ }
128
+ try {
129
+ const response = await downloadResumableRef.current.downloadAsync();
130
+ console.log("Download response:", response);
131
+ if (componentIsMounted.current && response && response.status === 200) {
132
+ setImgUri(`${fileURI}?`);
133
+ console.log("Image cached successfully, new URI:", `${fileURI}?`);
134
+ } else {
135
+ console.log("Failed to download image, status:", response == null ? void 0 : response.status);
136
+ console.log("Falling back to original URI");
137
+ setUseFallbackUri(true);
138
+ setImgUri(uri);
139
+ FileSystem.deleteAsync(fileURI, {
140
+ idempotent: true
141
+ });
142
+ }
143
+ } catch (downloadError) {
144
+ console.log("Error downloading image:", downloadError);
145
+ console.log("Falling back to original URI");
146
+ setUseFallbackUri(true);
147
+ setImgUri(uri);
73
148
  }
74
149
  }
150
+ } else {
151
+ console.log("Using cached image at:", fileURI);
75
152
  }
76
153
  } catch (err) {
154
+ console.log({
155
+ err
156
+ });
157
+ console.log("Falling back to original URI");
158
+ setUseFallbackUri(true);
159
+ setImgUri(uri);
77
160
  }
78
161
  };
79
- if (!imgUri)
80
- return placeholderContent || null;
162
+ console.log({
163
+ placeholderContent,
164
+ imgUri,
165
+ loadError,
166
+ useFallbackUri
167
+ });
168
+ const defaultPlaceholder = /* @__PURE__ */ React__default.createElement(View, { style: {
169
+ width: "100%",
170
+ height: "100%",
171
+ backgroundColor: "#e1e1e1",
172
+ justifyContent: "center",
173
+ alignItems: "center",
174
+ borderRadius: 3
175
+ } }, /* @__PURE__ */ React__default.createElement(Text, null, "Image not available"));
176
+ if (!imgUri) {
177
+ return placeholderContent || defaultPlaceholder;
178
+ }
81
179
  return /* @__PURE__ */ React__default.createElement(
82
180
  Image,
83
181
  __spreadProps(__spreadValues({}, props), {
84
182
  source: __spreadProps(__spreadValues({}, source), {
85
- uri: imgUri
86
- })
183
+ uri: useFallbackUri ? uri : imgUri
184
+ }),
185
+ onError: (e) => {
186
+ console.log("Image loading error:", e.nativeEvent.error);
187
+ if (useFallbackUri) {
188
+ setLoadError(true);
189
+ setImgUri(null);
190
+ } else {
191
+ console.log("Falling back to original URI after onError");
192
+ setUseFallbackUri(true);
193
+ setImgUri(uri);
194
+ }
195
+ }
87
196
  })
88
197
  );
89
198
  };export{CachedImage as default};//# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/screens/inbox/components/CachedImage/index.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef } from 'react';\nimport { Image } from 'react-native';\n// import { Image } from \"react-native\"\nimport * as FileSystem from 'expo-file-system';\n\nimport * as CONST from './consts';\n\nconst CachedImage = (props: any) => {\n const { source, cacheKey, placeholderContent } = props;\n const { uri, headers, expiresIn } = source;\n const fileURI = `${CONST.IMAGE_CACHE_FOLDER}${cacheKey}`;\n\n const [imgUri, setImgUri] = useState<any>(fileURI);\n\n const componentIsMounted = useRef(true);\n const requestOption = headers ? { headers } : {};\n\n const _callback = (downloadProgress: any) => {\n if (componentIsMounted.current === false) {\n downloadResumableRef.current.pauseAsync();\n FileSystem.deleteAsync(fileURI, { idempotent: true }); // delete file locally if it was not downloaded properly\n }\n };\n\n const downloadResumableRef = useRef(FileSystem.createDownloadResumable(uri, fileURI, requestOption, _callback));\n\n useEffect(() => {\n loadImage();\n return () => {\n componentIsMounted.current = false;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const loadImage = async () => {\n try {\n // Use the cached image if it exists\n const metadata: any = await FileSystem.getInfoAsync(fileURI);\n const expired = expiresIn && new Date().getTime() / 1000 - metadata?.modificationTime > expiresIn;\n // console.log({expiresIn, expired})\n\n // console.log({modificationTime: metadata.modificationTime, currentTime: new Date().getTime() / 1000})\n // console.log({metadata})\n if (!metadata.exists || metadata?.size === 0 || expired) {\n if (componentIsMounted.current) {\n setImgUri(null);\n\n if (expired) {\n await FileSystem.deleteAsync(fileURI, { idempotent: true });\n }\n // download to cache\n setImgUri(null);\n\n const response: any = await downloadResumableRef.current.downloadAsync();\n if (componentIsMounted.current && response.status === 200) {\n setImgUri(`${fileURI}?`); // deep clone to force re-render\n }\n if (response.status !== 200) {\n FileSystem.deleteAsync(fileURI, { idempotent: true }); // delete file locally if it was not downloaded properly\n }\n }\n }\n } catch (err) {\n // console.log({ err })\n }\n };\n // console.log({placeholderContent})\n if (!imgUri) return placeholderContent || null;\n\n return (\n <Image\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n source={{\n ...source,\n uri: imgUri,\n }}\n />\n );\n};\n\nexport const CacheManager = {\n addToCache: async ({ file, key }: any) => {\n await FileSystem.copyAsync({\n from: file,\n to: `${CONST.IMAGE_CACHE_FOLDER}${key}`,\n });\n // const uri = await FileSystem.getContentUriAsync(`${CONST.IMAGE_CACHE_FOLDER}${key}`)\n // return uri\n const uri = await CacheManager.getCachedUri({ key });\n return uri;\n },\n\n getCachedUri: async ({ key }: any) => {\n const uri = await FileSystem.getContentUriAsync(`${CONST.IMAGE_CACHE_FOLDER}${key}`);\n return uri;\n },\n\n downloadAsync: async ({ uri, key, options }: any) => {\n return await FileSystem.downloadAsync(uri, `${CONST.IMAGE_CACHE_FOLDER}${key}`, options);\n },\n};\n\nexport default CachedImage;\n"],"names":["CONST.IMAGE_CACHE_FOLDER","React"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/screens/inbox/components/CachedImage/index.tsx"],"sourcesContent":["import React, { useEffect, useState, useRef } from 'react';\nimport { Image, View, Text } from 'react-native';\n// import { Image } from \"react-native\"\nimport * as FileSystem from 'expo-file-system';\n\nimport * as CONST from './consts';\n\n// Ensure the cache directory exists\nconst ensureCacheDirectory = async () => {\n try {\n const dirInfo = await FileSystem.getInfoAsync(CONST.IMAGE_CACHE_FOLDER);\n if (!dirInfo.exists) {\n console.log('Creating cache directory:', CONST.IMAGE_CACHE_FOLDER);\n await FileSystem.makeDirectoryAsync(CONST.IMAGE_CACHE_FOLDER, { intermediates: true });\n }\n } catch (error) {\n console.error('Failed to create cache directory:', error);\n }\n};\n\n// Validate and sanitize the image URL\nconst validateImageUri = (uri: string): string | null => {\n if (!uri) return null;\n\n // Trim whitespace\n uri = uri.trim();\n\n // Check if it's a valid URL format\n try {\n new URL(uri);\n } catch (e) {\n console.log('Invalid URL format:', uri);\n return null;\n }\n\n // Add more validation as needed for your specific case\n return uri;\n};\n\nconst CachedImage = (props: any) => {\n const { source, cacheKey, placeholderContent } = props;\n const { uri: originalUri, headers, expiresIn } = source;\n\n // Validate and sanitize the URI\n const uri = validateImageUri(originalUri);\n\n const fileURI = `${CONST.IMAGE_CACHE_FOLDER}${cacheKey}`;\n\n const [imgUri, setImgUri] = useState<any>(fileURI);\n const [loadError, setLoadError] = useState<boolean>(false);\n const [useFallbackUri, setUseFallbackUri] = useState<boolean>(false);\n\n const componentIsMounted = useRef(true);\n const requestOption = headers ? { headers } : {};\n\n const _callback = (downloadProgress: any) => {\n if (componentIsMounted.current === false) {\n downloadResumableRef.current?.pauseAsync();\n FileSystem.deleteAsync(fileURI, { idempotent: true }); // delete file locally if it was not downloaded properly\n }\n };\n\n const downloadResumableRef = useRef(\n uri ? FileSystem.createDownloadResumable(uri, fileURI, requestOption, _callback) : null,\n );\n\n useEffect(() => {\n const initCache = async () => {\n await ensureCacheDirectory();\n if (uri) {\n loadImage();\n } else {\n console.log('Image URI is invalid, not loading');\n setLoadError(true);\n }\n };\n\n console.log('CachedImage loading with URI:', uri);\n console.log('Cache key:', cacheKey);\n\n initCache();\n\n return () => {\n componentIsMounted.current = false;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const loadImage = async () => {\n try {\n // Use the cached image if it exists\n const metadata: any = await FileSystem.getInfoAsync(fileURI);\n const expired = expiresIn && new Date().getTime() / 1000 - metadata?.modificationTime > expiresIn;\n console.log({ expiresIn, expired });\n\n console.log({ modificationTime: metadata.modificationTime, currentTime: new Date().getTime() / 1000 });\n console.log({ metadata });\n\n if (!metadata.exists || metadata?.size === 0 || expired) {\n if (componentIsMounted.current) {\n setImgUri(null);\n\n if (expired) {\n await FileSystem.deleteAsync(fileURI, { idempotent: true });\n }\n // download to cache\n setImgUri(null);\n\n console.log('Downloading image from URI:', uri);\n if (!uri) {\n console.log('Image URI is undefined or null');\n setLoadError(true);\n return;\n }\n\n if (!downloadResumableRef.current) {\n console.log('Download resumable is null');\n setUseFallbackUri(true);\n setImgUri(uri);\n return;\n }\n\n try {\n const response: any = await downloadResumableRef.current.downloadAsync();\n console.log('Download response:', response);\n\n if (componentIsMounted.current && response && response.status === 200) {\n setImgUri(`${fileURI}?`); // deep clone to force re-render\n console.log('Image cached successfully, new URI:', `${fileURI}?`);\n } else {\n console.log('Failed to download image, status:', response?.status);\n console.log('Falling back to original URI');\n setUseFallbackUri(true);\n setImgUri(uri);\n FileSystem.deleteAsync(fileURI, { idempotent: true }); // delete file locally if it was not downloaded properly\n }\n } catch (downloadError) {\n console.log('Error downloading image:', downloadError);\n console.log('Falling back to original URI');\n setUseFallbackUri(true);\n setImgUri(uri);\n }\n }\n } else {\n console.log('Using cached image at:', fileURI);\n }\n } catch (err) {\n console.log({ err });\n console.log('Falling back to original URI');\n setUseFallbackUri(true);\n setImgUri(uri);\n }\n };\n\n console.log({ placeholderContent, imgUri, loadError, useFallbackUri });\n\n // Default placeholder if none is provided\n const defaultPlaceholder = (\n <View\n style={{\n width: '100%',\n height: '100%',\n backgroundColor: '#e1e1e1',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 3,\n }}\n >\n <Text>Image not available</Text>\n </View>\n );\n\n if (!imgUri) {\n return placeholderContent || defaultPlaceholder;\n }\n\n return (\n <Image\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n source={{\n ...source,\n uri: useFallbackUri ? uri : imgUri,\n }}\n onError={(e) => {\n console.log('Image loading error:', e.nativeEvent.error);\n // If we're already using the fallback URI and still getting an error,\n // then show the placeholder\n if (useFallbackUri) {\n setLoadError(true);\n setImgUri(null);\n } else {\n console.log('Falling back to original URI after onError');\n setUseFallbackUri(true);\n setImgUri(uri);\n }\n }}\n />\n );\n};\n\nexport const CacheManager = {\n addToCache: async ({ file, key }: any) => {\n await FileSystem.copyAsync({\n from: file,\n to: `${CONST.IMAGE_CACHE_FOLDER}${key}`,\n });\n // const uri = await FileSystem.getContentUriAsync(`${CONST.IMAGE_CACHE_FOLDER}${key}`)\n // return uri\n const uri = await CacheManager.getCachedUri({ key });\n return uri;\n },\n\n getCachedUri: async ({ key }: any) => {\n const uri = await FileSystem.getContentUriAsync(`${CONST.IMAGE_CACHE_FOLDER}${key}`);\n return uri;\n },\n\n downloadAsync: async ({ uri, key, options }: any) => {\n return await FileSystem.downloadAsync(uri, `${CONST.IMAGE_CACHE_FOLDER}${key}`, options);\n },\n};\n\nexport default CachedImage;\n"],"names":["CONST.IMAGE_CACHE_FOLDER","React"],"mappings":"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"}
@@ -38,7 +38,7 @@ const {
38
38
  isSameDay
39
39
  } = utils;
40
40
  const windowWidth = Dimensions.get("window").width;
41
- const windowHeight = Dimensions.get("window").height;
41
+ Dimensions.get("window").height;
42
42
  class Bubble extends React__default.Component {
43
43
  constructor(props) {
44
44
  super(props);
@@ -79,26 +79,37 @@ class Bubble extends React__default.Component {
79
79
  image,
80
80
  _id
81
81
  } = messageImageProps == null ? void 0 : messageImageProps.currentMessage;
82
- return /* @__PURE__ */ React__default.createElement(
83
- TouchableHighlight,
84
- {
85
- underlayColor: "transparent",
86
- style: {
87
- width: "100%"
88
- },
89
- onPress: () => this.props.setImageViewer(messageImageProps == null ? void 0 : messageImageProps.currentMessage, true)
90
- },
91
- /* @__PURE__ */ React__default.createElement(View, { style: {
92
- width: windowWidth - (windowWidth - 150),
93
- height: windowHeight - (windowHeight - 100)
94
- } }, /* @__PURE__ */ React__default.createElement(CachedImage, { style: [styles.slackImage, {
95
- width: "100%",
96
- height: "100%"
97
- }], cacheKey: `${_id}-slack-bubble-imageKey`, source: {
98
- uri: image,
99
- expiresIn: 86400
100
- }, resizeMode: "cover", alt: "image" }))
101
- );
82
+ if (!image || typeof image !== "string") {
83
+ console.log("Invalid image URL:", image);
84
+ return null;
85
+ }
86
+ console.log("Rendering message image:", image);
87
+ return /* @__PURE__ */ React__default.createElement(TouchableHighlight, { underlayColor: "transparent", style: {
88
+ width: "100%",
89
+ marginVertical: 5
90
+ }, onPress: () => this.props.setImageViewer(messageImageProps == null ? void 0 : messageImageProps.currentMessage, true) }, /* @__PURE__ */ React__default.createElement(View, { style: {
91
+ width: windowWidth * 0.6,
92
+ height: windowWidth * 0.4,
93
+ maxHeight: 200,
94
+ borderRadius: 8,
95
+ overflow: "hidden",
96
+ borderWidth: 1,
97
+ borderColor: "#e0e0e0",
98
+ backgroundColor: "#f7f7f7"
99
+ } }, /* @__PURE__ */ React__default.createElement(CachedImage, { style: [styles.slackImage, {
100
+ width: "100%",
101
+ height: "100%"
102
+ }], cacheKey: `${_id}-slack-bubble-imageKey`, source: {
103
+ uri: image,
104
+ expiresIn: 86400
105
+ }, resizeMode: "cover", alt: "image", placeholderContent: /* @__PURE__ */ React__default.createElement(View, { style: [styles.slackImage, {
106
+ width: "100%",
107
+ height: "100%",
108
+ backgroundColor: "#e1e1e1",
109
+ justifyContent: "center",
110
+ alignItems: "center",
111
+ borderRadius: 8
112
+ }] }, /* @__PURE__ */ React__default.createElement(Text, null, "Loading...")) })));
102
113
  }
103
114
  return null;
104
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SlackBubble.js","sources":["../../../../../src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx"],"sourcesContent":["/* eslint-disable no-underscore-dangle, no-use-before-define */\nimport React from 'react';\nimport { Text, StyleSheet, TouchableOpacity, TouchableHighlight, View, Platform, Dimensions } from 'react-native';\n\nimport { MessageText, MessageImage, Time, utils } from 'react-native-gifted-chat';\nimport CachedImage from '../CachedImage';\nconst { isSameUser, isSameDay } = utils;\nconst windowWidth = Dimensions.get('window').width;\nconst windowHeight = Dimensions.get('window').height;\n\nexport default class Bubble extends React.Component<any> {\n static defaultProps: {\n touchableProps: {};\n onLongPress: null;\n renderMessageImage: null;\n renderMessageText: null;\n renderCustomView: null;\n renderTime: null;\n currentMessage: { text: null; createdAt: null; image: null };\n nextMessage: {};\n previousMessage: {};\n containerStyle: {};\n wrapperStyle: {};\n tickStyle: {};\n containerToNextStyle: {};\n containerToPreviousStyle: {};\n isShowImageViewer: false;\n setImageViewer: (obj: any, v: boolean) => void;\n };\n static propTypes: any;\n constructor(props: any) {\n super(props);\n }\n\n renderMessageText() {\n if (this.props.currentMessage.text) {\n const { containerStyle, wrapperStyle, messageTextStyle, ...messageTextProps } = this.props;\n if (this.props.renderMessageText) {\n return this.props.renderMessageText(messageTextProps);\n }\n return (\n <MessageText\n {...messageTextProps}\n textStyle={{\n left: [\n styles.standardFont,\n styles.slackMessageText,\n messageTextProps.textStyle,\n messageTextStyle,\n ],\n }}\n />\n );\n }\n return null;\n }\n\n renderMessageImage() {\n if (this.props.currentMessage.image) {\n const { containerStyle, wrapperStyle, ...messageImageProps } = this.props;\n if (this.props.renderMessageImage) {\n return this.props.renderMessageImage(messageImageProps);\n }\n const { image, _id } = messageImageProps?.currentMessage;\n\n return (\n <TouchableHighlight\n // underlayColor={'#c0c0c0'}\n underlayColor={'transparent'}\n style={{ width: '100%' }}\n onPress={() => this.props.setImageViewer(messageImageProps?.currentMessage, true)}\n >\n <View\n style={{\n width: windowWidth - (windowWidth - 150),\n height: windowHeight - (windowHeight - 100),\n }}\n >\n {/* <MessageImage\n {...messageImageProps}\n imageStyle={[styles.slackImage, messageImageProps.imageStyle]}\n /> */}\n <CachedImage\n style={[styles.slackImage, { width: '100%', height: '100%' }]}\n cacheKey={`${_id}-slack-bubble-imageKey`}\n source={{\n uri: image,\n //headers: `Authorization: Bearer ${token}`,\n expiresIn: 86400,\n }}\n resizeMode={'cover'}\n alt={'image'}\n />\n </View>\n </TouchableHighlight>\n );\n }\n return null;\n }\n\n renderTicks() {\n const { currentMessage } = this.props;\n if (this.props.renderTicks) {\n return this.props.renderTicks(currentMessage);\n }\n if (currentMessage.user._id !== this.props.user._id) {\n return null;\n }\n if (currentMessage.sent || currentMessage.received) {\n return (\n <View style={[styles.headerItem, styles.tickView]}>\n {currentMessage.sent && (\n <Text style={[styles.standardFont, styles.tick, this.props.tickStyle]}>✓</Text>\n )}\n {currentMessage.received && (\n <Text style={[styles.standardFont, styles.tick, this.props.tickStyle]}>✓</Text>\n )}\n </View>\n );\n }\n return null;\n }\n\n renderUsername() {\n const username = this.props.currentMessage.user.name;\n if (username) {\n const { containerStyle, wrapperStyle, ...usernameProps } = this.props;\n if (this.props.renderUsername) {\n return this.props.renderUsername(usernameProps);\n }\n return (\n <Text style={[styles.standardFont, styles.headerItem, styles.username, this.props.usernameStyle]}>\n {username}\n </Text>\n );\n }\n return null;\n }\n\n renderTime() {\n if (this.props.currentMessage.createdAt) {\n const { containerStyle, wrapperStyle, ...timeProps }: any = this.props;\n if (this.props.renderTime) {\n return this.props.renderTime(timeProps);\n }\n return (\n <Time\n {...timeProps}\n containerStyle={{ left: [styles.timeContainer] }}\n textStyle={{\n left: [styles.standardFont, styles.headerItem, styles.time, timeProps.textStyle],\n }}\n />\n );\n }\n return null;\n }\n\n renderCustomView() {\n if (this.props.renderCustomView) {\n return this.props.renderCustomView(this.props);\n }\n return null;\n }\n\n render() {\n const isSameThread =\n isSameUser(this.props.currentMessage, this.props.previousMessage) &&\n isSameDay(this.props.currentMessage, this.props.previousMessage);\n\n const messageHeader = isSameThread ? null : (\n <View style={styles.headerView}>\n {this.renderUsername()}\n {this.renderTime()}\n {this.renderTicks()}\n </View>\n );\n\n return (\n <View style={[styles.container, this.props.containerStyle]}>\n <TouchableHighlight\n style={{ width: '100%' }}\n // underlayColor={'#c0c0c0'}\n underlayColor={'transparent'}\n disabled={true}\n accessibilityTraits=\"text\"\n {...this.props.touchableProps}\n >\n <View style={[styles.wrapper, this.props.wrapperStyle]}>\n <View>\n {this.renderCustomView()}\n {messageHeader}\n {this.renderMessageImage()}\n {this.renderMessageText()}\n </View>\n </View>\n </TouchableHighlight>\n </View>\n );\n }\n}\n\n// Note: Everything is forced to be \"left\" positioned with this component.\n// The \"right\" position is only used in the default Bubble.\nconst styles = StyleSheet.create({\n standardFont: {\n fontSize: 15,\n },\n slackMessageText: {\n marginLeft: 0,\n marginRight: 0,\n },\n container: {\n flex: 1,\n alignItems: 'flex-start',\n },\n wrapper: {\n marginRight: 60,\n minHeight: 20,\n justifyContent: 'flex-start',\n },\n username: {\n fontWeight: 'bold',\n top: 0,\n paddingTop: 0,\n marginTop: 0,\n },\n time: {\n textAlign: 'left',\n fontSize: 12,\n },\n timeContainer: {\n marginLeft: 0,\n marginRight: 0,\n marginBottom: 0,\n },\n headerItem: {\n marginRight: 10,\n },\n headerView: {\n // Try to align it better with the avatar on Android.\n marginTop: Platform.OS === 'android' ? -2 : 0,\n flexDirection: 'row',\n alignItems: 'baseline',\n },\n /* eslint-disable react-native/no-color-literals */\n tick: {\n backgroundColor: 'transparent',\n color: 'white',\n },\n /* eslint-enable react-native/no-color-literals */\n tickView: {\n flexDirection: 'row',\n },\n slackImage: {\n borderRadius: 3,\n marginLeft: 8,\n marginRight: 0,\n },\n});\n\n// Bubble.contextTypes = {\n// actionSheet: PropTypes.func,\n// };\n\nBubble.defaultProps = {\n touchableProps: {},\n onLongPress: null,\n renderMessageImage: null,\n renderMessageText: null,\n renderCustomView: null,\n renderTime: null,\n currentMessage: {\n text: null,\n createdAt: null,\n image: null,\n },\n nextMessage: {},\n previousMessage: {},\n containerStyle: {},\n wrapperStyle: {},\n tickStyle: {},\n containerToNextStyle: {},\n containerToPreviousStyle: {},\n isShowImageViewer: false,\n setImageViewer: (obj: any, v: boolean) => null,\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"SlackBubble.js","sources":["../../../../../src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx"],"sourcesContent":["/* eslint-disable no-underscore-dangle, no-use-before-define */\nimport React from 'react';\nimport { Text, StyleSheet, TouchableOpacity, TouchableHighlight, View, Platform, Dimensions } from 'react-native';\n\nimport { MessageText, MessageImage, Time, utils } from 'react-native-gifted-chat';\nimport CachedImage from '../CachedImage';\nconst { isSameUser, isSameDay } = utils;\nconst windowWidth = Dimensions.get('window').width;\nconst windowHeight = Dimensions.get('window').height;\n\nexport default class Bubble extends React.Component<any> {\n static defaultProps: {\n touchableProps: {};\n onLongPress: null;\n renderMessageImage: null;\n renderMessageText: null;\n renderCustomView: null;\n renderTime: null;\n currentMessage: { text: null; createdAt: null; image: null };\n nextMessage: {};\n previousMessage: {};\n containerStyle: {};\n wrapperStyle: {};\n tickStyle: {};\n containerToNextStyle: {};\n containerToPreviousStyle: {};\n isShowImageViewer: false;\n setImageViewer: (obj: any, v: boolean) => void;\n };\n static propTypes: any;\n constructor(props: any) {\n super(props);\n }\n\n renderMessageText() {\n if (this.props.currentMessage.text) {\n const { containerStyle, wrapperStyle, messageTextStyle, ...messageTextProps } = this.props;\n if (this.props.renderMessageText) {\n return this.props.renderMessageText(messageTextProps);\n }\n return (\n <MessageText\n {...messageTextProps}\n textStyle={{\n left: [\n styles.standardFont,\n styles.slackMessageText,\n messageTextProps.textStyle,\n messageTextStyle,\n ],\n }}\n />\n );\n }\n return null;\n }\n\n renderMessageImage() {\n if (this.props.currentMessage.image) {\n const { containerStyle, wrapperStyle, ...messageImageProps } = this.props;\n if (this.props.renderMessageImage) {\n return this.props.renderMessageImage(messageImageProps);\n }\n const { image, _id } = messageImageProps?.currentMessage;\n\n // Add validation for image URL\n if (!image || typeof image !== 'string') {\n console.log('Invalid image URL:', image);\n return null;\n }\n\n // Log the image URL for debugging\n console.log('Rendering message image:', image);\n\n return (\n <TouchableHighlight\n underlayColor={'transparent'}\n style={{ width: '100%', marginVertical: 5 }}\n onPress={() => this.props.setImageViewer(messageImageProps?.currentMessage, true)}\n >\n <View\n style={{\n width: windowWidth * 0.6, // 60% of screen width\n height: windowWidth * 0.4, // Maintain aspect ratio\n maxHeight: 200,\n borderRadius: 8,\n overflow: 'hidden',\n borderWidth: 1,\n borderColor: '#e0e0e0',\n backgroundColor: '#f7f7f7',\n }}\n >\n <CachedImage\n style={[styles.slackImage, { width: '100%', height: '100%' }]}\n cacheKey={`${_id}-slack-bubble-imageKey`}\n source={{\n uri: image,\n expiresIn: 86400,\n }}\n resizeMode={'cover'}\n alt={'image'}\n placeholderContent={\n <View\n style={[\n styles.slackImage,\n {\n width: '100%',\n height: '100%',\n backgroundColor: '#e1e1e1',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 8,\n },\n ]}\n >\n <Text>Loading...</Text>\n </View>\n }\n />\n </View>\n </TouchableHighlight>\n );\n }\n return null;\n }\n\n renderTicks() {\n const { currentMessage } = this.props;\n if (this.props.renderTicks) {\n return this.props.renderTicks(currentMessage);\n }\n if (currentMessage.user._id !== this.props.user._id) {\n return null;\n }\n if (currentMessage.sent || currentMessage.received) {\n return (\n <View style={[styles.headerItem, styles.tickView]}>\n {currentMessage.sent && (\n <Text style={[styles.standardFont, styles.tick, this.props.tickStyle]}>✓</Text>\n )}\n {currentMessage.received && (\n <Text style={[styles.standardFont, styles.tick, this.props.tickStyle]}>✓</Text>\n )}\n </View>\n );\n }\n return null;\n }\n\n renderUsername() {\n const username = this.props.currentMessage.user.name;\n if (username) {\n const { containerStyle, wrapperStyle, ...usernameProps } = this.props;\n if (this.props.renderUsername) {\n return this.props.renderUsername(usernameProps);\n }\n return (\n <Text style={[styles.standardFont, styles.headerItem, styles.username, this.props.usernameStyle]}>\n {username}\n </Text>\n );\n }\n return null;\n }\n\n renderTime() {\n if (this.props.currentMessage.createdAt) {\n const { containerStyle, wrapperStyle, ...timeProps }: any = this.props;\n if (this.props.renderTime) {\n return this.props.renderTime(timeProps);\n }\n return (\n <Time\n {...timeProps}\n containerStyle={{ left: [styles.timeContainer] }}\n textStyle={{\n left: [styles.standardFont, styles.headerItem, styles.time, timeProps.textStyle],\n }}\n />\n );\n }\n return null;\n }\n\n renderCustomView() {\n if (this.props.renderCustomView) {\n return this.props.renderCustomView(this.props);\n }\n return null;\n }\n\n render() {\n const isSameThread =\n isSameUser(this.props.currentMessage, this.props.previousMessage) &&\n isSameDay(this.props.currentMessage, this.props.previousMessage);\n\n const messageHeader = isSameThread ? null : (\n <View style={styles.headerView}>\n {this.renderUsername()}\n {this.renderTime()}\n {this.renderTicks()}\n </View>\n );\n\n return (\n <View style={[styles.container, this.props.containerStyle]}>\n <TouchableHighlight\n style={{ width: '100%' }}\n // underlayColor={'#c0c0c0'}\n underlayColor={'transparent'}\n disabled={true}\n accessibilityTraits=\"text\"\n {...this.props.touchableProps}\n >\n <View style={[styles.wrapper, this.props.wrapperStyle]}>\n <View>\n {this.renderCustomView()}\n {messageHeader}\n {this.renderMessageImage()}\n {this.renderMessageText()}\n </View>\n </View>\n </TouchableHighlight>\n </View>\n );\n }\n}\n\n// Note: Everything is forced to be \"left\" positioned with this component.\n// The \"right\" position is only used in the default Bubble.\nconst styles = StyleSheet.create({\n standardFont: {\n fontSize: 15,\n },\n slackMessageText: {\n marginLeft: 0,\n marginRight: 0,\n },\n container: {\n flex: 1,\n alignItems: 'flex-start',\n },\n wrapper: {\n marginRight: 60,\n minHeight: 20,\n justifyContent: 'flex-start',\n },\n username: {\n fontWeight: 'bold',\n top: 0,\n paddingTop: 0,\n marginTop: 0,\n },\n time: {\n textAlign: 'left',\n fontSize: 12,\n },\n timeContainer: {\n marginLeft: 0,\n marginRight: 0,\n marginBottom: 0,\n },\n headerItem: {\n marginRight: 10,\n },\n headerView: {\n // Try to align it better with the avatar on Android.\n marginTop: Platform.OS === 'android' ? -2 : 0,\n flexDirection: 'row',\n alignItems: 'baseline',\n },\n /* eslint-disable react-native/no-color-literals */\n tick: {\n backgroundColor: 'transparent',\n color: 'white',\n },\n /* eslint-enable react-native/no-color-literals */\n tickView: {\n flexDirection: 'row',\n },\n slackImage: {\n borderRadius: 3,\n marginLeft: 8,\n marginRight: 0,\n },\n});\n\n// Bubble.contextTypes = {\n// actionSheet: PropTypes.func,\n// };\n\nBubble.defaultProps = {\n touchableProps: {},\n onLongPress: null,\n renderMessageImage: null,\n renderMessageText: null,\n renderCustomView: null,\n renderTime: null,\n currentMessage: {\n text: null,\n createdAt: null,\n image: null,\n },\n nextMessage: {},\n previousMessage: {},\n containerStyle: {},\n wrapperStyle: {},\n tickStyle: {},\n containerToNextStyle: {},\n containerToPreviousStyle: {},\n isShowImageViewer: false,\n setImageViewer: (obj: any, v: boolean) => null,\n};\n"],"names":["React"],"mappings":"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"}