@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.
- package/CHANGELOG.md +248 -0
- package/lib/compute.js +2 -3
- package/lib/compute.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/module.js.map +1 -1
- package/lib/queries/inboxQueries.js +65 -0
- package/lib/queries/inboxQueries.js.map +1 -0
- package/lib/routes.json +13 -1
- package/lib/screens/inbox/DialogMessages.js +5 -3
- package/lib/screens/inbox/DialogMessages.js.map +1 -1
- package/lib/screens/inbox/DialogThreadMessages.js +3 -7
- package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
- package/lib/screens/inbox/DialogThreads.js +57 -18
- package/lib/screens/inbox/DialogThreads.js.map +1 -1
- package/lib/screens/inbox/Inbox.js.map +1 -1
- package/lib/screens/inbox/components/CachedImage/consts.js +1 -1
- package/lib/screens/inbox/components/CachedImage/consts.js.map +1 -1
- package/lib/screens/inbox/components/CachedImage/index.js +168 -46
- package/lib/screens/inbox/components/CachedImage/index.js.map +1 -1
- package/lib/screens/inbox/components/DialogItem.js +169 -0
- package/lib/screens/inbox/components/DialogItem.js.map +1 -0
- package/lib/screens/inbox/components/GiftedChatInboxComponent.js +313 -0
- package/lib/screens/inbox/components/GiftedChatInboxComponent.js.map +1 -0
- package/lib/screens/inbox/components/SlackMessageContainer/ImageViewerModal.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js +197 -0
- package/lib/screens/inbox/components/SlackMessageContainer/PaymentMessage.js.map +1 -0
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js +141 -31
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js.map +1 -1
- package/lib/screens/inbox/components/SubscriptionHandler.js +24 -0
- package/lib/screens/inbox/components/SubscriptionHandler.js.map +1 -0
- package/lib/screens/inbox/components/ThreadsViewItem.js +66 -44
- package/lib/screens/inbox/components/ThreadsViewItem.js.map +1 -1
- package/lib/screens/inbox/config/config.js +2 -2
- package/lib/screens/inbox/config/config.js.map +1 -1
- package/lib/screens/inbox/containers/ConversationView.js +1205 -432
- package/lib/screens/inbox/containers/ConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/Dialogs.js +193 -80
- package/lib/screens/inbox/containers/Dialogs.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadConversationView.js +724 -207
- package/lib/screens/inbox/containers/ThreadConversationView.js.map +1 -1
- package/lib/screens/inbox/containers/ThreadsView.js +83 -50
- package/lib/screens/inbox/containers/ThreadsView.js.map +1 -1
- package/lib/screens/inbox/hooks/useInboxMessages.js +31 -0
- package/lib/screens/inbox/hooks/useInboxMessages.js.map +1 -0
- package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js +108 -0
- package/lib/screens/inbox/hooks/useSafeDialogThreadsMachine.js.map +1 -0
- package/lib/screens/inbox/workflow/dialog-threads-xstate.js +151 -0
- package/lib/screens/inbox/workflow/dialog-threads-xstate.js.map +1 -0
- package/package.json +5 -5
- package/src/index.ts +2 -0
- package/src/queries/inboxQueries.ts +299 -0
- package/src/queries/index.d.ts +2 -0
- package/src/queries/index.ts +1 -0
- package/src/screens/inbox/DialogMessages.tsx +2 -1
- package/src/screens/inbox/DialogThreadMessages.tsx +3 -11
- package/src/screens/inbox/DialogThreads.tsx +53 -60
- package/src/screens/inbox/components/Actionsheet.tsx +30 -0
- package/src/screens/inbox/components/CachedImage/consts.ts +4 -3
- package/src/screens/inbox/components/CachedImage/index.tsx +232 -61
- package/src/screens/inbox/components/DialogItem.tsx +306 -0
- package/src/screens/inbox/components/DialogsListItem.tsx +230 -170
- package/src/screens/inbox/components/ExpandableInput.tsx +460 -0
- package/src/screens/inbox/components/ExpandableInputActionSheet.tsx +518 -0
- package/src/screens/inbox/components/GiftedChatInboxComponent.tsx +411 -0
- package/src/screens/inbox/components/ServiceDialogsListItem.tsx +330 -171
- package/src/screens/inbox/components/SlackInput.tsx +23 -0
- package/src/screens/inbox/components/SlackMessageContainer/PaymentMessage.tsx +199 -0
- package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +233 -23
- package/src/screens/inbox/components/SmartLoader.tsx +61 -0
- package/src/screens/inbox/components/SubscriptionHandler.tsx +41 -0
- package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +41 -24
- package/src/screens/inbox/components/ThreadsViewItem.tsx +177 -265
- package/src/screens/inbox/components/workflow/dialogs-list-item-xstate.ts +145 -0
- package/src/screens/inbox/components/workflow/service-dialogs-list-item-xstate.ts +159 -0
- package/src/screens/inbox/config/config.ts +2 -2
- package/src/screens/inbox/containers/ConversationView.tsx +2004 -698
- package/src/screens/inbox/containers/ConversationView.tsx.bk +1467 -0
- package/src/screens/inbox/containers/Dialogs.tsx +402 -196
- package/src/screens/inbox/containers/SupportServiceDialogs.tsx +2 -2
- package/src/screens/inbox/containers/ThreadConversationView.tsx +1337 -301
- package/src/screens/inbox/containers/ThreadsView.tsx +105 -186
- package/src/screens/inbox/containers/workflow/apollo/handleResult.ts +20 -0
- package/src/screens/inbox/containers/workflow/conversation-xstate.ts +313 -0
- package/src/screens/inbox/containers/workflow/dialogs-xstate.ts +196 -0
- package/src/screens/inbox/containers/workflow/thread-conversation-xstate.ts +401 -0
- package/src/screens/inbox/hooks/useInboxMessages.ts +34 -0
- package/src/screens/inbox/hooks/useSafeDialogThreadsMachine.ts +136 -0
- package/src/screens/inbox/index.ts +37 -0
- package/src/screens/inbox/machines/threadsMachine.ts +147 -0
- package/src/screens/inbox/workflow/dialog-threads-xstate.ts +163 -0
- package/lib/screens/inbox/components/DialogsListItem.js +0 -175
- package/lib/screens/inbox/components/DialogsListItem.js.map +0 -1
- package/lib/screens/inbox/components/ServiceDialogsListItem.js +0 -165
- 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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"}
|