@messenger-box/platform-mobile 10.0.3-alpha.46 → 10.0.3-alpha.48
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/CHANGELOG.md +8 -0
- package/lib/queries/inboxQueries.js +2 -14
- package/lib/queries/inboxQueries.js.map +1 -1
- package/lib/screens/inbox/DialogThreads.js +5 -2
- package/lib/screens/inbox/DialogThreads.js.map +1 -1
- package/lib/screens/inbox/components/DialogItem.js +169 -0
- package/lib/screens/inbox/components/DialogItem.js.map +1 -0
- package/lib/screens/inbox/config/config.js +2 -2
- package/lib/screens/inbox/config/config.js.map +1 -1
- package/lib/screens/inbox/containers/ConversationView.js +26 -8
- package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/Dialogs.js +17 -36
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/package.json +4 -4
- package/src/queries/inboxQueries.ts +7 -6
- package/src/screens/inbox/DialogThreads.tsx +2 -1
- package/src/screens/inbox/components/DialogItem.tsx +306 -0
- package/src/screens/inbox/components/DialogsListItem.tsx +140 -305
- package/src/screens/inbox/components/ServiceDialogsListItem.tsx +171 -264
- package/src/screens/inbox/config/config.ts +2 -2
- package/src/screens/inbox/containers/ConversationView.tsx +25 -7
- package/src/screens/inbox/containers/Dialogs.tsx +128 -65
- package/lib/screens/inbox/components/DialogsListItem.js +0 -355
- package/lib/screens/inbox/components/DialogsListItem.js.map +0 -1
- package/lib/screens/inbox/components/ServiceDialogsListItem.js +0 -402
- package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +0 -1
|
@@ -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}from'react-redux';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {
|
|
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;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -18,24 +18,19 @@ 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
26
|
const channelFilters = __spreadValues({}, channelFilterProp);
|
|
28
|
-
channelFilters.type =
|
|
27
|
+
channelFilters.type = [RoomType.Direct, RoomType.Service];
|
|
29
28
|
const {
|
|
30
29
|
params
|
|
31
30
|
} = useRoute();
|
|
32
|
-
const auth = useSelector(userSelector);
|
|
31
|
+
const auth = useSelector(userSelector, shallowEqual);
|
|
33
32
|
const navigation = useNavigation();
|
|
34
|
-
console.log("---dialogs component---orgName---", params == null ? void 0 : params.orgName);
|
|
35
33
|
const [searchQuery, setSearchQuery] = useState("");
|
|
36
|
-
const [selectedChannelId, setSelectedChannelId] = useState((params == null ? void 0 : params.channelId) || null);
|
|
37
|
-
const [page, setPage] = useState(1);
|
|
38
|
-
const [isLoadingMore, setIsLoadingMore] = useState(false);
|
|
39
34
|
const isMountedRef = useRef(true);
|
|
40
35
|
const focusRefreshRef = useRef(null);
|
|
41
36
|
const lastRefreshTimeRef = useRef(Date.now());
|
|
@@ -49,18 +44,15 @@ const DialogsComponent = (props) => {
|
|
|
49
44
|
refetch,
|
|
50
45
|
fetchMore,
|
|
51
46
|
subscribeToMore
|
|
52
|
-
} =
|
|
47
|
+
} = useGetChannelsByUserWithLastMessageQuery({
|
|
53
48
|
variables: {
|
|
54
49
|
role: channelRole,
|
|
55
50
|
criteria: channelFilters,
|
|
56
|
-
supportServices: supportServices ? true : false,
|
|
57
|
-
supportServiceCriteria: {
|
|
58
|
-
type: RoomType.Service
|
|
59
|
-
},
|
|
60
51
|
limit: 15,
|
|
61
52
|
skip: 0
|
|
62
53
|
},
|
|
63
|
-
notifyOnNetworkStatusChange: true
|
|
54
|
+
notifyOnNetworkStatusChange: true,
|
|
55
|
+
fetchPolicy: "cache-and-network"
|
|
64
56
|
});
|
|
65
57
|
const processChannels = useCallback((rawChannels = []) => {
|
|
66
58
|
if (!(rawChannels == null ? void 0 : rawChannels.length))
|
|
@@ -74,11 +66,7 @@ const DialogsComponent = (props) => {
|
|
|
74
66
|
const sortChannels = useCallback((channels2) => {
|
|
75
67
|
if (!(channels2 == null ? void 0 : channels2.length))
|
|
76
68
|
return [];
|
|
77
|
-
return
|
|
78
|
-
const dateA = new Date((a == null ? void 0 : a.updatedAt) || (a == null ? void 0 : a.createdAt)).getTime();
|
|
79
|
-
const dateB = new Date((b == null ? void 0 : b.updatedAt) || (b == null ? void 0 : b.createdAt)).getTime();
|
|
80
|
-
return dateB - dateA;
|
|
81
|
-
});
|
|
69
|
+
return channels2;
|
|
82
70
|
}, []);
|
|
83
71
|
const handleSelectChannel = useCallback((id, title) => {
|
|
84
72
|
if (activeChannelRef.current === id) {
|
|
@@ -92,7 +80,6 @@ const DialogsComponent = (props) => {
|
|
|
92
80
|
resetActiveChannelTimeoutRef.current = setTimeout(() => {
|
|
93
81
|
activeChannelRef.current = null;
|
|
94
82
|
}, 2e3);
|
|
95
|
-
setSelectedChannelId(id);
|
|
96
83
|
console.log("\u{1F4F1} Navigating to channel:", id);
|
|
97
84
|
navigation.navigate(config.INBOX_MESSEGE_PATH, {
|
|
98
85
|
channelId: id,
|
|
@@ -115,7 +102,6 @@ const DialogsComponent = (props) => {
|
|
|
115
102
|
resetActiveChannelTimeoutRef.current = setTimeout(() => {
|
|
116
103
|
activeChannelRef.current = null;
|
|
117
104
|
}, 2e3);
|
|
118
|
-
setSelectedChannelId(id);
|
|
119
105
|
console.log("\u{1F4F1} Navigating to service channel:", id);
|
|
120
106
|
navigation.navigate(postParentId || postParentId === 0 ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH, {
|
|
121
107
|
channelId: id,
|
|
@@ -129,7 +115,7 @@ const DialogsComponent = (props) => {
|
|
|
129
115
|
const handleSearchChange = useCallback((text) => {
|
|
130
116
|
setSearchQuery(text);
|
|
131
117
|
}, []);
|
|
132
|
-
const allChannels = useMemo(() => [...(data == null ? void 0 : data.
|
|
118
|
+
const allChannels = useMemo(() => [...(data == null ? void 0 : data.channelsByUser) || []], [data]);
|
|
133
119
|
const channels = useMemo(() => sortChannels(processChannels(allChannels)), [allChannels, processChannels, sortChannels]);
|
|
134
120
|
const displayChannels = useMemo(() => {
|
|
135
121
|
if (!searchQuery.trim())
|
|
@@ -154,9 +140,9 @@ const DialogsComponent = (props) => {
|
|
|
154
140
|
item: channel
|
|
155
141
|
}) => {
|
|
156
142
|
const key = `${channel.type === RoomType.Service ? "service" : "direct"}-${channel.id}`;
|
|
157
|
-
return
|
|
158
|
-
}, [auth,
|
|
159
|
-
const ListFooterComponent = useMemo(() =>
|
|
143
|
+
return /* @__PURE__ */ React__default.createElement(DialogItem, { key, onOpen: (channel == null ? void 0 : channel.type) === RoomType.Service ? handleSelectServiceChannel : handleSelectChannel, currentUser: auth, channel });
|
|
144
|
+
}, [auth, handleSelectChannel, handleSelectServiceChannel]);
|
|
145
|
+
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]);
|
|
160
146
|
const ListEmptyComponent = useMemo(() => {
|
|
161
147
|
if (loading && displayChannels.length === 0) {
|
|
162
148
|
return /* @__PURE__ */ React__default.createElement(Center, { className: "flex-1 justify-center items-center", style: {
|
|
@@ -214,34 +200,29 @@ const DialogsComponent = (props) => {
|
|
|
214
200
|
refetch();
|
|
215
201
|
}, [refetch]);
|
|
216
202
|
const handleLoadMore = useCallback(() => {
|
|
217
|
-
if (
|
|
203
|
+
if (loading || !data || channels.length < 10) {
|
|
218
204
|
console.log("Skip loading more: already loading or all data loaded");
|
|
219
205
|
return;
|
|
220
206
|
}
|
|
221
|
-
console.log("Loading more channels
|
|
222
|
-
setIsLoadingMore(true);
|
|
207
|
+
console.log("Loading more channels");
|
|
223
208
|
fetchMore({
|
|
224
209
|
variables: {
|
|
225
|
-
skip:
|
|
210
|
+
skip: channels.length
|
|
226
211
|
},
|
|
227
212
|
updateQuery: (prev, {
|
|
228
213
|
fetchMoreResult
|
|
229
214
|
}) => {
|
|
230
|
-
setIsLoadingMore(false);
|
|
231
|
-
setPage((prevPage) => prevPage + 1);
|
|
232
215
|
if (!fetchMoreResult)
|
|
233
216
|
return prev;
|
|
234
217
|
return __spreadProps(__spreadValues({}, fetchMoreResult), {
|
|
235
|
-
channelsByUser: [...prev.channelsByUser || [], ...fetchMoreResult.channelsByUser || []]
|
|
236
|
-
supportServiceChannels: [...prev.supportServiceChannels || [], ...fetchMoreResult.supportServiceChannels || []]
|
|
218
|
+
channelsByUser: [...prev.channelsByUser || [], ...fetchMoreResult.channelsByUser || []]
|
|
237
219
|
});
|
|
238
220
|
}
|
|
239
221
|
}).catch((error) => {
|
|
240
222
|
console.error("Error loading more channels:", error);
|
|
241
|
-
setIsLoadingMore(false);
|
|
242
223
|
});
|
|
243
|
-
}, [fetchMore,
|
|
244
|
-
return /* @__PURE__ */ React__default.createElement(Box, { className: "p-2" }, /* @__PURE__ */ React__default.createElement(
|
|
224
|
+
}, [fetchMore, loading, data, channels.length]);
|
|
225
|
+
return /* @__PURE__ */ React__default.createElement(Box, { className: "p-2" }, /* @__PURE__ */ React__default.createElement(FlatList, { data: displayChannels, onRefresh: handlePullToRefresh, refreshing: loading, contentContainerStyle: {
|
|
245
226
|
minHeight: "100%"
|
|
246
227
|
}, 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) => ({
|
|
247
228
|
length: 80,
|
|
@@ -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 } from 'react-redux';\nimport { useNavigation, useRoute, useFocusEffect } from '@react-navigation/native';\nimport { DialogsListItem } from '../components/DialogsListItem';\nimport { ServiceDialogsListItem } from '../components/ServiceDialogsListItem';\nimport { useChannelsQuery, CHAT_MESSAGE_ADDED } from '../../../queries/inboxQueries';\nimport { RoomType } from 'common';\nimport { userSelector } from '@adminide-stack/user-auth0-client';\nimport { config } from '../config';\nimport colors from 'tailwindcss/colors';\nimport { SubscriptionHandler } from '../components/SubscriptionHandler';\n\nexport interface InboxProps {\n channelFilters?: Record<string, unknown>;\n channelRole?: string;\n supportServices: boolean;\n}\n\nconst DialogsComponent = (props: InboxProps) => {\n const { channelFilters: channelFilterProp, channelRole, supportServices } = props;\n const channelFilters = { ...channelFilterProp };\n channelFilters.type = channelFilters?.type ?? RoomType.Direct;\n const { params } = useRoute<any>();\n const auth = useSelector(userSelector);\n const navigation = useNavigation<any>();\n console.log('---dialogs component---orgName---', params?.orgName);\n // Local state for UI control\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedChannelId, setSelectedChannelId] = useState<string | null>(params?.channelId || null);\n const [page, setPage] = useState(1);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // Create a ref to track if component is mounted\n const isMountedRef = useRef(true);\n const focusRefreshRef = useRef<number | null>(null);\n const lastRefreshTimeRef = useRef(Date.now());\n const MIN_REFRESH_INTERVAL = 2000;\n\n // Add lastNavigationTimestamp to track when the user navigates away\n const lastNavigationTimestamp = useRef(0);\n // Track active channel to prevent duplicate clicks on the same channel\n const activeChannelRef = useRef<string | null>(null);\n // Hold a timeout ref to reset active channel status\n const resetActiveChannelTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Apollo query with pagination and optimistic updates\n const { data, loading, refetch, fetchMore, subscribeToMore } = useChannelsQuery({\n variables: {\n role: channelRole,\n criteria: channelFilters,\n supportServices: supportServices ? true : false,\n supportServiceCriteria: {\n type: RoomType.Service,\n },\n limit: 15,\n skip: 0,\n },\n notifyOnNetworkStatusChange: true,\n });\n\n // Memoize processChannels and sortChannels to avoid unnecessary recalculations\n const processChannels = useCallback(\n (rawChannels = []) => {\n if (!rawChannels?.length) return [];\n return rawChannels.filter((c) => {\n if (!c?.members) return false;\n return c.members.some(\n (member) => member?.user && member.user.id !== auth?.id && member.user.__typename === 'UserAccount',\n );\n });\n },\n [auth?.id],\n );\n\n const sortChannels = useCallback((channels) => {\n if (!channels?.length) return [];\n return [...channels].sort((a, b) => {\n const dateA = new Date(a?.updatedAt || a?.createdAt).getTime();\n const dateB = new Date(b?.updatedAt || b?.createdAt).getTime();\n return dateB - dateA;\n });\n }, []);\n\n // Navigation handlers with debounce to prevent double taps\n const handleSelectChannel = useCallback(\n (id, title) => {\n if (activeChannelRef.current === id) {\n console.log('📱 Ignoring repeated tap on channel:', id);\n return;\n }\n activeChannelRef.current = id;\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n resetActiveChannelTimeoutRef.current = setTimeout(() => {\n activeChannelRef.current = null;\n }, 2000);\n setSelectedChannelId(id);\n console.log('📱 Navigating to channel:', id);\n navigation.navigate(config.INBOX_MESSEGE_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n hideTabBar: true,\n timestamp: new Date().getTime(),\n 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 setSelectedChannelId(id);\n console.log('📱 Navigating to service channel:', id);\n navigation.navigate(postParentId || postParentId === 0 ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n postParentId: postParentId,\n hideTabBar: true,\n 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 channels = useMemo(\n () => sortChannels(processChannels(allChannels)),\n [allChannels, processChannels, sortChannels],\n );\n\n // Memoize filteredChannels\n const displayChannels = useMemo(() => {\n if (!searchQuery.trim()) return channels;\n const query = searchQuery.toLowerCase();\n return channels.filter((channel) => {\n if (channel.title && channel.title.toLowerCase().includes(query)) return true;\n if (channel.members) {\n return channel.members.some((member) => {\n const user = member?.user;\n if (!user) return false;\n const fullName = `${user.givenName || ''} ${user.familyName || ''}`.toLowerCase();\n return fullName.includes(query) || (user.username && user.username.toLowerCase().includes(query));\n });\n }\n return false;\n });\n }, [channels, searchQuery]);\n\n // Memoize renderItem to avoid re-renders\n const renderItem = useCallback(\n ({ item: channel }) => {\n const key = `${channel.type === RoomType.Service ? 'service' : 'direct'}-${channel.id}`;\n return channel?.type === RoomType.Service ? (\n <ServiceDialogsListItem\n key={key}\n onOpen={handleSelectServiceChannel}\n currentUser={auth}\n channel={channel}\n refreshing={loading}\n selectedChannelId={selectedChannelId}\n role={channelRole}\n />\n ) : (\n <DialogsListItem\n key={key}\n onOpen={handleSelectChannel}\n currentUser={auth}\n channel={channel}\n selectedChannelId={selectedChannelId}\n forceRefresh={true}\n />\n );\n },\n [auth, channelRole, handleSelectChannel, handleSelectServiceChannel, loading, selectedChannelId],\n );\n\n // Memoize ListFooterComponent and ListEmptyComponent\n const ListFooterComponent = useMemo(\n () =>\n isLoadingMore ? (\n <Center className=\"py-4\">\n <Spinner color={colors.blue[500]} size=\"small\" />\n </Center>\n ) : null,\n [isLoadingMore],\n );\n\n const ListEmptyComponent = useMemo(() => {\n if (loading && displayChannels.length === 0) {\n return (\n <Center className=\"flex-1 justify-center items-center\" style={{ height: 300 }}>\n <Spinner color={colors.blue[500]} size=\"large\" />\n <Text className=\"mt-4 text-gray-500\">Loading conversations...</Text>\n </Center>\n );\n }\n return (\n <Box className=\"p-6\">\n <Box className=\"mb-6\">\n <Heading className=\"text-2xl font-bold\">Direct Messages</Heading>\n <Text className=\"text-gray-600 mt-1\">Private conversations with other users</Text>\n </Box>\n <Input\n className=\"mb-8 h-[50] rounded-md border-gray-300 border\"\n size=\"md\"\n style={{\n paddingVertical: 8,\n marginBottom: 10,\n borderColor: '#d1d5db',\n borderRadius: 10,\n }}\n >\n <InputField\n placeholder=\"Search messages...\"\n onChangeText={handleSearchChange}\n value={searchQuery}\n />\n </Input>\n <Center className=\"items-center\" style={{ paddingVertical: 5 }}>\n <Box className=\"w-16 h-16 rounded-full bg-blue-500 flex items-center justify-center mb-5\">\n <Ionicons name=\"chatbubble-ellipses\" size={30} color=\"white\" />\n </Box>\n <Text className=\"text-2xl font-bold text-center mb-2\">No messages yet</Text>\n <Text className=\"text-gray-600 text-center mb-8\">\n When you start conversations with others,{'\\n'}\n they'll appear here.\n </Text>\n </Center>\n </Box>\n );\n }, [loading, displayChannels.length, handleSearchChange, searchQuery]);\n\n // Handle component cleanup\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n // Clear any active timeouts\n if (resetActiveChannelTimeoutRef.current) {\n clearTimeout(resetActiveChannelTimeoutRef.current);\n }\n };\n }, []);\n\n // Reset activeChannelRef when returning to this screen\n useFocusEffect(\n useCallback(() => {\n // When screen gains focus, check if we're coming back from a detail screen\n const now = Date.now();\n\n // Reset active channel ref if enough time has passed since last navigation\n if (now - lastNavigationTimestamp.current > 300) {\n activeChannelRef.current = null;\n console.log('Reset active channel reference on focus');\n }\n\n return () => {\n // When losing focus, update the timestamp\n lastNavigationTimestamp.current = Date.now();\n };\n }, []),\n );\n\n // Handle refresh on focus\n useFocusEffect(\n useCallback(() => {\n console.log('📱 Focus effect triggered for Dialogs screen');\n\n // Refresh when returning to the screen if enough time has passed\n const performRefresh = () => {\n const now = Date.now();\n if (now - lastRefreshTimeRef.current < MIN_REFRESH_INTERVAL) {\n console.log('⏩ Skipping refresh: too soon after previous refresh');\n return;\n }\n\n console.log('🔄 Performing refresh on screen focus');\n if (isMountedRef.current) {\n lastRefreshTimeRef.current = now;\n refetch();\n }\n };\n\n const focusRefreshTimeout = setTimeout(performRefresh, 100);\n return () => clearTimeout(focusRefreshTimeout);\n }, [refetch]),\n );\n\n // Handle pull-to-refresh\n const handlePullToRefresh = useCallback(() => {\n const now = Date.now();\n focusRefreshRef.current = now;\n\n console.log('🔄 Pull-to-refresh triggered');\n refetch();\n }, [refetch]);\n\n // Load more channels\n const handleLoadMore = useCallback(() => {\n if (isLoadingMore || !data || channels.length < 10) {\n console.log('Skip loading more: already loading or all data loaded');\n return;\n }\n\n console.log('Loading more channels at page:', page + 1);\n setIsLoadingMore(true);\n\n fetchMore({\n variables: {\n skip: page * 15,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n setIsLoadingMore(false);\n setPage((prevPage) => prevPage + 1);\n\n if (!fetchMoreResult) return prev;\n\n // Combine previous and new results\n return {\n ...fetchMoreResult,\n channelsByUser: [...(prev.channelsByUser || []), ...(fetchMoreResult.channelsByUser || [])],\n supportServiceChannels: [\n ...(prev.supportServiceChannels || []),\n ...(fetchMoreResult.supportServiceChannels || []),\n ],\n };\n },\n }).catch((error) => {\n console.error('Error loading more channels:', error);\n setIsLoadingMore(false);\n });\n }, [fetchMore, isLoadingMore, data, channels.length, page]);\n\n return (\n <Box className=\"p-2\">\n <SubscriptionHandler\n subscribeToMore={subscribeToMore}\n document={CHAT_MESSAGE_ADDED}\n variables={{}}\n updateQuery={undefined}\n />\n <FlatList\n data={displayChannels}\n onRefresh={handlePullToRefresh}\n refreshing={loading && !isLoadingMore}\n contentContainerStyle={{ minHeight: '100%' }}\n ItemSeparatorComponent={React.useCallback(\n () => (\n <Box className=\"h-0.5 bg-gray-200\" />\n ),\n [],\n )}\n renderItem={renderItem}\n ListFooterComponent={ListFooterComponent}\n onEndReached={handleLoadMore}\n onEndReachedThreshold={0.5}\n initialNumToRender={5}\n maxToRenderPerBatch={5}\n windowSize={5}\n removeClippedSubviews={true}\n updateCellsBatchingPeriod={100}\n getItemLayout={React.useCallback((data, index) => ({ length: 80, offset: 80 * index, index }), [])}\n keyExtractor={React.useCallback((item) => `channel-${item.id}`, [])}\n ListEmptyComponent={ListEmptyComponent}\n />\n </Box>\n );\n};\n\nexport const Dialogs = React.memo(DialogsComponent);\n"],"names":["channels","React","data"],"mappings":"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"}
|
|
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 channelFilters.type = [RoomType.Direct, RoomType.Service];\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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"}
|
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.48",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -22,8 +22,8 @@
|
|
|
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.48",
|
|
26
|
+
"@messenger-box/platform-client": "10.0.3-alpha.48",
|
|
27
27
|
"base-64": "1.0.0",
|
|
28
28
|
"react-native-gifted-chat": "1.0.4"
|
|
29
29
|
},
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"typescript": {
|
|
44
44
|
"definition": "lib/index.d.ts"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "164356479ddd307a52d0d622fa8447311c017bc2"
|
|
47
47
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Imports from common/graphql
|
|
2
2
|
import {
|
|
3
3
|
useGetChannelsByUserWithServiceChannelsQuery,
|
|
4
|
+
useGetChannelsByUserQuery,
|
|
4
5
|
OnChatMessageAddedDocument,
|
|
5
6
|
OnThreadCreatedUpdatedDocument,
|
|
6
7
|
useViewChannelDetailQuery,
|
|
@@ -28,10 +29,10 @@ import { useCallback } from 'react';
|
|
|
28
29
|
* @returns Query result with data, loading state, refetch and fetchMore functions
|
|
29
30
|
*/
|
|
30
31
|
export const useChannelsQuery = (options: any = {}) => {
|
|
31
|
-
return
|
|
32
|
+
return useGetChannelsByUserQuery({
|
|
32
33
|
...options,
|
|
33
34
|
fetchPolicy: 'cache-and-network',
|
|
34
|
-
nextFetchPolicy: 'network-only',
|
|
35
|
+
//nextFetchPolicy: 'network-only',
|
|
35
36
|
});
|
|
36
37
|
};
|
|
37
38
|
|
|
@@ -236,10 +237,10 @@ export const useInboxChannels = () => {
|
|
|
236
237
|
return {
|
|
237
238
|
...fetchMoreResult,
|
|
238
239
|
channelsByUser: [...(prev.channelsByUser || []), ...(fetchMoreResult.channelsByUser || [])],
|
|
239
|
-
supportServiceChannels: [
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
],
|
|
240
|
+
// supportServiceChannels: [
|
|
241
|
+
// ...(prev.supportServiceChannels || []),
|
|
242
|
+
// ...(fetchMoreResult.supportServiceChannels || []),
|
|
243
|
+
// ],
|
|
243
244
|
};
|
|
244
245
|
},
|
|
245
246
|
});
|
|
@@ -39,7 +39,8 @@ export function DialogThreads({ channelId, postParentId, role }) {
|
|
|
39
39
|
repliesLimit2: 5,
|
|
40
40
|
},
|
|
41
41
|
});
|
|
42
|
-
|
|
42
|
+
console.log('threadsData', threadsData?.threadMessages?.totalCount);
|
|
43
|
+
console.log('channelid', channelId);
|
|
43
44
|
// Initialize the machine with props
|
|
44
45
|
React.useEffect(() => {
|
|
45
46
|
send({
|