@ethora/chat-component 26.9.8 → 26.10.3

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 (140) hide show
  1. package/README.md +2 -1
  2. package/dist/{ChatProfileModal-3UH0H5Ec.js → ChatProfileModal-D73ioMj9.js} +44 -44
  3. package/dist/FilePreviewModal-BeGa8s4u.js +1763 -0
  4. package/dist/{ManageDataModal-BblTuE9g.js → ManageDataModal-DxhvKwLo.js} +17 -17
  5. package/dist/{MarkdownBody-RMEx8yW2.js → MarkdownBody-fzjy9KUP.js} +1 -1
  6. package/dist/{MessageSearchModal-CrYR2EH8.js → MessageSearchModal-3I0b3Nut.js} +40 -40
  7. package/dist/{PublicChatsModal-Bi5r4mrV.js → PublicChatsModal-Dzwl63q-.js} +19 -19
  8. package/dist/{SideDrawer-CDAoobvX.js → SideDrawer-BPebE2tZ.js} +37 -37
  9. package/dist/{UserProfileModal-4Frgvam-.js → UserProfileModal-BS5FZdJb.js} +10 -10
  10. package/dist/{UserSettingsModal-C-mb-9cb.js → UserSettingsModal-pBqmF_r2.js} +5 -5
  11. package/dist/{VideoCallOverlay-92dFLb9U.js → VideoCallOverlay-PIg8Z5Xr.js} +3824 -3708
  12. package/dist/{VisibilityModal-zIAV6dAP.js → VisibilityModal-CnBRSRQ9.js} +11 -11
  13. package/dist/api.config.d.ts +0 -23
  14. package/dist/assets/icons.d.ts +2 -3
  15. package/dist/components/ContextMenu/ContextMenuComponents.d.ts +24 -8
  16. package/dist/components/ExampleComponents/CustomMessage.d.ts +27 -9
  17. package/dist/components/Files/fileCategory.d.ts +4 -2
  18. package/dist/components/MainComponents/AlbumGrid.d.ts +22 -0
  19. package/dist/components/MainComponents/AttachmentList.d.ts +6 -6
  20. package/dist/components/MainComponents/ChooseChatMessage.d.ts +12 -4
  21. package/dist/components/MainComponents/EditWrapper.d.ts +12 -4
  22. package/dist/components/MainComponents/ImageUnavailable.d.ts +21 -0
  23. package/dist/components/MainComponents/MediaUploadOverlay.d.ts +31 -0
  24. package/dist/components/MainComponents/MessageContainer.d.ts +3 -0
  25. package/dist/components/MainComponents/MessageList.d.ts +2 -1
  26. package/dist/components/MainComponents/SystemMessage.d.ts +3 -1
  27. package/dist/components/MessageBubble/CustomDivider.d.ts +3 -1
  28. package/dist/components/MessageBubble/MediaCaption.d.ts +9 -0
  29. package/dist/components/MessageBubble/MessageAvatarPhoto.d.ts +17 -0
  30. package/dist/components/MessageBubble/MessageReaction.d.ts +6 -0
  31. package/dist/components/MessageBubble/MessageReply.d.ts +3 -1
  32. package/dist/components/MessageBubble/QuickReplies.d.ts +2 -0
  33. package/dist/components/Modals/FilePreviewModal/FilePreviewModal.d.ts +8 -10
  34. package/dist/components/Modals/FilePreviewModal/ImageLightbox.d.ts +4 -0
  35. package/dist/components/Modals/FilePreviewModal/PdfView.d.ts +4 -0
  36. package/dist/components/Modals/FilePreviewModal/ViewerChrome.d.ts +100 -0
  37. package/dist/components/Modals/MessageSearchModal/MessageHitResults.d.ts +3 -1
  38. package/dist/components/Modals/ModalReportChat/ModalReportChat.d.ts +3 -1
  39. package/dist/components/Modals/NewChatModal/styledNewChatComponents.d.ts +15 -5
  40. package/dist/components/Modals/SettingsModals/SharedStyledComponents.d.ts +27 -15
  41. package/dist/components/Modals/SettingsModals/Visibility/StyledComponents.d.ts +18 -6
  42. package/dist/components/Modals/SideDrawer/DrawerProfileParts.d.ts +27 -9
  43. package/dist/components/Modals/SideDrawer/SideDrawer.d.ts +39 -13
  44. package/dist/components/Modals/motionVariants.d.ts +8 -10
  45. package/dist/components/Modals/styledModalComponents.d.ts +53 -25
  46. package/dist/components/Notification/index.d.ts +3 -1
  47. package/dist/components/RoomComponents/LastMessageItem.d.ts +2 -0
  48. package/dist/components/RoomComponents/styled/LastMessageMedia.d.ts +19 -0
  49. package/dist/components/RoomComponents/styled/LastTextMessage.d.ts +2 -2
  50. package/dist/components/RoomComponents/styled/StyledRoomComponents.d.ts +29 -8
  51. package/dist/components/UsersList/StyledComponents.d.ts +18 -6
  52. package/dist/components/VideoCalls/VideoCallSession.d.ts +13 -0
  53. package/dist/components/styled/ChatWrapperBox.d.ts +9 -2
  54. package/dist/components/styled/DateLabel.d.ts +3 -1
  55. package/dist/components/styled/FileCard.d.ts +20 -0
  56. package/dist/components/styled/Loader.d.ts +3 -1
  57. package/dist/components/styled/MediaModal.d.ts +6 -2
  58. package/dist/components/styled/MediaSurface.d.ts +56 -0
  59. package/dist/components/styled/MessageImage.d.ts +9 -10
  60. package/dist/components/styled/NewMessageLabel.d.ts +3 -1
  61. package/dist/components/styled/RoomListComponents/index.d.ts +66 -22
  62. package/dist/components/styled/SendInput.d.ts +12 -2
  63. package/dist/components/styled/StyledComponents.d.ts +199 -41
  64. package/dist/components/styled/StyledInputComponents/MediaComponents.d.ts +78 -24
  65. package/dist/components/styled/StyledInputComponents/StyledInputComponents.d.ts +60 -22
  66. package/dist/components/styled/StyledInputComponents/VideoComponents.d.ts +18 -6
  67. package/dist/components/styled/TreadLabel.d.ts +3 -1
  68. package/dist/components/styled/UnsupportedType.d.ts +1 -0
  69. package/dist/components/styled/VideoMessage.d.ts +13 -6
  70. package/dist/e2ee/callKey.d.ts +32 -0
  71. package/dist/e2ee/fileEnvelope.d.ts +16 -5
  72. package/dist/e2ee/omemo.d.ts +18 -0
  73. package/dist/firebase-messaging-sw.js +20 -3
  74. package/dist/{handleCopyClick-BtXos0AJ.js → handleCopyClick-vPvh9hOU.js} +1 -1
  75. package/dist/helpers/albumLayout.d.ts +53 -0
  76. package/dist/helpers/attachments.d.ts +22 -1
  77. package/dist/helpers/avatarImageCache.d.ts +9 -0
  78. package/dist/helpers/caption.d.ts +63 -0
  79. package/dist/helpers/composerFocus.d.ts +22 -0
  80. package/dist/helpers/createMainMessageForThread.d.ts +1 -1
  81. package/dist/helpers/downloadFile.d.ts +19 -0
  82. package/dist/helpers/fileKind.d.ts +17 -0
  83. package/dist/helpers/lastMessagePreview.d.ts +55 -0
  84. package/dist/helpers/mapWithConcurrency.d.ts +8 -0
  85. package/dist/helpers/mediaBox.d.ts +110 -0
  86. package/dist/helpers/mediaBubble.d.ts +67 -0
  87. package/dist/helpers/mediaLabel.d.ts +10 -0
  88. package/dist/helpers/mediaSendRetry.d.ts +25 -0
  89. package/dist/helpers/messageRuns.d.ts +10 -0
  90. package/dist/helpers/receiptState.d.ts +48 -0
  91. package/dist/helpers/repairFilenameEncoding.d.ts +11 -0
  92. package/dist/helpers/roomImageGallery.d.ts +34 -0
  93. package/dist/helpers/safeUrl.d.ts +15 -0
  94. package/dist/helpers/secureFileUrl.d.ts +4 -1
  95. package/dist/helpers/textareaFit.d.ts +31 -0
  96. package/dist/helpers/timestamp.d.ts +7 -0
  97. package/dist/helpers/userEntry.d.ts +14 -0
  98. package/dist/helpers/viewerSender.d.ts +47 -0
  99. package/dist/hooks/useAvatarImage.d.ts +21 -0
  100. package/dist/hooks/useIsMobileViewport.d.ts +5 -0
  101. package/dist/hooks/useMediaProbe.d.ts +41 -0
  102. package/dist/hooks/usePaneWidthVar.d.ts +11 -0
  103. package/dist/hooks/usePdfThumbnail.d.ts +0 -1
  104. package/dist/hooks/usePrefersReducedMotion.d.ts +2 -0
  105. package/dist/hooks/useRoomInitialization.d.ts +2 -2
  106. package/dist/hooks/useRoomUrl.d.ts +2 -2
  107. package/dist/hooks/useSendMessage.d.ts +4 -1
  108. package/dist/{main-BnLtessp.js → main-CghdNDlB.js} +20803 -16260
  109. package/dist/main.js +10 -10
  110. package/dist/networking/api-requests/auth.api.d.ts +13 -5
  111. package/dist/networking/api-requests/user.api.d.ts +4 -4
  112. package/dist/networking/callKeyStanza.d.ts +7 -0
  113. package/dist/networking/deliveryReceiptBatcher.d.ts +53 -0
  114. package/dist/networking/displayedMarkerThrottle.d.ts +29 -0
  115. package/dist/networking/receiptsPolicy.d.ts +32 -0
  116. package/dist/networking/stanzaHandlers.d.ts +4 -2
  117. package/dist/networking/xmpp/sendDisplayedMarker.xmpp.d.ts +2 -0
  118. package/dist/networking/xmpp/sendMediaMessage.xmpp.d.ts +8 -0
  119. package/dist/networking/xmpp/sendReceivedReceipt.xmpp.d.ts +2 -0
  120. package/dist/networking/xmppClient.d.ts +5 -0
  121. package/dist/roomStore/callSlice.d.ts +6 -1
  122. package/dist/roomStore/index.d.ts +10 -0
  123. package/dist/roomStore/roomsSlice.d.ts +22 -3
  124. package/dist/styles/motion.d.ts +22 -2
  125. package/dist/types/models/attachment.model.d.ts +19 -0
  126. package/dist/types/models/config.model.d.ts +56 -2
  127. package/dist/types/models/customComponents.model.d.ts +2 -0
  128. package/dist/types/models/message.model.d.ts +9 -0
  129. package/dist/types/models/modal.model.d.ts +19 -0
  130. package/dist/types/models/room.model.d.ts +17 -0
  131. package/dist/types/models/xmpp.model.d.ts +3 -0
  132. package/dist/utils/messageNotificationContent.d.ts +34 -0
  133. package/dist/version.d.ts +1 -1
  134. package/package.json +8 -7
  135. package/public/firebase-messaging-sw.js +20 -3
  136. package/dist/FilePreviewModal-Cgj1iHry.js +0 -743
  137. package/dist/components/RoomComponents/styled/LastAudioMessage.d.ts +0 -6
  138. package/dist/components/RoomComponents/styled/LastMessageFile.d.ts +0 -6
  139. package/dist/components/RoomComponents/styled/LastMessagePhoto.d.ts +0 -6
  140. package/dist/components/RoomComponents/styled/LastMessageVideo.d.ts +0 -6
@@ -1,743 +0,0 @@
1
- import { jsx as l, jsxs as B } from "react/jsx-runtime";
2
- import te, { useState as H, useRef as z, useEffect as O, useMemo as $, useCallback as k } from "react";
3
- import { p as le, b as pe, aZ as we, ae as ve, x as X, B as V, a_ as xe, a$ as be, aE as ye, b0 as Ee, b1 as Le, b2 as ue, b3 as ne, a as Ce, aV as Me, u as Q, a5 as Pe, b4 as re, ay as Re, as as J, b5 as ke, b6 as Se, b7 as Ae, b8 as Te, b9 as Ie, ba as Xe, bb as Ye, bc as ze, bd as Oe, aF as De, be as Fe, bf as Ue, aD as Be, bg as He, w as Ne } from "./main-BnLtessp.js";
4
- function oe(t, i) {
5
- let n;
6
- return (...E) => {
7
- window.clearTimeout(n), n = window.setTimeout(() => t(...E), i);
8
- };
9
- }
10
- function _e({ debounce: t, scroll: i, polyfill: n, offsetSize: E } = { debounce: 0, scroll: !1, offsetSize: !1 }) {
11
- const L = n || (typeof window > "u" ? class {
12
- } : window.ResizeObserver);
13
- if (!L) throw new Error("This browser does not support ResizeObserver out of the box. See: https://github.com/react-spring/react-use-measure/#resize-observer-polyfills");
14
- const [u, C] = H({ left: 0, top: 0, width: 0, height: 0, bottom: 0, right: 0, x: 0, y: 0 }), r = z({ element: null, scrollContainers: null, resizeObserver: null, lastBounds: u, orientationHandler: null }), M = t ? typeof t == "number" ? t : t.scroll : null, p = t ? typeof t == "number" ? t : t.resize : null, A = z(!1);
15
- O(() => (A.current = !0, () => {
16
- A.current = !1;
17
- }));
18
- const [b, x, m] = $(() => {
19
- const o = () => {
20
- if (!r.current.element) return;
21
- const { left: g, top: w, width: v, height: U, bottom: S, right: P, x: f, y: h } = r.current.element.getBoundingClientRect(), T = { left: g, top: w, width: v, height: U, bottom: S, right: P, x: f, y: h };
22
- r.current.element instanceof HTMLElement && E && (T.height = r.current.element.offsetHeight, T.width = r.current.element.offsetWidth), Object.freeze(T), A.current && !Ze(r.current.lastBounds, T) && C(r.current.lastBounds = T);
23
- };
24
- return [o, p ? oe(o, p) : o, M ? oe(o, M) : o];
25
- }, [C, E, M, p]);
26
- function y() {
27
- r.current.scrollContainers && (r.current.scrollContainers.forEach((o) => o.removeEventListener("scroll", m, !0)), r.current.scrollContainers = null), r.current.resizeObserver && (r.current.resizeObserver.disconnect(), r.current.resizeObserver = null), r.current.orientationHandler && ("orientation" in screen && "removeEventListener" in screen.orientation ? screen.orientation.removeEventListener("change", r.current.orientationHandler) : "onorientationchange" in window && window.removeEventListener("orientationchange", r.current.orientationHandler));
28
- }
29
- function Y() {
30
- r.current.element && (r.current.resizeObserver = new L(m), r.current.resizeObserver.observe(r.current.element), i && r.current.scrollContainers && r.current.scrollContainers.forEach((o) => o.addEventListener("scroll", m, { capture: !0, passive: !0 })), r.current.orientationHandler = () => {
31
- m();
32
- }, "orientation" in screen && "addEventListener" in screen.orientation ? screen.orientation.addEventListener("change", r.current.orientationHandler) : "onorientationchange" in window && window.addEventListener("orientationchange", r.current.orientationHandler));
33
- }
34
- const F = (o) => {
35
- !o || o === r.current.element || (y(), r.current.element = o, r.current.scrollContainers = de(o), Y());
36
- };
37
- return $e(m, !!i), je(x), O(() => {
38
- y(), Y();
39
- }, [i, m, x]), O(() => y, []), [F, u, b];
40
- }
41
- function je(t) {
42
- O(() => {
43
- const i = t;
44
- return window.addEventListener("resize", i), () => {
45
- window.removeEventListener("resize", i);
46
- };
47
- }, [t]);
48
- }
49
- function $e(t, i) {
50
- O(() => {
51
- if (i) {
52
- const n = t;
53
- return window.addEventListener("scroll", n, { capture: !0, passive: !0 }), () => {
54
- window.removeEventListener("scroll", n, !0);
55
- };
56
- }
57
- }, [t, i]);
58
- }
59
- function de(t) {
60
- const i = [];
61
- if (!t || t === document.body) return i;
62
- const { overflow: n, overflowX: E, overflowY: L } = window.getComputedStyle(t);
63
- return [n, E, L].some((u) => u === "auto" || u === "scroll") && i.push(t), [...i, ...de(t.parentElement)];
64
- }
65
- const Ve = ["x", "y", "top", "bottom", "left", "right", "width", "height"], Ze = (t, i) => Ve.every((n) => t[n] === i[n]), ie = X.div`
66
- display: flex;
67
- flex-direction: column;
68
- align-items: center;
69
- gap: 12px;
70
- width: 100%;
71
- height: 100%;
72
- overflow: auto;
73
- `, We = X.div`
74
- display: flex;
75
- align-items: flex-start;
76
- justify-content: center;
77
- width: 100%;
78
- flex: 1 1 auto;
79
- min-height: 0;
80
-
81
- canvas {
82
- max-width: 100%;
83
- height: auto;
84
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
85
- background-color: #fff;
86
- }
87
- `, Ke = X.div`
88
- display: flex;
89
- align-items: center;
90
- gap: 12px;
91
- flex: 0 0 auto;
92
- font-size: 14px;
93
- color: var(--ethora-color-text, #141414);
94
- `, ae = X(V)`
95
- width: auto;
96
- min-width: 40px;
97
- padding: 0 12px;
98
- `, Ge = X.div`
99
- display: flex;
100
- flex-direction: column;
101
- align-items: center;
102
- gap: 12px;
103
- padding: 16px;
104
- border-radius: var(--ethora-radius-lg, 16px);
105
- background-color: var(--ethora-color-bg-subtle, #f5f7fa);
106
- color: var(--ethora-color-text, #141414);
107
- text-align: center;
108
-
109
- a {
110
- color: var(--ethora-color-primary-text, var(--ethora-color-primary, #0052cd));
111
- }
112
- `, qe = ({ pdfUrl: t }) => {
113
- const i = le(), { config: n } = pe(), [E, L] = _e(), u = z(null), C = z(null), r = z(null), [M, p] = H("loading"), [A, b] = H(0), [x, m] = H(1), y = Math.max(320, Math.floor(L.width || 0));
114
- O(() => {
115
- let o = !1, g;
116
- return p("loading"), m(1), b(0), (async () => {
117
- const w = await we(n?.pdfPreview?.workerSrc, n?.pdfPreview?.libUrl);
118
- if (!o) {
119
- if (!w || !t) {
120
- p("error");
121
- return;
122
- }
123
- try {
124
- g = w.getDocument({ url: t, isEvalSupported: !1 });
125
- const v = await g.promise;
126
- if (o) {
127
- v.destroy().catch(() => {
128
- });
129
- return;
130
- }
131
- C.current = v, b(v.numPages), p("ready");
132
- } catch (v) {
133
- o || (console.warn("[Ethora] PDF open failed:", v), p("error"));
134
- }
135
- }
136
- })(), () => {
137
- o = !0, r.current?.cancel(), r.current = null, C.current?.destroy?.().catch(() => {
138
- }), C.current = null, g?.destroy?.().catch(() => {
139
- });
140
- };
141
- }, [t, n?.pdfPreview?.workerSrc, n?.pdfPreview?.libUrl]), O(() => {
142
- const o = C.current, g = u.current;
143
- if (M !== "ready" || !o || !g || y <= 0) return;
144
- let w = !1;
145
- return (async () => {
146
- try {
147
- const v = await o.getPage(x);
148
- if (w) return;
149
- const U = v.getViewport({ scale: 1 }), S = U.width ? y / U.width : 1, P = v.getViewport({ scale: S });
150
- g.width = Math.max(1, Math.floor(P.width)), g.height = Math.max(1, Math.floor(P.height));
151
- const f = g.getContext("2d");
152
- if (!f) {
153
- p("error");
154
- return;
155
- }
156
- r.current?.cancel();
157
- const h = v.render({ canvasContext: f, viewport: P });
158
- r.current = h, await h.promise, v.cleanup();
159
- } catch (v) {
160
- w || console.warn("[Ethora] PDF page render failed:", v);
161
- }
162
- })(), () => {
163
- w = !0, r.current?.cancel(), r.current = null;
164
- };
165
- }, [M, x, y]);
166
- const Y = k(
167
- () => m((o) => Math.max(1, o - 1)),
168
- []
169
- ), F = k(
170
- () => m((o) => Math.min(A || 1, o + 1)),
171
- [A]
172
- );
173
- return M === "error" ? /* @__PURE__ */ l(ie, { children: /* @__PURE__ */ B(Ge, { children: [
174
- /* @__PURE__ */ l("span", { children: i("modal.filePreview.pdfUnavailable") }),
175
- /* @__PURE__ */ l("a", { href: t, target: "_blank", rel: "noopener noreferrer", children: i("modal.filePreview.openExternally") })
176
- ] }) }) : /* @__PURE__ */ B(ie, { children: [
177
- /* @__PURE__ */ l(We, { ref: E, children: M === "loading" ? /* @__PURE__ */ l(ve, { color: n?.colors?.primary }) : /* @__PURE__ */ l("canvas", { ref: u }) }),
178
- A > 1 && /* @__PURE__ */ B(Ke, { children: [
179
- /* @__PURE__ */ l(
180
- ae,
181
- {
182
- onClick: Y,
183
- disabled: x <= 1,
184
- text: "‹",
185
- "aria-label": i("modal.filePreview.previousPage")
186
- }
187
- ),
188
- /* @__PURE__ */ B("span", { children: [
189
- x,
190
- " / ",
191
- A
192
- ] }),
193
- /* @__PURE__ */ l(
194
- ae,
195
- {
196
- onClick: F,
197
- disabled: x >= A,
198
- text: "›",
199
- "aria-label": i("modal.filePreview.nextPage")
200
- }
201
- )
202
- ] })
203
- ] });
204
- }, I = 1, ee = 6, Qe = 2.5, Je = 50, et = 300, se = 24, tt = 16e-4, G = (t, i, n) => Math.min(n, Math.max(i, t)), nt = X.div`
205
- position: relative;
206
- /* An explicit height, not flex growth alone: the parent lays its children
207
- out in a row and centres them, so the viewport would otherwise be sized
208
- by its content, and the image's own max-height of 100% would resolve
209
- against that auto height and never fit anything. */
210
- flex: 1 1 auto;
211
- width: 100%;
212
- height: 100%;
213
- min-height: 0;
214
- display: flex;
215
- align-items: center;
216
- justify-content: center;
217
- overflow: hidden;
218
- /* A zoomed image is dragged, not selected, and a two-finger gesture is a
219
- pinch rather than a page scroll. */
220
- touch-action: none;
221
- user-select: none;
222
- background-color: var(--ethora-color-bg, #fff);
223
- `, rt = X.img`
224
- /* Same box the single-file view always used: fill the stage and let
225
- object-fit do the letterboxing, so what the viewer sees at scale 1 is
226
- unchanged. It is also what makes the pan clamp exact, since the painted
227
- content box is then derived from the natural aspect ratio alone. */
228
- width: 100%;
229
- height: 100%;
230
- object-fit: contain;
231
- transform-origin: center center;
232
- will-change: transform;
233
- cursor: ${({ $grabbing: t, $pannable: i }) => t ? "grabbing" : i ? "grab" : "zoom-in"};
234
- transition: ${({ $animate: t }) => t ? `transform ${xe} ${be}` : "none"};
235
- ${ye}
236
- `, fe = te.forwardRef(
237
- ({ src: t, alt: i, onSwipeLeft: n, onSwipeRight: E, onError: L, onScaleChange: u }, C) => {
238
- const r = z(null), M = z(null), [p, A] = H(I), [b, x] = H({ x: 0, y: 0 }), [m, y] = H(!1), [Y, F] = H(!1), o = z({ scale: I, offset: { x: 0, y: 0 } });
239
- o.current = { scale: p, offset: b };
240
- const g = z(null), w = z(null), v = z(
241
- null
242
- ), U = k((a) => {
243
- const e = r.current, c = M.current;
244
- if (!e) return { x: 0, y: 0 };
245
- const s = e.clientWidth, d = e.clientHeight, R = c?.naturalWidth || 0, D = c?.naturalHeight || 0;
246
- let j = s, W = d;
247
- if (R > 0 && D > 0 && s > 0 && d > 0) {
248
- const K = Math.min(s / R, d / D);
249
- j = R * K, W = D * K;
250
- }
251
- return {
252
- x: Math.max(0, (j * a - s) / 2),
253
- y: Math.max(0, (W * a - d) / 2)
254
- };
255
- }, []), S = k(
256
- (a, e, c) => {
257
- const s = G(a, I, ee), d = U(s);
258
- y(c), A(s), x({
259
- x: G(e.x, -d.x, d.x),
260
- y: G(e.y, -d.y, d.y)
261
- });
262
- },
263
- [U]
264
- ), P = k(
265
- (a, e, c, s) => {
266
- const d = o.current, R = G(a, I, ee), D = R / d.scale;
267
- S(
268
- R,
269
- {
270
- x: e - (e - d.offset.x) * D,
271
- y: c - (c - d.offset.y) * D
272
- },
273
- s
274
- );
275
- },
276
- [S]
277
- ), f = k(() => {
278
- S(I, { x: 0, y: 0 }, !0);
279
- }, [S]), h = k(
280
- (a) => {
281
- P(o.current.scale * a, 0, 0, !0);
282
- },
283
- [P]
284
- );
285
- te.useImperativeHandle(
286
- C,
287
- () => ({
288
- zoomIn: () => h(1.5),
289
- zoomOut: () => h(1 / 1.5),
290
- reset: f
291
- }),
292
- [h, f]
293
- ), O(() => {
294
- y(!1), A(I), x({ x: 0, y: 0 });
295
- }, [t]), O(() => {
296
- u?.(p);
297
- }, [p, u]), O(() => {
298
- const a = r.current;
299
- if (!a) return;
300
- const e = (c) => {
301
- c.preventDefault();
302
- const s = a.getBoundingClientRect(), d = c.clientX - s.left - s.width / 2, R = c.clientY - s.top - s.height / 2, D = Math.exp(-c.deltaY * tt);
303
- P(o.current.scale * D, d, R, !1);
304
- };
305
- return a.addEventListener("wheel", e, { passive: !1 }), () => a.removeEventListener("wheel", e);
306
- }, [P]);
307
- const T = k(
308
- (a, e) => {
309
- const c = r.current;
310
- if (!c) return;
311
- if (o.current.scale > I) {
312
- f();
313
- return;
314
- }
315
- const s = c.getBoundingClientRect();
316
- P(
317
- Qe,
318
- a - s.left - s.width / 2,
319
- e - s.top - s.height / 2,
320
- !0
321
- );
322
- },
323
- [f, P]
324
- ), _ = k((a) => {
325
- a.button === 0 && (o.current.scale <= I || (a.preventDefault(), g.current = { x: a.clientX, y: a.clientY }, F(!0)));
326
- }, []);
327
- O(() => {
328
- if (!Y || typeof window > "u") return;
329
- const a = (c) => {
330
- const s = g.current;
331
- if (!s) return;
332
- const d = o.current;
333
- S(
334
- d.scale,
335
- {
336
- x: d.offset.x + (c.clientX - s.x),
337
- y: d.offset.y + (c.clientY - s.y)
338
- },
339
- !1
340
- ), g.current = { x: c.clientX, y: c.clientY };
341
- }, e = () => {
342
- g.current = null, F(!1);
343
- };
344
- return window.addEventListener("mousemove", a), window.addEventListener("mouseup", e), () => {
345
- window.removeEventListener("mousemove", a), window.removeEventListener("mouseup", e);
346
- };
347
- }, [Y, S]);
348
- const q = k((a) => {
349
- if (a.touches.length === 2) {
350
- const [c, s] = [a.touches[0], a.touches[1]];
351
- w.current = {
352
- startX: 0,
353
- startY: 0,
354
- lastX: 0,
355
- lastY: 0,
356
- pinchDistance: Math.hypot(
357
- c.clientX - s.clientX,
358
- c.clientY - s.clientY
359
- ),
360
- pinchScale: o.current.scale,
361
- panning: !1,
362
- moved: !1
363
- };
364
- return;
365
- }
366
- const e = a.touches[0];
367
- e && (w.current = {
368
- startX: e.clientX,
369
- startY: e.clientY,
370
- lastX: e.clientX,
371
- lastY: e.clientY,
372
- pinchDistance: 0,
373
- pinchScale: o.current.scale,
374
- panning: o.current.scale > I,
375
- moved: !1
376
- });
377
- }, []), Z = k(
378
- (a) => {
379
- const e = w.current;
380
- if (!e) return;
381
- if (a.touches.length === 2 && e.pinchDistance > 0) {
382
- const [s, d] = [a.touches[0], a.touches[1]], R = Math.hypot(
383
- s.clientX - d.clientX,
384
- s.clientY - d.clientY
385
- ), D = r.current;
386
- if (!D || R <= 0) return;
387
- const j = D.getBoundingClientRect(), W = (s.clientX + d.clientX) / 2 - j.left - j.width / 2, K = (s.clientY + d.clientY) / 2 - j.top - j.height / 2;
388
- e.moved = !0, P(
389
- e.pinchScale * R / e.pinchDistance,
390
- W,
391
- K,
392
- !1
393
- );
394
- return;
395
- }
396
- const c = a.touches[0];
397
- if (c) {
398
- if ((Math.abs(c.clientX - e.startX) > 6 || Math.abs(c.clientY - e.startY) > 6) && (e.moved = !0), e.panning) {
399
- const s = o.current;
400
- S(
401
- s.scale,
402
- {
403
- x: s.offset.x + (c.clientX - e.lastX),
404
- y: s.offset.y + (c.clientY - e.lastY)
405
- },
406
- !1
407
- );
408
- }
409
- e.lastX = c.clientX, e.lastY = c.clientY;
410
- }
411
- },
412
- [S, P]
413
- ), N = k(
414
- (a) => {
415
- const e = w.current;
416
- if (!e || a.touches.length > 0) return;
417
- if (w.current = null, !e.moved && e.pinchDistance === 0) {
418
- const d = Date.now(), R = v.current;
419
- if (R && d - R.time < et && Math.abs(R.x - e.startX) < se && Math.abs(R.y - e.startY) < se) {
420
- v.current = null, T(e.startX, e.startY);
421
- return;
422
- }
423
- v.current = {
424
- time: d,
425
- x: e.startX,
426
- y: e.startY
427
- };
428
- return;
429
- }
430
- if (e.panning || e.pinchDistance > 0 || o.current.scale > I) return;
431
- const c = e.lastX - e.startX, s = e.lastY - e.startY;
432
- Math.abs(c) < Je || Math.abs(c) <= Math.abs(s) || (c < 0 ? n?.() : E?.());
433
- },
434
- [n, E, T]
435
- ), me = k(
436
- (a) => {
437
- T(a.clientX, a.clientY);
438
- },
439
- [T]
440
- ), ge = $(
441
- () => `translate(${b.x}px, ${b.y}px) scale(${p})`,
442
- [b.x, b.y, p]
443
- );
444
- return /* @__PURE__ */ l(
445
- nt,
446
- {
447
- ref: r,
448
- "data-testid": "image-lightbox-viewport",
449
- onMouseDown: _,
450
- onDoubleClick: me,
451
- onTouchStart: q,
452
- onTouchMove: Z,
453
- onTouchEnd: N,
454
- onTouchCancel: N,
455
- children: /* @__PURE__ */ l(
456
- rt,
457
- {
458
- ref: M,
459
- "data-testid": "image-lightbox-image",
460
- src: t,
461
- alt: i,
462
- draggable: !1,
463
- onError: L,
464
- $grabbing: Y,
465
- $pannable: p > I,
466
- $animate: m,
467
- style: { transform: ge }
468
- }
469
- )
470
- }
471
- );
472
- }
473
- );
474
- fe.displayName = "ImageLightbox";
475
- const ot = (t) => {
476
- if (!Array.isArray(t)) return [];
477
- const i = [];
478
- return t.forEach((n, E) => {
479
- !n || n.isDeleted || n.id !== "delimiter-new" && Ee(n).forEach((L, u) => {
480
- if (!L.location) return;
481
- const C = Le(L);
482
- ue(L.mimetype, C) === "image" && i.push({
483
- key: `${n.id ?? E}:${u}`,
484
- fileName: C,
485
- fileURL: L.location,
486
- mimetype: L.mimetype || ""
487
- });
488
- });
489
- }), i;
490
- }, it = (t, i) => {
491
- if (!i?.fileURL) return -1;
492
- const n = ne(i.fileURL);
493
- return t.findIndex(
494
- (E) => ne(E.fileURL) === n
495
- );
496
- }, ce = "https://as2.ftcdn.net/v2/jpg/02/51/95/53/1000_F_251955356_FAQH0U1y1TZw3ZcdPGybwUkH90a3VAhb.jpg", at = X.div`
497
- position: relative;
498
- display: flex;
499
- flex: 1 1 auto;
500
- width: 100%;
501
- min-height: 0;
502
- align-items: center;
503
- justify-content: center;
504
- overflow: hidden;
505
- `, he = X(V)`
506
- position: absolute;
507
- top: 50%;
508
- transform: translateY(-50%);
509
- width: 44px;
510
- height: 44px;
511
- border-radius: var(--ethora-radius-full, 999px);
512
- background-color: var(--ethora-color-bg, #fff);
513
- box-shadow: var(--ethora-shadow-md, 0 4px 12px rgba(16, 24, 40, 0.1));
514
- z-index: 2;
515
- `, st = X(he)`
516
- left: 8px;
517
- `, ct = X(he)`
518
- right: 8px;
519
- `, lt = X.div`
520
- display: flex;
521
- align-items: center;
522
- gap: 8px;
523
- `, ut = X.div`
524
- display: flex;
525
- align-items: center;
526
- gap: 8px;
527
-
528
- @media (max-width: 480px) {
529
- display: none;
530
- }
531
- `, dt = X.span`
532
- font-size: var(--ethora-font-size-sm, 14px);
533
- color: var(--ethora-color-text-secondary, #5a5f66);
534
- white-space: nowrap;
535
- padding: 0 4px;
536
- `, gt = ({
537
- handleCloseModal: t
538
- }) => {
539
- const i = Ce(), n = le(), E = Me(), { activeFile: L } = Q(
540
- (f) => f.chatSettingStore
541
- ), u = $(
542
- () => L ?? { fileName: "", fileURL: "", mimetype: "" },
543
- [L]
544
- ), C = Q(
545
- (f) => f.chatSettingStore.user?.fileToken || ""
546
- ), r = Q(
547
- (f) => Pe(f)?.messages
548
- ), M = z(null), [p, A] = H(I), b = ue(u?.mimetype, u?.fileName), x = $(() => ot(r), [r]), m = $(
549
- () => b === "image" ? it(x, u) : -1,
550
- [x, u, b]
551
- ), y = m >= 0 && x.length > 1, Y = y && m > 0, F = y && m < x.length - 1, o = k(
552
- (f) => {
553
- const h = x[f];
554
- h && i(
555
- re({
556
- fileName: h.fileName,
557
- fileURL: h.fileURL,
558
- mimetype: h.mimetype
559
- })
560
- );
561
- },
562
- [i, x]
563
- ), g = k(() => {
564
- Y && o(m - 1);
565
- }, [o, Y, m]), w = k(() => {
566
- F && o(m + 1);
567
- }, [o, F, m]);
568
- O(() => {
569
- if (!y || typeof document > "u") return;
570
- const f = (h) => {
571
- if (h.key !== "ArrowLeft" && h.key !== "ArrowRight" || h.defaultPrevented || h.altKey || h.ctrlKey || h.metaKey) return;
572
- const T = h.target, _ = T?.tagName;
573
- _ === "INPUT" || _ === "TEXTAREA" || _ === "SELECT" || T?.isContentEditable || (h.preventDefault(), h.key === "ArrowLeft" ? g() : w());
574
- };
575
- return document.addEventListener("keydown", f), () => document.removeEventListener("keydown", f);
576
- }, [y, g, w]);
577
- const v = () => {
578
- fetch(Be(u.fileURL), {
579
- method: "GET",
580
- headers: {}
581
- }).then((f) => {
582
- const _ = !!He(u.fileName) ? u.fileName : `MEDIA-ETHORA.${b === "image" ? "png" : b === "video" ? "mp4" : "bin"}`;
583
- f.arrayBuffer().then(function(q) {
584
- if (typeof window > "u")
585
- return;
586
- const Z = window.URL.createObjectURL(new Blob([q])), N = document.createElement("a");
587
- N.href = Z, N.setAttribute("download", _), document.body.appendChild(N), N.click(), N.remove(), window.URL.revokeObjectURL(Z);
588
- });
589
- }).catch((f) => {
590
- Ne.log(f);
591
- });
592
- }, U = () => {
593
- i(re(void 0)), t?.();
594
- }, S = u?.fileName || n("modal.filePreview.imageAlt"), P = $(() => {
595
- switch (b) {
596
- case "image":
597
- return /* @__PURE__ */ l(
598
- fe,
599
- {
600
- ref: M,
601
- src: J(u.fileURL, C) || ce,
602
- alt: S,
603
- onScaleChange: A,
604
- onSwipeLeft: w,
605
- onSwipeRight: g,
606
- onError: (f) => {
607
- Se(u.fileURL) && Ae(), f.target.src = ce;
608
- }
609
- }
610
- );
611
- case "video":
612
- return /* @__PURE__ */ l(
613
- ke,
614
- {
615
- src: J(u.fileURL, C),
616
- controls: !0,
617
- autoPlay: !1
618
- }
619
- );
620
- case "pdf":
621
- return /* @__PURE__ */ l(qe, { pdfUrl: J(u.fileURL, C) });
622
- default:
623
- return /* @__PURE__ */ B(
624
- "div",
625
- {
626
- style: {
627
- display: "flex",
628
- flexDirection: "column",
629
- justifyContent: "center",
630
- alignItems: "center"
631
- },
632
- children: [
633
- /* @__PURE__ */ l(Re, { style: { minWidth: "100px", minHeight: "100px" } }),
634
- /* @__PURE__ */ l(
635
- "div",
636
- {
637
- style: {
638
- backgroundColor: "var(--ethora-color-bg-subtle, #F5F7FA)",
639
- borderRadius: "var(--ethora-radius-lg, 16px)",
640
- display: "flex",
641
- padding: "16px",
642
- color: "var(--ethora-color-text, #141414)"
643
- },
644
- children: n("modal.filePreview.unsupported")
645
- }
646
- )
647
- ]
648
- }
649
- );
650
- }
651
- }, [u, C, S, b, w, g, n]);
652
- return /* @__PURE__ */ B(
653
- Te,
654
- {
655
- "aria-label": n("modal.filePreview.title"),
656
- $closing: E,
657
- children: [
658
- /* @__PURE__ */ l(
659
- Ie,
660
- {
661
- handleCloseModal: U,
662
- headerTitle: n("modal.filePreview.title"),
663
- rightMenu: /* @__PURE__ */ B(lt, { children: [
664
- y && /* @__PURE__ */ l(dt, { "data-testid": "lightbox-position", "aria-live": "polite", children: n("modal.filePreview.position", {
665
- current: m + 1,
666
- total: x.length
667
- }) }),
668
- b === "image" && /* @__PURE__ */ B(ut, { children: [
669
- /* @__PURE__ */ l(
670
- V,
671
- {
672
- onClick: () => M.current?.zoomOut(),
673
- disabled: p <= I,
674
- "aria-label": n("modal.filePreview.zoomOut"),
675
- children: /* @__PURE__ */ l(Xe, {})
676
- }
677
- ),
678
- /* @__PURE__ */ l(
679
- V,
680
- {
681
- onClick: () => M.current?.zoomIn(),
682
- disabled: p >= ee,
683
- "aria-label": n("modal.filePreview.zoomIn"),
684
- children: /* @__PURE__ */ l(Ye, {})
685
- }
686
- ),
687
- /* @__PURE__ */ l(
688
- V,
689
- {
690
- onClick: () => M.current?.reset(),
691
- disabled: p <= I,
692
- "aria-label": n("modal.filePreview.resetZoom"),
693
- children: /* @__PURE__ */ l(ze, {})
694
- }
695
- )
696
- ] }),
697
- /* @__PURE__ */ l(V, { onClick: v, "aria-label": n("action.save"), children: /* @__PURE__ */ l(Oe, {}) })
698
- ] })
699
- }
700
- ),
701
- /* @__PURE__ */ l(
702
- De,
703
- {
704
- style: {
705
- display: "flex",
706
- flex: "1 1 auto",
707
- height: "100%",
708
- minHeight: 0,
709
- justifyContent: "center",
710
- overflow: "hidden",
711
- padding: "16px",
712
- width: "90%"
713
- },
714
- children: /* @__PURE__ */ B(at, { children: [
715
- y && /* @__PURE__ */ l(
716
- st,
717
- {
718
- onClick: g,
719
- disabled: !Y,
720
- "aria-label": n("modal.filePreview.previousImage"),
721
- children: /* @__PURE__ */ l(Fe, {})
722
- }
723
- ),
724
- P,
725
- y && /* @__PURE__ */ l(
726
- ct,
727
- {
728
- onClick: w,
729
- disabled: !F,
730
- "aria-label": n("modal.filePreview.nextImage"),
731
- children: /* @__PURE__ */ l(Ue, {})
732
- }
733
- )
734
- ] })
735
- }
736
- )
737
- ]
738
- }
739
- );
740
- };
741
- export {
742
- gt as default
743
- };