@linktr.ee/messaging-react 1.27.0 → 1.28.0-rc-1776231821

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 (57) hide show
  1. package/dist/Creator-BFpHsh2u.js +318 -0
  2. package/dist/Creator-BFpHsh2u.js.map +1 -0
  3. package/dist/MediaPlayer-DXz4IBLx.js +313 -0
  4. package/dist/MediaPlayer-DXz4IBLx.js.map +1 -0
  5. package/dist/Visitor-C1Fcrgd6.js +199 -0
  6. package/dist/Visitor-C1Fcrgd6.js.map +1 -0
  7. package/dist/assets/index.css +1 -1
  8. package/dist/index.d.ts +13 -16
  9. package/dist/index.js +27 -35
  10. package/dist/index.js.map +1 -1
  11. package/package.json +1 -2
  12. package/src/components/CustomMessage/CustomMessage.stories.tsx +1 -1
  13. package/src/components/CustomMessage/index.tsx +0 -1
  14. package/src/components/LockedAttachment/LockedAttachment.stories.tsx +143 -49
  15. package/src/components/LockedAttachment/components/Creator.tsx +406 -114
  16. package/src/components/LockedAttachment/components/MediaPlayer.tsx +162 -80
  17. package/src/components/LockedAttachment/components/Visitor.tsx +205 -145
  18. package/src/components/LockedAttachment/index.tsx +7 -7
  19. package/src/components/LockedAttachment/types.ts +1 -5
  20. package/src/components/LockedAttachment/utils/icons.ts +2 -1
  21. package/src/components/LockedAttachment/utils/mimeType.test.ts +29 -7
  22. package/src/components/LockedAttachment/utils/mimeType.ts +3 -1
  23. package/src/types.ts +0 -1
  24. package/dist/Creator-B6M8dB0U.js +0 -87
  25. package/dist/Creator-B6M8dB0U.js.map +0 -1
  26. package/dist/MediaPlayer-DsjlYGGH.js +0 -539
  27. package/dist/MediaPlayer-DsjlYGGH.js.map +0 -1
  28. package/dist/Preview-DqAv16NS.js +0 -87
  29. package/dist/Preview-DqAv16NS.js.map +0 -1
  30. package/dist/Visitor-CpmFZRGO.js +0 -175
  31. package/dist/Visitor-CpmFZRGO.js.map +0 -1
  32. package/dist/dash.all.min-Duv4lvGS.js +0 -18858
  33. package/dist/dash.all.min-Duv4lvGS.js.map +0 -1
  34. package/dist/hls-Bogc7CBn.js +0 -21710
  35. package/dist/hls-Bogc7CBn.js.map +0 -1
  36. package/dist/index-Da-xN4Yq.js +0 -16142
  37. package/dist/index-Da-xN4Yq.js.map +0 -1
  38. package/dist/index-Dj9rqWcU.js +0 -69
  39. package/dist/index-Dj9rqWcU.js.map +0 -1
  40. package/dist/mixin-B6jYfIcp.js +0 -808
  41. package/dist/mixin-B6jYfIcp.js.map +0 -1
  42. package/dist/react-BxlQMOfz.js +0 -419
  43. package/dist/react-BxlQMOfz.js.map +0 -1
  44. package/dist/react-COAP-MIW.js +0 -377
  45. package/dist/react-COAP-MIW.js.map +0 -1
  46. package/dist/react-Cn4WlMcl.js +0 -3108
  47. package/dist/react-Cn4WlMcl.js.map +0 -1
  48. package/dist/react-CwTJArKY.js +0 -459
  49. package/dist/react-CwTJArKY.js.map +0 -1
  50. package/dist/react-DkfS_atT.js +0 -373
  51. package/dist/react-DkfS_atT.js.map +0 -1
  52. package/dist/react-Pea5fum1.js +0 -286
  53. package/dist/react-Pea5fum1.js.map +0 -1
  54. package/dist/react-RiBbsUDd.js +0 -534
  55. package/dist/react-RiBbsUDd.js.map +0 -1
  56. package/dist/react-dS1WBxxz.js +0 -238
  57. package/dist/react-dS1WBxxz.js.map +0 -1
@@ -0,0 +1,318 @@
1
+ import { jsxs as f, jsx as e, Fragment as j } from "react/jsx-runtime";
2
+ import { XIcon as F, CheckCircleIcon as R, PauseIcon as S, PlayIcon as X, EyeSlashIcon as M, EyeIcon as D } from "@phosphor-icons/react";
3
+ import N from "classnames";
4
+ import { useState as C, useRef as P, useEffect as x, useCallback as E } from "react";
5
+ import { g as q, r as z, M as B } from "./MediaPlayer-DXz4IBLx.js";
6
+ const L = (u) => {
7
+ const { onClose: n } = u;
8
+ return /* @__PURE__ */ e(
9
+ "button",
10
+ {
11
+ type: "button",
12
+ onClick: n,
13
+ className: "absolute left-3 top-3 z-40 flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
14
+ "aria-label": "Close preview",
15
+ children: /* @__PURE__ */ e(D, { className: "size-4", weight: "fill" })
16
+ }
17
+ );
18
+ }, T = (u) => {
19
+ const { thumbnail: n, mimeType: s, overlayIcon: o, onClick: l } = u;
20
+ return /* @__PURE__ */ f(
21
+ "button",
22
+ {
23
+ type: "button",
24
+ disabled: !l,
25
+ className: N(
26
+ "relative aspect-video block w-full overflow-hidden border-0 bg-black/5 p-0 text-left appearance-none",
27
+ { "cursor-pointer": !!l, "cursor-default": !l }
28
+ ),
29
+ onClick: l,
30
+ "aria-label": o ? "Toggle preview" : void 0,
31
+ children: [
32
+ n ? /* @__PURE__ */ e(
33
+ "img",
34
+ {
35
+ src: n,
36
+ alt: "",
37
+ className: "absolute inset-0 h-full w-full object-cover"
38
+ }
39
+ ) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: z(s, {
40
+ className: "size-12 text-black/20",
41
+ weight: "regular"
42
+ }) }),
43
+ o && /* @__PURE__ */ e("div", { className: "pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white", children: /* @__PURE__ */ e(o, { className: "size-4", weight: "fill" }) })
44
+ ]
45
+ }
46
+ );
47
+ }, K = (u) => {
48
+ const { source: n, thumbnail: s, mimeType: o } = u, [l, r] = C(!1), [i, d] = C(0), [h, g] = C(!1), b = P(null), w = P(null), m = P(null);
49
+ x(() => {
50
+ const t = b.current;
51
+ t && (l ? t.play().catch(() => r(!1)) : t.pause());
52
+ }, [l]), x(() => {
53
+ if (!l) {
54
+ m.current !== null && cancelAnimationFrame(m.current);
55
+ return;
56
+ }
57
+ const t = () => {
58
+ const a = b.current;
59
+ a && a.duration && !h && d(a.currentTime / a.duration), m.current = requestAnimationFrame(t);
60
+ };
61
+ return m.current = requestAnimationFrame(t), () => {
62
+ m.current !== null && cancelAnimationFrame(m.current);
63
+ };
64
+ }, [l, h]), x(() => {
65
+ r(!1), d(0);
66
+ }, [n]);
67
+ const p = E(
68
+ (t) => {
69
+ var I, A;
70
+ const a = w.current;
71
+ if (!a) return 0;
72
+ const k = "touches" in t ? ((I = t.touches[0]) == null ? void 0 : I.clientX) ?? ((A = t.changedTouches[0]) == null ? void 0 : A.clientX) ?? 0 : t.clientX, y = a.getBoundingClientRect();
73
+ return Math.max(0, Math.min(1, (k - y.left) / y.width));
74
+ },
75
+ []
76
+ ), c = E((t) => {
77
+ const a = b.current;
78
+ a && a.duration && (a.currentTime = t * a.duration);
79
+ }, []);
80
+ x(() => {
81
+ if (!h) return;
82
+ const t = (k) => {
83
+ const y = p(k);
84
+ d(y), c(y);
85
+ }, a = (k) => {
86
+ g(!1), c(p(k));
87
+ };
88
+ return window.addEventListener("mousemove", t), window.addEventListener("mouseup", a), window.addEventListener("touchmove", t, { passive: !0 }), window.addEventListener("touchend", a), () => {
89
+ window.removeEventListener("mousemove", t), window.removeEventListener("mouseup", a), window.removeEventListener("touchmove", t), window.removeEventListener("touchend", a);
90
+ };
91
+ }, [h, p, c]);
92
+ const v = E(() => r((t) => !t), []);
93
+ return /* @__PURE__ */ f("div", { className: "relative", children: [
94
+ n && /* @__PURE__ */ e(
95
+ "audio",
96
+ {
97
+ ref: b,
98
+ src: n,
99
+ loop: !0,
100
+ onEnded: () => {
101
+ r(!1), d(0);
102
+ },
103
+ children: /* @__PURE__ */ e("track", { kind: "captions" })
104
+ }
105
+ ),
106
+ /* @__PURE__ */ e(
107
+ T,
108
+ {
109
+ thumbnail: s,
110
+ mimeType: o,
111
+ overlayIcon: n ? l ? S : X : void 0,
112
+ onClick: n ? v : void 0
113
+ }
114
+ ),
115
+ n && /* @__PURE__ */ e("div", { className: "absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent", children: /* @__PURE__ */ e(
116
+ "div",
117
+ {
118
+ ref: w,
119
+ role: "slider",
120
+ "aria-label": "Playback position",
121
+ "aria-valuenow": Math.round(i * 100),
122
+ "aria-valuemin": 0,
123
+ "aria-valuemax": 100,
124
+ tabIndex: 0,
125
+ className: "relative flex h-4 w-full cursor-pointer items-center",
126
+ onMouseDown: (t) => {
127
+ t.stopPropagation(), g(!0);
128
+ const a = p(t);
129
+ d(a), c(a);
130
+ },
131
+ onTouchStart: (t) => {
132
+ t.stopPropagation(), g(!0);
133
+ const a = p(t);
134
+ d(a), c(a);
135
+ },
136
+ onClick: (t) => t.stopPropagation(),
137
+ onKeyDown: (t) => {
138
+ t.key === "ArrowRight" && c(Math.min(1, i + 0.05)), t.key === "ArrowLeft" && c(Math.max(0, i - 0.05));
139
+ },
140
+ children: /* @__PURE__ */ e("div", { className: "w-full overflow-hidden rounded-full bg-white/30 h-1", children: /* @__PURE__ */ e(
141
+ "div",
142
+ {
143
+ className: "h-full rounded-full bg-white",
144
+ style: { width: `${Math.round(i * 100)}%` }
145
+ }
146
+ ) })
147
+ }
148
+ ) })
149
+ ] });
150
+ }, O = (u) => {
151
+ const { source: n, thumbnail: s, mimeType: o } = u, [l, r] = C(!1), i = () => r(!1);
152
+ return x(() => {
153
+ r(!1);
154
+ }, [n]), n ? /* @__PURE__ */ f(
155
+ "div",
156
+ {
157
+ className: N("relative overflow-hidden", {
158
+ "aspect-video": !l
159
+ }),
160
+ children: [
161
+ /* @__PURE__ */ e(
162
+ B,
163
+ {
164
+ source: n,
165
+ mimeType: o,
166
+ poster: s,
167
+ playing: l,
168
+ loop: !0,
169
+ controls: !1,
170
+ showProgress: !0,
171
+ onContainerClick: i,
172
+ muted: !0
173
+ }
174
+ ),
175
+ !l && /* @__PURE__ */ f(
176
+ "button",
177
+ {
178
+ type: "button",
179
+ className: "absolute inset-0 block cursor-pointer border-0 p-0 text-left appearance-none",
180
+ onClick: () => r(!0),
181
+ "aria-label": "Expand video preview",
182
+ children: [
183
+ s ? /* @__PURE__ */ e(
184
+ "img",
185
+ {
186
+ src: s,
187
+ alt: "",
188
+ className: "absolute inset-0 h-full w-full object-cover"
189
+ }
190
+ ) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: z(o, {
191
+ className: "size-12 text-black/20",
192
+ weight: "regular"
193
+ }) }),
194
+ /* @__PURE__ */ e("div", { className: "pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white", children: /* @__PURE__ */ e(M, { className: "size-4", weight: "fill" }) })
195
+ ]
196
+ }
197
+ ),
198
+ l && /* @__PURE__ */ e(L, { onClose: i })
199
+ ]
200
+ }
201
+ ) : /* @__PURE__ */ e(T, { thumbnail: s, mimeType: o });
202
+ }, U = (u) => {
203
+ const { source: n, thumbnail: s, mimeType: o, title: l } = u, [r, i] = C(!1), d = () => i(!1);
204
+ return x(() => {
205
+ i(!1);
206
+ }, [n]), r && n ? /* @__PURE__ */ f("div", { className: "relative", children: [
207
+ /* @__PURE__ */ e(
208
+ "button",
209
+ {
210
+ type: "button",
211
+ className: "block w-full cursor-pointer border-0 p-0 text-left appearance-none",
212
+ onClick: d,
213
+ "aria-label": "Close preview",
214
+ children: /* @__PURE__ */ e("img", { src: n, alt: l ?? "", className: "block w-full" })
215
+ }
216
+ ),
217
+ /* @__PURE__ */ e(L, { onClose: d })
218
+ ] }) : /* @__PURE__ */ e(
219
+ T,
220
+ {
221
+ thumbnail: s,
222
+ mimeType: o,
223
+ overlayIcon: n ? M : void 0,
224
+ onClick: n ? () => i(!0) : void 0
225
+ }
226
+ );
227
+ }, Q = (u) => {
228
+ const {
229
+ title: n,
230
+ mimeType: s = "application/octet-stream",
231
+ thumbnail: o,
232
+ source: l,
233
+ detail: r,
234
+ amountText: i,
235
+ placeholderTitle: d = "Attachment title",
236
+ placeholderAmountText: h,
237
+ paymentStatus: g,
238
+ onDismiss: b,
239
+ isPreview: w = !1
240
+ } = u, m = q(s), p = i ?? h, c = !i && !!h;
241
+ let v;
242
+ return w && m === "audio" ? v = /* @__PURE__ */ e(K, { source: l, thumbnail: o, mimeType: s }) : w && m === "video" ? v = /* @__PURE__ */ e(O, { source: l, thumbnail: o, mimeType: s }) : w && m === "image" ? v = /* @__PURE__ */ e(
243
+ U,
244
+ {
245
+ source: l,
246
+ thumbnail: o,
247
+ mimeType: s,
248
+ title: n
249
+ }
250
+ ) : v = /* @__PURE__ */ e(T, { thumbnail: o, mimeType: s }), /* @__PURE__ */ f("div", { className: "relative w-[280px] select-none overflow-hidden rounded-3xl bg-white shadow-card", children: [
251
+ b && /* @__PURE__ */ e(
252
+ "button",
253
+ {
254
+ type: "button",
255
+ onClick: b,
256
+ className: "absolute right-3 top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
257
+ "aria-label": "Dismiss attachment",
258
+ children: /* @__PURE__ */ e(F, { className: "size-4", weight: "bold" })
259
+ }
260
+ ),
261
+ v,
262
+ /* @__PURE__ */ f("div", { className: "px-4 pb-3 pt-3", children: [
263
+ /* @__PURE__ */ e(
264
+ "p",
265
+ {
266
+ className: N("mb-1.5 truncate text-base font-medium", {
267
+ "text-black/30": !n,
268
+ "text-black": !!n
269
+ }),
270
+ children: n || d
271
+ }
272
+ ),
273
+ /* @__PURE__ */ f("div", { className: "flex items-center gap-1", children: [
274
+ z(s, {
275
+ className: "size-5 shrink-0 text-black/55",
276
+ weight: "regular"
277
+ }),
278
+ r && /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: r }),
279
+ g === "paid" ? /* @__PURE__ */ f(j, { children: [
280
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
281
+ /* @__PURE__ */ e("span", { className: "text-xs font-medium text-[#008236]", children: "Purchased" }),
282
+ /* @__PURE__ */ e(
283
+ R,
284
+ {
285
+ className: "size-4 text-[#008236]",
286
+ weight: "bold"
287
+ }
288
+ )
289
+ ] }) : p && /* @__PURE__ */ f(j, { children: [
290
+ /* @__PURE__ */ e(
291
+ "span",
292
+ {
293
+ className: N("text-xs font-medium", {
294
+ "text-black/30": c,
295
+ "text-black/55": !c
296
+ }),
297
+ children: "•"
298
+ }
299
+ ),
300
+ /* @__PURE__ */ e(
301
+ "span",
302
+ {
303
+ className: N("text-xs font-medium", {
304
+ "text-black/30": c,
305
+ "text-black/55": !c
306
+ }),
307
+ children: p
308
+ }
309
+ )
310
+ ] })
311
+ ] })
312
+ ] })
313
+ ] });
314
+ };
315
+ export {
316
+ Q as default
317
+ };
318
+ //# sourceMappingURL=Creator-BFpHsh2u.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Creator-BFpHsh2u.js","sources":["../src/components/LockedAttachment/components/Creator.tsx"],"sourcesContent":["import {\n CheckCircleIcon,\n EyeIcon,\n EyeSlashIcon,\n PauseIcon,\n PlayIcon,\n XIcon,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { LockedAttachmentBaseProps } from '../types'\nimport { renderTypeIcon } from '../utils/icons'\nimport { getSourceType } from '../utils/mimeType'\n\nimport MediaPlayer from './MediaPlayer'\n\nexport interface CreatorCardProps extends LockedAttachmentBaseProps {\n isPreview?: boolean\n placeholderTitle?: string\n placeholderAmountText?: string\n onDismiss?: () => void\n}\n\ninterface CloseButtonProps {\n onClose: () => void\n}\n\nconst CloseButton: React.FC<CloseButtonProps> = (props) => {\n const { onClose } = props\n return (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"absolute left-3 top-3 z-40 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\"\n aria-label=\"Close preview\"\n >\n <EyeIcon className=\"size-4\" weight=\"fill\" />\n </button>\n )\n}\n\ninterface CollapsedThumbnailProps {\n thumbnail?: string\n mimeType: string\n overlayIcon?: React.ElementType\n onClick?: () => void\n}\n\nconst CollapsedThumbnail: React.FC<CollapsedThumbnailProps> = (props) => {\n const { thumbnail, mimeType, overlayIcon: OverlayIcon, onClick } = props\n return (\n <button\n type=\"button\"\n disabled={!onClick}\n className={classNames(\n 'relative aspect-video block w-full overflow-hidden border-0 bg-black/5 p-0 text-left appearance-none',\n { 'cursor-pointer': !!onClick, 'cursor-default': !onClick }\n )}\n onClick={onClick}\n aria-label={OverlayIcon ? 'Toggle preview' : undefined}\n >\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n {OverlayIcon && (\n <div className=\"pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\">\n <OverlayIcon className=\"size-4\" weight=\"fill\" />\n </div>\n )}\n </button>\n )\n}\n\n\ninterface AudioPreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n}\n\nconst AudioPreview: React.FC<AudioPreviewProps> = (props) => {\n const { source, thumbnail, mimeType } = props\n const [playing, setPlaying] = useState(false)\n const [played, setPlayed] = useState(0)\n const [seeking, setSeeking] = useState(false)\n const audioRef = useRef<HTMLAudioElement>(null)\n const trackRef = useRef<HTMLDivElement>(null)\n const rafRef = useRef<number | null>(null)\n\n useEffect(() => {\n const el = audioRef.current\n if (!el) return\n if (playing) {\n void el.play().catch(() => setPlaying(false))\n } else {\n el.pause()\n }\n }, [playing])\n\n useEffect(() => {\n if (!playing) {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n return\n }\n const tick = () => {\n const el = audioRef.current\n if (el && el.duration && !seeking) setPlayed(el.currentTime / el.duration)\n rafRef.current = requestAnimationFrame(tick)\n }\n rafRef.current = requestAnimationFrame(tick)\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n }\n }, [playing, seeking])\n\n useEffect(() => {\n setPlaying(false)\n setPlayed(0)\n }, [source])\n\n const getFraction = useCallback(\n (e: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent) => {\n const track = trackRef.current\n if (!track) return 0\n const clientX =\n 'touches' in e\n ? (e.touches[0]?.clientX ?? e.changedTouches[0]?.clientX ?? 0)\n : e.clientX\n const rect = track.getBoundingClientRect()\n return Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n },\n []\n )\n\n const seekTo = useCallback((fraction: number) => {\n const el = audioRef.current\n if (el && el.duration) el.currentTime = fraction * el.duration\n }, [])\n\n useEffect(() => {\n if (!seeking) return\n const onMove = (e: MouseEvent | TouchEvent) => {\n const f = getFraction(e)\n setPlayed(f)\n seekTo(f)\n }\n const onUp = (e: MouseEvent | TouchEvent) => {\n setSeeking(false)\n seekTo(getFraction(e))\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n window.addEventListener('touchmove', onMove, { passive: true })\n window.addEventListener('touchend', onUp)\n return () => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n window.removeEventListener('touchmove', onMove)\n window.removeEventListener('touchend', onUp)\n }\n }, [seeking, getFraction, seekTo])\n\n const toggle = useCallback(() => setPlaying((p) => !p), [])\n\n return (\n <div className=\"relative\">\n {source && (\n <audio\n ref={audioRef}\n src={source}\n loop\n onEnded={() => {\n setPlaying(false)\n setPlayed(0)\n }}\n >\n <track kind=\"captions\" />\n </audio>\n )}\n <CollapsedThumbnail\n thumbnail={thumbnail}\n mimeType={mimeType}\n overlayIcon={source ? (playing ? PauseIcon : PlayIcon) : undefined}\n onClick={source ? toggle : undefined}\n />\n {source && (\n <div className=\"absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent\">\n <div\n ref={trackRef}\n role=\"slider\"\n aria-label=\"Playback position\"\n aria-valuenow={Math.round(played * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n tabIndex={0}\n className=\"relative flex h-4 w-full cursor-pointer items-center\"\n onMouseDown={(e) => {\n e.stopPropagation()\n setSeeking(true)\n const f = getFraction(e)\n setPlayed(f)\n seekTo(f)\n }}\n onTouchStart={(e) => {\n e.stopPropagation()\n setSeeking(true)\n const f = getFraction(e)\n setPlayed(f)\n seekTo(f)\n }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') seekTo(Math.min(1, played + 0.05))\n if (e.key === 'ArrowLeft') seekTo(Math.max(0, played - 0.05))\n }}\n >\n <div className=\"w-full overflow-hidden rounded-full bg-white/30 h-1\">\n <div\n className=\"h-full rounded-full bg-white\"\n style={{ width: `${Math.round(played * 100)}%` }}\n />\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\ninterface VideoPreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n}\n\nconst VideoPreview: React.FC<VideoPreviewProps> = (props) => {\n const { source, thumbnail, mimeType } = props\n const [expanded, setExpanded] = useState(false)\n const collapse = () => setExpanded(false)\n\n useEffect(() => {\n setExpanded(false)\n }, [source])\n\n if (!source) {\n return <CollapsedThumbnail thumbnail={thumbnail} mimeType={mimeType} />\n }\n\n return (\n <div\n className={classNames('relative overflow-hidden', {\n 'aspect-video': !expanded,\n })}\n >\n <MediaPlayer\n source={source}\n mimeType={mimeType}\n poster={thumbnail}\n playing={expanded}\n loop\n controls={false}\n showProgress\n onContainerClick={collapse}\n muted\n />\n {!expanded && (\n <button\n type=\"button\"\n className=\"absolute inset-0 block cursor-pointer border-0 p-0 text-left appearance-none\"\n onClick={() => setExpanded(true)}\n aria-label=\"Expand video preview\"\n >\n {thumbnail ? (\n <img\n src={thumbnail}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {renderTypeIcon(mimeType, {\n className: 'size-12 text-black/20',\n weight: 'regular',\n })}\n </div>\n )}\n <div className=\"pointer-events-none absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\">\n <EyeSlashIcon className=\"size-4\" weight=\"fill\" />\n </div>\n </button>\n )}\n {expanded && <CloseButton onClose={collapse} />}\n </div>\n )\n}\n\ninterface ImagePreviewProps {\n source?: string\n thumbnail?: string\n mimeType: string\n title?: string\n}\n\nconst ImagePreview: React.FC<ImagePreviewProps> = (props) => {\n const { source, thumbnail, mimeType, title } = props\n const [expanded, setExpanded] = useState(false)\n const collapse = () => setExpanded(false)\n\n useEffect(() => {\n setExpanded(false)\n }, [source])\n\n if (expanded && source) {\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n className=\"block w-full cursor-pointer border-0 p-0 text-left appearance-none\"\n onClick={collapse}\n aria-label=\"Close preview\"\n >\n <img src={source} alt={title ?? ''} className=\"block w-full\" />\n </button>\n <CloseButton onClose={collapse} />\n </div>\n )\n }\n\n return (\n <CollapsedThumbnail\n thumbnail={thumbnail}\n mimeType={mimeType}\n overlayIcon={source ? EyeSlashIcon : undefined}\n onClick={source ? () => setExpanded(true) : undefined}\n />\n )\n}\n\n\nconst CreatorCard: React.FC<CreatorCardProps> = (props) => {\n const {\n title,\n mimeType = 'application/octet-stream',\n thumbnail,\n source,\n detail,\n amountText,\n placeholderTitle = 'Attachment title',\n placeholderAmountText,\n paymentStatus,\n onDismiss,\n isPreview = false,\n } = props\n const sourceType = getSourceType(mimeType)\n const displayAmountText = amountText ?? placeholderAmountText\n const isPlaceholderAmount = !amountText && !!placeholderAmountText\n\n let mediaPreview: React.ReactNode\n if (isPreview && sourceType === 'audio') {\n mediaPreview = (\n <AudioPreview source={source} thumbnail={thumbnail} mimeType={mimeType} />\n )\n } else if (isPreview && sourceType === 'video') {\n mediaPreview = (\n <VideoPreview source={source} thumbnail={thumbnail} mimeType={mimeType} />\n )\n } else if (isPreview && sourceType === 'image') {\n mediaPreview = (\n <ImagePreview\n source={source}\n thumbnail={thumbnail}\n mimeType={mimeType}\n title={title}\n />\n )\n } else {\n mediaPreview = (\n <CollapsedThumbnail thumbnail={thumbnail} mimeType={mimeType} />\n )\n }\n\n return (\n <div className=\"relative w-[280px] select-none overflow-hidden rounded-3xl bg-white shadow-card\">\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"absolute right-3 top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\"\n aria-label=\"Dismiss attachment\"\n >\n <XIcon className=\"size-4\" weight=\"bold\" />\n </button>\n )}\n {mediaPreview}\n <div className=\"px-4 pb-3 pt-3\">\n <p\n className={classNames('mb-1.5 truncate text-base font-medium', {\n 'text-black/30': !title,\n 'text-black': !!title,\n })}\n >\n {title || placeholderTitle}\n </p>\n <div className=\"flex items-center gap-1\">\n {renderTypeIcon(mimeType, {\n className: 'size-5 shrink-0 text-black/55',\n weight: 'regular',\n })}\n {detail && (\n <span className=\"text-xs font-medium text-black/55\">{detail}</span>\n )}\n {paymentStatus === 'paid' ? (\n <>\n <span className=\"text-xs font-medium text-black/55\">•</span>\n <span className=\"text-xs font-medium text-[#008236]\">\n Purchased\n </span>\n <CheckCircleIcon\n className=\"size-4 text-[#008236]\"\n weight=\"bold\"\n />\n </>\n ) : (\n displayAmountText && (\n <>\n <span\n className={classNames('text-xs font-medium', {\n 'text-black/30': isPlaceholderAmount,\n 'text-black/55': !isPlaceholderAmount,\n })}\n >\n •\n </span>\n <span\n className={classNames('text-xs font-medium', {\n 'text-black/30': isPlaceholderAmount,\n 'text-black/55': !isPlaceholderAmount,\n })}\n >\n {displayAmountText}\n </span>\n </>\n )\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default CreatorCard\n"],"names":["CloseButton","props","onClose","jsx","EyeIcon","CollapsedThumbnail","thumbnail","mimeType","OverlayIcon","onClick","jsxs","classNames","AudioPreview","source","playing","setPlaying","useState","played","setPlayed","seeking","setSeeking","audioRef","useRef","trackRef","rafRef","useEffect","el","tick","getFraction","useCallback","e","track","clientX","_a","_b","rect","seekTo","fraction","onMove","f","onUp","toggle","p","PauseIcon","PlayIcon","VideoPreview","expanded","setExpanded","collapse","MediaPlayer","EyeSlashIcon","ImagePreview","title","CreatorCard","detail","amountText","placeholderTitle","placeholderAmountText","paymentStatus","onDismiss","isPreview","sourceType","getSourceType","displayAmountText","isPlaceholderAmount","mediaPreview","XIcon","renderTypeIcon","Fragment","CheckCircleIcon"],"mappings":"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"}
@@ -0,0 +1,313 @@
1
+ import { jsxs as L, jsx as n } from "react/jsx-runtime";
2
+ import { FileIcon as $, ImageIcon as V, SpeakerHighIcon as G, VideoCameraIcon as Y, FileMdIcon as Z, FileTextIcon as J, FileZipIcon as Q, FilePptIcon as ee, FileCsvIcon as te, FileXlsIcon as ne, FileDocIcon as ae, FilePdfIcon as re, CircleNotchIcon as ie, PlayIcon as W, PauseIcon as oe } from "@phosphor-icons/react";
3
+ import se, { useState as c, useRef as M, useEffect as x, useCallback as z } from "react";
4
+ const le = [
5
+ [/pdf/, "pdf"],
6
+ [/wordprocessingml|msword|\.doc/, "doc"],
7
+ [/spreadsheetml|ms-excel|\.xls/, "xls"],
8
+ [/csv/, "csv"],
9
+ [/presentationml|ms-powerpoint|\.ppt/, "ppt"],
10
+ [/zip|x-rar|x-7z|x-tar|x-gzip/, "zip"],
11
+ [/plain|rtf/, "text"],
12
+ [/markdown/, "markdown"]
13
+ ];
14
+ function H(a) {
15
+ return a.startsWith("video/") ? "video" : a.startsWith("audio/") ? "audio" : a.startsWith("image/") ? "image" : "document";
16
+ }
17
+ function ce(a) {
18
+ const r = le.find(
19
+ ([i]) => i.test(a)
20
+ );
21
+ return r ? r[1] : "generic";
22
+ }
23
+ const ue = {
24
+ video: Y,
25
+ audio: G,
26
+ image: V,
27
+ document: $
28
+ }, de = {
29
+ pdf: re,
30
+ doc: ae,
31
+ xls: ne,
32
+ csv: te,
33
+ ppt: ee,
34
+ zip: Q,
35
+ text: J,
36
+ markdown: Z,
37
+ generic: $
38
+ };
39
+ function fe(a) {
40
+ const r = H(a);
41
+ return r !== "document" ? ue[r] : de[ce(a)];
42
+ }
43
+ function me(a, r) {
44
+ return se.createElement(fe(a), r);
45
+ }
46
+ const he = (a, r) => a === "audio" && !r ? "bg-black/5" : "bg-black";
47
+ function pe(a) {
48
+ var r, i;
49
+ return "touches" in a ? ((r = a.touches[0]) == null ? void 0 : r.clientX) ?? ((i = a.changedTouches[0]) == null ? void 0 : i.clientX) ?? 0 : a.clientX;
50
+ }
51
+ const be = ({
52
+ source: a,
53
+ mimeType: r,
54
+ poster: i,
55
+ autoPlay: _ = !1,
56
+ playing: u,
57
+ loop: k = !1,
58
+ controls: v = !0,
59
+ showProgress: X = !1,
60
+ onContainerClick: N,
61
+ muted: C = !1
62
+ }) => {
63
+ const D = H(r), [d, o] = c(_), R = M(u);
64
+ x(() => {
65
+ u !== void 0 && u !== R.current && (R.current = u, o(u));
66
+ }, [u]);
67
+ const [w, g] = c(0), [f, A] = c(!1), [S, j] = c(!1), [T, q] = c(null), [K, m] = c(!1), [I, b] = c(!1), h = M(null), F = M(null), s = M(null);
68
+ x(() => {
69
+ b(!1);
70
+ }, [a]), x(() => {
71
+ if (!d) {
72
+ s.current !== null && (cancelAnimationFrame(s.current), s.current = null);
73
+ return;
74
+ }
75
+ const e = () => {
76
+ const t = h.current;
77
+ t && t.duration && !f && g(t.currentTime / t.duration), s.current = requestAnimationFrame(e);
78
+ };
79
+ return s.current = requestAnimationFrame(e), () => {
80
+ s.current !== null && cancelAnimationFrame(s.current);
81
+ };
82
+ }, [d, f]), x(() => {
83
+ const e = h.current;
84
+ e && (d ? e.play().catch((t) => {
85
+ o(!1), b(!0);
86
+ }) : e.pause());
87
+ }, [d]);
88
+ const O = z(() => {
89
+ b(!1), o(!0);
90
+ }, []), P = z(
91
+ (e) => {
92
+ const t = F.current;
93
+ if (!t) return 0;
94
+ const p = t.getBoundingClientRect();
95
+ return Math.max(
96
+ 0,
97
+ Math.min(1, (pe(e) - p.left) / p.width)
98
+ );
99
+ },
100
+ []
101
+ ), l = z((e) => {
102
+ const t = h.current;
103
+ t && t.duration && (t.currentTime = e * t.duration);
104
+ }, []), E = (e) => {
105
+ e.stopPropagation(), A(!0);
106
+ const t = P(e);
107
+ g(t), l(t);
108
+ };
109
+ x(() => {
110
+ if (!f) return;
111
+ const e = (p) => g(P(p)), t = (p) => {
112
+ A(!1), l(P(p));
113
+ };
114
+ return window.addEventListener("mousemove", e), window.addEventListener("mouseup", t), window.addEventListener("touchmove", e, { passive: !0 }), window.addEventListener("touchend", t), () => {
115
+ window.removeEventListener("mousemove", e), window.removeEventListener("mouseup", t), window.removeEventListener("touchmove", e), window.removeEventListener("touchend", t);
116
+ };
117
+ }, [f, P, l]);
118
+ const B = T ? { aspectRatio: String(T) } : void 0, U = T ? "" : " aspect-video", y = Math.round(w * 100);
119
+ return /* @__PURE__ */ L(
120
+ "div",
121
+ {
122
+ role: "button",
123
+ tabIndex: 0,
124
+ className: `relative cursor-pointer overflow-hidden ${he(D, i)}${U}`,
125
+ style: B,
126
+ onClick: () => {
127
+ if (!I) {
128
+ if (N) {
129
+ N();
130
+ return;
131
+ }
132
+ v && o((e) => !e);
133
+ }
134
+ },
135
+ onKeyDown: (e) => {
136
+ if (!(e.key !== "Enter" && e.key !== " ") && (e.preventDefault(), !I)) {
137
+ if (N) {
138
+ N();
139
+ return;
140
+ }
141
+ v && o((t) => !t);
142
+ }
143
+ },
144
+ children: [
145
+ i && /* @__PURE__ */ n(
146
+ "img",
147
+ {
148
+ src: i,
149
+ alt: "",
150
+ className: "absolute inset-0 h-full w-full object-cover"
151
+ }
152
+ ),
153
+ !i && /* @__PURE__ */ n("div", { className: "absolute inset-0 flex items-center justify-center", children: me(r, {
154
+ className: "size-12 text-black/20",
155
+ weight: "regular"
156
+ }) }),
157
+ /* @__PURE__ */ n("div", { className: "absolute inset-0", children: D === "audio" ? /* @__PURE__ */ n(
158
+ "audio",
159
+ {
160
+ ref: h,
161
+ src: a,
162
+ loop: k,
163
+ muted: C,
164
+ style: { width: "100%", height: "100%" },
165
+ onLoadStart: () => m(!0),
166
+ onCanPlay: () => m(!1),
167
+ onWaiting: () => m(!0),
168
+ onPlay: () => b(!1),
169
+ onEnded: () => {
170
+ k || (o(!1), g(0));
171
+ },
172
+ children: /* @__PURE__ */ n("track", { kind: "captions" })
173
+ }
174
+ ) : /* @__PURE__ */ n(
175
+ "video",
176
+ {
177
+ ref: h,
178
+ src: a,
179
+ poster: i,
180
+ loop: k,
181
+ muted: C,
182
+ playsInline: !0,
183
+ style: { width: "100%", height: "100%" },
184
+ onLoadStart: () => m(!0),
185
+ onCanPlay: () => m(!1),
186
+ onWaiting: () => m(!0),
187
+ onPlay: () => b(!1),
188
+ onLoadedMetadata: () => {
189
+ const e = h.current;
190
+ e instanceof HTMLVideoElement && e.videoWidth && e.videoHeight && q(e.videoWidth / e.videoHeight);
191
+ },
192
+ onEnded: () => {
193
+ k || (o(!1), g(0));
194
+ },
195
+ children: /* @__PURE__ */ n("track", { kind: "captions" })
196
+ }
197
+ ) }),
198
+ K && !I && /* @__PURE__ */ n("div", { className: "absolute inset-0 z-10 flex items-center justify-center", children: /* @__PURE__ */ n(
199
+ ie,
200
+ {
201
+ className: "size-8 animate-spin text-white/80",
202
+ weight: "bold"
203
+ }
204
+ ) }),
205
+ I && !v && /* @__PURE__ */ n(
206
+ "div",
207
+ {
208
+ className: "absolute inset-0 z-30 flex cursor-pointer items-center justify-center bg-black/35",
209
+ role: "button",
210
+ tabIndex: 0,
211
+ "aria-label": "Play preview",
212
+ onClick: (e) => {
213
+ e.stopPropagation(), O();
214
+ },
215
+ onKeyDown: (e) => {
216
+ e.key !== "Enter" && e.key !== " " || (e.preventDefault(), e.stopPropagation(), O());
217
+ },
218
+ children: /* @__PURE__ */ n("span", { className: "flex size-16 items-center justify-center rounded-full bg-white/20 text-white backdrop-blur-sm", children: /* @__PURE__ */ n(W, { className: "size-9 translate-x-0.5", weight: "fill" }) })
219
+ }
220
+ ),
221
+ X && !v && /* @__PURE__ */ n("div", { className: "absolute inset-x-0 bottom-0 px-3 pb-2.5 pt-6 bg-gradient-to-t from-black/40 to-transparent", children: /* @__PURE__ */ n(
222
+ "div",
223
+ {
224
+ role: "slider",
225
+ "aria-label": "Playback position",
226
+ "aria-valuenow": y,
227
+ "aria-valuemin": 0,
228
+ "aria-valuemax": 100,
229
+ tabIndex: 0,
230
+ ref: F,
231
+ className: "relative flex h-4 w-full cursor-pointer items-center",
232
+ onMouseDown: E,
233
+ onTouchStart: E,
234
+ onClick: (e) => e.stopPropagation(),
235
+ onKeyDown: (e) => {
236
+ e.key === "ArrowRight" && l(Math.min(1, w + 0.05)), e.key === "ArrowLeft" && l(Math.max(0, w - 0.05));
237
+ },
238
+ children: /* @__PURE__ */ n("div", { className: "w-full overflow-hidden rounded-full bg-white/30 h-1", children: /* @__PURE__ */ n(
239
+ "div",
240
+ {
241
+ className: "h-full rounded-full bg-white",
242
+ style: { width: `${y}%` }
243
+ }
244
+ ) })
245
+ }
246
+ ) }),
247
+ v && /* @__PURE__ */ L("div", { className: "absolute inset-x-0 bottom-0 flex items-center gap-2 bg-gradient-to-t from-black/60 to-transparent px-3 pb-2.5 pt-6 transition-all duration-200", children: [
248
+ /* @__PURE__ */ n(
249
+ "button",
250
+ {
251
+ type: "button",
252
+ onClick: (e) => {
253
+ e.stopPropagation(), o((t) => !t);
254
+ },
255
+ className: "shrink-0 text-white",
256
+ "aria-label": d ? "Pause" : "Play",
257
+ children: d ? /* @__PURE__ */ n(oe, { className: "size-5", weight: "fill" }) : /* @__PURE__ */ n(W, { className: "size-5 translate-x-px", weight: "fill" })
258
+ }
259
+ ),
260
+ /* @__PURE__ */ L(
261
+ "div",
262
+ {
263
+ role: "slider",
264
+ "aria-label": "Playback position",
265
+ "aria-valuenow": y,
266
+ "aria-valuemin": 0,
267
+ "aria-valuemax": 100,
268
+ tabIndex: 0,
269
+ ref: F,
270
+ className: "relative flex h-4 w-full cursor-pointer items-center",
271
+ onMouseDown: E,
272
+ onTouchStart: E,
273
+ onClick: (e) => e.stopPropagation(),
274
+ onMouseEnter: () => j(!0),
275
+ onMouseLeave: () => j(!1),
276
+ onKeyDown: (e) => {
277
+ e.key === "ArrowRight" && l(Math.min(1, w + 0.05)), e.key === "ArrowLeft" && l(Math.max(0, w - 0.05));
278
+ },
279
+ children: [
280
+ /* @__PURE__ */ n(
281
+ "div",
282
+ {
283
+ className: `w-full overflow-hidden rounded-full bg-white/30 transition-all duration-200 ${S || f ? "h-1.5" : "h-1"}`,
284
+ children: /* @__PURE__ */ n(
285
+ "div",
286
+ {
287
+ className: "h-full rounded-full bg-white",
288
+ style: { width: `${y}%` }
289
+ }
290
+ )
291
+ }
292
+ ),
293
+ /* @__PURE__ */ n(
294
+ "div",
295
+ {
296
+ className: `absolute size-3 -translate-x-1/2 rounded-full bg-white shadow transition-[opacity,transform] duration-200 ${S || f ? "scale-100 opacity-100" : "scale-0 opacity-0"}`,
297
+ style: { left: `${y}%` }
298
+ }
299
+ )
300
+ ]
301
+ }
302
+ )
303
+ ] })
304
+ ]
305
+ }
306
+ );
307
+ };
308
+ export {
309
+ be as M,
310
+ H as g,
311
+ me as r
312
+ };
313
+ //# sourceMappingURL=MediaPlayer-DXz4IBLx.js.map