@messenger-box/platform-mobile 10.0.3-alpha.7 → 10.0.3-alpha.74
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 +120 -0
- package/lib/compute.js +2 -3
- package/lib/compute.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/queries/inboxQueries.js +65 -0
- package/lib/queries/inboxQueries.js.map +1 -0
- package/lib/routes.json +2 -3
- package/lib/screens/inbox/DialogMessages.js +1 -1
- package/lib/screens/inbox/DialogMessages.js.map +1 -1
- package/lib/screens/inbox/DialogThreadMessages.js +4 -8
- package/lib/screens/inbox/DialogThreadMessages.js.map +1 -1
- package/lib/screens/inbox/DialogThreads.js +57 -12
- package/lib/screens/inbox/DialogThreads.js.map +1 -1
- package/lib/screens/inbox/Inbox.js +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/SlackBubble.js +147 -31
- package/lib/screens/inbox/components/SlackMessageContainer/SlackBubble.js.map +1 -1
- package/lib/screens/inbox/components/SlackMessageContainer/SlackMessage.js +6 -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 -55
- 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 +1111 -434
- 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 +725 -216
- 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 +4 -4
- package/src/compute.ts +5 -6
- package/src/index.ts +2 -0
- package/src/navigation/InboxNavigation.tsx +3 -3
- 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 +1 -1
- package/src/screens/inbox/DialogThreadMessages.tsx +7 -14
- package/src/screens/inbox/DialogThreads.tsx +55 -61
- package/src/screens/inbox/Inbox.tsx +1 -1
- 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/DialogsHeader.tsx +6 -13
- package/src/screens/inbox/components/DialogsListItem.tsx +262 -198
- 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 +337 -194
- package/src/screens/inbox/components/SlackInput.tsx +23 -0
- package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +233 -23
- package/src/screens/inbox/components/SlackMessageContainer/SlackMessage.tsx +1 -1
- 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 +53 -55
- package/src/screens/inbox/components/ThreadsViewItem.tsx +178 -285
- 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 +1843 -702
- package/src/screens/inbox/containers/ConversationView.tsx.bk +1467 -0
- package/src/screens/inbox/containers/Dialogs.tsx +402 -204
- package/src/screens/inbox/containers/SupportServiceDialogs.tsx +4 -4
- package/src/screens/inbox/containers/ThreadConversationView.tsx +1350 -319
- package/src/screens/inbox/containers/ThreadsView.tsx +105 -193
- 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/tsconfig.json +11 -54
- package/lib/screens/inbox/components/DialogsListItem.js +0 -171
- package/lib/screens/inbox/components/DialogsListItem.js.map +0 -1
- package/lib/screens/inbox/components/ServiceDialogsListItem.js +0 -171
- 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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
"
|
|
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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"}
|