@messenger-box/platform-mobile 0.0.1-alpha.362 → 0.0.1-alpha.365

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 (29) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/index.js +2281 -553
  3. package/lib/index.js.map +1 -1
  4. package/lib/screens/inbox/DialogThreadMessages.d.ts +7 -0
  5. package/lib/screens/inbox/DialogThreads.d.ts +6 -0
  6. package/lib/screens/inbox/components/SupportServiceDialogsListItem.d.ts +21 -0
  7. package/lib/screens/inbox/components/ThreadsViewItem.d.ts +18 -0
  8. package/lib/screens/inbox/config/config.d.ts +2 -0
  9. package/lib/screens/inbox/containers/Dialogs.d.ts +1 -0
  10. package/lib/screens/inbox/containers/SupportServiceDialogs.d.ts +6 -0
  11. package/lib/screens/inbox/containers/ThreadConversationView.d.ts +11 -0
  12. package/lib/screens/inbox/containers/ThreadsView.d.ts +8 -0
  13. package/lib/screens/index.d.ts +2 -0
  14. package/package.json +4 -4
  15. package/src/navigation/InboxNavigation.tsx +63 -0
  16. package/src/screens/inbox/DialogThreadMessages.tsx +90 -0
  17. package/src/screens/inbox/DialogThreads.tsx +107 -0
  18. package/src/screens/inbox/Inbox.tsx +5 -3
  19. package/src/screens/inbox/components/DialogsListItem.tsx +7 -3
  20. package/src/screens/inbox/components/SlackMessageContainer/SlackBubble.tsx +5 -5
  21. package/src/screens/inbox/components/SupportServiceDialogsListItem.tsx +295 -0
  22. package/src/screens/inbox/components/ThreadsViewItem.tsx +236 -0
  23. package/src/screens/inbox/config/config.ts +4 -0
  24. package/src/screens/inbox/containers/ConversationView.tsx +440 -156
  25. package/src/screens/inbox/containers/Dialogs.tsx +2 -1
  26. package/src/screens/inbox/containers/SupportServiceDialogs.tsx +119 -0
  27. package/src/screens/inbox/containers/ThreadConversationView.tsx +764 -0
  28. package/src/screens/inbox/containers/ThreadsView.tsx +205 -0
  29. package/src/screens/index.ts +3 -1
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ export declare function DialogThreadMessages({ channelId, postParentId, isPostParentIdThread, role }: {
3
+ channelId: any;
4
+ postParentId: any;
5
+ isPostParentIdThread: any;
6
+ role: any;
7
+ }): JSX.Element;
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ export declare function DialogThreads({ channelId, postParentId, role }: {
3
+ channelId: any;
4
+ postParentId: any;
5
+ role: any;
6
+ }): JSX.Element;
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import { IChannel, IUserAccount } from '@messenger-box/platform-client';
3
+ export interface IDialogListChannel extends IChannel {
4
+ users: IUserAccount[];
5
+ }
6
+ export interface IDialogListItemProps {
7
+ currentUser?: any;
8
+ users?: any;
9
+ selectedChannelId?: any;
10
+ channel?: any;
11
+ onOpen: (id: any, title: any, postParentId?: any) => void;
12
+ refreshing: boolean;
13
+ role: any;
14
+ }
15
+ /**
16
+ * TODO:
17
+ * - Get Reservation info: reservation date, status
18
+ * - Add ability to get property information: name, logo
19
+ */
20
+ export declare const SupportServiceDialogsListItemComponent: React.FC<IDialogListItemProps>;
21
+ export declare const SupportServiceDialogsListItem: React.NamedExoticComponent<IDialogListItemProps>;
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { IChannel, IUserAccount } from '@messenger-box/platform-client';
3
+ export interface IDialogListChannel extends IChannel {
4
+ users: IUserAccount[];
5
+ }
6
+ export interface IDialogListItemProps {
7
+ currentUser?: any;
8
+ users?: any;
9
+ thread?: any;
10
+ onOpen: (id: any, title: any, postParentId?: any) => void;
11
+ }
12
+ /**
13
+ * TODO:
14
+ * - Get Reservation info: reservation date, status
15
+ * - Add ability to get property information: name, logo
16
+ */
17
+ export declare const ThreadViewItemComponent: React.FC<IDialogListItemProps>;
18
+ export declare const ThreadViewItem: React.NamedExoticComponent<IDialogListItemProps>;
@@ -2,6 +2,8 @@ export declare const config: Readonly<{
2
2
  MESSAGES_PER_PAGE: number;
3
3
  FILES_PER_MESSAGE: number;
4
4
  INBOX_MESSEGE_PATH: string;
5
+ THREAD_MESSEGE_PATH: string;
6
+ THREADS_PATH: string;
5
7
  CALL_TO_ACTION_PATH: string;
6
8
  CALL_TO_ACTION_BOX_BGCOLOR: string;
7
9
  CALL_TO_ACTION_BUTTON_BORDERCOLOR: string;
@@ -2,5 +2,6 @@ import React from 'react';
2
2
  export interface InboxProps {
3
3
  channelFilters?: Record<string, unknown>;
4
4
  channelRole?: string;
5
+ supportServices: boolean;
5
6
  }
6
7
  export declare const Dialogs: React.MemoExoticComponent<(props: InboxProps) => JSX.Element>;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface SupportServiceInboxProps {
3
+ channelFilters?: Record<string, unknown>;
4
+ channelRole?: string;
5
+ }
6
+ export declare const SupportServiceDialogs: React.MemoExoticComponent<(props: SupportServiceInboxProps) => JSX.Element>;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export interface AlertMessageAttachmentsInterface {
3
+ title: string;
4
+ isTitleHtml: boolean;
5
+ icon: string;
6
+ callToAction: {
7
+ title: string;
8
+ link: string;
9
+ };
10
+ }
11
+ export declare const ThreadConversationView: React.MemoExoticComponent<({ channelId, postParentId, isPostParentIdThread, role }: any) => JSX.Element>;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ export interface ThreadsViewProps {
3
+ channelId?: string;
4
+ role?: string;
5
+ channelsDetail?: any;
6
+ refetchChannelDetail: (id: any) => Promise<any>;
7
+ }
8
+ export declare const ThreadsView: React.MemoExoticComponent<({ channelId, role, channelsDetail, refetchChannelDetail }: ThreadsViewProps) => JSX.Element>;
@@ -1,2 +1,4 @@
1
1
  export * from './inbox/Inbox';
2
2
  export * from './inbox/DialogMessages';
3
+ export * from './inbox/DialogThreads';
4
+ export * from './inbox/DialogThreadMessages';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@messenger-box/platform-mobile",
3
- "version": "0.0.1-alpha.362",
3
+ "version": "0.0.1-alpha.365",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "CDMBase LLC",
@@ -19,8 +19,8 @@
19
19
  "watch": "yarn build:lib:watch"
20
20
  },
21
21
  "dependencies": {
22
- "@messenger-box/core": "0.0.1-alpha.362",
23
- "@messenger-box/platform-client": "0.0.1-alpha.362",
22
+ "@messenger-box/core": "0.0.1-alpha.365",
23
+ "@messenger-box/platform-client": "0.0.1-alpha.365",
24
24
  "base-64": "1.0.0",
25
25
  "react-native-gifted-chat": "1.0.4"
26
26
  },
@@ -40,5 +40,5 @@
40
40
  "typescript": {
41
41
  "definition": "lib/index.d.ts"
42
42
  },
43
- "gitHead": "b42a51b9a893fd82e38a4ae30776af31277e39cf"
43
+ "gitHead": "52c2335b1abc0d3317a5a4a821963becf5509c70"
44
44
  }
@@ -1,6 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { Feature } from '@common-stack/client-react';
3
3
  import { DialogMessages } from '../screens/inbox/DialogMessages';
4
+ import { DialogThreads } from '../screens/inbox/DialogThreads';
5
+ import { DialogThreadMessages } from '../screens/inbox/DialogThreadMessages';
4
6
  import { IconButton, Icon } from 'native-base';
5
7
  import { MaterialIcons } from '@expo/vector-icons';
6
8
 
@@ -28,6 +30,67 @@ const inboxConfig = {
28
30
  },
29
31
  },
30
32
  },
33
+ ['//thread']: {
34
+ exact: true,
35
+ name: 'Thread',
36
+ props: {
37
+ initialParams: { channelId: null, postParentId: null,role:null },
38
+ component: (props: any) => (
39
+ <DialogThreads
40
+ {...props}
41
+ channelId={props?.route?.params?.channelId}
42
+ postParentId={props?.route?.params?.postParentId}
43
+ role={props?.route?.params?.role}
44
+ />
45
+ ),
46
+ options: ({ navigation }: any) => {
47
+ return {
48
+ headerShown: true,
49
+ title: 'Thread',
50
+ headerBackTitleVisible: false,
51
+ gestureEnabled: false,
52
+ swipeEnabled: false,
53
+ headerLeft: (props: any) => (
54
+ <IconButton
55
+ onPress={() => navigation.goBack()}
56
+ icon={<Icon size={'lg'} as={MaterialIcons} name="arrow-back-ios" color={'black'} />}
57
+ />
58
+ ),
59
+ };
60
+ },
61
+ },
62
+ },
63
+ ['//threadmessage']: {
64
+ exact: true,
65
+ name: 'ThreadMessage',
66
+ props: {
67
+ initialParams: { channelId: null, postParentId: null, isPostParentIdThread: null,role:null },
68
+ component: (props: any) => (
69
+ <DialogThreadMessages
70
+ {...props}
71
+ channelId={props?.route?.params?.channelId}
72
+ postParentId={props?.route?.params?.postParentId}
73
+ isPostParentIdThread={props?.route?.params?.isPostParentIdThread}
74
+ role={props?.route?.params?.role}
75
+ />
76
+ ),
77
+ options: ({ navigation }: any) => {
78
+ return {
79
+ headerShown: true,
80
+ title: 'Inbox',
81
+ headerBackTitleVisible: false,
82
+ gestureEnabled: false,
83
+ swipeEnabled: false,
84
+ headerLeft: (props: any) => (
85
+ <IconButton
86
+ onPress={() => navigation.goBack()}
87
+ icon={<Icon size={'lg'} as={MaterialIcons} name="arrow-back-ios" color={'black'} />}
88
+ />
89
+ ),
90
+ };
91
+ },
92
+ },
93
+ },
31
94
  };
32
95
 
33
96
  export const inboxFeature = new Feature({
@@ -0,0 +1,90 @@
1
+ import * as React from 'react';
2
+ import { Box, Spinner, Text } from 'native-base';
3
+ import { ThreadConversationView } from './containers/ThreadConversationView';
4
+ import { ThreadsView } from './containers/ThreadsView';
5
+ import { useViewChannelDetailQuery, useSendThreadMessageMutation } from '@messenger-box/platform-client';
6
+ import { useFocusEffect } from '@react-navigation/native';
7
+ import { useSelector } from 'react-redux';
8
+
9
+ export function DialogThreadMessages({ channelId, postParentId, isPostParentIdThread, role }) {
10
+ const {
11
+ data,
12
+ loading: channelLoading,
13
+ refetch,
14
+ } = useViewChannelDetailQuery({
15
+ variables: {
16
+ id: channelId?.toString(),
17
+ },
18
+ });
19
+
20
+ const [sendThreadMessage] = useSendThreadMessageMutation();
21
+ const [loading, setLoading] = React.useState<boolean>(true);
22
+ const [channel, setChannel] = React.useState<any>(null);
23
+ const [parentId, setParentId] = React.useState<any>(postParentId);
24
+
25
+ const refetchChannelDetail = React.useCallback(
26
+ (id: string) => {
27
+ return refetch({ id: id?.toString() });
28
+ },
29
+ [channelId],
30
+ );
31
+
32
+ useFocusEffect(
33
+ React.useCallback(() => {
34
+ // Do something when the screen is focused
35
+ refetchChannelDetail(channelId);
36
+ return () => {};
37
+ }, []),
38
+ );
39
+
40
+ React.useEffect(() => {
41
+ setParentId(postParentId);
42
+ }, [postParentId]);
43
+
44
+ React.useEffect(() => {
45
+ if (data?.viewChannelDetail) setChannel(data?.viewChannelDetail);
46
+ }, [data]);
47
+
48
+ React.useEffect(() => {
49
+ async function sendInitialMessage(channel: any) {
50
+ const content = `Welcome to ${channel?.title}`;
51
+ const createdBy = channel?.creator?.id;
52
+ await sendThreadMessage({
53
+ variables: {
54
+ channelId,
55
+ threadMessageInput: {
56
+ content,
57
+ role,
58
+ },
59
+ responderId: createdBy,
60
+ },
61
+ update: (cache, { data, errors }: any) => {
62
+ if (!data) {
63
+ return;
64
+ }
65
+ setParentId(data?.sendThreadMessage?.lastMessage?.id);
66
+ },
67
+ });
68
+ }
69
+ if ((!parentId || parentId == 0) && channel) {
70
+ sendInitialMessage(channel);
71
+ }
72
+
73
+ if (parentId) setLoading(false);
74
+ }, [parentId, channel]);
75
+
76
+ return (
77
+ <Box bg={'white'} flex={1}>
78
+ {loading && !parentId ? (
79
+ <Spinner />
80
+ ) : (
81
+ <ThreadConversationView
82
+ channelId={channelId}
83
+ postParentId={parentId}
84
+ isPostParentIdThread={isPostParentIdThread}
85
+ role={role}
86
+ />
87
+ )}
88
+ </Box>
89
+ );
90
+ }
@@ -0,0 +1,107 @@
1
+ import * as React from 'react';
2
+ import { Box, Spinner, Text } from 'native-base';
3
+ import { ThreadConversationView } from './containers/ThreadConversationView';
4
+ import { ThreadsView } from './containers/ThreadsView';
5
+ import { useViewChannelDetailQuery } from '@messenger-box/platform-client';
6
+ import { useFocusEffect } from '@react-navigation/native';
7
+ import { useSelector } from 'react-redux';
8
+
9
+ export function DialogThreads({ channelId, postParentId,role }) {
10
+ const {
11
+ data,
12
+ loading: channelLoading,
13
+ refetch,
14
+ } = useViewChannelDetailQuery({
15
+ variables: {
16
+ id: channelId?.toString(),
17
+ },
18
+ });
19
+
20
+ const channelsDetail = React.useMemo(() => {
21
+ if (!data?.viewChannelDetail) return null;
22
+ return data?.viewChannelDetail;
23
+ }, [data]);
24
+
25
+ const refetchChannelDetail = React.useCallback(
26
+ (id: string) => {
27
+ return refetch({ id: id?.toString() });
28
+ },
29
+ [channelId],
30
+ );
31
+
32
+ useFocusEffect(
33
+ React.useCallback(() => {
34
+ // Do something when the screen is focused
35
+ refetchChannelDetail(channelId);
36
+ return () => {};
37
+ }, []),
38
+ );
39
+
40
+ return (
41
+ // <Box bg={'white'} flex={1} pt={5}>
42
+ <>
43
+ {channelLoading ? (
44
+ <Spinner />
45
+ ) : (
46
+ <>
47
+ <Box
48
+ flex={1}
49
+ _dark={{
50
+ borderColor: 'coolGray.600',
51
+ backgroundColor: 'gray.700',
52
+ }}
53
+ _light={{
54
+ backgroundColor: 'gray.50',
55
+ }}
56
+ >
57
+ <ThreadsView
58
+ channelId={channelId}
59
+ role={role}
60
+ channelsDetail={channelsDetail}
61
+ refetchChannelDetail={refetchChannelDetail}
62
+ />
63
+ </Box>
64
+ </>
65
+ )}
66
+ </>
67
+ );
68
+
69
+ // return (
70
+ // // <Box bg={'white'} flex={1} pt={5}>
71
+ // <>
72
+ // {channelLoading ? (
73
+ // <Spinner />
74
+ // ) : (
75
+ // <>
76
+ // {postParentId || postParentId == 0 ? (
77
+ // <Box bg={'white'} flex={1}>
78
+ // <ThreadConversationView
79
+ // channelId={channelId}
80
+ // postParentId={postParentId}
81
+ // channelsDetail={channelsDetail}
82
+ // refetchChannelDetail={refetchChannelDetail}
83
+ // />
84
+ // </Box>
85
+ // ) : (
86
+ // <Box
87
+ // flex={1}
88
+ // _dark={{
89
+ // borderColor: 'coolGray.600',
90
+ // backgroundColor: 'gray.700',
91
+ // }}
92
+ // _light={{
93
+ // backgroundColor: 'gray.50',
94
+ // }}
95
+ // >
96
+ // <ThreadsView
97
+ // channelId={channelId}
98
+ // channelsDetail={channelsDetail}
99
+ // refetchChannelDetail={refetchChannelDetail}
100
+ // />
101
+ // </Box>
102
+ // )}
103
+ // </>
104
+ // )}
105
+ // </>
106
+ // );
107
+ }
@@ -1,12 +1,14 @@
1
1
  import * as React from 'react';
2
- import { Box } from 'native-base';
2
+ import { Box, Text } from 'native-base';
3
3
 
4
4
  import { Dialogs } from './containers/Dialogs';
5
+ import { SupportServiceDialogs } from './containers/SupportServiceDialogs';
5
6
 
6
- export const Inbox = (props:any) => {
7
- const { channelFilters, channelRole } = props;
7
+ export const Inbox = (props: any) => {
8
+ const { channelFilters, channelRole, supportServices } = props;
8
9
  return (
9
10
  <Box bg={'white'} flex={1}>
11
+ {supportServices && <SupportServiceDialogs channelFilters={channelFilters} channelRole={channelRole} {...props} />}
10
12
  <Dialogs channelFilters={channelFilters} channelRole={channelRole} {...props} />
11
13
  </Box>
12
14
  );
@@ -37,6 +37,7 @@ export const DialogsListItemComponent: React.FC<IDialogListItemProps> = function
37
37
  channel,
38
38
  onOpen,
39
39
  }) {
40
+ const parentId:any = null;
40
41
  const {
41
42
  data: messagesQuery,
42
43
  loading: messageLoading,
@@ -44,7 +45,8 @@ export const DialogsListItemComponent: React.FC<IDialogListItemProps> = function
44
45
  } = useMessagesQuery({
45
46
  variables: {
46
47
  channelId: channel?.id?.toString(),
47
- limit: 1,
48
+ parentId: parentId,
49
+ limit: 25,
48
50
  },
49
51
  fetchPolicy: 'cache-and-network',
50
52
  });
@@ -52,7 +54,7 @@ export const DialogsListItemComponent: React.FC<IDialogListItemProps> = function
52
54
  useFocusEffect(
53
55
  React.useCallback(() => {
54
56
  // Do something when the screen is focused
55
- refetchMessages({ channelId: channel?.id?.toString(), limit: 1 });
57
+ refetchMessages({ channelId: channel?.id?.toString(),parentId:parentId, limit: 25 });
56
58
 
57
59
  return () => {
58
60
  // Do something when the screen is unfocused
@@ -66,7 +68,9 @@ export const DialogsListItemComponent: React.FC<IDialogListItemProps> = function
66
68
  return null;
67
69
  }
68
70
  const { data } = messagesQuery.messages;
69
- return data[data.length - 1];
71
+ const filteredData = data?.filter((p: any) => p?.message !== '');
72
+ return filteredData[0];
73
+ //return data[data.length - 1];
70
74
  }, [messagesQuery]);
71
75
 
72
76
  const channelMembers = useMemo(
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable no-underscore-dangle, no-use-before-define */
2
2
  import React from 'react';
3
- import { Text, StyleSheet, TouchableOpacity, View, Platform, Dimensions } from 'react-native';
3
+ import { Text, StyleSheet, TouchableOpacity,TouchableHighlight, View, Platform, Dimensions } from 'react-native';
4
4
 
5
5
  import { MessageText, MessageImage, Time, utils } from 'react-native-gifted-chat';
6
6
  import CachedImage from '../CachedImage';
@@ -64,7 +64,7 @@ export default class Bubble extends React.Component<any> {
64
64
  const { image, _id } = messageImageProps?.currentMessage;
65
65
 
66
66
  return (
67
- <TouchableOpacity onPress={() => this.props.setImageViewer(messageImageProps?.currentMessage, true)}>
67
+ <TouchableHighlight underlayColor={'#c0c0c0'} style={{width:'100%'}} onPress={() => this.props.setImageViewer(messageImageProps?.currentMessage, true)}>
68
68
  <View
69
69
  style={{
70
70
  width: windowWidth - (windowWidth - 150),
@@ -87,7 +87,7 @@ export default class Bubble extends React.Component<any> {
87
87
  alt={'image'}
88
88
  />
89
89
  </View>
90
- </TouchableOpacity>
90
+ </TouchableHighlight>
91
91
  );
92
92
  }
93
93
  return null;
@@ -173,7 +173,7 @@ export default class Bubble extends React.Component<any> {
173
173
 
174
174
  return (
175
175
  <View style={[styles.container, this.props.containerStyle]}>
176
- <TouchableOpacity disabled={true} accessibilityTraits="text" {...this.props.touchableProps}>
176
+ <TouchableHighlight style={{width:'100%'}} underlayColor={'#c0c0c0'} disabled={true} accessibilityTraits="text" {...this.props.touchableProps}>
177
177
  <View style={[styles.wrapper, this.props.wrapperStyle]}>
178
178
  <View>
179
179
  {this.renderCustomView()}
@@ -182,7 +182,7 @@ export default class Bubble extends React.Component<any> {
182
182
  {this.renderMessageText()}
183
183
  </View>
184
184
  </View>
185
- </TouchableOpacity>
185
+ </TouchableHighlight>
186
186
  </View>
187
187
  );
188
188
  }