@messenger-box/platform-mobile 10.0.3-alpha.40 → 10.0.3-alpha.43

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 (54) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/lib/compute.js +2 -3
  3. package/lib/index.js.map +1 -1
  4. package/lib/queries/inboxQueries.js +77 -0
  5. package/lib/queries/inboxQueries.js.map +1 -0
  6. package/lib/routes.json +2 -3
  7. package/lib/screens/inbox/DialogThreadMessages.js +3 -7
  8. package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
  9. package/lib/screens/inbox/DialogThreads.js +3 -7
  10. package/lib/screens/inbox/DialogThreads.js.map +1 -1
  11. package/lib/screens/inbox/components/DialogsListItem.js +47 -46
  12. package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
  13. package/lib/screens/inbox/components/GiftedChatInboxComponent.js +313 -0
  14. package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -0
  15. package/lib/screens/inbox/components/ServiceDialogsListItem.js +72 -57
  16. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
  17. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +115 -14
  18. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
  19. package/lib/screens/inbox/components/SubscriptionHandler.js +24 -0
  20. package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -0
  21. package/lib/screens/inbox/containers/ConversationView.js +631 -488
  22. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  23. package/lib/screens/inbox/containers/Dialogs.js +96 -180
  24. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  25. package/lib/screens/inbox/containers/ThreadConversationView.js +659 -245
  26. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  27. package/lib/screens/inbox/containers/ThreadsView.js +3 -3
  28. package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
  29. package/lib/screens/inbox/hooks/useInboxMessages.js +31 -0
  30. package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -0
  31. package/package.json +3 -3
  32. package/src/index.ts +2 -0
  33. package/src/queries/inboxQueries.ts +298 -0
  34. package/src/queries/index.d.ts +2 -0
  35. package/src/queries/index.ts +1 -0
  36. package/src/screens/inbox/DialogThreadMessages.tsx +3 -11
  37. package/src/screens/inbox/DialogThreads.tsx +3 -7
  38. package/src/screens/inbox/components/Actionsheet.tsx +30 -0
  39. package/src/screens/inbox/components/DialogsListItem.tsx +89 -148
  40. package/src/screens/inbox/components/ExpandableInput.tsx +460 -0
  41. package/src/screens/inbox/components/ExpandableInputActionSheet.tsx +518 -0
  42. package/src/screens/inbox/components/GiftedChatInboxComponent.tsx +411 -0
  43. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +202 -221
  44. package/src/screens/inbox/components/SlackInput.tsx +23 -0
  45. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +216 -30
  46. package/src/screens/inbox/components/SubscriptionHandler.tsx +41 -0
  47. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +6 -7
  48. package/src/screens/inbox/containers/ConversationView.tsx +1105 -667
  49. package/src/screens/inbox/containers/Dialogs.tsx +195 -341
  50. package/src/screens/inbox/containers/SupportServiceDialogs.tsx +2 -2
  51. package/src/screens/inbox/containers/ThreadConversationView.tsx +1141 -402
  52. package/src/screens/inbox/containers/ThreadsView.tsx +5 -5
  53. package/src/screens/inbox/hooks/useInboxMessages.ts +34 -0
  54. package/src/screens/inbox/machines/threadsMachine.ts +2 -2
@@ -1,4 +1,4 @@
1
- import React__default,{useState,useRef,useCallback,useEffect}from'react';import {Box,FlatList,Center,Spinner,Text,Heading,Input,InputField}from'@admin-layout/gluestack-ui-mobile';import {Ionicons}from'@expo/vector-icons';import {useSelector}from'react-redux';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {DialogsListItem}from'../components/DialogsListItem.js';import {ServiceDialogsListItem}from'../components/ServiceDialogsListItem.js';import {useGetChannelsByUserWithServiceChannelsQuery,OnChatMessageAddedDocument}from'common/graphql';import {RoomType}from'common';import {userSelector}from'@adminide-stack/user-auth0-client';import {config}from'../config/config.js';import colors from'tailwindcss/colors';var __defProp = Object.defineProperty;
1
+ import React__default,{useState,useRef,useCallback,useMemo,useEffect}from'react';import {Center,Spinner,Text,Box,Heading,Input,InputField,FlatList}from'@admin-layout/gluestack-ui-mobile';import {Ionicons}from'@expo/vector-icons';import {useSelector}from'react-redux';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {DialogsListItem}from'../components/DialogsListItem.js';import {ServiceDialogsListItem}from'../components/ServiceDialogsListItem.js';import {useChannelsQuery,CHAT_MESSAGE_ADDED}from'../../../queries/inboxQueries.js';import {RoomType}from'common';import {userSelector}from'@adminide-stack/user-auth0-client';import {config}from'../config/config.js';import colors from'tailwindcss/colors';import {SubscriptionHandler}from'../components/SubscriptionHandler.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -48,7 +48,7 @@ const DialogsComponent = (props) => {
48
48
  refetch,
49
49
  fetchMore,
50
50
  subscribeToMore
51
- } = useGetChannelsByUserWithServiceChannelsQuery({
51
+ } = useChannelsQuery({
52
52
  variables: {
53
53
  role: channelRole,
54
54
  criteria: channelFilters,
@@ -59,41 +59,19 @@ const DialogsComponent = (props) => {
59
59
  limit: 15,
60
60
  skip: 0
61
61
  },
62
- fetchPolicy: "cache-and-network",
63
- nextFetchPolicy: "network-only",
64
62
  notifyOnNetworkStatusChange: true
65
63
  });
66
64
  const processChannels = useCallback((rawChannels = []) => {
67
- if (!rawChannels || !rawChannels.length)
65
+ if (!(rawChannels == null ? void 0 : rawChannels.length))
68
66
  return [];
69
- const filteredChannels2 = rawChannels.filter((c) => {
70
- if (!c || !c.members)
67
+ return rawChannels.filter((c) => {
68
+ if (!(c == null ? void 0 : c.members))
71
69
  return false;
72
- for (const member of c.members) {
73
- if (member && member.user && member.user.id !== (auth == null ? void 0 : auth.id) && member.user.__typename === "UserAccount") {
74
- return true;
75
- }
76
- }
77
- return false;
78
- });
79
- return filteredChannels2.map((channel) => {
80
- if (channel.lastMessage) {
81
- return __spreadProps(__spreadValues({}, channel), {
82
- lastMessage: __spreadProps(__spreadValues({}, channel.lastMessage), {
83
- id: channel.lastMessage.id,
84
- message: channel.lastMessage.message,
85
- createdAt: channel.lastMessage.createdAt || channel.lastMessage.updatedAt,
86
- updatedAt: channel.lastMessage.updatedAt || channel.lastMessage.createdAt,
87
- userId: channel.lastMessage.userId,
88
- channelId: channel.lastMessage.channelId || channel.id
89
- })
90
- });
91
- }
92
- return channel;
70
+ return c.members.some((member) => (member == null ? void 0 : member.user) && member.user.id !== (auth == null ? void 0 : auth.id) && member.user.__typename === "UserAccount");
93
71
  });
94
72
  }, [auth == null ? void 0 : auth.id]);
95
73
  const sortChannels = useCallback((channels2) => {
96
- if (!channels2 || !channels2.length)
74
+ if (!(channels2 == null ? void 0 : channels2.length))
97
75
  return [];
98
76
  return [...channels2].sort((a, b) => {
99
77
  const dateA = new Date((a == null ? void 0 : a.updatedAt) || (a == null ? void 0 : a.createdAt)).getTime();
@@ -101,135 +79,6 @@ const DialogsComponent = (props) => {
101
79
  return dateB - dateA;
102
80
  });
103
81
  }, []);
104
- const allChannels = [...(data == null ? void 0 : data.supportServiceChannels) || [], ...(data == null ? void 0 : data.channelsByUser) || []];
105
- const channels = sortChannels(processChannels(allChannels));
106
- useEffect(() => {
107
- if (!auth || !auth.id)
108
- return;
109
- console.log("\u{1F4F1} Setting up global message subscription for dialog updates");
110
- const unsubscribe = subscribeToMore({
111
- document: OnChatMessageAddedDocument,
112
- variables: {},
113
- updateQuery: (prev, {
114
- subscriptionData
115
- }) => {
116
- var _a2, _b;
117
- try {
118
- if (!subscriptionData.data || !isMountedRef.current)
119
- return prev;
120
- const subData = subscriptionData.data;
121
- const newMessage = subData.chatMessageAdded;
122
- console.log("\u{1F4F1} Dialog subscription received message update:", newMessage == null ? void 0 : newMessage.id);
123
- if (!newMessage || !newMessage.channelId)
124
- return prev;
125
- const channelId = newMessage.channelId.toString();
126
- let foundInDirectChannels = false;
127
- let foundInServiceChannels = false;
128
- const directChannelIndex = (_a2 = prev.channelsByUser) == null ? void 0 : _a2.findIndex((c) => c.id.toString() === channelId);
129
- if (directChannelIndex !== void 0 && directChannelIndex >= 0) {
130
- foundInDirectChannels = true;
131
- }
132
- const serviceChannelIndex = (_b = prev.supportServiceChannels) == null ? void 0 : _b.findIndex((c) => c.id.toString() === channelId);
133
- if (serviceChannelIndex !== void 0 && serviceChannelIndex >= 0) {
134
- foundInServiceChannels = true;
135
- }
136
- const result = __spreadProps(__spreadValues({}, prev), {
137
- channelsByUser: [...prev.channelsByUser || []],
138
- supportServiceChannels: [...prev.supportServiceChannels || []]
139
- });
140
- if (foundInDirectChannels && directChannelIndex >= 0) {
141
- const channel = __spreadValues({}, result.channelsByUser[directChannelIndex]);
142
- channel.lastMessage = newMessage;
143
- channel.updatedAt = newMessage.createdAt || new Date().toISOString();
144
- result.channelsByUser[directChannelIndex] = channel;
145
- }
146
- if (foundInServiceChannels && serviceChannelIndex >= 0) {
147
- const channel = __spreadValues({}, result.supportServiceChannels[serviceChannelIndex]);
148
- channel.lastMessage = newMessage;
149
- channel.updatedAt = newMessage.createdAt || new Date().toISOString();
150
- result.supportServiceChannels[serviceChannelIndex] = channel;
151
- }
152
- return result;
153
- } catch (error) {
154
- console.error("Error in dialog subscription handler:", error);
155
- return prev;
156
- }
157
- }
158
- });
159
- return () => {
160
- console.log("\u{1F4F1} Cleaning up dialog message subscription");
161
- unsubscribe();
162
- };
163
- }, [auth == null ? void 0 : auth.id, subscribeToMore]);
164
- useEffect(() => {
165
- return () => {
166
- isMountedRef.current = false;
167
- if (resetActiveChannelTimeoutRef.current) {
168
- clearTimeout(resetActiveChannelTimeoutRef.current);
169
- }
170
- };
171
- }, []);
172
- useFocusEffect(useCallback(() => {
173
- const now = Date.now();
174
- if (now - lastNavigationTimestamp.current > 300) {
175
- activeChannelRef.current = null;
176
- console.log("Reset active channel reference on focus");
177
- }
178
- return () => {
179
- lastNavigationTimestamp.current = Date.now();
180
- };
181
- }, []));
182
- useFocusEffect(useCallback(() => {
183
- console.log("\u{1F4F1} Focus effect triggered for Dialogs screen");
184
- const performRefresh = () => {
185
- const now = Date.now();
186
- if (now - lastRefreshTimeRef.current < MIN_REFRESH_INTERVAL) {
187
- console.log("\u23E9 Skipping refresh: too soon after previous refresh");
188
- return;
189
- }
190
- console.log("\u{1F504} Performing refresh on screen focus");
191
- if (isMountedRef.current) {
192
- lastRefreshTimeRef.current = now;
193
- refetch();
194
- }
195
- };
196
- const focusRefreshTimeout = setTimeout(performRefresh, 100);
197
- return () => clearTimeout(focusRefreshTimeout);
198
- }, [refetch]));
199
- const handlePullToRefresh = useCallback(() => {
200
- const now = Date.now();
201
- focusRefreshRef.current = now;
202
- console.log("\u{1F504} Pull-to-refresh triggered");
203
- refetch();
204
- }, [refetch]);
205
- const handleLoadMore = useCallback(() => {
206
- if (isLoadingMore || !data || channels.length < 10) {
207
- console.log("Skip loading more: already loading or all data loaded");
208
- return;
209
- }
210
- console.log("Loading more channels at page:", page + 1);
211
- setIsLoadingMore(true);
212
- fetchMore({
213
- variables: {
214
- skip: page * 15
215
- },
216
- updateQuery: (prev, {
217
- fetchMoreResult
218
- }) => {
219
- setIsLoadingMore(false);
220
- setPage((prevPage) => prevPage + 1);
221
- if (!fetchMoreResult)
222
- return prev;
223
- return __spreadProps(__spreadValues({}, fetchMoreResult), {
224
- channelsByUser: [...prev.channelsByUser || [], ...fetchMoreResult.channelsByUser || []],
225
- supportServiceChannels: [...prev.supportServiceChannels || [], ...fetchMoreResult.supportServiceChannels || []]
226
- });
227
- }
228
- }).catch((error) => {
229
- console.error("Error loading more channels:", error);
230
- setIsLoadingMore(false);
231
- });
232
- }, [fetchMore, isLoadingMore, data, channels.length, page]);
233
82
  const handleSelectChannel = useCallback((id, title) => {
234
83
  if (activeChannelRef.current === id) {
235
84
  console.log("\u{1F4F1} Ignoring repeated tap on channel:", id);
@@ -277,44 +126,35 @@ const DialogsComponent = (props) => {
277
126
  const handleSearchChange = useCallback((text) => {
278
127
  setSearchQuery(text);
279
128
  }, []);
280
- const filteredChannels = useCallback(() => {
129
+ const allChannels = useMemo(() => [...(data == null ? void 0 : data.supportServiceChannels) || [], ...(data == null ? void 0 : data.channelsByUser) || []], [data]);
130
+ const channels = useMemo(() => sortChannels(processChannels(allChannels)), [allChannels, processChannels, sortChannels]);
131
+ const displayChannels = useMemo(() => {
281
132
  if (!searchQuery.trim())
282
133
  return channels;
283
134
  const query = searchQuery.toLowerCase();
284
135
  return channels.filter((channel) => {
285
- if (channel.title && channel.title.toLowerCase().includes(query)) {
136
+ if (channel.title && channel.title.toLowerCase().includes(query))
286
137
  return true;
287
- }
288
138
  if (channel.members) {
289
- for (const member of channel.members) {
139
+ return channel.members.some((member) => {
290
140
  const user = member == null ? void 0 : member.user;
291
141
  if (!user)
292
- continue;
142
+ return false;
293
143
  const fullName = `${user.givenName || ""} ${user.familyName || ""}`.toLowerCase();
294
- if (fullName.includes(query)) {
295
- return true;
296
- }
297
- if (user.username && user.username.toLowerCase().includes(query)) {
298
- return true;
299
- }
300
- }
144
+ return fullName.includes(query) || user.username && user.username.toLowerCase().includes(query);
145
+ });
301
146
  }
302
147
  return false;
303
148
  });
304
149
  }, [channels, searchQuery]);
305
- const displayChannels = filteredChannels();
306
- return /* @__PURE__ */ React__default.createElement(Box, { className: "p-2" }, /* @__PURE__ */ React__default.createElement(FlatList, { data: displayChannels, onRefresh: handlePullToRefresh, refreshing: loading && !isLoadingMore, contentContainerStyle: {
307
- minHeight: "100%"
308
- }, ItemSeparatorComponent: () => /* @__PURE__ */ React__default.createElement(Box, { className: "h-0.5 bg-gray-200" }), renderItem: ({
150
+ const renderItem = useCallback(({
309
151
  item: channel
310
152
  }) => {
311
153
  const key = `${channel.type === RoomType.Service ? "service" : "direct"}-${channel.id}`;
312
154
  return (channel == null ? void 0 : channel.type) === RoomType.Service ? /* @__PURE__ */ React__default.createElement(ServiceDialogsListItem, { key, onOpen: handleSelectServiceChannel, currentUser: auth, channel, refreshing: loading, selectedChannelId, role: channelRole }) : /* @__PURE__ */ React__default.createElement(DialogsListItem, { key, onOpen: handleSelectChannel, currentUser: auth, channel, selectedChannelId, forceRefresh: true });
313
- }, ListFooterComponent: () => isLoadingMore ? /* @__PURE__ */ React__default.createElement(Center, { className: "py-4" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" })) : null, onEndReached: handleLoadMore, onEndReachedThreshold: 0.5, initialNumToRender: 5, maxToRenderPerBatch: 5, windowSize: 5, removeClippedSubviews: true, updateCellsBatchingPeriod: 100, getItemLayout: (data2, index) => ({
314
- length: 80,
315
- offset: 80 * index,
316
- index
317
- }), keyExtractor: (item) => `channel-${item.id}`, ListEmptyComponent: () => {
155
+ }, [auth, channelRole, handleSelectChannel, handleSelectServiceChannel, loading, selectedChannelId]);
156
+ const ListFooterComponent = useMemo(() => isLoadingMore ? /* @__PURE__ */ React__default.createElement(Center, { className: "py-4" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" })) : null, [isLoadingMore]);
157
+ const ListEmptyComponent = useMemo(() => {
318
158
  if (loading && displayChannels.length === 0) {
319
159
  return /* @__PURE__ */ React__default.createElement(Center, { className: "flex-1 justify-center items-center", style: {
320
160
  height: 300
@@ -328,6 +168,82 @@ const DialogsComponent = (props) => {
328
168
  } }, /* @__PURE__ */ React__default.createElement(InputField, { placeholder: "Search messages...", onChangeText: handleSearchChange, value: searchQuery })), /* @__PURE__ */ React__default.createElement(Center, { className: "items-center", style: {
329
169
  paddingVertical: 5
330
170
  } }, /* @__PURE__ */ React__default.createElement(Box, { className: "w-16 h-16 rounded-full bg-blue-500 flex items-center justify-center mb-5" }, /* @__PURE__ */ React__default.createElement(Ionicons, { name: "chatbubble-ellipses", size: 30, color: "white" })), /* @__PURE__ */ React__default.createElement(Text, { className: "text-2xl font-bold text-center mb-2" }, "No messages yet"), /* @__PURE__ */ React__default.createElement(Text, { className: "text-gray-600 text-center mb-8" }, "When you start conversations with others,", "\n", "they'll appear here.")));
331
- } }));
171
+ }, [loading, displayChannels.length, handleSearchChange, searchQuery]);
172
+ useEffect(() => {
173
+ return () => {
174
+ isMountedRef.current = false;
175
+ if (resetActiveChannelTimeoutRef.current) {
176
+ clearTimeout(resetActiveChannelTimeoutRef.current);
177
+ }
178
+ };
179
+ }, []);
180
+ useFocusEffect(useCallback(() => {
181
+ const now = Date.now();
182
+ if (now - lastNavigationTimestamp.current > 300) {
183
+ activeChannelRef.current = null;
184
+ console.log("Reset active channel reference on focus");
185
+ }
186
+ return () => {
187
+ lastNavigationTimestamp.current = Date.now();
188
+ };
189
+ }, []));
190
+ useFocusEffect(useCallback(() => {
191
+ console.log("\u{1F4F1} Focus effect triggered for Dialogs screen");
192
+ const performRefresh = () => {
193
+ const now = Date.now();
194
+ if (now - lastRefreshTimeRef.current < MIN_REFRESH_INTERVAL) {
195
+ console.log("\u23E9 Skipping refresh: too soon after previous refresh");
196
+ return;
197
+ }
198
+ console.log("\u{1F504} Performing refresh on screen focus");
199
+ if (isMountedRef.current) {
200
+ lastRefreshTimeRef.current = now;
201
+ refetch();
202
+ }
203
+ };
204
+ const focusRefreshTimeout = setTimeout(performRefresh, 100);
205
+ return () => clearTimeout(focusRefreshTimeout);
206
+ }, [refetch]));
207
+ const handlePullToRefresh = useCallback(() => {
208
+ const now = Date.now();
209
+ focusRefreshRef.current = now;
210
+ console.log("\u{1F504} Pull-to-refresh triggered");
211
+ refetch();
212
+ }, [refetch]);
213
+ const handleLoadMore = useCallback(() => {
214
+ if (isLoadingMore || !data || channels.length < 10) {
215
+ console.log("Skip loading more: already loading or all data loaded");
216
+ return;
217
+ }
218
+ console.log("Loading more channels at page:", page + 1);
219
+ setIsLoadingMore(true);
220
+ fetchMore({
221
+ variables: {
222
+ skip: page * 15
223
+ },
224
+ updateQuery: (prev, {
225
+ fetchMoreResult
226
+ }) => {
227
+ setIsLoadingMore(false);
228
+ setPage((prevPage) => prevPage + 1);
229
+ if (!fetchMoreResult)
230
+ return prev;
231
+ return __spreadProps(__spreadValues({}, fetchMoreResult), {
232
+ channelsByUser: [...prev.channelsByUser || [], ...fetchMoreResult.channelsByUser || []],
233
+ supportServiceChannels: [...prev.supportServiceChannels || [], ...fetchMoreResult.supportServiceChannels || []]
234
+ });
235
+ }
236
+ }).catch((error) => {
237
+ console.error("Error loading more channels:", error);
238
+ setIsLoadingMore(false);
239
+ });
240
+ }, [fetchMore, isLoadingMore, data, channels.length, page]);
241
+ return /* @__PURE__ */ React__default.createElement(Box, { className: "p-2" }, /* @__PURE__ */ React__default.createElement(SubscriptionHandler, { subscribeToMore, document: CHAT_MESSAGE_ADDED, variables: {}, updateQuery: void 0 }), /* @__PURE__ */ React__default.createElement(FlatList, { data: displayChannels, onRefresh: handlePullToRefresh, refreshing: loading && !isLoadingMore, contentContainerStyle: {
242
+ minHeight: "100%"
243
+ }, ItemSeparatorComponent: React__default.useCallback(() => /* @__PURE__ */ React__default.createElement(Box, { className: "h-0.5 bg-gray-200" }), []), renderItem, ListFooterComponent, onEndReached: handleLoadMore, onEndReachedThreshold: 0.5, initialNumToRender: 5, maxToRenderPerBatch: 5, windowSize: 5, removeClippedSubviews: true, updateCellsBatchingPeriod: 100, getItemLayout: React__default.useCallback((data2, index) => ({
244
+ length: 80,
245
+ offset: 80 * index,
246
+ index
247
+ }), []), keyExtractor: React__default.useCallback((item) => `channel-${item.id}`, []), ListEmptyComponent }));
332
248
  };
333
249
  const Dialogs = React__default.memo(DialogsComponent);export{Dialogs};//# sourceMappingURL=Dialogs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialogs.js","sources":["../../../../src/screens/inbox/containers/Dialogs.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { FlatList, Box, Heading, Input, InputField, Text, Center, Spinner } from '@admin-layout/gluestack-ui-mobile';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useSelector } from 'react-redux';\nimport { useNavigation, useRoute, useFocusEffect } from '@react-navigation/native';\nimport { DialogsListItem } from '../components/DialogsListItem';\nimport { ServiceDialogsListItem } from '../components/ServiceDialogsListItem';\nimport { useGetChannelsByUserWithServiceChannelsQuery, OnChatMessageAddedDocument } from 'common/graphql';\nimport { RoomType } from 'common';\nimport { userSelector } from '@adminide-stack/user-auth0-client';\nimport { config } from '../config';\nimport colors from 'tailwindcss/colors';\n\nexport interface InboxProps {\n channelFilters?: Record<string, unknown>;\n channelRole?: string;\n supportServices: boolean;\n}\n\nconst DialogsComponent = (props: InboxProps) => {\n const { channelFilters: channelFilterProp, channelRole, supportServices } = props;\n const channelFilters = { ...channelFilterProp };\n channelFilters.type = channelFilters?.type ?? RoomType.Direct;\n const { params } = useRoute<any>();\n const auth = useSelector(userSelector);\n const navigation = useNavigation<any>();\n\n // Local state for UI control\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedChannelId, setSelectedChannelId] = useState<string | null>(params?.channelId || null);\n const [page, setPage] = useState(1);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // Create a ref to track if component is mounted\n const isMountedRef = useRef(true);\n const focusRefreshRef = useRef<number | null>(null);\n const lastRefreshTimeRef = useRef(Date.now());\n const MIN_REFRESH_INTERVAL = 2000;\n\n // Add lastNavigationTimestamp to track when the user navigates away\n const lastNavigationTimestamp = useRef(0);\n // Track active channel to prevent duplicate clicks on the same channel\n const activeChannelRef = useRef<string | null>(null);\n // Hold a timeout ref to reset active channel status\n const resetActiveChannelTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Apollo query with pagination and optimistic updates\n const { data, loading, refetch, fetchMore, subscribeToMore } = useGetChannelsByUserWithServiceChannelsQuery({\n variables: {\n role: channelRole,\n criteria: channelFilters,\n supportServices: supportServices ? true : false,\n supportServiceCriteria: {\n type: RoomType.Service,\n },\n limit: 15,\n skip: 0,\n },\n fetchPolicy: 'cache-and-network',\n nextFetchPolicy: 'network-only',\n notifyOnNetworkStatusChange: true,\n });\n\n // Process the channels from the query response\n const processChannels = useCallback(\n (rawChannels = []) => {\n if (!rawChannels || !rawChannels.length) return [];\n\n // Filter out channels without valid members\n const filteredChannels = rawChannels.filter((c) => {\n if (!c || !c.members) return false;\n\n // Early return pattern for better performance\n for (const member of c.members) {\n if (\n member &&\n member.user &&\n member.user.id !== auth?.id &&\n member.user.__typename === 'UserAccount'\n ) {\n return true;\n }\n }\n return false;\n });\n\n // Process channels to ensure lastMessage property is properly structured\n return filteredChannels.map((channel) => {\n // If channel has a lastMessage, ensure it's properly formatted\n if (channel.lastMessage) {\n return {\n ...channel,\n lastMessage: {\n ...channel.lastMessage,\n // Ensure these essential properties exist\n id: channel.lastMessage.id,\n message: channel.lastMessage.message,\n createdAt: channel.lastMessage.createdAt || channel.lastMessage.updatedAt,\n updatedAt: channel.lastMessage.updatedAt || channel.lastMessage.createdAt,\n userId: channel.lastMessage.userId,\n channelId: channel.lastMessage.channelId || channel.id,\n },\n };\n }\n return channel;\n });\n },\n [auth?.id],\n );\n\n // Sort channels by most recent activity\n const sortChannels = useCallback((channels) => {\n if (!channels || !channels.length) return [];\n\n return [...channels].sort((a, b) => {\n const dateA = new Date(a?.updatedAt || a?.createdAt).getTime();\n const dateB = new Date(b?.updatedAt || b?.createdAt).getTime();\n return dateB - dateA; // Newest first\n });\n }, []);\n\n // Combine data from both channel types\n const allChannels = [...(data?.supportServiceChannels || []), ...(data?.channelsByUser || [])];\n\n // Process and sort the channels\n const channels = sortChannels(processChannels(allChannels));\n\n // Set up subscription for real-time message updates\n useEffect(() => {\n if (!auth || !auth.id) return;\n\n console.log('📱 Setting up global message subscription for dialog updates');\n\n const unsubscribe = subscribeToMore({\n document: OnChatMessageAddedDocument,\n variables: {}, // No specific channel ID - we'll handle all messages\n updateQuery: (prev, { subscriptionData }) => {\n try {\n if (!subscriptionData.data || !isMountedRef.current) return prev;\n\n const subData = subscriptionData.data as any;\n const newMessage = subData.chatMessageAdded;\n\n console.log('📱 Dialog subscription received message update:', newMessage?.id);\n\n // Skip if no message or no channelId\n if (!newMessage || !newMessage.channelId) return prev;\n\n // Find the channel this message belongs to\n const channelId = newMessage.channelId.toString();\n\n // Find which array contains this channel (direct or service)\n let foundInDirectChannels = false;\n let foundInServiceChannels = false;\n\n // Check if this channel exists in direct channels\n const directChannelIndex = prev.channelsByUser?.findIndex((c) => c.id.toString() === channelId);\n if (directChannelIndex !== undefined && directChannelIndex >= 0) {\n foundInDirectChannels = true;\n }\n\n // Check if this channel exists in service channels\n const serviceChannelIndex = prev.supportServiceChannels?.findIndex(\n (c) => c.id.toString() === channelId,\n );\n if (serviceChannelIndex !== undefined && serviceChannelIndex >= 0) {\n foundInServiceChannels = true;\n }\n\n // Create a deep copy of the previous state to avoid mutating it\n const result = {\n ...prev,\n channelsByUser: [...(prev.channelsByUser || [])],\n supportServiceChannels: [...(prev.supportServiceChannels || [])],\n };\n\n // Optimistically update the channel with the new message\n if (foundInDirectChannels && directChannelIndex >= 0) {\n // Update the direct channel\n const channel = { ...result.channelsByUser[directChannelIndex] } as any;\n\n // Update lastMessage\n channel.lastMessage = newMessage;\n\n // Update timestamp to move to top of sorted list\n channel.updatedAt = newMessage.createdAt || new Date().toISOString();\n\n // Replace the channel in the array\n result.channelsByUser[directChannelIndex] = channel;\n }\n\n if (foundInServiceChannels && serviceChannelIndex >= 0) {\n // Update the service channel\n const channel = { ...result.supportServiceChannels[serviceChannelIndex] } as any;\n\n // Update lastMessage\n channel.lastMessage = newMessage;\n\n // Update timestamp to move to top of sorted list\n channel.updatedAt = newMessage.createdAt || new Date().toISOString();\n\n // Replace the channel in the array\n result.supportServiceChannels[serviceChannelIndex] = channel;\n }\n\n return result;\n } catch (error) {\n console.error('Error in dialog subscription handler:', error);\n return prev;\n }\n },\n });\n\n // Clean up subscription when component unmounts\n return () => {\n console.log('📱 Cleaning up dialog message subscription');\n unsubscribe();\n };\n }, [auth?.id, subscribeToMore]);\n\n // Handle component cleanup\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n // Clear any active timeouts\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n };\n }, []);\n\n // Reset activeChannelRef when returning to this screen\n useFocusEffect(\n useCallback(() => {\n // When screen gains focus, check if we're coming back from a detail screen\n const now = Date.now();\n\n // Reset active channel ref if enough time has passed since last navigation\n if (now - lastNavigationTimestamp.current > 300) {\n activeChannelRef.current = null;\n console.log('Reset active channel reference on focus');\n }\n\n return () => {\n // When losing focus, update the timestamp\n lastNavigationTimestamp.current = Date.now();\n };\n }, []),\n );\n\n // Handle refresh on focus\n useFocusEffect(\n useCallback(() => {\n console.log('📱 Focus effect triggered for Dialogs screen');\n\n // Refresh when returning to the screen if enough time has passed\n const performRefresh = () => {\n const now = Date.now();\n if (now - lastRefreshTimeRef.current < MIN_REFRESH_INTERVAL) {\n console.log('⏩ Skipping refresh: too soon after previous refresh');\n return;\n }\n\n console.log('🔄 Performing refresh on screen focus');\n if (isMountedRef.current) {\n lastRefreshTimeRef.current = now;\n refetch();\n }\n };\n\n const focusRefreshTimeout = setTimeout(performRefresh, 100);\n return () => clearTimeout(focusRefreshTimeout);\n }, [refetch]),\n );\n\n // Handle pull-to-refresh\n const handlePullToRefresh = useCallback(() => {\n const now = Date.now();\n focusRefreshRef.current = now;\n\n console.log('🔄 Pull-to-refresh triggered');\n refetch();\n }, [refetch]);\n\n // Load more channels\n const handleLoadMore = useCallback(() => {\n if (isLoadingMore || !data || channels.length < 10) {\n console.log('Skip loading more: already loading or all data loaded');\n return;\n }\n\n console.log('Loading more channels at page:', page + 1);\n setIsLoadingMore(true);\n\n fetchMore({\n variables: {\n skip: page * 15,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n setIsLoadingMore(false);\n setPage((prevPage) => prevPage + 1);\n\n if (!fetchMoreResult) return prev;\n\n // Combine previous and new results\n return {\n ...fetchMoreResult,\n channelsByUser: [...(prev.channelsByUser || []), ...(fetchMoreResult.channelsByUser || [])],\n supportServiceChannels: [\n ...(prev.supportServiceChannels || []),\n ...(fetchMoreResult.supportServiceChannels || []),\n ],\n };\n },\n }).catch((error) => {\n console.error('Error loading more channels:', error);\n setIsLoadingMore(false);\n });\n }, [fetchMore, isLoadingMore, data, channels.length, page]);\n\n // Navigation handlers with debounce to prevent double taps\n const handleSelectChannel = useCallback(\n (id, title) => {\n // Return early if this channel is already active (prevents double navigation)\n if (activeChannelRef.current === id) {\n console.log('📱 Ignoring repeated tap on channel:', id);\n return;\n }\n\n // Set this channel as active\n activeChannelRef.current = id;\n\n // Clear any existing timeout\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n\n // Set a timeout to clear the active channel after 2 seconds\n // This prevents the active state from getting stuck if navigation fails\n resetActiveChannelTimeoutRef.current = setTimeout(() => {\n activeChannelRef.current = null;\n }, 2000);\n\n setSelectedChannelId(id);\n\n console.log('📱 Navigating to channel:', id);\n\n navigation.navigate(config.INBOX_MESSEGE_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n hideTabBar: true,\n timestamp: new Date().getTime(),\n });\n },\n [navigation, channelRole],\n );\n\n const handleSelectServiceChannel = useCallback(\n (id, title, postParentId) => {\n // Return early if this channel is already active (prevents double navigation)\n if (activeChannelRef.current === id) {\n console.log('📱 Ignoring repeated tap on service channel:', id);\n return;\n }\n\n // Set this channel as active\n activeChannelRef.current = id;\n\n // Clear any existing timeout\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n\n // Set a timeout to clear the active channel after 2 seconds\n resetActiveChannelTimeoutRef.current = setTimeout(() => {\n activeChannelRef.current = null;\n }, 2000);\n\n setSelectedChannelId(id);\n\n console.log('📱 Navigating to service channel:', id);\n\n navigation.navigate(postParentId || postParentId === 0 ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n postParentId: postParentId,\n hideTabBar: true,\n });\n },\n [navigation, channelRole],\n );\n\n // Handle search query changes\n const handleSearchChange = useCallback((text: string) => {\n setSearchQuery(text);\n }, []);\n\n // Filter channels by search query\n const filteredChannels = useCallback(() => {\n if (!searchQuery.trim()) return channels;\n\n const query = searchQuery.toLowerCase();\n return channels.filter((channel) => {\n // Check if the channel title contains the search query\n if (channel.title && channel.title.toLowerCase().includes(query)) {\n return true;\n }\n\n // Check if any member's name contains the search query\n if (channel.members) {\n for (const member of channel.members) {\n const user = member?.user;\n if (!user) continue;\n\n const fullName = `${user.givenName || ''} ${user.familyName || ''}`.toLowerCase();\n if (fullName.includes(query)) {\n return true;\n }\n\n if (user.username && user.username.toLowerCase().includes(query)) {\n return true;\n }\n }\n }\n\n return false;\n });\n }, [channels, searchQuery]);\n\n const displayChannels = filteredChannels();\n\n return (\n <Box className=\"p-2\">\n <FlatList\n data={displayChannels}\n onRefresh={handlePullToRefresh}\n refreshing={loading && !isLoadingMore}\n contentContainerStyle={{ minHeight: '100%' }}\n ItemSeparatorComponent={() => <Box className=\"h-0.5 bg-gray-200\" />}\n renderItem={({ item: channel }) => {\n const key = `${channel.type === RoomType.Service ? 'service' : 'direct'}-${channel.id}`;\n\n return channel?.type === RoomType.Service ? (\n <ServiceDialogsListItem\n key={key}\n onOpen={handleSelectServiceChannel}\n currentUser={auth}\n channel={channel}\n refreshing={loading}\n selectedChannelId={selectedChannelId}\n role={channelRole}\n />\n ) : (\n <DialogsListItem\n key={key}\n onOpen={handleSelectChannel}\n currentUser={auth}\n channel={channel}\n selectedChannelId={selectedChannelId}\n forceRefresh={true}\n />\n );\n }}\n ListFooterComponent={() =>\n isLoadingMore ? (\n <Center className=\"py-4\">\n <Spinner color={colors.blue[500]} size=\"small\" />\n </Center>\n ) : null\n }\n onEndReached={handleLoadMore}\n onEndReachedThreshold={0.5}\n initialNumToRender={5}\n maxToRenderPerBatch={5}\n windowSize={5}\n removeClippedSubviews={true}\n updateCellsBatchingPeriod={100}\n getItemLayout={(data, index) => ({ length: 80, offset: 80 * index, index })}\n keyExtractor={(item) => `channel-${item.id}`}\n ListEmptyComponent={() => {\n // Show spinner during initial loading\n if (loading && displayChannels.length === 0) {\n return (\n <Center className=\"flex-1 justify-center items-center\" style={{ height: 300 }}>\n <Spinner color={colors.blue[500]} size=\"large\" />\n <Text className=\"mt-4 text-gray-500\">Loading conversations...</Text>\n </Center>\n );\n }\n\n // Show empty state when no channels and not loading\n return (\n <Box className=\"p-6\">\n <Box className=\"mb-6\">\n <Heading className=\"text-2xl font-bold\">Direct Messages</Heading>\n <Text className=\"text-gray-600 mt-1\">Private conversations with other users</Text>\n </Box>\n\n <Input\n className=\"mb-8 h-[50] rounded-md border-gray-300 border\"\n size=\"md\"\n style={{\n paddingVertical: 8,\n marginBottom: 10,\n borderColor: '#d1d5db',\n borderRadius: 10,\n }}\n >\n <InputField\n placeholder=\"Search messages...\"\n onChangeText={handleSearchChange}\n value={searchQuery}\n />\n </Input>\n\n <Center className=\"items-center\" style={{ paddingVertical: 5 }}>\n <Box className=\"w-16 h-16 rounded-full bg-blue-500 flex items-center justify-center mb-5\">\n <Ionicons name=\"chatbubble-ellipses\" size={30} color=\"white\" />\n </Box>\n\n <Text className=\"text-2xl font-bold text-center mb-2\">No messages yet</Text>\n\n <Text className=\"text-gray-600 text-center mb-8\">\n When you start conversations with others,{'\\n'}\n they'll appear here.\n </Text>\n </Center>\n </Box>\n );\n }}\n />\n </Box>\n );\n};\n\nexport const Dialogs = React.memo(DialogsComponent);\n"],"names":["filteredChannels","channels","_a","React","data"],"mappings":"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"}
1
+ {"version":3,"file":"Dialogs.js","sources":["../../../../src/screens/inbox/containers/Dialogs.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState, useMemo } from 'react';\nimport { FlatList, Box, Heading, Input, InputField, Text, Center, Spinner } from '@admin-layout/gluestack-ui-mobile';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useSelector } from 'react-redux';\nimport { useNavigation, useRoute, useFocusEffect } from '@react-navigation/native';\nimport { DialogsListItem } from '../components/DialogsListItem';\nimport { ServiceDialogsListItem } from '../components/ServiceDialogsListItem';\nimport { useChannelsQuery, CHAT_MESSAGE_ADDED } from '../../../queries/inboxQueries';\nimport { RoomType } from 'common';\nimport { userSelector } from '@adminide-stack/user-auth0-client';\nimport { config } from '../config';\nimport colors from 'tailwindcss/colors';\nimport { SubscriptionHandler } from '../components/SubscriptionHandler';\n\nexport interface InboxProps {\n channelFilters?: Record<string, unknown>;\n channelRole?: string;\n supportServices: boolean;\n}\n\nconst DialogsComponent = (props: InboxProps) => {\n const { channelFilters: channelFilterProp, channelRole, supportServices } = props;\n const channelFilters = { ...channelFilterProp };\n channelFilters.type = channelFilters?.type ?? RoomType.Direct;\n const { params } = useRoute<any>();\n const auth = useSelector(userSelector);\n const navigation = useNavigation<any>();\n\n // Local state for UI control\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedChannelId, setSelectedChannelId] = useState<string | null>(params?.channelId || null);\n const [page, setPage] = useState(1);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // Create a ref to track if component is mounted\n const isMountedRef = useRef(true);\n const focusRefreshRef = useRef<number | null>(null);\n const lastRefreshTimeRef = useRef(Date.now());\n const MIN_REFRESH_INTERVAL = 2000;\n\n // Add lastNavigationTimestamp to track when the user navigates away\n const lastNavigationTimestamp = useRef(0);\n // Track active channel to prevent duplicate clicks on the same channel\n const activeChannelRef = useRef<string | null>(null);\n // Hold a timeout ref to reset active channel status\n const resetActiveChannelTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Apollo query with pagination and optimistic updates\n const { data, loading, refetch, fetchMore, subscribeToMore } = useChannelsQuery({\n variables: {\n role: channelRole,\n criteria: channelFilters,\n supportServices: supportServices ? true : false,\n supportServiceCriteria: {\n type: RoomType.Service,\n },\n limit: 15,\n skip: 0,\n },\n notifyOnNetworkStatusChange: true,\n });\n\n // Memoize processChannels and sortChannels to avoid unnecessary recalculations\n const processChannels = useCallback(\n (rawChannels = []) => {\n if (!rawChannels?.length) return [];\n return rawChannels.filter((c) => {\n if (!c?.members) return false;\n return c.members.some(\n (member) => member?.user && member.user.id !== auth?.id && member.user.__typename === 'UserAccount',\n );\n });\n },\n [auth?.id],\n );\n\n const sortChannels = useCallback((channels) => {\n if (!channels?.length) return [];\n return [...channels].sort((a, b) => {\n const dateA = new Date(a?.updatedAt || a?.createdAt).getTime();\n const dateB = new Date(b?.updatedAt || b?.createdAt).getTime();\n return dateB - dateA;\n });\n }, []);\n\n // Navigation handlers with debounce to prevent double taps\n const handleSelectChannel = useCallback(\n (id, title) => {\n if (activeChannelRef.current === id) {\n console.log('📱 Ignoring repeated tap on channel:', id);\n return;\n }\n activeChannelRef.current = id;\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n resetActiveChannelTimeoutRef.current = setTimeout(() => {\n activeChannelRef.current = null;\n }, 2000);\n setSelectedChannelId(id);\n console.log('📱 Navigating to channel:', id);\n navigation.navigate(config.INBOX_MESSEGE_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n hideTabBar: true,\n timestamp: new Date().getTime(),\n });\n },\n [navigation, channelRole],\n );\n\n const handleSelectServiceChannel = useCallback(\n (id, title, postParentId) => {\n if (activeChannelRef.current === id) {\n console.log('📱 Ignoring repeated tap on service channel:', id);\n return;\n }\n activeChannelRef.current = id;\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n resetActiveChannelTimeoutRef.current = setTimeout(() => {\n activeChannelRef.current = null;\n }, 2000);\n setSelectedChannelId(id);\n console.log('📱 Navigating to service channel:', id);\n navigation.navigate(postParentId || postParentId === 0 ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n postParentId: postParentId,\n hideTabBar: true,\n });\n },\n [navigation, channelRole],\n );\n\n // Handle search query changes\n const handleSearchChange = useCallback((text: string) => {\n setSearchQuery(text);\n }, []);\n\n // Memoize allChannels and channels\n const allChannels = useMemo(\n () => [...(data?.supportServiceChannels || []), ...(data?.channelsByUser || [])],\n [data],\n );\n const channels = useMemo(\n () => sortChannels(processChannels(allChannels)),\n [allChannels, processChannels, sortChannels],\n );\n\n // Memoize filteredChannels\n const displayChannels = useMemo(() => {\n if (!searchQuery.trim()) return channels;\n const query = searchQuery.toLowerCase();\n return channels.filter((channel) => {\n if (channel.title && channel.title.toLowerCase().includes(query)) return true;\n if (channel.members) {\n return channel.members.some((member) => {\n const user = member?.user;\n if (!user) return false;\n const fullName = `${user.givenName || ''} ${user.familyName || ''}`.toLowerCase();\n return fullName.includes(query) || (user.username && user.username.toLowerCase().includes(query));\n });\n }\n return false;\n });\n }, [channels, searchQuery]);\n\n // Memoize renderItem to avoid re-renders\n const renderItem = useCallback(\n ({ item: channel }) => {\n const key = `${channel.type === RoomType.Service ? 'service' : 'direct'}-${channel.id}`;\n return channel?.type === RoomType.Service ? (\n <ServiceDialogsListItem\n key={key}\n onOpen={handleSelectServiceChannel}\n currentUser={auth}\n channel={channel}\n refreshing={loading}\n selectedChannelId={selectedChannelId}\n role={channelRole}\n />\n ) : (\n <DialogsListItem\n key={key}\n onOpen={handleSelectChannel}\n currentUser={auth}\n channel={channel}\n selectedChannelId={selectedChannelId}\n forceRefresh={true}\n />\n );\n },\n [auth, channelRole, handleSelectChannel, handleSelectServiceChannel, loading, selectedChannelId],\n );\n\n // Memoize ListFooterComponent and ListEmptyComponent\n const ListFooterComponent = useMemo(\n () =>\n isLoadingMore ? (\n <Center className=\"py-4\">\n <Spinner color={colors.blue[500]} size=\"small\" />\n </Center>\n ) : null,\n [isLoadingMore],\n );\n\n const ListEmptyComponent = useMemo(() => {\n if (loading && displayChannels.length === 0) {\n return (\n <Center className=\"flex-1 justify-center items-center\" style={{ height: 300 }}>\n <Spinner color={colors.blue[500]} size=\"large\" />\n <Text className=\"mt-4 text-gray-500\">Loading conversations...</Text>\n </Center>\n );\n }\n return (\n <Box className=\"p-6\">\n <Box className=\"mb-6\">\n <Heading className=\"text-2xl font-bold\">Direct Messages</Heading>\n <Text className=\"text-gray-600 mt-1\">Private conversations with other users</Text>\n </Box>\n <Input\n className=\"mb-8 h-[50] rounded-md border-gray-300 border\"\n size=\"md\"\n style={{\n paddingVertical: 8,\n marginBottom: 10,\n borderColor: '#d1d5db',\n borderRadius: 10,\n }}\n >\n <InputField\n placeholder=\"Search messages...\"\n onChangeText={handleSearchChange}\n value={searchQuery}\n />\n </Input>\n <Center className=\"items-center\" style={{ paddingVertical: 5 }}>\n <Box className=\"w-16 h-16 rounded-full bg-blue-500 flex items-center justify-center mb-5\">\n <Ionicons name=\"chatbubble-ellipses\" size={30} color=\"white\" />\n </Box>\n <Text className=\"text-2xl font-bold text-center mb-2\">No messages yet</Text>\n <Text className=\"text-gray-600 text-center mb-8\">\n When you start conversations with others,{'\\n'}\n they'll appear here.\n </Text>\n </Center>\n </Box>\n );\n }, [loading, displayChannels.length, handleSearchChange, searchQuery]);\n\n // Handle component cleanup\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n // Clear any active timeouts\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n };\n }, []);\n\n // Reset activeChannelRef when returning to this screen\n useFocusEffect(\n useCallback(() => {\n // When screen gains focus, check if we're coming back from a detail screen\n const now = Date.now();\n\n // Reset active channel ref if enough time has passed since last navigation\n if (now - lastNavigationTimestamp.current > 300) {\n activeChannelRef.current = null;\n console.log('Reset active channel reference on focus');\n }\n\n return () => {\n // When losing focus, update the timestamp\n lastNavigationTimestamp.current = Date.now();\n };\n }, []),\n );\n\n // Handle refresh on focus\n useFocusEffect(\n useCallback(() => {\n console.log('📱 Focus effect triggered for Dialogs screen');\n\n // Refresh when returning to the screen if enough time has passed\n const performRefresh = () => {\n const now = Date.now();\n if (now - lastRefreshTimeRef.current < MIN_REFRESH_INTERVAL) {\n console.log('⏩ Skipping refresh: too soon after previous refresh');\n return;\n }\n\n console.log('🔄 Performing refresh on screen focus');\n if (isMountedRef.current) {\n lastRefreshTimeRef.current = now;\n refetch();\n }\n };\n\n const focusRefreshTimeout = setTimeout(performRefresh, 100);\n return () => clearTimeout(focusRefreshTimeout);\n }, [refetch]),\n );\n\n // Handle pull-to-refresh\n const handlePullToRefresh = useCallback(() => {\n const now = Date.now();\n focusRefreshRef.current = now;\n\n console.log('🔄 Pull-to-refresh triggered');\n refetch();\n }, [refetch]);\n\n // Load more channels\n const handleLoadMore = useCallback(() => {\n if (isLoadingMore || !data || channels.length < 10) {\n console.log('Skip loading more: already loading or all data loaded');\n return;\n }\n\n console.log('Loading more channels at page:', page + 1);\n setIsLoadingMore(true);\n\n fetchMore({\n variables: {\n skip: page * 15,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n setIsLoadingMore(false);\n setPage((prevPage) => prevPage + 1);\n\n if (!fetchMoreResult) return prev;\n\n // Combine previous and new results\n return {\n ...fetchMoreResult,\n channelsByUser: [...(prev.channelsByUser || []), ...(fetchMoreResult.channelsByUser || [])],\n supportServiceChannels: [\n ...(prev.supportServiceChannels || []),\n ...(fetchMoreResult.supportServiceChannels || []),\n ],\n };\n },\n }).catch((error) => {\n console.error('Error loading more channels:', error);\n setIsLoadingMore(false);\n });\n }, [fetchMore, isLoadingMore, data, channels.length, page]);\n\n return (\n <Box className=\"p-2\">\n <SubscriptionHandler\n subscribeToMore={subscribeToMore}\n document={CHAT_MESSAGE_ADDED}\n variables={{}}\n updateQuery={undefined}\n />\n <FlatList\n data={displayChannels}\n onRefresh={handlePullToRefresh}\n refreshing={loading && !isLoadingMore}\n contentContainerStyle={{ minHeight: '100%' }}\n ItemSeparatorComponent={React.useCallback(\n () => (\n <Box className=\"h-0.5 bg-gray-200\" />\n ),\n [],\n )}\n renderItem={renderItem}\n ListFooterComponent={ListFooterComponent}\n onEndReached={handleLoadMore}\n onEndReachedThreshold={0.5}\n initialNumToRender={5}\n maxToRenderPerBatch={5}\n windowSize={5}\n removeClippedSubviews={true}\n updateCellsBatchingPeriod={100}\n getItemLayout={React.useCallback((data, index) => ({ length: 80, offset: 80 * index, index }), [])}\n keyExtractor={React.useCallback((item) => `channel-${item.id}`, [])}\n ListEmptyComponent={ListEmptyComponent}\n />\n </Box>\n );\n};\n\nexport const Dialogs = React.memo(DialogsComponent);\n"],"names":["channels","React","data"],"mappings":"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"}