@linktr.ee/messaging-react 1.32.0 → 1.32.1

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 (30) hide show
  1. package/dist/Card-1CQEn-OT.js +171 -0
  2. package/dist/Card-1CQEn-OT.js.map +1 -0
  3. package/dist/Card-ClE_iExA.js +177 -0
  4. package/dist/Card-ClE_iExA.js.map +1 -0
  5. package/dist/{MediaPlayer-BCsdmsON.js → MediaPlayer-B9Ws2NeE.js} +115 -135
  6. package/dist/MediaPlayer-B9Ws2NeE.js.map +1 -0
  7. package/dist/index.d.ts +3 -2
  8. package/dist/index.js +1 -1
  9. package/dist/index.js.map +1 -1
  10. package/package.json +1 -1
  11. package/src/components/LockedAttachment/LockedAttachment.stories.tsx +136 -93
  12. package/src/components/LockedAttachment/components/Creator/Card.tsx +106 -106
  13. package/src/components/LockedAttachment/components/Creator/CardThumbnail.tsx +114 -0
  14. package/src/components/LockedAttachment/components/MediaPlayer.tsx +80 -66
  15. package/src/components/LockedAttachment/components/Visitor/Card.tsx +53 -78
  16. package/src/components/LockedAttachment/components/Visitor/CardActions.tsx +3 -3
  17. package/src/components/LockedAttachment/components/Visitor/CardThumbnail.tsx +81 -0
  18. package/src/components/LockedAttachment/types.ts +2 -0
  19. package/dist/Card-C5t3dZ5q.js +0 -350
  20. package/dist/Card-C5t3dZ5q.js.map +0 -1
  21. package/dist/Card-Cn2va-Qr.js +0 -205
  22. package/dist/Card-Cn2va-Qr.js.map +0 -1
  23. package/dist/MediaPlayer-BCsdmsON.js.map +0 -1
  24. package/src/components/LockedAttachment/components/Creator/CardAudioPreview.tsx +0 -161
  25. package/src/components/LockedAttachment/components/Creator/CardCollapsedThumbnail.tsx +0 -58
  26. package/src/components/LockedAttachment/components/Creator/CardImagePreview.tsx +0 -56
  27. package/src/components/LockedAttachment/components/Creator/CardVideoPreview.tsx +0 -91
  28. package/src/components/LockedAttachment/components/Visitor/CardImagePreview.tsx +0 -39
  29. package/src/components/LockedAttachment/components/Visitor/CardMediaPreview.tsx +0 -36
  30. package/src/components/LockedAttachment/components/Visitor/CardThumbnailPreview.tsx +0 -45
@@ -1,350 +0,0 @@
1
- import { jsxs as m, jsx as e, Fragment as L } from "react/jsx-runtime";
2
- import { PauseIcon as _, PlayIcon as F, EyeSlashIcon as M, EyeIcon as R, XIcon as S, CheckCircleIcon as X, LockOpenIcon as D, LockIcon as B } from "@phosphor-icons/react";
3
- import C from "classnames";
4
- import { r as I, M as q, g as O } from "./MediaPlayer-BCsdmsON.js";
5
- import { useState as k, useRef as T, useEffect as z, useCallback as E } from "react";
6
- const P = ({
7
- thumbnailUrl: o,
8
- mimeType: a,
9
- overlayIcon: s,
10
- darkOverlay: r,
11
- onClick: n
12
- }) => /* @__PURE__ */ m(
13
- "button",
14
- {
15
- type: "button",
16
- disabled: !n,
17
- className: C(
18
- "relative aspect-video block w-full overflow-hidden border-0 bg-black/5 p-0 text-left appearance-none",
19
- { "cursor-pointer": !!n, "cursor-default": !n }
20
- ),
21
- onClick: n,
22
- "aria-label": s ? "Toggle preview" : void 0,
23
- children: [
24
- o ? /* @__PURE__ */ e(
25
- "img",
26
- {
27
- src: o,
28
- alt: "",
29
- className: "absolute inset-0 h-full w-full object-cover"
30
- }
31
- ) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: I(a, {
32
- className: "size-12 text-black/20",
33
- weight: "regular"
34
- }) }),
35
- r && /* @__PURE__ */ e("div", { className: "pointer-events-none absolute inset-0 bg-black/30" }),
36
- s && /* @__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(s, { className: "size-4", weight: "fill" }) })
37
- ]
38
- }
39
- ), $ = (o) => {
40
- const { sourceUrl: a, thumbnailUrl: s, mimeType: r } = o, [n, c] = k(!1), [i, h] = k(0), [b, v] = k(!1), f = T(null), w = T(null), d = T(null);
41
- z(() => {
42
- const t = f.current;
43
- t && (n ? t.play().catch(() => c(!1)) : t.pause());
44
- }, [n]), z(() => {
45
- if (!n) {
46
- d.current !== null && cancelAnimationFrame(d.current);
47
- return;
48
- }
49
- const t = () => {
50
- const l = f.current;
51
- l && l.duration && !b && h(l.currentTime / l.duration), d.current = requestAnimationFrame(t);
52
- };
53
- return d.current = requestAnimationFrame(t), () => {
54
- d.current !== null && cancelAnimationFrame(d.current);
55
- };
56
- }, [n, b]);
57
- const [x, g] = k(!1), u = E(
58
- (t) => {
59
- var A, j;
60
- const l = w.current;
61
- if (!l) return 0;
62
- const y = "touches" in t ? ((A = t.touches[0]) == null ? void 0 : A.clientX) ?? ((j = t.changedTouches[0]) == null ? void 0 : j.clientX) ?? 0 : t.clientX, N = l.getBoundingClientRect();
63
- return Math.max(0, Math.min(1, (y - N.left) / N.width));
64
- },
65
- []
66
- ), p = E((t) => {
67
- const l = f.current;
68
- l && l.duration && (l.currentTime = t * l.duration);
69
- }, []);
70
- z(() => {
71
- if (!b) return;
72
- const t = (y) => {
73
- const N = u(y);
74
- h(N), p(N);
75
- }, l = (y) => {
76
- v(!1), p(u(y));
77
- };
78
- return window.addEventListener("mousemove", t), window.addEventListener("mouseup", l), window.addEventListener("touchmove", t, { passive: !0 }), window.addEventListener("touchend", l), () => {
79
- window.removeEventListener("mousemove", t), window.removeEventListener("mouseup", l), window.removeEventListener("touchmove", t), window.removeEventListener("touchend", l);
80
- };
81
- }, [b, u, p]);
82
- const U = E(() => c((t) => !t), []);
83
- return /* @__PURE__ */ m("div", { className: "relative", children: [
84
- a && /* @__PURE__ */ e(
85
- "audio",
86
- {
87
- ref: f,
88
- src: a,
89
- loop: !0,
90
- onCanPlay: () => g(!0),
91
- onEnded: () => {
92
- c(!1), h(0);
93
- },
94
- children: /* @__PURE__ */ e("track", { kind: "captions" })
95
- }
96
- ),
97
- /* @__PURE__ */ e(
98
- P,
99
- {
100
- thumbnailUrl: s,
101
- mimeType: r,
102
- overlayIcon: a && x ? n ? _ : F : void 0,
103
- onClick: a && x ? U : void 0
104
- }
105
- ),
106
- a && x && /* @__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(
107
- "div",
108
- {
109
- ref: w,
110
- role: "slider",
111
- "aria-label": "Playback position",
112
- "aria-valuenow": Math.round(i * 100),
113
- "aria-valuemin": 0,
114
- "aria-valuemax": 100,
115
- tabIndex: 0,
116
- className: "relative flex h-4 w-full cursor-pointer items-center",
117
- onMouseDown: (t) => {
118
- t.stopPropagation(), v(!0);
119
- const l = u(t);
120
- h(l), p(l);
121
- },
122
- onTouchStart: (t) => {
123
- t.stopPropagation(), v(!0);
124
- const l = u(t);
125
- h(l), p(l);
126
- },
127
- onClick: (t) => t.stopPropagation(),
128
- onKeyDown: (t) => {
129
- t.key === "ArrowRight" && p(Math.min(1, i + 0.05)), t.key === "ArrowLeft" && p(Math.max(0, i - 0.05));
130
- },
131
- children: /* @__PURE__ */ e("div", { className: "w-full overflow-hidden rounded-full bg-white/30 h-1", children: /* @__PURE__ */ e(
132
- "div",
133
- {
134
- className: "h-full rounded-full bg-white",
135
- style: { width: `${Math.round(i * 100)}%` }
136
- }
137
- ) })
138
- }
139
- ) })
140
- ] });
141
- }, K = (o) => {
142
- const { sourceUrl: a, thumbnailUrl: s, mimeType: r, title: n } = o, [c, i] = k(!1);
143
- return c && a ? /* @__PURE__ */ m("div", { className: "relative", children: [
144
- /* @__PURE__ */ e(
145
- "button",
146
- {
147
- type: "button",
148
- className: "block w-full cursor-pointer border-0 p-0 text-left appearance-none",
149
- onClick: () => i(!1),
150
- "aria-label": "Close preview",
151
- children: /* @__PURE__ */ e("img", { src: a, alt: n ?? "", className: "block w-full" })
152
- }
153
- ),
154
- /* @__PURE__ */ e(V, { onClose: () => i(!1) })
155
- ] }) : /* @__PURE__ */ e(
156
- P,
157
- {
158
- thumbnailUrl: s,
159
- mimeType: r,
160
- overlayIcon: a ? M : void 0,
161
- onClick: a ? () => i(!0) : void 0
162
- }
163
- );
164
- }, V = ({ onClose: o }) => /* @__PURE__ */ e(
165
- "button",
166
- {
167
- type: "button",
168
- onClick: o,
169
- className: "absolute left-3 top-3 z-40 flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
170
- "aria-label": "Close preview",
171
- children: /* @__PURE__ */ e(R, { className: "size-4", weight: "fill" })
172
- }
173
- ), G = (o) => {
174
- const { sourceUrl: a, thumbnailUrl: s, mimeType: r } = o, [n, c] = k(!1), i = () => {
175
- c(!1);
176
- };
177
- return a ? /* @__PURE__ */ m(
178
- "div",
179
- {
180
- className: C("relative overflow-hidden", {
181
- "aspect-video": !n
182
- }),
183
- children: [
184
- /* @__PURE__ */ e(
185
- q,
186
- {
187
- source: a,
188
- mimeType: r,
189
- poster: s,
190
- playing: n,
191
- loop: !0,
192
- controls: !1,
193
- muted: !0,
194
- showProgress: !0,
195
- onContainerClick: i
196
- }
197
- ),
198
- !n && /* @__PURE__ */ m(
199
- "button",
200
- {
201
- type: "button",
202
- className: "absolute inset-0 block cursor-pointer border-0 p-0 text-left appearance-none",
203
- onClick: () => c(!0),
204
- "aria-label": "Expand video preview",
205
- children: [
206
- s ? /* @__PURE__ */ e(
207
- "img",
208
- {
209
- src: s,
210
- alt: "",
211
- className: "absolute inset-0 h-full w-full object-cover"
212
- }
213
- ) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: I(r, {
214
- className: "size-12 text-black/20",
215
- weight: "regular"
216
- }) }),
217
- /* @__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" }) })
218
- ]
219
- }
220
- ),
221
- n && /* @__PURE__ */ e(H, { onClose: i })
222
- ]
223
- }
224
- ) : /* @__PURE__ */ e(P, { thumbnailUrl: s, mimeType: r });
225
- }, H = ({ onClose: o }) => /* @__PURE__ */ e(
226
- "button",
227
- {
228
- type: "button",
229
- onClick: o,
230
- className: "absolute left-3 top-3 z-40 flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
231
- "aria-label": "Close preview",
232
- children: /* @__PURE__ */ e(R, { className: "size-4", weight: "fill" })
233
- }
234
- ), ee = (o) => {
235
- const {
236
- title: a,
237
- mimeType: s = "application/octet-stream",
238
- thumbnailUrl: r,
239
- sourceUrl: n,
240
- detail: c,
241
- amountText: i,
242
- placeholderTitle: h = "Attachment title",
243
- placeholderAmountText: b,
244
- paymentStatus: v,
245
- onDismiss: f,
246
- isPreview: w = !1
247
- } = o, d = O(s), x = i ?? b, g = !i && !!b;
248
- let u;
249
- return w && d === "audio" ? u = /* @__PURE__ */ e(
250
- $,
251
- {
252
- sourceUrl: n,
253
- thumbnailUrl: r,
254
- mimeType: s
255
- },
256
- n
257
- ) : w && d === "video" ? u = /* @__PURE__ */ e(
258
- G,
259
- {
260
- sourceUrl: n,
261
- thumbnailUrl: r,
262
- mimeType: s
263
- },
264
- n
265
- ) : w && d === "image" ? u = /* @__PURE__ */ e(
266
- K,
267
- {
268
- sourceUrl: n,
269
- thumbnailUrl: r,
270
- mimeType: s,
271
- title: a
272
- },
273
- n
274
- ) : u = /* @__PURE__ */ e(
275
- P,
276
- {
277
- thumbnailUrl: r,
278
- mimeType: s,
279
- overlayIcon: f ? void 0 : v === "paid" ? D : B,
280
- darkOverlay: !0
281
- }
282
- ), /* @__PURE__ */ m("div", { className: "relative w-[280px] select-none overflow-hidden rounded-[24px] bg-white shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]", children: [
283
- f && /* @__PURE__ */ e(
284
- "button",
285
- {
286
- type: "button",
287
- onClick: f,
288
- className: "absolute right-3 top-3 z-50 flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
289
- "aria-label": "Dismiss attachment",
290
- children: /* @__PURE__ */ e(S, { className: "size-4", weight: "bold" })
291
- }
292
- ),
293
- u,
294
- /* @__PURE__ */ m("div", { className: "px-4 pb-3 pt-3", children: [
295
- /* @__PURE__ */ e(
296
- "p",
297
- {
298
- className: C("mb-1.5 truncate text-base font-medium", {
299
- "text-black/30": !a,
300
- "text-black": !!a
301
- }),
302
- children: a || h
303
- }
304
- ),
305
- /* @__PURE__ */ m("div", { className: "flex items-center gap-1", children: [
306
- I(s, {
307
- className: "size-5 shrink-0 text-black/55",
308
- weight: "regular"
309
- }),
310
- c && /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: c }),
311
- v === "paid" ? /* @__PURE__ */ m(L, { children: [
312
- /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
313
- /* @__PURE__ */ e("span", { className: "text-xs font-medium text-[#008236]", children: "Purchased" }),
314
- /* @__PURE__ */ e(
315
- X,
316
- {
317
- className: "size-4 text-[#008236]",
318
- weight: "bold"
319
- }
320
- )
321
- ] }) : x && /* @__PURE__ */ m(L, { children: [
322
- /* @__PURE__ */ e(
323
- "span",
324
- {
325
- className: C("text-xs font-medium", {
326
- "text-black/30": g,
327
- "text-black/55": !g
328
- }),
329
- children: "•"
330
- }
331
- ),
332
- /* @__PURE__ */ e(
333
- "span",
334
- {
335
- className: C("text-xs font-medium", {
336
- "text-black/30": g,
337
- "text-black/55": !g
338
- }),
339
- children: x
340
- }
341
- )
342
- ] })
343
- ] })
344
- ] })
345
- ] });
346
- };
347
- export {
348
- ee as default
349
- };
350
- //# sourceMappingURL=Card-C5t3dZ5q.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Card-C5t3dZ5q.js","sources":["../src/components/LockedAttachment/components/Creator/CardCollapsedThumbnail.tsx","../src/components/LockedAttachment/components/Creator/CardAudioPreview.tsx","../src/components/LockedAttachment/components/Creator/CardImagePreview.tsx","../src/components/LockedAttachment/components/Creator/CardVideoPreview.tsx","../src/components/LockedAttachment/components/Creator/Card.tsx"],"sourcesContent":["import classNames from 'classnames'\nimport React from 'react'\n\nimport { renderTypeIcon } from '../../utils/icons'\n\ninterface CollapsedThumbnailProps {\n thumbnailUrl?: string\n mimeType: string\n overlayIcon?: React.ElementType\n darkOverlay?: boolean\n onClick?: () => void\n}\n\nconst CollapsedThumbnail: React.FC<CollapsedThumbnailProps> = ({\n thumbnailUrl,\n mimeType,\n overlayIcon: OverlayIcon,\n darkOverlay,\n onClick,\n}) => {\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 {thumbnailUrl ? (\n <img\n src={thumbnailUrl}\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 {darkOverlay && (\n <div className=\"pointer-events-none absolute inset-0 bg-black/30\" />\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\nexport default CollapsedThumbnail\n","import { PauseIcon, PlayIcon } from '@phosphor-icons/react'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport CollapsedThumbnail from './CardCollapsedThumbnail'\n\ninterface AudioPreviewProps {\n sourceUrl?: string\n thumbnailUrl?: string\n mimeType: string\n}\n\nconst AudioPreview: React.FC<AudioPreviewProps> = (props) => {\n const { sourceUrl, thumbnailUrl, 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 const [audioReady, setAudioReady] = useState(false)\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 {sourceUrl && (\n <audio\n ref={audioRef}\n src={sourceUrl}\n loop\n onCanPlay={() => setAudioReady(true)}\n onEnded={() => {\n setPlaying(false)\n setPlayed(0)\n }}\n >\n <track kind=\"captions\" />\n </audio>\n )}\n <CollapsedThumbnail\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n overlayIcon={\n sourceUrl && audioReady ? (playing ? PauseIcon : PlayIcon) : undefined\n }\n onClick={sourceUrl && audioReady ? toggle : undefined}\n />\n {sourceUrl && audioReady && (\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\nexport default AudioPreview\n","import { EyeIcon, EyeSlashIcon } from '@phosphor-icons/react'\nimport { useState } from 'react'\n\nimport CollapsedThumbnail from './CardCollapsedThumbnail'\n\ninterface ImagePreviewProps {\n sourceUrl?: string\n thumbnailUrl?: string\n mimeType: string\n title?: string\n}\n\nconst ImagePreview: React.FC<ImagePreviewProps> = (props) => {\n const { sourceUrl, thumbnailUrl, mimeType, title } = props\n const [expanded, setExpanded] = useState(false)\n\n if (expanded && sourceUrl) {\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={() => setExpanded(false)}\n aria-label=\"Close preview\"\n >\n <img src={sourceUrl} alt={title ?? ''} className=\"block w-full\" />\n </button>\n <CloseButton onClose={() => setExpanded(false)} />\n </div>\n )\n }\n\n return (\n <CollapsedThumbnail\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n overlayIcon={sourceUrl ? EyeSlashIcon : undefined}\n onClick={sourceUrl ? () => setExpanded(true) : undefined}\n />\n )\n}\n\nconst CloseButton: React.FC<{ onClose: () => void }> = ({ onClose }) => {\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\nexport default ImagePreview\n","import { EyeIcon, EyeSlashIcon } from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useState } from 'react'\n\nimport { renderTypeIcon } from '../../utils/icons'\nimport MediaPlayer from '../MediaPlayer'\n\nimport CollapsedThumbnail from './CardCollapsedThumbnail'\n\ninterface VideoPreviewProps {\n sourceUrl?: string\n thumbnailUrl?: string\n mimeType: string\n}\n\nconst VideoPreview: React.FC<VideoPreviewProps> = (props) => {\n const { sourceUrl, thumbnailUrl, mimeType } = props\n const [expanded, setExpanded] = useState(false)\n\n const collapse = () => {\n setExpanded(false)\n }\n\n if (!sourceUrl) {\n return (\n <CollapsedThumbnail thumbnailUrl={thumbnailUrl} mimeType={mimeType} />\n )\n }\n\n return (\n <div\n className={classNames('relative overflow-hidden', {\n 'aspect-video': !expanded,\n })}\n >\n <MediaPlayer\n source={sourceUrl}\n mimeType={mimeType}\n poster={thumbnailUrl}\n playing={expanded}\n loop={true}\n controls={false}\n muted={true}\n showProgress={true}\n onContainerClick={collapse}\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 {thumbnailUrl ? (\n <img\n src={thumbnailUrl}\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\nconst CloseButton: React.FC<{ onClose: () => void }> = ({ onClose }) => {\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\nexport default VideoPreview\n","import {\n CheckCircleIcon,\n LockIcon,\n LockOpenIcon,\n XIcon,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React from 'react'\n\nimport type { LockedAttachmentBaseProps } from '../../types'\nimport { renderTypeIcon } from '../../utils/icons'\nimport { getSourceType } from '../../utils/mimeType'\n\nimport AudioPreview from './CardAudioPreview'\nimport CollapsedThumbnail from './CardCollapsedThumbnail'\nimport ImagePreview from './CardImagePreview'\nimport VideoPreview from './CardVideoPreview'\n\nexport interface CreatorCardProps extends LockedAttachmentBaseProps {\n isPreview?: boolean\n placeholderTitle?: string\n placeholderAmountText?: string\n sourceUrl?: string\n onDismiss?: () => void\n}\n\nconst CreatorCard: React.FC<CreatorCardProps> = (props) => {\n const {\n title,\n mimeType = 'application/octet-stream',\n thumbnailUrl,\n sourceUrl,\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\n key={sourceUrl}\n sourceUrl={sourceUrl}\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n />\n )\n } else if (isPreview && sourceType === 'video') {\n mediaPreview = (\n <VideoPreview\n key={sourceUrl}\n sourceUrl={sourceUrl}\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n />\n )\n } else if (isPreview && sourceType === 'image') {\n mediaPreview = (\n <ImagePreview\n key={sourceUrl}\n sourceUrl={sourceUrl}\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n title={title}\n />\n )\n } else {\n const lockedOverlayIcon = onDismiss\n ? undefined\n : paymentStatus === 'paid'\n ? LockOpenIcon\n : LockIcon\n mediaPreview = (\n <CollapsedThumbnail\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n overlayIcon={lockedOverlayIcon}\n darkOverlay\n />\n )\n }\n\n return (\n <div className=\"relative w-[280px] select-none overflow-hidden rounded-[24px] bg-white shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]\">\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":["CollapsedThumbnail","thumbnailUrl","mimeType","OverlayIcon","darkOverlay","onClick","jsxs","classNames","jsx","AudioPreview","props","sourceUrl","playing","setPlaying","useState","played","setPlayed","seeking","setSeeking","audioRef","useRef","trackRef","rafRef","useEffect","el","tick","audioReady","setAudioReady","getFraction","useCallback","e","track","clientX","_a","_b","rect","seekTo","fraction","onMove","f","onUp","toggle","p","PauseIcon","PlayIcon","ImagePreview","title","expanded","setExpanded","CloseButton","EyeSlashIcon","onClose","EyeIcon","VideoPreview","collapse","MediaPlayer","CreatorCard","detail","amountText","placeholderTitle","placeholderAmountText","paymentStatus","onDismiss","isPreview","sourceType","getSourceType","displayAmountText","isPlaceholderAmount","mediaPreview","LockOpenIcon","LockIcon","XIcon","renderTypeIcon","Fragment","CheckCircleIcon"],"mappings":"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"}
@@ -1,205 +0,0 @@
1
- import { jsx as e, jsxs as c, Fragment as y } from "react/jsx-runtime";
2
- import { LockSimpleIcon as I, DownloadSimpleIcon as D, CheckCircleIcon as M, LockOpenIcon as R } from "@phosphor-icons/react";
3
- import O, { useState as z, useRef as g, useCallback as L, useEffect as T } from "react";
4
- import { r as _, M as A, g as E } from "./MediaPlayer-BCsdmsON.js";
5
- const V = (n) => {
6
- const {
7
- isLocked: r,
8
- isUnlocking: s = !1,
9
- sourceUrl: t,
10
- redeemUrl: i,
11
- onUnlockClicked: a,
12
- onDownloadClicked: o
13
- } = n;
14
- return r && a != null ? /* @__PURE__ */ e(
15
- "button",
16
- {
17
- type: "button",
18
- onClick: a,
19
- disabled: s,
20
- className: "mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full bg-[#121110] px-4 text-sm font-medium leading-none text-white hover:bg-[#2a2928] disabled:opacity-70",
21
- children: s ? /* @__PURE__ */ e($, {}) : /* @__PURE__ */ c(O.Fragment, { children: [
22
- /* @__PURE__ */ e(I, { className: "size-4", weight: "fill" }),
23
- "Unlock"
24
- ] })
25
- }
26
- ) : !r && o != null && t != null ? /* @__PURE__ */ c(
27
- "a",
28
- {
29
- href: i ?? t,
30
- target: "_blank",
31
- rel: "noopener noreferrer",
32
- onClick: o,
33
- className: "mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full bg-[#121110] px-4 text-sm font-medium leading-none !text-white hover:bg-[#2a2928]",
34
- children: [
35
- /* @__PURE__ */ e(D, { className: "size-4", weight: "bold" }),
36
- "Download"
37
- ]
38
- }
39
- ) : null;
40
- }, $ = () => /* @__PURE__ */ c("span", { className: "flex items-center gap-1", children: [
41
- /* @__PURE__ */ e("span", { className: "size-1 rounded-full bg-white animate-bounce [animation-delay:-0.3s]" }),
42
- /* @__PURE__ */ e("span", { className: "size-1 rounded-full bg-white animate-bounce [animation-delay:-0.15s]" }),
43
- /* @__PURE__ */ e("span", { className: "size-1 rounded-full bg-white animate-bounce" })
44
- ] }), x = (n) => {
45
- const { thumbnailUrl: r, mimeType: s, LockIcon: t } = n;
46
- return /* @__PURE__ */ c("div", { className: "relative aspect-video overflow-hidden bg-black/5", children: [
47
- r != null ? /* @__PURE__ */ e(
48
- "img",
49
- {
50
- src: r,
51
- alt: "",
52
- className: "absolute inset-0 h-full w-full object-cover"
53
- }
54
- ) : /* @__PURE__ */ e("div", { className: "absolute inset-0 flex items-center justify-center", children: _(s, {
55
- className: "size-12 text-black/20",
56
- weight: "regular"
57
- }) }),
58
- t != null ? /* @__PURE__ */ e(q, { icon: t }) : null
59
- ] });
60
- }, q = ({ icon: n }) => /* @__PURE__ */ e("div", { className: "absolute inset-0 bg-black/30", children: /* @__PURE__ */ e("div", { className: "absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60", children: /* @__PURE__ */ e(n, { className: "size-4 text-white", weight: "fill" }) }) }), B = (n) => {
61
- const { sourceUrl: r, thumbnailUrl: s, mimeType: t, title: i, LockIcon: a } = n, [o, h] = z(!1);
62
- return a != null ? /* @__PURE__ */ e(
63
- x,
64
- {
65
- thumbnailUrl: s,
66
- mimeType: t,
67
- LockIcon: a
68
- }
69
- ) : /* @__PURE__ */ e("div", { className: "relative overflow-hidden bg-black/5", children: /* @__PURE__ */ e(
70
- "img",
71
- {
72
- src: r,
73
- alt: i,
74
- className: `block w-full transition-opacity duration-300 ${o ? "opacity-100" : "opacity-0"}`,
75
- onLoad: () => h(!0)
76
- }
77
- ) });
78
- }, F = (n) => {
79
- const { sourceUrl: r, thumbnailUrl: s, mimeType: t, LockIcon: i } = n;
80
- return i != null ? /* @__PURE__ */ e(
81
- x,
82
- {
83
- thumbnailUrl: s,
84
- mimeType: t,
85
- LockIcon: i
86
- }
87
- ) : /* @__PURE__ */ e(
88
- A,
89
- {
90
- source: r ?? "",
91
- mimeType: t,
92
- poster: s
93
- }
94
- );
95
- };
96
- function G(n) {
97
- return n === "paid" ? R : I;
98
- }
99
- const S = ({
100
- title: n,
101
- amountText: r,
102
- thumbnailUrl: s,
103
- mimeType: t = "application/octet-stream",
104
- detail: i,
105
- onUnlockClick: a,
106
- onFetchSource: o,
107
- onDownloadClick: h,
108
- paymentStatus: d,
109
- isUnlocking: j = !1
110
- }) => {
111
- const [l, C] = z(), w = g(!1), b = g(!1), u = g(o);
112
- u.current = o;
113
- const k = l === void 0, N = E(t), p = k ? G(d) : void 0, m = L(async () => {
114
- var v;
115
- if (!b.current) {
116
- b.current = !0;
117
- try {
118
- const U = await ((v = u.current) == null ? void 0 : v.call(u));
119
- U && C(U);
120
- } finally {
121
- b.current = !1;
122
- }
123
- }
124
- }, []);
125
- T(() => {
126
- if (!w.current) {
127
- w.current = !0;
128
- return;
129
- }
130
- d === "paid" && m();
131
- }, [d, m]);
132
- const P = L(() => {
133
- d === "paid" ? m() : a == null || a();
134
- }, [d, a, m]);
135
- let f;
136
- return N === "image" ? f = /* @__PURE__ */ e(
137
- B,
138
- {
139
- sourceUrl: l == null ? void 0 : l.sourceUrl,
140
- thumbnailUrl: s,
141
- mimeType: t,
142
- title: n,
143
- LockIcon: p
144
- },
145
- l == null ? void 0 : l.sourceUrl
146
- ) : N === "document" ? f = /* @__PURE__ */ e(
147
- x,
148
- {
149
- thumbnailUrl: s,
150
- mimeType: t,
151
- LockIcon: p
152
- },
153
- l == null ? void 0 : l.sourceUrl
154
- ) : f = /* @__PURE__ */ e(
155
- F,
156
- {
157
- sourceUrl: l == null ? void 0 : l.sourceUrl,
158
- thumbnailUrl: s,
159
- mimeType: t,
160
- LockIcon: p
161
- },
162
- l == null ? void 0 : l.sourceUrl
163
- ), /* @__PURE__ */ c("div", { className: "w-[280px] select-none overflow-hidden rounded-[24px] bg-white shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]", children: [
164
- f,
165
- /* @__PURE__ */ c("div", { className: "px-4 pb-3 pt-3", children: [
166
- /* @__PURE__ */ e("p", { className: "mb-1.5 truncate text-base font-medium text-black", children: n }),
167
- /* @__PURE__ */ c("div", { className: "flex items-center gap-1", children: [
168
- _(t, {
169
- className: "size-5 shrink-0 text-black/55",
170
- weight: "regular"
171
- }),
172
- i != null ? /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: i }) : null,
173
- d === "paid" ? /* @__PURE__ */ c(y, { children: [
174
- /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
175
- /* @__PURE__ */ e("span", { className: "text-xs font-medium text-[#008236]", children: "Purchased" }),
176
- /* @__PURE__ */ e(
177
- M,
178
- {
179
- className: "size-4 text-[#008236]",
180
- weight: "bold"
181
- }
182
- )
183
- ] }) : r != null ? /* @__PURE__ */ c(y, { children: [
184
- /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
185
- /* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: r })
186
- ] }) : null
187
- ] }),
188
- /* @__PURE__ */ e(
189
- V,
190
- {
191
- isLocked: k,
192
- isUnlocking: j,
193
- sourceUrl: l == null ? void 0 : l.sourceUrl,
194
- redeemUrl: l == null ? void 0 : l.redeemUrl,
195
- onUnlockClicked: P,
196
- onDownloadClicked: h
197
- }
198
- )
199
- ] })
200
- ] });
201
- };
202
- export {
203
- S as default
204
- };
205
- //# sourceMappingURL=Card-Cn2va-Qr.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Card-Cn2va-Qr.js","sources":["../src/components/LockedAttachment/components/Visitor/CardActions.tsx","../src/components/LockedAttachment/components/Visitor/CardThumbnailPreview.tsx","../src/components/LockedAttachment/components/Visitor/CardImagePreview.tsx","../src/components/LockedAttachment/components/Visitor/CardMediaPreview.tsx","../src/components/LockedAttachment/components/Visitor/Card.tsx"],"sourcesContent":["import { DownloadSimpleIcon, LockSimpleIcon } from '@phosphor-icons/react'\nimport React from 'react'\n\ninterface CardActionsProps {\n isLocked: boolean\n isUnlocking?: boolean\n sourceUrl?: string\n redeemUrl?: string\n onUnlockClicked?: () => void\n onDownloadClicked?: () => void\n}\n\nconst CardActions: React.FC<CardActionsProps> = (props) => {\n const {\n isLocked,\n isUnlocking = false,\n sourceUrl,\n redeemUrl,\n onUnlockClicked,\n onDownloadClicked,\n } = props\n\n if (isLocked && onUnlockClicked != null) {\n return (\n <button\n type=\"button\"\n onClick={onUnlockClicked}\n disabled={isUnlocking}\n className=\"mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full bg-[#121110] px-4 text-sm font-medium leading-none text-white hover:bg-[#2a2928] disabled:opacity-70\"\n >\n {isUnlocking ? (\n <LoadingDots />\n ) : (\n <React.Fragment>\n <LockSimpleIcon className=\"size-4\" weight=\"fill\" />\n Unlock\n </React.Fragment>\n )}\n </button>\n )\n }\n\n if (!isLocked && onDownloadClicked != null && sourceUrl != null) {\n return (\n <a\n href={redeemUrl ?? sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onDownloadClicked}\n className=\"mt-3 inline-flex h-10 w-full items-center justify-center gap-2 rounded-full bg-[#121110] px-4 text-sm font-medium leading-none !text-white hover:bg-[#2a2928]\"\n >\n <DownloadSimpleIcon className=\"size-4\" weight=\"bold\" />\n Download\n </a>\n )\n }\n\n return null\n}\n\nconst LoadingDots: React.FC = () => {\n return (\n <span className=\"flex items-center gap-1\">\n <span className=\"size-1 rounded-full bg-white animate-bounce [animation-delay:-0.3s]\" />\n <span className=\"size-1 rounded-full bg-white animate-bounce [animation-delay:-0.15s]\" />\n <span className=\"size-1 rounded-full bg-white animate-bounce\" />\n </span>\n )\n}\n\nexport default CardActions\n","import React from 'react'\n\nimport { renderTypeIcon } from '../../utils/icons'\n\ninterface ThumbnailPreviewProps {\n thumbnailUrl?: string\n mimeType: string\n LockIcon?: React.ElementType\n}\n\nconst ThumbnailPreview: React.FC<ThumbnailPreviewProps> = (props) => {\n const { thumbnailUrl, mimeType, LockIcon } = props\n\n return (\n <div className=\"relative aspect-video overflow-hidden bg-black/5\">\n {thumbnailUrl != null ? (\n <img\n src={thumbnailUrl}\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 {LockIcon != null ? <LockOverlay icon={LockIcon} /> : null}\n </div>\n )\n}\n\nconst LockOverlay: React.FC<{ icon: React.ElementType }> = ({ icon: Icon }) => {\n return (\n <div className=\"absolute inset-0 bg-black/30\">\n <div className=\"absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60\">\n <Icon className=\"size-4 text-white\" weight=\"fill\" />\n </div>\n </div>\n )\n}\n\nexport default ThumbnailPreview\n","import React, { useState } from 'react'\n\nimport ThumbnailPreview from './CardThumbnailPreview'\n\ninterface ImagePreviewProps {\n sourceUrl?: string\n thumbnailUrl?: string\n mimeType: string\n title?: string\n LockIcon?: React.ElementType\n}\n\nconst ImagePreview: React.FC<ImagePreviewProps> = (props) => {\n const { sourceUrl, thumbnailUrl, mimeType, title, LockIcon } = props\n const [sourceReady, setSourceReady] = useState(false)\n\n if (LockIcon != null) {\n return (\n <ThumbnailPreview\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n LockIcon={LockIcon}\n />\n )\n }\n\n return (\n <div className=\"relative overflow-hidden bg-black/5\">\n <img\n src={sourceUrl}\n alt={title}\n className={`block w-full transition-opacity duration-300 ${sourceReady ? 'opacity-100' : 'opacity-0'}`}\n onLoad={() => setSourceReady(true)}\n />\n </div>\n )\n}\n\nexport default ImagePreview\n","import React from 'react'\n\nimport MediaPlayer from '../MediaPlayer'\n\nimport ThumbnailPreview from './CardThumbnailPreview'\n\ninterface MediaPreviewProps {\n sourceUrl?: string\n thumbnailUrl?: string\n mimeType: string\n LockIcon?: React.ElementType\n}\n\nconst MediaPreview: React.FC<MediaPreviewProps> = (props) => {\n const { sourceUrl, thumbnailUrl, mimeType, LockIcon } = props\n\n if (LockIcon != null) {\n return (\n <ThumbnailPreview\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n LockIcon={LockIcon}\n />\n )\n }\n\n return (\n <MediaPlayer\n source={sourceUrl ?? ''}\n mimeType={mimeType}\n poster={thumbnailUrl}\n />\n )\n}\n\nexport default MediaPreview\n","import {\n CheckCircleIcon,\n LockOpenIcon,\n LockSimpleIcon,\n} from '@phosphor-icons/react'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type {\n LockedAttachmentBaseProps,\n LockedAttachmentSource,\n PaymentStatus,\n} from '../../types'\nimport { renderTypeIcon } from '../../utils/icons'\nimport { getSourceType } from '../../utils/mimeType'\n\nimport CardActions from './CardActions'\nimport ImagePreview from './CardImagePreview'\nimport MediaPreview from './CardMediaPreview'\nimport ThumbnailPreview from './CardThumbnailPreview'\n\nexport interface VisitorCardProps extends LockedAttachmentBaseProps {\n /**\n * Called when the visitor clicks Unlock on an unpaid attachment.\n * Use this to open a checkout flow. Omit to hide the Unlock button.\n */\n onUnlockClick?: () => void\n /**\n * Called to fetch the attachment source — fired automatically when\n * paymentStatus transitions to 'paid', or immediately on click when\n * paymentStatus is already 'paid'. Return a LockedAttachmentSource to\n * unlock the card.\n */\n onFetchSource?: () => Promise<LockedAttachmentSource | void>\n /**\n * Called when the visitor clicks Download on an unlocked card.\n * Omit to hide the Download button.\n */\n onDownloadClick?: () => void\n /**\n * When true, shows loading dots on the Unlock button.\n * Driven by the LockedAttachmentContext (e.g. checkout in progress, payment processing).\n */\n isUnlocking?: boolean\n}\n\nfunction getLockIcon(paymentStatus?: PaymentStatus): React.ElementType {\n return paymentStatus === 'paid' ? LockOpenIcon : LockSimpleIcon\n}\n\nconst VisitorCard: React.FC<VisitorCardProps> = ({\n title,\n amountText,\n thumbnailUrl,\n mimeType = 'application/octet-stream',\n detail,\n onUnlockClick,\n onFetchSource,\n onDownloadClick,\n paymentStatus,\n isUnlocking = false,\n}) => {\n const [source, setSource] = useState<LockedAttachmentSource | undefined>()\n const hasMounted = useRef(false)\n const fetchingRef = useRef(false)\n // Stable ref so fetchSource doesn't change identity when onFetchSource prop changes\n const onFetchSourceRef = useRef(onFetchSource)\n onFetchSourceRef.current = onFetchSource\n\n const isLocked = source === undefined\n const sourceType = getSourceType(mimeType)\n const LockIcon = isLocked ? getLockIcon(paymentStatus) : undefined\n\n const fetchSource = useCallback(async (): Promise<void> => {\n if (fetchingRef.current) return\n fetchingRef.current = true\n try {\n const result = await onFetchSourceRef.current?.()\n if (result) setSource(result)\n } finally {\n fetchingRef.current = false\n }\n }, []) // stable — reads onFetchSource via ref\n\n // When paymentStatus transitions to 'paid' (e.g. after checkout completes),\n // automatically fetch the source. Skipped on mount.\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true\n return\n }\n\n if (paymentStatus === 'paid') {\n void fetchSource()\n }\n }, [paymentStatus, fetchSource])\n\n const handleUnlockClick = useCallback(() => {\n if (paymentStatus === 'paid') {\n void fetchSource()\n } else {\n onUnlockClick?.()\n }\n }, [paymentStatus, onUnlockClick, fetchSource])\n\n let mediaPreview: React.ReactNode\n if (sourceType === 'image') {\n mediaPreview = (\n <ImagePreview\n key={source?.sourceUrl}\n sourceUrl={source?.sourceUrl}\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n title={title}\n LockIcon={LockIcon}\n />\n )\n } else if (sourceType === 'document') {\n mediaPreview = (\n <ThumbnailPreview\n key={source?.sourceUrl}\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n LockIcon={LockIcon}\n />\n )\n } else {\n mediaPreview = (\n <MediaPreview\n key={source?.sourceUrl}\n sourceUrl={source?.sourceUrl}\n thumbnailUrl={thumbnailUrl}\n mimeType={mimeType}\n LockIcon={LockIcon}\n />\n )\n }\n\n return (\n <div className=\"w-[280px] select-none overflow-hidden rounded-[24px] bg-white shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]\">\n {mediaPreview}\n <div className=\"px-4 pb-3 pt-3\">\n <p className=\"mb-1.5 truncate text-base font-medium text-black\">\n {title}\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 != null ? (\n <span className=\"text-xs font-medium text-black/55\">{detail}</span>\n ) : null}\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 ) : amountText != null ? (\n <>\n <span className=\"text-xs font-medium text-black/55\">•</span>\n <span className=\"text-xs font-medium text-black/55\">\n {amountText}\n </span>\n </>\n ) : null}\n </div>\n <CardActions\n isLocked={isLocked}\n isUnlocking={isUnlocking}\n sourceUrl={source?.sourceUrl}\n redeemUrl={source?.redeemUrl}\n onUnlockClicked={handleUnlockClick}\n onDownloadClicked={onDownloadClick}\n />\n </div>\n </div>\n )\n}\n\nexport default VisitorCard\n"],"names":["CardActions","props","isLocked","isUnlocking","sourceUrl","redeemUrl","onUnlockClicked","onDownloadClicked","jsx","LoadingDots","jsxs","React","LockSimpleIcon","DownloadSimpleIcon","ThumbnailPreview","thumbnailUrl","mimeType","LockIcon","LockOverlay","Icon","ImagePreview","title","sourceReady","setSourceReady","useState","MediaPreview","MediaPlayer","getLockIcon","paymentStatus","LockOpenIcon","VisitorCard","amountText","detail","onUnlockClick","onFetchSource","onDownloadClick","source","setSource","hasMounted","useRef","fetchingRef","onFetchSourceRef","sourceType","getSourceType","fetchSource","useCallback","result","_a","useEffect","handleUnlockClick","mediaPreview","renderTypeIcon","Fragment","CheckCircleIcon"],"mappings":"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"}