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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/lib/components/InboxMessage/InboxDetails/index.d.ts +6 -1
  3. package/lib/components/InboxMessage/InboxDetails/index.d.ts.map +1 -1
  4. package/lib/components/InboxMessage/InboxDetails/index.js +10 -11
  5. package/lib/components/InboxMessage/InboxDetails/index.js.map +1 -1
  6. package/lib/components/InboxMessage/InboxSidebar/index.d.ts.map +1 -1
  7. package/lib/components/InboxMessage/InboxSidebar/index.js +23 -32
  8. package/lib/components/InboxMessage/InboxSidebar/index.js.map +1 -1
  9. package/lib/components/InboxMessage/Messages/index.d.ts.map +1 -1
  10. package/lib/components/InboxMessage/Messages/index.js +42 -81
  11. package/lib/components/InboxMessage/Messages/index.js.map +1 -1
  12. package/lib/components/InboxMessage/MessagesList/index.d.ts.map +1 -1
  13. package/lib/components/InboxMessage/MessagesList/index.js +53 -74
  14. package/lib/components/InboxMessage/MessagesList/index.js.map +1 -1
  15. package/lib/components/InboxMessage/Popover/index.d.ts +5 -1
  16. package/lib/components/InboxMessage/Popover/index.d.ts.map +1 -1
  17. package/lib/components/InboxMessage/Popover/index.js +8 -35
  18. package/lib/components/InboxMessage/Popover/index.js.map +1 -1
  19. package/lib/components/InboxMessage/UserModalContent/index.d.ts.map +1 -1
  20. package/lib/components/InboxMessage/UserModalContent/index.js +50 -47
  21. package/lib/components/InboxMessage/UserModalContent/index.js.map +1 -1
  22. package/lib/components/InboxMessage/index.d.ts.map +1 -1
  23. package/lib/components/InboxMessage/index.js +38 -70
  24. package/lib/components/InboxMessage/index.js.map +1 -1
  25. package/lib/components/dashboard/menu_header.d.ts.map +1 -1
  26. package/lib/components/dashboard/menu_header.js +38 -24
  27. package/lib/components/dashboard/menu_header.js.map +1 -1
  28. package/lib/components/dashboard/modals/direct_modal.d.ts +10 -8
  29. package/lib/components/dashboard/modals/direct_modal.d.ts.map +1 -1
  30. package/lib/components/dashboard/modals/direct_modal.js +59 -39
  31. package/lib/components/dashboard/modals/direct_modal.js.map +1 -1
  32. package/lib/components/dashboard/modals.d.ts +18 -6
  33. package/lib/components/dashboard/modals.d.ts.map +1 -1
  34. package/lib/components/dashboard/modals.js +60 -101
  35. package/lib/components/dashboard/modals.js.map +1 -1
  36. package/lib/components/messenger/avatar/index.d.ts.map +1 -1
  37. package/lib/components/messenger/index.d.ts.map +1 -1
  38. package/lib/components/messenger/index.js +45 -82
  39. package/lib/components/messenger/index.js.map +1 -1
  40. package/lib/components/messenger/messagesList/index.d.ts.map +1 -1
  41. package/lib/components/messenger/messagesList/index.js +174 -454
  42. package/lib/components/messenger/messagesList/index.js.map +1 -1
  43. package/lib/components/messenger/messagesList/messageBox.d.ts +0 -1
  44. package/lib/components/messenger/messagesList/messageBox.d.ts.map +1 -1
  45. package/lib/components/messenger/more_action/index.d.ts.map +1 -1
  46. package/lib/components/messenger/postMessage/postMessage.d.ts +7 -2
  47. package/lib/components/messenger/postMessage/postMessage.d.ts.map +1 -1
  48. package/lib/components/messenger/sidebarThreadList/index.d.ts.map +1 -1
  49. package/lib/components/messenger/threadSidebar/index.d.ts.map +1 -1
  50. package/lib/components/messenger/types/message.d.ts +11 -11
  51. package/lib/components/messenger/types/message.d.ts.map +1 -1
  52. package/lib/components/post/create_post/create_post.d.ts +10 -1
  53. package/lib/components/post/create_post/create_post.d.ts.map +1 -1
  54. package/lib/components/post/index.d.ts +5 -3
  55. package/lib/components/post/index.d.ts.map +1 -1
  56. package/lib/components/post/index.js +63 -97
  57. package/lib/components/post/index.js.map +1 -1
  58. package/lib/components/post/post_header/post_header_custom_status.d.ts.map +1 -1
  59. package/lib/compute.d.ts.map +1 -1
  60. package/lib/compute.js +1 -1
  61. package/lib/compute.js.map +1 -1
  62. package/lib/containers/Dashboard.d.ts.map +1 -1
  63. package/lib/containers/Dashboard.js +110 -124
  64. package/lib/containers/Dashboard.js.map +1 -1
  65. package/lib/containers/DashboardWithLoader.d.ts.map +1 -1
  66. package/lib/containers/DashboardWithLoader.js +10 -3
  67. package/lib/containers/DashboardWithLoader.js.map +1 -1
  68. package/package.json +5 -5
  69. package/src/components/InboxMessage/InboxDetails/index.tsx +13 -15
  70. package/src/components/InboxMessage/InboxSidebar/index.tsx +23 -33
  71. package/src/components/InboxMessage/Messages/index.tsx +58 -97
  72. package/src/components/InboxMessage/MessagesList/index.tsx +71 -82
  73. package/src/components/InboxMessage/Popover/index.tsx +14 -38
  74. package/src/components/InboxMessage/UserModalContent/index.tsx +41 -44
  75. package/src/components/InboxMessage/index.tsx +53 -68
  76. package/src/components/dashboard/menu_header.tsx +52 -45
  77. package/src/components/dashboard/modals/direct_modal.tsx +73 -40
  78. package/src/components/dashboard/modals.tsx +114 -105
  79. package/src/components/messenger/avatar/index.tsx +27 -13
  80. package/src/components/messenger/index.tsx +126 -161
  81. package/src/components/messenger/messagesList/index.tsx +288 -572
  82. package/src/components/messenger/messagesList/messageBox.tsx +45 -34
  83. package/src/components/messenger/more_action/index.tsx +16 -10
  84. package/src/components/messenger/postMessage/postMessage.tsx +28 -16
  85. package/src/components/messenger/sidebarThreadList/index.tsx +52 -178
  86. package/src/components/messenger/threadSidebar/index.tsx +88 -75
  87. package/src/components/messenger/types/message.ts +12 -11
  88. package/src/components/post/channel_view/channel_view.tsx +2 -2
  89. package/src/components/post/create_post/create_post.tsx +104 -195
  90. package/src/components/post/index.tsx +78 -99
  91. package/src/components/post/post_header/post_header_custom_status.tsx +7 -6
  92. package/src/components/post/post_header/style.ts +51 -51
  93. package/src/compute.ts +8 -8
  94. package/src/containers/Dashboard.tsx +170 -213
  95. package/src/containers/DashboardWithLoader.tsx +13 -5
  96. package/lib/components/InboxMessage/InboxDetails/style.d.ts +0 -2
  97. package/lib/components/InboxMessage/InboxDetails/style.d.ts.map +0 -1
  98. package/lib/components/InboxMessage/InboxDetails/style.js +0 -27
  99. package/lib/components/InboxMessage/InboxDetails/style.js.map +0 -1
  100. package/lib/components/InboxMessage/InboxSidebar/styles.d.ts +0 -2
  101. package/lib/components/InboxMessage/InboxSidebar/styles.d.ts.map +0 -1
  102. package/lib/components/InboxMessage/InboxSidebar/styles.js +0 -57
  103. package/lib/components/InboxMessage/InboxSidebar/styles.js.map +0 -1
  104. package/lib/components/InboxMessage/Messages/styles.d.ts +0 -81
  105. package/lib/components/InboxMessage/Messages/styles.d.ts.map +0 -1
  106. package/lib/components/InboxMessage/Messages/styles.js +0 -85
  107. package/lib/components/InboxMessage/Messages/styles.js.map +0 -1
  108. package/lib/components/InboxMessage/Popover/style.d.ts +0 -28
  109. package/lib/components/InboxMessage/Popover/style.d.ts.map +0 -1
  110. package/lib/components/InboxMessage/Popover/style.js +0 -27
  111. package/lib/components/InboxMessage/Popover/style.js.map +0 -1
  112. package/lib/components/InboxMessage/UserModalContent/style.d.ts +0 -2
  113. package/lib/components/InboxMessage/UserModalContent/style.d.ts.map +0 -1
  114. package/lib/components/InboxMessage/UserModalContent/style.js +0 -98
  115. package/lib/components/InboxMessage/UserModalContent/style.js.map +0 -1
  116. package/lib/components/InboxMessage/style.js +0 -189
  117. package/lib/components/InboxMessage/style.js.map +0 -1
  118. package/lib/components/messenger/avatar/style.d.ts +0 -2
  119. package/lib/components/messenger/avatar/style.d.ts.map +0 -1
  120. package/lib/components/messenger/messagesList/style.js +0 -446
  121. package/lib/components/messenger/messagesList/style.js.map +0 -1
  122. package/lib/components/messenger/more_action/index.js +0 -48
  123. package/lib/components/messenger/more_action/index.js.map +0 -1
  124. package/lib/components/messenger/more_action/style.d.ts +0 -2
  125. package/lib/components/messenger/more_action/style.d.ts.map +0 -1
  126. package/lib/components/messenger/more_action/style.js +0 -45
  127. package/lib/components/messenger/more_action/style.js.map +0 -1
  128. package/lib/components/post/style.js +0 -20101
  129. package/lib/components/post/style.js.map +0 -1
  130. package/lib/style.js +0 -400
  131. package/lib/style.js.map +0 -1
  132. package/src/components/InboxMessage/InboxDetails/style.ts +0 -27
  133. package/src/components/InboxMessage/InboxSidebar/styles.ts +0 -57
  134. package/src/components/InboxMessage/Messages/styles.ts +0 -85
  135. package/src/components/InboxMessage/Popover/style.ts +0 -27
  136. package/src/components/InboxMessage/UserModalContent/style.ts +0 -98
  137. package/src/components/messenger/avatar/style.ts +0 -86
  138. package/src/components/messenger/more_action/style.ts +0 -45
@@ -2,23 +2,23 @@ import React, { useState, useRef, useEffect } from 'react';
2
2
  import { MessagesList } from './../messagesList/index';
3
3
  import { messagesData } from './../mock';
4
4
  import { IMessageList } from './../types/message';
5
- import { css } from '@emotion/css';
6
- import { Input, Col, Row } from 'antd';
7
5
  import { AiOutlineClose } from '@react-icons/all-files/ai/AiOutlineClose';
8
- import { HiOutlinePaperClip } from 'react-icons/hi';
9
- import { MdOutlineEmojiEmotions } from 'react-icons/md';
6
+ import { HiOutlinePaperClip } from '@react-icons/all-files/hi/HiOutlinePaperClip';
7
+ import { MdSentimentSatisfied } from '@react-icons/all-files/md/MdSentimentSatisfied';
10
8
  import { useTranslation } from 'react-i18next';
11
9
  import { Picker } from 'emoji-mart';
12
- import { styleSheet } from './style';
13
10
  import { PostMessage } from './../postMessage/postMessage';
14
11
  import { SidebarThreadList } from './../sidebarThreadList';
15
12
 
16
13
  export const ThreadSidebar = (props) => {
17
- // const { handleEnterButton } = props;
18
14
  const [enterValue, setEnterValue] = useState<string>('');
19
15
  const { t } = useTranslation();
20
16
  const [flag, setFlag] = useState<boolean>(false);
21
17
  const [userMessagesReplyList, setUserMessagesReplyList] = useState<IMessageList | any>([]);
18
+ const [displayEmoji, setDisplayEmoji] = useState(false);
19
+ const messagesEndRef = useRef(null);
20
+ const fileUploader = useRef(null);
21
+
22
22
  useEffect(() => {
23
23
  if (flag === true) {
24
24
  setTimeout(() => {
@@ -36,94 +36,107 @@ export const ThreadSidebar = (props) => {
36
36
  }
37
37
  scrollToBottom();
38
38
  }, [flag]);
39
- const messagesEndRef = useRef(null);
39
+
40
40
  const scrollToBottom = () => {
41
41
  messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
42
42
  };
43
- document.body.onclick = () => {
44
- setDisplayEmoji(false);
45
- };
46
- const [displayEmoji, setDisplayEmoji] = useState(false);
47
- const emojiClick = () => {
43
+
44
+ useEffect(() => {
45
+ const handleClickOutside = () => {
46
+ setDisplayEmoji(false);
47
+ };
48
+ document.body.addEventListener('click', handleClickOutside);
49
+ return () => {
50
+ document.body.removeEventListener('click', handleClickOutside);
51
+ };
52
+ }, []);
53
+
54
+ const emojiClick = (e: React.MouseEvent) => {
55
+ e.stopPropagation();
48
56
  setDisplayEmoji(true);
49
57
  };
50
- const fileUploader = useRef(null);
58
+
51
59
  const fileClick = () => {
52
60
  fileUploader.current.click();
53
61
  };
54
- const handleEnterButton = (e) => {
55
- setEnterValue(e.target.value);
56
- setUserMessagesReplyList([
57
- ...userMessagesReplyList,
58
- {
59
- threadId: Math.random(),
60
- message: enterValue,
61
- loginUser: true,
62
- timeIsToday: true,
63
- },
64
- ]);
65
- setEnterValue('');
66
- setFlag(true);
62
+
63
+ const handleEnterButton = (e: React.KeyboardEvent<HTMLInputElement>) => {
64
+ if (e.key === 'Enter' && enterValue.trim()) {
65
+ setUserMessagesReplyList([
66
+ ...userMessagesReplyList,
67
+ {
68
+ threadId: Math.random(),
69
+ message: enterValue,
70
+ loginUser: true,
71
+ timeIsToday: true,
72
+ },
73
+ ]);
74
+ setEnterValue('');
75
+ setFlag(true);
76
+ }
67
77
  };
68
78
 
69
79
  return (
70
- <div className={css(styleSheet.ThreadSidebarStyles)}>
71
- <Col>
72
- <div className="close-icon">
73
- <AiOutlineClose />
74
- </div>
75
- </Col>
76
- <Col md={16}>
80
+ <div className="flex flex-col h-full bg-white">
81
+ <div className="flex justify-end p-4">
82
+ <button className="text-gray-500 hover:text-gray-700 transition-colors">
83
+ <AiOutlineClose className="w-5 h-5" />
84
+ </button>
85
+ </div>
86
+
87
+ <div className="flex-1 overflow-y-auto">
77
88
  <SidebarThreadList userMessagesList={userMessagesReplyList} />
78
89
  <div ref={messagesEndRef} />
79
- </Col>
80
- <Col md={16} className="input_row_thread">
81
- <div className="input_class">
82
- {displayEmoji ? (
83
- <Picker
84
- native={true}
85
- set="apple"
86
- emoji="point_up"
87
- title={t('messenger_box_browser.pick_your_emoji')}
88
- emojiSize={24}
89
- perLine={6}
90
- color="#ae65c5"
91
- // skin={null}
92
- // defaultSkin={1}
93
- sheetSize={16}
94
- // emojisToShowFilter={null}
95
- showPreview={true}
96
- showSkinTones={false}
97
- // emojiTooltip={false}
98
- // autoFocus={false}
99
- // skinEmoji=""
100
- notFoundEmoji="sleuth_or_spy"
101
- />
102
- ) : (
103
- ''
90
+ </div>
91
+
92
+ <div className="p-4 border-t border-gray-200">
93
+ <div className="relative">
94
+ {displayEmoji && (
95
+ <div className="absolute bottom-full mb-2">
96
+ <Picker
97
+ native={true}
98
+ set="apple"
99
+ emoji="point_up"
100
+ title={t('messenger_box_browser.pick_your_emoji')}
101
+ emojiSize={24}
102
+ perLine={6}
103
+ color="#ae65c5"
104
+ sheetSize={16}
105
+ showPreview={true}
106
+ showSkinTones={false}
107
+ notFoundEmoji="sleuth_or_spy"
108
+ />
109
+ </div>
104
110
  )}
105
- <Input
106
- value={enterValue}
107
- onChange={(e: any) => setEnterValue(e?.target?.value)}
108
- onPressEnter={(e) => handleEnterButton(e)}
109
- placeholder={t('messenger_box_browser.please_enter')}
110
- className="msg_input"
111
- />
112
- <div className="icon_box">
113
- <div className="icon_style">
114
- <input type="file" ref={fileUploader} style={{ display: 'none' }} />
115
- <button style={{ border: '0px' }} onClick={fileClick}>
116
- <HiOutlinePaperClip />
111
+
112
+ <div className="flex items-center space-x-2 bg-white rounded-lg border border-gray-300 focus-within:border-blue-500 focus-within:ring-1 focus-within:ring-blue-500">
113
+ <input
114
+ type="text"
115
+ value={enterValue}
116
+ onChange={(e) => setEnterValue(e.target.value)}
117
+ onKeyPress={handleEnterButton}
118
+ placeholder={t('messenger_box_browser.please_enter')}
119
+ className="flex-1 px-4 py-2 bg-transparent outline-none placeholder-gray-500"
120
+ />
121
+
122
+ <div className="flex items-center space-x-2 px-2">
123
+ <input type="file" ref={fileUploader} className="hidden" />
124
+ <button
125
+ onClick={fileClick}
126
+ className="text-gray-500 hover:text-gray-700 p-1 rounded-full hover:bg-gray-100 transition-colors"
127
+ >
128
+ <HiOutlinePaperClip className="w-5 h-5" />
117
129
  </button>
118
- </div>
119
- <div className="icon_style">
120
- <button style={{ border: '0px' }} onClick={emojiClick}>
121
- <MdOutlineEmojiEmotions />
130
+ <button
131
+ onClick={emojiClick}
132
+ className="text-gray-500 hover:text-gray-700 p-1 rounded-full hover:bg-gray-100 transition-colors"
133
+ >
134
+ <MdSentimentSatisfied className="w-5 h-5" />
122
135
  </button>
123
136
  </div>
124
137
  </div>
125
138
  </div>
126
- </Col>
139
+ </div>
127
140
  </div>
128
141
  );
129
142
  };
@@ -1,16 +1,17 @@
1
+ export interface IUser {
2
+ id: string;
3
+ name: string;
4
+ avatar?: string;
5
+ }
6
+
1
7
  export interface IMessageList {
2
- id: number;
3
- loginUser: boolean;
8
+ id: string;
4
9
  message: string;
5
- timeIsToday: boolean;
6
- isReply: boolean;
7
- thread?: IMessageReplyList[]
8
- isPin?: boolean
10
+ user_id: string;
11
+ create_at: number;
12
+ user?: IUser;
9
13
  }
10
14
 
11
- export interface IMessageReplyList {
12
- threadId: number;
13
- message: string
14
- time: string;
15
- timeIsToday: boolean;
15
+ export interface IMessageReplyList extends IMessageList {
16
+ isBot?: boolean;
16
17
  }
@@ -44,7 +44,7 @@ export const ChannelView = (props) => {
44
44
 
45
45
  let createPost;
46
46
  if (deactivatedChannel) {
47
- console.log(deactivatedChannel,'deactivatedChannel');
47
+ console.log(deactivatedChannel, 'deactivatedChannel');
48
48
  createPost = (
49
49
  <div className="post-create__container" id="post-create">
50
50
  <div className="channel-archived__message">
@@ -75,7 +75,7 @@ export const ChannelView = (props) => {
75
75
  } else if (!baseProps.channelRolesLoading) {
76
76
  createPost = (
77
77
  <div className="post-create__container" id="post-create">
78
- <CreatePost getChannelView={getChannelView} />
78
+ <CreatePost />
79
79
  </div>
80
80
  );
81
81
  }
@@ -5,18 +5,26 @@ import * as Utils from '../../../utils/utils';
5
5
  import { t } from '../../../utils/i18n';
6
6
  import { FormattedMessage } from 'react-intl';
7
7
  import TutorialTip from '../../post/tutorial/tutorial_tip/tutorial_tip';
8
+ import { MdSentimentSatisfied } from '@react-icons/all-files/md/MdSentimentSatisfied';
9
+ import { MdAttachFile } from '@react-icons/all-files/md/MdAttachFile';
8
10
 
9
- export const CreatePost = (props) => {
10
- console.log({ props }, 'create post page');
11
- const currentChannelProp = {
12
- id: 'owsyt8n43jfxjpzh9np93mx1wa',
13
- type: 'O',
14
- display_name: 'default name',
11
+ interface CreatePostProps {
12
+ draft?: {
13
+ message?: string;
15
14
  };
16
- const { draft, fullWidthTextBox, canPost } = props;
17
-
18
- const [message, setMessage] = useState(props?.draft?.message);
19
- const [caretPosition, setCaretPosition] = useState(props?.draft?.message?.length);
15
+ fullWidthTextBox?: boolean;
16
+ canPost?: boolean;
17
+ readOnlyChannel?: boolean;
18
+ }
19
+
20
+ export const CreatePost: React.FC<CreatePostProps> = ({
21
+ draft,
22
+ fullWidthTextBox,
23
+ canPost = true,
24
+ readOnlyChannel = false,
25
+ }) => {
26
+ const [message, setMessage] = useState(draft?.message || '');
27
+ const [caretPosition, setCaretPosition] = useState(draft?.message?.length || 0);
20
28
  const [submitting, setSubmitting] = useState(false);
21
29
  const [showPostDeletedModal, setShowPostDeletedModal] = useState(false);
22
30
  const [showEmojiPicker, setShowEmojiPicker] = useState(false);
@@ -25,201 +33,102 @@ export const CreatePost = (props) => {
25
33
  const [uploadsProgressPercent, setUploadsProgressPercent] = useState({});
26
34
  const [renderScrollbar, setRenderScrollbar] = useState(false);
27
35
  const [scrollbarWidth, setScrollbarWidth] = useState(0);
28
- const [currentChannel, setCurrentChannel] = useState(currentChannelProp);
29
- const [mentions, setMentions] = useState([]);
30
- const [memberNotifyCount, setMemberNotifyCount] = useState(0);
31
- const [errorClass, setErrorClass] = useState(null);
32
- const [serverError, setServerError] = useState(null);
36
+ const [errorClass, setErrorClass] = useState<string | null>(null);
37
+ const [serverError, setServerError] = useState<string | null>(null);
33
38
  const [showTutorialTip, setShowTutorialTip] = useState(true);
34
39
 
35
- const readOnlyChannel = props.readOnlyChannel || !canPost;
36
-
37
- const topDiv = useRef();
38
- const textboxRef = useRef();
39
- const fileUploadRef = useRef();
40
- const createPostControlsRef = useRef();
41
-
42
- const ariaLabelMessageInput = Utils.localizeMessage(
43
- 'accessibility.sections.centerFooter',
44
- 'message input complimentary region',
45
- );
40
+ const textboxRef = useRef<HTMLTextAreaElement>(null);
41
+ const fileUploadRef = useRef<HTMLInputElement>(null);
46
42
 
47
- const createTutorialTip = () => {
48
- const screens = [];
43
+ const isPostAllowed = !readOnlyChannel && canPost;
49
44
 
50
- screens.push(
51
- <div>
52
- <h4>
53
- <FormattedMessage id="create_post.tutorialTip.title" defaultMessage="Send a message" />
54
- </h4>
55
- {/* <p>
56
- <FormattedMarkdownMessage
57
- id='create_post.tutorialTip1'
58
- defaultMessage='Type your first message and select **Enter** to send it.'
59
- />
60
- </p>
61
- <p>
62
- <FormattedMarkdownMessage
63
- id='create_post.tutorialTip2'
64
- defaultMessage='Use the **Attachments** and **Emoji** buttons to add files and emojis to your messages.'
65
- />
66
- </p> */}
67
- </div>,
68
- );
45
+ const handleSubmit = (e: React.FormEvent) => {
46
+ e.preventDefault();
47
+ if (!message.trim() || !isPostAllowed) return;
69
48
 
70
- return (
71
- <TutorialTip
72
- placement="top"
73
- screens={screens}
74
- overlayClass="tip-overlay--chat"
75
- telemetryTag="tutorial_tip_1_sending_messages"
76
- />
77
- );
49
+ setSubmitting(true);
50
+ // Add your submission logic here
51
+ setMessage('');
52
+ setSubmitting(false);
78
53
  };
79
54
 
80
- let tutorialTip = null;
81
- if (showTutorialTip) {
82
- tutorialTip = createTutorialTip();
83
- }
84
-
85
- let centerClass = '';
86
- if (!fullWidthTextBox) {
87
- centerClass = 'center';
88
- }
89
-
90
- let sendButtonClass = 'send-button theme';
91
- // if (!shouldEnableSendButton()) {
92
- // sendButtonClass += ' disabled';
93
- // }
94
-
95
- let attachmentsDisabled = '';
96
- if (!props.canUploadFiles) {
97
- attachmentsDisabled = ' post-create--attachment-disabled';
98
- }
99
-
100
- let scrollbarClass = '';
101
- if (renderScrollbar) {
102
- scrollbarClass = ' scroll';
103
- }
104
-
105
- let callButton;
106
- if (!readOnlyChannel && !props.shouldShowPreview) {
107
- callButton = <h1>call button</h1>;
108
- // callButton = <CallButton />;
109
- }
110
-
111
- let fileUpload;
112
- if (!readOnlyChannel && !props.shouldShowPreview) {
113
- fileUpload = (
114
- <h1>text</h1>
115
- // <FileUpload
116
- // ref={fileUploadRef}
117
- // fileCount={getFileCount()}
118
- // getTarget={getFileUploadTarget}
119
- // onFileUploadChange={handleFileUploadChange}
120
- // onUploadStart={handleUploadStart}
121
- // onFileUpload={handleFileUploadComplete}
122
- // onUploadError={handleUploadError}
123
- // onUploadProgress={handleUploadProgress}
124
- // postType='post'
125
- // channelId={currentChannel.id}
126
- // />
127
- );
128
- }
129
-
130
- let createMessage;
131
- if (readOnlyChannel) {
132
- createMessage = Utils.localizeMessage(
133
- 'create_post.read_only',
134
- 'This channel is read-only. Only members with permission can post here.',
135
- );
136
- } else {
137
- createMessage = <h1>createMessage</h1>;
138
- // createMessage = formatMessage(
139
- // { id: 'create_post.write', defaultMessage: 'Write to {channelDisplayName}' },
140
- // { channelDisplayName: currentChannel.display_name },
141
- // );
142
- }
55
+ const handleFileUpload = () => {
56
+ fileUploadRef.current?.click();
57
+ };
143
58
 
144
59
  return (
145
- <form
146
- id="create_post"
147
- // ref={topDiv}
148
- className={centerClass}
149
- // onSubmit={handleSubmit}
150
- >
151
- <div
152
- className={'post-create' + attachmentsDisabled + scrollbarClass}
153
- style={
154
- renderScrollbar && scrollbarWidth
155
- ? ({ '--detected-scrollbar-width': `${scrollbarWidth}px` } as any)
156
- : undefined
157
- }
158
- >
159
- <div className="post-create-body">
160
- <div
161
- role="application"
162
- id="centerChannelFooter"
163
- aria-label={ariaLabelMessageInput as any}
164
- tabIndex={-1}
165
- className="post-body__cell a11y__region"
166
- data-a11y-sort-order="2"
60
+ <div className="flex flex-col p-4 border-t border-gray-200">
61
+ {showTutorialTip && (
62
+ <div className="mb-4 p-4 bg-blue-50 text-blue-700 rounded-md">
63
+ <FormattedMessage
64
+ id="create_post.tutorialTip"
65
+ defaultMessage="Type here to write a message. Use the buttons on the right for file uploads and emoji."
66
+ />
67
+ <button
68
+ onClick={() => setShowTutorialTip(false)}
69
+ className="ml-2 text-blue-500 hover:text-blue-700"
167
70
  >
168
- {/* <Textbox/> */}
169
- <span className="post-body__actions">
170
- {/* {callButton} */}
171
- {/* {fileUpload} */}
172
-
173
- {/* {emojiPicker} */}
174
- <a
175
- role="button"
176
- tabIndex={0}
177
- aria-label="Send a message"
178
- // aria-label={formatMessage({
179
- // id: 'create_post.send_message',
180
- // defaultMessage: 'Send a message',
181
- // })}
182
- className={sendButtonClass}
183
- // onClick={handleSubmit}
184
- >
185
- {/* <LocalizedIcon
186
- className="fa fa-paper-plane"
187
- title={{
188
- id: t('create_post.icon'),
189
- defaultMessage: 'Create a post',
190
- }}
191
- /> */}
192
- </a>
193
- </span>
194
- </div>
195
- {tutorialTip}
71
+ Got it
72
+ </button>
196
73
  </div>
197
- {/* <div id="postCreateFooter" role="form" className={postFooterClassName}>
198
- <div className="d-flex justify-content-between">
199
- <MsgTyping channelId={currentChannel.id} postId="" />
200
- <TextboxLinks
201
- characterLimit={props.maxPostSize}
202
- showPreview={props.shouldShowPreview}
203
- updatePreview={setShowPreview}
204
- message={readOnlyChannel ? '' : message}
205
- />
206
- </div>
207
- <div>
208
- {postError}
209
- {preview}
210
- {serverError}
211
- </div>
212
- </div> */}
213
- </div>
214
- {/* <PostDeletedModal show={showPostDeletedModal} onHide={hidePostDeletedModal} /> */}
215
- {/* <ConfirmModal
216
- title={notifyAllTitle}
217
- message={notifyAllMessage}
218
- confirmButtonText={notifyAllConfirm}
219
- show={showConfirmModal}
220
- onConfirm={handleNotifyAllConfirmation}
221
- onCancel={hideNotifyAllModal}
222
- /> */}
223
- </form>
74
+ )}
75
+
76
+ <form onSubmit={handleSubmit} className="relative">
77
+ <textarea
78
+ ref={textboxRef}
79
+ value={message}
80
+ onChange={(e) => setMessage(e.target.value)}
81
+ placeholder={t('create_post.write')}
82
+ disabled={!isPostAllowed || submitting}
83
+ className={`w-full px-4 py-2 text-gray-700 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent ${
84
+ errorClass ? 'border-red-500' : 'border-gray-300'
85
+ } ${!isPostAllowed || submitting ? 'bg-gray-100' : 'bg-white'}`}
86
+ rows={3}
87
+ />
88
+
89
+ <div className="absolute right-2 bottom-2 flex items-center space-x-2">
90
+ <button
91
+ type="button"
92
+ onClick={handleFileUpload}
93
+ disabled={!isPostAllowed}
94
+ className="p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed"
95
+ >
96
+ <MdAttachFile className="h-5 w-5" />
97
+ </button>
98
+ <button
99
+ type="button"
100
+ onClick={() => setShowEmojiPicker(!showEmojiPicker)}
101
+ disabled={!isPostAllowed}
102
+ className="p-2 text-gray-400 hover:text-gray-600 rounded-full hover:bg-gray-100 disabled:opacity-50 disabled:cursor-not-allowed"
103
+ >
104
+ <MdSentimentSatisfied className="h-5 w-5" />
105
+ </button>
106
+ <button
107
+ type="submit"
108
+ disabled={!message.trim() || submitting || !isPostAllowed}
109
+ className={`px-4 py-2 rounded-md ${
110
+ !message.trim() || submitting || !isPostAllowed
111
+ ? 'bg-gray-300 cursor-not-allowed'
112
+ : 'bg-primary-600 hover:bg-primary-700'
113
+ } text-white font-medium`}
114
+ >
115
+ {submitting ? 'Sending...' : 'Send'}
116
+ </button>
117
+ </div>
118
+
119
+ <input
120
+ type="file"
121
+ ref={fileUploadRef}
122
+ className="hidden"
123
+ multiple
124
+ onChange={(e) => {
125
+ // Handle file upload
126
+ console.log(e.target.files);
127
+ }}
128
+ />
129
+ </form>
130
+
131
+ {serverError && <div className="mt-2 text-red-500 text-sm">{serverError}</div>}
132
+ </div>
224
133
  );
225
134
  };