@messenger-box/platform-mobile 10.0.3-alpha.182 → 10.0.3-alpha.187

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.
@@ -1,4 +1,4 @@
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,shallowEqual}from'react-redux';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {DialogItem}from'../components/DialogItem.js';import {useGetChannelsByUserWithLastMessageQuery}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,useMemo,useCallback,useEffect}from'react';import {Center,Spinner,Text,Box,FlatList}from'@admin-layout/gluestack-ui-mobile';import {Ionicons}from'@expo/vector-icons';import {useSelector,shallowEqual}from'react-redux';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {DialogItem}from'../components/DialogItem.js';import {useGetChannelsByUserWithLastMessageQuery}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;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -18,65 +18,60 @@ var __spreadValues = (a, b) => {
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
20
  const DialogsComponent = (props) => {
21
- var _a;
22
21
  const {
23
22
  channelFilters: channelFilterProp,
24
23
  channelRole,
25
24
  supportServices
26
25
  } = props;
27
- const channelFilters = __spreadValues({}, channelFilterProp);
28
- const channelType = (_a = channelFilters == null ? void 0 : channelFilters.type) != null ? _a : RoomType.Direct;
29
- channelFilters.type = supportServices ? [channelType, RoomType.Service] : channelType;
30
26
  const {
31
27
  params
32
28
  } = useRoute();
33
29
  const auth = useSelector(userSelector, shallowEqual);
34
30
  const navigation = useNavigation();
35
- const [searchQuery, setSearchQuery] = useState("");
31
+ const [isRefreshing, setIsRefreshing] = useState(false);
36
32
  const isMountedRef = useRef(true);
37
- const focusRefreshRef = useRef(null);
38
33
  const lastRefreshTimeRef = useRef(Date.now());
39
- const MIN_REFRESH_INTERVAL = 2e3;
40
- const lastNavigationTimestamp = useRef(0);
41
34
  const activeChannelRef = useRef(null);
42
35
  const resetActiveChannelTimeoutRef = useRef(null);
36
+ const MIN_REFRESH_INTERVAL = 2e3;
37
+ const channelFilters = useMemo(() => {
38
+ var _a;
39
+ const filters = __spreadValues({}, channelFilterProp);
40
+ const channelType = (_a = filters == null ? void 0 : filters.type) != null ? _a : RoomType.Direct;
41
+ filters.type = supportServices ? [channelType, RoomType.Service] : channelType;
42
+ return filters;
43
+ }, [channelFilterProp, supportServices]);
43
44
  const {
44
45
  data,
45
46
  loading,
46
47
  refetch,
47
- fetchMore,
48
- subscribeToMore
48
+ fetchMore
49
49
  } = useGetChannelsByUserWithLastMessageQuery({
50
50
  variables: {
51
51
  role: channelRole,
52
52
  criteria: channelFilters,
53
- // supportServices: false,
54
- // supportServices: supportServices ? true : false,
55
- // supportServiceCriteria: {
56
- // type: RoomType.Service,
57
- // },
58
53
  limit: 15,
59
54
  skip: 0
60
55
  },
61
56
  notifyOnNetworkStatusChange: true,
62
57
  fetchPolicy: "cache-and-network"
63
58
  });
64
- const processChannels = useCallback((rawChannels = []) => {
65
- if (!(rawChannels == null ? void 0 : rawChannels.length)) return [];
59
+ console.log("data__Dialogs", data);
60
+ console.log("channelFilters__Dialogs", channelFilters);
61
+ const processedChannels = useMemo(() => {
62
+ const rawChannels = (data == null ? void 0 : data.channelsByUser) || [];
63
+ if (!rawChannels.length) return [];
66
64
  return rawChannels.filter((c) => {
67
65
  if (!(c == null ? void 0 : c.members)) return false;
68
66
  return c.members.some((member) => (member == null ? void 0 : member.user) && member.user.id !== (auth == null ? void 0 : auth.id) && member.user.__typename === "UserAccount");
67
+ }).sort((a, b) => {
68
+ const dateA = new Date((a == null ? void 0 : a.updatedAt) || (a == null ? void 0 : a.createdAt)).getTime();
69
+ const dateB = new Date((b == null ? void 0 : b.updatedAt) || (b == null ? void 0 : b.createdAt)).getTime();
70
+ return dateB - dateA;
69
71
  });
70
- }, [auth == null ? void 0 : auth.id]);
71
- const sortChannels = useCallback((channels2) => {
72
- if (!(channels2 == null ? void 0 : channels2.length)) return [];
73
- return channels2;
74
- }, []);
72
+ }, [data == null ? void 0 : data.channelsByUser, auth == null ? void 0 : auth.id]);
75
73
  const handleSelectChannel = useCallback((id, title) => {
76
- if (activeChannelRef.current === id) {
77
- console.log("\u{1F4F1} Ignoring repeated tap on channel:", id);
78
- return;
79
- }
74
+ if (activeChannelRef.current === id) return;
80
75
  activeChannelRef.current = id;
81
76
  if (resetActiveChannelTimeoutRef.current) {
82
77
  clearTimeout(resetActiveChannelTimeoutRef.current);
@@ -84,21 +79,17 @@ const DialogsComponent = (props) => {
84
79
  resetActiveChannelTimeoutRef.current = setTimeout(() => {
85
80
  activeChannelRef.current = null;
86
81
  }, 2e3);
87
- console.log("\u{1F4F1} Navigating to channel:", id);
88
82
  navigation.navigate(config.INBOX_MESSEGE_PATH, {
89
83
  channelId: id,
90
84
  role: channelRole,
91
85
  title,
92
86
  hideTabBar: true,
93
- timestamp: (/* @__PURE__ */ new Date()).getTime(),
87
+ timestamp: Date.now(),
94
88
  orgName: params == null ? void 0 : params.orgName
95
89
  });
96
- }, [navigation, channelRole]);
90
+ }, [navigation, channelRole, params == null ? void 0 : params.orgName]);
97
91
  const handleSelectServiceChannel = useCallback((id, title, postParentId) => {
98
- if (activeChannelRef.current === id) {
99
- console.log("\u{1F4F1} Ignoring repeated tap on service channel:", id);
100
- return;
101
- }
92
+ if (activeChannelRef.current === id) return;
102
93
  activeChannelRef.current = id;
103
94
  if (resetActiveChannelTimeoutRef.current) {
104
95
  clearTimeout(resetActiveChannelTimeoutRef.current);
@@ -106,8 +97,8 @@ const DialogsComponent = (props) => {
106
97
  resetActiveChannelTimeoutRef.current = setTimeout(() => {
107
98
  activeChannelRef.current = null;
108
99
  }, 2e3);
109
- console.log("\u{1F4F1} Navigating to service channel:", id);
110
- navigation.navigate(postParentId || postParentId === 0 ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH, {
100
+ const path = postParentId !== void 0 && postParentId !== null ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH;
101
+ navigation.navigate(path, {
111
102
  channelId: id,
112
103
  role: channelRole,
113
104
  title,
@@ -115,50 +106,26 @@ const DialogsComponent = (props) => {
115
106
  hideTabBar: true,
116
107
  orgName: params == null ? void 0 : params.orgName
117
108
  });
118
- }, [navigation, channelRole]);
119
- const handleSearchChange = useCallback((text) => {
120
- setSearchQuery(text);
121
- }, []);
122
- const allChannels = useMemo(() => [...(data == null ? void 0 : data.channelsByUser) || []], [data]);
123
- const channels = useMemo(() => sortChannels(processChannels(allChannels)), [allChannels, processChannels, sortChannels]);
124
- const displayChannels = useMemo(() => {
125
- if (!searchQuery.trim()) return channels;
126
- const query = searchQuery.toLowerCase();
127
- return channels.filter((channel) => {
128
- if (channel.title && channel.title.toLowerCase().includes(query)) return true;
129
- if (channel.members) {
130
- return channel.members.some((member) => {
131
- const user = member == null ? void 0 : member.user;
132
- if (!user) return false;
133
- const fullName = `${user.givenName || ""} ${user.familyName || ""}`.toLowerCase();
134
- return fullName.includes(query) || user.username && user.username.toLowerCase().includes(query);
135
- });
136
- }
137
- return false;
138
- });
139
- }, [channels, searchQuery]);
109
+ }, [navigation, channelRole, params == null ? void 0 : params.orgName]);
140
110
  const renderItem = useCallback(({
141
111
  item: channel
142
- }) => {
143
- const key = `${channel.type === RoomType.Service ? "service" : "direct"}-${channel.id}`;
144
- return /* @__PURE__ */ React__default.createElement(DialogItem, { key, onOpen: (channel == null ? void 0 : channel.type) === RoomType.Service ? handleSelectServiceChannel : handleSelectChannel, currentUser: auth, channel });
145
- }, [auth, handleSelectChannel, handleSelectServiceChannel]);
146
- const ListFooterComponent = useMemo(() => loading ? /* @__PURE__ */ React__default.createElement(Center, { className: "py-4" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" })) : null, [loading]);
112
+ }) => /* @__PURE__ */ React__default.createElement(DialogItem, { onOpen: (channel == null ? void 0 : channel.type) === RoomType.Service ? handleSelectServiceChannel : handleSelectChannel, currentUser: auth, channel }), [auth, handleSelectChannel, handleSelectServiceChannel]);
113
+ const ListFooterComponent = useMemo(() => {
114
+ if (loading && processedChannels.length > 0 && !isRefreshing) {
115
+ return /* @__PURE__ */ React__default.createElement(Center, { className: "py-4" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" }));
116
+ }
117
+ return null;
118
+ }, [loading, processedChannels.length, isRefreshing]);
147
119
  const ListEmptyComponent = useMemo(() => {
148
- if (loading && displayChannels.length === 0) {
120
+ if (loading && processedChannels.length === 0) {
149
121
  return /* @__PURE__ */ React__default.createElement(Center, { className: "flex-1 justify-center items-center", style: {
150
- height: 300
122
+ minHeight: 300
151
123
  } }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "large" }), /* @__PURE__ */ React__default.createElement(Text, { className: "mt-4 text-gray-500" }, "Loading conversations..."));
152
124
  }
153
- return /* @__PURE__ */ React__default.createElement(Box, { className: "p-6" }, /* @__PURE__ */ React__default.createElement(Box, { className: "mb-6" }, /* @__PURE__ */ React__default.createElement(Heading, { className: "text-2xl font-bold" }, "Direct Messages"), /* @__PURE__ */ React__default.createElement(Text, { className: "text-gray-600 mt-1" }, "Private conversations with other users")), /* @__PURE__ */ React__default.createElement(Input, { className: "mb-8 h-[50] rounded-md border-gray-300 border", size: "md", style: {
154
- paddingVertical: 8,
155
- marginBottom: 10,
156
- borderColor: "#d1d5db",
157
- borderRadius: 10
158
- } }, /* @__PURE__ */ React__default.createElement(InputField, { placeholder: "Search messages...", onChangeText: handleSearchChange, value: searchQuery })), /* @__PURE__ */ React__default.createElement(Center, { className: "items-center", style: {
159
- paddingVertical: 5
160
- } }, /* @__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.")));
161
- }, [loading, displayChannels.length, handleSearchChange, searchQuery]);
125
+ return /* @__PURE__ */ React__default.createElement(Center, { className: "flex-1 justify-center items-center px-6", style: {
126
+ minHeight: 300
127
+ } }, /* @__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" }, "When you start conversations with others,", "\n", "they'll appear here."));
128
+ }, [loading, processedChannels.length]);
162
129
  useEffect(() => {
163
130
  return () => {
164
131
  isMountedRef.current = false;
@@ -168,70 +135,56 @@ const DialogsComponent = (props) => {
168
135
  };
169
136
  }, []);
170
137
  useFocusEffect(useCallback(() => {
138
+ activeChannelRef.current = null;
171
139
  const now = Date.now();
172
- if (now - lastNavigationTimestamp.current > 300) {
173
- activeChannelRef.current = null;
174
- console.log("Reset active channel reference on focus");
140
+ if (now - lastRefreshTimeRef.current >= MIN_REFRESH_INTERVAL) {
141
+ lastRefreshTimeRef.current = now;
142
+ refetch().catch(console.error);
175
143
  }
176
144
  return () => {
177
- lastNavigationTimestamp.current = Date.now();
178
145
  };
179
- }, []));
180
- useFocusEffect(useCallback(() => {
181
- console.log("\u{1F4F1} Focus effect triggered for Dialogs screen");
182
- const performRefresh = () => {
183
- const now = Date.now();
184
- if (now - lastRefreshTimeRef.current < MIN_REFRESH_INTERVAL) {
185
- console.log("\u23E9 Skipping refresh: too soon after previous refresh");
186
- return;
187
- }
188
- console.log("\u{1F504} Performing refresh on screen focus");
189
- if (isMountedRef.current) {
190
- lastRefreshTimeRef.current = now;
191
- refetch();
192
- }
193
- };
194
- const focusRefreshTimeout = setTimeout(performRefresh, 100);
195
- return () => clearTimeout(focusRefreshTimeout);
196
- }, [refetch]));
197
- const handlePullToRefresh = useCallback(() => {
198
- const now = Date.now();
199
- focusRefreshRef.current = now;
200
- console.log("\u{1F504} Pull-to-refresh triggered");
201
- refetch();
146
+ }, [refetch, MIN_REFRESH_INTERVAL]));
147
+ const handlePullToRefresh = useCallback(async () => {
148
+ setIsRefreshing(true);
149
+ try {
150
+ await refetch();
151
+ } catch (error) {
152
+ console.error("Refresh error:", error);
153
+ } finally {
154
+ setIsRefreshing(false);
155
+ }
202
156
  }, [refetch]);
203
157
  const handleLoadMore = useCallback(() => {
204
- if (loading || !data || channels.length < 10) {
205
- console.log("Skip loading more: already loading or all data loaded");
158
+ var _a;
159
+ if (loading || !((_a = data == null ? void 0 : data.channelsByUser) == null ? void 0 : _a.length) || processedChannels.length < 10) {
206
160
  return;
207
161
  }
208
- console.log("Loading more channels");
209
162
  fetchMore({
210
163
  variables: {
211
- skip: channels.length
164
+ skip: processedChannels.length
212
165
  },
213
166
  updateQuery: (prev, {
214
167
  fetchMoreResult
215
168
  }) => {
216
- if (!fetchMoreResult) return prev;
169
+ var _a2;
170
+ if (!((_a2 = fetchMoreResult == null ? void 0 : fetchMoreResult.channelsByUser) == null ? void 0 : _a2.length)) return prev;
217
171
  return __spreadProps(__spreadValues({}, fetchMoreResult), {
218
172
  channelsByUser: [...prev.channelsByUser || [], ...fetchMoreResult.channelsByUser || []]
219
- // supportServiceChannels: [
220
- // ...(prev.supportServiceChannels || []),
221
- // ...(fetchMoreResult.supportServiceChannels || []),
222
- // ],
223
173
  });
224
174
  }
225
175
  }).catch((error) => {
226
- console.error("Error loading more channels:", error);
176
+ console.error("Load more error:", error);
227
177
  });
228
- }, [fetchMore, loading, data, channels.length]);
229
- return /* @__PURE__ */ React__default.createElement(Box, { className: "p-2" }, /* @__PURE__ */ React__default.createElement(FlatList, { data: displayChannels, onRefresh: handlePullToRefresh, refreshing: loading, contentContainerStyle: {
230
- minHeight: "100%"
231
- }, 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) => ({
178
+ }, [fetchMore, loading, data == null ? void 0 : data.channelsByUser, processedChannels.length]);
179
+ const keyExtractor = useCallback((item) => `channel-${item.id}`, []);
180
+ const ItemSeparatorComponent = useCallback(() => /* @__PURE__ */ React__default.createElement(Box, { className: "h-px bg-gray-200 mx-4" }), []);
181
+ const getItemLayout = useCallback((_data, index) => ({
232
182
  length: 80,
233
183
  offset: 80 * index,
234
184
  index
235
- }), []), keyExtractor: React__default.useCallback((item) => `channel-${item.id}`, []), ListEmptyComponent }));
185
+ }), []);
186
+ return /* @__PURE__ */ React__default.createElement(Box, { className: "flex-1 px-2" }, /* @__PURE__ */ React__default.createElement(FlatList, { data: processedChannels, renderItem, keyExtractor, onRefresh: handlePullToRefresh, refreshing: isRefreshing, ListEmptyComponent, ListFooterComponent, ItemSeparatorComponent, onEndReached: handleLoadMore, onEndReachedThreshold: 0.5, initialNumToRender: 10, maxToRenderPerBatch: 10, windowSize: 10, removeClippedSubviews: true, updateCellsBatchingPeriod: 50, getItemLayout, contentContainerStyle: {
187
+ flexGrow: 1
188
+ } }));
236
189
  };
237
190
  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, 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, shallowEqual } from 'react-redux';\nimport { useNavigation, useRoute, useFocusEffect } from '@react-navigation/native';\nimport { DialogItem } from '../components/DialogItem';\n// import { useChannelsQuery, CHAT_MESSAGE_ADDED } from '../../../queries/inboxQueries';\nimport {\n useGetChannelsByUserQuery,\n useGetChannelsByUserWithLastMessageQuery,\n OnChatMessageAddedDocument,\n} from 'common/graphql';\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 channelType = channelFilters?.type ?? RoomType.Direct;\n channelFilters.type = supportServices ? [channelType, RoomType.Service] : channelType;\n const { params } = useRoute<any>();\n const auth = useSelector(userSelector, shallowEqual);\n const navigation = useNavigation<any>();\n // Local state for UI control - only keeping searchQuery as it's needed for local filtering\n const [searchQuery, setSearchQuery] = useState('');\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 } = useGetChannelsByUserWithLastMessageQuery({\n variables: {\n role: channelRole,\n criteria: channelFilters,\n // supportServices: false,\n // supportServices: supportServices ? true : false,\n // supportServiceCriteria: {\n // type: RoomType.Service,\n // },\n limit: 15,\n skip: 0,\n },\n notifyOnNetworkStatusChange: true,\n fetchPolicy: 'cache-and-network',\n });\n\n // Subscribe to new messages to update lastMessage in channels\n // useEffect(() => {\n // if (!data?.channelsByUser?.length || !subscribeToMore) return;\n\n // const subscriptions: (() => void)[] = [];\n\n // // Subscribe to each channel for real-time lastMessage updates\n // data.channelsByUser.forEach(channel => {\n // if (!channel?.id) return;\n\n // const unsubscribe = subscribeToMore({\n // document: OnChatMessageAddedDocument,\n // variables: {\n // channelId: channel.id.toString(),\n // },\n // updateQuery: (prev, { subscriptionData }: any) => {\n // if (!subscriptionData?.data?.chatMessageAdded || !isMountedRef.current) {\n // return prev;\n // }\n\n // const newMessage = subscriptionData.data.chatMessageAdded;\n // const channelId = newMessage.channel?.id;\n\n // if (!channelId) return prev;\n\n // // Update the specific channel's lastMessage\n // const updatedChannels = (prev.channelsByUser || []).map(ch => {\n // if (ch?.id === channelId) {\n // return {\n // ...ch,\n // lastMessage: {\n // id: newMessage.id,\n // message: newMessage.message || '',\n // createdAt: newMessage.createdAt,\n // updatedAt: newMessage.updatedAt,\n // author: newMessage.author ? {\n // id: newMessage.author.id,\n // givenName: newMessage.author.givenName,\n // familyName: newMessage.author.familyName,\n // username: newMessage.author.username,\n // } : null,\n // files: newMessage.files ? {\n // totalCount: newMessage.files.totalCount || 0,\n // data: (newMessage.files.data || []).map(file => ({\n // id: file.id,\n // name: file.name,\n // extension: file.extension,\n // mimeType: file.mimeType,\n // }))\n // } : null,\n // },\n // updatedAt: newMessage.createdAt,\n // lastPostAt: newMessage.createdAt,\n // };\n // }\n // return ch;\n // });\n\n // return {\n // ...prev,\n // channelsByUser: updatedChannels,\n // };\n // },\n // onError: (error) => {\n // console.error(`LastMessage subscription error for channel ${channel.id}:`, error);\n // },\n // });\n\n // subscriptions.push(unsubscribe);\n // });\n\n // // Cleanup subscriptions\n // return () => {\n // subscriptions.forEach(unsub => {\n // try {\n // unsub?.();\n // } catch (error) {\n // console.error('Error unsubscribing from lastMessage updates:', error);\n // }\n // });\n // };\n // }, [data?.channelsByUser, subscribeToMore]);\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;\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 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 orgName: params?.orgName,\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 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 orgName: params?.orgName,\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 allChannels = useMemo(() => [...(data?.channelsByUser || [])], [data]);\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 (\n <DialogItem\n key={key}\n onOpen={channel?.type === RoomType.Service ? handleSelectServiceChannel : handleSelectChannel}\n currentUser={auth}\n channel={channel}\n />\n );\n },\n [auth, handleSelectChannel, handleSelectServiceChannel],\n );\n\n // Memoize ListFooterComponent and ListEmptyComponent\n const ListFooterComponent = useMemo(\n () =>\n loading ? (\n <Center className=\"py-4\">\n <Spinner color={colors.blue[500]} size=\"small\" />\n </Center>\n ) : null,\n [loading],\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 (loading || !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');\n\n fetchMore({\n variables: {\n skip: channels.length,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\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 });\n }, [fetchMore, loading, data, channels.length]);\n\n return (\n <Box className=\"p-2\">\n <FlatList\n data={displayChannels}\n onRefresh={handlePullToRefresh}\n refreshing={loading}\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":";;;;;;;;;;;;;;;;;;;AAkBA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAsB;AAlBhD,EAAA,IAAA,EAAA;AAmBE,EAAA,MAAM;AAAA,IACJ,cAAA,EAAgB,iBAAA;AAAA,IAChB,WAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,MAAM,iBAAiB,cAAA,CAAA,EAAA,EAClB,iBAAA,CAAA;AAGL,EAAA,MAAM,WAAA,GAAA,CAAc,EAAA,GAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAgB,IAAA,KAAhB,IAAA,GAAA,EAAA,GAAwB,QAAA,CAAS,MAAA;AACrD,EAAA,cAAA,CAAe,OAAO,eAAA,GAAkB,CAAC,WAAA,EAAa,QAAA,CAAS,OAAO,CAAA,GAAI,WAAA;AAC1E,EAAA,MAAM;AAAA,IACJ;AAAA,MACE,QAAA,EAAc;AAClB,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,YAAA,EAAc,YAAY,CAAA;AACnD,EAAA,MAAM,aAAa,aAAA,EAAmB;AAEtC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AAGjD,EAAA,MAAM,YAAA,GAAe,OAAO,IAAI,CAAA;AAChC,EAAA,MAAM,eAAA,GAAkB,OAAsB,IAAI,CAAA;AAClD,EAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAC5C,EAAA,MAAM,oBAAA,GAAuB,GAAA;AAG7B,EAAA,MAAM,uBAAA,GAA0B,OAAO,CAAC,CAAA;AAExC,EAAA,MAAM,gBAAA,GAAmB,OAAsB,IAAI,CAAA;AAEnD,EAAA,MAAM,4BAAA,GAA+B,OAA8B,IAAI,CAAA;AAGvE,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,MACE,wCAAA,CAAyC;AAAA,IAC3C,SAAA,EAAW;AAAA,MACT,IAAA,EAAM,WAAA;AAAA,MACN,QAAA,EAAU,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMV,KAAA,EAAO,EAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA,2BAAA,EAA6B,IAAA;AAAA,IAC7B,WAAA,EAAa;AAAA,GACd,CAAA;AAsFD,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,WAAA,GAAc,EAAC,KAAM;AACxD,IAAA,IAAI,EAAC,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,MAAA,CAAA,EAAQ,OAAO,EAAC;AAClC,IAAA,OAAO,WAAA,CAAY,OAAO,CAAA,CAAA,KAAK;AAC7B,MAAA,IAAI,EAAC,CAAA,IAAA,IAAA,GAAA,MAAA,GAAA,CAAA,CAAG,OAAA,CAAA,EAAS,OAAO,KAAA;AACxB,MAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,KAAA,CAAU,iCAAQ,IAAA,KAAQ,MAAA,CAAO,IAAA,CAAK,EAAA,MAAO,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,EAAA,CAAA,IAAM,MAAA,CAAO,IAAA,CAAK,eAAe,aAAa,CAAA;AAAA,IACzH,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,EAAE,CAAC,CAAA;AACb,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAAA,SAAAA,KAAY;AAC3C,IAAA,IAAI,EAACA,SAAAA,IAAA,IAAA,GAAA,MAAA,GAAAA,SAAAA,CAAU,MAAA,CAAA,SAAe,EAAC;AAC/B,IAAA,OAAOA,SAAAA;AAAA,EAMT,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,mBAAA,GAAsB,WAAA,CAAY,CAAC,EAAA,EAAI,KAAA,KAAU;AACrD,IAAA,IAAI,gBAAA,CAAiB,YAAY,EAAA,EAAI;AACnC,MAAA,OAAA,CAAQ,GAAA,CAAI,+CAAwC,EAAE,CAAA;AACtD,MAAA;AAAA,IACF;AACA,IAAA,gBAAA,CAAiB,OAAA,GAAU,EAAA;AAC3B,IAAA,IAAI,6BAA6B,OAAA,EAAS;AACxC,MAAA,YAAA,CAAa,6BAA6B,OAAO,CAAA;AAAA,IACnD;AACA,IAAA,4BAAA,CAA6B,OAAA,GAAU,WAAW,MAAM;AACtD,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,IAC7B,GAAG,GAAI,CAAA;AACP,IAAA,OAAA,CAAQ,GAAA,CAAI,oCAA6B,EAAE,CAAA;AAC3C,IAAA,UAAA,CAAW,QAAA,CAAS,OAAO,kBAAA,EAAoB;AAAA,MAC7C,SAAA,EAAW,EAAA;AAAA,MACX,IAAA,EAAM,WAAA;AAAA,MACN,KAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,MAC9B,SAAS,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ;AAAA,KAClB,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,UAAA,EAAY,WAAW,CAAC,CAAA;AAC5B,EAAA,MAAM,0BAAA,GAA6B,WAAA,CAAY,CAAC,EAAA,EAAI,OAAO,YAAA,KAAiB;AAC1E,IAAA,IAAI,gBAAA,CAAiB,YAAY,EAAA,EAAI;AACnC,MAAA,OAAA,CAAQ,GAAA,CAAI,uDAAgD,EAAE,CAAA;AAC9D,MAAA;AAAA,IACF;AACA,IAAA,gBAAA,CAAiB,OAAA,GAAU,EAAA;AAC3B,IAAA,IAAI,6BAA6B,OAAA,EAAS;AACxC,MAAA,YAAA,CAAa,6BAA6B,OAAO,CAAA;AAAA,IACnD;AACA,IAAA,4BAAA,CAA6B,OAAA,GAAU,WAAW,MAAM;AACtD,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,IAC7B,GAAG,GAAI,CAAA;AACP,IAAA,OAAA,CAAQ,GAAA,CAAI,4CAAqC,EAAE,CAAA;AACnD,IAAA,UAAA,CAAW,SAAS,YAAA,IAAgB,YAAA,KAAiB,IAAI,MAAA,CAAO,mBAAA,GAAsB,OAAO,YAAA,EAAc;AAAA,MACzG,SAAA,EAAW,EAAA;AAAA,MACX,IAAA,EAAM,WAAA;AAAA,MACN,KAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,SAAS,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ;AAAA,KAClB,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,UAAA,EAAY,WAAW,CAAC,CAAA;AAG5B,EAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,CAAC,IAAA,KAAiB;AACvD,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAOL,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAM,CAAC,GAAA,CAAI,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,cAAA,KAAkB,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAC3E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAM,YAAA,CAAa,eAAA,CAAgB,WAAW,CAAC,CAAA,EAAG,CAAC,WAAA,EAAa,eAAA,EAAiB,YAAY,CAAC,CAAA;AAGvH,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAM;AACpC,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG,OAAO,QAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,YAAY,WAAA,EAAY;AACtC,IAAA,OAAO,QAAA,CAAS,OAAO,CAAA,OAAA,KAAW;AAChC,MAAA,IAAI,OAAA,CAAQ,SAAS,OAAA,CAAQ,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,IAAA;AACzE,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,KAAU;AACpC,UAAA,MAAM,OAAO,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,IAAA;AACrB,UAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,UAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,SAAA,IAAa,EAAE,IAAI,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA,CAAA,CAAG,WAAA,EAAY;AAChF,UAAA,OAAO,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAA;AAAA,QAChG,CAAC,CAAA;AAAA,MACH;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAA,EAAU,WAAW,CAAC,CAAA;AAG1B,EAAA,MAAM,UAAA,GAAa,YAAY,CAAC;AAAA,IAC9B,IAAA,EAAM;AAAA,GACR,KAAM;AACJ,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAA,CAAQ,IAAA,KAAS,QAAA,CAAS,UAAU,SAAA,GAAY,QAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,EAAE,CAAA,CAAA;AACrF,IAAA,uBAAOC,cAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,GAAA,EAAU,MAAA,EAAA,CAAQ,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,IAAA,MAAS,QAAA,CAAS,OAAA,GAAU,0BAAA,GAA6B,mBAAA,EAAqB,WAAA,EAAa,IAAA,EAAM,OAAA,EAAkB,CAAA;AAAA,EACnK,CAAA,EAAG,CAAC,IAAA,EAAM,mBAAA,EAAqB,0BAA0B,CAAC,CAAA;AAG1D,EAAA,MAAM,mBAAA,GAAsB,QAAQ,MAAM,OAAA,gDAAW,MAAA,EAAA,EAAO,SAAA,EAAU,MAAA,EAAA,kBACpDA,cAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,OAAO,IAAA,CAAK,GAAG,GAAG,IAAA,EAAK,OAAA,EAAQ,CACnD,CAAA,GAAY,IAAA,EAAM,CAAC,OAAO,CAAC,CAAA;AACzC,EAAA,MAAM,kBAAA,GAAqB,QAAQ,MAAM;AACvC,IAAA,IAAI,OAAA,IAAW,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG;AAC3C,MAAA,uBAAOA,cAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,oCAAA,EAAqC,KAAA,EAAO;AAAA,QACnE,MAAA,EAAQ;AAAA,2BAEIA,cAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,GAAG,CAAA,EAAG,IAAA,EAAK,OAAA,EAAQ,mBAC/CA,cAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAA,EAAqB,0BAAwB,CACjE,CAAA;AAAA,IACZ;AACA,IAAA,uBAAOA,cAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EAAA,kBACVA,cAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAA,kBACXA,cAAA,CAAA,aAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,oBAAA,EAAA,EAAqB,iBAAe,CAAA,kBACvDA,cAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAA,EAAqB,wCAAsC,CAC/E,CAAA,kBACAA,cAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,+CAAA,EAAgD,IAAA,EAAK,IAAA,EAAK,KAAA,EAAO;AAAA,MAC1F,eAAA,EAAiB,CAAA;AAAA,MACjB,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,SAAA;AAAA,MACb,YAAA,EAAc;AAAA,KAChB,EAAA,kBACcA,cAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,WAAA,EAAY,sBAAqB,YAAA,EAAc,kBAAA,EAAoB,KAAA,EAAO,WAAA,EAAa,CACvG,CAAA,kBACAA,cAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,gBAAe,KAAA,EAAO;AAAA,MAChD,eAAA,EAAiB;AAAA,KACnB,EAAA,kBACcA,cAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EAAA,kBACXA,cAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAK,qBAAA,EAAsB,IAAA,EAAM,EAAA,EAAI,KAAA,EAAM,OAAA,EAAQ,CACjE,CAAA,kBACAA,cAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAA,EAAsC,iBAAe,CAAA,kBACrEA,cAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EAAA,EAAiC,2CAAA,EACH,IAAA,EAAK,sBAEnD,CACJ,CACJ,CAAA;AAAA,EACV,GAAG,CAAC,OAAA,EAAS,gBAAgB,MAAA,EAAQ,kBAAA,EAAoB,WAAW,CAAC,CAAA;AAGrE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AAEvB,MAAA,IAAI,6BAA6B,OAAA,EAAS;AACxC,QAAA,YAAA,CAAa,6BAA6B,OAAO,CAAA;AAAA,MACnD;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,cAAA,CAAe,YAAY,MAAM;AAE/B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,IAAA,IAAI,GAAA,GAAM,uBAAA,CAAwB,OAAA,GAAU,GAAA,EAAK;AAC/C,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,MAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,MAAM;AAEX,MAAA,uBAAA,CAAwB,OAAA,GAAU,KAAK,GAAA,EAAI;AAAA,IAC7C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAC,CAAA;AAGN,EAAA,cAAA,CAAe,YAAY,MAAM;AAC/B,IAAA,OAAA,CAAQ,IAAI,qDAA8C,CAAA;AAG1D,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,GAAA,GAAM,kBAAA,CAAmB,OAAA,GAAU,oBAAA,EAAsB;AAC3D,QAAA,OAAA,CAAQ,IAAI,0DAAqD,CAAA;AACjE,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAI,8CAAuC,CAAA;AACnD,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,kBAAA,CAAmB,OAAA,GAAU,GAAA;AAC7B,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AACA,IAAA,MAAM,mBAAA,GAAsB,UAAA,CAAW,cAAA,EAAgB,GAAG,CAAA;AAC1D,IAAA,OAAO,MAAM,aAAa,mBAAmB,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,OAAO,CAAC,CAAC,CAAA;AAGb,EAAA,MAAM,mBAAA,GAAsB,YAAY,MAAM;AAC5C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,eAAA,CAAgB,OAAA,GAAU,GAAA;AAC1B,IAAA,OAAA,CAAQ,IAAI,qCAA8B,CAAA;AAC1C,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAA,IAAI,OAAA,IAAW,CAAC,IAAA,IAAQ,QAAA,CAAS,SAAS,EAAA,EAAI;AAC5C,MAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AACnE,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AACnC,IAAA,SAAA,CAAU;AAAA,MACR,SAAA,EAAW;AAAA,QACT,MAAM,QAAA,CAAS;AAAA,OACjB;AAAA,MACA,WAAA,EAAa,CAAC,IAAA,EAAM;AAAA,QAClB;AAAA,OACF,KAAM;AACJ,QAAA,IAAI,CAAC,iBAAiB,OAAO,IAAA;AAG7B,QAAA,OAAO,iCACF,eAAA,CAAA,EADE;AAAA,UAEL,cAAA,EAAgB,CAAC,GAAI,IAAA,CAAK,cAAA,IAAkB,EAAC,EAAI,GAAI,eAAA,CAAgB,cAAA,IAAkB,EAAG;AAAA;AAAA;AAAA;AAAA;AAAA,SAK5F,CAAA;AAAA,MACF;AAAA,KACD,CAAA,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AAChB,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAAA,IACrD,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,SAAA,EAAW,SAAS,IAAA,EAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AAC9C,EAAA,uBAAOA,cAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EAAA,kBACZA,cAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,eAAA,EAAiB,SAAA,EAAW,mBAAA,EAAqB,UAAA,EAAY,OAAA,EAAS,qBAAA,EAAuB;AAAA,IACnH,SAAA,EAAW;AAAA,GACb,EAAG,sBAAA,EAAwBA,cAAA,CAAM,WAAA,CAAY,sBAAMA,cAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,GAAI,EAAE,CAAA,EAAG,UAAA,EAAwB,qBAA0C,YAAA,EAAc,cAAA,EAAgB,qBAAA,EAAuB,GAAA,EAAK,kBAAA,EAAoB,CAAA,EAAG,mBAAA,EAAqB,CAAA,EAAG,YAAY,CAAA,EAAG,qBAAA,EAAuB,IAAA,EAAM,yBAAA,EAA2B,KAAK,aAAA,EAAeA,cAAA,CAAM,WAAA,CAAY,CAACC,OAAM,KAAA,MAAW;AAAA,IACvY,MAAA,EAAQ,EAAA;AAAA,IACR,QAAQ,EAAA,GAAK,KAAA;AAAA,IACb;AAAA,MACE,EAAE,CAAA,EAAG,YAAA,EAAcD,eAAM,WAAA,CAAY,CAAA,IAAA,KAAQ,CAAA,QAAA,EAAW,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,EAAG,oBAAwC,CAChH,CAAA;AACR,CAAA;AACO,MAAM,OAAA,GAAUA,cAAA,CAAM,IAAA,CAAK,gBAAgB"}
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, Text, Center, Spinner } from '@admin-layout/gluestack-ui-mobile';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useSelector, shallowEqual } from 'react-redux';\nimport { useNavigation, useRoute, useFocusEffect } from '@react-navigation/native';\nimport { DialogItem } from '../components/DialogItem';\nimport { useGetChannelsByUserWithLastMessageQuery } 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 { params } = useRoute<any>();\n const auth = useSelector(userSelector, shallowEqual);\n const navigation = useNavigation<any>();\n\n // Local state\n const [isRefreshing, setIsRefreshing] = useState(false);\n\n // Refs for optimization\n const isMountedRef = useRef(true);\n const lastRefreshTimeRef = useRef(Date.now());\n const activeChannelRef = useRef<string | null>(null);\n const resetActiveChannelTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Constants\n const MIN_REFRESH_INTERVAL = 2000;\n\n // Build channel filters\n const channelFilters = useMemo(() => {\n const filters = { ...channelFilterProp };\n const channelType = filters?.type ?? RoomType.Direct;\n filters.type = supportServices ? [channelType, RoomType.Service] : channelType;\n return filters;\n }, [channelFilterProp, supportServices]);\n\n // Apollo query with pagination\n const { data, loading, refetch, fetchMore } = useGetChannelsByUserWithLastMessageQuery({\n variables: {\n role: channelRole,\n criteria: channelFilters,\n limit: 15,\n skip: 0,\n },\n notifyOnNetworkStatusChange: true,\n fetchPolicy: 'cache-and-network',\n });\n\n console.log('data__Dialogs', data);\n console.log('channelFilters__Dialogs', channelFilters);\n\n // Process and sort channels\n const processedChannels = useMemo(() => {\n const rawChannels = data?.channelsByUser || [];\n if (!rawChannels.length) return [];\n\n return rawChannels\n .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 .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 }, [data?.channelsByUser, auth?.id]);\n\n // Navigation handlers with debounce to prevent double taps\n const handleSelectChannel = useCallback(\n (id: string, title: string) => {\n if (activeChannelRef.current === id) return;\n\n activeChannelRef.current = id;\n\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n\n resetActiveChannelTimeoutRef.current = setTimeout(() => {\n activeChannelRef.current = null;\n }, 2000);\n\n navigation.navigate(config.INBOX_MESSEGE_PATH, {\n channelId: id,\n role: channelRole,\n title,\n hideTabBar: true,\n timestamp: Date.now(),\n orgName: params?.orgName,\n });\n },\n [navigation, channelRole, params?.orgName],\n );\n\n const handleSelectServiceChannel = useCallback(\n (id: string, title: string, postParentId?: number) => {\n if (activeChannelRef.current === id) return;\n\n activeChannelRef.current = id;\n\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n\n resetActiveChannelTimeoutRef.current = setTimeout(() => {\n activeChannelRef.current = null;\n }, 2000);\n\n const path =\n postParentId !== undefined && postParentId !== null ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH;\n\n navigation.navigate(path, {\n channelId: id,\n role: channelRole,\n title,\n postParentId,\n hideTabBar: true,\n orgName: params?.orgName,\n });\n },\n [navigation, channelRole, params?.orgName],\n );\n\n // Render item callback\n const renderItem = useCallback(\n ({ item: channel }) => (\n <DialogItem\n onOpen={channel?.type === RoomType.Service ? handleSelectServiceChannel : handleSelectChannel}\n currentUser={auth}\n channel={channel}\n />\n ),\n [auth, handleSelectChannel, handleSelectServiceChannel],\n );\n\n // List components - Fixed to prevent double loaders\n const ListFooterComponent = useMemo(() => {\n // Only show footer loader when loading MORE items (not initial load)\n if (loading && processedChannels.length > 0 && !isRefreshing) {\n return (\n <Center className=\"py-4\">\n <Spinner color={colors.blue[500]} size=\"small\" />\n </Center>\n );\n }\n return null;\n }, [loading, processedChannels.length, isRefreshing]);\n\n const ListEmptyComponent = useMemo(() => {\n // Show initial loading state\n if (loading && processedChannels.length === 0) {\n return (\n <Center className=\"flex-1 justify-center items-center\" style={{ minHeight: 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\n return (\n <Center className=\"flex-1 justify-center items-center px-6\" style={{ minHeight: 300 }}>\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\">\n When you start conversations with others,{'\\n'}they'll appear here.\n </Text>\n </Center>\n );\n }, [loading, processedChannels.length]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n };\n }, []);\n\n // Reset active channel and refresh on focus\n useFocusEffect(\n useCallback(() => {\n // Reset active channel reference\n activeChannelRef.current = null;\n\n // Refresh data if enough time has passed\n const now = Date.now();\n if (now - lastRefreshTimeRef.current >= MIN_REFRESH_INTERVAL) {\n lastRefreshTimeRef.current = now;\n refetch().catch(console.error);\n }\n\n return () => {\n // Cleanup is handled in the cleanup effect\n };\n }, [refetch, MIN_REFRESH_INTERVAL]),\n );\n\n // Pull to refresh handler\n const handlePullToRefresh = useCallback(async () => {\n setIsRefreshing(true);\n try {\n await refetch();\n } catch (error) {\n console.error('Refresh error:', error);\n } finally {\n setIsRefreshing(false);\n }\n }, [refetch]);\n\n // Load more channels on scroll\n const handleLoadMore = useCallback(() => {\n if (loading || !data?.channelsByUser?.length || processedChannels.length < 10) {\n return;\n }\n\n fetchMore({\n variables: {\n skip: processedChannels.length,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult?.channelsByUser?.length) return prev;\n\n return {\n ...fetchMoreResult,\n channelsByUser: [...(prev.channelsByUser || []), ...(fetchMoreResult.channelsByUser || [])],\n };\n },\n }).catch((error) => {\n console.error('Load more error:', error);\n });\n }, [fetchMore, loading, data?.channelsByUser, processedChannels.length]);\n\n // Memoize callbacks for FlatList props\n const keyExtractor = useCallback((item: any) => `channel-${item.id}`, []);\n const ItemSeparatorComponent = useCallback(() => <Box className=\"h-px bg-gray-200 mx-4\" />, []);\n const getItemLayout = useCallback(\n (_data: any, index: number) => ({\n length: 80,\n offset: 80 * index,\n index,\n }),\n [],\n );\n\n return (\n <Box className=\"flex-1 px-2\">\n <FlatList\n data={processedChannels}\n renderItem={renderItem}\n keyExtractor={keyExtractor}\n onRefresh={handlePullToRefresh}\n refreshing={isRefreshing}\n ListEmptyComponent={ListEmptyComponent}\n ListFooterComponent={ListFooterComponent}\n ItemSeparatorComponent={ItemSeparatorComponent}\n onEndReached={handleLoadMore}\n onEndReachedThreshold={0.5}\n initialNumToRender={10}\n maxToRenderPerBatch={10}\n windowSize={10}\n removeClippedSubviews={true}\n updateCellsBatchingPeriod={50}\n getItemLayout={getItemLayout}\n contentContainerStyle={{\n flexGrow: 1,\n }}\n />\n </Box>\n );\n};\n\nexport const Dialogs = React.memo(DialogsComponent);\n"],"names":["React","_a"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@messenger-box/platform-mobile",
3
- "version": "10.0.3-alpha.182",
3
+ "version": "10.0.3-alpha.187",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "CDMBase LLC",
@@ -22,10 +22,10 @@
22
22
  "watch-ts": "tsc --watch"
23
23
  },
24
24
  "dependencies": {
25
- "@messenger-box/core": "10.0.3-alpha.182",
26
- "@messenger-box/platform-client": "10.0.3-alpha.182",
25
+ "@messenger-box/core": "10.0.3-alpha.187",
26
+ "@messenger-box/platform-client": "10.0.3-alpha.187",
27
27
  "base-64": "1.0.0",
28
- "react-native-gifted-chat": "1.0.4"
28
+ "react-native-gifted-chat": "2.6.5"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/bootstrap": "4.5.0",
@@ -43,5 +43,5 @@
43
43
  "typescript": {
44
44
  "definition": "lib/index.d.ts"
45
45
  },
46
- "gitHead": "3a0c30a2acb27d857693add7c9ef33f673dcf7ea"
46
+ "gitHead": "ec7f2bac53f9eeac73cf8d0eac771285ff8706b3"
47
47
  }