@messenger-box/platform-mobile 10.0.3-alpha.16 → 10.0.3-alpha.162

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 (95) hide show
  1. package/CHANGELOG.md +248 -0
  2. package/lib/compute.js +2 -3
  3. package/lib/compute.js.map +1 -1
  4. package/lib/index.js.map +1 -1
  5. package/lib/module.js.map +1 -1
  6. package/lib/queries/inboxQueries.js +65 -0
  7. package/lib/queries/inboxQueries.js.map +1 -0
  8. package/lib/routes.json +13 -1
  9. package/lib/screens/inbox/DialogMessages.js +5 -3
  10. package/lib/screens/inbox/DialogMessages.js.map +1 -1
  11. package/lib/screens/inbox/DialogThreadMessages.js +3 -7
  12. package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
  13. package/lib/screens/inbox/DialogThreads.js +57 -18
  14. package/lib/screens/inbox/DialogThreads.js.map +1 -1
  15. package/lib/screens/inbox/Inbox.js.map +1 -1
  16. package/lib/screens/inbox/components/CachedImage/consts.js +1 -1
  17. package/lib/screens/inbox/components/CachedImage/consts.js.map +1 -1
  18. package/lib/screens/inbox/components/CachedImage/index.js +168 -46
  19. package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
  20. package/lib/screens/inbox/components/DialogItem.js +169 -0
  21. package/lib/screens/inbox/components/DialogItem.js.map +1 -0
  22. package/lib/screens/inbox/components/GiftedChatInboxComponent.js +313 -0
  23. package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -0
  24. package/lib/screens/inbox/components/SlackMessageContainer/ImageViewerModal.js.map +1 -1
  25. package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js +197 -0
  26. package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js.map +1 -0
  27. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +141 -31
  28. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
  29. package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js.map +1 -1
  30. package/lib/screens/inbox/components/SubscriptionHandler.js +24 -0
  31. package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -0
  32. package/lib/screens/inbox/components/ThreadsViewItem.js +66 -44
  33. package/lib/screens/inbox/components/ThreadsViewItem.js.map +1 -1
  34. package/lib/screens/inbox/config/config.js +2 -2
  35. package/lib/screens/inbox/config/config.js.map +1 -1
  36. package/lib/screens/inbox/containers/ConversationView.js +1205 -432
  37. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  38. package/lib/screens/inbox/containers/Dialogs.js +193 -80
  39. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  40. package/lib/screens/inbox/containers/ThreadConversationView.js +724 -207
  41. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  42. package/lib/screens/inbox/containers/ThreadsView.js +83 -50
  43. package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
  44. package/lib/screens/inbox/hooks/useInboxMessages.js +31 -0
  45. package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -0
  46. package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js +108 -0
  47. package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js.map +1 -0
  48. package/lib/screens/inbox/workflow/dialog-threads-xstate.js +151 -0
  49. package/lib/screens/inbox/workflow/dialog-threads-xstate.js.map +1 -0
  50. package/package.json +5 -5
  51. package/src/index.ts +2 -0
  52. package/src/queries/inboxQueries.ts +299 -0
  53. package/src/queries/index.d.ts +2 -0
  54. package/src/queries/index.ts +1 -0
  55. package/src/screens/inbox/DialogMessages.tsx +2 -1
  56. package/src/screens/inbox/DialogThreadMessages.tsx +3 -11
  57. package/src/screens/inbox/DialogThreads.tsx +53 -60
  58. package/src/screens/inbox/components/Actionsheet.tsx +30 -0
  59. package/src/screens/inbox/components/CachedImage/consts.ts +4 -3
  60. package/src/screens/inbox/components/CachedImage/index.tsx +232 -61
  61. package/src/screens/inbox/components/DialogItem.tsx +306 -0
  62. package/src/screens/inbox/components/DialogsListItem.tsx +230 -170
  63. package/src/screens/inbox/components/ExpandableInput.tsx +460 -0
  64. package/src/screens/inbox/components/ExpandableInputActionSheet.tsx +518 -0
  65. package/src/screens/inbox/components/GiftedChatInboxComponent.tsx +411 -0
  66. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +330 -171
  67. package/src/screens/inbox/components/SlackInput.tsx +23 -0
  68. package/src/screens/inbox/components/SlackMessageContainer/PaymentMessage.tsx +199 -0
  69. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +233 -23
  70. package/src/screens/inbox/components/SmartLoader.tsx +61 -0
  71. package/src/screens/inbox/components/SubscriptionHandler.tsx +41 -0
  72. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +41 -24
  73. package/src/screens/inbox/components/ThreadsViewItem.tsx +177 -265
  74. package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +145 -0
  75. package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +159 -0
  76. package/src/screens/inbox/config/config.ts +2 -2
  77. package/src/screens/inbox/containers/ConversationView.tsx +2004 -698
  78. package/src/screens/inbox/containers/ConversationView.tsx.bk +1467 -0
  79. package/src/screens/inbox/containers/Dialogs.tsx +402 -196
  80. package/src/screens/inbox/containers/SupportServiceDialogs.tsx +2 -2
  81. package/src/screens/inbox/containers/ThreadConversationView.tsx +1337 -301
  82. package/src/screens/inbox/containers/ThreadsView.tsx +105 -186
  83. package/src/screens/inbox/containers/workflow/apollo/handleResult.ts +20 -0
  84. package/src/screens/inbox/containers/workflow/conversation-xstate.ts +313 -0
  85. package/src/screens/inbox/containers/workflow/dialogs-xstate.ts +196 -0
  86. package/src/screens/inbox/containers/workflow/thread-conversation-xstate.ts +401 -0
  87. package/src/screens/inbox/hooks/useInboxMessages.ts +34 -0
  88. package/src/screens/inbox/hooks/useSafeDialogThreadsMachine.ts +136 -0
  89. package/src/screens/inbox/index.ts +37 -0
  90. package/src/screens/inbox/machines/threadsMachine.ts +147 -0
  91. package/src/screens/inbox/workflow/dialog-threads-xstate.ts +163 -0
  92. package/lib/screens/inbox/components/DialogsListItem.js +0 -175
  93. package/lib/screens/inbox/components/DialogsListItem.js.map +0 -1
  94. package/lib/screens/inbox/components/ServiceDialogsListItem.js +0 -165
  95. package/lib/screens/inbox/components/ServiceDialogsListItem.js.map +0 -1
@@ -0,0 +1,147 @@
1
+ import { orderBy, uniqBy } from 'lodash-es';
2
+ import { config } from '../config';
3
+ import { THREAD_CREATED_UPDATED } from '../../../queries/inboxQueries';
4
+
5
+ const { MESSAGES_PER_PAGE } = config;
6
+
7
+ // Define more specific types for threads and thread data
8
+ export interface Thread {
9
+ id: string;
10
+ updatedAt?: string | number; // Make updatedAt optional to match the GraphQL response
11
+ [key: string]: any;
12
+ }
13
+
14
+ export interface ThreadsData {
15
+ threadMessages?: {
16
+ data: Thread[] | any[]; // Allow any[] to accommodate GraphQL response types
17
+ };
18
+ [key: string]: any; // Allow additional properties from GraphQL responses
19
+ }
20
+
21
+ export interface ThreadsContext {
22
+ threads: Thread[];
23
+ loading: boolean;
24
+ error: any;
25
+ channelId?: string;
26
+ role?: string;
27
+ refreshing: boolean;
28
+ }
29
+
30
+ // Type for refetch function
31
+ export type RefetchFunction = (variables: any) => Promise<{ data?: any }>;
32
+
33
+ // Type for subscription function
34
+ export type SubscribeFunction = (options: {
35
+ document: any;
36
+ variables: any;
37
+ updateQuery: (prev: any, { subscriptionData }: any) => any;
38
+ }) => () => void;
39
+
40
+ // Define machine actions and services with proper typing
41
+ export const threadsMachineConfig = {
42
+ // Services
43
+ fetchThreads: (refetch: RefetchFunction, context: ThreadsContext) => {
44
+ if (!context.channelId) return Promise.resolve({ data: undefined });
45
+
46
+ return refetch({
47
+ channelId: context.channelId?.toString(),
48
+ role: context.role?.toString(),
49
+ limit: MESSAGES_PER_PAGE,
50
+ repliesLimit2: 5,
51
+ });
52
+ },
53
+
54
+ fetchMoreThreads: (refetch: RefetchFunction, context: ThreadsContext) => {
55
+ if (!context.channelId || !context.threads?.length) {
56
+ return Promise.resolve({ data: undefined });
57
+ }
58
+
59
+ return refetch({
60
+ channelId: context.channelId?.toString(),
61
+ role: context.role?.toString(),
62
+ skip: context.threads?.length,
63
+ });
64
+ },
65
+
66
+ refreshThreads: (refetch: RefetchFunction, context: ThreadsContext) => {
67
+ if (!context.channelId) return Promise.resolve({ data: undefined });
68
+
69
+ return refetch({
70
+ channelId: context.channelId?.toString(),
71
+ role: context.role?.toString(),
72
+ limit: MESSAGES_PER_PAGE,
73
+ repliesLimit2: 5,
74
+ });
75
+ },
76
+
77
+ // Actions - optimized for performance with proper type handling
78
+ setThreadData: (data: ThreadsData): Thread[] => {
79
+ if (!data?.threadMessages?.data) return [];
80
+
81
+ const threadsData = data.threadMessages.data;
82
+ if (!threadsData.length) return [];
83
+
84
+ // Use a more efficient process with proper typing
85
+ const threadsFiltered = uniqBy(threadsData, 'id');
86
+ return orderBy(threadsFiltered, ['updatedAt'], ['desc']) || [];
87
+ },
88
+
89
+ appendThreadData: (existingThreads: Thread[], data: ThreadsData): Thread[] => {
90
+ if (!data?.threadMessages?.data) return existingThreads;
91
+
92
+ const newThreads = data.threadMessages.data;
93
+ if (!newThreads.length) return existingThreads;
94
+
95
+ // Use a more efficient combination process
96
+ const combinedThreads = uniqBy([...existingThreads, ...newThreads], 'id');
97
+ return orderBy(combinedThreads, ['updatedAt'], ['desc']) || [];
98
+ },
99
+
100
+ updateThreadData: (oldThreads: Thread[], newThread: Thread | null): Thread[] => {
101
+ if (!newThread) return oldThreads;
102
+ if (!oldThreads?.length) return [newThread]; // Handle empty array case efficiently
103
+
104
+ // Check if thread exists to avoid unnecessary array copy
105
+ const index = oldThreads.findIndex((el) => el.id === newThread.id);
106
+
107
+ let updatedThreads: Thread[];
108
+ if (index > -1) {
109
+ // Create a new array only if we're updating
110
+ updatedThreads = [...oldThreads];
111
+ updatedThreads[index] = newThread;
112
+ } else {
113
+ // Simply add the new thread at the beginning for efficiency
114
+ updatedThreads = [newThread, ...oldThreads];
115
+ }
116
+
117
+ return orderBy(updatedThreads, ['updatedAt'], ['desc']) || [];
118
+ },
119
+ };
120
+
121
+ // Optimized function to subscribe to thread updates
122
+ export const setupThreadSubscription = (
123
+ subscribeToMore: SubscribeFunction | undefined,
124
+ channelId: string | undefined,
125
+ ): (() => void) | undefined => {
126
+ if (!subscribeToMore || !channelId) return undefined;
127
+
128
+ return subscribeToMore({
129
+ document: THREAD_CREATED_UPDATED,
130
+ variables: { channelId: channelId?.toString() },
131
+ updateQuery: (prev, { subscriptionData }) => {
132
+ if (!subscriptionData?.data) return prev;
133
+
134
+ const newThread = subscriptionData.data.threadCreatedUpdated?.data;
135
+ if (!newThread) return prev;
136
+
137
+ // Only create a new object if needed to optimize for unnecessary renders
138
+ return {
139
+ ...prev,
140
+ threadMessages: {
141
+ ...prev.threadMessages,
142
+ data: uniqBy([newThread, ...(prev.threadMessages?.data || [])], 'id'),
143
+ },
144
+ };
145
+ },
146
+ });
147
+ };
@@ -0,0 +1,163 @@
1
+ import { assign, setup } from 'xstate';
2
+ import { threadsMachineConfig } from '../machines/threadsMachine';
3
+
4
+ export enum BaseState {
5
+ Idle = 'idle',
6
+ LoadingChannel = 'loadingChannel',
7
+ LoadingThreads = 'loadingThreads',
8
+ Active = 'active',
9
+ Error = 'error',
10
+ }
11
+
12
+ export enum Actions {
13
+ INITIALIZE = 'INITIALIZE',
14
+ FETCH_CHANNEL_DETAIL = 'FETCH_CHANNEL_DETAIL',
15
+ SET_CHANNEL_DETAIL = 'SET_CHANNEL_DETAIL',
16
+ FETCH_THREADS = 'FETCH_THREADS',
17
+ SET_THREADS = 'SET_THREADS',
18
+ ERROR = 'ERROR',
19
+ }
20
+
21
+ // Type definitions for the event data
22
+ type InitializeEventData = { channelId?: string; postParentId?: string; role?: string };
23
+ type ChannelDetailEventData = { id: string };
24
+ type SetChannelDetailEventData = { channelsDetail: any };
25
+ type SetThreadsEventData = { threadData: any[] };
26
+ type ErrorEventData = { error: any };
27
+
28
+ export const dialogThreadsXstate = setup({
29
+ types: {
30
+ context: {} as {
31
+ channelId?: string;
32
+ postParentId?: string;
33
+ role?: string;
34
+ channelsDetail: any;
35
+ threadData: any[];
36
+ loading: boolean;
37
+ error: any;
38
+ },
39
+ events: {} as
40
+ | { type: typeof Actions.INITIALIZE; data: InitializeEventData }
41
+ | { type: typeof Actions.FETCH_CHANNEL_DETAIL; data: ChannelDetailEventData }
42
+ | { type: typeof Actions.SET_CHANNEL_DETAIL; data: SetChannelDetailEventData }
43
+ | { type: typeof Actions.FETCH_THREADS; data?: {} }
44
+ | { type: typeof Actions.SET_THREADS; data: SetThreadsEventData }
45
+ | { type: typeof Actions.ERROR; data: ErrorEventData },
46
+ },
47
+ actions: {
48
+ setInitialContext: assign({
49
+ channelId: ({ event }) => {
50
+ if (event.type === Actions.INITIALIZE) {
51
+ return event.data.channelId;
52
+ }
53
+ return undefined;
54
+ },
55
+ postParentId: ({ event }) => {
56
+ if (event.type === Actions.INITIALIZE) {
57
+ return event.data.postParentId;
58
+ }
59
+ return undefined;
60
+ },
61
+ role: ({ event }) => {
62
+ if (event.type === Actions.INITIALIZE) {
63
+ return event.data.role;
64
+ }
65
+ return undefined;
66
+ },
67
+ loading: true,
68
+ error: null,
69
+ }),
70
+ setChannelDetail: assign({
71
+ channelsDetail: ({ event }) => {
72
+ if (event.type === Actions.SET_CHANNEL_DETAIL) {
73
+ return event.data.channelsDetail;
74
+ }
75
+ return null;
76
+ },
77
+ loading: false,
78
+ }),
79
+ setThreads: assign({
80
+ threadData: ({ event }) => {
81
+ if (event.type === Actions.SET_THREADS) {
82
+ return event.data.threadData;
83
+ }
84
+ return [];
85
+ },
86
+ loading: false,
87
+ }),
88
+ setError: assign({
89
+ error: ({ event }) => {
90
+ if (event.type === Actions.ERROR) {
91
+ return event.data.error;
92
+ }
93
+ return null;
94
+ },
95
+ loading: false,
96
+ }),
97
+ setLoading: assign({
98
+ loading: true,
99
+ }),
100
+ },
101
+ }).createMachine({
102
+ id: 'dialogThreads',
103
+ initial: BaseState.Idle,
104
+ context: {
105
+ channelId: undefined,
106
+ postParentId: undefined,
107
+ role: undefined,
108
+ channelsDetail: null,
109
+ threadData: [],
110
+ loading: true,
111
+ error: null,
112
+ },
113
+ states: {
114
+ [BaseState.Idle]: {
115
+ on: {
116
+ [Actions.INITIALIZE]: {
117
+ target: BaseState.LoadingChannel,
118
+ actions: 'setInitialContext',
119
+ },
120
+ },
121
+ },
122
+ [BaseState.LoadingChannel]: {
123
+ on: {
124
+ [Actions.SET_CHANNEL_DETAIL]: {
125
+ target: BaseState.LoadingThreads,
126
+ actions: 'setChannelDetail',
127
+ },
128
+ [Actions.ERROR]: {
129
+ target: BaseState.Error,
130
+ actions: 'setError',
131
+ },
132
+ },
133
+ },
134
+ [BaseState.LoadingThreads]: {
135
+ on: {
136
+ [Actions.SET_THREADS]: {
137
+ target: BaseState.Active,
138
+ actions: 'setThreads',
139
+ },
140
+ [Actions.ERROR]: {
141
+ target: BaseState.Error,
142
+ actions: 'setError',
143
+ },
144
+ },
145
+ },
146
+ [BaseState.Active]: {
147
+ on: {
148
+ [Actions.FETCH_THREADS]: {
149
+ target: BaseState.LoadingThreads,
150
+ actions: 'setLoading',
151
+ },
152
+ },
153
+ },
154
+ [BaseState.Error]: {
155
+ on: {
156
+ [Actions.INITIALIZE]: {
157
+ target: BaseState.LoadingChannel,
158
+ actions: 'setInitialContext',
159
+ },
160
+ },
161
+ },
162
+ },
163
+ });
@@ -1,175 +0,0 @@
1
- import React__default,{useState,useMemo}from'react';import {Pressable,HStack,Box,AvatarGroup,Avatar,AvatarFallbackText,AvatarBadge,Text,AvatarImage}from'@admin-layout/gluestack-ui-mobile';import {isToday,isYesterday,format}from'date-fns';import {useFocusEffect}from'@react-navigation/native';import {useMessagesQuery,useOnChatMessageAddedSubscription,OnChatMessageAddedDocument}from'common/graphql';import {startCase}from'lodash-es';import colors from'tailwindcss/colors';var __defProp = Object.defineProperty;
2
- var __defProps = Object.defineProperties;
3
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
- var __spreadValues = (a, b) => {
9
- for (var prop in b || (b = {}))
10
- if (__hasOwnProp.call(b, prop))
11
- __defNormalProp(a, prop, b[prop]);
12
- if (__getOwnPropSymbols)
13
- for (var prop of __getOwnPropSymbols(b)) {
14
- if (__propIsEnum.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- }
17
- return a;
18
- };
19
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
- const createdAtText = (value) => {
21
- if (!value)
22
- return "";
23
- let date = new Date(value);
24
- if (isToday(date))
25
- return "Today";
26
- if (isYesterday(date))
27
- return "Yesterday";
28
- return format(new Date(value), "MMM dd, yyyy");
29
- };
30
- const DialogsListItemComponent = function DialogsListItem2({
31
- currentUser,
32
- selectedChannelId,
33
- channel,
34
- onOpen
35
- }) {
36
- var _a, _b, _c;
37
- const parentId = null;
38
- const [messages, setMessages] = useState([]);
39
- const {
40
- data: messagesQuery,
41
- loading: messageLoading,
42
- refetch: refetchMessages,
43
- subscribeToMore
44
- } = useMessagesQuery({
45
- variables: {
46
- channelId: (_a = channel == null ? void 0 : channel.id) == null ? void 0 : _a.toString(),
47
- parentId,
48
- limit: 10
49
- },
50
- fetchPolicy: "cache-and-network",
51
- refetchWritePolicy: "merge"
52
- });
53
- const {
54
- data: newMessage,
55
- loading: newMsgLoading,
56
- error: newMsgError
57
- } = useOnChatMessageAddedSubscription({
58
- variables: {
59
- channelId: (_b = channel == null ? void 0 : channel.id) == null ? void 0 : _b.toString()
60
- }
61
- });
62
- useFocusEffect(React__default.useCallback(() => {
63
- var _a2;
64
- refetchMessages({
65
- channelId: (_a2 = channel == null ? void 0 : channel.id) == null ? void 0 : _a2.toString(),
66
- parentId,
67
- limit: 10
68
- });
69
- return () => {
70
- };
71
- }, []));
72
- React__default.useEffect(() => {
73
- var _a2, _b2, _c2;
74
- if (messagesQuery) {
75
- if ((_b2 = (_a2 = messagesQuery == null ? void 0 : messagesQuery.messages) == null ? void 0 : _a2.data) == null ? void 0 : _b2.length) {
76
- const msg = (_c2 = messagesQuery == null ? void 0 : messagesQuery.messages) == null ? void 0 : _c2.data;
77
- setMessages((pre) => [...pre, ...msg]);
78
- }
79
- }
80
- }, [messagesQuery]);
81
- const lastMessage = useMemo(() => {
82
- var _a2;
83
- if (!(messages == null ? void 0 : messages.length)) {
84
- return null;
85
- }
86
- const data = messages;
87
- const filteredData = data == null ? void 0 : data.filter((p) => (p == null ? void 0 : p.message) !== "");
88
- let filteredLastMessage = filteredData && (filteredData == null ? void 0 : filteredData.length) ? (_a2 = filteredData == null ? void 0 : filteredData.reduce((a, b) => {
89
- return new Date(a == null ? void 0 : a.updatedAt) > new Date(b == null ? void 0 : b.updatedAt) ? a : b;
90
- }, [])) != null ? _a2 : null : null;
91
- return filteredLastMessage;
92
- }, [messages]);
93
- const channelMembers = useMemo(() => {
94
- var _a2, _b2, _c2;
95
- return (_c2 = (_b2 = (_a2 = channel == null ? void 0 : channel.members) == null ? void 0 : _a2.filter((ch) => {
96
- var _a3, _b3;
97
- return ((_a3 = ch == null ? void 0 : ch.user) == null ? void 0 : _a3.id) != (currentUser == null ? void 0 : currentUser.id) && ((_b3 = ch == null ? void 0 : ch.user) == null ? void 0 : _b3.__typename) == "UserAccount";
98
- })) == null ? void 0 : _b2.map((m) => m == null ? void 0 : m.user)) != null ? _c2 : null;
99
- }, [currentUser, channel]);
100
- const title = useMemo(() => {
101
- var _a2, _b2, _c2;
102
- const titleString = (_c2 = (_b2 = (_a2 = channelMembers == null ? void 0 : channelMembers.map((u) => {
103
- var _a3;
104
- return (u == null ? void 0 : u.givenName) + " " + ((_a3 = u == null ? void 0 : u.familyName) != null ? _a3 : "");
105
- })) == null ? void 0 : _a2.filter((mu) => mu)) == null ? void 0 : _b2.join(", ")) != null ? _c2 : "";
106
- const length = 30;
107
- return titleString.length > length ? titleString.substring(0, length - 3) + "..." : titleString;
108
- }, [channelMembers]);
109
- return /* @__PURE__ */ React__default.createElement(Pressable, { onPress: () => (channel == null ? void 0 : channel.id) !== selectedChannelId && onOpen(channel == null ? void 0 : channel.id, title), className: "flex-1 border-gray-200 rounded-md dark:border-gray-600 dark:bg-gray-700", style: {
110
- borderBottomWidth: 1,
111
- borderColor: "#e5e7eb",
112
- marginVertical: 0,
113
- paddingHorizontal: 10
114
- } }, /* @__PURE__ */ React__default.createElement(HStack, { space: "md", className: "flex-1 w-[100%] py-3 items-center" }, /* @__PURE__ */ React__default.createElement(Box, { className: "flex-[0.1] items-start pl-3" }, /* @__PURE__ */ React__default.createElement(AvatarGroup, null, channelMembers && (channelMembers == null ? void 0 : channelMembers.length) > 0 && ((_c = channelMembers == null ? void 0 : channelMembers.slice(0, 1)) == null ? void 0 : _c.map((ch, i) => {
115
- var _a2;
116
- return /* @__PURE__ */ React__default.createElement(Avatar, { key: "dialogs-list-" + i, size: "sm", className: `bg-transparent top-[${i == 1 ? "4" : "0"}] right-[${i == 1 ? "-2" : "0"}] z-[${i == 1 ? 5 : 1}]` }, /* @__PURE__ */ React__default.createElement(AvatarFallbackText, null, startCase((_a2 = ch == null ? void 0 : ch.username) == null ? void 0 : _a2.charAt(0))), (channelMembers == null ? void 0 : channelMembers.length) > 1 && /* @__PURE__ */ React__default.createElement(AvatarBadge, { style: {
117
- width: "100%",
118
- height: "100%",
119
- backgroundColor: "#e5e7eb",
120
- borderRadius: 5
121
- }, className: "items-center justify-center bg-gray-200 rounded-md" }, /* @__PURE__ */ React__default.createElement(Text, { style: {
122
- fontSize: 12,
123
- fontWeight: "bold",
124
- color: "#000"
125
- } }, channelMembers == null ? void 0 : channelMembers.length)), (channelMembers == null ? void 0 : channelMembers.length) == 1 && /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(AvatarImage, { alt: "user image", style: {
126
- borderRadius: 6,
127
- borderWidth: 2,
128
- borderColor: "#fff"
129
- }, source: {
130
- uri: ch == null ? void 0 : ch.picture
131
- } }), /* @__PURE__ */ React__default.createElement(AvatarBadge, { style: {
132
- width: 10,
133
- height: 10
134
- } })));
135
- })))), /* @__PURE__ */ React__default.createElement(Box, { className: "flex-1 bg-gray-400" }, /* @__PURE__ */ React__default.createElement(LastMessageComponent, { title, lastMessage, channelId: channel == null ? void 0 : channel.id, subscribeToNewMessages: () => {
136
- var _a2;
137
- return subscribeToMore({
138
- document: OnChatMessageAddedDocument,
139
- variables: {
140
- channelId: (_a2 = channel.id) == null ? void 0 : _a2.toString()
141
- },
142
- updateQuery: (prev, {
143
- subscriptionData
144
- }) => {
145
- var _a3;
146
- if (!subscriptionData.data)
147
- return prev;
148
- const newMessage2 = (_a3 = subscriptionData == null ? void 0 : subscriptionData.data) == null ? void 0 : _a3.chatMessageAdded;
149
- const existingMessages = prev == null ? void 0 : prev.messages;
150
- const previousData = (existingMessages == null ? void 0 : existingMessages.data) ? [...existingMessages.data, newMessage2] : [];
151
- const totalMsgCount = (existingMessages == null ? void 0 : existingMessages.totalCount) + 1;
152
- const merged = __spreadProps(__spreadValues({}, prev), {
153
- messages: __spreadProps(__spreadValues({}, existingMessages), {
154
- data: previousData,
155
- totalCount: totalMsgCount
156
- })
157
- });
158
- return merged;
159
- }
160
- });
161
- } }))));
162
- };
163
- const LastMessageComponent = ({
164
- subscribeToNewMessages,
165
- title,
166
- lastMessage,
167
- channelId
168
- }) => {
169
- var _a;
170
- React__default.useEffect(() => subscribeToNewMessages(), [channelId]);
171
- const count = 30;
172
- const channelTitle = title.slice(0, count) + (title.length > count ? "..." : "");
173
- return /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", className: "flex-1 justify-between" }, /* @__PURE__ */ React__default.createElement(Box, { className: "flex-[0.8]" }, /* @__PURE__ */ React__default.createElement(Text, { color: colors.gray[600], className: "text-base text-wrap flex-wrap font-semibold" }, channelTitle), /* @__PURE__ */ React__default.createElement(Text, { color: colors.gray[600], numberOfLines: 1 }, (_a = lastMessage == null ? void 0 : lastMessage.message) != null ? _a : "")), /* @__PURE__ */ React__default.createElement(Box, { className: "flex-[0.2]" }, /* @__PURE__ */ React__default.createElement(Text, { color: colors.gray[500] }, lastMessage ? createdAtText(lastMessage == null ? void 0 : lastMessage.createdAt) : "")));
174
- };
175
- const DialogsListItem = React__default.memo(DialogsListItemComponent);export{DialogsListItem,DialogsListItemComponent};//# sourceMappingURL=DialogsListItem.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DialogsListItem.js","sources":["../../../../src/screens/inbox/components/DialogsListItem.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\nimport {\n Text,\n Image,\n Pressable,\n HStack,\n Box,\n AvatarGroup,\n Avatar,\n AvatarFallbackText,\n AvatarImage,\n AvatarBadge,\n View,\n} from '@admin-layout/gluestack-ui-mobile';\nimport { format, isToday, isYesterday } from 'date-fns';\nimport { useFocusEffect } from '@react-navigation/native';\nimport { IChannel, SortEnum, IUserAccount } from 'common';\nimport {\n useMessagesQuery,\n useOnChatMessageAddedSubscription,\n OnChatMessageAddedDocument as CHAT_MESSAGE_ADDED,\n useUserAccountQuery,\n} from 'common/graphql';\nimport { startCase } from 'lodash-es';\nimport colors from 'tailwindcss/colors';\n\nconst createdAtText = (value: string) => {\n if (!value) return '';\n let date = new Date(value);\n if (isToday(date)) return 'Today';\n if (isYesterday(date)) return 'Yesterday';\n return format(new Date(value), 'MMM dd, yyyy');\n};\n\nexport interface IDialogListChannel extends IChannel {\n users: IUserAccount[];\n}\n\nexport interface IDialogListItemProps {\n currentUser?: any;\n users?: any;\n selectedChannelId?: any;\n channel?: any;\n onOpen: (id: any, title: any) => void;\n}\n\n/**\n * TODO:\n * - Get Reservation info: reservation date, status\n * - Add ability to get property information: name, logo\n */\nexport const DialogsListItemComponent: React.FC<IDialogListItemProps> = function DialogsListItem({\n currentUser,\n // users,\n selectedChannelId,\n channel,\n onOpen,\n}) {\n const parentId: any = null;\n const [messages, setMessages] = useState<any>([]);\n const {\n data: messagesQuery,\n loading: messageLoading,\n refetch: refetchMessages,\n subscribeToMore,\n } = useMessagesQuery({\n variables: {\n channelId: channel?.id?.toString(),\n parentId: parentId,\n limit: 10,\n // sort: {\n // key: 'updatedAt',\n // value: SortEnum.Desc,\n // },\n //limit: 25,\n },\n fetchPolicy: 'cache-and-network',\n refetchWritePolicy: 'merge',\n });\n\n const {\n data: newMessage,\n loading: newMsgLoading,\n error: newMsgError,\n }: any = useOnChatMessageAddedSubscription({\n variables: {\n channelId: channel?.id?.toString(),\n },\n });\n\n useFocusEffect(\n React.useCallback(() => {\n // Do something when the screen is focused\n refetchMessages({\n channelId: channel?.id?.toString(),\n parentId: parentId,\n limit: 10,\n // sort: {\n // key: 'updatedAt',\n // value: SortEnum.Desc,\n // },\n //limit: 25\n });\n\n return () => {\n // Do something when the screen is unfocused\n // Useful for cleanup functions\n };\n }, []),\n );\n\n React.useEffect(() => {\n if (messagesQuery) {\n if (messagesQuery?.messages?.data?.length) {\n const msg = messagesQuery?.messages?.data;\n setMessages((pre: any[]) => [...pre, ...msg]);\n }\n }\n }, [messagesQuery]);\n\n const lastMessage = useMemo(() => {\n if (!messages?.length) {\n return null;\n }\n // const { data } = messagesQuery.messages;\n const data = messages;\n const filteredData: any = data?.filter((p: any) => p?.message !== '');\n // return filteredData[0];\n let filteredLastMessage =\n filteredData && filteredData?.length\n ? filteredData?.reduce((a, b) => {\n return new Date(a?.updatedAt) > new Date(b?.updatedAt) ? a : b;\n }, []) ?? null\n : null;\n return filteredLastMessage;\n //return data[data.length - 1];\n }, [messages]);\n\n const channelMembers = useMemo(\n () =>\n channel?.members\n ?.filter((ch: any) => ch?.user?.id != currentUser?.id && ch?.user?.__typename == 'UserAccount')\n ?.map((m: any) => m?.user) ?? null,\n [currentUser, channel],\n );\n\n const title = useMemo(() => {\n const titleString =\n channelMembers\n ?.map((u: any) => u?.givenName + ' ' + (u?.familyName ?? ''))\n ?.filter((mu: any) => mu)\n ?.join(', ') ?? '';\n\n const length = 30;\n return titleString.length > length ? titleString.substring(0, length - 3) + '...' : titleString;\n }, [channelMembers]);\n\n return (\n <Pressable\n onPress={() => channel?.id !== selectedChannelId && onOpen(channel?.id, title)}\n className=\"flex-1 border-gray-200 rounded-md dark:border-gray-600 dark:bg-gray-700\"\n style={{ borderBottomWidth: 1, borderColor: '#e5e7eb', marginVertical: 0, paddingHorizontal: 10 }}\n >\n <HStack space={'md'} className=\"flex-1 w-[100%] py-3 items-center\">\n <Box className=\"flex-[0.1] items-start pl-3\">\n <AvatarGroup>\n {channelMembers &&\n channelMembers?.length > 0 &&\n channelMembers?.slice(0, 1)?.map((ch: any, i: Number) => (\n <Avatar\n key={'dialogs-list-' + i}\n size={'sm'}\n className={`bg-transparent top-[${i == 1 ? '4' : '0'}] right-[${\n i == 1 ? '-2' : '0'\n }] z-[${i == 1 ? 5 : 1}]`}\n >\n <AvatarFallbackText>{startCase(ch?.username?.charAt(0))}</AvatarFallbackText>\n\n {channelMembers?.length > 1 && (\n <AvatarBadge\n style={{\n width: '100%',\n height: '100%',\n backgroundColor: '#e5e7eb',\n borderRadius: 5,\n }}\n className=\"items-center justify-center bg-gray-200 rounded-md\"\n >\n <Text style={{ fontSize: 12, fontWeight: 'bold', color: '#000' }}>\n {channelMembers?.length}\n </Text>\n </AvatarBadge>\n )}\n {channelMembers?.length == 1 && (\n <>\n <AvatarImage\n alt=\"user image\"\n style={{ borderRadius: 6, borderWidth: 2, borderColor: '#fff' }}\n source={{\n uri: ch?.picture,\n }}\n />\n <AvatarBadge style={{ width: 10, height: 10 }} />\n </>\n )}\n </Avatar>\n ))}\n </AvatarGroup>\n </Box>\n <Box className=\"flex-1 bg-gray-400\">\n {/* <HStack space={1} flex={1} direction={'row'} justifyContent={'center'} alignItems={'center'}>\n <Box flex={0.8}>\n <Text color=\"gray.600\" fontSize=\"lg\" flexWrap={'wrap'} fontWeight=\"semibold\">\n {title}\n </Text>\n <Text color=\"gray.600\" noOfLines={1}>\n {lastMessage?.message ?? ''}\n </Text>\n </Box>\n\n <Box flex={0.2}>\n <Text color=\"gray.500\">{lastMessage ? createdAtText(lastMessage?.createdAt) : ''}</Text>\n </Box>\n </HStack> */}\n <LastMessageComponent\n title={title}\n lastMessage={lastMessage}\n channelId={channel?.id}\n subscribeToNewMessages={() =>\n subscribeToMore({\n document: CHAT_MESSAGE_ADDED,\n variables: {\n channelId: channel.id?.toString(),\n },\n updateQuery: (prev, { subscriptionData }: any) => {\n if (!subscriptionData.data) return prev;\n const newMessage: any = subscriptionData?.data?.chatMessageAdded;\n const existingMessages: any = prev?.messages;\n const previousData = existingMessages?.data\n ? [...existingMessages.data, newMessage]\n : [];\n const totalMsgCount = existingMessages?.totalCount + 1;\n const merged = {\n ...prev,\n messages: {\n ...existingMessages,\n data: previousData,\n totalCount: totalMsgCount,\n },\n };\n return merged;\n },\n })\n }\n />\n {/* <Text\n flex={1}\n color=\"gray.600\"\n p={0}\n m={0}\n w={'100%'}\n justifyContent={''}\n fontSize=\"lg\"\n fontWeight=\"semibold\"\n >\n {title}\n </Text> */}\n {/* <Text flex={0.1} color=\"gray.600\">\n {lastMessage?.message ?? ''}\n </Text> */}\n </Box>\n {/* <Text flex={0.2} color=\"gray.500\">\n {lastMessage ? createdAtText(lastMessage?.createdAt) : ''}\n </Text> */}\n </HStack>\n </Pressable>\n );\n};\n\nconst LastMessageComponent = ({ subscribeToNewMessages, title, lastMessage, channelId }) => {\n React.useEffect(() => subscribeToNewMessages(), [channelId]);\n const count = 30;\n const channelTitle = title.slice(0, count) + (title.length > count ? '...' : '');\n return (\n <HStack space={'sm'} className=\"flex-1 justify-between\">\n <Box className=\"flex-[0.8]\">\n <Text color={colors.gray[600]} className=\"text-base text-wrap flex-wrap font-semibold\">\n {channelTitle}\n </Text>\n <Text color={colors.gray[600]} numberOfLines={1}>\n {lastMessage?.message ?? ''}\n </Text>\n </Box>\n\n <Box className=\"flex-[0.2]\">\n <Text color={colors.gray[500]}>{lastMessage ? createdAtText(lastMessage?.createdAt) : ''}</Text>\n </Box>\n </HStack>\n );\n};\n\nexport const DialogsListItem = React.memo(DialogsListItemComponent);\n"],"names":["DialogsListItem","React","_a","_b","_c","CHAT_MESSAGE_ADDED","newMessage"],"mappings":"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"}