@weavy/uikit-react 14.0.4 → 15.0.0

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 (360) hide show
  1. package/.vscode/settings.json +2 -0
  2. package/changelog.md +6 -0
  3. package/dist/cjs/client/WeavyClient.d.ts +1 -0
  4. package/dist/cjs/components/Attachment.d.ts +5 -5
  5. package/dist/cjs/components/Blob.d.ts +9 -0
  6. package/dist/cjs/components/Comment.d.ts +18 -0
  7. package/dist/cjs/components/CommentCount.d.ts +7 -0
  8. package/dist/cjs/components/CommentEdit.d.ts +16 -0
  9. package/dist/cjs/components/CommentPlaceholder.d.ts +8 -0
  10. package/dist/cjs/components/CommentTrashed.d.ts +15 -0
  11. package/dist/cjs/components/CommentView.d.ts +18 -0
  12. package/dist/cjs/components/Comments.d.ts +8 -0
  13. package/dist/cjs/components/ConversationListItem.d.ts +1 -1
  14. package/dist/cjs/components/Dropzone.d.ts +10 -0
  15. package/dist/cjs/components/Editor.d.ts +25 -0
  16. package/dist/cjs/components/Embed.d.ts +8 -0
  17. package/dist/cjs/components/FileItem.d.ts +41 -0
  18. package/dist/cjs/components/FileList.d.ts +11 -0
  19. package/dist/cjs/components/FileVersions.d.ts +9 -0
  20. package/dist/cjs/components/Files.d.ts +4 -0
  21. package/dist/cjs/components/Image.d.ts +3 -3
  22. package/dist/cjs/components/MeetingCard.d.ts +1 -1
  23. package/dist/cjs/components/Meetings.d.ts +2 -1
  24. package/dist/cjs/components/Poll.d.ts +8 -0
  25. package/dist/cjs/components/PollOption.d.ts +10 -0
  26. package/dist/cjs/components/Post.d.ts +21 -0
  27. package/dist/cjs/components/PostEdit.d.ts +17 -0
  28. package/dist/cjs/components/PostList.d.ts +6 -0
  29. package/dist/cjs/components/PostPlaceholder.d.ts +8 -0
  30. package/dist/cjs/components/PostTrashed.d.ts +14 -0
  31. package/dist/cjs/components/PostView.d.ts +21 -0
  32. package/dist/cjs/components/Posts.d.ts +4 -0
  33. package/dist/cjs/components/Preview.d.ts +1 -3
  34. package/dist/cjs/components/PreviewFiles.d.ts +10 -0
  35. package/dist/cjs/components/Reactions.d.ts +6 -2
  36. package/dist/cjs/components/SearchUsers.d.ts +2 -1
  37. package/dist/cjs/contexts/CloudFilesContext.d.ts +9 -0
  38. package/dist/cjs/hooks/useApps.d.ts +1 -0
  39. package/dist/cjs/hooks/useCloudFiles.d.ts +3 -0
  40. package/dist/cjs/hooks/useCommentList.d.ts +1 -0
  41. package/dist/cjs/hooks/useEmbeds.d.ts +5 -0
  42. package/dist/cjs/hooks/useFileList.d.ts +1 -0
  43. package/dist/cjs/hooks/useFileUploader.d.ts +8 -0
  44. package/dist/cjs/hooks/useFileVersions.d.ts +2 -0
  45. package/dist/cjs/hooks/useInfiniteScroll.d.ts +4 -0
  46. package/dist/cjs/hooks/useIsFirstRender.d.ts +2 -0
  47. package/dist/cjs/hooks/useMutateApps.d.ts +5 -0
  48. package/dist/cjs/hooks/useMutateComment.d.ts +10 -0
  49. package/dist/cjs/hooks/useMutateConversationName.d.ts +1 -1
  50. package/dist/cjs/hooks/useMutateDeleteReaction.d.ts +3 -1
  51. package/dist/cjs/hooks/useMutateEditComment.d.ts +10 -0
  52. package/dist/cjs/hooks/useMutateEditPost.d.ts +10 -0
  53. package/dist/cjs/hooks/useMutateExternalBlobs.d.ts +2 -2
  54. package/dist/cjs/hooks/useMutateFile.d.ts +26 -0
  55. package/dist/cjs/hooks/useMutateFileRename.d.ts +5 -0
  56. package/dist/cjs/hooks/useMutateFileSubscribe.d.ts +7 -0
  57. package/dist/cjs/hooks/useMutateFileTrash.d.ts +10 -0
  58. package/dist/cjs/hooks/useMutateFileVersion.d.ts +7 -0
  59. package/dist/cjs/hooks/useMutateFiles.d.ts +2 -0
  60. package/dist/cjs/hooks/useMutateLeaveConversation.d.ts +4 -0
  61. package/dist/cjs/hooks/useMutateMessage.d.ts +2 -2
  62. package/dist/cjs/hooks/useMutatePost.d.ts +10 -0
  63. package/dist/cjs/hooks/useMutateReaction.d.ts +3 -1
  64. package/dist/cjs/hooks/useMutateRead.d.ts +1 -1
  65. package/dist/cjs/hooks/useMutateReplaceReaction.d.ts +6 -0
  66. package/dist/cjs/hooks/useMutateRestoreComment.d.ts +5 -0
  67. package/dist/cjs/hooks/useMutateRestorePost.d.ts +4 -0
  68. package/dist/cjs/hooks/useMutateStarred.d.ts +4 -0
  69. package/dist/cjs/hooks/useMutateSubscribe.d.ts +4 -0
  70. package/dist/cjs/hooks/useMutateTrashComment.d.ts +5 -0
  71. package/dist/cjs/hooks/useMutateTrashPost.d.ts +4 -0
  72. package/dist/cjs/hooks/useMutateTyping.d.ts +2 -0
  73. package/dist/cjs/hooks/useMutateUnsubscribe.d.ts +4 -0
  74. package/dist/cjs/hooks/useMutateVote.d.ts +5 -0
  75. package/dist/cjs/hooks/usePost.d.ts +1 -0
  76. package/dist/cjs/hooks/usePosts.d.ts +1 -0
  77. package/dist/cjs/hooks/usePostsList.d.ts +1 -0
  78. package/dist/cjs/hooks/useReactionList.d.ts +1 -0
  79. package/dist/cjs/hooks/useSessionState.d.ts +2 -0
  80. package/dist/cjs/hooks/useUnload.d.ts +2 -0
  81. package/dist/cjs/hooks/useUpdateEffect.d.ts +3 -0
  82. package/dist/cjs/hooks/useVotes.d.ts +1 -0
  83. package/dist/cjs/index.d.ts +3 -1
  84. package/dist/cjs/index.js +28 -6
  85. package/dist/cjs/index.js.map +1 -1
  86. package/dist/cjs/types/ConversationListItem.d.ts +1 -0
  87. package/dist/cjs/types/Files.d.ts +7 -0
  88. package/dist/cjs/types/Message.d.ts +2 -2
  89. package/dist/cjs/types/Posts.d.ts +4 -0
  90. package/dist/cjs/types/interfaces.d.ts +9 -0
  91. package/dist/cjs/types/types.d.ts +138 -22
  92. package/dist/cjs/ui/Dropdown.d.ts +18 -2
  93. package/dist/cjs/ui/Icon.d.ts +10 -2
  94. package/dist/cjs/ui/Overlay.d.ts +3 -1
  95. package/dist/cjs/ui/Sheet.d.ts +14 -0
  96. package/dist/cjs/ui/Spinner.d.ts +2 -1
  97. package/dist/cjs/utils/cacheUtils.d.ts +14 -0
  98. package/dist/cjs/utils/fileUtilities.d.ts +10 -1
  99. package/dist/cjs/utils/mentions.d.ts +6 -0
  100. package/dist/cjs/utils/openUrl.d.ts +1 -0
  101. package/dist/css/weavy-chat.css +637 -218
  102. package/dist/css/weavy-files.css +3046 -0
  103. package/dist/css/weavy-messenger.css +643 -213
  104. package/dist/css/weavy-posts.css +2773 -0
  105. package/dist/css/weavy.css +1749 -308
  106. package/dist/esm/client/WeavyClient.d.ts +1 -0
  107. package/dist/esm/components/Attachment.d.ts +5 -5
  108. package/dist/esm/components/Blob.d.ts +9 -0
  109. package/dist/esm/components/Comment.d.ts +18 -0
  110. package/dist/esm/components/CommentCount.d.ts +7 -0
  111. package/dist/esm/components/CommentEdit.d.ts +16 -0
  112. package/dist/esm/components/CommentPlaceholder.d.ts +8 -0
  113. package/dist/esm/components/CommentTrashed.d.ts +15 -0
  114. package/dist/esm/components/CommentView.d.ts +18 -0
  115. package/dist/esm/components/Comments.d.ts +8 -0
  116. package/dist/esm/components/ConversationListItem.d.ts +1 -1
  117. package/dist/esm/components/Dropzone.d.ts +10 -0
  118. package/dist/esm/components/Editor.d.ts +25 -0
  119. package/dist/esm/components/Embed.d.ts +8 -0
  120. package/dist/esm/components/FileItem.d.ts +41 -0
  121. package/dist/esm/components/FileList.d.ts +11 -0
  122. package/dist/esm/components/FileVersions.d.ts +9 -0
  123. package/dist/esm/components/Files.d.ts +4 -0
  124. package/dist/esm/components/Image.d.ts +3 -3
  125. package/dist/esm/components/MeetingCard.d.ts +1 -1
  126. package/dist/esm/components/Meetings.d.ts +2 -1
  127. package/dist/esm/components/Poll.d.ts +8 -0
  128. package/dist/esm/components/PollOption.d.ts +10 -0
  129. package/dist/esm/components/Post.d.ts +21 -0
  130. package/dist/esm/components/PostEdit.d.ts +17 -0
  131. package/dist/esm/components/PostList.d.ts +6 -0
  132. package/dist/esm/components/PostPlaceholder.d.ts +8 -0
  133. package/dist/esm/components/PostTrashed.d.ts +14 -0
  134. package/dist/esm/components/PostView.d.ts +21 -0
  135. package/dist/esm/components/Posts.d.ts +4 -0
  136. package/dist/esm/components/Preview.d.ts +1 -3
  137. package/dist/esm/components/PreviewFiles.d.ts +10 -0
  138. package/dist/esm/components/Reactions.d.ts +6 -2
  139. package/dist/esm/components/SearchUsers.d.ts +2 -1
  140. package/dist/esm/contexts/CloudFilesContext.d.ts +9 -0
  141. package/dist/esm/hooks/useApps.d.ts +1 -0
  142. package/dist/esm/hooks/useCloudFiles.d.ts +3 -0
  143. package/dist/esm/hooks/useCommentList.d.ts +1 -0
  144. package/dist/esm/hooks/useEmbeds.d.ts +5 -0
  145. package/dist/esm/hooks/useFileList.d.ts +1 -0
  146. package/dist/esm/hooks/useFileUploader.d.ts +8 -0
  147. package/dist/esm/hooks/useFileVersions.d.ts +2 -0
  148. package/dist/esm/hooks/useInfiniteScroll.d.ts +4 -0
  149. package/dist/esm/hooks/useIsFirstRender.d.ts +2 -0
  150. package/dist/esm/hooks/useMutateApps.d.ts +5 -0
  151. package/dist/esm/hooks/useMutateComment.d.ts +10 -0
  152. package/dist/esm/hooks/useMutateConversationName.d.ts +1 -1
  153. package/dist/esm/hooks/useMutateDeleteReaction.d.ts +3 -1
  154. package/dist/esm/hooks/useMutateEditComment.d.ts +10 -0
  155. package/dist/esm/hooks/useMutateEditPost.d.ts +10 -0
  156. package/dist/esm/hooks/useMutateExternalBlobs.d.ts +2 -2
  157. package/dist/esm/hooks/useMutateFile.d.ts +26 -0
  158. package/dist/esm/hooks/useMutateFileRename.d.ts +5 -0
  159. package/dist/esm/hooks/useMutateFileSubscribe.d.ts +7 -0
  160. package/dist/esm/hooks/useMutateFileTrash.d.ts +10 -0
  161. package/dist/esm/hooks/useMutateFileVersion.d.ts +7 -0
  162. package/dist/esm/hooks/useMutateFiles.d.ts +2 -0
  163. package/dist/esm/hooks/useMutateLeaveConversation.d.ts +4 -0
  164. package/dist/esm/hooks/useMutateMessage.d.ts +2 -2
  165. package/dist/esm/hooks/useMutatePost.d.ts +10 -0
  166. package/dist/esm/hooks/useMutateReaction.d.ts +3 -1
  167. package/dist/esm/hooks/useMutateRead.d.ts +1 -1
  168. package/dist/esm/hooks/useMutateReplaceReaction.d.ts +6 -0
  169. package/dist/esm/hooks/useMutateRestoreComment.d.ts +5 -0
  170. package/dist/esm/hooks/useMutateRestorePost.d.ts +4 -0
  171. package/dist/esm/hooks/useMutateStarred.d.ts +4 -0
  172. package/dist/esm/hooks/useMutateSubscribe.d.ts +4 -0
  173. package/dist/esm/hooks/useMutateTrashComment.d.ts +5 -0
  174. package/dist/esm/hooks/useMutateTrashPost.d.ts +4 -0
  175. package/dist/esm/hooks/useMutateTyping.d.ts +2 -0
  176. package/dist/esm/hooks/useMutateUnsubscribe.d.ts +4 -0
  177. package/dist/esm/hooks/useMutateVote.d.ts +5 -0
  178. package/dist/esm/hooks/usePost.d.ts +1 -0
  179. package/dist/esm/hooks/usePosts.d.ts +1 -0
  180. package/dist/esm/hooks/usePostsList.d.ts +1 -0
  181. package/dist/esm/hooks/useReactionList.d.ts +1 -0
  182. package/dist/esm/hooks/useSessionState.d.ts +2 -0
  183. package/dist/esm/hooks/useUnload.d.ts +2 -0
  184. package/dist/esm/hooks/useUpdateEffect.d.ts +3 -0
  185. package/dist/esm/hooks/useVotes.d.ts +1 -0
  186. package/dist/esm/index.d.ts +3 -1
  187. package/dist/esm/index.js +28 -6
  188. package/dist/esm/index.js.map +1 -1
  189. package/dist/esm/types/ConversationListItem.d.ts +1 -0
  190. package/dist/esm/types/Files.d.ts +7 -0
  191. package/dist/esm/types/Message.d.ts +2 -2
  192. package/dist/esm/types/Posts.d.ts +4 -0
  193. package/dist/esm/types/interfaces.d.ts +9 -0
  194. package/dist/esm/types/types.d.ts +138 -22
  195. package/dist/esm/ui/Dropdown.d.ts +18 -2
  196. package/dist/esm/ui/Icon.d.ts +10 -2
  197. package/dist/esm/ui/Overlay.d.ts +3 -1
  198. package/dist/esm/ui/Sheet.d.ts +14 -0
  199. package/dist/esm/ui/Spinner.d.ts +2 -1
  200. package/dist/esm/utils/cacheUtils.d.ts +14 -0
  201. package/dist/esm/utils/fileUtilities.d.ts +10 -1
  202. package/dist/esm/utils/mentions.d.ts +6 -0
  203. package/dist/esm/utils/openUrl.d.ts +1 -0
  204. package/dist/index.d.ts +50 -6
  205. package/package.json +8 -2
  206. package/src/client/WeavyClient.ts +35 -1
  207. package/src/components/Attachment.tsx +20 -13
  208. package/src/components/Blob.tsx +28 -0
  209. package/src/components/Comment.tsx +43 -0
  210. package/src/components/CommentCount.tsx +15 -0
  211. package/src/components/CommentEdit.tsx +48 -0
  212. package/src/components/CommentPlaceholder.tsx +34 -0
  213. package/src/components/CommentTrashed.tsx +45 -0
  214. package/src/components/CommentView.tsx +142 -0
  215. package/src/components/Comments.tsx +78 -0
  216. package/src/components/Conversation.tsx +85 -31
  217. package/src/components/ConversationList.tsx +12 -41
  218. package/src/components/ConversationListItem.tsx +125 -74
  219. package/src/components/Dropzone.tsx +26 -0
  220. package/src/components/Editor.tsx +700 -0
  221. package/src/components/Embed.tsx +80 -0
  222. package/src/components/FileItem.tsx +391 -0
  223. package/src/components/FileList.tsx +166 -0
  224. package/src/components/FileVersions.tsx +100 -0
  225. package/src/components/Files.tsx +294 -0
  226. package/src/components/Image.tsx +11 -10
  227. package/src/components/Meeting.tsx +1 -2
  228. package/src/components/MeetingCard.tsx +1 -1
  229. package/src/components/Meetings.tsx +13 -5
  230. package/src/components/Message.tsx +14 -19
  231. package/src/components/Messages.tsx +38 -64
  232. package/src/components/NewConversation.tsx +8 -6
  233. package/src/components/PdfViewer.tsx +2 -2
  234. package/src/components/Poll.tsx +45 -0
  235. package/src/components/PollOption.tsx +65 -0
  236. package/src/components/Post.tsx +45 -0
  237. package/src/components/PostEdit.tsx +49 -0
  238. package/src/components/PostList.tsx +95 -0
  239. package/src/components/PostPlaceholder.tsx +32 -0
  240. package/src/components/PostTrashed.tsx +35 -0
  241. package/src/components/PostView.tsx +194 -0
  242. package/src/components/Posts.tsx +59 -0
  243. package/src/components/Preview.tsx +16 -23
  244. package/src/components/PreviewFiles.tsx +336 -0
  245. package/src/components/Reactions.tsx +142 -38
  246. package/src/components/SearchUsers.tsx +77 -37
  247. package/src/components/Typing.tsx +1 -1
  248. package/src/{components/FileBrowser.tsx → contexts/CloudFilesContext.tsx} +46 -30
  249. package/src/contexts/PreviewContext.tsx +102 -85
  250. package/src/contexts/WeavyContext.tsx +10 -6
  251. package/src/hooks/useApps.ts +23 -0
  252. package/src/hooks/useCloudFiles.ts +12 -0
  253. package/src/hooks/useCommentList.ts +30 -0
  254. package/src/hooks/useEmbeds.ts +126 -0
  255. package/src/hooks/useEvents.ts +3 -1
  256. package/src/hooks/useFileList.ts +84 -0
  257. package/src/hooks/useFileUploader.ts +38 -1
  258. package/src/hooks/useFileVersions.ts +20 -0
  259. package/src/hooks/useInfiniteScroll.ts +45 -0
  260. package/src/hooks/useIsFirstRender.ts +15 -0
  261. package/src/hooks/useMembers.ts +3 -3
  262. package/src/hooks/useMutateApps.ts +48 -0
  263. package/src/hooks/useMutateComment.ts +60 -0
  264. package/src/hooks/useMutateConversationName.ts +1 -1
  265. package/src/hooks/useMutateDeleteReaction.ts +17 -4
  266. package/src/hooks/useMutateEditComment.ts +63 -0
  267. package/src/hooks/useMutateEditPost.ts +64 -0
  268. package/src/hooks/useMutateExternalBlobs.ts +5 -9
  269. package/src/hooks/useMutateFile.ts +311 -0
  270. package/src/hooks/useMutateFileRename.ts +51 -0
  271. package/src/hooks/useMutateFileSubscribe.ts +80 -0
  272. package/src/hooks/useMutateFileTrash.ts +115 -0
  273. package/src/hooks/useMutateFileVersion.ts +85 -0
  274. package/src/hooks/useMutateFiles.ts +23 -0
  275. package/src/hooks/useMutateLeaveConversation.ts +38 -0
  276. package/src/hooks/useMutateMessage.ts +23 -62
  277. package/src/hooks/useMutatePost.ts +60 -0
  278. package/src/hooks/useMutateReaction.ts +21 -6
  279. package/src/hooks/useMutateRead.ts +8 -2
  280. package/src/hooks/useMutateRemoveMembers.ts +2 -9
  281. package/src/hooks/useMutateReplaceReaction.ts +59 -0
  282. package/src/hooks/useMutateRestoreComment.ts +37 -0
  283. package/src/hooks/useMutateRestorePost.ts +36 -0
  284. package/src/hooks/useMutateStarred.ts +35 -0
  285. package/src/hooks/useMutateSubscribe.ts +36 -0
  286. package/src/hooks/useMutateTrashComment.ts +37 -0
  287. package/src/hooks/useMutateTrashPost.ts +36 -0
  288. package/src/hooks/useMutateTyping.ts +5 -3
  289. package/src/hooks/useMutateUnsubscribe.ts +36 -0
  290. package/src/hooks/useMutateVote.ts +59 -0
  291. package/src/hooks/usePost.ts +20 -0
  292. package/src/hooks/usePosts.ts +21 -0
  293. package/src/hooks/usePostsList.ts +31 -0
  294. package/src/hooks/useReactionList.ts +21 -0
  295. package/src/hooks/useSearchUsers.ts +2 -2
  296. package/src/hooks/useSessionState.ts +23 -0
  297. package/src/hooks/useUnload.ts +19 -0
  298. package/src/hooks/useUpdateEffect.ts +16 -0
  299. package/src/hooks/useVotes.ts +21 -0
  300. package/src/index.ts +5 -1
  301. package/src/scss/theme/_appbar.scss +8 -4
  302. package/src/scss/theme/_card.scss +2 -0
  303. package/src/scss/theme/_comment-editor-cm.scss +5 -1
  304. package/src/scss/theme/_comments.scss +9 -8
  305. package/src/scss/theme/_conversations.scss +4 -0
  306. package/src/scss/theme/_files.scss +2 -81
  307. package/src/scss/theme/_icons.scss +21 -3
  308. package/src/scss/theme/_input.scss +13 -7
  309. package/src/scss/theme/_item.scss +23 -1
  310. package/src/scss/theme/_message-editor-cm.scss +5 -1
  311. package/src/scss/theme/_pager.scss +1 -1
  312. package/src/scss/theme/_post-editor-cm.scss +2 -2
  313. package/src/scss/theme/_post.scss +3 -10
  314. package/src/scss/theme/_preview-pdf-viewer.scss +996 -0
  315. package/src/scss/theme/_preview-pdf.scss +57 -783
  316. package/src/scss/theme/_sheet.scss +4 -1
  317. package/src/scss/theme/_spinner.scss +10 -1
  318. package/src/scss/theme/_tables.scss +2 -0
  319. package/src/scss/theme/base/_scroll.scss +3 -0
  320. package/src/scss/weavy-chat.scss +3 -1
  321. package/src/scss/weavy-files.scss +31 -0
  322. package/src/scss/weavy-messenger.scss +3 -1
  323. package/src/scss/weavy-posts.scss +35 -0
  324. package/src/scss/weavy.scss +2 -0
  325. package/src/types/ConversationListItem.ts +1 -0
  326. package/src/types/Files.ts +7 -0
  327. package/src/types/Message.ts +2 -2
  328. package/src/types/Posts.ts +4 -0
  329. package/src/types/interfaces.ts +13 -0
  330. package/src/types/types.ts +157 -28
  331. package/src/ui/Button.tsx +6 -5
  332. package/src/ui/Dropdown.tsx +67 -16
  333. package/src/ui/Icon.tsx +112 -15
  334. package/src/ui/Overlay.tsx +6 -2
  335. package/src/ui/Sheet.tsx +87 -0
  336. package/src/ui/Spinner.tsx +7 -4
  337. package/src/utils/cacheUtils.ts +246 -0
  338. package/src/utils/fileUtilities.ts +208 -24
  339. package/src/utils/infinite-scroll.js +103 -0
  340. package/src/utils/mentions.ts +50 -0
  341. package/src/utils/openUrl.ts +41 -0
  342. package/src/utils/{scrollToBottom.js → scroll-position.js} +50 -9
  343. package/src/utils/{scrollbarDetection.js → scrollbar-detection.js} +0 -0
  344. package/src/utils/utils.js +15 -1
  345. package/tsconfig.json +1 -1
  346. package/dist/cjs/components/ConversationForm.d.ts +0 -7
  347. package/dist/cjs/components/File.d.ts +0 -9
  348. package/dist/cjs/components/FileBrowser.d.ts +0 -6
  349. package/dist/cjs/hooks/usePreview.d.ts +0 -4
  350. package/dist/cjs/hooks/useReactions.d.ts +0 -3
  351. package/dist/esm/components/ConversationForm.d.ts +0 -7
  352. package/dist/esm/components/File.d.ts +0 -9
  353. package/dist/esm/components/FileBrowser.d.ts +0 -6
  354. package/dist/esm/hooks/usePreview.d.ts +0 -4
  355. package/dist/esm/hooks/useReactions.d.ts +0 -3
  356. package/src/components/ConversationForm.tsx +0 -210
  357. package/src/components/File.tsx +0 -21
  358. package/src/hooks/usePreview.ts +0 -21
  359. package/src/hooks/useReactions.ts +0 -51
  360. 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 { createReverseScroller } from "../utils/infiniteScroll";
7
- import { scrollParentToBottom, isParentAtBottom } from "../utils/scrollToBottom";
8
- import ConversationForm from './ConversationForm';
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
- var reverseScroller: IntersectionObserver | null;
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
- const [resolveScrollerFetch, setResolveScrollerFetch] = useState<Function | null>()
36
-
35
+
37
36
  const { dispatch, on, events } = useEvents();
38
-
39
- const { isLoading, isError, data, error, fetchNextPage, hasNextPage, isFetching, isFetchingNextPage } = useMessages(id, {});
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
- requestAnimationFrame(() => requestAnimationFrame(() => scrollParentToBottom(messagesEndRef.current)));
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
- requestAnimationFrame(() => requestAnimationFrame(() => scrollParentToBottom(readMoreRef.current, true)));
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-message-readmore" ref={readMoreRef}>
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
- <div>Loading messages...</div>
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 wy-message-editor wy-message-editor-bottom">
265
- <ConversationForm key={id} conversationId={id} handleInsert={handleNewMessage} />
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: UserType[]) => {
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">Create conversation</div>
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;