@weavy/uikit-react 11.1.0 → 13.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 (256) hide show
  1. package/.github/workflows/publish.yml +1 -1
  2. package/README.md +3 -4
  3. package/changelog.md +57 -0
  4. package/dist/cjs/index.js +28 -6
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/types/client/WeavyClient.d.ts +8 -1
  7. package/dist/cjs/types/components/Attachment.d.ts +2 -1
  8. package/dist/cjs/types/components/Chat.d.ts +1 -1
  9. package/dist/cjs/types/components/Image.d.ts +2 -0
  10. package/dist/cjs/types/components/PdfViewer.d.ts +8 -0
  11. package/dist/cjs/types/components/Preview.d.ts +56 -0
  12. package/dist/cjs/types/contexts/MessengerContext.d.ts +1 -2
  13. package/dist/cjs/types/contexts/PreviewContext.d.ts +2 -1
  14. package/dist/cjs/types/contexts/WeavyContext.d.ts +2 -3
  15. package/dist/cjs/types/types/Chat.d.ts +1 -1
  16. package/dist/cjs/types/types/Messenger.d.ts +0 -1
  17. package/dist/cjs/types/types/types.d.ts +18 -8
  18. package/dist/cjs/types/ui/Spinner.d.ts +9 -0
  19. package/dist/cjs/types/utils/fileUtilities.d.ts +13 -1
  20. package/dist/css/weavy-chat.css +2860 -0
  21. package/dist/css/weavy-messenger.css +3217 -0
  22. package/dist/css/weavy.css +3217 -0
  23. package/dist/esm/index.js +28 -6
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/types/client/WeavyClient.d.ts +8 -1
  26. package/dist/esm/types/components/Attachment.d.ts +2 -1
  27. package/dist/esm/types/components/Chat.d.ts +1 -1
  28. package/dist/esm/types/components/Image.d.ts +2 -0
  29. package/dist/esm/types/components/PdfViewer.d.ts +8 -0
  30. package/dist/esm/types/components/Preview.d.ts +56 -0
  31. package/dist/esm/types/contexts/MessengerContext.d.ts +1 -2
  32. package/dist/esm/types/contexts/PreviewContext.d.ts +2 -1
  33. package/dist/esm/types/contexts/WeavyContext.d.ts +2 -3
  34. package/dist/esm/types/types/Chat.d.ts +1 -1
  35. package/dist/esm/types/types/Messenger.d.ts +0 -1
  36. package/dist/esm/types/types/types.d.ts +18 -8
  37. package/dist/esm/types/ui/Spinner.d.ts +9 -0
  38. package/dist/esm/types/utils/fileUtilities.d.ts +13 -1
  39. package/dist/index.d.ts +15 -9
  40. package/package.json +14 -4
  41. package/rollup.config.js +3 -3
  42. package/src/client/WeavyClient.ts +105 -24
  43. package/src/components/Attachment.tsx +8 -8
  44. package/src/components/Avatar.tsx +2 -3
  45. package/src/components/Chat.tsx +13 -17
  46. package/src/components/Conversation.tsx +23 -32
  47. package/src/components/ConversationBadge.tsx +1 -2
  48. package/src/components/ConversationForm.tsx +11 -18
  49. package/src/components/ConversationList.tsx +4 -5
  50. package/src/components/ConversationListItem.tsx +11 -13
  51. package/src/components/FileBrowser.tsx +2 -3
  52. package/src/components/Image.tsx +39 -7
  53. package/src/components/MeetingCard.tsx +7 -8
  54. package/src/components/Message.tsx +13 -14
  55. package/src/components/Messages.tsx +7 -8
  56. package/src/components/Messenger.tsx +5 -6
  57. package/src/components/NewConversation.tsx +5 -7
  58. package/src/components/PdfViewer.tsx +276 -0
  59. package/src/components/Presence.tsx +2 -2
  60. package/src/components/Preview.tsx +355 -0
  61. package/src/components/Reactions.tsx +8 -8
  62. package/src/components/SearchUsers.tsx +19 -18
  63. package/src/components/SeenBy.tsx +1 -2
  64. package/src/contexts/MessengerContext.tsx +4 -12
  65. package/src/contexts/PreviewContext.tsx +89 -17
  66. package/src/contexts/WeavyContext.tsx +15 -5
  67. package/src/hooks/useBadge.ts +2 -6
  68. package/src/hooks/useChat.ts +3 -14
  69. package/src/hooks/useConversation.ts +1 -8
  70. package/src/hooks/useConversations.ts +1 -7
  71. package/src/hooks/useFileUploader.ts +6 -8
  72. package/src/hooks/useMembers.ts +1 -7
  73. package/src/hooks/useMessages.ts +1 -7
  74. package/src/hooks/useMutateChat.ts +6 -11
  75. package/src/hooks/useMutateConversation.ts +7 -10
  76. package/src/hooks/useMutateConversationName.ts +10 -12
  77. package/src/hooks/useMutateDeleteReaction.ts +3 -8
  78. package/src/hooks/useMutateExternalBlobs.ts +6 -11
  79. package/src/hooks/useMutateMeeting.ts +6 -11
  80. package/src/hooks/useMutateMembers.ts +8 -13
  81. package/src/hooks/useMutateMessage.ts +10 -15
  82. package/src/hooks/useMutatePinned.ts +3 -8
  83. package/src/hooks/useMutateReaction.ts +6 -12
  84. package/src/hooks/useMutateRead.ts +1 -10
  85. package/src/hooks/useMutateRemoveMembers.ts +7 -12
  86. package/src/hooks/useMutateTyping.ts +6 -11
  87. package/src/hooks/usePresence.ts +4 -5
  88. package/src/hooks/useReactions.ts +0 -1
  89. package/src/hooks/useSearchUsers.ts +1 -6
  90. package/src/hooks/useUser.ts +3 -14
  91. package/src/index.ts +2 -2
  92. package/src/scss/theme/_alert.scss +73 -0
  93. package/src/scss/theme/_appbar.scss +114 -0
  94. package/src/scss/theme/_attachments.scss +74 -0
  95. package/src/scss/theme/_avatar.scss +54 -0
  96. package/src/scss/theme/_badge.scss +47 -0
  97. package/src/scss/theme/_buttons.scss +96 -0
  98. package/src/scss/theme/_card.scss +7 -0
  99. package/src/scss/theme/_checkbox.scss +56 -0
  100. package/src/scss/theme/_cm-editor.scss +42 -0
  101. package/src/scss/theme/_code-vscode-dark.scss +184 -0
  102. package/src/scss/theme/_code-vscode-light.scss +179 -0
  103. package/src/scss/theme/_code.scss +12 -0
  104. package/src/scss/theme/_colors.scss +520 -0
  105. package/src/scss/theme/_config.scss +6 -0
  106. package/src/scss/theme/_content.scss +15 -0
  107. package/src/scss/theme/_conversations.scss +91 -0
  108. package/src/scss/theme/_dropdown.scss +86 -0
  109. package/src/scss/theme/_emoji.scss +5 -0
  110. package/src/scss/theme/_filebrowser.scss +26 -0
  111. package/src/scss/theme/_files.scss +140 -0
  112. package/src/scss/theme/_icons.scss +62 -0
  113. package/src/scss/theme/_image-grid.scss +63 -0
  114. package/src/scss/theme/_inputs.scss +28 -0
  115. package/src/scss/theme/_message-editor.scss +90 -0
  116. package/src/scss/theme/_messages.scss +238 -0
  117. package/src/scss/theme/_nav.scss +52 -0
  118. package/src/scss/theme/_overlays.scss +157 -0
  119. package/src/scss/theme/_pager.scss +19 -0
  120. package/src/scss/theme/_palette.scss +165 -0
  121. package/src/scss/theme/_pane.scss +16 -0
  122. package/src/scss/theme/_panels.scss +141 -0
  123. package/src/scss/theme/_picker-list.scss +37 -0
  124. package/src/scss/theme/_preview-code.scss +5 -0
  125. package/src/scss/theme/_preview-embed.scss +38 -0
  126. package/src/scss/theme/_preview-html.scss +7 -0
  127. package/src/scss/theme/_preview-icon.scss +41 -0
  128. package/src/scss/theme/_preview-image.scss +86 -0
  129. package/src/scss/theme/_preview-media.scss +28 -0
  130. package/src/scss/theme/_preview-pdf.scss +838 -0
  131. package/src/scss/theme/_preview-text.scss +5 -0
  132. package/src/scss/theme/_preview.scss +110 -0
  133. package/src/scss/theme/_reactions.scss +58 -0
  134. package/src/scss/theme/_reboot.scss +41 -0
  135. package/src/scss/theme/_root.scss +2 -0
  136. package/src/scss/theme/_scroll.scss +55 -0
  137. package/src/scss/theme/_search.scss +68 -0
  138. package/src/scss/theme/_spinner.scss +63 -0
  139. package/src/scss/theme/_tables.scss +53 -0
  140. package/src/scss/theme/_toasts.scss +47 -0
  141. package/src/scss/theme/_turbo.scss +17 -0
  142. package/src/scss/theme/_typing.scss +26 -0
  143. package/src/scss/theme/_variables.scss +139 -0
  144. package/src/scss/theme/bootstrap/_accordion.scss +146 -0
  145. package/src/scss/theme/bootstrap/_alert.scss +71 -0
  146. package/src/scss/theme/bootstrap/_badge.scss +38 -0
  147. package/src/scss/theme/bootstrap/_breadcrumb.scss +40 -0
  148. package/src/scss/theme/bootstrap/_button-group.scss +142 -0
  149. package/src/scss/theme/bootstrap/_buttons.scss +186 -0
  150. package/src/scss/theme/bootstrap/_card.scss +234 -0
  151. package/src/scss/theme/bootstrap/_carousel.scss +229 -0
  152. package/src/scss/theme/bootstrap/_close.scss +40 -0
  153. package/src/scss/theme/bootstrap/_containers.scss +41 -0
  154. package/src/scss/theme/bootstrap/_dropdown.scss +248 -0
  155. package/src/scss/theme/bootstrap/_forms.scss +9 -0
  156. package/src/scss/theme/bootstrap/_functions.scss +302 -0
  157. package/src/scss/theme/bootstrap/_grid.scss +33 -0
  158. package/src/scss/theme/bootstrap/_helpers.scss +10 -0
  159. package/src/scss/theme/bootstrap/_images.scss +42 -0
  160. package/src/scss/theme/bootstrap/_list-group.scss +191 -0
  161. package/src/scss/theme/bootstrap/_maps.scss +54 -0
  162. package/src/scss/theme/bootstrap/_mixins.scss +43 -0
  163. package/src/scss/theme/bootstrap/_modal.scss +237 -0
  164. package/src/scss/theme/bootstrap/_nav.scss +172 -0
  165. package/src/scss/theme/bootstrap/_navbar.scss +276 -0
  166. package/src/scss/theme/bootstrap/_offcanvas.scss +143 -0
  167. package/src/scss/theme/bootstrap/_pagination.scss +109 -0
  168. package/src/scss/theme/bootstrap/_placeholders.scss +51 -0
  169. package/src/scss/theme/bootstrap/_popover.scss +196 -0
  170. package/src/scss/theme/bootstrap/_progress.scss +59 -0
  171. package/src/scss/theme/bootstrap/_reboot.scss +610 -0
  172. package/src/scss/theme/bootstrap/_root.scss +73 -0
  173. package/src/scss/theme/bootstrap/_spinners.scss +85 -0
  174. package/src/scss/theme/bootstrap/_tables.scss +164 -0
  175. package/src/scss/theme/bootstrap/_toasts.scss +70 -0
  176. package/src/scss/theme/bootstrap/_tooltip.scss +120 -0
  177. package/src/scss/theme/bootstrap/_transitions.scss +27 -0
  178. package/src/scss/theme/bootstrap/_type.scss +106 -0
  179. package/src/scss/theme/bootstrap/_utilities.scss +647 -0
  180. package/src/scss/theme/bootstrap/_variables.scss +1633 -0
  181. package/src/scss/theme/bootstrap/forms/_floating-labels.scss +74 -0
  182. package/src/scss/theme/bootstrap/forms/_form-check.scss +175 -0
  183. package/src/scss/theme/bootstrap/forms/_form-control.scss +194 -0
  184. package/src/scss/theme/bootstrap/forms/_form-range.scss +91 -0
  185. package/src/scss/theme/bootstrap/forms/_form-select.scss +71 -0
  186. package/src/scss/theme/bootstrap/forms/_form-text.scss +11 -0
  187. package/src/scss/theme/bootstrap/forms/_input-group.scss +129 -0
  188. package/src/scss/theme/bootstrap/forms/_labels.scss +36 -0
  189. package/src/scss/theme/bootstrap/forms/_validation.scss +12 -0
  190. package/src/scss/theme/bootstrap/helpers/_clearfix.scss +3 -0
  191. package/src/scss/theme/bootstrap/helpers/_color-bg.scss +10 -0
  192. package/src/scss/theme/bootstrap/helpers/_colored-links.scss +12 -0
  193. package/src/scss/theme/bootstrap/helpers/_position.scss +36 -0
  194. package/src/scss/theme/bootstrap/helpers/_ratio.scss +26 -0
  195. package/src/scss/theme/bootstrap/helpers/_stacks.scss +15 -0
  196. package/src/scss/theme/bootstrap/helpers/_stretched-link.scss +15 -0
  197. package/src/scss/theme/bootstrap/helpers/_text-truncation.scss +7 -0
  198. package/src/scss/theme/bootstrap/helpers/_visually-hidden.scss +8 -0
  199. package/src/scss/theme/bootstrap/helpers/_vr.scss +8 -0
  200. package/src/scss/theme/bootstrap/mixins/_alert.scss +15 -0
  201. package/src/scss/theme/bootstrap/mixins/_backdrop.scss +14 -0
  202. package/src/scss/theme/bootstrap/mixins/_banner.scss +9 -0
  203. package/src/scss/theme/bootstrap/mixins/_border-radius.scss +78 -0
  204. package/src/scss/theme/bootstrap/mixins/_box-shadow.scss +18 -0
  205. package/src/scss/theme/bootstrap/mixins/_breakpoints.scss +127 -0
  206. package/src/scss/theme/bootstrap/mixins/_buttons.scss +70 -0
  207. package/src/scss/theme/bootstrap/mixins/_caret.scss +64 -0
  208. package/src/scss/theme/bootstrap/mixins/_clearfix.scss +9 -0
  209. package/src/scss/theme/bootstrap/mixins/_color-scheme.scss +7 -0
  210. package/src/scss/theme/bootstrap/mixins/_container.scss +11 -0
  211. package/src/scss/theme/bootstrap/mixins/_deprecate.scss +10 -0
  212. package/src/scss/theme/bootstrap/mixins/_forms.scss +152 -0
  213. package/src/scss/theme/bootstrap/mixins/_gradients.scss +47 -0
  214. package/src/scss/theme/bootstrap/mixins/_grid.scss +151 -0
  215. package/src/scss/theme/bootstrap/mixins/_image.scss +16 -0
  216. package/src/scss/theme/bootstrap/mixins/_list-group.scss +24 -0
  217. package/src/scss/theme/bootstrap/mixins/_lists.scss +7 -0
  218. package/src/scss/theme/bootstrap/mixins/_pagination.scss +10 -0
  219. package/src/scss/theme/bootstrap/mixins/_reset-text.scss +17 -0
  220. package/src/scss/theme/bootstrap/mixins/_resize.scss +6 -0
  221. package/src/scss/theme/bootstrap/mixins/_table-variants.scss +24 -0
  222. package/src/scss/theme/bootstrap/mixins/_text-truncate.scss +8 -0
  223. package/src/scss/theme/bootstrap/mixins/_transition.scss +26 -0
  224. package/src/scss/theme/bootstrap/mixins/_utilities.scss +97 -0
  225. package/src/scss/theme/bootstrap/mixins/_visually-hidden.scss +29 -0
  226. package/src/scss/theme/bootstrap/utilities/_api.scss +47 -0
  227. package/src/scss/theme/bootstrap/vendor/_rfs.scss +354 -0
  228. package/src/scss/theme/bs/_badge.scss +20 -0
  229. package/src/scss/theme/bs/_buttons.scss +185 -0
  230. package/src/scss/theme/bs/_dropdown.scss +86 -0
  231. package/src/scss/theme/bs/_forms.scss +161 -0
  232. package/src/scss/theme/bs/_list-group.scss +73 -0
  233. package/src/scss/theme/bs/_tables.scss +46 -0
  234. package/src/scss/theme/fonts/_fontmapping-roboto.scss +129 -0
  235. package/src/scss/theme/fonts/_fontmapping-segoe-ui.scss +127 -0
  236. package/src/scss/theme/fonts/_index.scss +2 -0
  237. package/src/scss/theme/mixins/_backdrop.scss +13 -0
  238. package/src/scss/theme/mixins/_palette.scss +165 -0
  239. package/src/scss/theme/mixins/_position.scss +33 -0
  240. package/src/scss/theme/mixins/_scrollbar.scss +110 -0
  241. package/src/scss/weavy-chat.scss +32 -0
  242. package/src/scss/weavy-messenger.scss +61 -0
  243. package/src/scss/weavy.scss +2 -0
  244. package/src/types/Chat.ts +1 -1
  245. package/src/types/Messenger.ts +1 -1
  246. package/src/types/types.ts +20 -11
  247. package/src/ui/Button.tsx +3 -4
  248. package/src/ui/Dropdown.tsx +4 -5
  249. package/src/ui/Icon.tsx +75 -39
  250. package/src/ui/Overlay.tsx +2 -3
  251. package/src/ui/Spinner.tsx +18 -0
  252. package/src/utils/fileUtilities.ts +166 -72
  253. package/src/utils/scrollbarDetection.js +48 -0
  254. package/dist/cjs/types/utils/styles.d.ts +0 -17
  255. package/dist/esm/types/utils/styles.d.ts +0 -17
  256. package/src/utils/styles.ts +0 -42
@@ -11,7 +11,6 @@ import useMutateRead from '../hooks/useMutateRead';
11
11
  import useMutateMessage from '../hooks/useMutateMessage';
12
12
  import { useQueryClient } from 'react-query';
13
13
  import { WeavyContext } from '../contexts/WeavyContext';
14
- import { prefix as wy } from "../utils/styles";
15
14
  import Avatar from './Avatar';
16
15
 
17
16
  type Props = {
@@ -198,16 +197,16 @@ const Messages = ({ id, members, displayName, avatarUrl }: Props) => {
198
197
  readMessageMutation.mutate({ id: id, read: true })
199
198
  }, [id]);
200
199
 
201
- let messageHeader = <div className={wy('avatar-header')}>
200
+ let messageHeader = <div className="wy-avatar-header">
202
201
  {avatarUrl && displayName && <Avatar src={avatarUrl} name={displayName} id={id} size={128} /> || ''}
203
- {displayName && <div className={wy('avatar-display-name')}>{displayName}</div> || ''}
202
+ {displayName && <div className="wy-avatar-display-name">{displayName}</div> || ''}
204
203
  </div>;
205
204
 
206
- let loadMoreButton = <Button.UI onClick={() => fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage} className={wy('message-readmore')}>Load more</Button.UI>;
205
+ let loadMoreButton = <Button.UI onClick={() => fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage} className="wy-message-readmore">Load more</Button.UI>;
207
206
 
208
207
  let messages = (
209
208
  <>
210
- <div className={wy('message-readmore')} ref={readMoreRef}>
209
+ <div className="wy-message-readmore" ref={readMoreRef}>
211
210
  {isFetchingNextPage
212
211
  ? 'Loading more...'
213
212
  : hasNextPage
@@ -235,7 +234,7 @@ const Messages = ({ id, members, displayName, avatarUrl }: Props) => {
235
234
  parentId={id}
236
235
  reactions={item.reactions}
237
236
  //reactions_count={item.reactions_count}
238
- seenBy={members.data.length > 0 ? members.data.filter((member) => {
237
+ seenBy={(members.data && members.data.length > 0) ? members.data.filter((member) => {
239
238
  const hasRead = member.read_at >= item.created_at;
240
239
  const nothingLaterRead = !data.pages.map((p) => p.data).flat().find((message: MessageType) => { return message.id > item.id && member.read_at >= message.created_at });
241
240
  return hasRead && nothingLaterRead && member.id !== user.id;
@@ -258,10 +257,10 @@ const Messages = ({ id, members, displayName, avatarUrl }: Props) => {
258
257
 
259
258
  return (
260
259
  <>
261
- <div id="container" className={wy('messages')}>
260
+ <div id="container" className="wy-messages">
262
261
  {messages}
263
262
  </div>
264
- <div className={wy('message-editor')}>
263
+ <div className="wy-message-editor">
265
264
  <ConversationForm key={id} conversationId={id} handleInsert={handleNewMessage} />
266
265
  </div>
267
266
  </>
@@ -4,9 +4,8 @@ import Conversation from './Conversation';
4
4
  import ConversationList from './ConversationList';
5
5
  import { Messenger } from '../types/Messenger';
6
6
  import { WeavyContext } from '../contexts/WeavyContext';
7
- import { prefix as wy } from "../utils/styles";
8
7
 
9
- const Messenger: FC<Messenger> = ({ options }) => {
8
+ const Messenger: FC<Messenger> = () => {
10
9
 
11
10
  const { client } = useContext(WeavyContext);
12
11
 
@@ -15,14 +14,14 @@ const Messenger: FC<Messenger> = ({ options }) => {
15
14
  }
16
15
 
17
16
  return (
18
- <MessengerProvider options={options}>
19
- <div className={wy('messenger-provider')}>
17
+ <MessengerProvider>
18
+ <div className="wy-messenger-provider">
20
19
 
21
- <div className={wy('messenger-sidebar')}>
20
+ <div className="wy-messenger-sidebar wy-scroll-y">
22
21
  <ConversationList />
23
22
  </div>
24
23
 
25
- <div className={wy('messenger-conversation')}>
24
+ <div className="wy-messenger-conversation wy-scroll-y">
26
25
  <Conversation id={null} />
27
26
  </div>
28
27
  </div>
@@ -4,7 +4,6 @@ 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 { prefix as wy } from "../utils/styles";
8
7
 
9
8
  const NewConversation = () => {
10
9
  const [modalOpen, setModalOpen] = useState(false);
@@ -27,18 +26,17 @@ const NewConversation = () => {
27
26
 
28
27
  return (
29
28
  <>
30
-
31
29
  <Button.UI onClick={handleOpen}><Icon.UI name="plus" /></Button.UI>
32
30
 
33
- <Overlay.UI isOpen={modalOpen} className={wy('modal')}>
34
- <header className={wy('appbars')}>
35
- <nav className={wy('appbar')}>
31
+ <Overlay.UI isOpen={modalOpen} className="wy-modal">
32
+ <header className="wy-appbars">
33
+ <nav className="wy-appbar">
36
34
  <Button.UI onClick={handleClose}><Icon.UI name='close' /></Button.UI>
37
- <div className={wy('appbar-text')}>Create conversation</div>
35
+ <div className="wy-appbar-text">Create conversation</div>
38
36
  </nav>
39
37
  </header>
40
38
 
41
- <SearchUsers handleSubmit={handleCreate} buttonTitle="Create conversation"/>
39
+ <SearchUsers handleSubmit={handleCreate} buttonTitle="Next"/>
42
40
  </Overlay.UI>
43
41
  </>
44
42
 
@@ -0,0 +1,276 @@
1
+ import React, { useContext, useEffect, useRef, useCallback, useState } from "react";
2
+ import pdfjsLib, { PDFDocumentLoadingTask } from 'pdfjs-dist';
3
+ import { PDFViewer, EventBus, PDFFindController, PDFLinkService } from 'pdfjs-dist/web/pdf_viewer';
4
+ import Icon from "../ui/Icon";
5
+
6
+ type Props = {
7
+ src: string,
8
+ pdfCMapsUrl: string,
9
+ pdfWorkerUrl: string
10
+ }
11
+
12
+ const PdfViewer = ({ src, pdfCMapsUrl, pdfWorkerUrl }: Props) => {
13
+
14
+ const pageNumberRef = useRef<HTMLInputElement>(null);
15
+ const totalPagesRef = useRef<HTMLSpanElement>(null);
16
+ const zoomLevelRef = useRef<HTMLInputElement>(null);
17
+
18
+ const [pdfEventBus, setPdfEventBus] = useState<EventBus>(() => {
19
+ //console.debug("new pdf event bus")
20
+ return new EventBus();
21
+ });
22
+
23
+ const [pdfLinkService, setPdfLinkService] = useState<PDFLinkService>(() => {
24
+ // (Optionally) enable hyperlinks within PDF files.
25
+ //console.debug("new pdf link service")
26
+
27
+ return new PDFLinkService({
28
+ eventBus: pdfEventBus!
29
+ })
30
+ });
31
+
32
+ const [pdfFindController, setPdfFindController] = useState<PDFFindController>(() => {
33
+ // (Optionally) enable find controller.
34
+ //console.debug("new pdf find controller")
35
+
36
+ return new PDFFindController({
37
+ eventBus: pdfEventBus!,
38
+ linkService: pdfLinkService!,
39
+ })
40
+ });
41
+
42
+ const [pdfViewer, setPdfViewer] = useState<PDFViewer | null>();
43
+
44
+ const DEFAULT_SCALE_DELTA = 1.1;
45
+ const MAX_SCALE = 3.0;
46
+ const MIN_SCALE = 0.2;
47
+
48
+ const SEARCH_FOR = "";
49
+ const ENABLE_XFA = true;
50
+
51
+ // Some PDFs need external cmaps.
52
+ const CMAP_URL = pdfCMapsUrl || '';
53
+ const CMAP_PACKED = true;
54
+
55
+ const WORKER_URL = pdfWorkerUrl || '';
56
+
57
+ // Setting worker path to worker bundle.
58
+ pdfjsLib.GlobalWorkerOptions.workerSrc = WORKER_URL;
59
+
60
+ // Save container in state after being available
61
+ const [viewerContainer, setViewerContainer] = useState<HTMLDivElement>();
62
+ const viewerRef = useCallback((container: any) => {
63
+ setViewerContainer(container);
64
+ }, [])
65
+
66
+ useEffect(() => {
67
+ let viewer = pdfViewer;
68
+
69
+ if (viewerContainer) {
70
+
71
+ if (!pdfViewer && pdfEventBus) {
72
+ // INIT PDF VIEWER
73
+ //console.debug("new pdf viewer")
74
+
75
+ // @ts-ignore due to incorrect type def
76
+ viewer = new PDFViewer({
77
+ container: viewerContainer!,
78
+ eventBus: pdfEventBus,
79
+ linkService: pdfLinkService!,
80
+ findController: pdfFindController,
81
+ //defaultZoomValue: 1.0,
82
+ //scriptingManager: pdfScriptingManager,
83
+ //enableScripting: true, // Only necessary in PDF.js version 2.10.377 and below.
84
+ })
85
+ //pdfViewer!.MAX_AUTO_SCALE = 1.0;
86
+
87
+ pdfLinkService!.setViewer(viewer);
88
+ setPdfViewer(viewer);
89
+
90
+ pdfEventBus.on("scalechanging", function () {
91
+ //console.debug("scalechanging")
92
+ zoomLevelRef.current!.value = (Math.round(viewer!.currentScale * 100)).toFixed(0) + "%";
93
+ });
94
+
95
+ pdfEventBus.on("pagechanging", function () {
96
+ //console.debug("pagechanging")
97
+ if (pageNumberRef.current) {
98
+ pageNumberRef.current.value = viewer!.currentPageNumber.toFixed(0);
99
+ }
100
+ });
101
+
102
+ pdfEventBus.on("pagesinit", function () {
103
+ // We can use pdfViewer now, e.g. let's change default scale.
104
+ viewer!.currentScaleValue = "auto";
105
+ pageNumberRef.current!.value = "1";
106
+ totalPagesRef.current!.innerText = viewer!.pagesCount.toFixed(0);
107
+
108
+ // We can try searching for things.
109
+ if (SEARCH_FOR) {
110
+ if (pdfFindController && !("_onFind" in pdfFindController)) {
111
+ // @ts-ignore due to missing type def
112
+ pdfFindController.executeCommand("find", { query: SEARCH_FOR });
113
+ } else {
114
+ pdfEventBus!.dispatch("find", { type: "", query: SEARCH_FOR });
115
+ }
116
+ }
117
+ });
118
+ }
119
+
120
+ return () => {
121
+ if (viewer) {
122
+ //console.debug("pdf viewer dismount cleanup")
123
+ viewer.cleanup();
124
+ setPdfViewer(null);
125
+ }
126
+ }
127
+ }
128
+
129
+ }, [viewerContainer]);
130
+
131
+
132
+ useEffect(() => {
133
+ if (src && pdfViewer) {
134
+ let loadingTask: PDFDocumentLoadingTask | null = pdfjsLib.getDocument({
135
+ url: src,
136
+ enableXfa: ENABLE_XFA,
137
+ cMapUrl: CMAP_URL,
138
+ cMapPacked: CMAP_PACKED,
139
+ });
140
+
141
+ loadingTask.promise.then((doc) => {
142
+ //console.log("LOADED PDF", src);
143
+
144
+ pdfViewer.setDocument(doc);
145
+ pdfLinkService.setDocument(doc, null);
146
+ });
147
+
148
+ return () => {
149
+ if (loadingTask) {
150
+ loadingTask.destroy();
151
+ //console.debug("loadingtask cleanup", loadingTask);
152
+
153
+ // @ts-ignore due to incorrect param type def
154
+ pdfViewer.setDocument(null);
155
+ pdfLinkService.setDocument(null, null);
156
+ }
157
+ }
158
+ }
159
+ }, [src, pdfViewer])
160
+
161
+ function setScale(scale: number | string) {
162
+ //console.debug("setScale:", scale)
163
+ if (pdfViewer) {
164
+ pdfViewer.currentScaleValue = typeof scale === "number" ? scale.toFixed(2) : scale;
165
+ }
166
+ }
167
+
168
+ function setPage(pageNumber: number) {
169
+ //console.debug("setPage:", pageNumber)
170
+ if (pdfViewer) {
171
+ pdfViewer.currentPageNumber = pageNumber;
172
+ }
173
+ }
174
+
175
+ function updatePage() {
176
+ //console.debug("updatePage");
177
+ if (pdfViewer && pageNumberRef.current) {
178
+ let pageNumber = parseInt(pageNumberRef.current.value);
179
+
180
+ if (isNaN(pageNumber)) {
181
+ setPage(pdfViewer.currentPageNumber);
182
+ } else if (pageNumber > pdfViewer.pagesCount) {
183
+ setPage(pdfViewer.pagesCount);
184
+ } else if (pageNumber <= 0) {
185
+ setPage(1);
186
+ } else {
187
+ setPage(pageNumber);
188
+ }
189
+
190
+ }
191
+ }
192
+
193
+ function select(e: any) {
194
+ //console.debug("select");
195
+ e.target.setSelectionRange(0, e.target.value.length);
196
+ }
197
+
198
+ function fitToPage() {
199
+ setScale("page-fit");
200
+ }
201
+
202
+ function fitToWidth() {
203
+ setScale("page-width");
204
+ }
205
+
206
+ function zoomIn() {
207
+ console.debug("zoomIn");
208
+
209
+ if (pdfViewer) {
210
+ let newScale = pdfViewer.currentScale;
211
+ let steps = 1;
212
+ do {
213
+ newScale = newScale * DEFAULT_SCALE_DELTA;
214
+ newScale = Math.floor(newScale * 10) / 10;
215
+ newScale = Math.min(MAX_SCALE, newScale);
216
+ } while (--steps > 0 && newScale < MAX_SCALE);
217
+
218
+ setScale(newScale);
219
+ }
220
+ }
221
+
222
+ function zoomOut() {
223
+ //console.debug("zoomOut");
224
+ if (pdfViewer) {
225
+ let newScale = pdfViewer.currentScale;
226
+ let steps = 1;
227
+ do {
228
+ newScale = newScale / DEFAULT_SCALE_DELTA;
229
+ newScale = Math.floor(newScale * 10) / 10;
230
+ newScale = Math.max(MIN_SCALE, newScale);
231
+ } while (--steps > 0 && newScale > MIN_SCALE);
232
+
233
+ setScale(newScale);
234
+ }
235
+ }
236
+
237
+ function updateZoom() {
238
+ //console.debug("updateZoom");
239
+ if (pdfViewer && zoomLevelRef.current) {
240
+ let zoomValue = parseFloat(zoomLevelRef.current.value.replace("%", ""));
241
+ if (isNaN(zoomValue)) {
242
+ setScale(pdfViewer.currentScale + 0.0001);
243
+ } else {
244
+ setScale(zoomValue / 100);
245
+ }
246
+ }
247
+ }
248
+
249
+ return (
250
+ <div className="wy-content-pdf" data-controller="pdf" data-pdf-url-value="">
251
+ <div className="wy-toolbar">
252
+ <nav className="wy-tools">
253
+ <div className="wy-tool">
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>
257
+ </div>
258
+ <div className="wy-tool">
259
+ <button className="wy-button wy-button-icon btn-zoom-out" onClick={zoomOut} title="Zoom out"><Icon.UI name="minus" /></button>
260
+ <input type="text" className="wy-input" ref={zoomLevelRef} onChange={updateZoom} onClick={select} value="100%" data-pdf-target="zoomLevel"/>
261
+ <button className="wy-button wy-button-icon btn-zoom-in" onClick={zoomIn} title="Zoom in"><Icon.UI name="plus" /></button>
262
+ </div>
263
+ <div className="wy-tool">
264
+ <button className="wy-button wy-button-icon btn-fit-page" onClick={fitToWidth} title="Fit to width"><Icon.UI name="fit-width" /></button>
265
+ <button className="wy-button wy-button-icon" onClick={fitToPage} title="Fit to screen"><Icon.UI name="fit-screen" /></button>
266
+ </div>
267
+ </nav>
268
+ </div>
269
+ <div ref={viewerRef} className="wy-pdf-container">
270
+ <div id="viewer" className="pdfViewer"></div>
271
+ </div>
272
+ </div>
273
+ )
274
+ }
275
+
276
+ export default PdfViewer;
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { prefix as wy } from "../utils/styles";
2
+ import classNames from "classnames";
3
3
 
4
4
  type Props = {
5
5
  id: number,
@@ -8,7 +8,7 @@ type Props = {
8
8
 
9
9
  const Presence = ({ id, status }: Props) => {
10
10
  return (
11
- <span className={wy(`presence ${status === "active" ? "presence-active" : ""}`)} data-presence-id={id}></span>
11
+ <span className={classNames("wy-presence", { "wy-presence-active": status === "active" })} data-presence-id={id}></span>
12
12
  )
13
13
  }
14
14