@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.
- package/lib/components/messages-container-ui/BuildModeView.js +428 -0
- package/lib/components/messages-container-ui/BuildModeView.js.map +1 -0
- package/lib/components/messages-container-ui/MessagesContainerUI.js +55 -0
- package/lib/components/messages-container-ui/MessagesContainerUI.js.map +1 -0
- package/lib/components/messages-container-ui/PlanModeView.js +336 -0
- package/lib/components/messages-container-ui/PlanModeView.js.map +1 -0
- package/lib/compute.js +2 -3
- package/lib/compute.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/module.js.map +1 -1
- package/lib/queries/inboxQueries.js +62 -0
- package/lib/queries/inboxQueries.js.map +1 -0
- package/lib/routes.json +2 -3
- package/lib/screens/inbox/DialogMessages.js +8 -3
- package/lib/screens/inbox/DialogMessages.js.map +1 -1
- package/lib/screens/inbox/DialogThreadMessages.js +6 -11
- package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
- package/lib/screens/inbox/DialogThreads.js +9 -11
- package/lib/screens/inbox/DialogThreads.js.map +1 -1
- package/lib/screens/inbox/Inbox.js.map +1 -1
- package/lib/screens/inbox/components/CachedImage/consts.js +1 -1
- package/lib/screens/inbox/components/CachedImage/consts.js.map +1 -1
- package/lib/screens/inbox/components/CachedImage/index.js +125 -96
- package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
- package/lib/screens/inbox/components/DialogItem.js +160 -0
- package/lib/screens/inbox/components/DialogItem.js.map +1 -0
- package/lib/screens/inbox/components/GiftedChatInboxComponent.js +315 -0
- package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -0
- package/lib/screens/inbox/components/SlackMessageContainer/ImageViewerModal.js +3 -1
- package/lib/screens/inbox/components/SlackMessageContainer/ImageViewerModal.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js +194 -0
- package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js.map +1 -0
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +149 -36
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js +4 -5
- package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js.map +1 -1
- package/lib/screens/inbox/components/SubscriptionHandler.js +22 -0
- package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -0
- package/lib/screens/inbox/components/ThreadsViewItem.js +2 -4
- package/lib/screens/inbox/components/ThreadsViewItem.js.map +1 -1
- package/lib/screens/inbox/config/config.js +4 -2
- package/lib/screens/inbox/config/config.js.map +1 -1
- package/lib/screens/inbox/containers/ConversationView.js +1093 -1090
- package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/Dialogs.js +130 -577
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadConversationView.js +864 -1408
- package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadsView.js +9 -15
- package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
- package/lib/screens/inbox/hooks/useInboxMessages.js +31 -0
- package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -0
- package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js +1 -1
- package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js.map +1 -1
- package/lib/screens/inbox/workflow/dialog-threads-xstate.js.map +1 -1
- package/package.json +10 -8
- package/CHANGELOG.md +0 -172
- package/jest.config.js +0 -24
- package/lib/screens/inbox/components/DialogsListItem.js +0 -548
- package/lib/screens/inbox/components/DialogsListItem.js.map +0 -1
- package/lib/screens/inbox/components/ServiceDialogsListItem.js +0 -489
- package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +0 -1
- package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +0 -175
- package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +0 -1
- package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +0 -191
- package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +0 -1
- package/lib/screens/inbox/containers/workflow/conversation-xstate.js +0 -380
- package/lib/screens/inbox/containers/workflow/conversation-xstate.js.map +0 -1
- package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +0 -211
- package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +0 -1
- package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js +0 -438
- package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js.map +0 -1
- package/rollup.config.mjs +0 -45
- package/src/components/index.ts +0 -0
- package/src/compute.ts +0 -63
- package/src/index.ts +0 -7
- package/src/module.ts +0 -10
- package/src/navigation/InboxNavigation.tsx +0 -102
- package/src/navigation/index.ts +0 -1
- package/src/screens/inbox/DialogMessages.tsx +0 -21
- package/src/screens/inbox/DialogThreadMessages.tsx +0 -97
- package/src/screens/inbox/DialogThreads.tsx +0 -125
- package/src/screens/inbox/Inbox.tsx +0 -17
- package/src/screens/inbox/components/CachedImage/consts.ts +0 -6
- package/src/screens/inbox/components/CachedImage/index.tsx +0 -223
- package/src/screens/inbox/components/DialogsHeader.tsx +0 -30
- package/src/screens/inbox/components/DialogsListItem.tsx +0 -819
- package/src/screens/inbox/components/ServiceDialogsListItem.tsx +0 -679
- package/src/screens/inbox/components/SlackMessageContainer/ImageViewerModal.tsx +0 -113
- package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +0 -313
- package/src/screens/inbox/components/SlackMessageContainer/SlackMessage.tsx +0 -145
- package/src/screens/inbox/components/SlackMessageContainer/index.ts +0 -3
- package/src/screens/inbox/components/SmartLoader.tsx +0 -61
- package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +0 -301
- package/src/screens/inbox/components/ThreadsViewItem.tsx +0 -233
- package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +0 -145
- package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +0 -159
- package/src/screens/inbox/config/config.ts +0 -15
- package/src/screens/inbox/config/index.ts +0 -1
- package/src/screens/inbox/containers/ConversationView.tsx +0 -1784
- package/src/screens/inbox/containers/Dialogs.tsx +0 -829
- package/src/screens/inbox/containers/SupportServiceDialogs.tsx +0 -119
- package/src/screens/inbox/containers/ThreadConversationView.tsx +0 -2295
- package/src/screens/inbox/containers/ThreadsView.tsx +0 -224
- package/src/screens/inbox/containers/workflow/apollo/handleResult.ts +0 -20
- package/src/screens/inbox/containers/workflow/conversation-xstate.ts +0 -313
- package/src/screens/inbox/containers/workflow/dialogs-xstate.ts +0 -196
- package/src/screens/inbox/containers/workflow/thread-conversation-xstate.ts +0 -401
- package/src/screens/inbox/hooks/useSafeDialogThreadsMachine.ts +0 -136
- package/src/screens/inbox/index.ts +0 -37
- package/src/screens/inbox/machines/threadsMachine.ts +0 -147
- package/src/screens/inbox/workflow/dialog-threads-xstate.ts +0 -163
- package/src/screens/index.ts +0 -4
- package/tsconfig.json +0 -13
- package/webpack.config.js +0 -58
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React__default,{useRef,useCallback,useEffect
|
|
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
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
274
|
-
|
|
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
|
-
|
|
57
|
+
fetchPolicy: "cache-and-network"
|
|
289
58
|
});
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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:
|
|
87
|
+
timestamp: Date.now(),
|
|
88
|
+
orgName: params == null ? void 0 : params.orgName
|
|
523
89
|
});
|
|
524
|
-
}, [navigation, channelRole,
|
|
90
|
+
}, [navigation, channelRole, params == null ? void 0 : params.orgName]);
|
|
525
91
|
const handleSelectServiceChannel = useCallback((id, title, postParentId) => {
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
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
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
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
|
-
}, [
|
|
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
|
-
|
|
566
|
-
|
|
567
|
-
|
|
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
|
-
|
|
574
|
-
|
|
575
|
-
|
|
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
|
-
|
|
584
|
-
|
|
585
|
-
item: channel
|
|
166
|
+
updateQuery: (prev, {
|
|
167
|
+
fetchMoreResult
|
|
586
168
|
}) => {
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
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
|