@messenger-box/platform-mobile 10.0.3-alpha.23 → 10.0.3-alpha.232

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/lib/components/messages-container-ui/BuildModeView.js +428 -0
  2. package/lib/components/messages-container-ui/BuildModeView.js.map +1 -0
  3. package/lib/components/messages-container-ui/MessagesContainerUI.js +55 -0
  4. package/lib/components/messages-container-ui/MessagesContainerUI.js.map +1 -0
  5. package/lib/components/messages-container-ui/PlanModeView.js +336 -0
  6. package/lib/components/messages-container-ui/PlanModeView.js.map +1 -0
  7. package/lib/compute.js +2 -3
  8. package/lib/compute.js.map +1 -1
  9. package/lib/index.js +1 -1
  10. package/lib/index.js.map +1 -1
  11. package/lib/module.js.map +1 -1
  12. package/lib/queries/inboxQueries.js +62 -0
  13. package/lib/queries/inboxQueries.js.map +1 -0
  14. package/lib/routes.json +2 -3
  15. package/lib/screens/inbox/DialogMessages.js +8 -3
  16. package/lib/screens/inbox/DialogMessages.js.map +1 -1
  17. package/lib/screens/inbox/DialogThreadMessages.js +6 -11
  18. package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
  19. package/lib/screens/inbox/DialogThreads.js +9 -11
  20. package/lib/screens/inbox/DialogThreads.js.map +1 -1
  21. package/lib/screens/inbox/Inbox.js.map +1 -1
  22. package/lib/screens/inbox/components/CachedImage/consts.js +1 -1
  23. package/lib/screens/inbox/components/CachedImage/consts.js.map +1 -1
  24. package/lib/screens/inbox/components/CachedImage/index.js +125 -96
  25. package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
  26. package/lib/screens/inbox/components/DialogItem.js +160 -0
  27. package/lib/screens/inbox/components/DialogItem.js.map +1 -0
  28. package/lib/screens/inbox/components/GiftedChatInboxComponent.js +315 -0
  29. package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -0
  30. package/lib/screens/inbox/components/SlackMessageContainer/ImageViewerModal.js +3 -1
  31. package/lib/screens/inbox/components/SlackMessageContainer/ImageViewerModal.js.map +1 -1
  32. package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js +194 -0
  33. package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js.map +1 -0
  34. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +149 -36
  35. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
  36. package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js +4 -5
  37. package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js.map +1 -1
  38. package/lib/screens/inbox/components/SubscriptionHandler.js +22 -0
  39. package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -0
  40. package/lib/screens/inbox/components/ThreadsViewItem.js +2 -4
  41. package/lib/screens/inbox/components/ThreadsViewItem.js.map +1 -1
  42. package/lib/screens/inbox/config/config.js +4 -2
  43. package/lib/screens/inbox/config/config.js.map +1 -1
  44. package/lib/screens/inbox/containers/ConversationView.js +1093 -1090
  45. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  46. package/lib/screens/inbox/containers/Dialogs.js +130 -577
  47. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  48. package/lib/screens/inbox/containers/ThreadConversationView.js +864 -1408
  49. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  50. package/lib/screens/inbox/containers/ThreadsView.js +9 -15
  51. package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
  52. package/lib/screens/inbox/hooks/useInboxMessages.js +31 -0
  53. package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -0
  54. package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js +1 -1
  55. package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js.map +1 -1
  56. package/lib/screens/inbox/workflow/dialog-threads-xstate.js.map +1 -1
  57. package/package.json +10 -8
  58. package/CHANGELOG.md +0 -172
  59. package/jest.config.js +0 -24
  60. package/lib/screens/inbox/components/DialogsListItem.js +0 -548
  61. package/lib/screens/inbox/components/DialogsListItem.js.map +0 -1
  62. package/lib/screens/inbox/components/ServiceDialogsListItem.js +0 -489
  63. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +0 -1
  64. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +0 -175
  65. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +0 -1
  66. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +0 -191
  67. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +0 -1
  68. package/lib/screens/inbox/containers/workflow/conversation-xstate.js +0 -380
  69. package/lib/screens/inbox/containers/workflow/conversation-xstate.js.map +0 -1
  70. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +0 -211
  71. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +0 -1
  72. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js +0 -438
  73. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js.map +0 -1
  74. package/rollup.config.mjs +0 -45
  75. package/src/components/index.ts +0 -0
  76. package/src/compute.ts +0 -63
  77. package/src/index.ts +0 -7
  78. package/src/module.ts +0 -10
  79. package/src/navigation/InboxNavigation.tsx +0 -102
  80. package/src/navigation/index.ts +0 -1
  81. package/src/screens/inbox/DialogMessages.tsx +0 -21
  82. package/src/screens/inbox/DialogThreadMessages.tsx +0 -97
  83. package/src/screens/inbox/DialogThreads.tsx +0 -125
  84. package/src/screens/inbox/Inbox.tsx +0 -17
  85. package/src/screens/inbox/components/CachedImage/consts.ts +0 -6
  86. package/src/screens/inbox/components/CachedImage/index.tsx +0 -223
  87. package/src/screens/inbox/components/DialogsHeader.tsx +0 -30
  88. package/src/screens/inbox/components/DialogsListItem.tsx +0 -819
  89. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +0 -679
  90. package/src/screens/inbox/components/SlackMessageContainer/ImageViewerModal.tsx +0 -113
  91. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +0 -313
  92. package/src/screens/inbox/components/SlackMessageContainer/SlackMessage.tsx +0 -145
  93. package/src/screens/inbox/components/SlackMessageContainer/index.ts +0 -3
  94. package/src/screens/inbox/components/SmartLoader.tsx +0 -61
  95. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +0 -301
  96. package/src/screens/inbox/components/ThreadsViewItem.tsx +0 -233
  97. package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +0 -145
  98. package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +0 -159
  99. package/src/screens/inbox/config/config.ts +0 -15
  100. package/src/screens/inbox/config/index.ts +0 -1
  101. package/src/screens/inbox/containers/ConversationView.tsx +0 -1784
  102. package/src/screens/inbox/containers/Dialogs.tsx +0 -829
  103. package/src/screens/inbox/containers/SupportServiceDialogs.tsx +0 -119
  104. package/src/screens/inbox/containers/ThreadConversationView.tsx +0 -2295
  105. package/src/screens/inbox/containers/ThreadsView.tsx +0 -224
  106. package/src/screens/inbox/containers/workflow/apollo/handleResult.ts +0 -20
  107. package/src/screens/inbox/containers/workflow/conversation-xstate.ts +0 -313
  108. package/src/screens/inbox/containers/workflow/dialogs-xstate.ts +0 -196
  109. package/src/screens/inbox/containers/workflow/thread-conversation-xstate.ts +0 -401
  110. package/src/screens/inbox/hooks/useSafeDialogThreadsMachine.ts +0 -136
  111. package/src/screens/inbox/index.ts +0 -37
  112. package/src/screens/inbox/machines/threadsMachine.ts +0 -147
  113. package/src/screens/inbox/workflow/dialog-threads-xstate.ts +0 -163
  114. package/src/screens/index.ts +0 -4
  115. package/tsconfig.json +0 -13
  116. package/webpack.config.js +0 -58
@@ -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,{useState,useRef,useMemo,useCallback,useEffect}from'react';import {Center,Spinner,Text,Box,FlatList}from'@admin-layout/gluestack-ui-mobile';import {Ionicons}from'@expo/vector-icons';import {useSelector,shallowEqual}from'react-redux';import {useRoute,useNavigation,useFocusEffect}from'@react-navigation/native';import {DialogItem}from'../components/DialogItem.js';import {useGetChannelsByUserWithLastMessageQuery}from'common/graphql';import {RoomType}from'common';import {userSelector}from'@adminide-stack/user-auth0-client';import {config}from'../config/config.js';import colors from'tailwindcss/colors';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -17,621 +17,174 @@ var __spreadValues = (a, b) => {
17
17
  return a;
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
- const Actions = {
21
- INITIAL_CONTEXT: "INITIAL_CONTEXT",
22
- ERROR_HANDLED: "ERROR_HANDLED",
23
- FETCH_CHANNELS: "FETCH_CHANNELS",
24
- APPEND_CHANNELS: "APPEND_CHANNELS",
25
- REFRESH_CHANNELS: "REFRESH_CHANNELS",
26
- SELECT_CHANNEL: "SELECT_CHANNEL",
27
- START_LOADING: "START_LOADING",
28
- STOP_LOADING: "STOP_LOADING",
29
- LOAD_MORE_CHANNELS: "LOAD_MORE_CHANNELS",
30
- SET_SEARCH_QUERY: "SET_SEARCH_QUERY"
31
- };
32
- const BaseState = {
33
- Idle: "idle",
34
- Error: "error",
35
- Loading: "loading",
36
- Done: "done",
37
- FetchChannels: "fetchChannels"
38
- };
39
- const MainState = {
40
- RefreshChannels: "refreshChannels",
41
- SelectChannel: "selectChannel",
42
- LoadMoreChannels: "loadMoreChannels"
43
- };
44
- function useSafeMachine(machine) {
45
- const [state, setState] = useState({
46
- context: {
47
- channels: [],
48
- refreshing: false,
49
- loading: false,
50
- error: null,
51
- searchQuery: "",
52
- selectedChannelId: null,
53
- channelRole: null,
54
- channelFilters: {},
55
- supportServices: false,
56
- page: 1,
57
- hasMoreChannels: true,
58
- loadingMore: false
59
- },
60
- value: "idle"
61
- });
62
- const send = useCallback((event) => {
63
- var _a, _b, _c, _d;
64
- try {
65
- console.log("Event received:", event.type);
66
- if (event.type === Actions.INITIAL_CONTEXT) {
67
- setState((prev) => {
68
- var _a2, _b2, _c2, _d2;
69
- return __spreadProps(__spreadValues({}, prev), {
70
- context: __spreadProps(__spreadValues({}, prev.context), {
71
- channelRole: ((_a2 = event.data) == null ? void 0 : _a2.channelRole) || null,
72
- channelFilters: ((_b2 = event.data) == null ? void 0 : _b2.channelFilters) || {},
73
- supportServices: ((_c2 = event.data) == null ? void 0 : _c2.supportServices) || false,
74
- selectedChannelId: ((_d2 = event.data) == null ? void 0 : _d2.selectedChannelId) || null,
75
- loading: true,
76
- page: 1,
77
- hasMoreChannels: true
78
- }),
79
- value: BaseState.FetchChannels
80
- });
81
- });
82
- } else if (event.type === Actions.FETCH_CHANNELS) {
83
- console.log("Setting channels:", ((_b = (_a = event.data) == null ? void 0 : _a.channels) == null ? void 0 : _b.length) || 0);
84
- setState((prev) => {
85
- var _a2, _b2, _c2, _d2, _e;
86
- return __spreadProps(__spreadValues({}, prev), {
87
- context: __spreadProps(__spreadValues({}, prev.context), {
88
- channels: ((_a2 = event.data) == null ? void 0 : _a2.channels) || [],
89
- hasMoreChannels: (((_c2 = (_b2 = event.data) == null ? void 0 : _b2.channels) == null ? void 0 : _c2.length) || 0) > 0,
90
- loading: ((_d2 = event.data) == null ? void 0 : _d2.stopLoading) ? false : prev.context.loading,
91
- refreshing: ((_e = event.data) == null ? void 0 : _e.stopLoading) ? false : prev.context.refreshing,
92
- loadingMore: false
93
- }),
94
- value: BaseState.Idle
95
- });
96
- });
97
- } else if (event.type === Actions.APPEND_CHANNELS) {
98
- const newChannels = ((_c = event.data) == null ? void 0 : _c.channels) || [];
99
- console.log("Appending channels:", newChannels.length);
100
- setState((prev) => __spreadProps(__spreadValues({}, prev), {
101
- context: __spreadProps(__spreadValues({}, prev.context), {
102
- channels: [...prev.context.channels, ...newChannels],
103
- hasMoreChannels: newChannels.length >= 10,
104
- page: prev.context.page + 1,
105
- loadingMore: false
106
- }),
107
- value: BaseState.Idle
108
- }));
109
- } else if (event.type === Actions.REFRESH_CHANNELS) {
110
- setState((prev) => __spreadProps(__spreadValues({}, prev), {
111
- context: __spreadProps(__spreadValues({}, prev.context), {
112
- refreshing: true,
113
- page: 1,
114
- hasMoreChannels: true
115
- }),
116
- value: MainState.RefreshChannels
117
- }));
118
- } else if (event.type === Actions.SELECT_CHANNEL) {
119
- setState((prev) => {
120
- var _a2;
121
- return __spreadProps(__spreadValues({}, prev), {
122
- context: __spreadProps(__spreadValues({}, prev.context), {
123
- selectedChannelId: ((_a2 = event.data) == null ? void 0 : _a2.channelId) || null
124
- })
125
- });
126
- });
127
- } else if (event.type === Actions.START_LOADING) {
128
- setState((prev) => __spreadProps(__spreadValues({}, prev), {
129
- context: __spreadProps(__spreadValues({}, prev.context), {
130
- loading: true
131
- })
132
- }));
133
- } else if (event.type === Actions.STOP_LOADING) {
134
- console.log("Explicitly stopping loading state");
135
- setState((prev) => __spreadProps(__spreadValues({}, prev), {
136
- context: __spreadProps(__spreadValues({}, prev.context), {
137
- loading: false,
138
- refreshing: false,
139
- loadingMore: false
140
- }),
141
- value: prev.value === BaseState.FetchChannels ? BaseState.Idle : prev.value
142
- }));
143
- } else if (event.type === Actions.LOAD_MORE_CHANNELS) {
144
- setState((prev) => __spreadProps(__spreadValues({}, prev), {
145
- context: __spreadProps(__spreadValues({}, prev.context), {
146
- loadingMore: true
147
- }),
148
- value: MainState.LoadMoreChannels
149
- }));
150
- } else if (event.type === Actions.SET_SEARCH_QUERY) {
151
- setState((prev) => {
152
- var _a2;
153
- return __spreadProps(__spreadValues({}, prev), {
154
- context: __spreadProps(__spreadValues({}, prev.context), {
155
- searchQuery: ((_a2 = event.data) == null ? void 0 : _a2.searchQuery) || ""
156
- })
157
- });
158
- });
159
- } else if (event.type === Actions.ERROR_HANDLED) {
160
- console.log("Error handled:", (_d = event.data) == null ? void 0 : _d.message);
161
- setState((prev) => {
162
- var _a2;
163
- return __spreadProps(__spreadValues({}, prev), {
164
- context: __spreadProps(__spreadValues({}, prev.context), {
165
- error: ((_a2 = event.data) == null ? void 0 : _a2.message) || null,
166
- loading: false,
167
- refreshing: false,
168
- loadingMore: false
169
- }),
170
- value: BaseState.Idle
171
- });
172
- });
173
- }
174
- } catch (error) {
175
- console.error("Error handling event:", error);
176
- }
177
- }, []);
178
- const stateWithMatches = useMemo(() => {
179
- return __spreadProps(__spreadValues({}, state), {
180
- matches: (checkState) => {
181
- return state.value === checkState;
182
- }
183
- });
184
- }, [state]);
185
- return [stateWithMatches, send];
186
- }
187
20
  const DialogsComponent = (props) => {
188
- var _a;
189
21
  const {
190
22
  channelFilters: channelFilterProp,
191
23
  channelRole,
192
24
  supportServices
193
25
  } = props;
194
- const channelFilters = __spreadValues({}, channelFilterProp);
195
- channelFilters.type = (_a = channelFilters == null ? void 0 : channelFilters.type) != null ? _a : RoomType.Direct;
196
26
  const {
197
27
  params
198
28
  } = useRoute();
199
- const auth = useSelector(userSelector);
29
+ const auth = useSelector(userSelector, shallowEqual);
200
30
  const navigation = useNavigation();
31
+ const [isRefreshing, setIsRefreshing] = useState(false);
201
32
  const isMountedRef = useRef(true);
202
- const [state, send] = useSafeMachine();
203
- useCallback(() => {
204
- try {
205
- return (state == null ? void 0 : state.context) || {};
206
- } catch (error) {
207
- console.error("Error accessing state.context:", error);
208
- return {};
209
- }
210
- }, [state]);
211
- const safeContextProperty = useCallback((property, defaultValue = null) => {
212
- var _a2, _b;
213
- try {
214
- return (_b = (_a2 = state == null ? void 0 : state.context) == null ? void 0 : _a2[property]) != null ? _b : defaultValue;
215
- } catch (error) {
216
- console.error(`Error accessing state.context.${property}:`, error);
217
- return defaultValue;
218
- }
219
- }, [state]);
220
- const safeMatches = useCallback((stateValue) => {
221
- var _a2;
222
- try {
223
- return ((_a2 = state == null ? void 0 : state.matches) == null ? void 0 : _a2.call(state, stateValue)) || false;
224
- } catch (error) {
225
- console.error(`Error calling state.matches with ${stateValue}:`, error);
226
- return false;
227
- }
228
- }, [state]);
229
- const safeSend = useCallback((event) => {
230
- try {
231
- send(event);
232
- } catch (error) {
233
- console.error("Error sending event to state machine:", error, event);
234
- }
235
- }, [send]);
236
- const channels = safeContextProperty("channels", []);
237
- const refreshing = safeContextProperty("refreshing", false);
238
- const loading = safeContextProperty("loading", false);
239
- const searchQuery = safeContextProperty("searchQuery", "");
240
- const selectedChannelId = safeContextProperty("selectedChannelId", null);
241
- const loadingMore = safeContextProperty("loadingMore", false);
242
- const hasMoreChannels = safeContextProperty("hasMoreChannels", true);
243
- const page = safeContextProperty("page", 1);
244
- const stateRef = useRef(state);
245
- useEffect(() => {
246
- stateRef.current = state;
247
- }, [state]);
248
- const safeGetContext = useCallback(() => {
249
- if (stateRef.current && stateRef.current.context) {
250
- return stateRef.current.context;
251
- }
252
- return {
253
- channels: [],
254
- refreshing: false,
255
- loading: false,
256
- error: null,
257
- searchQuery: "",
258
- selectedChannelId: null,
259
- channelRole: null,
260
- channelFilters: {},
261
- supportServices: false,
262
- page: 1,
263
- hasMoreChannels: true,
264
- loadingMore: false
265
- };
266
- }, []);
267
- useEffect(() => {
268
- return () => {
269
- isMountedRef.current = false;
270
- };
271
- }, []);
33
+ const lastRefreshTimeRef = useRef(Date.now());
34
+ const activeChannelRef = useRef(null);
35
+ const resetActiveChannelTimeoutRef = useRef(null);
36
+ const MIN_REFRESH_INTERVAL = 2e3;
37
+ const channelFilters = useMemo(() => {
38
+ var _a;
39
+ const filters = __spreadValues({}, channelFilterProp);
40
+ const channelType = (_a = filters == null ? void 0 : filters.type) != null ? _a : RoomType.Direct;
41
+ filters.type = supportServices ? [channelType, RoomType.Service] : channelType;
42
+ return filters;
43
+ }, [channelFilterProp, supportServices]);
272
44
  const {
273
- refetch: getChannelsRefetch
274
- } = useGetChannelsByUserWithServiceChannelsQuery({
45
+ data,
46
+ loading,
47
+ refetch,
48
+ fetchMore
49
+ } = useGetChannelsByUserWithLastMessageQuery({
275
50
  variables: {
276
51
  role: channelRole,
277
52
  criteria: channelFilters,
278
- supportServices: supportServices ? true : false,
279
- supportServiceCriteria: {
280
- type: RoomType.Service
281
- },
282
53
  limit: 15,
283
54
  skip: 0
284
55
  },
285
- fetchPolicy: "cache-and-network",
286
- nextFetchPolicy: "network-only",
287
56
  notifyOnNetworkStatusChange: true,
288
- skip: true
57
+ fetchPolicy: "cache-and-network"
289
58
  });
290
- const fetchChannelsDirectly = useCallback(async (pageNum = 1, append = false) => {
291
- var _a2, _b, _c;
292
- try {
293
- const context = safeGetContext();
294
- console.log(`\u{1F4AB} FETCHING channels (page: ${pageNum}, append: ${append})`);
295
- const skipCount = (pageNum - 1) * 15;
296
- const fetchPromise = getChannelsRefetch({
297
- role: channelRole,
298
- criteria: channelFilters,
299
- supportServices: supportServices ? true : false,
300
- supportServiceCriteria: {
301
- type: RoomType.Service
302
- },
303
- limit: 15,
304
- skip: skipCount
305
- });
306
- const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("Request timeout")), 8e3));
307
- const result = await Promise.race([fetchPromise, timeoutPromise]);
308
- const data = (result == null ? void 0 : result.data) || {};
309
- const allChannels = [...(_a2 = data == null ? void 0 : data.supportServiceChannels) != null ? _a2 : [], ...(_b = data == null ? void 0 : data.channelsByUser) != null ? _b : []];
310
- const filteredChannels = (_c = allChannels == null ? void 0 : allChannels.filter((c) => {
311
- if (!c || !c.members)
312
- return false;
313
- for (const member of c.members) {
314
- if (member && member.user && member.user.id !== (auth == null ? void 0 : auth.id) && member.user.__typename === "UserAccount") {
315
- return true;
316
- }
317
- }
318
- return false;
319
- })) != null ? _c : [];
320
- const sortedChannels = filteredChannels.sort((a, b) => {
321
- const dateA = new Date(a.updatedAt);
322
- const dateB = new Date(b.updatedAt);
323
- return dateB.getTime() - dateA.getTime();
324
- }) || [];
325
- console.log(`\u{1F4CA} Processed channels: ${sortedChannels.length} (page: ${pageNum}, skip: ${skipCount})`);
326
- if (isMountedRef.current) {
327
- if (append) {
328
- safeSend({
329
- type: Actions.APPEND_CHANNELS,
330
- data: {
331
- channels: sortedChannels
332
- }
333
- });
334
- } else {
335
- safeSend({
336
- type: Actions.FETCH_CHANNELS,
337
- data: {
338
- channels: sortedChannels,
339
- stopLoading: true
340
- }
341
- });
342
- }
343
- }
344
- } catch (error) {
345
- console.error("Error fetching channels:", error);
346
- if (isMountedRef.current) {
347
- safeSend({
348
- type: Actions.ERROR_HANDLED,
349
- data: {
350
- message: "Failed to fetch channels"
351
- }
352
- });
353
- }
354
- }
355
- }, [getChannelsRefetch, channelRole, channelFilters, supportServices, auth == null ? void 0 : auth.id, safeSend]);
356
- useEffect(() => {
357
- if (loading) {
358
- const safetyTimeout = setTimeout(() => {
359
- console.log("\u26A0\uFE0F Safety timeout triggered - forcing loading state to stop");
360
- if (isMountedRef.current) {
361
- safeSend({
362
- type: Actions.STOP_LOADING
363
- });
364
- }
365
- }, 3e3);
366
- return () => clearTimeout(safetyTimeout);
367
- }
368
- }, [loading, safeSend]);
369
- const fastRefresh = useCallback(async () => {
370
- var _a2, _b, _c;
371
- try {
372
- console.log("\u{1F504} Fast refreshing channels...");
373
- const clearRefreshingTimeout = setTimeout(() => {
374
- if (isMountedRef.current) {
375
- console.log("\u26A0\uFE0F Fast refresh timeout - stopping refresh state");
376
- safeSend({
377
- type: Actions.STOP_LOADING
378
- });
379
- }
380
- }, 3e3);
381
- const {
382
- data
383
- } = await getChannelsRefetch({
384
- role: channelRole,
385
- criteria: channelFilters,
386
- supportServices: supportServices ? true : false,
387
- supportServiceCriteria: {
388
- type: RoomType.Service
389
- },
390
- limit: 10,
391
- skip: 0
392
- });
393
- clearTimeout(clearRefreshingTimeout);
394
- if (!isMountedRef.current)
395
- return;
396
- const allChannels = [...(_a2 = data == null ? void 0 : data.supportServiceChannels) != null ? _a2 : [], ...(_b = data == null ? void 0 : data.channelsByUser) != null ? _b : []];
397
- const filteredChannels = (_c = allChannels == null ? void 0 : allChannels.filter((c) => c.members.some((u) => {
398
- var _a3;
399
- return u !== null && ((_a3 = u == null ? void 0 : u.user) == null ? void 0 : _a3.id) != (auth == null ? void 0 : auth.id) && u.user.__typename == "UserAccount";
400
- }))) != null ? _c : [];
401
- const sortedChannels = filteredChannels && orderBy(filteredChannels, ["updatedAt"], ["desc"]) || [];
402
- console.log(`\u{1F4CA} Fast refresh completed: ${sortedChannels.length} channels`);
403
- if (isMountedRef.current) {
404
- safeSend({
405
- type: Actions.FETCH_CHANNELS,
406
- data: {
407
- channels: sortedChannels,
408
- stopLoading: true
409
- }
410
- });
411
- }
412
- } catch (error) {
413
- console.error("Error during fast refresh:", error);
414
- if (isMountedRef.current) {
415
- safeSend({
416
- type: Actions.STOP_LOADING
417
- });
418
- }
419
- }
420
- }, [getChannelsRefetch, channelRole, channelFilters, supportServices, auth == null ? void 0 : auth.id, safeSend]);
421
- useEffect(() => {
422
- const context = safeGetContext();
423
- const isAlreadyFetching = context.refreshing || context.loading;
424
- if (!isAlreadyFetching) {
425
- if (safeMatches(BaseState.FetchChannels)) {
426
- console.log("\u{1F504} Fetching channels...");
427
- fetchChannelsDirectly(1, false);
428
- } else if (safeMatches(MainState.RefreshChannels)) {
429
- console.log("\u{1F504} Refreshing channels...");
430
- fetchChannelsDirectly(1, false);
431
- } else if (safeMatches(MainState.LoadMoreChannels)) {
432
- console.log("\u{1F504} Loading more channels...");
433
- fetchChannelsDirectly(page, true);
434
- }
435
- } else {
436
- console.log("\u23E9 Skipping fetch because isAlreadyFetching:", isAlreadyFetching);
437
- }
438
- }, [fetchChannelsDirectly, safeMatches, safeGetContext, state.value, page]);
439
- useEffect(() => {
440
- console.log("State changed to:", state.value);
441
- console.log("Context:", JSON.stringify({
442
- channelsCount: channels.length,
443
- loading,
444
- refreshing
445
- }));
446
- }, [state.value, channels.length, loading, refreshing]);
447
- useEffect(() => {
448
- if (isMountedRef.current) {
449
- console.log("\u{1F680} Initializing state machine with props", {
450
- channelRole,
451
- channelFilters,
452
- supportServices,
453
- selectedChannelId: params == null ? void 0 : params.channelId
454
- });
455
- safeSend({
456
- type: Actions.INITIAL_CONTEXT,
457
- data: {
458
- channelRole,
459
- channelFilters,
460
- supportServices,
461
- selectedChannelId: params == null ? void 0 : params.channelId
462
- }
463
- });
464
- const initSafetyTimeout = setTimeout(() => {
465
- if (isMountedRef.current && loading) {
466
- console.log("\u26A0\uFE0F Init safety timeout triggered - forcing loading state to stop");
467
- safeSend({
468
- type: Actions.STOP_LOADING
469
- });
470
- }
471
- }, 8e3);
472
- return () => clearTimeout(initSafetyTimeout);
473
- }
474
- }, []);
475
- const focusRefreshRef = useRef(null);
476
- useFocusEffect(useCallback(() => {
477
- let hasTriggeredRefresh = false;
478
- const now = Date.now();
479
- const lastRefresh = focusRefreshRef.current;
480
- const shouldRefresh = lastRefresh === null || now - lastRefresh > 2e3;
481
- const context = safeGetContext();
482
- const isAlreadyFetching = context.refreshing || context.loading;
483
- if (isMountedRef.current && !hasTriggeredRefresh && !isAlreadyFetching && shouldRefresh && (channels.length > 0 || safeMatches(BaseState.Idle))) {
484
- hasTriggeredRefresh = true;
485
- focusRefreshRef.current = now;
486
- console.log("\u{1F504} Focus effect: triggering fast refresh");
487
- safeSend({
488
- type: Actions.START_LOADING,
489
- data: {
490
- refreshing: true
491
- }
492
- });
493
- setTimeout(() => {
494
- if (isMountedRef.current) {
495
- fastRefresh();
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
- }
506
- return () => {
507
- hasTriggeredRefresh = false;
508
- };
509
- }, [safeSend, channels.length, safeMatches, safeGetContext, fastRefresh]));
510
- const handleSelectChannel = useCallback((id, title) => {
511
- safeSend({
512
- type: Actions.SELECT_CHANNEL,
513
- data: {
514
- channelId: id
515
- }
59
+ console.log("data__Dialogs", data);
60
+ console.log("channelFilters__Dialogs", channelFilters);
61
+ const processedChannels = useMemo(() => {
62
+ const rawChannels = (data == null ? void 0 : data.channelsByUser) || [];
63
+ if (!rawChannels.length) return [];
64
+ return rawChannels.filter((c) => {
65
+ if (!(c == null ? void 0 : c.members)) return false;
66
+ return c.members.some((member) => (member == null ? void 0 : member.user) && member.user.id !== (auth == null ? void 0 : auth.id) && member.user.__typename === "UserAccount");
67
+ }).sort((a, b) => {
68
+ const dateA = new Date((a == null ? void 0 : a.updatedAt) || (a == null ? void 0 : a.createdAt)).getTime();
69
+ const dateB = new Date((b == null ? void 0 : b.updatedAt) || (b == null ? void 0 : b.createdAt)).getTime();
70
+ return dateB - dateA;
516
71
  });
72
+ }, [data == null ? void 0 : data.channelsByUser, auth == null ? void 0 : auth.id]);
73
+ const handleSelectChannel = useCallback((id, title) => {
74
+ if (activeChannelRef.current === id) return;
75
+ activeChannelRef.current = id;
76
+ if (resetActiveChannelTimeoutRef.current) {
77
+ clearTimeout(resetActiveChannelTimeoutRef.current);
78
+ }
79
+ resetActiveChannelTimeoutRef.current = setTimeout(() => {
80
+ activeChannelRef.current = null;
81
+ }, 2e3);
517
82
  navigation.navigate(config.INBOX_MESSEGE_PATH, {
518
83
  channelId: id,
519
84
  role: channelRole,
520
85
  title,
521
86
  hideTabBar: true,
522
- timestamp: new Date().getTime()
87
+ timestamp: Date.now(),
88
+ orgName: params == null ? void 0 : params.orgName
523
89
  });
524
- }, [navigation, channelRole, safeSend]);
90
+ }, [navigation, channelRole, params == null ? void 0 : params.orgName]);
525
91
  const handleSelectServiceChannel = useCallback((id, title, postParentId) => {
526
- safeSend({
527
- type: Actions.SELECT_CHANNEL,
528
- data: {
529
- channelId: id
530
- }
531
- });
532
- navigation.navigate(postParentId || postParentId === 0 ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH, {
92
+ if (activeChannelRef.current === id) return;
93
+ activeChannelRef.current = id;
94
+ if (resetActiveChannelTimeoutRef.current) {
95
+ clearTimeout(resetActiveChannelTimeoutRef.current);
96
+ }
97
+ resetActiveChannelTimeoutRef.current = setTimeout(() => {
98
+ activeChannelRef.current = null;
99
+ }, 2e3);
100
+ const path = postParentId !== void 0 && postParentId !== null ? config.THREAD_MESSEGE_PATH : config.THREADS_PATH;
101
+ navigation.navigate(path, {
533
102
  channelId: id,
534
103
  role: channelRole,
535
104
  title,
536
105
  postParentId,
537
- hideTabBar: true
538
- });
539
- }, [navigation, channelRole, safeSend]);
540
- const handlePullToRefresh = useCallback(() => {
541
- if (refreshing) {
542
- console.log("\u23E9 Skipping refresh because already refreshing");
543
- return;
544
- }
545
- const now = Date.now();
546
- focusRefreshRef.current = now;
547
- console.log("\u{1F504} Pull-to-refresh triggered");
548
- safeSend({
549
- type: Actions.START_LOADING,
550
- data: {
551
- refreshing: true
552
- }
106
+ hideTabBar: true,
107
+ orgName: params == null ? void 0 : params.orgName
553
108
  });
554
- fastRefresh();
555
- }, [safeSend, refreshing, fastRefresh]);
556
- const handleSearchChange = useCallback((text) => {
557
- safeSend({
558
- type: Actions.SET_SEARCH_QUERY,
559
- data: {
560
- searchQuery: text
109
+ }, [navigation, channelRole, params == null ? void 0 : params.orgName]);
110
+ const renderItem = useCallback(({
111
+ item: channel
112
+ }) => /* @__PURE__ */ React__default.createElement(DialogItem, { onOpen: (channel == null ? void 0 : channel.type) === RoomType.Service ? handleSelectServiceChannel : handleSelectChannel, currentUser: auth, channel }), [auth, handleSelectChannel, handleSelectServiceChannel]);
113
+ const ListFooterComponent = useMemo(() => {
114
+ if (loading && processedChannels.length > 0 && !isRefreshing) {
115
+ return /* @__PURE__ */ React__default.createElement(Center, { className: "py-4" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" }));
116
+ }
117
+ return null;
118
+ }, [loading, processedChannels.length, isRefreshing]);
119
+ const ListEmptyComponent = useMemo(() => {
120
+ if (loading && processedChannels.length === 0) {
121
+ return /* @__PURE__ */ React__default.createElement(Center, { className: "flex-1 justify-center items-center", style: {
122
+ minHeight: 300
123
+ } }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "large" }), /* @__PURE__ */ React__default.createElement(Text, { className: "mt-4 text-gray-500" }, "Loading conversations..."));
124
+ }
125
+ return /* @__PURE__ */ React__default.createElement(Center, { className: "flex-1 justify-center items-center px-6", style: {
126
+ minHeight: 300
127
+ } }, /* @__PURE__ */ React__default.createElement(Box, { className: "w-16 h-16 rounded-full bg-blue-500 flex items-center justify-center mb-5" }, /* @__PURE__ */ React__default.createElement(Ionicons, { name: "chatbubble-ellipses", size: 30, color: "white" })), /* @__PURE__ */ React__default.createElement(Text, { className: "text-2xl font-bold text-center mb-2" }, "No messages yet"), /* @__PURE__ */ React__default.createElement(Text, { className: "text-gray-600 text-center" }, "When you start conversations with others,", "\n", "they'll appear here."));
128
+ }, [loading, processedChannels.length]);
129
+ useEffect(() => {
130
+ return () => {
131
+ isMountedRef.current = false;
132
+ if (resetActiveChannelTimeoutRef.current) {
133
+ clearTimeout(resetActiveChannelTimeoutRef.current);
561
134
  }
562
- });
563
- }, [safeSend]);
135
+ };
136
+ }, []);
137
+ useFocusEffect(useCallback(() => {
138
+ activeChannelRef.current = null;
139
+ const now = Date.now();
140
+ if (now - lastRefreshTimeRef.current >= MIN_REFRESH_INTERVAL) {
141
+ lastRefreshTimeRef.current = now;
142
+ refetch().catch(console.error);
143
+ }
144
+ return () => {
145
+ };
146
+ }, [refetch, MIN_REFRESH_INTERVAL]));
147
+ const handlePullToRefresh = useCallback(async () => {
148
+ setIsRefreshing(true);
149
+ try {
150
+ await refetch();
151
+ } catch (error) {
152
+ console.error("Refresh error:", error);
153
+ } finally {
154
+ setIsRefreshing(false);
155
+ }
156
+ }, [refetch]);
564
157
  const handleLoadMore = useCallback(() => {
565
- if (!loadingMore && hasMoreChannels) {
566
- console.log("Loading more channels at page:", page + 1);
567
- safeSend({
568
- type: Actions.LOAD_MORE_CHANNELS
569
- });
570
- } else {
571
- console.log("Skip loading more: loadingMore=", loadingMore, "hasMoreChannels=", hasMoreChannels);
158
+ var _a;
159
+ if (loading || !((_a = data == null ? void 0 : data.channelsByUser) == null ? void 0 : _a.length) || processedChannels.length < 10) {
160
+ return;
572
161
  }
573
- }, [safeSend, loadingMore, hasMoreChannels, page]);
574
- return /* @__PURE__ */ React__default.createElement(Box, { className: "p-2" }, /* @__PURE__ */ React__default.createElement(
575
- FlatList,
576
- {
577
- data: channels,
578
- onRefresh: handlePullToRefresh,
579
- refreshing,
580
- contentContainerStyle: {
581
- minHeight: "100%"
162
+ fetchMore({
163
+ variables: {
164
+ skip: processedChannels.length
582
165
  },
583
- ItemSeparatorComponent: () => /* @__PURE__ */ React__default.createElement(Box, { className: "h-0.5 bg-gray-200" }),
584
- renderItem: ({
585
- item: channel
166
+ updateQuery: (prev, {
167
+ fetchMoreResult
586
168
  }) => {
587
- 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
- );
599
- },
600
- ListFooterComponent: () => loadingMore ? /* @__PURE__ */ React__default.createElement(Center, { className: "py-4" }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "small" })) : null,
601
- onEndReached: handleLoadMore,
602
- onEndReachedThreshold: 0.5,
603
- initialNumToRender: 5,
604
- maxToRenderPerBatch: 5,
605
- windowSize: 5,
606
- removeClippedSubviews: true,
607
- updateCellsBatchingPeriod: 100,
608
- getItemLayout: (data, index) => ({
609
- length: 80,
610
- offset: 80 * index,
611
- index
612
- }),
613
- keyExtractor: (item) => `channel-${item.id}`,
614
- ListEmptyComponent: () => {
615
- console.log("Rendering ListEmptyComponent", {
616
- loading,
617
- refreshing,
618
- stateValue: state.value
169
+ var _a2;
170
+ if (!((_a2 = fetchMoreResult == null ? void 0 : fetchMoreResult.channelsByUser) == null ? void 0 : _a2.length)) return prev;
171
+ return __spreadProps(__spreadValues({}, fetchMoreResult), {
172
+ channelsByUser: [...prev.channelsByUser || [], ...fetchMoreResult.channelsByUser || []]
619
173
  });
620
- if (loading && channels.length === 0) {
621
- return /* @__PURE__ */ React__default.createElement(Center, { className: "flex-1 justify-center items-center", style: {
622
- height: 300
623
- } }, /* @__PURE__ */ React__default.createElement(Spinner, { color: colors.blue[500], size: "large" }), /* @__PURE__ */ React__default.createElement(Text, { className: "mt-4 text-gray-500" }, "Loading conversations..."));
624
- }
625
- return /* @__PURE__ */ React__default.createElement(Box, { className: "p-6" }, /* @__PURE__ */ React__default.createElement(Box, { className: "mb-6" }, /* @__PURE__ */ React__default.createElement(Heading, { className: "text-2xl font-bold" }, "Direct Messages"), /* @__PURE__ */ React__default.createElement(Text, { className: "text-gray-600 mt-1" }, "Private conversations with other users")), /* @__PURE__ */ React__default.createElement(Input, { className: "mb-8 h-[50] rounded-md border-gray-300 border", size: "md", style: {
626
- paddingVertical: 8,
627
- marginBottom: 10,
628
- borderColor: "#d1d5db",
629
- borderRadius: 10
630
- } }, /* @__PURE__ */ React__default.createElement(InputField, { placeholder: "Search messages...", onChangeText: handleSearchChange, value: searchQuery })), /* @__PURE__ */ React__default.createElement(Center, { className: "items-center", style: {
631
- paddingVertical: 5
632
- } }, /* @__PURE__ */ React__default.createElement(Box, { className: "w-16 h-16 rounded-full bg-blue-500 flex items-center justify-center mb-5" }, /* @__PURE__ */ React__default.createElement(Ionicons, { name: "chatbubble-ellipses", size: 30, color: "white" })), /* @__PURE__ */ React__default.createElement(Text, { className: "text-2xl font-bold text-center mb-2" }, "No messages yet"), /* @__PURE__ */ React__default.createElement(Text, { className: "text-gray-600 text-center mb-8" }, "When you start conversations with others,", "\n", "they'll appear here.")));
633
174
  }
634
- }
635
- ));
175
+ }).catch((error) => {
176
+ console.error("Load more error:", error);
177
+ });
178
+ }, [fetchMore, loading, data == null ? void 0 : data.channelsByUser, processedChannels.length]);
179
+ const keyExtractor = useCallback((item) => `channel-${item.id}`, []);
180
+ const ItemSeparatorComponent = useCallback(() => /* @__PURE__ */ React__default.createElement(Box, { className: "h-px bg-gray-200 mx-4" }), []);
181
+ const getItemLayout = useCallback((_data, index) => ({
182
+ length: 80,
183
+ offset: 80 * index,
184
+ index
185
+ }), []);
186
+ return /* @__PURE__ */ React__default.createElement(Box, { className: "flex-1 px-2" }, /* @__PURE__ */ React__default.createElement(FlatList, { data: processedChannels, renderItem, keyExtractor, onRefresh: handlePullToRefresh, refreshing: isRefreshing, ListEmptyComponent, ListFooterComponent, ItemSeparatorComponent, onEndReached: handleLoadMore, onEndReachedThreshold: 0.5, initialNumToRender: 10, maxToRenderPerBatch: 10, windowSize: 10, removeClippedSubviews: true, updateCellsBatchingPeriod: 50, getItemLayout, contentContainerStyle: {
187
+ flexGrow: 1
188
+ } }));
636
189
  };
637
190
  const Dialogs = React__default.memo(DialogsComponent);export{Dialogs};//# sourceMappingURL=Dialogs.js.map