@messenger-box/platform-mobile 10.0.3-alpha.33 → 10.0.3-alpha.36
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/screens/inbox/components/DialogsListItem.js +26 -6
- package/lib/screens/inbox/components/DialogsListItem.js.map +1 -1
- package/lib/screens/inbox/components/ServiceDialogsListItem.js +171 -42
- package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +1 -1
- package/lib/screens/inbox/containers/ConversationView.js +116 -51
- package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/Dialogs.js +168 -56
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/package.json +4 -4
- package/src/screens/inbox/components/DialogsListItem.tsx +31 -0
- package/src/screens/inbox/components/ServiceDialogsListItem.tsx +300 -113
- package/src/screens/inbox/containers/ConversationView.tsx +146 -63
- package/src/screens/inbox/containers/Dialogs.tsx +228 -57
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React__default,{useRef,useCallback,useEffect,useState,useMemo}from'react';import {Box,FlatList,Center,Spinner,Text,Heading,Input,InputField}from'@admin-layout/gluestack-ui-mobile';import {Ionicons}from'@expo/vector-icons';import {useSelector}from'react-redux';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {orderBy}from'lodash-es';import {DialogsListItem}from'../components/DialogsListItem.js';import {ServiceDialogsListItem}from'../components/ServiceDialogsListItem.js';import {useGetChannelsByUserWithServiceChannelsQuery}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';import'./workflow/dialogs-xstate.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import React__default,{useRef,useCallback,useEffect,useState,useMemo}from'react';import {Box,FlatList,Center,Spinner,Text,Heading,Input,InputField}from'@admin-layout/gluestack-ui-mobile';import {Ionicons}from'@expo/vector-icons';import {useSelector}from'react-redux';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {orderBy}from'lodash-es';import {DialogsListItem}from'../components/DialogsListItem.js';import {ServiceDialogsListItem}from'../components/ServiceDialogsListItem.js';import {useGetChannelsByUserWithServiceChannelsQuery,OnChatMessageAddedDocument}from'common/graphql';import {RoomType}from'common';import {userSelector}from'@adminide-stack/user-auth0-client';import {config}from'../config/config.js';import colors from'tailwindcss/colors';import'./workflow/dialogs-xstate.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -27,7 +27,9 @@ const Actions = {
|
|
|
27
27
|
START_LOADING: "START_LOADING",
|
|
28
28
|
STOP_LOADING: "STOP_LOADING",
|
|
29
29
|
LOAD_MORE_CHANNELS: "LOAD_MORE_CHANNELS",
|
|
30
|
-
SET_SEARCH_QUERY: "SET_SEARCH_QUERY"
|
|
30
|
+
SET_SEARCH_QUERY: "SET_SEARCH_QUERY",
|
|
31
|
+
UPDATE_CHANNEL: "UPDATE_CHANNEL",
|
|
32
|
+
REORDER_CHANNELS: "REORDER_CHANNELS"
|
|
31
33
|
};
|
|
32
34
|
const BaseState = {
|
|
33
35
|
Idle: "idle",
|
|
@@ -60,7 +62,7 @@ function useSafeMachine(machine) {
|
|
|
60
62
|
value: "idle"
|
|
61
63
|
});
|
|
62
64
|
const send = useCallback((event) => {
|
|
63
|
-
var _a, _b, _c, _d;
|
|
65
|
+
var _a, _b, _c, _d, _e, _f;
|
|
64
66
|
try {
|
|
65
67
|
console.log("Event received:", event.type);
|
|
66
68
|
if (event.type === Actions.INITIAL_CONTEXT) {
|
|
@@ -81,31 +83,87 @@ function useSafeMachine(machine) {
|
|
|
81
83
|
});
|
|
82
84
|
} else if (event.type === Actions.FETCH_CHANNELS) {
|
|
83
85
|
console.log("Setting channels:", ((_b = (_a = event.data) == null ? void 0 : _a.channels) == null ? void 0 : _b.length) || 0);
|
|
86
|
+
const processedChannels = ((_d = (_c = event.data) == null ? void 0 : _c.channels) == null ? void 0 : _d.map((channel) => {
|
|
87
|
+
if (channel.lastMessage) {
|
|
88
|
+
return __spreadProps(__spreadValues({}, channel), {
|
|
89
|
+
lastMessage: __spreadProps(__spreadValues({}, channel.lastMessage), {
|
|
90
|
+
id: channel.lastMessage.id,
|
|
91
|
+
message: channel.lastMessage.message,
|
|
92
|
+
createdAt: channel.lastMessage.createdAt || channel.lastMessage.updatedAt,
|
|
93
|
+
updatedAt: channel.lastMessage.updatedAt || channel.lastMessage.createdAt,
|
|
94
|
+
userId: channel.lastMessage.userId,
|
|
95
|
+
channelId: channel.lastMessage.channelId || channel.id
|
|
96
|
+
})
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return channel;
|
|
100
|
+
})) || [];
|
|
84
101
|
setState((prev) => {
|
|
85
|
-
var _a2, _b2, _c2, _d2
|
|
102
|
+
var _a2, _b2, _c2, _d2;
|
|
86
103
|
return __spreadProps(__spreadValues({}, prev), {
|
|
87
104
|
context: __spreadProps(__spreadValues({}, prev.context), {
|
|
88
|
-
channels:
|
|
89
|
-
hasMoreChannels: (((
|
|
90
|
-
loading: ((
|
|
91
|
-
refreshing: ((
|
|
105
|
+
channels: processedChannels,
|
|
106
|
+
hasMoreChannels: (((_b2 = (_a2 = event.data) == null ? void 0 : _a2.channels) == null ? void 0 : _b2.length) || 0) > 0,
|
|
107
|
+
loading: ((_c2 = event.data) == null ? void 0 : _c2.stopLoading) ? false : prev.context.loading,
|
|
108
|
+
refreshing: ((_d2 = event.data) == null ? void 0 : _d2.stopLoading) ? false : prev.context.refreshing,
|
|
92
109
|
loadingMore: false
|
|
93
110
|
}),
|
|
94
111
|
value: BaseState.Idle
|
|
95
112
|
});
|
|
96
113
|
});
|
|
97
114
|
} else if (event.type === Actions.APPEND_CHANNELS) {
|
|
98
|
-
const newChannels = ((
|
|
115
|
+
const newChannels = ((_e = event.data) == null ? void 0 : _e.channels) || [];
|
|
99
116
|
console.log("Appending channels:", newChannels.length);
|
|
117
|
+
const processedNewChannels = newChannels.map((channel) => {
|
|
118
|
+
if (channel.lastMessage) {
|
|
119
|
+
return __spreadProps(__spreadValues({}, channel), {
|
|
120
|
+
lastMessage: __spreadProps(__spreadValues({}, channel.lastMessage), {
|
|
121
|
+
id: channel.lastMessage.id,
|
|
122
|
+
message: channel.lastMessage.message,
|
|
123
|
+
createdAt: channel.lastMessage.createdAt || channel.lastMessage.updatedAt,
|
|
124
|
+
updatedAt: channel.lastMessage.updatedAt || channel.lastMessage.createdAt,
|
|
125
|
+
userId: channel.lastMessage.userId,
|
|
126
|
+
channelId: channel.lastMessage.channelId || channel.id
|
|
127
|
+
})
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return channel;
|
|
131
|
+
});
|
|
100
132
|
setState((prev) => __spreadProps(__spreadValues({}, prev), {
|
|
101
133
|
context: __spreadProps(__spreadValues({}, prev.context), {
|
|
102
|
-
channels: [...prev.context.channels, ...
|
|
134
|
+
channels: [...prev.context.channels, ...processedNewChannels],
|
|
103
135
|
hasMoreChannels: newChannels.length >= 10,
|
|
104
136
|
page: prev.context.page + 1,
|
|
105
137
|
loadingMore: false
|
|
106
138
|
}),
|
|
107
139
|
value: BaseState.Idle
|
|
108
140
|
}));
|
|
141
|
+
} else if (event.type === Actions.UPDATE_CHANNEL) {
|
|
142
|
+
setState((prev) => {
|
|
143
|
+
var _a2;
|
|
144
|
+
const updatedChannel = (_a2 = event.data) == null ? void 0 : _a2.channel;
|
|
145
|
+
if (!updatedChannel || !updatedChannel.id)
|
|
146
|
+
return prev;
|
|
147
|
+
const updatedChannels = prev.context.channels.map((channel) => channel.id === updatedChannel.id ? updatedChannel : channel);
|
|
148
|
+
return __spreadProps(__spreadValues({}, prev), {
|
|
149
|
+
context: __spreadProps(__spreadValues({}, prev.context), {
|
|
150
|
+
channels: updatedChannels
|
|
151
|
+
})
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
} else if (event.type === Actions.REORDER_CHANNELS) {
|
|
155
|
+
setState((prev) => {
|
|
156
|
+
const sortedChannels = [...prev.context.channels].sort((a, b) => {
|
|
157
|
+
const dateA = new Date((a == null ? void 0 : a.updatedAt) || (a == null ? void 0 : a.createdAt)).getTime();
|
|
158
|
+
const dateB = new Date((b == null ? void 0 : b.updatedAt) || (b == null ? void 0 : b.createdAt)).getTime();
|
|
159
|
+
return dateB - dateA;
|
|
160
|
+
});
|
|
161
|
+
return __spreadProps(__spreadValues({}, prev), {
|
|
162
|
+
context: __spreadProps(__spreadValues({}, prev.context), {
|
|
163
|
+
channels: sortedChannels
|
|
164
|
+
})
|
|
165
|
+
});
|
|
166
|
+
});
|
|
109
167
|
} else if (event.type === Actions.REFRESH_CHANNELS) {
|
|
110
168
|
setState((prev) => __spreadProps(__spreadValues({}, prev), {
|
|
111
169
|
context: __spreadProps(__spreadValues({}, prev.context), {
|
|
@@ -157,7 +215,7 @@ function useSafeMachine(machine) {
|
|
|
157
215
|
});
|
|
158
216
|
});
|
|
159
217
|
} else if (event.type === Actions.ERROR_HANDLED) {
|
|
160
|
-
console.log("Error handled:", (
|
|
218
|
+
console.log("Error handled:", (_f = event.data) == null ? void 0 : _f.message);
|
|
161
219
|
setState((prev) => {
|
|
162
220
|
var _a2;
|
|
163
221
|
return __spreadProps(__spreadValues({}, prev), {
|
|
@@ -270,7 +328,8 @@ const DialogsComponent = (props) => {
|
|
|
270
328
|
};
|
|
271
329
|
}, []);
|
|
272
330
|
const {
|
|
273
|
-
refetch: getChannelsRefetch
|
|
331
|
+
refetch: getChannelsRefetch,
|
|
332
|
+
subscribeToMore
|
|
274
333
|
} = useGetChannelsByUserWithServiceChannelsQuery({
|
|
275
334
|
variables: {
|
|
276
335
|
role: channelRole,
|
|
@@ -318,8 +377,8 @@ const DialogsComponent = (props) => {
|
|
|
318
377
|
return false;
|
|
319
378
|
})) != null ? _c : [];
|
|
320
379
|
const sortedChannels = filteredChannels.sort((a, b) => {
|
|
321
|
-
const dateA = new Date(a.updatedAt);
|
|
322
|
-
const dateB = new Date(b.updatedAt);
|
|
380
|
+
const dateA = new Date(a.updatedAt || a.createdAt);
|
|
381
|
+
const dateB = new Date(b.updatedAt || b.createdAt);
|
|
323
382
|
return dateB.getTime() - dateA.getTime();
|
|
324
383
|
}) || [];
|
|
325
384
|
console.log(`\u{1F4CA} Processed channels: ${sortedChannels.length} (page: ${pageNum}, skip: ${skipCount})`);
|
|
@@ -418,6 +477,76 @@ const DialogsComponent = (props) => {
|
|
|
418
477
|
}
|
|
419
478
|
}
|
|
420
479
|
}, [getChannelsRefetch, channelRole, channelFilters, supportServices, auth == null ? void 0 : auth.id, safeSend]);
|
|
480
|
+
const messageSubscriptionRef = useRef(null);
|
|
481
|
+
useEffect(() => {
|
|
482
|
+
if (!auth || !auth.id || messageSubscriptionRef.current)
|
|
483
|
+
return;
|
|
484
|
+
console.log("\u{1F4F1} Setting up global message subscription for dialog updates");
|
|
485
|
+
const unsubscribe = subscribeToMore({
|
|
486
|
+
document: OnChatMessageAddedDocument,
|
|
487
|
+
variables: {},
|
|
488
|
+
updateQuery: (prev, {
|
|
489
|
+
subscriptionData
|
|
490
|
+
}) => {
|
|
491
|
+
try {
|
|
492
|
+
if (!subscriptionData.data || !isMountedRef.current)
|
|
493
|
+
return prev;
|
|
494
|
+
const subData = subscriptionData.data;
|
|
495
|
+
const newMessage = subData.chatMessageAdded;
|
|
496
|
+
console.log("\u{1F4F1} Dialog subscription received message update:", newMessage == null ? void 0 : newMessage.id);
|
|
497
|
+
if (!newMessage || !newMessage.channelId)
|
|
498
|
+
return prev;
|
|
499
|
+
const currentChannels = safeGetContext().channels || [];
|
|
500
|
+
const channelToUpdate = currentChannels.find((c) => {
|
|
501
|
+
var _a2, _b;
|
|
502
|
+
return ((_a2 = c.id) == null ? void 0 : _a2.toString()) === ((_b = newMessage.channelId) == null ? void 0 : _b.toString());
|
|
503
|
+
});
|
|
504
|
+
if (channelToUpdate) {
|
|
505
|
+
console.log("\u{1F4F1} Found channel to update:", channelToUpdate.id);
|
|
506
|
+
const updatedChannel = __spreadProps(__spreadValues({}, channelToUpdate), {
|
|
507
|
+
updatedAt: newMessage.createdAt || newMessage.updatedAt,
|
|
508
|
+
lastMessage: __spreadProps(__spreadValues({}, newMessage), {
|
|
509
|
+
id: newMessage.id,
|
|
510
|
+
message: newMessage.message,
|
|
511
|
+
createdAt: newMessage.createdAt || newMessage.updatedAt,
|
|
512
|
+
updatedAt: newMessage.updatedAt || newMessage.createdAt,
|
|
513
|
+
userId: newMessage.userId,
|
|
514
|
+
channelId: newMessage.channelId
|
|
515
|
+
})
|
|
516
|
+
});
|
|
517
|
+
if (isMountedRef.current) {
|
|
518
|
+
safeSend({
|
|
519
|
+
type: Actions.UPDATE_CHANNEL,
|
|
520
|
+
data: {
|
|
521
|
+
channel: updatedChannel
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
safeSend({
|
|
525
|
+
type: Actions.REORDER_CHANNELS
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
} else {
|
|
529
|
+
console.log("\u{1F4F1} Channel not found in current list, triggering refresh");
|
|
530
|
+
if (isMountedRef.current && !safeGetContext().refreshing && !safeGetContext().loading) {
|
|
531
|
+
fastRefresh();
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return prev;
|
|
535
|
+
} catch (error) {
|
|
536
|
+
console.error("Error in dialog subscription handler:", error);
|
|
537
|
+
return prev;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
messageSubscriptionRef.current = unsubscribe;
|
|
542
|
+
return () => {
|
|
543
|
+
if (messageSubscriptionRef.current) {
|
|
544
|
+
console.log("\u{1F4F1} Cleaning up dialog message subscription");
|
|
545
|
+
messageSubscriptionRef.current();
|
|
546
|
+
messageSubscriptionRef.current = null;
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
}, [auth == null ? void 0 : auth.id, isMountedRef, safeGetContext, fastRefresh, safeSend, subscribeToMore]);
|
|
421
550
|
useEffect(() => {
|
|
422
551
|
const context = safeGetContext();
|
|
423
552
|
const isAlreadyFetching = context.refreshing || context.loading;
|
|
@@ -473,40 +602,33 @@ const DialogsComponent = (props) => {
|
|
|
473
602
|
}
|
|
474
603
|
}, []);
|
|
475
604
|
const focusRefreshRef = useRef(null);
|
|
605
|
+
const lastRefreshTimeRef = useRef(Date.now());
|
|
606
|
+
const MIN_REFRESH_INTERVAL = 2e3;
|
|
476
607
|
useFocusEffect(useCallback(() => {
|
|
477
|
-
|
|
478
|
-
const
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
}, 100);
|
|
498
|
-
} else {
|
|
499
|
-
console.log("\u23E9 Skipping focus refresh:", {
|
|
500
|
-
isAlreadyFetching,
|
|
501
|
-
hasTriggeredRefresh,
|
|
502
|
-
shouldRefresh,
|
|
503
|
-
timeGap: lastRefresh === null ? "first refresh" : now - lastRefresh
|
|
504
|
-
});
|
|
505
|
-
}
|
|
608
|
+
console.log("\u{1F4F1} Focus effect triggered for Dialogs screen");
|
|
609
|
+
const performRefresh = () => {
|
|
610
|
+
const now = Date.now();
|
|
611
|
+
if (now - lastRefreshTimeRef.current < MIN_REFRESH_INTERVAL) {
|
|
612
|
+
console.log("\u23E9 Skipping refresh: too soon after previous refresh");
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
console.log("\u{1F504} Performing forced refresh on screen focus");
|
|
616
|
+
if (isMountedRef.current) {
|
|
617
|
+
lastRefreshTimeRef.current = now;
|
|
618
|
+
safeSend({
|
|
619
|
+
type: Actions.START_LOADING,
|
|
620
|
+
data: {
|
|
621
|
+
refreshing: true
|
|
622
|
+
}
|
|
623
|
+
});
|
|
624
|
+
fastRefresh();
|
|
625
|
+
}
|
|
626
|
+
};
|
|
627
|
+
const focusRefreshTimeout = setTimeout(performRefresh, 100);
|
|
506
628
|
return () => {
|
|
507
|
-
|
|
629
|
+
clearTimeout(focusRefreshTimeout);
|
|
508
630
|
};
|
|
509
|
-
}, [safeSend,
|
|
631
|
+
}, [safeSend, fastRefresh]));
|
|
510
632
|
const handleSelectChannel = useCallback((id, title) => {
|
|
511
633
|
safeSend({
|
|
512
634
|
type: Actions.SELECT_CHANNEL,
|
|
@@ -585,17 +707,7 @@ const DialogsComponent = (props) => {
|
|
|
585
707
|
item: channel
|
|
586
708
|
}) => {
|
|
587
709
|
const key = `${channel.type === RoomType.Service ? "service" : "direct"}-${channel.id}`;
|
|
588
|
-
return (channel == null ? void 0 : channel.type) === RoomType.Service ? /* @__PURE__ */ React__default.createElement(ServiceDialogsListItem, { key, onOpen: handleSelectServiceChannel, currentUser: auth, channel, refreshing, selectedChannelId, role: channelRole }) : /* @__PURE__ */ React__default.createElement(
|
|
589
|
-
DialogsListItem,
|
|
590
|
-
{
|
|
591
|
-
key,
|
|
592
|
-
onOpen: handleSelectChannel,
|
|
593
|
-
currentUser: auth,
|
|
594
|
-
channel,
|
|
595
|
-
selectedChannelId,
|
|
596
|
-
forceRefresh: false
|
|
597
|
-
}
|
|
598
|
-
);
|
|
710
|
+
return (channel == null ? void 0 : channel.type) === RoomType.Service ? /* @__PURE__ */ React__default.createElement(ServiceDialogsListItem, { key, onOpen: handleSelectServiceChannel, currentUser: auth, channel, refreshing, selectedChannelId, role: channelRole }) : /* @__PURE__ */ React__default.createElement(DialogsListItem, { key, onOpen: handleSelectChannel, currentUser: auth, channel, selectedChannelId, forceRefresh: true });
|
|
599
711
|
},
|
|
600
712
|
ListFooterComponent: () => loadingMore ? /* @__PURE__ */ React__default.createElement(Center, { className: "py-4" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" })) : null,
|
|
601
713
|
onEndReached: handleLoadMore,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialogs.js","sources":["../../../../src/screens/inbox/containers/Dialogs.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { FlatList, Box, Heading, Input, InputField, Text, Center, Spinner } from '@admin-layout/gluestack-ui-mobile';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useSelector } from 'react-redux';\nimport { useNavigation, useRoute, useFocusEffect } from '@react-navigation/native';\nimport { orderBy } from 'lodash-es';\nimport { DialogsListItem } from '../components/DialogsListItem';\nimport { ServiceDialogsListItem } from '../components/ServiceDialogsListItem';\nimport { useGetChannelsByUserWithServiceChannelsQuery } 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 { dialogsXstate } from './workflow/dialogs-xstate';\n\n// Define custom actions and states for our component\nconst Actions = {\n INITIAL_CONTEXT: 'INITIAL_CONTEXT',\n ERROR_HANDLED: 'ERROR_HANDLED',\n FETCH_CHANNELS: 'FETCH_CHANNELS',\n APPEND_CHANNELS: 'APPEND_CHANNELS',\n REFRESH_CHANNELS: 'REFRESH_CHANNELS',\n SELECT_CHANNEL: 'SELECT_CHANNEL',\n START_LOADING: 'START_LOADING',\n STOP_LOADING: 'STOP_LOADING',\n LOAD_MORE_CHANNELS: 'LOAD_MORE_CHANNELS',\n SET_SEARCH_QUERY: 'SET_SEARCH_QUERY',\n};\n\nconst BaseState = {\n Idle: 'idle',\n Error: 'error',\n Loading: 'loading',\n Done: 'done',\n FetchChannels: 'fetchChannels',\n};\n\nconst MainState = {\n RefreshChannels: 'refreshChannels',\n SelectChannel: 'selectChannel',\n LoadMoreChannels: 'loadMoreChannels',\n};\n\nexport interface InboxProps {\n channelFilters?: Record<string, unknown>;\n channelRole?: string;\n supportServices: boolean;\n}\n\n// Create a safer version of useMachine to handle potential errors\nfunction useSafeMachine(machine) {\n // Define the state type\n interface SafeStateType {\n context: {\n channels: any[];\n refreshing: boolean;\n loading: boolean;\n error: string | null;\n searchQuery: string;\n selectedChannelId: string | null;\n channelRole: string | null;\n channelFilters: Record<string, any>;\n supportServices: boolean;\n page: number;\n hasMoreChannels: boolean;\n loadingMore: boolean;\n };\n value: string;\n matches?: (stateValue: string) => boolean;\n }\n\n // Initialize with default state\n const [state, setState] = useState<SafeStateType>({\n context: {\n channels: [],\n refreshing: false,\n loading: false,\n error: null,\n searchQuery: '',\n selectedChannelId: null,\n channelRole: null,\n channelFilters: {},\n supportServices: false,\n page: 1,\n hasMoreChannels: true,\n loadingMore: false,\n },\n value: 'idle',\n });\n\n // Create a safe send function\n const send = useCallback((event) => {\n try {\n // Log event for debugging\n console.log('Event received:', event.type);\n\n // Handle specific events manually\n if (event.type === Actions.INITIAL_CONTEXT) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n channelRole: event.data?.channelRole || null,\n channelFilters: event.data?.channelFilters || {},\n supportServices: event.data?.supportServices || false,\n selectedChannelId: event.data?.selectedChannelId || null,\n loading: true,\n page: 1,\n hasMoreChannels: true,\n },\n value: BaseState.FetchChannels,\n }));\n } else if (event.type === Actions.FETCH_CHANNELS) {\n console.log('Setting channels:', event.data?.channels?.length || 0);\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n channels: event.data?.channels || [],\n hasMoreChannels: (event.data?.channels?.length || 0) > 0,\n loading: event.data?.stopLoading ? false : prev.context.loading,\n refreshing: event.data?.stopLoading ? false : prev.context.refreshing,\n loadingMore: false,\n },\n value: BaseState.Idle,\n }));\n } else if (event.type === Actions.APPEND_CHANNELS) {\n const newChannels = event.data?.channels || [];\n console.log('Appending channels:', newChannels.length);\n\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n channels: [...prev.context.channels, ...newChannels],\n hasMoreChannels: newChannels.length >= 10, // If we got fewer than 10 channels, assume no more are available\n page: prev.context.page + 1,\n loadingMore: false,\n },\n value: BaseState.Idle,\n }));\n } else if (event.type === Actions.REFRESH_CHANNELS) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n refreshing: true,\n page: 1,\n hasMoreChannels: true,\n },\n value: MainState.RefreshChannels,\n }));\n } else if (event.type === Actions.SELECT_CHANNEL) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n selectedChannelId: event.data?.channelId || null,\n },\n }));\n } else if (event.type === Actions.START_LOADING) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n loading: true,\n },\n }));\n } else if (event.type === Actions.STOP_LOADING) {\n console.log('Explicitly stopping loading state');\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n loading: false,\n refreshing: false,\n loadingMore: false,\n },\n value: prev.value === BaseState.FetchChannels ? BaseState.Idle : prev.value,\n }));\n } else if (event.type === Actions.LOAD_MORE_CHANNELS) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n loadingMore: true,\n },\n value: MainState.LoadMoreChannels,\n }));\n } else if (event.type === Actions.SET_SEARCH_QUERY) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n searchQuery: event.data?.searchQuery || '',\n },\n }));\n } else if (event.type === Actions.ERROR_HANDLED) {\n console.log('Error handled:', event.data?.message);\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n error: event.data?.message || null,\n loading: false,\n refreshing: false,\n loadingMore: false,\n },\n value: BaseState.Idle,\n }));\n }\n } catch (error) {\n console.error('Error handling event:', error);\n }\n }, []);\n\n // Add a custom matches function to the state\n const stateWithMatches = useMemo(() => {\n return {\n ...state,\n matches: (checkState) => {\n return state.value === checkState;\n },\n };\n }, [state]);\n\n // Return as a tuple to match useMachine API\n return [stateWithMatches, send] as const;\n}\n\nconst DialogsComponent = (props: InboxProps) => {\n const { channelFilters: channelFilterProp, channelRole, supportServices } = props;\n const channelFilters = { ...channelFilterProp };\n channelFilters.type = channelFilters?.type ?? RoomType.Direct;\n const { params } = useRoute<any>();\n const auth = useSelector(userSelector);\n const navigation = useNavigation<any>();\n\n // Create a ref to track if component is mounted\n const isMountedRef = useRef(true);\n\n // Use our safer custom implementation instead of the problematic useMachine\n const [state, send] = useSafeMachine(dialogsXstate);\n\n // Define safe functions first to avoid \"used before declaration\" errors\n const safeContext = useCallback(() => {\n try {\n return state?.context || {};\n } catch (error) {\n console.error('Error accessing state.context:', error);\n return {};\n }\n }, [state]);\n\n const safeContextProperty = useCallback(\n (property, defaultValue = null) => {\n try {\n return state?.context?.[property] ?? defaultValue;\n } catch (error) {\n console.error(`Error accessing state.context.${property}:`, error);\n return defaultValue;\n }\n },\n [state],\n );\n\n const safeMatches = useCallback(\n (stateValue) => {\n try {\n return state?.matches?.(stateValue) || false;\n } catch (error) {\n console.error(`Error calling state.matches with ${stateValue}:`, error);\n return false;\n }\n },\n [state],\n );\n\n const safeSend = useCallback(\n (event) => {\n try {\n send(event);\n } catch (error) {\n console.error('Error sending event to state machine:', error, event);\n }\n },\n [send],\n );\n\n // Destructure context properties with safe getters\n const channels = safeContextProperty('channels', []);\n const refreshing = safeContextProperty('refreshing', false);\n const loading = safeContextProperty('loading', false);\n const searchQuery = safeContextProperty('searchQuery', '');\n const selectedChannelId = safeContextProperty('selectedChannelId', null);\n const loadingMore = safeContextProperty('loadingMore', false);\n const hasMoreChannels = safeContextProperty('hasMoreChannels', true);\n const page = safeContextProperty('page', 1);\n\n // Use a ref to track the current machine snapshot for safer access\n const stateRef = useRef(state);\n\n // Keep the ref updated with the latest snapshot\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n // Avoid referencing state.context directly in places that might cause undefined errors\n const safeGetContext = useCallback(() => {\n if (stateRef.current && stateRef.current.context) {\n return stateRef.current.context;\n }\n // Return default values if context is undefined\n return {\n channels: [],\n refreshing: false,\n loading: false,\n error: null,\n searchQuery: '',\n selectedChannelId: null,\n channelRole: null,\n channelFilters: {},\n supportServices: false,\n page: 1,\n hasMoreChannels: true,\n loadingMore: false,\n };\n }, []);\n\n // Use cleanup function to prevent setting state after unmount\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // Apollo query for fetching channels\n const { refetch: getChannelsRefetch } = useGetChannelsByUserWithServiceChannelsQuery({\n variables: {\n role: channelRole,\n criteria: channelFilters,\n supportServices: supportServices ? true : false,\n supportServiceCriteria: {\n type: RoomType.Service,\n },\n limit: 15,\n skip: 0,\n },\n fetchPolicy: 'cache-and-network',\n nextFetchPolicy: 'network-only',\n notifyOnNetworkStatusChange: true,\n skip: true, // Skip automatic fetching as we'll control it via the state machine\n });\n\n // Fetch channels implementation\n const fetchChannelsDirectly = useCallback(\n async (pageNum = 1, append = false) => {\n try {\n const context = safeGetContext();\n console.log(`💫 FETCHING channels (page: ${pageNum}, append: ${append})`);\n\n // Calculate skip based on page number (pagination)\n const skipCount = (pageNum - 1) * 15;\n\n // Add timeout to prevent hanging requests\n const fetchPromise = getChannelsRefetch({\n role: channelRole,\n criteria: channelFilters,\n supportServices: supportServices ? true : false,\n supportServiceCriteria: {\n type: RoomType.Service,\n },\n limit: 15,\n skip: skipCount,\n });\n\n // Set a timeout to abort long-running requests\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Request timeout')), 8000),\n );\n\n // Race the fetch against the timeout\n const result = (await Promise.race([fetchPromise, timeoutPromise])) as any;\n const data = result?.data || {};\n\n const allChannels = [...(data?.supportServiceChannels ?? []), ...(data?.channelsByUser ?? [])];\n\n // Optimize filtering by using more efficient approach\n const filteredChannels =\n allChannels?.filter((c) => {\n if (!c || !c.members) return false;\n\n // Early return pattern for better performance\n for (const member of c.members) {\n if (\n member &&\n member.user &&\n member.user.id !== auth?.id &&\n member.user.__typename === 'UserAccount'\n ) {\n return true;\n }\n }\n return false;\n }) ?? [];\n\n // Use more efficient sorting\n const sortedChannels =\n filteredChannels.sort((a, b) => {\n const dateA = new Date(a.updatedAt);\n const dateB = new Date(b.updatedAt);\n return dateB.getTime() - dateA.getTime();\n }) || [];\n\n console.log(`📊 Processed channels: ${sortedChannels.length} (page: ${pageNum}, skip: ${skipCount})`);\n\n if (isMountedRef.current) {\n if (append) {\n safeSend({\n type: Actions.APPEND_CHANNELS,\n data: { channels: sortedChannels },\n });\n } else {\n safeSend({\n type: Actions.FETCH_CHANNELS,\n data: { channels: sortedChannels, stopLoading: true },\n });\n }\n\n // No need for another stop loading call as we included stopLoading: true above\n }\n } catch (error) {\n console.error('Error fetching channels:', error);\n if (isMountedRef.current) {\n safeSend({\n type: Actions.ERROR_HANDLED,\n data: { message: 'Failed to fetch channels' },\n });\n }\n }\n },\n [getChannelsRefetch, channelRole, channelFilters, supportServices, auth?.id, safeSend],\n );\n\n // Optimize safety timeout to use a shorter duration\n useEffect(() => {\n if (loading) {\n const safetyTimeout = setTimeout(() => {\n console.log('⚠️ Safety timeout triggered - forcing loading state to stop');\n if (isMountedRef.current) {\n safeSend({ type: Actions.STOP_LOADING });\n }\n }, 3000); // Reduced from 5000 to 3000 ms\n\n return () => clearTimeout(safetyTimeout);\n }\n }, [loading, safeSend]);\n\n // Add a faster refresh function with smaller dataset and timeout\n const fastRefresh = useCallback(async () => {\n try {\n console.log('🔄 Fast refreshing channels...');\n\n // Set a timeout to ensure refreshing state is cleared if the fetch fails\n const clearRefreshingTimeout = setTimeout(() => {\n if (isMountedRef.current) {\n console.log('⚠️ Fast refresh timeout - stopping refresh state');\n safeSend({ type: Actions.STOP_LOADING });\n }\n }, 3000); // 3 second timeout for refresh\n\n // Perform the fetch with a smaller limit for faster results\n const { data } = await getChannelsRefetch({\n role: channelRole,\n criteria: channelFilters,\n supportServices: supportServices ? true : false,\n supportServiceCriteria: {\n type: RoomType.Service,\n },\n limit: 10,\n skip: 0,\n });\n\n // Cancel the timeout since we got a response\n clearTimeout(clearRefreshingTimeout);\n\n if (!isMountedRef.current) return;\n\n const allChannels = [...(data?.supportServiceChannels ?? []), ...(data?.channelsByUser ?? [])];\n const filteredChannels =\n allChannels?.filter((c) =>\n c.members.some((u) => u !== null && u?.user?.id != auth?.id && u.user.__typename == 'UserAccount'),\n ) ?? [];\n const sortedChannels = (filteredChannels && orderBy(filteredChannels, ['updatedAt'], ['desc'])) || [];\n\n console.log(`📊 Fast refresh completed: ${sortedChannels.length} channels`);\n\n // Update the state with the new channels, but only if still mounted\n if (isMountedRef.current) {\n // Use a single update to prevent UI jumping\n safeSend({\n type: Actions.FETCH_CHANNELS,\n data: {\n channels: sortedChannels,\n stopLoading: true,\n },\n });\n }\n } catch (error) {\n console.error('Error during fast refresh:', error);\n if (isMountedRef.current) {\n safeSend({ type: Actions.STOP_LOADING });\n }\n }\n }, [getChannelsRefetch, channelRole, channelFilters, supportServices, auth?.id, safeSend]);\n\n // Process state changes and execute side effects\n useEffect(() => {\n // Only execute if not already refreshing or loading to prevent loops\n const context = safeGetContext();\n const isAlreadyFetching = context.refreshing || context.loading;\n\n if (!isAlreadyFetching) {\n if (safeMatches(BaseState.FetchChannels)) {\n console.log('🔄 Fetching channels...');\n fetchChannelsDirectly(1, false);\n } else if (safeMatches(MainState.RefreshChannels)) {\n console.log('🔄 Refreshing channels...');\n fetchChannelsDirectly(1, false);\n } else if (safeMatches(MainState.LoadMoreChannels)) {\n console.log('🔄 Loading more channels...');\n fetchChannelsDirectly(page, true);\n }\n } else {\n // Log that we're skipping the fetch due to already being in progress\n console.log('⏩ Skipping fetch because isAlreadyFetching:', isAlreadyFetching);\n }\n }, [fetchChannelsDirectly, safeMatches, safeGetContext, state.value, page]);\n\n // Add a debug log to track state transitions\n useEffect(() => {\n console.log('State changed to:', state.value);\n console.log(\n 'Context:',\n JSON.stringify({\n channelsCount: channels.length,\n loading,\n refreshing,\n }),\n );\n }, [state.value, channels.length, loading, refreshing]);\n\n // Initialize state machine with props on mount\n useEffect(() => {\n if (isMountedRef.current) {\n console.log('🚀 Initializing state machine with props', {\n channelRole,\n channelFilters,\n supportServices,\n selectedChannelId: params?.channelId,\n });\n\n safeSend({\n type: Actions.INITIAL_CONTEXT,\n data: {\n channelRole,\n channelFilters,\n supportServices,\n selectedChannelId: params?.channelId,\n },\n });\n\n // Add a safety measure to ensure loading is stopped even if fetch fails\n const initSafetyTimeout = setTimeout(() => {\n if (isMountedRef.current && loading) {\n console.log('⚠️ Init safety timeout triggered - forcing loading state to stop');\n safeSend({ type: Actions.STOP_LOADING });\n }\n }, 8000); // 8 seconds safety timeout\n\n return () => clearTimeout(initSafetyTimeout);\n }\n }, []);\n\n // Handle refresh on focus (when navigating back to this screen)\n const focusRefreshRef = useRef<number | null>(null);\n\n useFocusEffect(\n useCallback(() => {\n // Use a flag to ensure we only trigger refresh once per focus\n let hasTriggeredRefresh = false;\n\n // Reset the focus refresh tracking when component gets focus\n const now = Date.now();\n const lastRefresh = focusRefreshRef.current;\n\n // Only refresh if at least 2 seconds have passed since last refresh\n const shouldRefresh = lastRefresh === null || now - lastRefresh > 2000;\n\n // Only refresh if component is mounted and not in initial state,\n // and not already refreshing/loading\n const context = safeGetContext();\n const isAlreadyFetching = context.refreshing || context.loading;\n\n if (\n isMountedRef.current &&\n !hasTriggeredRefresh &&\n !isAlreadyFetching &&\n shouldRefresh &&\n (channels.length > 0 || safeMatches(BaseState.Idle))\n ) {\n hasTriggeredRefresh = true;\n focusRefreshRef.current = now;\n\n // Use fast refresh for better performance\n console.log('🔄 Focus effect: triggering fast refresh');\n safeSend({\n type: Actions.START_LOADING,\n data: { refreshing: true },\n });\n\n // Execute fast refresh with a short delay to prevent UI jank\n setTimeout(() => {\n if (isMountedRef.current) {\n fastRefresh();\n }\n }, 100);\n } else {\n console.log('⏩ Skipping focus refresh:', {\n isAlreadyFetching,\n hasTriggeredRefresh,\n shouldRefresh,\n timeGap: lastRefresh === null ? 'first refresh' : now - lastRefresh,\n });\n }\n\n return () => {\n // Reset flag when focus is lost\n hasTriggeredRefresh = false;\n };\n }, [safeSend, channels.length, safeMatches, safeGetContext, fastRefresh]),\n );\n\n // Navigation handlers\n const handleSelectChannel = useCallback(\n (id, title) => {\n // Always update the selected channel ID, even if it's the same channel\n safeSend({ type: Actions.SELECT_CHANNEL, data: { channelId: id } });\n\n // Force navigation to the channel screen, even if it's already selected\n // This ensures we can reopen the same channel multiple times\n navigation.navigate(config.INBOX_MESSEGE_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n hideTabBar: true,\n timestamp: new Date().getTime(), // Add timestamp to force a refresh when navigating to the same screen\n });\n },\n [navigation, channelRole, safeSend],\n );\n\n const handleSelectServiceChannel = useCallback(\n (id, title, postParentId) => {\n safeSend({ type: Actions.SELECT_CHANNEL, data: { channelId: id } });\n navigation.navigate(postParentId || postParentId === 0 ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n postParentId: postParentId,\n hideTabBar: true,\n });\n },\n [navigation, channelRole, safeSend],\n );\n\n // Modified pull-to-refresh handler to use fast refresh\n const handlePullToRefresh = useCallback(() => {\n if (refreshing) {\n console.log('⏩ Skipping refresh because already refreshing');\n return;\n }\n\n // Update the last refresh timestamp to prevent simultaneous focus refresh\n const now = Date.now();\n focusRefreshRef.current = now;\n\n console.log('🔄 Pull-to-refresh triggered');\n safeSend({\n type: Actions.START_LOADING,\n data: { refreshing: true },\n });\n\n // Use the fast refresh approach for pull-to-refresh\n fastRefresh();\n }, [safeSend, refreshing, fastRefresh]);\n\n // Search handler\n const handleSearchChange = useCallback(\n (text: string) => {\n safeSend({\n type: Actions.SET_SEARCH_QUERY,\n data: { searchQuery: text },\n });\n },\n [safeSend],\n );\n\n // Add loadMore handler with debounce to prevent multiple calls\n const handleLoadMore = useCallback(() => {\n if (!loadingMore && hasMoreChannels) {\n console.log('Loading more channels at page:', page + 1);\n safeSend({ type: Actions.LOAD_MORE_CHANNELS });\n } else {\n console.log('Skip loading more: loadingMore=', loadingMore, 'hasMoreChannels=', hasMoreChannels);\n }\n }, [safeSend, loadingMore, hasMoreChannels, page]);\n\n return (\n <Box className=\"p-2\">\n <FlatList\n data={channels}\n onRefresh={handlePullToRefresh}\n refreshing={refreshing}\n contentContainerStyle={{ minHeight: '100%' }}\n ItemSeparatorComponent={() => <Box className=\"h-0.5 bg-gray-200\" />}\n renderItem={({ item: channel }) => {\n // Use memoized key for better list performance\n const key = `${channel.type === RoomType.Service ? 'service' : 'direct'}-${channel.id}`;\n\n return channel?.type === RoomType.Service ? (\n <ServiceDialogsListItem\n key={key}\n onOpen={handleSelectServiceChannel}\n currentUser={auth}\n channel={channel}\n refreshing={refreshing}\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={false} // Change to false to avoid unnecessary refreshes\n />\n );\n }}\n ListFooterComponent={() =>\n loadingMore ? (\n <Center className=\"py-4\">\n <Spinner color={colors.blue[500]} size=\"small\" />\n </Center>\n ) : null\n }\n onEndReached={handleLoadMore}\n onEndReachedThreshold={0.5} // Increased from 0.3 for earlier loading\n initialNumToRender={5} // Reduced from 10 for faster initial render\n maxToRenderPerBatch={5} // Reduced from 10 for smoother rendering\n windowSize={5} // Reduced from 10 to maintain fewer items in memory\n removeClippedSubviews={true}\n updateCellsBatchingPeriod={100} // Increased from 50 to batch updates better\n getItemLayout={(data, index) =>\n // Pre-calculate item dimensions for more efficient rendering\n ({ length: 80, offset: 80 * index, index })\n }\n keyExtractor={(item) => `channel-${item.id}`}\n ListEmptyComponent={() => {\n console.log('Rendering ListEmptyComponent', { loading, refreshing, stateValue: state.value });\n\n // Only show spinner during initial loading\n if (loading && channels.length === 0) {\n return (\n <Center className=\"flex-1 justify-center items-center\" style={{ height: 300 }}>\n <Spinner color={colors.blue[500]} size=\"large\" />\n <Text className=\"mt-4 text-gray-500\">Loading conversations...</Text>\n </Center>\n );\n }\n\n // Show empty state when no channels and not loading\n return (\n <Box className=\"p-6\">\n <Box className=\"mb-6\">\n <Heading className=\"text-2xl font-bold\">Direct Messages</Heading>\n <Text className=\"text-gray-600 mt-1\">Private conversations with other users</Text>\n </Box>\n\n <Input\n className=\"mb-8 h-[50] rounded-md border-gray-300 border\"\n size=\"md\"\n style={{\n paddingVertical: 8,\n marginBottom: 10,\n borderColor: '#d1d5db',\n borderRadius: 10,\n }}\n >\n <InputField\n placeholder=\"Search messages...\"\n onChangeText={handleSearchChange}\n value={searchQuery}\n />\n </Input>\n\n <Center className=\"items-center\" style={{ paddingVertical: 5 }}>\n <Box className=\"w-16 h-16 rounded-full bg-blue-500 flex items-center justify-center mb-5\">\n <Ionicons name=\"chatbubble-ellipses\" size={30} color=\"white\" />\n </Box>\n\n <Text className=\"text-2xl font-bold text-center mb-2\">No messages yet</Text>\n\n <Text className=\"text-gray-600 text-center mb-8\">\n When you start conversations with others,{'\\n'}\n they'll appear here.\n </Text>\n </Center>\n </Box>\n );\n }}\n />\n </Box>\n );\n};\n\nexport const Dialogs = React.memo(DialogsComponent);\n"],"names":["_a","_b","_c","_d","React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dialogs.js","sources":["../../../../src/screens/inbox/containers/Dialogs.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { FlatList, Box, Heading, Input, InputField, Text, Center, Spinner } from '@admin-layout/gluestack-ui-mobile';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useSelector } from 'react-redux';\nimport { useNavigation, useRoute, useFocusEffect } from '@react-navigation/native';\nimport { orderBy } from 'lodash-es';\nimport { DialogsListItem } from '../components/DialogsListItem';\nimport { ServiceDialogsListItem } from '../components/ServiceDialogsListItem';\nimport { useGetChannelsByUserWithServiceChannelsQuery, OnChatMessageAddedDocument } from 'common/graphql';\nimport { RoomType } from 'common';\nimport { userSelector } from '@adminide-stack/user-auth0-client';\nimport { config } from '../config';\nimport colors from 'tailwindcss/colors';\nimport { dialogsXstate } from './workflow/dialogs-xstate';\n\n// Define custom actions and states for our component\nconst Actions = {\n INITIAL_CONTEXT: 'INITIAL_CONTEXT',\n ERROR_HANDLED: 'ERROR_HANDLED',\n FETCH_CHANNELS: 'FETCH_CHANNELS',\n APPEND_CHANNELS: 'APPEND_CHANNELS',\n REFRESH_CHANNELS: 'REFRESH_CHANNELS',\n SELECT_CHANNEL: 'SELECT_CHANNEL',\n START_LOADING: 'START_LOADING',\n STOP_LOADING: 'STOP_LOADING',\n LOAD_MORE_CHANNELS: 'LOAD_MORE_CHANNELS',\n SET_SEARCH_QUERY: 'SET_SEARCH_QUERY',\n UPDATE_CHANNEL: 'UPDATE_CHANNEL',\n REORDER_CHANNELS: 'REORDER_CHANNELS',\n};\n\nconst BaseState = {\n Idle: 'idle',\n Error: 'error',\n Loading: 'loading',\n Done: 'done',\n FetchChannels: 'fetchChannels',\n};\n\nconst MainState = {\n RefreshChannels: 'refreshChannels',\n SelectChannel: 'selectChannel',\n LoadMoreChannels: 'loadMoreChannels',\n};\n\nexport interface InboxProps {\n channelFilters?: Record<string, unknown>;\n channelRole?: string;\n supportServices: boolean;\n}\n\n// Create a safer version of useMachine to handle potential errors\nfunction useSafeMachine(machine) {\n // Define the state type\n interface SafeStateType {\n context: {\n channels: any[];\n refreshing: boolean;\n loading: boolean;\n error: string | null;\n searchQuery: string;\n selectedChannelId: string | null;\n channelRole: string | null;\n channelFilters: Record<string, any>;\n supportServices: boolean;\n page: number;\n hasMoreChannels: boolean;\n loadingMore: boolean;\n };\n value: string;\n matches?: (stateValue: string) => boolean;\n }\n\n // Initialize with default state\n const [state, setState] = useState<SafeStateType>({\n context: {\n channels: [],\n refreshing: false,\n loading: false,\n error: null,\n searchQuery: '',\n selectedChannelId: null,\n channelRole: null,\n channelFilters: {},\n supportServices: false,\n page: 1,\n hasMoreChannels: true,\n loadingMore: false,\n },\n value: 'idle',\n });\n\n // Create a safe send function\n const send = useCallback((event) => {\n try {\n // Log event for debugging\n console.log('Event received:', event.type);\n\n // Handle specific events manually\n if (event.type === Actions.INITIAL_CONTEXT) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n channelRole: event.data?.channelRole || null,\n channelFilters: event.data?.channelFilters || {},\n supportServices: event.data?.supportServices || false,\n selectedChannelId: event.data?.selectedChannelId || null,\n loading: true,\n page: 1,\n hasMoreChannels: true,\n },\n value: BaseState.FetchChannels,\n }));\n } else if (event.type === Actions.FETCH_CHANNELS) {\n console.log('Setting channels:', event.data?.channels?.length || 0);\n\n // Process channels to ensure lastMessage property is properly structured for child components\n const processedChannels =\n event.data?.channels?.map((channel) => {\n // If channel has a lastMessage, ensure it's properly formatted\n if (channel.lastMessage) {\n return {\n ...channel,\n lastMessage: {\n ...channel.lastMessage,\n // Ensure these essential properties exist\n id: channel.lastMessage.id,\n message: channel.lastMessage.message,\n createdAt: channel.lastMessage.createdAt || channel.lastMessage.updatedAt,\n updatedAt: channel.lastMessage.updatedAt || channel.lastMessage.createdAt,\n userId: channel.lastMessage.userId,\n channelId: channel.lastMessage.channelId || channel.id,\n },\n };\n }\n return channel;\n }) || [];\n\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n channels: processedChannels,\n hasMoreChannels: (event.data?.channels?.length || 0) > 0,\n loading: event.data?.stopLoading ? false : prev.context.loading,\n refreshing: event.data?.stopLoading ? false : prev.context.refreshing,\n loadingMore: false,\n },\n value: BaseState.Idle,\n }));\n } else if (event.type === Actions.APPEND_CHANNELS) {\n const newChannels = event.data?.channels || [];\n console.log('Appending channels:', newChannels.length);\n\n // Process new channels to ensure lastMessage property is properly structured\n const processedNewChannels = newChannels.map((channel) => {\n // If channel has a lastMessage, ensure it's properly formatted\n if (channel.lastMessage) {\n return {\n ...channel,\n lastMessage: {\n ...channel.lastMessage,\n // Ensure these essential properties exist\n id: channel.lastMessage.id,\n message: channel.lastMessage.message,\n createdAt: channel.lastMessage.createdAt || channel.lastMessage.updatedAt,\n updatedAt: channel.lastMessage.updatedAt || channel.lastMessage.createdAt,\n userId: channel.lastMessage.userId,\n channelId: channel.lastMessage.channelId || channel.id,\n },\n };\n }\n return channel;\n });\n\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n channels: [...prev.context.channels, ...processedNewChannels],\n hasMoreChannels: newChannels.length >= 10, // If we got fewer than 10 channels, assume no more are available\n page: prev.context.page + 1,\n loadingMore: false,\n },\n value: BaseState.Idle,\n }));\n } else if (event.type === Actions.UPDATE_CHANNEL) {\n // Handle channel update from subscription\n setState((prev) => {\n const updatedChannel = event.data?.channel;\n if (!updatedChannel || !updatedChannel.id) return prev;\n\n // Find and update specific channel\n const updatedChannels = prev.context.channels.map((channel) =>\n channel.id === updatedChannel.id ? updatedChannel : channel,\n );\n\n return {\n ...prev,\n context: {\n ...prev.context,\n channels: updatedChannels,\n },\n };\n });\n } else if (event.type === Actions.REORDER_CHANNELS) {\n // Re-sort channels by updateAt timestamp to move newly updated ones to top\n setState((prev) => {\n const sortedChannels = [...prev.context.channels].sort((a, b) => {\n const dateA = new Date(a?.updatedAt || a?.createdAt).getTime();\n const dateB = new Date(b?.updatedAt || b?.createdAt).getTime();\n return dateB - dateA; // Newest first\n });\n\n return {\n ...prev,\n context: {\n ...prev.context,\n channels: sortedChannels,\n },\n };\n });\n } else if (event.type === Actions.REFRESH_CHANNELS) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n refreshing: true,\n page: 1,\n hasMoreChannels: true,\n },\n value: MainState.RefreshChannels,\n }));\n } else if (event.type === Actions.SELECT_CHANNEL) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n selectedChannelId: event.data?.channelId || null,\n },\n }));\n } else if (event.type === Actions.START_LOADING) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n loading: true,\n },\n }));\n } else if (event.type === Actions.STOP_LOADING) {\n console.log('Explicitly stopping loading state');\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n loading: false,\n refreshing: false,\n loadingMore: false,\n },\n value: prev.value === BaseState.FetchChannels ? BaseState.Idle : prev.value,\n }));\n } else if (event.type === Actions.LOAD_MORE_CHANNELS) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n loadingMore: true,\n },\n value: MainState.LoadMoreChannels,\n }));\n } else if (event.type === Actions.SET_SEARCH_QUERY) {\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n searchQuery: event.data?.searchQuery || '',\n },\n }));\n } else if (event.type === Actions.ERROR_HANDLED) {\n console.log('Error handled:', event.data?.message);\n setState((prev) => ({\n ...prev,\n context: {\n ...prev.context,\n error: event.data?.message || null,\n loading: false,\n refreshing: false,\n loadingMore: false,\n },\n value: BaseState.Idle,\n }));\n }\n } catch (error) {\n console.error('Error handling event:', error);\n }\n }, []);\n\n // Add a custom matches function to the state\n const stateWithMatches = useMemo(() => {\n return {\n ...state,\n matches: (checkState) => {\n return state.value === checkState;\n },\n };\n }, [state]);\n\n // Return as a tuple to match useMachine API\n return [stateWithMatches, send] as const;\n}\n\nconst DialogsComponent = (props: InboxProps) => {\n const { channelFilters: channelFilterProp, channelRole, supportServices } = props;\n const channelFilters = { ...channelFilterProp };\n channelFilters.type = channelFilters?.type ?? RoomType.Direct;\n const { params } = useRoute<any>();\n const auth = useSelector(userSelector);\n const navigation = useNavigation<any>();\n\n // Create a ref to track if component is mounted\n const isMountedRef = useRef(true);\n\n // Use our safer custom implementation instead of the problematic useMachine\n const [state, send] = useSafeMachine(dialogsXstate);\n\n // Define safe functions first to avoid \"used before declaration\" errors\n const safeContext = useCallback(() => {\n try {\n return state?.context || {};\n } catch (error) {\n console.error('Error accessing state.context:', error);\n return {};\n }\n }, [state]);\n\n const safeContextProperty = useCallback(\n (property, defaultValue = null) => {\n try {\n return state?.context?.[property] ?? defaultValue;\n } catch (error) {\n console.error(`Error accessing state.context.${property}:`, error);\n return defaultValue;\n }\n },\n [state],\n );\n\n const safeMatches = useCallback(\n (stateValue) => {\n try {\n return state?.matches?.(stateValue) || false;\n } catch (error) {\n console.error(`Error calling state.matches with ${stateValue}:`, error);\n return false;\n }\n },\n [state],\n );\n\n const safeSend = useCallback(\n (event) => {\n try {\n send(event);\n } catch (error) {\n console.error('Error sending event to state machine:', error, event);\n }\n },\n [send],\n );\n\n // Destructure context properties with safe getters\n const channels = safeContextProperty('channels', []);\n const refreshing = safeContextProperty('refreshing', false);\n const loading = safeContextProperty('loading', false);\n const searchQuery = safeContextProperty('searchQuery', '');\n const selectedChannelId = safeContextProperty('selectedChannelId', null);\n const loadingMore = safeContextProperty('loadingMore', false);\n const hasMoreChannels = safeContextProperty('hasMoreChannels', true);\n const page = safeContextProperty('page', 1);\n\n // Use a ref to track the current machine snapshot for safer access\n const stateRef = useRef(state);\n\n // Keep the ref updated with the latest snapshot\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n // Avoid referencing state.context directly in places that might cause undefined errors\n const safeGetContext = useCallback(() => {\n if (stateRef.current && stateRef.current.context) {\n return stateRef.current.context;\n }\n // Return default values if context is undefined\n return {\n channels: [],\n refreshing: false,\n loading: false,\n error: null,\n searchQuery: '',\n selectedChannelId: null,\n channelRole: null,\n channelFilters: {},\n supportServices: false,\n page: 1,\n hasMoreChannels: true,\n loadingMore: false,\n };\n }, []);\n\n // Use cleanup function to prevent setting state after unmount\n useEffect(() => {\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n // Apollo query for fetching channels\n const { refetch: getChannelsRefetch, subscribeToMore } = useGetChannelsByUserWithServiceChannelsQuery({\n variables: {\n role: channelRole,\n criteria: channelFilters,\n supportServices: supportServices ? true : false,\n supportServiceCriteria: {\n type: RoomType.Service,\n },\n limit: 15,\n skip: 0,\n },\n fetchPolicy: 'cache-and-network',\n nextFetchPolicy: 'network-only',\n notifyOnNetworkStatusChange: true,\n skip: true, // Skip automatic fetching as we'll control it via the state machine\n });\n\n // Fetch channels implementation\n const fetchChannelsDirectly = useCallback(\n async (pageNum = 1, append = false) => {\n try {\n const context = safeGetContext();\n console.log(`💫 FETCHING channels (page: ${pageNum}, append: ${append})`);\n\n // Calculate skip based on page number (pagination)\n const skipCount = (pageNum - 1) * 15;\n\n // Add timeout to prevent hanging requests\n const fetchPromise = getChannelsRefetch({\n role: channelRole,\n criteria: channelFilters,\n supportServices: supportServices ? true : false,\n supportServiceCriteria: {\n type: RoomType.Service,\n },\n limit: 15,\n skip: skipCount,\n });\n\n // Set a timeout to abort long-running requests\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Request timeout')), 8000),\n );\n\n // Race the fetch against the timeout\n const result = (await Promise.race([fetchPromise, timeoutPromise])) as any;\n const data = result?.data || {};\n\n const allChannels = [...(data?.supportServiceChannels ?? []), ...(data?.channelsByUser ?? [])];\n\n // Optimize filtering by using more efficient approach\n const filteredChannels =\n allChannels?.filter((c) => {\n if (!c || !c.members) return false;\n\n // Early return pattern for better performance\n for (const member of c.members) {\n if (\n member &&\n member.user &&\n member.user.id !== auth?.id &&\n member.user.__typename === 'UserAccount'\n ) {\n return true;\n }\n }\n return false;\n }) ?? [];\n\n // Use more efficient sorting\n const sortedChannels =\n filteredChannels.sort((a, b) => {\n const dateA = new Date(a.updatedAt || a.createdAt);\n const dateB = new Date(b.updatedAt || b.createdAt);\n return dateB.getTime() - dateA.getTime();\n }) || [];\n\n console.log(`📊 Processed channels: ${sortedChannels.length} (page: ${pageNum}, skip: ${skipCount})`);\n\n if (isMountedRef.current) {\n if (append) {\n safeSend({\n type: Actions.APPEND_CHANNELS,\n data: { channels: sortedChannels },\n });\n } else {\n // Use a single update to prevent UI jumping\n safeSend({\n type: Actions.FETCH_CHANNELS,\n data: {\n channels: sortedChannels,\n stopLoading: true,\n },\n });\n }\n\n // No need for another stop loading call as we included stopLoading: true above\n }\n } catch (error) {\n console.error('Error fetching channels:', error);\n if (isMountedRef.current) {\n safeSend({\n type: Actions.ERROR_HANDLED,\n data: { message: 'Failed to fetch channels' },\n });\n }\n }\n },\n [getChannelsRefetch, channelRole, channelFilters, supportServices, auth?.id, safeSend],\n );\n\n // Optimize safety timeout to use a shorter duration\n useEffect(() => {\n if (loading) {\n const safetyTimeout = setTimeout(() => {\n console.log('⚠️ Safety timeout triggered - forcing loading state to stop');\n if (isMountedRef.current) {\n safeSend({ type: Actions.STOP_LOADING });\n }\n }, 3000); // Reduced from 5000 to 3000 ms\n\n return () => clearTimeout(safetyTimeout);\n }\n }, [loading, safeSend]);\n\n // Add a faster refresh function with smaller dataset and timeout\n const fastRefresh = useCallback(async () => {\n try {\n console.log('🔄 Fast refreshing channels...');\n\n // Set a timeout to ensure refreshing state is cleared if the fetch fails\n const clearRefreshingTimeout = setTimeout(() => {\n if (isMountedRef.current) {\n console.log('⚠️ Fast refresh timeout - stopping refresh state');\n safeSend({ type: Actions.STOP_LOADING });\n }\n }, 3000); // 3 second timeout for refresh\n\n // Perform the fetch with a smaller limit for faster results\n const { data } = await getChannelsRefetch({\n role: channelRole,\n criteria: channelFilters,\n supportServices: supportServices ? true : false,\n supportServiceCriteria: {\n type: RoomType.Service,\n },\n limit: 10,\n skip: 0,\n });\n\n // Cancel the timeout since we got a response\n clearTimeout(clearRefreshingTimeout);\n\n if (!isMountedRef.current) return;\n\n const allChannels = [...(data?.supportServiceChannels ?? []), ...(data?.channelsByUser ?? [])];\n const filteredChannels =\n allChannels?.filter((c) =>\n c.members.some((u) => u !== null && u?.user?.id != auth?.id && u.user.__typename == 'UserAccount'),\n ) ?? [];\n const sortedChannels = (filteredChannels && orderBy(filteredChannels, ['updatedAt'], ['desc'])) || [];\n\n console.log(`📊 Fast refresh completed: ${sortedChannels.length} channels`);\n\n // Use a single update to prevent UI jumping\n if (isMountedRef.current) {\n // Use a single update to prevent UI jumping\n safeSend({\n type: Actions.FETCH_CHANNELS,\n data: {\n channels: sortedChannels,\n stopLoading: true,\n },\n });\n }\n } catch (error) {\n console.error('Error during fast refresh:', error);\n if (isMountedRef.current) {\n safeSend({ type: Actions.STOP_LOADING });\n }\n }\n }, [getChannelsRefetch, channelRole, channelFilters, supportServices, auth?.id, safeSend]);\n\n // Subscription ref to track and reuse the subscription\n const messageSubscriptionRef = useRef(null);\n\n // Set up message subscription for real-time updates\n useEffect(() => {\n if (!auth || !auth.id || messageSubscriptionRef.current) return; // Skip if already subscribed or no auth\n\n console.log('📱 Setting up global message subscription for dialog updates');\n\n // Set up subscription for message updates\n const unsubscribe = subscribeToMore({\n document: OnChatMessageAddedDocument,\n variables: {}, // No specific channel ID - we'll filter in the updateQuery\n updateQuery: (prev, { subscriptionData }) => {\n try {\n if (!subscriptionData.data || !isMountedRef.current) return prev;\n\n // Access chatMessageAdded from the subscription data\n // Cast to any to avoid TypeScript errors with dynamic subscription data\n const subData = subscriptionData.data as any;\n const newMessage = subData.chatMessageAdded;\n\n console.log('📱 Dialog subscription received message update:', newMessage?.id);\n\n // Skip if no message or no channelId\n if (!newMessage || !newMessage.channelId) return prev;\n\n // Get the current channels from state context rather than closure\n const currentChannels = safeGetContext().channels || [];\n\n // Find the channel that needs to be updated\n const channelToUpdate = currentChannels.find(\n (c) => c.id?.toString() === newMessage.channelId?.toString(),\n );\n\n if (channelToUpdate) {\n console.log('📱 Found channel to update:', channelToUpdate.id);\n\n // Create a more complete updated channel object with the new message\n const updatedChannel = {\n ...channelToUpdate,\n updatedAt: newMessage.createdAt || newMessage.updatedAt,\n lastMessage: {\n ...newMessage,\n // Ensure these properties are present for rendering in child components\n id: newMessage.id,\n message: newMessage.message,\n createdAt: newMessage.createdAt || newMessage.updatedAt,\n updatedAt: newMessage.updatedAt || newMessage.createdAt,\n userId: newMessage.userId,\n channelId: newMessage.channelId,\n },\n };\n\n // Update the channel with new message immediately\n if (isMountedRef.current) {\n // Update the channel\n safeSend({\n type: Actions.UPDATE_CHANNEL,\n data: {\n channel: updatedChannel,\n },\n });\n\n // Reorder channels to bring updated one to top\n safeSend({\n type: Actions.REORDER_CHANNELS,\n });\n }\n } else {\n console.log('📱 Channel not found in current list, triggering refresh');\n // If we received a message for a channel that's not in our current list\n // trigger a refresh to get the updated channel list\n if (isMountedRef.current && !safeGetContext().refreshing && !safeGetContext().loading) {\n fastRefresh();\n }\n }\n\n // Return unchanged prev (we're updating via state machine instead)\n return prev;\n } catch (error) {\n console.error('Error in dialog subscription handler:', error);\n return prev;\n }\n },\n });\n\n // Save subscription in ref for reuse\n messageSubscriptionRef.current = unsubscribe;\n\n // Clean up subscription when component unmounts\n return () => {\n if (messageSubscriptionRef.current) {\n console.log('📱 Cleaning up dialog message subscription');\n messageSubscriptionRef.current();\n messageSubscriptionRef.current = null;\n }\n };\n }, [auth?.id, isMountedRef, safeGetContext, fastRefresh, safeSend, subscribeToMore]);\n\n // Process state changes and execute side effects\n useEffect(() => {\n // Only execute if not already refreshing or loading to prevent loops\n const context = safeGetContext();\n const isAlreadyFetching = context.refreshing || context.loading;\n\n if (!isAlreadyFetching) {\n if (safeMatches(BaseState.FetchChannels)) {\n console.log('🔄 Fetching channels...');\n fetchChannelsDirectly(1, false);\n } else if (safeMatches(MainState.RefreshChannels)) {\n console.log('🔄 Refreshing channels...');\n fetchChannelsDirectly(1, false);\n } else if (safeMatches(MainState.LoadMoreChannels)) {\n console.log('🔄 Loading more channels...');\n fetchChannelsDirectly(page, true);\n }\n } else {\n // Log that we're skipping the fetch due to already being in progress\n console.log('⏩ Skipping fetch because isAlreadyFetching:', isAlreadyFetching);\n }\n }, [fetchChannelsDirectly, safeMatches, safeGetContext, state.value, page]);\n\n // Add a debug log to track state transitions\n useEffect(() => {\n console.log('State changed to:', state.value);\n console.log(\n 'Context:',\n JSON.stringify({\n channelsCount: channels.length,\n loading,\n refreshing,\n }),\n );\n }, [state.value, channels.length, loading, refreshing]);\n\n // Initialize state machine with props on mount\n useEffect(() => {\n if (isMountedRef.current) {\n console.log('🚀 Initializing state machine with props', {\n channelRole,\n channelFilters,\n supportServices,\n selectedChannelId: params?.channelId,\n });\n\n safeSend({\n type: Actions.INITIAL_CONTEXT,\n data: {\n channelRole,\n channelFilters,\n supportServices,\n selectedChannelId: params?.channelId,\n },\n });\n\n // Add a safety measure to ensure loading is stopped even if fetch fails\n const initSafetyTimeout = setTimeout(() => {\n if (isMountedRef.current && loading) {\n console.log('⚠️ Init safety timeout triggered - forcing loading state to stop');\n safeSend({ type: Actions.STOP_LOADING });\n }\n }, 8000); // 8 seconds safety timeout\n\n return () => clearTimeout(initSafetyTimeout);\n }\n }, []);\n\n // Handle refresh on focus (when navigating back to this screen)\n const focusRefreshRef = useRef<number | null>(null);\n // Add a timestamp ref to track last refresh time\n const lastRefreshTimeRef = useRef(Date.now());\n // Minimum interval between refreshes (2 seconds)\n const MIN_REFRESH_INTERVAL = 2000;\n\n useFocusEffect(\n useCallback(() => {\n console.log('📱 Focus effect triggered for Dialogs screen');\n\n // Always do a lightweight refresh on focus for the latest messages\n // This ensures we always have up-to-date message status when returning to the screen\n const performRefresh = () => {\n // Check if enough time has passed since last refresh\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 forced refresh on screen focus');\n if (isMountedRef.current) {\n // Update last refresh timestamp\n lastRefreshTimeRef.current = now;\n\n safeSend({\n type: Actions.START_LOADING,\n data: { refreshing: true },\n });\n fastRefresh();\n }\n };\n\n // Always refresh when returning to the screen, with a small delay\n const focusRefreshTimeout = setTimeout(performRefresh, 100);\n\n // Cleanup function to remove the timeout if the component unmounts or loses focus\n return () => {\n clearTimeout(focusRefreshTimeout);\n };\n }, [safeSend, fastRefresh]),\n );\n\n // Navigation handlers\n const handleSelectChannel = useCallback(\n (id, title) => {\n // Always update the selected channel ID, even if it's the same channel\n safeSend({ type: Actions.SELECT_CHANNEL, data: { channelId: id } });\n\n // Force navigation to the channel screen, even if it's already selected\n // This ensures we can reopen the same channel multiple times\n navigation.navigate(config.INBOX_MESSEGE_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n hideTabBar: true,\n timestamp: new Date().getTime(), // Add timestamp to force a refresh when navigating to the same screen\n });\n },\n [navigation, channelRole, safeSend],\n );\n\n const handleSelectServiceChannel = useCallback(\n (id, title, postParentId) => {\n safeSend({ type: Actions.SELECT_CHANNEL, data: { channelId: id } });\n navigation.navigate(postParentId || postParentId === 0 ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH, {\n channelId: id,\n role: channelRole,\n title: title,\n postParentId: postParentId,\n hideTabBar: true,\n });\n },\n [navigation, channelRole, safeSend],\n );\n\n // Modified pull-to-refresh handler to use fast refresh\n const handlePullToRefresh = useCallback(() => {\n if (refreshing) {\n console.log('⏩ Skipping refresh because already refreshing');\n return;\n }\n\n // Update the last refresh timestamp to prevent simultaneous focus refresh\n const now = Date.now();\n focusRefreshRef.current = now;\n\n console.log('🔄 Pull-to-refresh triggered');\n safeSend({\n type: Actions.START_LOADING,\n data: { refreshing: true },\n });\n\n // Use the fast refresh approach for pull-to-refresh\n fastRefresh();\n }, [safeSend, refreshing, fastRefresh]);\n\n // Search handler\n const handleSearchChange = useCallback(\n (text: string) => {\n safeSend({\n type: Actions.SET_SEARCH_QUERY,\n data: { searchQuery: text },\n });\n },\n [safeSend],\n );\n\n // Add loadMore handler with debounce to prevent multiple calls\n const handleLoadMore = useCallback(() => {\n if (!loadingMore && hasMoreChannels) {\n console.log('Loading more channels at page:', page + 1);\n safeSend({ type: Actions.LOAD_MORE_CHANNELS });\n } else {\n console.log('Skip loading more: loadingMore=', loadingMore, 'hasMoreChannels=', hasMoreChannels);\n }\n }, [safeSend, loadingMore, hasMoreChannels, page]);\n\n return (\n <Box className=\"p-2\">\n <FlatList\n data={channels}\n onRefresh={handlePullToRefresh}\n refreshing={refreshing}\n contentContainerStyle={{ minHeight: '100%' }}\n ItemSeparatorComponent={() => <Box className=\"h-0.5 bg-gray-200\" />}\n renderItem={({ item: channel }) => {\n // Use memoized key for better list performance\n const key = `${channel.type === RoomType.Service ? 'service' : 'direct'}-${channel.id}`;\n\n return channel?.type === RoomType.Service ? (\n <ServiceDialogsListItem\n key={key}\n onOpen={handleSelectServiceChannel}\n currentUser={auth}\n channel={channel}\n refreshing={refreshing}\n selectedChannelId={selectedChannelId}\n role={channelRole}\n />\n ) : (\n <DialogsListItem\n key={key}\n onOpen={handleSelectChannel}\n currentUser={auth}\n channel={channel}\n selectedChannelId={selectedChannelId}\n forceRefresh={true}\n />\n );\n }}\n ListFooterComponent={() =>\n loadingMore ? (\n <Center className=\"py-4\">\n <Spinner color={colors.blue[500]} size=\"small\" />\n </Center>\n ) : null\n }\n onEndReached={handleLoadMore}\n onEndReachedThreshold={0.5} // Increased from 0.3 for earlier loading\n initialNumToRender={5} // Reduced from 10 for faster initial render\n maxToRenderPerBatch={5} // Reduced from 10 for smoother rendering\n windowSize={5} // Reduced from 10 to maintain fewer items in memory\n removeClippedSubviews={true}\n updateCellsBatchingPeriod={100} // Increased from 50 to batch updates better\n getItemLayout={(data, index) =>\n // Pre-calculate item dimensions for more efficient rendering\n ({ length: 80, offset: 80 * index, index })\n }\n keyExtractor={(item) => `channel-${item.id}`}\n ListEmptyComponent={() => {\n console.log('Rendering ListEmptyComponent', { loading, refreshing, stateValue: state.value });\n\n // Only show spinner during initial loading\n if (loading && channels.length === 0) {\n return (\n <Center className=\"flex-1 justify-center items-center\" style={{ height: 300 }}>\n <Spinner color={colors.blue[500]} size=\"large\" />\n <Text className=\"mt-4 text-gray-500\">Loading conversations...</Text>\n </Center>\n );\n }\n\n // Show empty state when no channels and not loading\n return (\n <Box className=\"p-6\">\n <Box className=\"mb-6\">\n <Heading className=\"text-2xl font-bold\">Direct Messages</Heading>\n <Text className=\"text-gray-600 mt-1\">Private conversations with other users</Text>\n </Box>\n\n <Input\n className=\"mb-8 h-[50] rounded-md border-gray-300 border\"\n size=\"md\"\n style={{\n paddingVertical: 8,\n marginBottom: 10,\n borderColor: '#d1d5db',\n borderRadius: 10,\n }}\n >\n <InputField\n placeholder=\"Search messages...\"\n onChangeText={handleSearchChange}\n value={searchQuery}\n />\n </Input>\n\n <Center className=\"items-center\" style={{ paddingVertical: 5 }}>\n <Box className=\"w-16 h-16 rounded-full bg-blue-500 flex items-center justify-center mb-5\">\n <Ionicons name=\"chatbubble-ellipses\" size={30} color=\"white\" />\n </Box>\n\n <Text className=\"text-2xl font-bold text-center mb-2\">No messages yet</Text>\n\n <Text className=\"text-gray-600 text-center mb-8\">\n When you start conversations with others,{'\\n'}\n they'll appear here.\n </Text>\n </Center>\n </Box>\n );\n }}\n />\n </Box>\n );\n};\n\nexport const Dialogs = React.memo(DialogsComponent);\n"],"names":["_a","_b","_c","_d","React"],"mappings":"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"}
|