@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.
- package/lib/screens/inbox/components/GiftedChatInboxComponent.js +6 -4
- package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +5 -4
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
- package/lib/screens/inbox/containers/ConversationView.js +3 -3
- package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/Dialogs.js +69 -116
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React__default,{useState,useRef,useCallback,
|
|
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 [
|
|
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
|
-
|
|
65
|
-
|
|
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:
|
|
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
|
-
|
|
110
|
-
navigation.navigate(
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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 &&
|
|
120
|
+
if (loading && processedChannels.length === 0) {
|
|
149
121
|
return /* @__PURE__ */ React__default.createElement(Center, { className: "flex-1 justify-center items-center", style: {
|
|
150
|
-
|
|
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(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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 -
|
|
173
|
-
|
|
174
|
-
console.
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
205
|
-
|
|
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:
|
|
164
|
+
skip: processedChannels.length
|
|
212
165
|
},
|
|
213
166
|
updateQuery: (prev, {
|
|
214
167
|
fetchMoreResult
|
|
215
168
|
}) => {
|
|
216
|
-
|
|
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("
|
|
176
|
+
console.error("Load more error:", error);
|
|
227
177
|
});
|
|
228
|
-
}, [fetchMore, loading, data,
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
-
}), [])
|
|
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":"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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, 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.
|
|
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.
|
|
26
|
-
"@messenger-box/platform-client": "10.0.3-alpha.
|
|
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": "
|
|
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": "
|
|
46
|
+
"gitHead": "ec7f2bac53f9eeac73cf8d0eac771285ff8706b3"
|
|
47
47
|
}
|