@weavy/uikit-react 14.0.4 → 15.0.1
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/.vscode/settings.json +2 -0
- package/changelog.md +10 -0
- package/dist/cjs/client/WeavyClient.d.ts +1 -0
- package/dist/cjs/components/Attachment.d.ts +5 -5
- package/dist/cjs/components/Blob.d.ts +9 -0
- package/dist/cjs/components/Comment.d.ts +18 -0
- package/dist/cjs/components/CommentCount.d.ts +7 -0
- package/dist/cjs/components/CommentEdit.d.ts +16 -0
- package/dist/cjs/components/CommentPlaceholder.d.ts +8 -0
- package/dist/cjs/components/CommentTrashed.d.ts +15 -0
- package/dist/cjs/components/CommentView.d.ts +18 -0
- package/dist/cjs/components/Comments.d.ts +8 -0
- package/dist/cjs/components/ConversationListItem.d.ts +1 -1
- package/dist/cjs/components/Dropzone.d.ts +10 -0
- package/dist/cjs/components/Editor.d.ts +25 -0
- package/dist/cjs/components/Embed.d.ts +8 -0
- package/dist/cjs/components/FileItem.d.ts +41 -0
- package/dist/cjs/components/FileList.d.ts +11 -0
- package/dist/cjs/components/FileVersions.d.ts +9 -0
- package/dist/cjs/components/Files.d.ts +4 -0
- package/dist/cjs/components/Image.d.ts +3 -3
- package/dist/cjs/components/MeetingCard.d.ts +1 -1
- package/dist/cjs/components/Meetings.d.ts +2 -1
- package/dist/cjs/components/Poll.d.ts +8 -0
- package/dist/cjs/components/PollOption.d.ts +10 -0
- package/dist/cjs/components/Post.d.ts +21 -0
- package/dist/cjs/components/PostEdit.d.ts +17 -0
- package/dist/cjs/components/PostList.d.ts +6 -0
- package/dist/cjs/components/PostPlaceholder.d.ts +8 -0
- package/dist/cjs/components/PostTrashed.d.ts +14 -0
- package/dist/cjs/components/PostView.d.ts +21 -0
- package/dist/cjs/components/Posts.d.ts +4 -0
- package/dist/cjs/components/Preview.d.ts +1 -3
- package/dist/cjs/components/PreviewFiles.d.ts +10 -0
- package/dist/cjs/components/Reactions.d.ts +6 -2
- package/dist/cjs/components/SearchUsers.d.ts +2 -1
- package/dist/cjs/contexts/CloudFilesContext.d.ts +9 -0
- package/dist/cjs/hooks/useApps.d.ts +1 -0
- package/dist/cjs/hooks/useCloudFiles.d.ts +3 -0
- package/dist/cjs/hooks/useCommentList.d.ts +1 -0
- package/dist/cjs/hooks/useEmbeds.d.ts +5 -0
- package/dist/cjs/hooks/useFileList.d.ts +1 -0
- package/dist/cjs/hooks/useFileUploader.d.ts +8 -0
- package/dist/cjs/hooks/useFileVersions.d.ts +2 -0
- package/dist/cjs/hooks/useInfiniteScroll.d.ts +4 -0
- package/dist/cjs/hooks/useIsFirstRender.d.ts +2 -0
- package/dist/cjs/hooks/useMutateApps.d.ts +5 -0
- package/dist/cjs/hooks/useMutateComment.d.ts +10 -0
- package/dist/cjs/hooks/useMutateConversationName.d.ts +1 -1
- package/dist/cjs/hooks/useMutateDeleteReaction.d.ts +3 -1
- package/dist/cjs/hooks/useMutateEditComment.d.ts +10 -0
- package/dist/cjs/hooks/useMutateEditPost.d.ts +10 -0
- package/dist/cjs/hooks/useMutateExternalBlobs.d.ts +2 -2
- package/dist/cjs/hooks/useMutateFile.d.ts +26 -0
- package/dist/cjs/hooks/useMutateFileRename.d.ts +5 -0
- package/dist/cjs/hooks/useMutateFileSubscribe.d.ts +7 -0
- package/dist/cjs/hooks/useMutateFileTrash.d.ts +10 -0
- package/dist/cjs/hooks/useMutateFileVersion.d.ts +7 -0
- package/dist/cjs/hooks/useMutateFiles.d.ts +2 -0
- package/dist/cjs/hooks/useMutateLeaveConversation.d.ts +4 -0
- package/dist/cjs/hooks/useMutateMessage.d.ts +2 -2
- package/dist/cjs/hooks/useMutatePost.d.ts +10 -0
- package/dist/cjs/hooks/useMutateReaction.d.ts +3 -1
- package/dist/cjs/hooks/useMutateRead.d.ts +1 -1
- package/dist/cjs/hooks/useMutateReplaceReaction.d.ts +6 -0
- package/dist/cjs/hooks/useMutateRestoreComment.d.ts +5 -0
- package/dist/cjs/hooks/useMutateRestorePost.d.ts +4 -0
- package/dist/cjs/hooks/useMutateStarred.d.ts +4 -0
- package/dist/cjs/hooks/useMutateSubscribe.d.ts +4 -0
- package/dist/cjs/hooks/useMutateTrashComment.d.ts +5 -0
- package/dist/cjs/hooks/useMutateTrashPost.d.ts +4 -0
- package/dist/cjs/hooks/useMutateTyping.d.ts +2 -0
- package/dist/cjs/hooks/useMutateUnsubscribe.d.ts +4 -0
- package/dist/cjs/hooks/useMutateVote.d.ts +5 -0
- package/dist/cjs/hooks/usePost.d.ts +1 -0
- package/dist/cjs/hooks/usePosts.d.ts +1 -0
- package/dist/cjs/hooks/usePostsList.d.ts +1 -0
- package/dist/cjs/hooks/useReactionList.d.ts +1 -0
- package/dist/cjs/hooks/useSessionState.d.ts +2 -0
- package/dist/cjs/hooks/useUnload.d.ts +2 -0
- package/dist/cjs/hooks/useUpdateEffect.d.ts +3 -0
- package/dist/cjs/hooks/useVotes.d.ts +1 -0
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +28 -6
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/ConversationListItem.d.ts +1 -0
- package/dist/cjs/types/Files.d.ts +7 -0
- package/dist/cjs/types/Message.d.ts +2 -2
- package/dist/cjs/types/Posts.d.ts +4 -0
- package/dist/cjs/types/interfaces.d.ts +9 -0
- package/dist/cjs/types/types.d.ts +138 -22
- package/dist/cjs/ui/Dropdown.d.ts +18 -2
- package/dist/cjs/ui/Icon.d.ts +10 -2
- package/dist/cjs/ui/Overlay.d.ts +3 -1
- package/dist/cjs/ui/Sheet.d.ts +14 -0
- package/dist/cjs/ui/Spinner.d.ts +2 -1
- package/dist/cjs/utils/cacheUtils.d.ts +14 -0
- package/dist/cjs/utils/fileUtilities.d.ts +10 -1
- package/dist/cjs/utils/mentions.d.ts +6 -0
- package/dist/cjs/utils/openUrl.d.ts +1 -0
- package/dist/css/weavy-chat.css +637 -218
- package/dist/css/weavy-files.css +3046 -0
- package/dist/css/weavy-messenger.css +643 -213
- package/dist/css/weavy-posts.css +2773 -0
- package/dist/css/weavy.css +1749 -308
- package/dist/esm/client/WeavyClient.d.ts +1 -0
- package/dist/esm/components/Attachment.d.ts +5 -5
- package/dist/esm/components/Blob.d.ts +9 -0
- package/dist/esm/components/Comment.d.ts +18 -0
- package/dist/esm/components/CommentCount.d.ts +7 -0
- package/dist/esm/components/CommentEdit.d.ts +16 -0
- package/dist/esm/components/CommentPlaceholder.d.ts +8 -0
- package/dist/esm/components/CommentTrashed.d.ts +15 -0
- package/dist/esm/components/CommentView.d.ts +18 -0
- package/dist/esm/components/Comments.d.ts +8 -0
- package/dist/esm/components/ConversationListItem.d.ts +1 -1
- package/dist/esm/components/Dropzone.d.ts +10 -0
- package/dist/esm/components/Editor.d.ts +25 -0
- package/dist/esm/components/Embed.d.ts +8 -0
- package/dist/esm/components/FileItem.d.ts +41 -0
- package/dist/esm/components/FileList.d.ts +11 -0
- package/dist/esm/components/FileVersions.d.ts +9 -0
- package/dist/esm/components/Files.d.ts +4 -0
- package/dist/esm/components/Image.d.ts +3 -3
- package/dist/esm/components/MeetingCard.d.ts +1 -1
- package/dist/esm/components/Meetings.d.ts +2 -1
- package/dist/esm/components/Poll.d.ts +8 -0
- package/dist/esm/components/PollOption.d.ts +10 -0
- package/dist/esm/components/Post.d.ts +21 -0
- package/dist/esm/components/PostEdit.d.ts +17 -0
- package/dist/esm/components/PostList.d.ts +6 -0
- package/dist/esm/components/PostPlaceholder.d.ts +8 -0
- package/dist/esm/components/PostTrashed.d.ts +14 -0
- package/dist/esm/components/PostView.d.ts +21 -0
- package/dist/esm/components/Posts.d.ts +4 -0
- package/dist/esm/components/Preview.d.ts +1 -3
- package/dist/esm/components/PreviewFiles.d.ts +10 -0
- package/dist/esm/components/Reactions.d.ts +6 -2
- package/dist/esm/components/SearchUsers.d.ts +2 -1
- package/dist/esm/contexts/CloudFilesContext.d.ts +9 -0
- package/dist/esm/hooks/useApps.d.ts +1 -0
- package/dist/esm/hooks/useCloudFiles.d.ts +3 -0
- package/dist/esm/hooks/useCommentList.d.ts +1 -0
- package/dist/esm/hooks/useEmbeds.d.ts +5 -0
- package/dist/esm/hooks/useFileList.d.ts +1 -0
- package/dist/esm/hooks/useFileUploader.d.ts +8 -0
- package/dist/esm/hooks/useFileVersions.d.ts +2 -0
- package/dist/esm/hooks/useInfiniteScroll.d.ts +4 -0
- package/dist/esm/hooks/useIsFirstRender.d.ts +2 -0
- package/dist/esm/hooks/useMutateApps.d.ts +5 -0
- package/dist/esm/hooks/useMutateComment.d.ts +10 -0
- package/dist/esm/hooks/useMutateConversationName.d.ts +1 -1
- package/dist/esm/hooks/useMutateDeleteReaction.d.ts +3 -1
- package/dist/esm/hooks/useMutateEditComment.d.ts +10 -0
- package/dist/esm/hooks/useMutateEditPost.d.ts +10 -0
- package/dist/esm/hooks/useMutateExternalBlobs.d.ts +2 -2
- package/dist/esm/hooks/useMutateFile.d.ts +26 -0
- package/dist/esm/hooks/useMutateFileRename.d.ts +5 -0
- package/dist/esm/hooks/useMutateFileSubscribe.d.ts +7 -0
- package/dist/esm/hooks/useMutateFileTrash.d.ts +10 -0
- package/dist/esm/hooks/useMutateFileVersion.d.ts +7 -0
- package/dist/esm/hooks/useMutateFiles.d.ts +2 -0
- package/dist/esm/hooks/useMutateLeaveConversation.d.ts +4 -0
- package/dist/esm/hooks/useMutateMessage.d.ts +2 -2
- package/dist/esm/hooks/useMutatePost.d.ts +10 -0
- package/dist/esm/hooks/useMutateReaction.d.ts +3 -1
- package/dist/esm/hooks/useMutateRead.d.ts +1 -1
- package/dist/esm/hooks/useMutateReplaceReaction.d.ts +6 -0
- package/dist/esm/hooks/useMutateRestoreComment.d.ts +5 -0
- package/dist/esm/hooks/useMutateRestorePost.d.ts +4 -0
- package/dist/esm/hooks/useMutateStarred.d.ts +4 -0
- package/dist/esm/hooks/useMutateSubscribe.d.ts +4 -0
- package/dist/esm/hooks/useMutateTrashComment.d.ts +5 -0
- package/dist/esm/hooks/useMutateTrashPost.d.ts +4 -0
- package/dist/esm/hooks/useMutateTyping.d.ts +2 -0
- package/dist/esm/hooks/useMutateUnsubscribe.d.ts +4 -0
- package/dist/esm/hooks/useMutateVote.d.ts +5 -0
- package/dist/esm/hooks/usePost.d.ts +1 -0
- package/dist/esm/hooks/usePosts.d.ts +1 -0
- package/dist/esm/hooks/usePostsList.d.ts +1 -0
- package/dist/esm/hooks/useReactionList.d.ts +1 -0
- package/dist/esm/hooks/useSessionState.d.ts +2 -0
- package/dist/esm/hooks/useUnload.d.ts +2 -0
- package/dist/esm/hooks/useUpdateEffect.d.ts +3 -0
- package/dist/esm/hooks/useVotes.d.ts +1 -0
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +28 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/ConversationListItem.d.ts +1 -0
- package/dist/esm/types/Files.d.ts +7 -0
- package/dist/esm/types/Message.d.ts +2 -2
- package/dist/esm/types/Posts.d.ts +4 -0
- package/dist/esm/types/interfaces.d.ts +9 -0
- package/dist/esm/types/types.d.ts +138 -22
- package/dist/esm/ui/Dropdown.d.ts +18 -2
- package/dist/esm/ui/Icon.d.ts +10 -2
- package/dist/esm/ui/Overlay.d.ts +3 -1
- package/dist/esm/ui/Sheet.d.ts +14 -0
- package/dist/esm/ui/Spinner.d.ts +2 -1
- package/dist/esm/utils/cacheUtils.d.ts +14 -0
- package/dist/esm/utils/fileUtilities.d.ts +10 -1
- package/dist/esm/utils/mentions.d.ts +6 -0
- package/dist/esm/utils/openUrl.d.ts +1 -0
- package/dist/index.d.ts +50 -6
- package/package.json +8 -2
- package/src/client/WeavyClient.ts +35 -1
- package/src/components/Attachment.tsx +20 -13
- package/src/components/Blob.tsx +28 -0
- package/src/components/Comment.tsx +43 -0
- package/src/components/CommentCount.tsx +15 -0
- package/src/components/CommentEdit.tsx +48 -0
- package/src/components/CommentPlaceholder.tsx +34 -0
- package/src/components/CommentTrashed.tsx +45 -0
- package/src/components/CommentView.tsx +142 -0
- package/src/components/Comments.tsx +78 -0
- package/src/components/Conversation.tsx +85 -31
- package/src/components/ConversationList.tsx +12 -41
- package/src/components/ConversationListItem.tsx +125 -74
- package/src/components/Dropzone.tsx +26 -0
- package/src/components/Editor.tsx +700 -0
- package/src/components/Embed.tsx +80 -0
- package/src/components/FileItem.tsx +391 -0
- package/src/components/FileList.tsx +166 -0
- package/src/components/FileVersions.tsx +100 -0
- package/src/components/Files.tsx +294 -0
- package/src/components/Image.tsx +11 -10
- package/src/components/Meeting.tsx +1 -2
- package/src/components/MeetingCard.tsx +1 -1
- package/src/components/Meetings.tsx +13 -5
- package/src/components/Message.tsx +14 -19
- package/src/components/Messages.tsx +38 -64
- package/src/components/NewConversation.tsx +8 -6
- package/src/components/PdfViewer.tsx +2 -2
- package/src/components/Poll.tsx +45 -0
- package/src/components/PollOption.tsx +65 -0
- package/src/components/Post.tsx +45 -0
- package/src/components/PostEdit.tsx +49 -0
- package/src/components/PostList.tsx +95 -0
- package/src/components/PostPlaceholder.tsx +32 -0
- package/src/components/PostTrashed.tsx +35 -0
- package/src/components/PostView.tsx +194 -0
- package/src/components/Posts.tsx +59 -0
- package/src/components/Preview.tsx +16 -23
- package/src/components/PreviewFiles.tsx +336 -0
- package/src/components/Reactions.tsx +142 -38
- package/src/components/SearchUsers.tsx +77 -37
- package/src/components/Typing.tsx +1 -1
- package/src/{components/FileBrowser.tsx → contexts/CloudFilesContext.tsx} +46 -30
- package/src/contexts/PreviewContext.tsx +102 -85
- package/src/contexts/WeavyContext.tsx +10 -6
- package/src/hooks/useApps.ts +23 -0
- package/src/hooks/useCloudFiles.ts +12 -0
- package/src/hooks/useCommentList.ts +30 -0
- package/src/hooks/useEmbeds.ts +126 -0
- package/src/hooks/useEvents.ts +3 -1
- package/src/hooks/useFileList.ts +84 -0
- package/src/hooks/useFileUploader.ts +38 -1
- package/src/hooks/useFileVersions.ts +20 -0
- package/src/hooks/useInfiniteScroll.ts +45 -0
- package/src/hooks/useIsFirstRender.ts +15 -0
- package/src/hooks/useMembers.ts +3 -3
- package/src/hooks/useMutateApps.ts +48 -0
- package/src/hooks/useMutateComment.ts +60 -0
- package/src/hooks/useMutateConversationName.ts +1 -1
- package/src/hooks/useMutateDeleteReaction.ts +17 -4
- package/src/hooks/useMutateEditComment.ts +63 -0
- package/src/hooks/useMutateEditPost.ts +64 -0
- package/src/hooks/useMutateExternalBlobs.ts +5 -9
- package/src/hooks/useMutateFile.ts +311 -0
- package/src/hooks/useMutateFileRename.ts +51 -0
- package/src/hooks/useMutateFileSubscribe.ts +80 -0
- package/src/hooks/useMutateFileTrash.ts +115 -0
- package/src/hooks/useMutateFileVersion.ts +85 -0
- package/src/hooks/useMutateFiles.ts +23 -0
- package/src/hooks/useMutateLeaveConversation.ts +38 -0
- package/src/hooks/useMutateMessage.ts +23 -62
- package/src/hooks/useMutatePost.ts +60 -0
- package/src/hooks/useMutateReaction.ts +21 -6
- package/src/hooks/useMutateRead.ts +8 -2
- package/src/hooks/useMutateRemoveMembers.ts +2 -9
- package/src/hooks/useMutateReplaceReaction.ts +59 -0
- package/src/hooks/useMutateRestoreComment.ts +37 -0
- package/src/hooks/useMutateRestorePost.ts +36 -0
- package/src/hooks/useMutateStarred.ts +35 -0
- package/src/hooks/useMutateSubscribe.ts +36 -0
- package/src/hooks/useMutateTrashComment.ts +37 -0
- package/src/hooks/useMutateTrashPost.ts +36 -0
- package/src/hooks/useMutateTyping.ts +5 -3
- package/src/hooks/useMutateUnsubscribe.ts +36 -0
- package/src/hooks/useMutateVote.ts +59 -0
- package/src/hooks/usePost.ts +20 -0
- package/src/hooks/usePosts.ts +21 -0
- package/src/hooks/usePostsList.ts +31 -0
- package/src/hooks/useReactionList.ts +21 -0
- package/src/hooks/useSearchUsers.ts +2 -2
- package/src/hooks/useSessionState.ts +23 -0
- package/src/hooks/useUnload.ts +19 -0
- package/src/hooks/useUpdateEffect.ts +16 -0
- package/src/hooks/useVotes.ts +21 -0
- package/src/index.ts +5 -1
- package/src/scss/theme/_appbar.scss +8 -4
- package/src/scss/theme/_card.scss +2 -0
- package/src/scss/theme/_comment-editor-cm.scss +5 -1
- package/src/scss/theme/_comments.scss +9 -8
- package/src/scss/theme/_conversations.scss +4 -0
- package/src/scss/theme/_files.scss +2 -81
- package/src/scss/theme/_icons.scss +21 -3
- package/src/scss/theme/_input.scss +13 -7
- package/src/scss/theme/_item.scss +23 -1
- package/src/scss/theme/_message-editor-cm.scss +5 -1
- package/src/scss/theme/_pager.scss +1 -1
- package/src/scss/theme/_post-editor-cm.scss +2 -2
- package/src/scss/theme/_post.scss +3 -10
- package/src/scss/theme/_preview-pdf-viewer.scss +996 -0
- package/src/scss/theme/_preview-pdf.scss +57 -783
- package/src/scss/theme/_sheet.scss +4 -1
- package/src/scss/theme/_spinner.scss +10 -1
- package/src/scss/theme/_tables.scss +2 -0
- package/src/scss/theme/base/_scroll.scss +3 -0
- package/src/scss/weavy-chat.scss +3 -1
- package/src/scss/weavy-files.scss +31 -0
- package/src/scss/weavy-messenger.scss +3 -1
- package/src/scss/weavy-posts.scss +35 -0
- package/src/scss/weavy.scss +2 -0
- package/src/types/ConversationListItem.ts +1 -0
- package/src/types/Files.ts +7 -0
- package/src/types/Message.ts +2 -2
- package/src/types/Posts.ts +4 -0
- package/src/types/interfaces.ts +13 -0
- package/src/types/types.ts +157 -28
- package/src/ui/Button.tsx +6 -5
- package/src/ui/Dropdown.tsx +67 -16
- package/src/ui/Icon.tsx +112 -15
- package/src/ui/Overlay.tsx +6 -2
- package/src/ui/Sheet.tsx +87 -0
- package/src/ui/Spinner.tsx +7 -4
- package/src/utils/cacheUtils.ts +246 -0
- package/src/utils/fileUtilities.ts +208 -24
- package/src/utils/infinite-scroll.js +103 -0
- package/src/utils/mentions.ts +50 -0
- package/src/utils/openUrl.ts +41 -0
- package/src/utils/{scrollToBottom.js → scroll-position.js} +50 -9
- package/src/utils/{scrollbarDetection.js → scrollbar-detection.js} +0 -0
- package/src/utils/utils.js +15 -1
- package/tsconfig.json +1 -1
- package/dist/cjs/components/ConversationForm.d.ts +0 -7
- package/dist/cjs/components/File.d.ts +0 -9
- package/dist/cjs/components/FileBrowser.d.ts +0 -6
- package/dist/cjs/hooks/usePreview.d.ts +0 -4
- package/dist/cjs/hooks/useReactions.d.ts +0 -3
- package/dist/esm/components/ConversationForm.d.ts +0 -7
- package/dist/esm/components/File.d.ts +0 -9
- package/dist/esm/components/FileBrowser.d.ts +0 -6
- package/dist/esm/hooks/usePreview.d.ts +0 -4
- package/dist/esm/hooks/useReactions.d.ts +0 -3
- package/src/components/ConversationForm.tsx +0 -210
- package/src/components/File.tsx +0 -21
- package/src/hooks/usePreview.ts +0 -21
- package/src/hooks/useReactions.ts +0 -51
- package/src/utils/infiniteScroll.js +0 -184
|
@@ -2,16 +2,18 @@ import React, { useCallback, useContext, useEffect, useLayoutEffect, useRef, use
|
|
|
2
2
|
import { UserContext } from '../contexts/UserContext';
|
|
3
3
|
import useMessages from '../hooks/useMessages';
|
|
4
4
|
import Button from '../ui/Button';
|
|
5
|
+
import Spinner from '../ui/Spinner';
|
|
5
6
|
import Message from './Message';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
7
|
+
import { scrollParentToBottom, isParentAtBottom } from "../utils/scroll-position";
|
|
8
|
+
import { useReverseInfiniteScroll } from '../hooks/useInfiniteScroll';
|
|
9
|
+
|
|
9
10
|
import useEvents from '../hooks/useEvents';
|
|
10
11
|
import useMutateRead from '../hooks/useMutateRead';
|
|
11
12
|
import useMutateMessage from '../hooks/useMutateMessage';
|
|
12
13
|
import { useQueryClient } from 'react-query';
|
|
13
14
|
import { WeavyContext } from '../contexts/WeavyContext';
|
|
14
15
|
import Avatar from './Avatar';
|
|
16
|
+
import Editor from './Editor';
|
|
15
17
|
|
|
16
18
|
type Props = {
|
|
17
19
|
id: number,
|
|
@@ -23,25 +25,22 @@ type Props = {
|
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
const Messages = ({ id, members, displayName, avatarUrl, lastMessageId, chatRoom }: Props) => {
|
|
26
|
-
|
|
28
|
+
const [, onNextRender] = useState<any>();
|
|
27
29
|
|
|
28
30
|
const { user } = useContext(UserContext);
|
|
29
31
|
|
|
30
32
|
const queryClient = useQueryClient();
|
|
31
|
-
const { client } = useContext(WeavyContext);
|
|
32
|
-
|
|
33
|
-
const readMoreRef = useRef<any>();
|
|
33
|
+
const { client } = useContext(WeavyContext);
|
|
34
34
|
const messagesEndRef = useRef<any>();
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
|
|
37
36
|
const { dispatch, on, events } = useEvents();
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
|
|
38
|
+
const infiniteMessages = useMessages(id, {});
|
|
39
|
+
const { isLoading, isError, data, error, fetchNextPage, hasNextPage, isFetching, isFetchingNextPage } = infiniteMessages;
|
|
40
|
+
|
|
42
41
|
const readMessageMutation = useMutateRead();
|
|
43
42
|
const addMessageMutation = useMutateMessage();
|
|
44
|
-
|
|
43
|
+
|
|
45
44
|
// scroll to bottom when data changes
|
|
46
45
|
useLayoutEffect(() => {
|
|
47
46
|
//if (id && !isLoading && !isLoadingMembers && !isLoadingConversation) {
|
|
@@ -50,40 +49,11 @@ const Messages = ({ id, members, displayName, avatarUrl, lastMessageId, chatRoom
|
|
|
50
49
|
scrollParentToBottom(messagesEndRef.current);
|
|
51
50
|
|
|
52
51
|
// Scroll to bottom again two frames later, because the height is changing
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
// register infinite scroll
|
|
56
|
-
|
|
57
|
-
reverseScroller?.disconnect();
|
|
58
|
-
|
|
59
|
-
reverseScroller = createReverseScroller(readMoreRef.current, () => {
|
|
60
|
-
if (hasNextPage) {
|
|
61
|
-
return fetchNextPage().then(() => {
|
|
62
|
-
// Wait for useLayoutEffect before resolving
|
|
63
|
-
return new Promise((resolve: Function) => setResolveScrollerFetch(resolve))
|
|
64
|
-
})
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
} else {
|
|
69
|
-
reverseScroller?.disconnect();
|
|
70
|
-
reverseScroller = null;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return () => {
|
|
74
|
-
reverseScroller?.disconnect();
|
|
75
|
-
reverseScroller = null;
|
|
52
|
+
onNextRender(() => requestAnimationFrame(() => scrollParentToBottom(messagesEndRef.current)));
|
|
76
53
|
}
|
|
77
54
|
}, [id, isLoading]);
|
|
78
55
|
|
|
79
|
-
|
|
80
|
-
useLayoutEffect(() => {
|
|
81
|
-
// Resolve fetchNextPage after layout has been painted
|
|
82
|
-
if (!isFetchingNextPage && resolveScrollerFetch) {
|
|
83
|
-
resolveScrollerFetch()
|
|
84
|
-
setResolveScrollerFetch(null);
|
|
85
|
-
}
|
|
86
|
-
}, [data]);
|
|
56
|
+
const readMoreRef = useReverseInfiniteScroll(infiniteMessages, [id]);
|
|
87
57
|
|
|
88
58
|
useEffect(() => {
|
|
89
59
|
// mark conversation as read
|
|
@@ -98,6 +68,8 @@ const Messages = ({ id, members, displayName, avatarUrl, lastMessageId, chatRoom
|
|
|
98
68
|
client?.subscribe(`a${id}`, "conversation_marked", handleRealtimeSeenBy);
|
|
99
69
|
client?.subscribe(`a${id}`, "reaction_added", handleRealtimeReactionInserted);
|
|
100
70
|
client?.subscribe(`a${id}`, "reaction_removed", handleRealtimeReactionDeleted);
|
|
71
|
+
|
|
72
|
+
|
|
101
73
|
}
|
|
102
74
|
|
|
103
75
|
return () => {
|
|
@@ -132,19 +104,21 @@ const Messages = ({ id, members, displayName, avatarUrl, lastMessageId, chatRoom
|
|
|
132
104
|
const handleRealtimeReactionDeleted = useCallback((realtimeEvent: RealtimeReaction) => {
|
|
133
105
|
dispatch("reaction_deleted_" + realtimeEvent.entity.id, realtimeEvent);
|
|
134
106
|
}, [id]);
|
|
107
|
+
|
|
108
|
+
const handleCreate = async (text: string, blobs: BlobType[], attachments: FileType[], meeting: number | null, embed: number | null, options: PollOptionType[]) => {
|
|
109
|
+
if (id) {
|
|
110
|
+
|
|
111
|
+
await addMessageMutation.mutateAsync({ id: id, text: text, blobs: blobs, meeting: meeting, userId: user.id }, {
|
|
112
|
+
onSuccess: (data: MessageType) => {
|
|
113
|
+
// mark conversation as read
|
|
114
|
+
readMessageMutation.mutate({ id: id, read: true, messageId: data.id }, {
|
|
115
|
+
onSettled: () => onNextRender(() => requestAnimationFrame(() => requestAnimationFrame(() => scrollParentToBottom(messagesEndRef.current, true))))
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
135
121
|
|
|
136
|
-
// handle new message from post form
|
|
137
|
-
const handleNewMessage = (text: string, attachments: [], meetings: []) => {
|
|
138
|
-
addMessageMutation.mutate({ id: id, text: text, userId: user.id, attachments: attachments, meetings: meetings }, {
|
|
139
|
-
onSuccess: (data: MessageType) => {
|
|
140
|
-
// mark conversation as read
|
|
141
|
-
readMessageMutation.mutate({ id: id, read: true, messageId: data.id });
|
|
142
|
-
|
|
143
|
-
requestAnimationFrame(() => scrollParentToBottom(messagesEndRef.current, true))
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
requestAnimationFrame(() => scrollParentToBottom(readMoreRef.current, true));
|
|
148
122
|
}
|
|
149
123
|
|
|
150
124
|
const handleRealtimeSeenBy = async (data: any) => {
|
|
@@ -153,7 +127,7 @@ const Messages = ({ id, members, displayName, avatarUrl, lastMessageId, chatRoom
|
|
|
153
127
|
queryClient.invalidateQueries(["members", id]);
|
|
154
128
|
|
|
155
129
|
if (isAtBottom) {
|
|
156
|
-
requestAnimationFrame(() => scrollParentToBottom(readMoreRef.current, true));
|
|
130
|
+
onNextRender(() => requestAnimationFrame(() => scrollParentToBottom(readMoreRef.current, true)));
|
|
157
131
|
}
|
|
158
132
|
}
|
|
159
133
|
|
|
@@ -191,7 +165,7 @@ const Messages = ({ id, members, displayName, avatarUrl, lastMessageId, chatRoom
|
|
|
191
165
|
}));
|
|
192
166
|
|
|
193
167
|
if (isAtBottom) {
|
|
194
|
-
|
|
168
|
+
onNextRender(() => requestAnimationFrame(() => scrollParentToBottom(readMoreRef.current, true)));
|
|
195
169
|
}
|
|
196
170
|
}
|
|
197
171
|
|
|
@@ -207,7 +181,7 @@ const Messages = ({ id, members, displayName, avatarUrl, lastMessageId, chatRoom
|
|
|
207
181
|
|
|
208
182
|
let messages = (
|
|
209
183
|
<>
|
|
210
|
-
<div className="wy-
|
|
184
|
+
<div className="wy-pager" ref={readMoreRef}>
|
|
211
185
|
{isFetchingNextPage
|
|
212
186
|
? 'Loading more...'
|
|
213
187
|
: hasNextPage
|
|
@@ -251,18 +225,18 @@ const Messages = ({ id, members, displayName, avatarUrl, lastMessageId, chatRoom
|
|
|
251
225
|
|
|
252
226
|
if (isLoading) {
|
|
253
227
|
messages = (
|
|
254
|
-
<
|
|
228
|
+
<Spinner.UI overlay={true}/>
|
|
255
229
|
)
|
|
256
230
|
}
|
|
257
231
|
|
|
258
232
|
|
|
259
233
|
return (
|
|
260
234
|
<>
|
|
261
|
-
<div id="container" className="wy-messages">
|
|
235
|
+
<div id="container" className="wy-messages" >
|
|
262
236
|
{messages}
|
|
263
237
|
</div>
|
|
264
|
-
<div className="wy-footerbar wy-footerbar-sticky
|
|
265
|
-
<
|
|
238
|
+
<div className="wy-footerbar wy-footerbar-sticky">
|
|
239
|
+
<Editor key={id} appId={id} placeholder="Type a message" buttonText="" editorType="messages" editorLocation='apps' onSubmit={handleCreate} showAttachments={true} showCloudFiles={true} showMeetings={true} showTyping={true} useDraft={true}/>
|
|
266
240
|
</div>
|
|
267
241
|
</>
|
|
268
242
|
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
1
|
+
import React, { useState, useContext } from 'react';
|
|
2
2
|
import useMutateConversation from '../hooks/useMutateConversation';
|
|
3
3
|
import Icon from '../ui/Icon';
|
|
4
4
|
import Overlay from '../ui/Overlay';
|
|
5
5
|
import Button from '../ui/Button';
|
|
6
6
|
import SearchUsers from './SearchUsers';
|
|
7
|
+
import { MessengerContext } from '../contexts/MessengerContext';
|
|
7
8
|
|
|
8
9
|
const NewConversation = () => {
|
|
9
10
|
const [modalOpen, setModalOpen] = useState(false);
|
|
10
11
|
const addConversationMutation = useMutateConversation();
|
|
11
|
-
|
|
12
|
-
const handleCreate = async (selected:
|
|
13
|
-
|
|
12
|
+
const { setSelectedConversationId } = useContext(MessengerContext);
|
|
13
|
+
const handleCreate = async (selected: MemberType[]) => {
|
|
14
14
|
const membersList = selected.map((m) => m.id);
|
|
15
|
-
await addConversationMutation.mutateAsync({ members: membersList });
|
|
15
|
+
const conversation = await addConversationMutation.mutateAsync({ members: membersList });
|
|
16
|
+
|
|
17
|
+
setSelectedConversationId(conversation.id);
|
|
16
18
|
setModalOpen(false);
|
|
17
19
|
}
|
|
18
20
|
|
|
@@ -32,7 +34,7 @@ const NewConversation = () => {
|
|
|
32
34
|
<header className="wy-appbars" data-adjust-scrollbar-top>
|
|
33
35
|
<nav className="wy-appbar">
|
|
34
36
|
<Button.UI onClick={handleClose}><Icon.UI name='close' /></Button.UI>
|
|
35
|
-
<div className="wy-appbar-text">
|
|
37
|
+
<div className="wy-appbar-text">New message</div>
|
|
36
38
|
</nav>
|
|
37
39
|
</header>
|
|
38
40
|
|
|
@@ -252,8 +252,8 @@ const PdfViewer = ({ src, pdfCMapsUrl, pdfWorkerUrl }: Props) => {
|
|
|
252
252
|
<nav className="wy-toolbar wy-toolbar-center">
|
|
253
253
|
<div className="wy-toolbar-buttons">
|
|
254
254
|
<input type="text" className="wy-input" ref={pageNumberRef} onChange={updatePage} onClick={select} data-pdf-target="pageNumber"/>
|
|
255
|
-
<span>/</span>
|
|
256
|
-
<span ref={totalPagesRef}>1</span>
|
|
255
|
+
<span className="wy-toolbar-text">/</span>
|
|
256
|
+
<span className="wy-toolbar-text" ref={totalPagesRef}>1</span>
|
|
257
257
|
</div>
|
|
258
258
|
<div className="wy-toolbar-buttons">
|
|
259
259
|
<button className="wy-button wy-button-icon btn-zoom-out" onClick={zoomOut} title="Zoom out"><Icon.UI name="minus" /></button>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import useMutateVote from '../hooks/useMutateVote';
|
|
3
|
+
import PollOption from './PollOption';
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
appId: number,
|
|
7
|
+
parentId: number,
|
|
8
|
+
options: PollOptionType[]
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const Poll = ({ appId, parentId, options }: Props) => {
|
|
12
|
+
|
|
13
|
+
const [pollOptions, setPollOptions] = useState<PollOptionType[]>(options)
|
|
14
|
+
const [totalVotes, setTotalVotes] = useState<number>(0);
|
|
15
|
+
const vote = useMutateVote();
|
|
16
|
+
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
let total = pollOptions.reduce((prev, curr) => prev + (curr.vote_count || 0), 0);
|
|
19
|
+
setTotalVotes(total);
|
|
20
|
+
}, [pollOptions]);
|
|
21
|
+
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
setPollOptions(options);
|
|
24
|
+
}, [options]);
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
const handleVote = async (optionId: number) => {
|
|
28
|
+
if (optionId) {
|
|
29
|
+
await vote.mutateAsync({ id: optionId, appId: appId, parentId: parentId });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<div className='wy-poll'>
|
|
35
|
+
{pollOptions.map((o: PollOptionType) => {
|
|
36
|
+
let ratio = totalVotes > 0 ? Math.round((((o.vote_count || 0) / totalVotes) * 100)) : 0;
|
|
37
|
+
return (
|
|
38
|
+
<PollOption key={'option' + o.id} id={o.id || -1} text={o.text} has_voted={o.has_voted} ratio={ratio} onVote={handleVote} />
|
|
39
|
+
)
|
|
40
|
+
})}
|
|
41
|
+
</div>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default Poll;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import useVotes from '../hooks/useVotes';
|
|
3
|
+
import Icon from '../ui/Icon';
|
|
4
|
+
import Sheet from '../ui/Sheet';
|
|
5
|
+
import Avatar from './Avatar';
|
|
6
|
+
import Spinner from '../ui/Spinner';
|
|
7
|
+
|
|
8
|
+
type Props = {
|
|
9
|
+
id: number,
|
|
10
|
+
text: string,
|
|
11
|
+
has_voted: boolean | undefined
|
|
12
|
+
ratio: number,
|
|
13
|
+
onVote: (id: number) => Promise<void>
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const PollOption = ({ id, text, has_voted, ratio, onVote }: Props) => {
|
|
17
|
+
|
|
18
|
+
const [isOpen, setIsOpen] = useState<boolean>(false);
|
|
19
|
+
const { data, isLoading, refetch } = useVotes(id, { enabled: false });
|
|
20
|
+
|
|
21
|
+
const openSheet = (e: React.MouseEvent<HTMLAnchorElement>) => {
|
|
22
|
+
e.preventDefault();
|
|
23
|
+
e.stopPropagation();
|
|
24
|
+
setIsOpen(true);
|
|
25
|
+
refetch();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<>
|
|
30
|
+
<div className='wy-item wy-poll-option' onClick={() => onVote(id)}>
|
|
31
|
+
<div className='wy-progress' style={{ width: ratio + '%' }}></div>
|
|
32
|
+
|
|
33
|
+
{has_voted &&
|
|
34
|
+
<Icon.UI name="check-circle" />
|
|
35
|
+
}
|
|
36
|
+
{!has_voted &&
|
|
37
|
+
<Icon.UI name="circle-outline" />
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
<div className='wy-item-body'>{text}</div>
|
|
41
|
+
|
|
42
|
+
{ratio > 0 &&
|
|
43
|
+
<a className='wy-facepile' onClick={openSheet}> {ratio + '%'} </a>
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<Sheet.UI title={text} isOpen={isOpen} onClose={() => setIsOpen(false)}>
|
|
49
|
+
{isLoading &&
|
|
50
|
+
<Spinner.UI />
|
|
51
|
+
}
|
|
52
|
+
{!isLoading && data && data.map((user: UserType, index: number) => {
|
|
53
|
+
return (
|
|
54
|
+
<div className="wy-item" key={'vote' + index}>
|
|
55
|
+
<Avatar size={32} src={user.avatar_url} name={user.display_name} />
|
|
56
|
+
<div className="wy-item-body">{user.display_name}</div>
|
|
57
|
+
</div>
|
|
58
|
+
)
|
|
59
|
+
})}
|
|
60
|
+
</Sheet.UI>
|
|
61
|
+
</>
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export default PollOption;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import PostView from './PostView';
|
|
3
|
+
import PostEdit from './PostEdit';
|
|
4
|
+
import PostTrashed from './PostTrashed';
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
appId: number,
|
|
8
|
+
id: number,
|
|
9
|
+
text: string,
|
|
10
|
+
html: string,
|
|
11
|
+
created_at: string,
|
|
12
|
+
modified_at?: string,
|
|
13
|
+
created_by: MemberType,
|
|
14
|
+
trashed_at?: string,
|
|
15
|
+
attachments: FileType[],
|
|
16
|
+
reactions: ReactableType[],
|
|
17
|
+
embed: EmbedType | undefined
|
|
18
|
+
comment_count?: number,
|
|
19
|
+
is_subscribed: boolean,
|
|
20
|
+
is_trashed: boolean,
|
|
21
|
+
options?: PollOptionType[],
|
|
22
|
+
meeting?: MeetingType
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
const Post = ({ ...props }: Props) => {
|
|
27
|
+
const [edit, setEdit] = useState<boolean>(false);
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<div className='wy-post'>
|
|
31
|
+
{props.is_trashed &&
|
|
32
|
+
<PostTrashed {...props} />
|
|
33
|
+
}
|
|
34
|
+
{!props.is_trashed && edit &&
|
|
35
|
+
<PostEdit {...props} onClose={() => setEdit(prev => !prev)} />
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
{!props.is_trashed && !edit &&
|
|
39
|
+
<PostView {...props} onEdit={() => setEdit(prev => !prev)} />
|
|
40
|
+
}
|
|
41
|
+
</div>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export default Post;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import Icon from '../ui/Icon';
|
|
3
|
+
import Button from '../ui/Button';
|
|
4
|
+
import Editor from './Editor';
|
|
5
|
+
import useMutateEditPost from '../hooks/useMutateEditPost';
|
|
6
|
+
|
|
7
|
+
type Props = {
|
|
8
|
+
appId: number,
|
|
9
|
+
id: number,
|
|
10
|
+
text: string,
|
|
11
|
+
html: string,
|
|
12
|
+
created_at: string,
|
|
13
|
+
created_by: MemberType,
|
|
14
|
+
attachments: FileType[],
|
|
15
|
+
reactions: ReactableType[],
|
|
16
|
+
embed: EmbedType | undefined,
|
|
17
|
+
meeting?: MeetingType | undefined,
|
|
18
|
+
options?: PollOptionType[],
|
|
19
|
+
onClose: (e?:any) => void
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const PostEdit = ({ appId, id, text, embed, attachments, options, meeting, onClose }: Props) => {
|
|
23
|
+
const editPostMutation = useMutateEditPost();
|
|
24
|
+
|
|
25
|
+
const handleUpdate = async (text: string, blobs: BlobType[], attachments: FileType[], meeting: number | null, embed: number | null, options: PollOptionType[]) => {
|
|
26
|
+
await editPostMutation.mutateAsync({ id: id, appId: appId, text: text, blobs: blobs, attachments: attachments, meeting: meeting, embed: embed, options: options });
|
|
27
|
+
onClose();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<>
|
|
32
|
+
<nav className='wy-item'>
|
|
33
|
+
<div className='wy-item-body'>
|
|
34
|
+
<div className='wy-item-title'>Edit post</div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<a className='wy-button wy-button-icon'>
|
|
38
|
+
<Button.UI onClick={onClose}>
|
|
39
|
+
<Icon.UI name="close" />
|
|
40
|
+
</Button.UI>
|
|
41
|
+
|
|
42
|
+
</a>
|
|
43
|
+
</nav>
|
|
44
|
+
<Editor editorType='posts' editorLocation='apps' id={id} appId={appId} placeholder={'Update the post'} text={text} embed={embed} meeting={meeting} attachments={attachments} options={options} buttonText='Update' onSubmit={handleUpdate} showAttachments={true} showCloudFiles={true} showEmbeds={true} showPolls={true} />
|
|
45
|
+
</>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default PostEdit;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import React, { useEffect, useCallback, useContext } from 'react';
|
|
2
|
+
import { WeavyContext } from '../contexts/WeavyContext';
|
|
3
|
+
import useEvents from '../hooks/useEvents';
|
|
4
|
+
import usePostsList from '../hooks/usePostsList';
|
|
5
|
+
import Post from './Post';
|
|
6
|
+
import Button from '../ui/Button';
|
|
7
|
+
import Spinner from '../ui/Spinner';
|
|
8
|
+
import PostPlaceHolder from './PostPlaceholder';
|
|
9
|
+
import useInfiniteScroll from '../hooks/useInfiniteScroll';
|
|
10
|
+
|
|
11
|
+
type Props = {
|
|
12
|
+
appId: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const PostList = ({ appId }: Props) => {
|
|
16
|
+
|
|
17
|
+
const { client } = useContext(WeavyContext);
|
|
18
|
+
const { dispatch } = useEvents();
|
|
19
|
+
|
|
20
|
+
const infintePostsList = usePostsList(appId, {})
|
|
21
|
+
const { isLoading, data, fetchNextPage, hasNextPage, isFetchingNextPage, dataUpdatedAt } = infintePostsList;
|
|
22
|
+
|
|
23
|
+
const loadMoreRef = useInfiniteScroll(infintePostsList)
|
|
24
|
+
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (appId) {
|
|
27
|
+
client?.subscribe(`a${appId}`, "reaction_added", handleRealtimeReactionInserted);
|
|
28
|
+
client?.subscribe(`a${appId}`, "reaction_removed", handleRealtimeReactionDeleted);
|
|
29
|
+
// client?.subscribe(`a${appId}`, "comment_created", handleRealtimeComment);
|
|
30
|
+
}
|
|
31
|
+
}, [appId]);
|
|
32
|
+
|
|
33
|
+
// const handleRealtimeComment = useCallback((realtimeEvent: RealtimeMessage) => {
|
|
34
|
+
// console.log("COMMENT CREATED!", realtimeEvent)
|
|
35
|
+
// }, [appId])
|
|
36
|
+
|
|
37
|
+
const handleRealtimeReactionInserted = useCallback((realtimeEvent: RealtimeReaction) => {
|
|
38
|
+
dispatch("reaction_added_" + realtimeEvent.entity.id, realtimeEvent);
|
|
39
|
+
}, [appId]);
|
|
40
|
+
|
|
41
|
+
const handleRealtimeReactionDeleted = useCallback((realtimeEvent: RealtimeReaction) => {
|
|
42
|
+
dispatch("reaction_deleted_" + realtimeEvent.entity.id, realtimeEvent);
|
|
43
|
+
}, [appId]);
|
|
44
|
+
|
|
45
|
+
let loadMoreButton = <Button.UI onClick={() => fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage} className="wy-message-readmore">{dataUpdatedAt} Load more</Button.UI>;
|
|
46
|
+
|
|
47
|
+
if (isLoading) {
|
|
48
|
+
return <div className='wy-buttons'><Spinner.UI /></div>
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<div>
|
|
53
|
+
{data && data.pages && data.pages.map((group, i) => {
|
|
54
|
+
return <React.Fragment key={data.pages.length - i}>
|
|
55
|
+
{
|
|
56
|
+
group.data?.map((post: MessageType) => {
|
|
57
|
+
return post.temp ?
|
|
58
|
+
<PostPlaceHolder key={'post' + post.id} text={post.text} created_at={post.created_at} created_by={post.created_by} /> :
|
|
59
|
+
<Post
|
|
60
|
+
key={'post' + post.id}
|
|
61
|
+
appId={appId}
|
|
62
|
+
id={post.id}
|
|
63
|
+
text={post.text}
|
|
64
|
+
html={post.html}
|
|
65
|
+
created_at={post.created_at}
|
|
66
|
+
modified_at={post.modified_at}
|
|
67
|
+
created_by={post.created_by}
|
|
68
|
+
trashed_at={post.trashed_at}
|
|
69
|
+
attachments={post.attachments}
|
|
70
|
+
reactions={post.reactions}
|
|
71
|
+
embed={post.embed}
|
|
72
|
+
comment_count={post.comment_count}
|
|
73
|
+
is_subscribed={post.is_subscribed}
|
|
74
|
+
is_trashed={post.is_trashed}
|
|
75
|
+
options={post.options}
|
|
76
|
+
meeting={post.meeting}
|
|
77
|
+
/>
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
</React.Fragment>
|
|
81
|
+
})}
|
|
82
|
+
<div className="wy-message-readmore" ref={loadMoreRef}>
|
|
83
|
+
{isFetchingNextPage
|
|
84
|
+
? 'Loading more...'
|
|
85
|
+
: hasNextPage
|
|
86
|
+
? loadMoreButton
|
|
87
|
+
: ""}
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export default PostList;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import Avatar from './Avatar';
|
|
3
|
+
|
|
4
|
+
type Props = {
|
|
5
|
+
text: string,
|
|
6
|
+
created_at: string,
|
|
7
|
+
created_by: MemberType
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
const PostPlaceHolder = ({ ...props }: Props) => {
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<div className='wy-post'>
|
|
15
|
+
<div className='wy-item wy-item-lg'>
|
|
16
|
+
<img alt="" className="wy-avatar wy-placeholder" height={48} width={48} src={props.created_by.avatar_url} />
|
|
17
|
+
|
|
18
|
+
<div className='wy-item-body'>
|
|
19
|
+
<div className='wy-item-title'><span className='wy-placeholder'>Placeholder name</span></div>
|
|
20
|
+
<div className='wy-item-text'><time className='wy-placeholder' dateTime='2022-12-31 00:00:00'>2022-12-31 00:00:00</time></div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
<div className='wy-post-body'>
|
|
24
|
+
<div className='wy-content'>
|
|
25
|
+
<span className='wy-placeholder'>Lorem</span> <span className='wy-placeholder'>ipsum</span> <span className='wy-placeholder'>dolor</span> <span className='wy-placeholder'>sit</span> <span className='wy-placeholder'>amet.</span>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default PostPlaceHolder;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import useMutateRestorePost from "../hooks/useMutateRestorePost";
|
|
3
|
+
import Button from '../ui/Button';
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
appId: number,
|
|
7
|
+
id: number,
|
|
8
|
+
text: string,
|
|
9
|
+
html: string,
|
|
10
|
+
created_at: string,
|
|
11
|
+
created_by: MemberType,
|
|
12
|
+
attachments: FileType[],
|
|
13
|
+
reactions: ReactableType[],
|
|
14
|
+
embed: EmbedType | undefined
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
const PostTrashed = ({id, appId}: Props) => {
|
|
19
|
+
|
|
20
|
+
const restorePost = useMutateRestorePost();
|
|
21
|
+
|
|
22
|
+
const handleRestore = () => {
|
|
23
|
+
restorePost.mutate({ id: id, appId: appId});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div className="wy-item wy-item-lg">
|
|
28
|
+
<div className="wy-item-body">Post was trashed.</div>
|
|
29
|
+
<Button.UI onClick={handleRestore} className='wy-button-variant'>Undo</Button.UI>
|
|
30
|
+
|
|
31
|
+
</div>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default PostTrashed;
|