@droppii-org/chat-mobile 0.2.15 → 0.2.17

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 (102) hide show
  1. package/lib/module/components/AttachmentPreview.js +9 -7
  2. package/lib/module/components/AttachmentPreview.js.map +1 -1
  3. package/lib/module/components/MergedImageGrid.js +28 -18
  4. package/lib/module/components/MergedImageGrid.js.map +1 -1
  5. package/lib/module/components/ThreadCard/ThreadCard.js +2 -1
  6. package/lib/module/components/ThreadCard/ThreadCard.js.map +1 -1
  7. package/lib/module/components/messages/imageMessage/index.js.map +1 -1
  8. package/lib/module/components/messages/mergedMessage/index.js +4 -7
  9. package/lib/module/components/messages/mergedMessage/index.js.map +1 -1
  10. package/lib/module/hooks/useImageAttachment.js +50 -71
  11. package/lib/module/hooks/useImageAttachment.js.map +1 -1
  12. package/lib/module/hooks/useVideoAttachment.js +1 -1
  13. package/lib/module/index.js +1 -1
  14. package/lib/module/index.js.map +1 -1
  15. package/lib/module/screens/MediaView/VideoPlayer.js +1 -0
  16. package/lib/module/screens/MediaView/VideoPlayer.js.map +1 -1
  17. package/lib/module/screens/MediaView/index.js +8 -10
  18. package/lib/module/screens/MediaView/index.js.map +1 -1
  19. package/lib/module/screens/chat-detail/ChatComposer.js +10 -3
  20. package/lib/module/screens/chat-detail/ChatComposer.js.map +1 -1
  21. package/lib/module/screens/chat-detail/ChatListLegend.js +11 -2
  22. package/lib/module/screens/chat-detail/ChatListLegend.js.map +1 -1
  23. package/lib/module/screens/chat-detail/hooks/useAttachmentSendHandler.js +66 -25
  24. package/lib/module/screens/chat-detail/hooks/useAttachmentSendHandler.js.map +1 -1
  25. package/lib/module/services/attachmentHandlers/imageAttachmentHandler.js +6 -3
  26. package/lib/module/services/attachmentHandlers/imageAttachmentHandler.js.map +1 -1
  27. package/lib/module/services/attachmentHandlers/videoAttachmentHandler.js +1 -1
  28. package/lib/module/services/auth.js +69 -0
  29. package/lib/module/services/auth.js.map +1 -1
  30. package/lib/module/services/imageUpload.js +84 -58
  31. package/lib/module/services/imageUpload.js.map +1 -1
  32. package/lib/module/translation/resources/i18n.js +1 -0
  33. package/lib/module/translation/resources/i18n.js.map +1 -1
  34. package/lib/module/utils/chatImageDimens.js +18 -1
  35. package/lib/module/utils/chatImageDimens.js.map +1 -1
  36. package/lib/module/utils/dateTimeUtils.js +44 -0
  37. package/lib/module/utils/dateTimeUtils.js.map +1 -0
  38. package/lib/module/utils/device.js +2 -1
  39. package/lib/module/utils/device.js.map +1 -1
  40. package/lib/module/utils/imageUtils.js +4 -2
  41. package/lib/module/utils/imageUtils.js.map +1 -1
  42. package/lib/module/{components/ThreadCard/thread-card.utils.js → utils/messageUtils.js} +18 -42
  43. package/lib/module/utils/messageUtils.js.map +1 -0
  44. package/lib/module/utils/videoThumbnail.js +86 -7
  45. package/lib/module/utils/videoThumbnail.js.map +1 -1
  46. package/lib/typescript/src/components/AttachmentPreview.d.ts.map +1 -1
  47. package/lib/typescript/src/components/MergedImageGrid.d.ts +2 -2
  48. package/lib/typescript/src/components/MergedImageGrid.d.ts.map +1 -1
  49. package/lib/typescript/src/components/ThreadCard/ThreadCard.d.ts.map +1 -1
  50. package/lib/typescript/src/components/messages/imageMessage/index.d.ts.map +1 -1
  51. package/lib/typescript/src/components/messages/mergedMessage/index.d.ts.map +1 -1
  52. package/lib/typescript/src/hooks/useImageAttachment.d.ts.map +1 -1
  53. package/lib/typescript/src/index.d.ts +1 -1
  54. package/lib/typescript/src/index.d.ts.map +1 -1
  55. package/lib/typescript/src/screens/MediaView/VideoPlayer.d.ts.map +1 -1
  56. package/lib/typescript/src/screens/MediaView/index.d.ts.map +1 -1
  57. package/lib/typescript/src/screens/chat-detail/ChatComposer.d.ts.map +1 -1
  58. package/lib/typescript/src/screens/chat-detail/ChatListLegend.d.ts.map +1 -1
  59. package/lib/typescript/src/screens/chat-detail/hooks/useAttachmentSendHandler.d.ts.map +1 -1
  60. package/lib/typescript/src/services/attachmentHandlers/imageAttachmentHandler.d.ts.map +1 -1
  61. package/lib/typescript/src/services/auth.d.ts +32 -0
  62. package/lib/typescript/src/services/auth.d.ts.map +1 -1
  63. package/lib/typescript/src/services/imageUpload.d.ts.map +1 -1
  64. package/lib/typescript/src/translation/resources/i18n.d.ts.map +1 -1
  65. package/lib/typescript/src/utils/chatImageDimens.d.ts +1 -0
  66. package/lib/typescript/src/utils/chatImageDimens.d.ts.map +1 -1
  67. package/lib/typescript/src/utils/dateTimeUtils.d.ts +6 -0
  68. package/lib/typescript/src/utils/dateTimeUtils.d.ts.map +1 -0
  69. package/lib/typescript/src/utils/device.d.ts.map +1 -1
  70. package/lib/typescript/src/utils/imageUtils.d.ts.map +1 -1
  71. package/lib/typescript/src/utils/messageUtils.d.ts +8 -0
  72. package/lib/typescript/src/utils/messageUtils.d.ts.map +1 -0
  73. package/lib/typescript/src/utils/videoThumbnail.d.ts +1 -0
  74. package/lib/typescript/src/utils/videoThumbnail.d.ts.map +1 -1
  75. package/package.json +2 -2
  76. package/src/components/AttachmentPreview.tsx +11 -5
  77. package/src/components/MergedImageGrid.tsx +36 -23
  78. package/src/components/ThreadCard/ThreadCard.tsx +2 -1
  79. package/src/components/messages/imageMessage/index.tsx +0 -1
  80. package/src/components/messages/mergedMessage/index.tsx +5 -7
  81. package/src/hooks/useImageAttachment.ts +67 -82
  82. package/src/hooks/useVideoAttachment.ts +1 -1
  83. package/src/index.tsx +8 -1
  84. package/src/screens/MediaView/VideoPlayer.tsx +1 -0
  85. package/src/screens/MediaView/index.tsx +8 -7
  86. package/src/screens/chat-detail/ChatComposer.tsx +9 -3
  87. package/src/screens/chat-detail/ChatListLegend.tsx +9 -2
  88. package/src/screens/chat-detail/hooks/useAttachmentSendHandler.ts +81 -25
  89. package/src/services/attachmentHandlers/imageAttachmentHandler.ts +11 -1
  90. package/src/services/attachmentHandlers/videoAttachmentHandler.ts +1 -1
  91. package/src/services/auth.ts +77 -0
  92. package/src/services/imageUpload.ts +116 -73
  93. package/src/translation/resources/i18n.ts +1 -0
  94. package/src/utils/chatImageDimens.ts +21 -1
  95. package/src/utils/dateTimeUtils.ts +48 -0
  96. package/src/utils/device.ts +1 -0
  97. package/src/utils/imageUtils.ts +10 -2
  98. package/src/{components/ThreadCard/thread-card.utils.ts → utils/messageUtils.ts} +18 -56
  99. package/src/utils/videoThumbnail.ts +90 -5
  100. package/lib/module/components/ThreadCard/thread-card.utils.js.map +0 -1
  101. package/lib/typescript/src/components/ThreadCard/thread-card.utils.d.ts +0 -4
  102. package/lib/typescript/src/components/ThreadCard/thread-card.utils.d.ts.map +0 -1
@@ -8,6 +8,7 @@ const DeviceUtils = {
8
8
  mediaType: 'any',
9
9
  compressImageQuality: 0.8,
10
10
  multiple,
11
+ forceJpg: true,
11
12
  });
12
13
 
13
14
  const images = Array.isArray(result) ? result : [result];
@@ -24,6 +24,8 @@ export const getMimeType = (fileName: string): string => {
24
24
  jpeg: 'image/jpeg',
25
25
  png: 'image/png',
26
26
  webp: 'image/webp',
27
+ heic: 'image/heic',
28
+ heif: 'image/heif',
27
29
  mp4: 'video/mp4',
28
30
  mov: 'video/quicktime',
29
31
  avi: 'video/x-msvideo',
@@ -63,9 +65,15 @@ export const validateImageFile = (file: ImageFile): string | null => {
63
65
  return `Image too large. Max ${formatFileSize(MAX_SIZE)}`;
64
66
  }
65
67
 
66
- const validMimes = ['image/jpeg', 'image/png', 'image/webp'];
68
+ const validMimes = [
69
+ 'image/jpeg',
70
+ 'image/png',
71
+ 'image/webp',
72
+ 'image/heic',
73
+ 'image/heif',
74
+ ];
67
75
  if (!validMimes.includes(file.mime)) {
68
- return 'Unsupported format. Only JPEG, PNG, WebP';
76
+ return 'Unsupported format. Only JPEG, PNG, WebP, HEIC';
69
77
  }
70
78
 
71
79
  return null;
@@ -1,8 +1,13 @@
1
+ /**
2
+ * Message formatting and preview utilities
3
+ */
4
+
1
5
  import { MessageType } from '@droppii/openim-rn-client-sdk';
2
- import type { DMessageItem } from '../../types/chat';
3
- import { DChatMessageType } from '../../types/message';
6
+ import type { DMessageItem } from '../types/chat';
7
+ import { DChatMessageType } from '../types/message';
8
+ import { formatDuration } from './dateTimeUtils';
4
9
 
5
- const extractTextContent = (message: DMessageItem): string => {
10
+ export const extractTextContent = (message: DMessageItem): string => {
6
11
  if (message.textElem?.content) return message.textElem.content;
7
12
  try {
8
13
  const parsed = JSON.parse(message.content) as { content?: string };
@@ -12,13 +17,7 @@ const extractTextContent = (message: DMessageItem): string => {
12
17
  }
13
18
  };
14
19
 
15
- const formatDuration = (seconds: number): string => {
16
- const mins = Math.floor(seconds / 60);
17
- const secs = seconds % 60;
18
- return `${mins}:${secs.toString().padStart(2, '0')}`;
19
- };
20
-
21
- const getMessagePreview = (message: DMessageItem): string => {
20
+ export const getMessagePreview = (message: DMessageItem): string => {
22
21
  // Check custom message type first
23
22
  if (message.contentType === MessageType.CustomMessage) {
24
23
  try {
@@ -49,8 +48,8 @@ const getMessagePreview = (message: DMessageItem): string => {
49
48
 
50
49
  case MessageType.VideoMessage:
51
50
  try {
52
- const videoData = JSON.parse(message.content);
53
- const duration = videoData.duration || 0;
51
+ const videoData = message?.videoElem;
52
+ const duration = videoData?.duration || 0;
54
53
  const durationStr = duration > 0 ? ` ${formatDuration(duration)}` : '';
55
54
  return `[Video]${durationStr}`;
56
55
  } catch {
@@ -75,7 +74,7 @@ const getMessagePreview = (message: DMessageItem): string => {
75
74
  (msg: any) => msg.contentType === MessageType.PictureMessage
76
75
  ).length;
77
76
  if (imageCount > 0) {
78
- return `${imageCount} [Hình ảnh]`;
77
+ return '[Hình ảnh]';
79
78
  }
80
79
  }
81
80
  } catch {
@@ -108,52 +107,15 @@ export const getLastMessageText = (
108
107
  const preview = getMessagePreview(message);
109
108
  if (!preview) return '';
110
109
 
111
- // Add sender name
110
+ // Add sender name for outgoing messages
112
111
  if (currentUserId && message.sendID === currentUserId) {
113
112
  return `Bạn: ${preview}`;
114
113
  }
115
114
 
116
- return preview;
117
- };
118
-
119
- export const formatTimestamp = (ts: number | string | null): string => {
120
- if (!ts) return '';
121
-
122
- try {
123
- const date = new Date(ts);
124
- if (isNaN(date.getTime())) return '';
125
-
126
- const now = new Date();
127
- const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
128
- const yesterday = new Date(today.getTime() - 24 * 60 * 60 * 1000);
129
- const dateOnly = new Date(
130
- date.getFullYear(),
131
- date.getMonth(),
132
- date.getDate()
133
- );
134
-
135
- if (dateOnly.getTime() === today.getTime()) {
136
- const h = date.getHours().toString().padStart(2, '0');
137
- const m = date.getMinutes().toString().padStart(2, '0');
138
- return `${h}:${m}`;
139
- }
140
-
141
- if (dateOnly.getTime() === yesterday.getTime()) {
142
- return 'Hôm qua';
143
- }
144
-
145
- const daysAgo = Math.floor(
146
- (today.getTime() - dateOnly.getTime()) / (24 * 60 * 60 * 1000)
147
- );
148
- if (daysAgo > 0 && daysAgo < 7) {
149
- const dayNames = ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'];
150
- return dayNames[date.getDay()] ?? '';
151
- }
152
-
153
- const d = date.getDate().toString().padStart(2, '0');
154
- const mo = (date.getMonth() + 1).toString().padStart(2, '0');
155
- return `${d}/${mo}`;
156
- } catch {
157
- return '';
115
+ // Add sender nickname for incoming messages
116
+ if (message.senderNickname) {
117
+ return `${message.senderNickname}: ${preview}`;
158
118
  }
119
+
120
+ return preview;
159
121
  };
@@ -1,9 +1,11 @@
1
+ import { Platform } from 'react-native';
1
2
  import RNFS from 'react-native-fs';
2
3
  import { createThumbnail } from 'react-native-create-thumbnail';
3
4
 
4
5
  interface ThumbnailOptions {
5
6
  time?: number; // timestamp in milliseconds (default: 0)
6
7
  quality?: number; // 0-100 (default: 100)
8
+ cacheId?: string; // unique cache identifier for this thumbnail (optional)
7
9
  }
8
10
 
9
11
  interface ThumbnailResult {
@@ -12,26 +14,102 @@ interface ThumbnailResult {
12
14
  height: number;
13
15
  }
14
16
 
17
+ /**
18
+ * Routes the video source so react-native-create-thumbnail picks the correct
19
+ * native MediaMetadataRetriever.setDataSource overload.
20
+ *
21
+ * Root cause of the Android crash: CreateThumbnailModule.getBitmapAtTime branches
22
+ * on the URL scheme —
23
+ * - "file://..." -> setDataSource(String) ✅ works for local files
24
+ * - "content://" -> setDataSource(Context, Uri)
25
+ * - otherwise -> setDataSource(String, Map headers) ❌ this overload is for
26
+ * REMOTE URIs; a bare local path makes it throw an uncaught
27
+ * RuntimeException (status 0xFFFFFFEA / EINVAL) → app crash.
28
+ * The app strips "file://" before calling, so local videos fall into the broken
29
+ * branch. The fix is to KEEP the file:// scheme so the working overload is used.
30
+ *
31
+ * For Android photo-picker synthetic paths we additionally copy the file into the
32
+ * app cache first (a clean, app-private file the retriever can always open) and
33
+ * still hand it back with a file:// prefix. Returns the path to pass to
34
+ * createThumbnail plus a raw cleanup path for any temp copy.
35
+ */
36
+ const ensureRetrievableVideoPath = async (
37
+ videoPath: string
38
+ ): Promise<{ path: string; cleanupPath: string | null }> => {
39
+ // iOS (and any non-Android platform) is left completely untouched.
40
+ if (Platform.OS !== 'android') {
41
+ return { path: videoPath, cleanupPath: null };
42
+ }
43
+
44
+ // content:// is handled by a dedicated native branch — pass through unchanged.
45
+ if (videoPath.startsWith('content://')) {
46
+ return { path: videoPath, cleanupPath: null };
47
+ }
48
+
49
+ const rawPath = videoPath.startsWith('file://')
50
+ ? videoPath.replace('file://', '')
51
+ : videoPath;
52
+
53
+ const isSynthetic =
54
+ rawPath.includes('/.transforms/') || rawPath.includes('/synthetic/');
55
+
56
+ if (isSynthetic) {
57
+ const ext = (rawPath.split('.').pop() || 'mp4').split('?')[0];
58
+ const dest = `${RNFS.CachesDirectoryPath}/video-thumb-src-${Date.now()}-${Math.floor(
59
+ Math.random() * 1e6
60
+ )}.${ext}`;
61
+
62
+ console.log(
63
+ '[VideoThumbnail] Copying picker video to cache before thumbnail',
64
+ { from: rawPath, to: dest }
65
+ );
66
+ await RNFS.copyFile(rawPath, dest);
67
+ return { path: `file://${dest}`, cleanupPath: dest };
68
+ }
69
+
70
+ // Any other local path: ensure the file:// scheme so the native module routes
71
+ // to setDataSource(String) instead of the broken (String, Map) overload.
72
+ return { path: `file://${rawPath}`, cleanupPath: null };
73
+ };
74
+
15
75
  export const VideoThumbnailUtil = {
16
76
  generateThumbnail: async (
17
77
  videoPath: string,
18
78
  options: ThumbnailOptions = {}
19
79
  ): Promise<ThumbnailResult | null> => {
20
- const { time = 1000, quality = 80 } = options; // time in milliseconds
80
+ const { time = 800, quality = 80, cacheId } = options; // time in milliseconds
81
+
82
+ let tempSourcePath: string | null = null;
21
83
 
22
84
  try {
85
+ // Normalize the source so the native MediaMetadataRetriever can open it.
86
+ // Android picker paths crash the app otherwise (see ensureRetrievableVideoPath).
87
+ const { path: retrievablePath, cleanupPath } =
88
+ await ensureRetrievableVideoPath(videoPath);
89
+ tempSourcePath = cleanupPath;
90
+
91
+ // Generate unique cache name per video to avoid conflicts with concurrent generations
92
+ // Uses provided cacheId or generates one from videoPath filename
93
+ const fileName = retrievablePath.split('/').pop() || String(Date.now());
94
+ const cacheName =
95
+ cacheId ||
96
+ `thumb-${fileName.replace(/[^a-zA-Z0-9-_]/g, '')}-${Math.abs(
97
+ fileName.charCodeAt(0) + fileName.charCodeAt(fileName.length - 1)
98
+ )}`;
99
+
23
100
  console.log('[VideoThumbnail] Generating thumbnail', {
24
- videoPath,
101
+ videoPath: retrievablePath,
25
102
  timeMs: time,
26
103
  quality,
104
+ cacheName,
27
105
  });
28
106
 
29
107
  const result = await createThumbnail({
30
- url: videoPath,
108
+ url: retrievablePath,
31
109
  timeStamp: time,
32
- format: 'jpeg',
110
+ format: 'png',
33
111
  dirSize: 100,
34
- cacheName: 'video-thumbnails',
112
+ cacheName,
35
113
  });
36
114
 
37
115
  console.log('✅ [VideoThumbnail] THUMBNAIL PATH:', result.path);
@@ -49,6 +127,13 @@ export const VideoThumbnailUtil = {
49
127
  } catch (error) {
50
128
  console.error('[VideoThumbnail] Failed to generate thumbnail', error);
51
129
  return null;
130
+ } finally {
131
+ // Remove the temporary video copy made for synthetic/content sources.
132
+ if (tempSourcePath) {
133
+ RNFS.unlink(tempSourcePath).catch((err) =>
134
+ console.warn('[VideoThumbnail] Temp source cleanup failed:', err)
135
+ );
136
+ }
52
137
  }
53
138
  },
54
139
 
@@ -1 +0,0 @@
1
- {"version":3,"names":["MessageType","DChatMessageType","extractTextContent","message","textElem","content","parsed","JSON","parse","formatDuration","seconds","mins","Math","floor","secs","toString","padStart","getMessagePreview","contentType","CustomMessage","data","dataType","type","Link","linkText","title","Order","orderCode","code","TextMessage","PictureMessage","VideoMessage","videoData","duration","durationStr","FileMessage","fileData","fileName","name","MergeMessage","mergeData","mergeElem","multiMessage","imageCount","filter","msg","length","UrlTextMessage","urlText","urlTextElem","urls","console","log","AtTextMessage","QuoteMessage","getLastMessageText","currentUserId","preview","sendID","formatTimestamp","ts","date","Date","isNaN","getTime","now","today","getFullYear","getMonth","getDate","yesterday","dateOnly","h","getHours","m","getMinutes","daysAgo","dayNames","getDay","d","mo"],"sourceRoot":"../../../../src","sources":["components/ThreadCard/thread-card.utils.ts"],"mappings":"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","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- import type { DMessageItem } from '../../types/chat';
2
- export declare const getLastMessageText: (message: DMessageItem | undefined, currentUserId?: string) => string;
3
- export declare const formatTimestamp: (ts: number | string | null) => string;
4
- //# sourceMappingURL=thread-card.utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"thread-card.utils.d.ts","sourceRoot":"","sources":["../../../../../src/components/ThreadCard/thread-card.utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAoGrD,eAAO,MAAM,kBAAkB,GAC7B,SAAS,YAAY,GAAG,SAAS,EACjC,gBAAgB,MAAM,KACrB,MAYF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAwC5D,CAAC"}