@messenger-box/platform-mobile 10.0.3-alpha.7 → 10.0.3-alpha.72

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 (98) hide show
  1. package/CHANGELOG.md +116 -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/queries/inboxQueries.js +65 -0
  6. package/lib/queries/inboxQueries.js.map +1 -0
  7. package/lib/routes.json +2 -3
  8. package/lib/screens/inbox/DialogMessages.js +1 -1
  9. package/lib/screens/inbox/DialogMessages.js.map +1 -1
  10. package/lib/screens/inbox/DialogThreadMessages.js +4 -8
  11. package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
  12. package/lib/screens/inbox/DialogThreads.js +57 -12
  13. package/lib/screens/inbox/DialogThreads.js.map +1 -1
  14. package/lib/screens/inbox/Inbox.js +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/SlackBubble.js +147 -31
  25. package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
  26. package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js +6 -1
  27. package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js.map +1 -1
  28. package/lib/screens/inbox/components/SubscriptionHandler.js +24 -0
  29. package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -0
  30. package/lib/screens/inbox/components/ThreadsViewItem.js +66 -55
  31. package/lib/screens/inbox/components/ThreadsViewItem.js.map +1 -1
  32. package/lib/screens/inbox/config/config.js +2 -2
  33. package/lib/screens/inbox/config/config.js.map +1 -1
  34. package/lib/screens/inbox/containers/ConversationView.js +1111 -434
  35. package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
  36. package/lib/screens/inbox/containers/Dialogs.js +193 -80
  37. package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
  38. package/lib/screens/inbox/containers/ThreadConversationView.js +725 -216
  39. package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
  40. package/lib/screens/inbox/containers/ThreadsView.js +83 -50
  41. package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
  42. package/lib/screens/inbox/hooks/useInboxMessages.js +31 -0
  43. package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -0
  44. package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js +108 -0
  45. package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js.map +1 -0
  46. package/lib/screens/inbox/workflow/dialog-threads-xstate.js +151 -0
  47. package/lib/screens/inbox/workflow/dialog-threads-xstate.js.map +1 -0
  48. package/package.json +4 -4
  49. package/src/compute.ts +5 -6
  50. package/src/index.ts +2 -0
  51. package/src/navigation/InboxNavigation.tsx +3 -3
  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 +1 -1
  56. package/src/screens/inbox/DialogThreadMessages.tsx +7 -14
  57. package/src/screens/inbox/DialogThreads.tsx +55 -61
  58. package/src/screens/inbox/Inbox.tsx +1 -1
  59. package/src/screens/inbox/components/Actionsheet.tsx +30 -0
  60. package/src/screens/inbox/components/CachedImage/consts.ts +4 -3
  61. package/src/screens/inbox/components/CachedImage/index.tsx +232 -61
  62. package/src/screens/inbox/components/DialogItem.tsx +306 -0
  63. package/src/screens/inbox/components/DialogsHeader.tsx +6 -13
  64. package/src/screens/inbox/components/DialogsListItem.tsx +262 -198
  65. package/src/screens/inbox/components/ExpandableInput.tsx +460 -0
  66. package/src/screens/inbox/components/ExpandableInputActionSheet.tsx +518 -0
  67. package/src/screens/inbox/components/GiftedChatInboxComponent.tsx +411 -0
  68. package/src/screens/inbox/components/ServiceDialogsListItem.tsx +337 -194
  69. package/src/screens/inbox/components/SlackInput.tsx +23 -0
  70. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +233 -23
  71. package/src/screens/inbox/components/SlackMessageContainer/SlackMessage.tsx +1 -1
  72. package/src/screens/inbox/components/SmartLoader.tsx +61 -0
  73. package/src/screens/inbox/components/SubscriptionHandler.tsx +41 -0
  74. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +53 -55
  75. package/src/screens/inbox/components/ThreadsViewItem.tsx +178 -285
  76. package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +145 -0
  77. package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +159 -0
  78. package/src/screens/inbox/config/config.ts +2 -2
  79. package/src/screens/inbox/containers/ConversationView.tsx +1843 -702
  80. package/src/screens/inbox/containers/ConversationView.tsx.bk +1467 -0
  81. package/src/screens/inbox/containers/Dialogs.tsx +402 -204
  82. package/src/screens/inbox/containers/SupportServiceDialogs.tsx +4 -4
  83. package/src/screens/inbox/containers/ThreadConversationView.tsx +1350 -319
  84. package/src/screens/inbox/containers/ThreadsView.tsx +105 -193
  85. package/src/screens/inbox/containers/workflow/apollo/handleResult.ts +20 -0
  86. package/src/screens/inbox/containers/workflow/conversation-xstate.ts +313 -0
  87. package/src/screens/inbox/containers/workflow/dialogs-xstate.ts +196 -0
  88. package/src/screens/inbox/containers/workflow/thread-conversation-xstate.ts +401 -0
  89. package/src/screens/inbox/hooks/useInboxMessages.ts +34 -0
  90. package/src/screens/inbox/hooks/useSafeDialogThreadsMachine.ts +136 -0
  91. package/src/screens/inbox/index.ts +37 -0
  92. package/src/screens/inbox/machines/threadsMachine.ts +147 -0
  93. package/src/screens/inbox/workflow/dialog-threads-xstate.ts +163 -0
  94. package/tsconfig.json +11 -54
  95. package/lib/screens/inbox/components/DialogsListItem.js +0 -171
  96. package/lib/screens/inbox/components/DialogsListItem.js.map +0 -1
  97. package/lib/screens/inbox/components/ServiceDialogsListItem.js +0 -171
  98. 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
+ });
package/tsconfig.json CHANGED
@@ -1,56 +1,13 @@
1
1
  {
2
- "extends": "../../../tsconfig.json",
3
- "compilerOptions": {
4
- "target": "ES6",
5
- "jsx": "react",
6
- "lib": [
7
- "es5",
8
- "es6",
9
- "dom"
10
- ],
11
- "esModuleInterop": true,
12
- "sourceMap": true,
13
- "resolveJsonModule": true,
14
- "allowSyntheticDefaultImports": true,
15
- "experimentalDecorators": true,
16
- "rootDir": "src",
17
- "outDir": "lib",
18
- "declaration": true,
19
- "declarationDir": "lib",
20
- "types": [
21
- "@types/node",
22
- "@types/jest",
23
- "../../../typings",
24
- ],
25
- "skipLibCheck": true
26
- },
27
- "include": [
28
- "src"
29
- ],
30
- "exclude": [
31
- "../../../node_modules",
32
- "node_modules",
33
- "lib",
34
- "lib",
35
- "webpack.config.js",
36
- "rollup.config.mjs"
37
- ]
2
+ "extends": "../../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "lib",
6
+ "declaration": true,
7
+ "declarationDir": "lib",
8
+ "types": ["@types/node", "@types/jest", "../../../typings"],
9
+ "skipLibCheck": true
10
+ },
11
+ "include": ["src"],
12
+ "exclude": ["../../../node_modules", "node_modules", "lib", "lib", "webpack.config.js", "rollup.config.mjs"]
38
13
  }
39
- // {
40
- // "extends": "../../../tsconfig.json",
41
- // "compilerOptions": {
42
- // "allowSyntheticDefaultImports": true,
43
- // "experimentalDecorators": true,
44
- // "esModuleInterop": true,
45
- // "skipLibCheck": true,
46
- // "rootDir": "./src",
47
- // "outDir": "../lib",
48
- // "declarationDir": "lib"
49
- // },
50
- // "exclude": [
51
- // "node_modules",
52
- // "lib",
53
- // "dist",
54
- // "webpack.config.js"
55
- // ]
56
- // }
@@ -1,171 +0,0 @@
1
- import React__default,{useState,useMemo}from'react';import {Pressable,HStack,Box,AvatarGroup,Avatar,AvatarFallbackText,AvatarImage,AvatarBadge,Text}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/lib/generated/generated.js';import {startCase}from'lodash-es';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), borderWidth: "$1", borderRadius: "$md", borderColor: "$trueGray200", flex: 1, "$dark-borderColor": "$coolGray600", "$dark-backgroundColor": "$trueGray700", "$light-backgroundColor": "$trueGray50", "$light-borderColor": "$trueGray200" }, /* @__PURE__ */ React__default.createElement(
110
- HStack,
111
- {
112
- py: "$3",
113
- space: "sm",
114
- w: "100%",
115
- flex: 1,
116
- justifyContent: "space-between",
117
- alignItems: "center"
118
- },
119
- /* @__PURE__ */ React__default.createElement(Box, { flex: 0.1, alignItems: "flex-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, 2)) == null ? void 0 : _c.map((ch, i) => {
120
- var _a2;
121
- return /* @__PURE__ */ React__default.createElement(Avatar, { key: "dialogs-list-" + i, bg: "transparent", size: "sm", top: i == 1 ? "$4" : "$0", right: i == 1 ? "-$2" : "$0", zIndex: i == 1 ? 5 : 1 }, /* @__PURE__ */ React__default.createElement(AvatarFallbackText, null, startCase((_a2 = ch == null ? void 0 : ch.username) == null ? void 0 : _a2.charAt(0))), /* @__PURE__ */ React__default.createElement(AvatarImage, { alt: "user image", style: {
122
- borderRadius: 6,
123
- borderWidth: 2,
124
- borderColor: "#fff"
125
- }, source: {
126
- uri: ch == null ? void 0 : ch.picture
127
- } }), (channelMembers == null ? void 0 : channelMembers.length) == 1 && /* @__PURE__ */ React__default.createElement(AvatarBadge, { style: {
128
- width: 10,
129
- height: 10
130
- }, bg: "$green800" }));
131
- })))),
132
- /* @__PURE__ */ React__default.createElement(Box, { flex: 0.9 }, /* @__PURE__ */ React__default.createElement(LastMessageComponent, { title, lastMessage, channelId: channel == null ? void 0 : channel.id, subscribeToNewMessages: () => {
133
- var _a2;
134
- return subscribeToMore({
135
- document: OnChatMessageAddedDocument,
136
- variables: {
137
- channelId: (_a2 = channel.id) == null ? void 0 : _a2.toString()
138
- },
139
- updateQuery: (prev, {
140
- subscriptionData
141
- }) => {
142
- var _a3;
143
- if (!subscriptionData.data)
144
- return prev;
145
- const newMessage2 = (_a3 = subscriptionData == null ? void 0 : subscriptionData.data) == null ? void 0 : _a3.chatMessageAdded;
146
- const existingMessages = prev == null ? void 0 : prev.messages;
147
- const previousData = (existingMessages == null ? void 0 : existingMessages.data) ? [...existingMessages.data, newMessage2] : [];
148
- const totalMsgCount = (existingMessages == null ? void 0 : existingMessages.totalCount) + 1;
149
- const merged = __spreadProps(__spreadValues({}, prev), {
150
- messages: __spreadProps(__spreadValues({}, existingMessages), {
151
- data: previousData,
152
- totalCount: totalMsgCount
153
- })
154
- });
155
- return merged;
156
- }
157
- });
158
- } }))
159
- ));
160
- };
161
- const LastMessageComponent = ({
162
- subscribeToNewMessages,
163
- title,
164
- lastMessage,
165
- channelId
166
- }) => {
167
- var _a;
168
- React__default.useEffect(() => subscribeToNewMessages(), [channelId]);
169
- return /* @__PURE__ */ React__default.createElement(HStack, { space: "sm", flex: 1, justifyContent: "center", alignItems: "center" }, /* @__PURE__ */ React__default.createElement(Box, { flex: 0.8 }, /* @__PURE__ */ React__default.createElement(Text, { color: "$trueGray600", fontSize: "$lg", flexWrap: "wrap", fontWeight: "$semibold" }, title), /* @__PURE__ */ React__default.createElement(Text, { color: "$trueGray600", numberOfLines: 1 }, (_a = lastMessage == null ? void 0 : lastMessage.message) != null ? _a : "")), /* @__PURE__ */ React__default.createElement(Box, { flex: 0.2 }, /* @__PURE__ */ React__default.createElement(Text, { color: "$trueGray500" }, lastMessage ? createdAtText(lastMessage == null ? void 0 : lastMessage.createdAt) : "")));
170
- };
171
- 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/lib/generated/generated.js';\nimport { startCase } from 'lodash-es';\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 borderWidth={'$1'}\n borderRadius={'$md'}\n borderColor={'$trueGray200'}\n flex={1}\n $dark-borderColor=\"$coolGray600\"\n $dark-backgroundColor=\"$trueGray700\"\n $light-backgroundColor=\"$trueGray50\"\n $light-borderColor=\"$trueGray200\"\n >\n <HStack\n // px={2}\n // pl={3}\n py={'$3'}\n space={'sm'}\n w={'100%'}\n flex={1}\n // direction={'row'}\n justifyContent={'space-between'}\n alignItems={'center'}\n >\n <Box flex={0.1} alignItems={'flex-start'} pl={'$3'}>\n <AvatarGroup>\n {channelMembers &&\n channelMembers?.length > 0 &&\n channelMembers?.slice(0, 2)?.map((ch: any, i: Number) => (\n <Avatar\n key={'dialogs-list-' + i}\n bg={'transparent'}\n size={'sm'}\n top={i == 1 ? '$4' : '$0'}\n right={i == 1 ? '-$2' : '$0'}\n zIndex={i == 1 ? 5 : 1}\n >\n <AvatarFallbackText>{startCase(ch?.username?.charAt(0))}</AvatarFallbackText>\n <AvatarImage\n alt=\"user image\"\n style={{ borderRadius: 6, borderWidth: 2, borderColor: '#fff' }}\n source={{\n uri: ch?.picture,\n }}\n />\n {channelMembers?.length == 1 && (\n <AvatarBadge style={{ width: 10, height: 10 }} bg=\"$green800\" />\n )}\n </Avatar>\n ))}\n </AvatarGroup>\n </Box>\n <Box flex={0.9}>\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 return (\n <HStack space={'sm'} flex={1} justifyContent={'center'} alignItems={'center'}>\n <Box flex={0.8}>\n <Text color=\"$trueGray600\" fontSize=\"$lg\" flexWrap={'wrap'} fontWeight=\"$semibold\">\n {title}\n </Text>\n <Text color=\"$trueGray600\" numberOfLines={1}>\n {lastMessage?.message ?? ''}\n </Text>\n </Box>\n\n <Box flex={0.2}>\n <Text color=\"$trueGray500\">{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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"}