@weavy/uikit-react 12.1.0 → 14.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.
- package/changelog.md +60 -0
- package/dist/cjs/index.js +28 -6
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types/client/WeavyClient.d.ts +8 -1
- package/dist/cjs/types/components/Attachment.d.ts +2 -1
- package/dist/cjs/types/components/Chat.d.ts +1 -1
- package/dist/cjs/types/components/Messages.d.ts +3 -1
- package/dist/cjs/types/components/PdfViewer.d.ts +3 -1
- package/dist/cjs/types/components/Preview.d.ts +8 -10
- package/dist/cjs/types/contexts/PreviewContext.d.ts +2 -1
- package/dist/cjs/types/contexts/WeavyContext.d.ts +2 -3
- package/dist/cjs/types/hooks/useConversations.d.ts +1 -1
- package/dist/cjs/types/hooks/useMutateMessage.d.ts +1 -1
- package/dist/cjs/types/hooks/useMutateRead.d.ts +1 -0
- package/dist/cjs/types/types/Chat.d.ts +2 -1
- package/dist/cjs/types/types/Message.d.ts +2 -0
- package/dist/cjs/types/types/types.d.ts +63 -9
- package/dist/cjs/types/ui/Spinner.d.ts +10 -0
- package/dist/cjs/types/utils/fileUtilities.d.ts +1 -4
- package/dist/css/weavy-chat.css +1803 -1041
- package/dist/css/weavy-messenger.css +2141 -1360
- package/dist/css/weavy.css +1943 -1162
- package/dist/esm/index.js +28 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/client/WeavyClient.d.ts +8 -1
- package/dist/esm/types/components/Attachment.d.ts +2 -1
- package/dist/esm/types/components/Chat.d.ts +1 -1
- package/dist/esm/types/components/Messages.d.ts +3 -1
- package/dist/esm/types/components/PdfViewer.d.ts +3 -1
- package/dist/esm/types/components/Preview.d.ts +8 -10
- package/dist/esm/types/contexts/PreviewContext.d.ts +2 -1
- package/dist/esm/types/contexts/WeavyContext.d.ts +2 -3
- package/dist/esm/types/hooks/useConversations.d.ts +1 -1
- package/dist/esm/types/hooks/useMutateMessage.d.ts +1 -1
- package/dist/esm/types/hooks/useMutateRead.d.ts +1 -0
- package/dist/esm/types/types/Chat.d.ts +2 -1
- package/dist/esm/types/types/Message.d.ts +2 -0
- package/dist/esm/types/types/types.d.ts +63 -9
- package/dist/esm/types/ui/Spinner.d.ts +10 -0
- package/dist/esm/types/utils/fileUtilities.d.ts +1 -4
- package/dist/index.d.ts +15 -7
- package/package.json +2 -2
- package/rollup.config.js +3 -1
- package/src/client/WeavyClient.ts +105 -29
- package/src/components/Attachment.tsx +8 -7
- package/src/components/Chat.tsx +8 -7
- package/src/components/Conversation.tsx +29 -23
- package/src/components/ConversationBadge.tsx +7 -5
- package/src/components/ConversationForm.tsx +1 -1
- package/src/components/ConversationList.tsx +59 -11
- package/src/components/ConversationListItem.tsx +71 -54
- package/src/components/FileBrowser.tsx +53 -50
- package/src/components/MeetingCard.tsx +35 -13
- package/src/components/Meetings.tsx +1 -1
- package/src/components/Message.tsx +41 -41
- package/src/components/Messages.tsx +62 -61
- package/src/components/Messenger.tsx +7 -2
- package/src/components/NewConversation.tsx +1 -1
- package/src/components/PdfViewer.tsx +93 -88
- package/src/components/Preview.tsx +115 -54
- package/src/components/Reactions.tsx +11 -5
- package/src/components/SearchUsers.tsx +21 -11
- package/src/components/SeenBy.tsx +13 -7
- package/src/components/Typing.tsx +11 -12
- package/src/contexts/PreviewContext.tsx +90 -16
- package/src/contexts/UserContext.tsx +1 -1
- package/src/contexts/WeavyContext.tsx +10 -7
- package/src/hooks/useBadge.ts +2 -6
- package/src/hooks/useChat.ts +3 -14
- package/src/hooks/useConversation.ts +1 -7
- package/src/hooks/useConversations.ts +15 -11
- package/src/hooks/useFileUploader.ts +6 -8
- package/src/hooks/useMembers.ts +1 -7
- package/src/hooks/useMessages.ts +1 -7
- package/src/hooks/useMutateChat.ts +6 -11
- package/src/hooks/useMutateConversation.ts +7 -10
- package/src/hooks/useMutateConversationName.ts +10 -12
- package/src/hooks/useMutateDeleteReaction.ts +3 -8
- package/src/hooks/useMutateExternalBlobs.ts +6 -11
- package/src/hooks/useMutateMeeting.ts +6 -11
- package/src/hooks/useMutateMembers.ts +8 -13
- package/src/hooks/useMutateMessage.ts +9 -18
- package/src/hooks/useMutatePinned.ts +3 -8
- package/src/hooks/useMutateReaction.ts +6 -12
- package/src/hooks/useMutateRead.ts +5 -12
- package/src/hooks/useMutateRemoveMembers.ts +7 -12
- package/src/hooks/useMutateTyping.ts +6 -11
- package/src/hooks/usePresence.ts +2 -3
- package/src/hooks/useReactions.ts +11 -12
- package/src/hooks/useSearchUsers.ts +1 -6
- package/src/hooks/useUser.ts +3 -14
- package/src/scss/theme/_alert.scss +61 -63
- package/src/scss/theme/_appbar.scss +105 -28
- package/src/scss/theme/_avatar.scss +23 -28
- package/src/scss/theme/_badge.scss +26 -18
- package/src/scss/theme/_buttons.scss +107 -52
- package/src/scss/theme/_card.scss +102 -4
- package/src/scss/theme/_checkbox.scss +16 -20
- package/src/scss/theme/_code-vscode-dark.scss +184 -0
- package/src/scss/theme/_code-vscode-light.scss +179 -0
- package/src/scss/theme/_code.scss +9 -114
- package/src/scss/theme/_comment-editor-cm.scss +97 -0
- package/src/scss/theme/_comment-editor.scss +129 -0
- package/src/scss/theme/_comments.scss +66 -0
- package/src/scss/theme/_content.scss +33 -5
- package/src/scss/theme/_conversations.scss +19 -78
- package/src/scss/theme/_dropdown.scss +102 -15
- package/src/scss/theme/_embed.scss +135 -0
- package/src/scss/theme/_facepile.scss +11 -0
- package/src/scss/theme/_filebrowser.scss +1 -1
- package/src/scss/theme/_files.scss +77 -48
- package/src/scss/theme/_grid.scss +8 -0
- package/src/scss/theme/_icons.scss +155 -19
- package/src/scss/theme/_image-grid.scss +7 -10
- package/src/scss/theme/_input.scss +160 -0
- package/src/scss/theme/_item.scss +169 -0
- package/src/scss/theme/_list.scss +57 -0
- package/src/scss/theme/_meeting.scss +11 -0
- package/src/scss/theme/_message-editor-cm.scss +95 -0
- package/src/scss/theme/_message-editor.scss +66 -20
- package/src/scss/theme/_messages.scss +51 -105
- package/src/scss/theme/_meta.scss +12 -0
- package/src/scss/theme/_overlays.scss +31 -76
- package/src/scss/theme/_pager.scss +5 -1
- package/src/scss/theme/_pane.scss +13 -2
- package/src/scss/theme/_panels.scss +34 -25
- package/src/scss/theme/_picker-list.scss +5 -3
- package/src/scss/theme/_placeholder.scss +19 -0
- package/src/scss/theme/_poll.scss +49 -0
- package/src/scss/theme/_post-editor-cm.scss +100 -0
- package/src/scss/theme/_post-editor.scss +127 -0
- package/src/scss/theme/_post.scss +83 -0
- package/src/scss/theme/_preview-code.scss +14 -0
- package/src/scss/theme/_preview-embed.scss +11 -5
- package/src/scss/theme/_preview-image.scss +8 -26
- package/src/scss/theme/_preview-media.scss +1 -0
- package/src/scss/theme/_preview-pdf.scss +10 -15
- package/src/scss/theme/_preview-text.scss +1 -1
- package/src/scss/theme/_preview.scss +59 -76
- package/src/scss/theme/_reactions.scss +48 -17
- package/src/scss/theme/_sheet.scss +59 -0
- package/src/scss/theme/_sidebar.scss +86 -0
- package/src/scss/theme/_spinner.scss +11 -7
- package/src/scss/theme/_tab.scss +72 -0
- package/src/scss/theme/_tables.scss +70 -23
- package/src/scss/theme/_toasts.scss +56 -26
- package/src/scss/theme/_type.scss +41 -0
- package/src/scss/theme/{mixins → base}/_backdrop.scss +0 -0
- package/src/scss/theme/{bootstrap/mixins → base}/_breakpoints.scss +9 -0
- package/src/scss/theme/base/_colors.scss +315 -0
- package/src/scss/theme/base/_md.scss +19 -0
- package/src/scss/theme/base/_palette.scss +130 -0
- package/src/scss/theme/{mixins → base}/_position.scss +5 -5
- package/src/scss/theme/base/_reboot.scss +51 -0
- package/src/scss/theme/base/_scroll.scss +180 -0
- package/src/scss/theme/base/_svg.scss +49 -0
- package/src/scss/theme/base/_text.scss +23 -0
- package/src/scss/theme/base/_vars.scss +203 -0
- package/src/scss/theme/{fonts → base/fonts}/_fontmapping-roboto.scss +0 -0
- package/src/scss/theme/{fonts → base/fonts}/_fontmapping-segoe-ui.scss +0 -0
- package/src/scss/theme/base/fonts/_index.scss +2 -0
- package/src/scss/weavy-chat.scss +11 -4
- package/src/scss/weavy-messenger.scss +38 -21
- package/src/types/Chat.ts +2 -1
- package/src/types/Message.ts +3 -1
- package/src/types/types.ts +72 -10
- package/src/ui/Icon.tsx +1 -1
- package/src/ui/Spinner.tsx +19 -0
- package/src/utils/fileUtilities.ts +11 -125
- package/src/utils/infiniteScroll.js +11 -2
- package/src/utils/postal-parent.js +398 -0
- package/src/utils/promise.js +187 -0
- package/src/utils/scrollbarDetection.js +68 -9
- package/src/utils/utils.js +547 -0
- package/src/scss/theme/_attachments.scss +0 -74
- package/src/scss/theme/_cm-editor.scss +0 -42
- package/src/scss/theme/_colors.scss +0 -520
- package/src/scss/theme/_config.scss +0 -6
- package/src/scss/theme/_inputs.scss +0 -28
- package/src/scss/theme/_nav.scss +0 -52
- package/src/scss/theme/_palette.scss +0 -165
- package/src/scss/theme/_preview-icon.scss +0 -41
- package/src/scss/theme/_reboot.scss +0 -41
- package/src/scss/theme/_root.scss +0 -2
- package/src/scss/theme/_scroll.scss +0 -55
- package/src/scss/theme/_search.scss +0 -68
- package/src/scss/theme/_turbo.scss +0 -17
- package/src/scss/theme/_variables.scss +0 -139
- package/src/scss/theme/bootstrap/_accordion.scss +0 -146
- package/src/scss/theme/bootstrap/_alert.scss +0 -71
- package/src/scss/theme/bootstrap/_badge.scss +0 -38
- package/src/scss/theme/bootstrap/_breadcrumb.scss +0 -40
- package/src/scss/theme/bootstrap/_button-group.scss +0 -142
- package/src/scss/theme/bootstrap/_buttons.scss +0 -186
- package/src/scss/theme/bootstrap/_card.scss +0 -234
- package/src/scss/theme/bootstrap/_carousel.scss +0 -229
- package/src/scss/theme/bootstrap/_close.scss +0 -40
- package/src/scss/theme/bootstrap/_containers.scss +0 -41
- package/src/scss/theme/bootstrap/_dropdown.scss +0 -248
- package/src/scss/theme/bootstrap/_forms.scss +0 -9
- package/src/scss/theme/bootstrap/_functions.scss +0 -302
- package/src/scss/theme/bootstrap/_grid.scss +0 -33
- package/src/scss/theme/bootstrap/_helpers.scss +0 -10
- package/src/scss/theme/bootstrap/_images.scss +0 -42
- package/src/scss/theme/bootstrap/_list-group.scss +0 -191
- package/src/scss/theme/bootstrap/_maps.scss +0 -54
- package/src/scss/theme/bootstrap/_mixins.scss +0 -43
- package/src/scss/theme/bootstrap/_modal.scss +0 -237
- package/src/scss/theme/bootstrap/_nav.scss +0 -172
- package/src/scss/theme/bootstrap/_navbar.scss +0 -276
- package/src/scss/theme/bootstrap/_offcanvas.scss +0 -143
- package/src/scss/theme/bootstrap/_pagination.scss +0 -109
- package/src/scss/theme/bootstrap/_placeholders.scss +0 -51
- package/src/scss/theme/bootstrap/_popover.scss +0 -196
- package/src/scss/theme/bootstrap/_progress.scss +0 -59
- package/src/scss/theme/bootstrap/_reboot.scss +0 -610
- package/src/scss/theme/bootstrap/_root.scss +0 -73
- package/src/scss/theme/bootstrap/_spinners.scss +0 -85
- package/src/scss/theme/bootstrap/_tables.scss +0 -164
- package/src/scss/theme/bootstrap/_toasts.scss +0 -70
- package/src/scss/theme/bootstrap/_tooltip.scss +0 -120
- package/src/scss/theme/bootstrap/_transitions.scss +0 -27
- package/src/scss/theme/bootstrap/_type.scss +0 -106
- package/src/scss/theme/bootstrap/_utilities.scss +0 -647
- package/src/scss/theme/bootstrap/_variables.scss +0 -1633
- package/src/scss/theme/bootstrap/forms/_floating-labels.scss +0 -74
- package/src/scss/theme/bootstrap/forms/_form-check.scss +0 -175
- package/src/scss/theme/bootstrap/forms/_form-control.scss +0 -194
- package/src/scss/theme/bootstrap/forms/_form-range.scss +0 -91
- package/src/scss/theme/bootstrap/forms/_form-select.scss +0 -71
- package/src/scss/theme/bootstrap/forms/_form-text.scss +0 -11
- package/src/scss/theme/bootstrap/forms/_input-group.scss +0 -129
- package/src/scss/theme/bootstrap/forms/_labels.scss +0 -36
- package/src/scss/theme/bootstrap/forms/_validation.scss +0 -12
- package/src/scss/theme/bootstrap/helpers/_clearfix.scss +0 -3
- package/src/scss/theme/bootstrap/helpers/_color-bg.scss +0 -10
- package/src/scss/theme/bootstrap/helpers/_colored-links.scss +0 -12
- package/src/scss/theme/bootstrap/helpers/_position.scss +0 -36
- package/src/scss/theme/bootstrap/helpers/_ratio.scss +0 -26
- package/src/scss/theme/bootstrap/helpers/_stacks.scss +0 -15
- package/src/scss/theme/bootstrap/helpers/_stretched-link.scss +0 -15
- package/src/scss/theme/bootstrap/helpers/_text-truncation.scss +0 -7
- package/src/scss/theme/bootstrap/helpers/_visually-hidden.scss +0 -8
- package/src/scss/theme/bootstrap/helpers/_vr.scss +0 -8
- package/src/scss/theme/bootstrap/mixins/_alert.scss +0 -15
- package/src/scss/theme/bootstrap/mixins/_backdrop.scss +0 -14
- package/src/scss/theme/bootstrap/mixins/_banner.scss +0 -9
- package/src/scss/theme/bootstrap/mixins/_border-radius.scss +0 -78
- package/src/scss/theme/bootstrap/mixins/_box-shadow.scss +0 -18
- package/src/scss/theme/bootstrap/mixins/_buttons.scss +0 -70
- package/src/scss/theme/bootstrap/mixins/_caret.scss +0 -64
- package/src/scss/theme/bootstrap/mixins/_clearfix.scss +0 -9
- package/src/scss/theme/bootstrap/mixins/_color-scheme.scss +0 -7
- package/src/scss/theme/bootstrap/mixins/_container.scss +0 -11
- package/src/scss/theme/bootstrap/mixins/_deprecate.scss +0 -10
- package/src/scss/theme/bootstrap/mixins/_forms.scss +0 -152
- package/src/scss/theme/bootstrap/mixins/_gradients.scss +0 -47
- package/src/scss/theme/bootstrap/mixins/_grid.scss +0 -151
- package/src/scss/theme/bootstrap/mixins/_image.scss +0 -16
- package/src/scss/theme/bootstrap/mixins/_list-group.scss +0 -24
- package/src/scss/theme/bootstrap/mixins/_lists.scss +0 -7
- package/src/scss/theme/bootstrap/mixins/_pagination.scss +0 -10
- package/src/scss/theme/bootstrap/mixins/_reset-text.scss +0 -17
- package/src/scss/theme/bootstrap/mixins/_resize.scss +0 -6
- package/src/scss/theme/bootstrap/mixins/_table-variants.scss +0 -24
- package/src/scss/theme/bootstrap/mixins/_text-truncate.scss +0 -8
- package/src/scss/theme/bootstrap/mixins/_transition.scss +0 -26
- package/src/scss/theme/bootstrap/mixins/_utilities.scss +0 -97
- package/src/scss/theme/bootstrap/mixins/_visually-hidden.scss +0 -29
- package/src/scss/theme/bootstrap/utilities/_api.scss +0 -47
- package/src/scss/theme/bootstrap/vendor/_rfs.scss +0 -354
- package/src/scss/theme/bs/_badge.scss +0 -20
- package/src/scss/theme/bs/_buttons.scss +0 -185
- package/src/scss/theme/bs/_dropdown.scss +0 -86
- package/src/scss/theme/bs/_forms.scss +0 -161
- package/src/scss/theme/bs/_list-group.scss +0 -73
- package/src/scss/theme/bs/_tables.scss +0 -46
- package/src/scss/theme/fonts/_index.scss +0 -2
- package/src/scss/theme/mixins/_palette.scss +0 -165
- package/src/scss/theme/mixins/_scrollbar.scss +0 -110
|
@@ -1,23 +1,45 @@
|
|
|
1
|
-
import React, { useEffect, useRef, useCallback, useState } from "react";
|
|
2
|
-
import pdfjsLib from 'pdfjs-dist';
|
|
3
|
-
import
|
|
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
4
|
import Icon from "../ui/Icon";
|
|
5
5
|
|
|
6
6
|
type Props = {
|
|
7
|
-
src: string
|
|
7
|
+
src: string,
|
|
8
|
+
pdfCMapsUrl: string,
|
|
9
|
+
pdfWorkerUrl: string
|
|
8
10
|
}
|
|
9
11
|
|
|
10
|
-
const PdfViewer = ({ src }: Props) => {
|
|
11
|
-
|
|
12
|
+
const PdfViewer = ({ src, pdfCMapsUrl, pdfWorkerUrl }: Props) => {
|
|
13
|
+
|
|
12
14
|
const pageNumberRef = useRef<HTMLInputElement>(null);
|
|
13
15
|
const totalPagesRef = useRef<HTMLSpanElement>(null);
|
|
14
16
|
const zoomLevelRef = useRef<HTMLInputElement>(null);
|
|
15
17
|
|
|
16
|
-
const [pdfEventBus, setPdfEventBus] = useState<
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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>();
|
|
21
43
|
|
|
22
44
|
const DEFAULT_SCALE_DELTA = 1.1;
|
|
23
45
|
const MAX_SCALE = 3.0;
|
|
@@ -27,70 +49,57 @@ const PdfViewer = ({ src }: Props) => {
|
|
|
27
49
|
const ENABLE_XFA = true;
|
|
28
50
|
|
|
29
51
|
// Some PDFs need external cmaps.
|
|
30
|
-
const CMAP_URL =
|
|
52
|
+
const CMAP_URL = pdfCMapsUrl || '';
|
|
31
53
|
const CMAP_PACKED = true;
|
|
32
54
|
|
|
55
|
+
const WORKER_URL = pdfWorkerUrl || '';
|
|
56
|
+
|
|
33
57
|
// Setting worker path to worker bundle.
|
|
34
|
-
pdfjsLib.GlobalWorkerOptions.workerSrc =
|
|
58
|
+
pdfjsLib.GlobalWorkerOptions.workerSrc = WORKER_URL;
|
|
35
59
|
|
|
60
|
+
// Save container in state after being available
|
|
61
|
+
const [viewerContainer, setViewerContainer] = useState<HTMLDivElement>();
|
|
36
62
|
const viewerRef = useCallback((container: any) => {
|
|
37
|
-
|
|
63
|
+
setViewerContainer(container);
|
|
64
|
+
}, [])
|
|
38
65
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
let viewer = pdfViewer;
|
|
42
|
-
let eventBus = pdfEventBus;
|
|
43
|
-
|
|
44
|
-
if (!pdfEventBus) {
|
|
45
|
-
eventBus = new pdfjsViewer.EventBus();
|
|
46
|
-
setPdfEventBus(eventBus);
|
|
47
|
-
}
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
let viewer = pdfViewer;
|
|
48
68
|
|
|
49
|
-
|
|
50
|
-
if (!pdfLinkService) {
|
|
51
|
-
linkService = new pdfjsViewer.PDFLinkService({
|
|
52
|
-
eventBus: eventBus!,
|
|
53
|
-
})
|
|
54
|
-
setPdfLinkService(linkService);
|
|
55
|
-
}
|
|
69
|
+
if (viewerContainer) {
|
|
56
70
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
eventBus: eventBus!,
|
|
61
|
-
linkService: linkService!,
|
|
62
|
-
})
|
|
63
|
-
setPdfFindController(findController);
|
|
64
|
-
}
|
|
71
|
+
if (!pdfViewer && pdfEventBus) {
|
|
72
|
+
// INIT PDF VIEWER
|
|
73
|
+
//console.debug("new pdf viewer")
|
|
65
74
|
|
|
66
|
-
if (!pdfViewer && eventBus) {
|
|
67
75
|
// @ts-ignore due to incorrect type def
|
|
68
|
-
viewer = new
|
|
69
|
-
container:
|
|
70
|
-
eventBus:
|
|
71
|
-
linkService:
|
|
72
|
-
findController:
|
|
76
|
+
viewer = new PDFViewer({
|
|
77
|
+
container: viewerContainer!,
|
|
78
|
+
eventBus: pdfEventBus,
|
|
79
|
+
linkService: pdfLinkService!,
|
|
80
|
+
findController: pdfFindController,
|
|
73
81
|
//defaultZoomValue: 1.0,
|
|
74
82
|
//scriptingManager: pdfScriptingManager,
|
|
75
83
|
//enableScripting: true, // Only necessary in PDF.js version 2.10.377 and below.
|
|
76
84
|
})
|
|
77
85
|
//pdfViewer!.MAX_AUTO_SCALE = 1.0;
|
|
78
|
-
|
|
86
|
+
|
|
87
|
+
pdfLinkService!.setViewer(viewer);
|
|
79
88
|
setPdfViewer(viewer);
|
|
80
89
|
|
|
81
|
-
|
|
82
|
-
console.debug("scalechanging")
|
|
90
|
+
pdfEventBus.on("scalechanging", function () {
|
|
91
|
+
//console.debug("scalechanging")
|
|
83
92
|
zoomLevelRef.current!.value = (Math.round(viewer!.currentScale * 100)).toFixed(0) + "%";
|
|
84
93
|
});
|
|
85
94
|
|
|
86
|
-
|
|
87
|
-
console.debug("pagechanging")
|
|
95
|
+
pdfEventBus.on("pagechanging", function () {
|
|
96
|
+
//console.debug("pagechanging")
|
|
88
97
|
if (pageNumberRef.current) {
|
|
89
98
|
pageNumberRef.current.value = viewer!.currentPageNumber.toFixed(0);
|
|
90
99
|
}
|
|
91
100
|
});
|
|
92
101
|
|
|
93
|
-
|
|
102
|
+
pdfEventBus.on("pagesinit", function () {
|
|
94
103
|
// We can use pdfViewer now, e.g. let's change default scale.
|
|
95
104
|
viewer!.currentScaleValue = "auto";
|
|
96
105
|
pageNumberRef.current!.value = "1";
|
|
@@ -98,77 +107,73 @@ const PdfViewer = ({ src }: Props) => {
|
|
|
98
107
|
|
|
99
108
|
// We can try searching for things.
|
|
100
109
|
if (SEARCH_FOR) {
|
|
101
|
-
if (
|
|
110
|
+
if (pdfFindController && !("_onFind" in pdfFindController)) {
|
|
102
111
|
// @ts-ignore due to missing type def
|
|
103
|
-
|
|
112
|
+
pdfFindController.executeCommand("find", { query: SEARCH_FOR });
|
|
104
113
|
} else {
|
|
105
|
-
|
|
114
|
+
pdfEventBus!.dispatch("find", { type: "", query: SEARCH_FOR });
|
|
106
115
|
}
|
|
107
116
|
}
|
|
108
117
|
});
|
|
109
118
|
}
|
|
110
119
|
|
|
111
|
-
|
|
112
|
-
|
|
120
|
+
return () => {
|
|
121
|
+
if (viewer) {
|
|
122
|
+
//console.debug("pdf viewer dismount cleanup")
|
|
123
|
+
viewer.cleanup();
|
|
124
|
+
setPdfViewer(null);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
113
127
|
}
|
|
114
|
-
}, []);
|
|
115
128
|
|
|
116
|
-
|
|
117
|
-
if (src && pdfViewer && pdfLinkService) {
|
|
118
|
-
let loadingTask: pdfjsLib.PDFDocumentLoadingTask;
|
|
119
|
-
let loadedDoc: pdfjsLib.PDFDocumentProxy;
|
|
129
|
+
}, [viewerContainer]);
|
|
120
130
|
|
|
121
|
-
|
|
131
|
+
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
if (src && pdfViewer) {
|
|
134
|
+
let loadingTask: PDFDocumentLoadingTask | null = pdfjsLib.getDocument({
|
|
122
135
|
url: src,
|
|
123
136
|
enableXfa: ENABLE_XFA,
|
|
124
137
|
cMapUrl: CMAP_URL,
|
|
125
138
|
cMapPacked: CMAP_PACKED,
|
|
126
139
|
});
|
|
127
140
|
|
|
128
|
-
|
|
129
|
-
|
|
141
|
+
loadingTask.promise.then((doc) => {
|
|
142
|
+
//console.log("LOADED PDF", src);
|
|
130
143
|
|
|
131
|
-
loadingTask.promise.then(function (doc) {
|
|
132
|
-
loadedDoc = doc;
|
|
133
|
-
//console.log("LOADED PDF");
|
|
134
144
|
pdfViewer.setDocument(doc);
|
|
135
145
|
pdfLinkService.setDocument(doc, null);
|
|
136
146
|
});
|
|
137
147
|
|
|
138
148
|
return () => {
|
|
139
149
|
if (loadingTask) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
loadingTask._transport.destroy();
|
|
143
|
-
}
|
|
150
|
+
loadingTask.destroy();
|
|
151
|
+
//console.debug("loadingtask cleanup", loadingTask);
|
|
144
152
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
//loadingTask.destroy();
|
|
150
|
-
pdfViewer.cleanup();
|
|
153
|
+
// @ts-ignore due to incorrect param type def
|
|
154
|
+
pdfViewer.setDocument(null);
|
|
155
|
+
pdfLinkService.setDocument(null, null);
|
|
151
156
|
}
|
|
152
157
|
}
|
|
153
158
|
}
|
|
154
159
|
}, [src, pdfViewer])
|
|
155
160
|
|
|
156
161
|
function setScale(scale: number | string) {
|
|
157
|
-
console.debug("setScale:", scale)
|
|
162
|
+
//console.debug("setScale:", scale)
|
|
158
163
|
if (pdfViewer) {
|
|
159
164
|
pdfViewer.currentScaleValue = typeof scale === "number" ? scale.toFixed(2) : scale;
|
|
160
165
|
}
|
|
161
166
|
}
|
|
162
167
|
|
|
163
168
|
function setPage(pageNumber: number) {
|
|
164
|
-
console.debug("setPage:", pageNumber)
|
|
169
|
+
//console.debug("setPage:", pageNumber)
|
|
165
170
|
if (pdfViewer) {
|
|
166
171
|
pdfViewer.currentPageNumber = pageNumber;
|
|
167
172
|
}
|
|
168
173
|
}
|
|
169
174
|
|
|
170
175
|
function updatePage() {
|
|
171
|
-
console.debug("updatePage");
|
|
176
|
+
//console.debug("updatePage");
|
|
172
177
|
if (pdfViewer && pageNumberRef.current) {
|
|
173
178
|
let pageNumber = parseInt(pageNumberRef.current.value);
|
|
174
179
|
|
|
@@ -186,7 +191,7 @@ const PdfViewer = ({ src }: Props) => {
|
|
|
186
191
|
}
|
|
187
192
|
|
|
188
193
|
function select(e: any) {
|
|
189
|
-
console.debug("select");
|
|
194
|
+
//console.debug("select");
|
|
190
195
|
e.target.setSelectionRange(0, e.target.value.length);
|
|
191
196
|
}
|
|
192
197
|
|
|
@@ -215,7 +220,7 @@ const PdfViewer = ({ src }: Props) => {
|
|
|
215
220
|
}
|
|
216
221
|
|
|
217
222
|
function zoomOut() {
|
|
218
|
-
console.debug("zoomOut");
|
|
223
|
+
//console.debug("zoomOut");
|
|
219
224
|
if (pdfViewer) {
|
|
220
225
|
let newScale = pdfViewer.currentScale;
|
|
221
226
|
let steps = 1;
|
|
@@ -230,7 +235,7 @@ const PdfViewer = ({ src }: Props) => {
|
|
|
230
235
|
}
|
|
231
236
|
|
|
232
237
|
function updateZoom() {
|
|
233
|
-
console.debug("updateZoom");
|
|
238
|
+
//console.debug("updateZoom");
|
|
234
239
|
if (pdfViewer && zoomLevelRef.current) {
|
|
235
240
|
let zoomValue = parseFloat(zoomLevelRef.current.value.replace("%", ""));
|
|
236
241
|
if (isNaN(zoomValue)) {
|
|
@@ -243,19 +248,19 @@ const PdfViewer = ({ src }: Props) => {
|
|
|
243
248
|
|
|
244
249
|
return (
|
|
245
250
|
<div className="wy-content-pdf" data-controller="pdf" data-pdf-url-value="">
|
|
246
|
-
<div className="wy-
|
|
247
|
-
<nav className="wy-
|
|
248
|
-
<div className="wy-
|
|
251
|
+
<div className="wy-toolbars-bottom">
|
|
252
|
+
<nav className="wy-toolbar">
|
|
253
|
+
<div className="wy-toolbar-buttons">
|
|
249
254
|
<input type="text" className="wy-input" ref={pageNumberRef} onChange={updatePage} onClick={select} data-pdf-target="pageNumber"/>
|
|
250
255
|
<span>/</span>
|
|
251
256
|
<span ref={totalPagesRef}>1</span>
|
|
252
257
|
</div>
|
|
253
|
-
<div className="wy-
|
|
258
|
+
<div className="wy-toolbar-buttons">
|
|
254
259
|
<button className="wy-button wy-button-icon btn-zoom-out" onClick={zoomOut} title="Zoom out"><Icon.UI name="minus" /></button>
|
|
255
260
|
<input type="text" className="wy-input" ref={zoomLevelRef} onChange={updateZoom} onClick={select} value="100%" data-pdf-target="zoomLevel"/>
|
|
256
261
|
<button className="wy-button wy-button-icon btn-zoom-in" onClick={zoomIn} title="Zoom in"><Icon.UI name="plus" /></button>
|
|
257
262
|
</div>
|
|
258
|
-
<div className="wy-
|
|
263
|
+
<div className="wy-toolbar-buttons">
|
|
259
264
|
<button className="wy-button wy-button-icon btn-fit-page" onClick={fitToWidth} title="Fit to width"><Icon.UI name="fit-width" /></button>
|
|
260
265
|
<button className="wy-button wy-button-icon" onClick={fitToPage} title="Fit to screen"><Icon.UI name="fit-screen" /></button>
|
|
261
266
|
</div>
|
|
@@ -268,4 +273,4 @@ const PdfViewer = ({ src }: Props) => {
|
|
|
268
273
|
)
|
|
269
274
|
}
|
|
270
275
|
|
|
271
|
-
export default PdfViewer;
|
|
276
|
+
export default PdfViewer;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useEffect, useState, useCallback } from "react";
|
|
2
2
|
import Icon from "../ui/Icon";
|
|
3
|
+
import Spinner from "../ui/Spinner";
|
|
3
4
|
import classNames from "classnames";
|
|
4
5
|
import PdfViewer from "./PdfViewer";
|
|
5
6
|
import { checkImageLoad, imageLoaded } from "./Image";
|
|
@@ -45,8 +46,8 @@ export const PreviewImage = ({ src, width, height }: ImageProps) => {
|
|
|
45
46
|
<>
|
|
46
47
|
{width && height ?
|
|
47
48
|
<div className="wy-content-image wy-responsive-image" style={{ ["--width" as any]: width, ["--height" as any]: height }}>
|
|
48
|
-
<img ref={imageRef} src={src} onLoad={imageLoaded} width={width} height={height} decoding="async" />
|
|
49
|
-
|
|
49
|
+
<img className="wy-loading-transition" ref={imageRef} src={src} onLoad={imageLoaded} width={width} height={height} decoding="async" />
|
|
50
|
+
<Spinner.UI />
|
|
50
51
|
</div>
|
|
51
52
|
:
|
|
52
53
|
<div className="wy-content-image wy-responsive-image wy-intrinsic-image">
|
|
@@ -58,12 +59,16 @@ export const PreviewImage = ({ src, width, height }: ImageProps) => {
|
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
type DocumentProps = {
|
|
61
|
-
src: string
|
|
62
|
+
src: string,
|
|
63
|
+
client: any
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
export const PreviewDocument = ({ src }: DocumentProps) => {
|
|
66
|
+
export const PreviewDocument = ({ src, client }: DocumentProps) => {
|
|
67
|
+
let pdfWorkerUrl = (new URL("/js/preview.worker.js", client.url)).toString();
|
|
68
|
+
let pdfCMapsUrl = (new URL("/js/cmaps/", client.url)).toString();
|
|
69
|
+
|
|
65
70
|
return (
|
|
66
|
-
<PdfViewer src={src} />
|
|
71
|
+
<PdfViewer src={src} pdfWorkerUrl={pdfWorkerUrl} pdfCMapsUrl={pdfCMapsUrl} />
|
|
67
72
|
);
|
|
68
73
|
}
|
|
69
74
|
|
|
@@ -111,38 +116,56 @@ function codecError(event: any) {
|
|
|
111
116
|
}
|
|
112
117
|
}
|
|
113
118
|
|
|
114
|
-
type
|
|
119
|
+
type MediaProps = {
|
|
120
|
+
format: string,
|
|
115
121
|
src: string,
|
|
116
122
|
name: string,
|
|
117
123
|
mediaType?: string
|
|
118
124
|
}
|
|
119
125
|
|
|
120
|
-
export const
|
|
121
|
-
/* TODO: loading, error handling and stopping */
|
|
126
|
+
export const PreviewMedia = ({ format, src, name, mediaType }: MediaProps) => {
|
|
122
127
|
|
|
123
|
-
|
|
128
|
+
const [mediaElement, setMediaElement] = useState<HTMLVideoElement|HTMLAudioElement>();
|
|
129
|
+
const mediaRef = useCallback((element: any) => {
|
|
130
|
+
if (element) {
|
|
131
|
+
element.classList.add("wy-loading");
|
|
132
|
+
setMediaElement(element);
|
|
133
|
+
}
|
|
134
|
+
}, [])
|
|
135
|
+
|
|
136
|
+
useEffect(() => {
|
|
137
|
+
if (mediaElement) {
|
|
138
|
+
|
|
139
|
+
mediaElement.addEventListener('error', mediaError, true); // needs capturing
|
|
140
|
+
mediaElement.addEventListener('loadedmetadata', mediaLoaded, true); // needs capturing
|
|
141
|
+
mediaElement.addEventListener('loadedmetadata', codecError, true); // needs capturing
|
|
142
|
+
|
|
143
|
+
return () => {
|
|
144
|
+
// cleanup
|
|
145
|
+
mediaElement.pause();
|
|
146
|
+
mediaElement.removeAttribute("autoplay");
|
|
147
|
+
mediaElement.setAttribute("preload", "none");
|
|
148
|
+
|
|
149
|
+
mediaElement.removeEventListener('error', mediaError, true); // needs capturing
|
|
150
|
+
mediaElement.removeEventListener('loadedmetadata', mediaLoaded, true); // needs capturing
|
|
151
|
+
mediaElement.removeEventListener('loadedmetadata', codecError, true); // needs capturing
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
}, [mediaElement])
|
|
156
|
+
|
|
157
|
+
return (format === "video" ?
|
|
124
158
|
<>
|
|
125
|
-
<video className="wy-content-video" controls crossOrigin="use-credentials" autoPlay>
|
|
159
|
+
<video ref={mediaRef} className="wy-content-video" controls crossOrigin="use-credentials" autoPlay>
|
|
126
160
|
<source src={src} type={mediaType} />
|
|
127
161
|
<PreviewIcon src={src} name={name} icon="file-video" download />
|
|
128
162
|
</video>
|
|
129
|
-
|
|
163
|
+
<Spinner.UI />
|
|
130
164
|
</>
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
type AudioProps = {
|
|
135
|
-
src: string,
|
|
136
|
-
name: string,
|
|
137
|
-
mediaType?: string
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export const PreviewAudio = ({ src, name, mediaType }: AudioProps) => {
|
|
141
|
-
/* TODO: loading, error handling and stopping */
|
|
142
|
-
return (
|
|
165
|
+
:
|
|
143
166
|
<>
|
|
144
167
|
<PreviewIcon src={src} name={name} icon="file-music" download>
|
|
145
|
-
<audio className="wy-content-audio" controls crossOrigin="use-credentials" autoPlay>
|
|
168
|
+
<audio ref={mediaRef} className="wy-content-audio" controls crossOrigin="use-credentials" autoPlay>
|
|
146
169
|
<source src={src} type={mediaType} />
|
|
147
170
|
</audio>
|
|
148
171
|
</PreviewIcon>
|
|
@@ -175,23 +198,24 @@ export const PreviewText = ({ src, html = false, code = false }: TextProps) => {
|
|
|
175
198
|
<>
|
|
176
199
|
{html ?
|
|
177
200
|
code ?
|
|
178
|
-
<div className="wy-content-code" dangerouslySetInnerHTML={{ __html: textContent }}></div>
|
|
201
|
+
<div className="wy-content-code wy-code" dangerouslySetInnerHTML={{ __html: textContent }}></div>
|
|
179
202
|
:
|
|
180
|
-
<div className="wy-
|
|
181
|
-
<
|
|
203
|
+
<div className="wy-document wy-light">
|
|
204
|
+
<div className="wy-content-html" dangerouslySetInnerHTML={{ __html: textContent }}></div>
|
|
182
205
|
</div>
|
|
183
206
|
:
|
|
184
207
|
code ?
|
|
185
208
|
<div className="wy-content-code">{textContent}</div>
|
|
186
209
|
:
|
|
187
|
-
<div className="wy-
|
|
188
|
-
<pre className="wy-
|
|
210
|
+
<div className="wy-document wy-light">
|
|
211
|
+
<pre className="wy-content-text">{textContent}</pre>
|
|
189
212
|
</div>
|
|
190
213
|
}
|
|
191
214
|
</>
|
|
192
215
|
);
|
|
193
216
|
}
|
|
194
217
|
|
|
218
|
+
|
|
195
219
|
type EmbedProps = {
|
|
196
220
|
src: string,
|
|
197
221
|
name: string,
|
|
@@ -200,13 +224,47 @@ type EmbedProps = {
|
|
|
200
224
|
}
|
|
201
225
|
|
|
202
226
|
export const PreviewEmbed = ({ src, name, icon, provider }: EmbedProps) => {
|
|
203
|
-
|
|
227
|
+
const [embedElement, setEmbedElement] = useState<HTMLObjectElement>();
|
|
228
|
+
const embedRef = useCallback((element: any) => {
|
|
229
|
+
if (element) {
|
|
230
|
+
element.classList.add("wy-loading");
|
|
231
|
+
setEmbedElement(element);
|
|
232
|
+
}
|
|
233
|
+
}, [])
|
|
234
|
+
|
|
235
|
+
useEffect(() => {
|
|
236
|
+
if (embedElement) {
|
|
237
|
+
let embedFallbackTimeout = setTimeout(function () {
|
|
238
|
+
console.log("fallback");
|
|
239
|
+
embedElement.classList.add("wy-fallback");
|
|
240
|
+
}, 2500)
|
|
241
|
+
|
|
242
|
+
let embedLoaded = (event: any) => {
|
|
243
|
+
var obj = event.target;
|
|
244
|
+
if (obj.tagName === 'OBJECT' && obj.classList.contains("wy-loading") && !obj.classList.contains("wy-loaded")) {
|
|
245
|
+
console.log("loaded");
|
|
246
|
+
obj.classList.add("wy-loaded");
|
|
247
|
+
clearTimeout(embedFallbackTimeout);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
embedElement.addEventListener('load', embedLoaded, true); // needs capturing
|
|
252
|
+
|
|
253
|
+
return () => {
|
|
254
|
+
// cleanup
|
|
255
|
+
embedElement.removeEventListener('load', embedLoaded, true); // needs capturing
|
|
256
|
+
clearTimeout(embedFallbackTimeout);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
}, [embedElement])
|
|
261
|
+
|
|
204
262
|
return (
|
|
205
263
|
<>
|
|
206
264
|
{/* iframe needs to be object to not render error pages when content is blocked */}
|
|
207
|
-
<object className="wy-content-iframe" data={src}></object>
|
|
265
|
+
<object ref={embedRef} className="wy-content-iframe" data={src}></object>
|
|
208
266
|
|
|
209
|
-
|
|
267
|
+
<Spinner.UI />
|
|
210
268
|
|
|
211
269
|
<PreviewIcon src={src} name={name} icon={icon} provider={provider} className="wy-content-iframe-fallback" />
|
|
212
270
|
</>
|
|
@@ -225,13 +283,16 @@ type IconProps = {
|
|
|
225
283
|
|
|
226
284
|
export const PreviewIcon = ({ children, src, icon, name, provider, download = false, className }: IconProps) => {
|
|
227
285
|
return (
|
|
228
|
-
<div className={classNames("wy-content-
|
|
286
|
+
<div className={classNames("wy-content-icon", className)}>
|
|
229
287
|
<div className="wy-content-icon">
|
|
230
288
|
<Icon.UI name={icon} />
|
|
231
289
|
</div>
|
|
232
290
|
<div className="wy-content-name">
|
|
233
291
|
{provider ?
|
|
234
|
-
|
|
292
|
+
<>
|
|
293
|
+
<span>No preview available. </span>
|
|
294
|
+
<a href={src} target="_blank" title={name}>{`Open in ${provider}?`}</a>
|
|
295
|
+
</>
|
|
235
296
|
: download ?
|
|
236
297
|
<a href={src} target="_top" download>{name}</a>
|
|
237
298
|
:
|
|
@@ -244,7 +305,9 @@ export const PreviewIcon = ({ children, src, icon, name, provider, download = fa
|
|
|
244
305
|
}
|
|
245
306
|
|
|
246
307
|
type PreviewProps = {
|
|
308
|
+
client: any,
|
|
247
309
|
src: string,
|
|
310
|
+
link?: string,
|
|
248
311
|
format: PreviewFormatType,
|
|
249
312
|
name: string,
|
|
250
313
|
icon: string,
|
|
@@ -254,39 +317,37 @@ type PreviewProps = {
|
|
|
254
317
|
provider?: string
|
|
255
318
|
}
|
|
256
319
|
|
|
257
|
-
export const Preview = ({ src, format, name, icon, width, height, mediaType, provider }: PreviewProps) => {
|
|
320
|
+
export const Preview = ({ client, src, link, format, name, icon, width, height, mediaType, provider }: PreviewProps) => {
|
|
258
321
|
return (
|
|
259
322
|
<>
|
|
260
323
|
{format === "image" &&
|
|
261
|
-
<PreviewImage src={src} width={width} height={height} />
|
|
262
|
-
}
|
|
263
|
-
{format === "document" &&
|
|
264
|
-
<PreviewDocument src={src} />
|
|
324
|
+
<PreviewImage key={src} src={src} width={width} height={height} />
|
|
265
325
|
}
|
|
266
|
-
{format === "
|
|
267
|
-
|
|
326
|
+
{format === "pdf" &&
|
|
327
|
+
/* Key not needed since component is reused and handles cleanup */
|
|
328
|
+
<PreviewDocument src={src} client={client} />
|
|
268
329
|
}
|
|
269
|
-
{format === "audio" &&
|
|
270
|
-
<
|
|
330
|
+
{(format === "video" || format === "audio") &&
|
|
331
|
+
<PreviewMedia key={src} format={format} src={src} name={name} mediaType={mediaType} />
|
|
271
332
|
}
|
|
272
333
|
{format === "text" &&
|
|
273
|
-
<PreviewText src={src} />
|
|
334
|
+
<PreviewText key={src} src={src} />
|
|
274
335
|
}
|
|
275
336
|
{format === "code" &&
|
|
276
|
-
<PreviewText src={src} html code />
|
|
337
|
+
<PreviewText key={src} src={src} html code />
|
|
277
338
|
}
|
|
278
|
-
{format === "
|
|
279
|
-
<PreviewText src={src} html />
|
|
339
|
+
{format === "html" &&
|
|
340
|
+
<PreviewText key={src} src={src} html />
|
|
280
341
|
}
|
|
281
342
|
{format === "embed" &&
|
|
282
|
-
<PreviewEmbed src={src} name={name} icon={icon} provider={provider} />
|
|
283
|
-
}
|
|
284
|
-
{format === "link" &&
|
|
285
|
-
<PreviewIcon src={src} name={name} icon={icon} provider={provider} />
|
|
286
|
-
}
|
|
287
|
-
{format === "download" &&
|
|
288
|
-
<PreviewIcon src={src} name={name} icon={icon} download />
|
|
343
|
+
<PreviewEmbed key={src} src={src} name={name} icon={icon} provider={provider} />
|
|
289
344
|
}
|
|
345
|
+
{format === "none" && (
|
|
346
|
+
link ?
|
|
347
|
+
<PreviewIcon src={src} name={name} icon={icon} provider={provider} />
|
|
348
|
+
:
|
|
349
|
+
<PreviewIcon src={src} name={name} icon={icon} download />
|
|
350
|
+
)}
|
|
290
351
|
</>
|
|
291
352
|
)
|
|
292
353
|
}
|
|
@@ -50,7 +50,7 @@ export const ReactionsMenu = ({ id, reactions }: ReactionMenuProps) => {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
const handleReaction = async (e: any) => {
|
|
53
|
-
// check if the reaction already exists for the user
|
|
53
|
+
// check if the reaction already exists for the user
|
|
54
54
|
const existing = reactionsList.find((r) => r.has_reacted)
|
|
55
55
|
const emoji = e.target.dataset.emoji;
|
|
56
56
|
|
|
@@ -69,7 +69,7 @@ export const ReactionsMenu = ({ id, reactions }: ReactionMenuProps) => {
|
|
|
69
69
|
|
|
70
70
|
return (
|
|
71
71
|
<div className={classNames({ "wy-active": visible })} style={{ position: 'relative' }}>
|
|
72
|
-
<Button.UI onClick={toggleReactionMenu}><Icon.UI name="emoticon-plus" size={1} /></Button.UI>
|
|
72
|
+
<Button.UI className="wy-reaction-menu-button" onClick={toggleReactionMenu}><Icon.UI name="emoticon-plus" size={1.25/1.5} /></Button.UI>
|
|
73
73
|
<div className="wy-reaction-menu wy-dropdown-menu" style={{ display: visible ? 'block' : 'none', position: 'absolute', top: '-3.25rem' }}>
|
|
74
74
|
<div className="wy-reaction-picker">
|
|
75
75
|
{emojis?.map((r: string, i: number) => {
|
|
@@ -83,13 +83,19 @@ export const ReactionsMenu = ({ id, reactions }: ReactionMenuProps) => {
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
export const ReactionsList = ({ id, reactions }: ReactionsProps) => {
|
|
86
|
-
const { reactionsList } = useReactions(id, reactions);
|
|
87
|
-
|
|
86
|
+
const { reactionsList } = useReactions(id, reactions);
|
|
87
|
+
|
|
88
|
+
let reactionCount = reactionsList.reduce(
|
|
89
|
+
(previousValue, currentItem) => previousValue + currentItem.count,
|
|
90
|
+
0,
|
|
91
|
+
);
|
|
92
|
+
|
|
88
93
|
return (
|
|
89
94
|
<>
|
|
90
|
-
{reactionsList && reactionsList.map((r: ReactionGroup, i: number) => {
|
|
95
|
+
{!!reactionsList && reactionsList.map((r: ReactionGroup, i: number) => {
|
|
91
96
|
return <span key={i} className="wy-reaction" title={r.count.toString()}>{r.content}</span> //r.has_reacted
|
|
92
97
|
})}
|
|
98
|
+
{reactionCount > 1 && <span className="wy-reaction-count">{reactionCount}</span>}
|
|
93
99
|
</>
|
|
94
100
|
)
|
|
95
101
|
}
|