@messenger-box/platform-mobile 10.0.3-alpha.20 → 10.0.3-alpha.201

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 (112) 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 +58 -20
  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 -115
  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 +67 -47
  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 +1099 -1094
  45. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  46. package/lib/screens/inbox/containers/Dialogs.js +132 -534
  47. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  48. package/lib/screens/inbox/containers/ThreadConversationView.js +876 -1357
  49. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  50. package/lib/screens/inbox/containers/ThreadsView.js +81 -54
  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 +108 -0
  55. package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js.map +1 -0
  56. package/lib/screens/inbox/workflow/dialog-threads-xstate.js +151 -0
  57. package/lib/screens/inbox/workflow/dialog-threads-xstate.js.map +1 -0
  58. package/package.json +9 -7
  59. package/CHANGELOG.md +0 -164
  60. package/jest.config.js +0 -24
  61. package/lib/screens/inbox/components/DialogsListItem.js +0 -548
  62. package/lib/screens/inbox/components/DialogsListItem.js.map +0 -1
  63. package/lib/screens/inbox/components/ServiceDialogsListItem.js +0 -489
  64. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +0 -1
  65. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js +0 -175
  66. package/lib/screens/inbox/components/workflow/dialogs-list-item-xstate.js.map +0 -1
  67. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js +0 -191
  68. package/lib/screens/inbox/components/workflow/service-dialogs-list-item-xstate.js.map +0 -1
  69. package/lib/screens/inbox/containers/workflow/conversation-xstate.js +0 -380
  70. package/lib/screens/inbox/containers/workflow/conversation-xstate.js.map +0 -1
  71. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js +0 -211
  72. package/lib/screens/inbox/containers/workflow/dialogs-xstate.js.map +0 -1
  73. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js +0 -438
  74. package/lib/screens/inbox/containers/workflow/thread-conversation-xstate.js.map +0 -1
  75. package/rollup.config.mjs +0 -45
  76. package/src/components/index.ts +0 -0
  77. package/src/compute.ts +0 -63
  78. package/src/index.ts +0 -7
  79. package/src/module.ts +0 -10
  80. package/src/navigation/InboxNavigation.tsx +0 -102
  81. package/src/navigation/index.ts +0 -1
  82. package/src/screens/inbox/DialogMessages.tsx +0 -21
  83. package/src/screens/inbox/DialogThreadMessages.tsx +0 -97
  84. package/src/screens/inbox/DialogThreads.tsx +0 -129
  85. package/src/screens/inbox/Inbox.tsx +0 -17
  86. package/src/screens/inbox/components/CachedImage/consts.ts +0 -6
  87. package/src/screens/inbox/components/CachedImage/index.tsx +0 -223
  88. package/src/screens/inbox/components/DialogsHeader.tsx +0 -30
  89. package/src/screens/inbox/components/DialogsListItem.tsx +0 -819
  90. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +0 -679
  91. package/src/screens/inbox/components/SlackMessageContainer/ImageViewerModal.tsx +0 -113
  92. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +0 -313
  93. package/src/screens/inbox/components/SlackMessageContainer/SlackMessage.tsx +0 -145
  94. package/src/screens/inbox/components/SlackMessageContainer/index.ts +0 -3
  95. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +0 -301
  96. package/src/screens/inbox/components/ThreadsViewItem.tsx +0 -321
  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 -1782
  102. package/src/screens/inbox/containers/Dialogs.tsx +0 -794
  103. package/src/screens/inbox/containers/SupportServiceDialogs.tsx +0 -119
  104. package/src/screens/inbox/containers/ThreadConversationView.tsx +0 -2312
  105. package/src/screens/inbox/containers/ThreadsView.tsx +0 -305
  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/index.ts +0 -4
  111. package/tsconfig.json +0 -13
  112. package/webpack.config.js +0 -58
@@ -1,305 +0,0 @@
1
- import React, { useCallback, useMemo, useEffect, useState } from 'react';
2
- import { FlatList, Box, Heading, Input, Text, Icon, Center, Spinner, Button } from '@admin-layout/gluestack-ui-mobile';
3
- import { Ionicons } from '@expo/vector-icons';
4
- import { useSelector, useDispatch } from 'react-redux';
5
- import { useNavigation, useRoute, useIsFocused, useFocusEffect } from '@react-navigation/native';
6
- import { orderBy, uniqBy, startCase } from 'lodash-es';
7
- import {
8
- useThreadMessagesQuery,
9
- OnThreadCreatedUpdatedDocument as THREAD_CHAT_ADDED,
10
- useOnThreadCreatedUpdatedSubscription,
11
- } from 'common/graphql';
12
- import { userSelector } from '@adminide-stack/user-auth0-client';
13
- import { CHANGE_SETTINGS_ACTION } from '@admin-layout/client';
14
- import { ThreadViewItem } from '../components/ThreadsViewItem';
15
- import { config } from '../config';
16
- const { MESSAGES_PER_PAGE } = config;
17
-
18
- export interface ThreadsViewProps {
19
- data: any;
20
- loading: boolean;
21
- refetch: any;
22
- subscribeToMore: any;
23
- error: any;
24
- channelId?: string;
25
- role?: string;
26
- channelsDetail?: any;
27
- refetchChannelDetail: (id: any) => Promise<any>;
28
- }
29
-
30
- interface IThreadSubscriptionHandlerProps {
31
- subscribeToNewMessages: () => any;
32
- channelId: string | undefined;
33
- }
34
-
35
- const ThreadsViewComponent = ({
36
- data,
37
- loading: threadLoading,
38
- refetch,
39
- subscribeToMore,
40
- error,
41
- channelId,
42
- role,
43
- channelsDetail,
44
- refetchChannelDetail,
45
- }: ThreadsViewProps) => {
46
- const { params } = useRoute<any>();
47
- const auth = useSelector(userSelector);
48
- const dispatch = useDispatch();
49
- const navigation = useNavigation<any>();
50
- const isFocused = useIsFocused();
51
- const [refreshing, setRefresh] = useState<boolean>(false);
52
- const [threadData, setThreadsData] = useState<any>([]);
53
-
54
- // const {
55
- // data,
56
- // loading: threadLoading,
57
- // error,
58
- // refetch,
59
- // subscribeToMore,
60
- // } = useThreadMessagesQuery({
61
- // variables: {
62
- // channelId: channelId?.toString(),
63
- // role: role?.toString(),
64
- // limit: MESSAGES_PER_PAGE,
65
- // repliesLimit2: 5,
66
- // },
67
- // // fetchPolicy: 'cache-and-network',
68
- // });
69
-
70
- // const { data: threadCreatedUpdated } = useOnThreadCreatedUpdatedSubscription({
71
- // variables: { channelId: channelId?.toString() },
72
- // });
73
-
74
- useFocusEffect(
75
- React.useCallback(() => {
76
- // Do something when the screen is focused
77
- navigation?.setOptions({ title: params?.title ?? 'Thread' });
78
- refetch({
79
- channelId: channelId?.toString(),
80
- role: role?.toString(),
81
- limit: MESSAGES_PER_PAGE,
82
- repliesLimit2: 5,
83
- });
84
- // .then(({ data }) => {
85
- // if (!data?.threadMessages?.data) {
86
- // return;
87
- // }
88
-
89
- // if (data?.threadMessages?.data?.length) {
90
- // const { data: newThreads } = data?.threadMessages;
91
- // setThreadsData((oldThreads: any) => uniqBy([...oldThreads, ...newThreads], ({ id }) => id));
92
- // }
93
- // });
94
-
95
- return () => {
96
- // Do something when the screen is unfocused
97
- // Useful for cleanup functions
98
- };
99
- }, []),
100
- );
101
-
102
- // React.useEffect(() => {
103
- // if (data?.threadMessages?.data?.length) {
104
- // const { data: newThreads } = data?.threadMessages;
105
- // setThreadsData((oldThreads: any) => uniqBy([...oldThreads, ...newThreads], ({ id }) => id));
106
- // }
107
- // }, [data]);
108
-
109
- // React.useEffect(() => {
110
- // if (threadCreatedUpdated?.threadCreatedUpdated?.data) {
111
- // const { data: newThreads } = threadCreatedUpdated?.threadCreatedUpdated;
112
-
113
- // setThreadsData((oldThreads: any) => {
114
- // const i = oldThreads.findIndex((el: any) => el.id === newThreads?.id);
115
- // if (i > -1) oldThreads[i] = newThreads; // (2)
116
- // else oldThreads.push(newThreads);
117
- // return oldThreads;
118
- // });
119
- // // setThreadsData((oldThreads: any) => uniqBy([...oldThreads, newThreads], ({ id }) => id));
120
- // }
121
- // }, [threadCreatedUpdated]);
122
-
123
- const setData = React.useCallback((newThreads: any) => {
124
- setThreadsData((oldThreads: any) => {
125
- const i = oldThreads.findIndex((el: any) => el.id === newThreads?.id);
126
- if (i > -1) oldThreads[i] = newThreads; // (2)
127
- else oldThreads.push(newThreads);
128
- return oldThreads;
129
- });
130
- // setThreadsData((oldThreads: any) => uniqBy([...oldThreads, newThreads], ({ id }) => id));
131
- }, []);
132
-
133
- // const threads = React.useMemo(() => {
134
- // if (!threadData?.length) return null;
135
- // return orderBy(threadData, ['updatedAt'], ['desc']) || [];
136
- // //return threadData || [];
137
- // }, [threadData]);
138
-
139
- const threads = React.useMemo(() => {
140
- // if (!data?.threadMessages?.data?.length) return null;
141
- // const { data: newThreads } = data?.threadMessages;
142
- if (data?.threadMessages?.data?.length == 0) return [];
143
- const threadsFiltered = data?.threadMessages?.data
144
- ? uniqBy([...data?.threadMessages?.data], ({ id }: any) => id)
145
- : [];
146
- return orderBy(threadsFiltered, ['updatedAt'], ['desc']) || [];
147
- }, [data]);
148
-
149
- const threadReplies = React.useMemo(() => {
150
- if (!threads?.length) return null;
151
- return threads?.map((t: any) => t?.replies)?.flat(1) || [];
152
- //return threadData || [];
153
- }, [threads]);
154
-
155
- const handleSelectThread = useCallback((id: any, title: any, postParentId: any) => {
156
- navigation.navigate(config.THREAD_MESSEGE_PATH as any, {
157
- channelId: id,
158
- role: role?.toString(),
159
- title: title,
160
- postParentId: postParentId,
161
- hideTabBar: true,
162
- });
163
- // if (params?.channelId) {
164
- // navigation.navigate(config.THREAD_MESSEGE_PATH as any, {
165
- // channelId: params?.channelId,
166
- // title: params?.title ?? null,
167
- // postParentId: postParentId,
168
- // hideTabBar: true,
169
- // });
170
- // } else {
171
- // navigation.navigate(config.THREAD_MESSEGE_PATH as any, {
172
- // channelId: id,
173
- // title: title,
174
- // postParentId: postParentId,
175
- // hideTabBar: true,
176
- // });
177
- // }
178
- }, []);
179
-
180
- const handleRefresh = useCallback(() => {
181
- refetch({
182
- channelId: channelId?.toString(),
183
- role: role?.toString(),
184
- limit: MESSAGES_PER_PAGE,
185
- repliesLimit2: 5,
186
- });
187
- // .then(({ data }) => {
188
- // if (!data?.threadMessages?.data) {
189
- // return;
190
- // }
191
-
192
- // if (data?.threadMessages?.data?.length) {
193
- // const { data: newThreads } = data?.threadMessages;
194
- // setThreadsData((oldThreads: any) => uniqBy([...oldThreads, ...newThreads], ({ id }) => id));
195
- // }
196
- // });
197
- }, []);
198
-
199
- const fetchMoreThreads = useCallback(() => {
200
- refetch({
201
- channelId: channelId?.toString(),
202
- role: role?.toString(),
203
- skip: threads?.length,
204
- });
205
- }, []);
206
-
207
- // if (!threadReplies || threadReplies?.length == 0) {
208
- // return (
209
- // <Center w="full" bg={'f8f8f8'} height={'full'}>
210
- // You don't have any message yet!
211
- // </Center>
212
- // );
213
- // }
214
- console.log('threadLoading', threadLoading, ' threads?.length=', threads?.length);
215
-
216
- return (
217
- <Box className="flex-1 p-2 pb-0 bg-gray-100 dark:border-gray-600 dark:bg-gray-700">
218
- <FlatList
219
- style={{ flex: 1 }}
220
- data={threads && threads?.length > 0 ? threads : []}
221
- onRefresh={handleRefresh}
222
- refreshing={threadLoading}
223
- contentContainerStyle={{ paddingBottom: 60 }}
224
- ItemSeparatorComponent={() => <Box className="h-0.5 bg-gray-200" />}
225
- renderItem={({ item: thread, index }) => (
226
- <ThreadViewItem
227
- key={index}
228
- onOpen={handleSelectThread}
229
- currentUser={auth}
230
- thread={thread}
231
- role={role}
232
- setData={setData}
233
- />
234
- )}
235
- ListEmptyComponent={() => (
236
- <>
237
- {/* {!threadLoading || threads?.length == 0} */}
238
- {!threadLoading && threads?.length == 0 && (
239
- <Box className="p-5">
240
- <Center className="mt-6">
241
- <Ionicons name="chatbubbles" size={50} />
242
- <Text>You don't have any message yet!</Text>
243
- </Center>
244
- </Box>
245
- )}
246
- </>
247
- )}
248
- ListFooterComponent={() => (
249
- <>
250
- <SubscriptionHandler
251
- channelId={channelId}
252
- subscribeToNewMessages={() =>
253
- subscribeToMore({
254
- document: THREAD_CHAT_ADDED,
255
- variables: {
256
- channelId: channelId?.toString(),
257
- postParentId: null,
258
- },
259
- updateQuery: (prev, { subscriptionData }: any) => {
260
- if (!subscriptionData.data) return prev;
261
- const newPostThreadData: any =
262
- subscriptionData?.data?.threadCreatedUpdated?.data;
263
- const newMessage: any =
264
- subscriptionData?.data?.threadCreatedUpdated?.lastMessage;
265
- const data = prev?.threadMessages?.data?.map((t: any) =>
266
- t.id === newPostThreadData?.id
267
- ? {
268
- ...t,
269
- replies: [newMessage, ...t?.replies],
270
- replyCount: newPostThreadData?.replyCount,
271
- lastReplyAt: newPostThreadData?.lastReplyAt,
272
- updatedAt: newPostThreadData?.updatedAt,
273
- }
274
- : t,
275
- );
276
-
277
- return Object.assign({}, prev, {
278
- threadMessages: {
279
- ...prev?.threadMessages,
280
- // totalCount: prev?.threadMessages?.totalCount + 1,
281
- data: data,
282
- },
283
- });
284
- },
285
- })
286
- }
287
- />
288
- </>
289
- )}
290
- keyExtractor={(item, index) => 'threads-view-key' + index}
291
- onEndReached={fetchMoreThreads}
292
- onEndReachedThreshold={0.1}
293
- />
294
- </Box>
295
- );
296
- };
297
-
298
- const SubscriptionHandler = ({ subscribeToNewMessages, channelId }: IThreadSubscriptionHandlerProps) => {
299
- useEffect(() => subscribeToNewMessages(), [channelId]);
300
- return <></>;
301
- };
302
-
303
- export const ThreadsView = ThreadsViewComponent;
304
-
305
- // export const ThreadsView = React.memo(ThreadsViewComponent);
@@ -1,20 +0,0 @@
1
- import { ApolloError, FetchResult, SingleExecutionResult } from '@apollo/client';
2
-
3
- // Accept any promise-like object with a data field
4
- export const newHandleMutationResult = async (
5
- promise: Promise<any>,
6
- transformer: (result: any) => any,
7
- ): Promise<any> => {
8
- try {
9
- const result = await promise;
10
- if (result.errors) {
11
- throw result.errors;
12
- }
13
- if (!result.data) {
14
- throw new Error('No data returned from query');
15
- }
16
- return transformer(result.data);
17
- } catch (error: any) {
18
- throw error;
19
- }
20
- };
@@ -1,313 +0,0 @@
1
- import { assign, setup } from 'xstate';
2
- import { merge } from 'lodash-es';
3
-
4
- export const enum Actions {
5
- INITIAL_CONTEXT = 'INITIAL_CONTEXT',
6
- ERROR_HANDLED = 'ERROR_HANDLED',
7
- SEND_MESSAGE = 'SEND_MESSAGE',
8
- SEND_MESSAGE_WITH_FILE = 'SEND_MESSAGE_WITH_FILE',
9
- SET_CHANNEL_MESSAGES = 'SET_CHANNEL_MESSAGES',
10
- CLEAR_MESSAGES = 'CLEAR_MESSAGES',
11
- FETCH_MORE_MESSAGES = 'FETCH_MORE_MESSAGES',
12
- SUBSCRIBE_TO_MESSAGES = 'SUBSCRIBE_TO_MESSAGES',
13
- CREATE_DIRECT_CHANNEL = 'CREATE_DIRECT_CHANNEL',
14
- START_LOADING = 'START_LOADING',
15
- STOP_LOADING = 'STOP_LOADING',
16
- SET_IMAGE = 'SET_IMAGE',
17
- CLEAR_IMAGE = 'CLEAR_IMAGE',
18
- SET_MESSAGE_TEXT = 'SET_MESSAGE_TEXT',
19
- }
20
-
21
- export const enum BaseState {
22
- Idle = 'idle',
23
- Error = 'error',
24
- Loading = 'loading',
25
- Done = 'done',
26
- FetchChannels = 'fetchChannels',
27
- FetchMessages = 'fetchMessages',
28
- }
29
-
30
- export const enum MainState {
31
- SendMessage = 'sendMessage',
32
- SendMessageWithFile = 'sendMessageWithFile',
33
- FetchMoreMessages = 'fetchMoreMessages',
34
- CreateDirectChannel = 'createDirectChannel',
35
- }
36
-
37
- export const conversationXstate = setup({
38
- types: {
39
- context: {} as {
40
- channelId: string | null;
41
- channelMessages: any[];
42
- totalCount: number;
43
- skip: number;
44
- loading: boolean;
45
- loadingOldMessages: boolean;
46
- error: string | null;
47
- selectedImage: string;
48
- files: any[];
49
- images: any[];
50
- messageText: string;
51
- imageLoading: boolean;
52
- },
53
- },
54
- actions: {
55
- errorState: assign(({ context, event }) => {
56
- return {
57
- ...context,
58
- error: event.data?.message || 'An error occurred',
59
- loading: false,
60
- loadingOldMessages: false,
61
- imageLoading: false,
62
- };
63
- }),
64
- setInitialContext: assign(({ context, event }) => {
65
- return merge({
66
- ...context,
67
- channelId: event.data?.channelId || null,
68
- loading: false,
69
- });
70
- }),
71
- setChannelMessages: assign(({ context, event }) => {
72
- return {
73
- ...context,
74
- channelMessages: event.data?.messages || [],
75
- totalCount: event.data?.totalCount || 0,
76
- loading: false,
77
- };
78
- }),
79
- addChannelMessages: assign(({ context, event }) => {
80
- const messages = event.data?.messages || [];
81
- return {
82
- ...context,
83
- channelMessages: [...context.channelMessages, ...messages],
84
- loadingOldMessages: false,
85
- };
86
- }),
87
- addNewMessage: assign(({ context, event }) => {
88
- const message = event.data?.message;
89
- if (!message) return context;
90
-
91
- return {
92
- ...context,
93
- channelMessages: [...context.channelMessages, message],
94
- totalCount: context.totalCount + 1,
95
- loading: false,
96
- };
97
- }),
98
- updateSkip: assign(({ context, event }) => {
99
- return {
100
- ...context,
101
- skip: context.channelMessages.length,
102
- loadingOldMessages: true,
103
- };
104
- }),
105
- clearMessages: assign(({ context }) => {
106
- return {
107
- ...context,
108
- channelMessages: [],
109
- totalCount: 0,
110
- skip: 0,
111
- };
112
- }),
113
- setChannelId: assign(({ context, event }) => {
114
- return {
115
- ...context,
116
- channelId: event.data?.channelId || null,
117
- };
118
- }),
119
- startLoading: assign(({ context }) => {
120
- return {
121
- ...context,
122
- loading: true,
123
- };
124
- }),
125
- stopLoading: assign(({ context }) => {
126
- return {
127
- ...context,
128
- loading: false,
129
- };
130
- }),
131
- startImageLoading: assign(({ context }) => {
132
- return {
133
- ...context,
134
- imageLoading: true,
135
- };
136
- }),
137
- stopImageLoading: assign(({ context }) => {
138
- return {
139
- ...context,
140
- imageLoading: false,
141
- };
142
- }),
143
- setSelectedImage: assign(({ context, event }) => {
144
- return {
145
- ...context,
146
- selectedImage: event.data?.image || '',
147
- files: event.data?.files || context.files,
148
- images: event.data?.images || context.images,
149
- imageLoading: false,
150
- };
151
- }),
152
- clearImageData: assign(({ context }) => {
153
- return {
154
- ...context,
155
- selectedImage: '',
156
- files: [],
157
- images: [],
158
- };
159
- }),
160
- setMessageText: assign(({ context, event }) => {
161
- return {
162
- ...context,
163
- messageText: event.data?.messageText || '',
164
- };
165
- }),
166
- },
167
- guards: {
168
- hasMoreMessages: ({ context }) => {
169
- return context.totalCount > context.channelMessages.length;
170
- },
171
- },
172
- }).createMachine({
173
- id: 'conversation-view',
174
- initial: BaseState.Idle,
175
- context: {
176
- channelId: null,
177
- channelMessages: [],
178
- totalCount: 0,
179
- skip: 0,
180
- loading: false,
181
- loadingOldMessages: false,
182
- error: null,
183
- selectedImage: '',
184
- files: [],
185
- images: [],
186
- messageText: '',
187
- imageLoading: false,
188
- },
189
- states: {
190
- [BaseState.Idle]: {
191
- on: {
192
- [Actions.INITIAL_CONTEXT]: {
193
- target: BaseState.FetchMessages,
194
- actions: ['setInitialContext'],
195
- },
196
- [Actions.SEND_MESSAGE]: {
197
- target: MainState.SendMessage,
198
- actions: ['startLoading'],
199
- },
200
- [Actions.SEND_MESSAGE_WITH_FILE]: {
201
- target: MainState.SendMessageWithFile,
202
- actions: ['startLoading'],
203
- },
204
- [Actions.FETCH_MORE_MESSAGES]: {
205
- target: MainState.FetchMoreMessages,
206
- actions: ['updateSkip'],
207
- guard: 'hasMoreMessages',
208
- },
209
- [Actions.CLEAR_MESSAGES]: {
210
- target: BaseState.Idle,
211
- actions: ['clearMessages'],
212
- },
213
- [Actions.CREATE_DIRECT_CHANNEL]: {
214
- target: MainState.CreateDirectChannel,
215
- actions: ['startLoading'],
216
- },
217
- [Actions.START_LOADING]: {
218
- target: BaseState.Idle,
219
- actions: ['startLoading'],
220
- },
221
- [Actions.STOP_LOADING]: {
222
- target: BaseState.Idle,
223
- actions: ['stopLoading'],
224
- },
225
- [Actions.SET_IMAGE]: {
226
- target: BaseState.Idle,
227
- actions: ['setSelectedImage'],
228
- },
229
- [Actions.CLEAR_IMAGE]: {
230
- target: BaseState.Idle,
231
- actions: ['clearImageData'],
232
- },
233
- [Actions.SET_MESSAGE_TEXT]: {
234
- target: BaseState.Idle,
235
- actions: ['setMessageText'],
236
- },
237
- },
238
- },
239
- [BaseState.Error]: {
240
- entry: ['errorState'],
241
- on: {
242
- [Actions.ERROR_HANDLED]: {
243
- target: BaseState.Idle,
244
- },
245
- },
246
- },
247
- [BaseState.FetchMessages]: {
248
- invoke: {
249
- src: 'fetchMessages',
250
- input: ({ context, event }) => ({ context, event }),
251
- onDone: {
252
- target: BaseState.Idle,
253
- actions: ['setChannelMessages'],
254
- },
255
- onError: {
256
- target: BaseState.Error,
257
- },
258
- },
259
- },
260
- [MainState.SendMessage]: {
261
- invoke: {
262
- src: 'sendMessage',
263
- input: ({ context, event }) => ({ context, event }),
264
- onDone: {
265
- target: BaseState.Idle,
266
- actions: ['addNewMessage', 'stopLoading'],
267
- },
268
- onError: {
269
- target: BaseState.Error,
270
- },
271
- },
272
- },
273
- [MainState.SendMessageWithFile]: {
274
- invoke: {
275
- src: 'sendMessageWithFile',
276
- input: ({ context, event }) => ({ context, event }),
277
- onDone: {
278
- target: BaseState.Idle,
279
- actions: ['addNewMessage', 'clearImageData', 'stopLoading'],
280
- },
281
- onError: {
282
- target: BaseState.Error,
283
- },
284
- },
285
- },
286
- [MainState.FetchMoreMessages]: {
287
- invoke: {
288
- src: 'fetchMoreMessages',
289
- input: ({ context, event }) => ({ context, event }),
290
- onDone: {
291
- target: BaseState.Idle,
292
- actions: ['addChannelMessages'],
293
- },
294
- onError: {
295
- target: BaseState.Error,
296
- },
297
- },
298
- },
299
- [MainState.CreateDirectChannel]: {
300
- invoke: {
301
- src: 'createDirectChannel',
302
- input: ({ context, event }) => ({ context, event }),
303
- onDone: {
304
- target: BaseState.Idle,
305
- actions: ['setChannelId', 'stopLoading'],
306
- },
307
- onError: {
308
- target: BaseState.Error,
309
- },
310
- },
311
- },
312
- },
313
- } as any);