@linktr.ee/messaging-react 1.36.0 → 1.38.0-rc-1777583423
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Card-BlXnKGaR.js +127 -0
- package/dist/Card-BlXnKGaR.js.map +1 -0
- package/dist/Card-DoNJA-jg.js +138 -0
- package/dist/Card-DoNJA-jg.js.map +1 -0
- package/dist/{index-DOsC03ZN.js → index-jnKl3mQ0.js} +1404 -1352
- package/dist/index-jnKl3mQ0.js.map +1 -0
- package/dist/index.d.ts +21 -1
- package/dist/index.js +15 -13
- package/package.json +2 -2
- package/src/components/{LockedAttachment/components → AttachmentCard}/MediaPlayer.tsx +4 -3
- package/src/components/AttachmentCard/Thumbnail.tsx +150 -0
- package/src/components/AttachmentCard/index.tsx +112 -0
- package/src/components/LockedAttachment/components/Creator/Card.tsx +123 -113
- package/src/components/LockedAttachment/components/Visitor/Card.tsx +43 -42
- package/src/components/LockedAttachment/components/Visitor/LockBadge.tsx +12 -0
- package/src/components/MediaMessage/MediaMessage.stories.tsx +45 -4
- package/src/components/MediaMessage/MediaMessage.test.tsx +125 -160
- package/src/components/MediaMessage/index.tsx +226 -349
- package/src/index.ts +7 -3
- package/src/providers/MessagingProvider.test.tsx +126 -0
- package/dist/Card-BHrnmHeu.js +0 -167
- package/dist/Card-BHrnmHeu.js.map +0 -1
- package/dist/Card-D4vEgqWt.js +0 -195
- package/dist/Card-D4vEgqWt.js.map +0 -1
- package/dist/index-DOsC03ZN.js.map +0 -1
- package/src/components/LockedAttachment/components/Creator/CardThumbnail.tsx +0 -114
- package/src/components/LockedAttachment/components/Visitor/CardThumbnail.tsx +0 -81
- /package/src/components/{LockedAttachment → AttachmentCard}/utils/icons.ts +0 -0
- /package/src/components/{LockedAttachment → AttachmentCard}/utils/mimeType.test.ts +0 -0
- /package/src/components/{LockedAttachment → AttachmentCard}/utils/mimeType.ts +0 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { jsx as e, jsxs as o } from "react/jsx-runtime";
|
|
2
|
+
import { LockSimpleIcon as N, DownloadSimpleIcon as A, LockOpenIcon as D, CheckCircleIcon as y } from "@phosphor-icons/react";
|
|
3
|
+
import v, { useState as B, useRef as p, useCallback as w, useEffect as O } from "react";
|
|
4
|
+
import { A as E, a as F } from "./index-jnKl3mQ0.js";
|
|
5
|
+
const P = (r) => {
|
|
6
|
+
const {
|
|
7
|
+
isUnlocking: s = !1,
|
|
8
|
+
sourceUrl: a,
|
|
9
|
+
redeemUrl: d,
|
|
10
|
+
onUnlockClicked: f,
|
|
11
|
+
onDownloadClicked: n
|
|
12
|
+
} = r, c = a === void 0;
|
|
13
|
+
return c && f != null ? /* @__PURE__ */ e(
|
|
14
|
+
"button",
|
|
15
|
+
{
|
|
16
|
+
type: "button",
|
|
17
|
+
onClick: f,
|
|
18
|
+
disabled: s,
|
|
19
|
+
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",
|
|
20
|
+
children: s ? /* @__PURE__ */ e("span", { className: "size-4 animate-spin rounded-full border-2 border-white/30 border-t-white" }) : /* @__PURE__ */ o(v.Fragment, { children: [
|
|
21
|
+
/* @__PURE__ */ e(N, { className: "size-4", weight: "fill" }),
|
|
22
|
+
"Unlock"
|
|
23
|
+
] })
|
|
24
|
+
}
|
|
25
|
+
) : !c && n != null && a != null ? /* @__PURE__ */ o(
|
|
26
|
+
"a",
|
|
27
|
+
{
|
|
28
|
+
href: d ?? a,
|
|
29
|
+
target: "_blank",
|
|
30
|
+
rel: "noopener noreferrer",
|
|
31
|
+
onClick: n,
|
|
32
|
+
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]",
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ e(A, { className: "size-4", weight: "bold" }),
|
|
35
|
+
"Download"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
) : null;
|
|
39
|
+
}, V = ({
|
|
40
|
+
paymentStatus: r
|
|
41
|
+
}) => /* @__PURE__ */ e("div", { className: "absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white", children: r === "paid" ? /* @__PURE__ */ e(D, {}) : /* @__PURE__ */ e(N, {}) }), J = ({
|
|
42
|
+
title: r,
|
|
43
|
+
amountText: s,
|
|
44
|
+
thumbnailUrl: a,
|
|
45
|
+
mimeType: d = "application/octet-stream",
|
|
46
|
+
detail: f,
|
|
47
|
+
onUnlockClick: n,
|
|
48
|
+
onFetchSource: c,
|
|
49
|
+
onDownloadClick: U,
|
|
50
|
+
paymentStatus: l,
|
|
51
|
+
isUnlocking: C = !1
|
|
52
|
+
}) => {
|
|
53
|
+
const [t, I] = B(), b = p(null), g = p(!1), u = p(c);
|
|
54
|
+
u.current = c;
|
|
55
|
+
const x = t == null ? void 0 : t.sourceUrl, j = (t == null ? void 0 : t.thumbnailUrl) ?? a, z = t == null ? void 0 : t.redeemUrl, m = w(async () => {
|
|
56
|
+
var i;
|
|
57
|
+
if (!g.current) {
|
|
58
|
+
g.current = !0;
|
|
59
|
+
try {
|
|
60
|
+
const h = await ((i = u.current) == null ? void 0 : i.call(u));
|
|
61
|
+
h && I(h);
|
|
62
|
+
} finally {
|
|
63
|
+
g.current = !1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}, []), L = w(() => {
|
|
67
|
+
l === "paid" ? m() : n == null || n();
|
|
68
|
+
}, [l, m, n]);
|
|
69
|
+
O(() => {
|
|
70
|
+
if (!b.current || l !== "paid" || t !== void 0) return;
|
|
71
|
+
const i = new IntersectionObserver(
|
|
72
|
+
([h]) => {
|
|
73
|
+
h.isIntersecting && (m(), i.disconnect());
|
|
74
|
+
},
|
|
75
|
+
{ threshold: 1 }
|
|
76
|
+
);
|
|
77
|
+
return i.observe(b.current), () => i.disconnect();
|
|
78
|
+
}, [l, t, m]);
|
|
79
|
+
const k = x === void 0, R = l === "paid" ? /* @__PURE__ */ o(v.Fragment, { children: [
|
|
80
|
+
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
|
|
81
|
+
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-[#008236]", children: "Purchased" }),
|
|
82
|
+
/* @__PURE__ */ e(y, { className: "size-4 text-[#008236]", weight: "bold" })
|
|
83
|
+
] }) : s != null ? /* @__PURE__ */ o(v.Fragment, { children: [
|
|
84
|
+
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: "•" }),
|
|
85
|
+
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-black/55", children: s })
|
|
86
|
+
] }) : null;
|
|
87
|
+
return /* @__PURE__ */ e(
|
|
88
|
+
E,
|
|
89
|
+
{
|
|
90
|
+
variant: "light",
|
|
91
|
+
rootRef: b,
|
|
92
|
+
"data-testid": "locked-attachment",
|
|
93
|
+
title: r,
|
|
94
|
+
mimeType: d,
|
|
95
|
+
detail: f,
|
|
96
|
+
statusBadge: R,
|
|
97
|
+
thumbnail: /* @__PURE__ */ o("div", { className: "relative", children: [
|
|
98
|
+
/* @__PURE__ */ e(
|
|
99
|
+
F,
|
|
100
|
+
{
|
|
101
|
+
mimeType: d,
|
|
102
|
+
sourceUrl: x,
|
|
103
|
+
thumbnailUrl: j,
|
|
104
|
+
title: r,
|
|
105
|
+
variant: "light",
|
|
106
|
+
containedImage: !k
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
k && /* @__PURE__ */ e("div", { className: "pointer-events-none absolute inset-0 bg-black/30", children: /* @__PURE__ */ e(V, { paymentStatus: l }) })
|
|
110
|
+
] }),
|
|
111
|
+
action: /* @__PURE__ */ e(
|
|
112
|
+
P,
|
|
113
|
+
{
|
|
114
|
+
isUnlocking: C,
|
|
115
|
+
sourceUrl: x,
|
|
116
|
+
redeemUrl: z,
|
|
117
|
+
onUnlockClicked: L,
|
|
118
|
+
onDownloadClicked: U
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
};
|
|
124
|
+
export {
|
|
125
|
+
J as default
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=Card-BlXnKGaR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card-BlXnKGaR.js","sources":["../src/components/LockedAttachment/components/Visitor/CardActions.tsx","../src/components/LockedAttachment/components/Visitor/LockBadge.tsx","../src/components/LockedAttachment/components/Visitor/Card.tsx"],"sourcesContent":["import { DownloadSimpleIcon, LockSimpleIcon } from '@phosphor-icons/react'\nimport React from 'react'\n\ninterface CardActionsProps {\n sourceUrl?: string\n redeemUrl?: string\n onUnlockClicked?: () => void\n onDownloadClicked?: () => void\n isUnlocking?: boolean\n}\n\nconst CardActions: React.FC<CardActionsProps> = (props) => {\n const {\n isUnlocking = false,\n sourceUrl,\n redeemUrl,\n onUnlockClicked,\n onDownloadClicked,\n } = props\n\n const isLocked = sourceUrl === undefined\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 <span className=\"size-4 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\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\n\nexport default CardActions\n","import { LockOpenIcon, LockSimpleIcon } from '@phosphor-icons/react'\nimport React from 'react'\n\nimport type { PaymentStatus } from '../../types'\n\nexport const LockBadge: React.FC<{ paymentStatus?: PaymentStatus }> = ({\n paymentStatus,\n}) => (\n <div className=\"absolute left-3 top-3 flex size-8 items-center justify-center rounded-full bg-black/60 text-white\">\n {paymentStatus === 'paid' ? <LockOpenIcon /> : <LockSimpleIcon />}\n </div>\n)\n","import { CheckCircleIcon } from '@phosphor-icons/react'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport AttachmentCard, { AttachmentThumbnail } from '../../../AttachmentCard'\nimport type {\n LockedAttachmentBaseProps,\n LockedAttachmentSource,\n} from '../../types'\n\nimport CardActions from './CardActions'\nimport { LockBadge } from './LockBadge'\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\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\n const cardRef = useRef<HTMLDivElement>(null)\n const fetchingRef = useRef(false)\n\n const onFetchSourceRef = useRef(onFetchSource)\n onFetchSourceRef.current = onFetchSource\n\n const effectiveSourceUrl = source?.sourceUrl\n const effectiveThumbnail = source?.thumbnailUrl ?? thumbnailUrl\n const effectiveRedeemUrl = source?.redeemUrl\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 }, [])\n\n const handleUnlockClick = useCallback(() => {\n if (paymentStatus === 'paid') {\n void fetchSource()\n } else {\n onUnlockClick?.()\n }\n }, [paymentStatus, fetchSource, onUnlockClick])\n\n // Fetch source when card is in viewport\n useEffect(() => {\n if (!cardRef.current) return\n if (paymentStatus !== 'paid' || source !== undefined) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n void fetchSource()\n observer.disconnect()\n }\n },\n { threshold: 1.0 }\n )\n\n observer.observe(cardRef.current)\n return () => observer.disconnect()\n }, [paymentStatus, source, fetchSource])\n\n const isLocked = effectiveSourceUrl === undefined\n\n const statusBadge =\n paymentStatus === 'paid' ? (\n <React.Fragment>\n <span className=\"text-xs font-medium text-black/55\">•</span>\n <span className=\"text-xs font-medium text-[#008236]\">Purchased</span>\n <CheckCircleIcon className=\"size-4 text-[#008236]\" weight=\"bold\" />\n </React.Fragment>\n ) : amountText != null ? (\n <React.Fragment>\n <span className=\"text-xs font-medium text-black/55\">•</span>\n <span className=\"text-xs font-medium text-black/55\">{amountText}</span>\n </React.Fragment>\n ) : null\n\n return (\n <AttachmentCard\n variant=\"light\"\n rootRef={cardRef}\n data-testid=\"locked-attachment\"\n title={title}\n mimeType={mimeType}\n detail={detail}\n statusBadge={statusBadge}\n thumbnail={\n <div className=\"relative\">\n <AttachmentThumbnail\n mimeType={mimeType}\n sourceUrl={effectiveSourceUrl}\n thumbnailUrl={effectiveThumbnail}\n title={title}\n variant=\"light\"\n containedImage={!isLocked}\n />\n {isLocked && (\n <div className=\"pointer-events-none absolute inset-0 bg-black/30\">\n <LockBadge paymentStatus={paymentStatus} />\n </div>\n )}\n </div>\n }\n action={\n <CardActions\n isUnlocking={isUnlocking}\n sourceUrl={effectiveSourceUrl}\n redeemUrl={effectiveRedeemUrl}\n onUnlockClicked={handleUnlockClick}\n onDownloadClicked={onDownloadClick}\n />\n }\n />\n )\n}\n\nexport default VisitorCard\n"],"names":["CardActions","props","isUnlocking","sourceUrl","redeemUrl","onUnlockClicked","onDownloadClicked","isLocked","jsx","jsxs","React","LockSimpleIcon","DownloadSimpleIcon","LockBadge","paymentStatus","LockOpenIcon","VisitorCard","title","amountText","thumbnailUrl","mimeType","detail","onUnlockClick","onFetchSource","onDownloadClick","source","setSource","useState","cardRef","useRef","fetchingRef","onFetchSourceRef","effectiveSourceUrl","effectiveThumbnail","effectiveRedeemUrl","fetchSource","useCallback","result","_a","handleUnlockClick","useEffect","observer","entry","statusBadge","CheckCircleIcon","AttachmentCard","AttachmentThumbnail"],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { jsxs as b, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { CheckCircleIcon as C, XIcon as T, EyeIcon as B, EyeSlashIcon as D, LockOpenIcon as H, LockIcon as V } from "@phosphor-icons/react";
|
|
3
|
+
import y from "classnames";
|
|
4
|
+
import I, { useState as g, useRef as O, useCallback as P } from "react";
|
|
5
|
+
import { A as X, a as q } from "./index-jnKl3mQ0.js";
|
|
6
|
+
function G(d) {
|
|
7
|
+
const { onDismiss: n, onToggle: r, isExpanded: o, paymentStatus: l, isLoading: f } = d;
|
|
8
|
+
return n ? {
|
|
9
|
+
topLeft: void 0,
|
|
10
|
+
topRight: /* @__PURE__ */ e(
|
|
11
|
+
"button",
|
|
12
|
+
{
|
|
13
|
+
type: "button",
|
|
14
|
+
onClick: n,
|
|
15
|
+
className: "flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
|
|
16
|
+
"aria-label": "Dismiss attachment",
|
|
17
|
+
children: /* @__PURE__ */ e(T, { className: "size-4", weight: "bold" })
|
|
18
|
+
}
|
|
19
|
+
)
|
|
20
|
+
} : r ? {
|
|
21
|
+
topLeft: /* @__PURE__ */ e(
|
|
22
|
+
"button",
|
|
23
|
+
{
|
|
24
|
+
type: "button",
|
|
25
|
+
onClick: r,
|
|
26
|
+
className: "flex size-8 items-center justify-center rounded-full bg-black/60 text-white",
|
|
27
|
+
"aria-label": o ? "Hide preview" : "Show preview",
|
|
28
|
+
"aria-pressed": o,
|
|
29
|
+
children: /* @__PURE__ */ e(o ? B : D, { className: "size-4", weight: "fill" })
|
|
30
|
+
}
|
|
31
|
+
),
|
|
32
|
+
topRight: void 0
|
|
33
|
+
} : {
|
|
34
|
+
topLeft: /* @__PURE__ */ e("div", { className: "flex size-8 items-center justify-center rounded-full bg-black/60 text-white", children: f ? /* @__PURE__ */ e("span", { className: "size-4 animate-spin rounded-full border-2 border-white/30 border-t-white" }) : /* @__PURE__ */ e(l === "paid" ? H : V, { className: "size-4", weight: "fill" }) }),
|
|
35
|
+
topRight: void 0
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const Y = ({
|
|
39
|
+
title: d,
|
|
40
|
+
mimeType: n = "application/octet-stream",
|
|
41
|
+
thumbnailUrl: r,
|
|
42
|
+
detail: o,
|
|
43
|
+
amountText: l,
|
|
44
|
+
placeholderTitle: f = "Attachment title",
|
|
45
|
+
placeholderAmountText: x,
|
|
46
|
+
paymentStatus: m,
|
|
47
|
+
isUnlocking: L,
|
|
48
|
+
onDismiss: k,
|
|
49
|
+
onPreviewClick: c,
|
|
50
|
+
onFetchSource: u
|
|
51
|
+
}) => {
|
|
52
|
+
const [t, z] = g(), [a, h] = g(!1), [R, v] = g(!1), p = O(!1), w = a ? t == null ? void 0 : t.sourceUrl : void 0, j = a ? (t == null ? void 0 : t.thumbnailUrl) ?? r : r, s = R || L, U = P(async () => {
|
|
53
|
+
if (c == null || c(), a) {
|
|
54
|
+
h(!1);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (t) {
|
|
58
|
+
h(!0);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (u && !p.current) {
|
|
62
|
+
p.current = !0, v(!0);
|
|
63
|
+
try {
|
|
64
|
+
const N = await u();
|
|
65
|
+
N && (z(N), h(!0));
|
|
66
|
+
} finally {
|
|
67
|
+
p.current = !1, v(!1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}, [a, t, c, u]), i = u || c ? U : void 0, A = m === "paid" ? /* @__PURE__ */ b(I.Fragment, { children: [
|
|
71
|
+
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-white/55", children: "•" }),
|
|
72
|
+
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-[#34c759]", children: "Sold" }),
|
|
73
|
+
/* @__PURE__ */ e(C, { className: "size-4 text-[#34c759]", weight: "bold" })
|
|
74
|
+
] }) : /* @__PURE__ */ b(I.Fragment, { children: [
|
|
75
|
+
/* @__PURE__ */ e("span", { className: "text-xs font-medium text-white/55", children: "•" }),
|
|
76
|
+
/* @__PURE__ */ e(
|
|
77
|
+
"span",
|
|
78
|
+
{
|
|
79
|
+
className: y("text-xs font-medium", {
|
|
80
|
+
"text-white/30": !l,
|
|
81
|
+
"text-white/55": !!l
|
|
82
|
+
}),
|
|
83
|
+
children: l || x
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
] }), { topLeft: E, topRight: S } = G({
|
|
87
|
+
onDismiss: k,
|
|
88
|
+
onToggle: s ? void 0 : i,
|
|
89
|
+
isExpanded: a,
|
|
90
|
+
paymentStatus: m,
|
|
91
|
+
isLoading: s
|
|
92
|
+
});
|
|
93
|
+
return /* @__PURE__ */ e(
|
|
94
|
+
X,
|
|
95
|
+
{
|
|
96
|
+
variant: "dark",
|
|
97
|
+
title: d,
|
|
98
|
+
placeholderTitle: f,
|
|
99
|
+
mimeType: n,
|
|
100
|
+
detail: o,
|
|
101
|
+
statusBadge: A,
|
|
102
|
+
topLeft: E,
|
|
103
|
+
topRight: S,
|
|
104
|
+
thumbnail: /* @__PURE__ */ b(
|
|
105
|
+
"button",
|
|
106
|
+
{
|
|
107
|
+
type: "button",
|
|
108
|
+
disabled: !i || s,
|
|
109
|
+
className: y(
|
|
110
|
+
"relative block w-full overflow-hidden border-0 bg-white/10 p-0 text-left appearance-none",
|
|
111
|
+
{ "cursor-pointer": !!i && !s, "cursor-default": !i || s }
|
|
112
|
+
),
|
|
113
|
+
onClick: s ? void 0 : i,
|
|
114
|
+
"aria-label": i ? "Toggle preview" : void 0,
|
|
115
|
+
"aria-busy": s,
|
|
116
|
+
children: [
|
|
117
|
+
/* @__PURE__ */ e(
|
|
118
|
+
q,
|
|
119
|
+
{
|
|
120
|
+
mimeType: n,
|
|
121
|
+
sourceUrl: w,
|
|
122
|
+
thumbnailUrl: j,
|
|
123
|
+
title: d,
|
|
124
|
+
variant: "dark",
|
|
125
|
+
mediaPlayerProps: w ? { autoPlay: !0, loop: !0, controls: !0, muted: !1 } : void 0
|
|
126
|
+
}
|
|
127
|
+
),
|
|
128
|
+
!a && /* @__PURE__ */ e("div", { className: "pointer-events-none absolute inset-0 bg-black/30" })
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
export {
|
|
136
|
+
Y as default
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=Card-DoNJA-jg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card-DoNJA-jg.js","sources":["../src/components/LockedAttachment/components/Creator/Card.tsx"],"sourcesContent":["import {\n CheckCircleIcon,\n EyeIcon,\n EyeSlashIcon,\n LockIcon,\n LockOpenIcon,\n XIcon,\n} from '@phosphor-icons/react'\nimport classNames from 'classnames'\nimport React, { useCallback, useRef, useState } from 'react'\n\nimport AttachmentCard, { AttachmentThumbnail } from '../../../AttachmentCard'\nimport type {\n LockedAttachmentBaseProps,\n LockedAttachmentSource,\n PaymentStatus,\n} from '../../types'\n\nexport interface CreatorCardProps extends LockedAttachmentBaseProps {\n placeholderTitle?: string\n placeholderAmountText?: string\n isUnlocking?: boolean\n onDismiss?: () => void\n onPreviewClick?: () => void\n onFetchSource?: () => Promise<LockedAttachmentSource | void>\n}\n\nfunction headerSlots(props: {\n onDismiss?: () => void\n onToggle?: () => void\n isExpanded?: boolean\n paymentStatus?: PaymentStatus\n isLoading?: boolean\n}): { topLeft?: React.ReactNode; topRight?: React.ReactNode } {\n const { onDismiss, onToggle, isExpanded, paymentStatus, isLoading } = props\n\n if (onDismiss) {\n return {\n topLeft: undefined,\n topRight: (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"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 }\n }\n\n if (onToggle) {\n const Icon = isExpanded ? EyeIcon : EyeSlashIcon\n return {\n topLeft: (\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"flex size-8 items-center justify-center rounded-full bg-black/60 text-white\"\n aria-label={isExpanded ? 'Hide preview' : 'Show preview'}\n aria-pressed={isExpanded}\n >\n <Icon className=\"size-4\" weight=\"fill\" />\n </button>\n ),\n topRight: undefined,\n }\n }\n\n const Icon = paymentStatus === 'paid' ? LockOpenIcon : LockIcon\n\n return {\n topLeft: (\n <div className=\"flex size-8 items-center justify-center rounded-full bg-black/60 text-white\">\n {isLoading ? (\n <span className=\"size-4 animate-spin rounded-full border-2 border-white/30 border-t-white\" />\n ) : (\n <Icon className=\"size-4\" weight=\"fill\" />\n )}\n </div>\n ),\n topRight: undefined,\n }\n}\n\nconst CreatorCard: React.FC<CreatorCardProps> = ({\n title,\n mimeType = 'application/octet-stream',\n thumbnailUrl,\n detail,\n amountText,\n placeholderTitle = 'Attachment title',\n placeholderAmountText,\n paymentStatus,\n isUnlocking,\n onDismiss,\n onPreviewClick,\n onFetchSource,\n}) => {\n const [source, setSource] = useState<LockedAttachmentSource | undefined>()\n const [isPreviewVisible, setIsPreviewVisible] = useState(false)\n const [isLoadingPreview, setLoadingPreview] = useState(false)\n const fetchingRef = useRef(false)\n\n const effectiveSourceUrl = isPreviewVisible ? source?.sourceUrl : undefined\n const effectiveThumbnailUrl = isPreviewVisible ? (source?.thumbnailUrl ?? thumbnailUrl) : thumbnailUrl\n const isBusy = isLoadingPreview || isUnlocking\n\n const handleToggle = useCallback(async () => {\n onPreviewClick?.()\n if (isPreviewVisible) {\n setIsPreviewVisible(false)\n return\n }\n if (source) {\n setIsPreviewVisible(true)\n return\n }\n if (!onFetchSource) return\n if (fetchingRef.current) return\n fetchingRef.current = true\n setLoadingPreview(true)\n try {\n const result = await onFetchSource()\n if (result) {\n setSource(result)\n setIsPreviewVisible(true)\n }\n } finally {\n fetchingRef.current = false\n setLoadingPreview(false)\n }\n }, [isPreviewVisible, source, onPreviewClick, onFetchSource])\n\n const toggleHandler = onFetchSource || onPreviewClick ? handleToggle : undefined\n\n const statusBadge =\n paymentStatus === 'paid' ? (\n <React.Fragment>\n <span className=\"text-xs font-medium text-white/55\">•</span>\n <span className=\"text-xs font-medium text-[#34c759]\">Sold</span>\n <CheckCircleIcon className=\"size-4 text-[#34c759]\" weight=\"bold\" />\n </React.Fragment>\n ) : (\n <React.Fragment>\n <span className=\"text-xs font-medium text-white/55\">•</span>\n <span\n className={classNames('text-xs font-medium', {\n 'text-white/30': !amountText,\n 'text-white/55': !!amountText,\n })}\n >\n {amountText || placeholderAmountText}\n </span>\n </React.Fragment>\n )\n\n const { topLeft, topRight } = headerSlots({\n onDismiss,\n onToggle: isBusy ? undefined : toggleHandler,\n isExpanded: isPreviewVisible,\n paymentStatus,\n isLoading: isBusy,\n })\n\n return (\n <AttachmentCard\n variant=\"dark\"\n title={title}\n placeholderTitle={placeholderTitle}\n mimeType={mimeType}\n detail={detail}\n statusBadge={statusBadge}\n topLeft={topLeft}\n topRight={topRight}\n thumbnail={\n <button\n type=\"button\"\n disabled={!toggleHandler || isBusy}\n className={classNames(\n 'relative block w-full overflow-hidden border-0 bg-white/10 p-0 text-left appearance-none',\n { 'cursor-pointer': !!toggleHandler && !isBusy, 'cursor-default': !toggleHandler || isBusy }\n )}\n onClick={isBusy ? undefined : toggleHandler}\n aria-label={toggleHandler ? 'Toggle preview' : undefined}\n aria-busy={isBusy}\n >\n <AttachmentThumbnail\n mimeType={mimeType}\n sourceUrl={effectiveSourceUrl}\n thumbnailUrl={effectiveThumbnailUrl}\n title={title}\n variant=\"dark\"\n mediaPlayerProps={\n effectiveSourceUrl\n ? { autoPlay: true, loop: true, controls: true, muted: false }\n : undefined\n }\n />\n {!isPreviewVisible && (\n <div className=\"pointer-events-none absolute inset-0 bg-black/30\" />\n )}\n </button>\n }\n />\n )\n}\n\nexport default CreatorCard\n"],"names":["headerSlots","props","onDismiss","onToggle","isExpanded","paymentStatus","isLoading","jsx","XIcon","EyeIcon","EyeSlashIcon","LockOpenIcon","LockIcon","CreatorCard","title","mimeType","thumbnailUrl","detail","amountText","placeholderTitle","placeholderAmountText","isUnlocking","onPreviewClick","onFetchSource","source","setSource","useState","isPreviewVisible","setIsPreviewVisible","isLoadingPreview","setLoadingPreview","fetchingRef","useRef","effectiveSourceUrl","effectiveThumbnailUrl","isBusy","handleToggle","useCallback","result","toggleHandler","statusBadge","jsxs","React","CheckCircleIcon","classNames","topLeft","topRight","AttachmentCard","AttachmentThumbnail"],"mappings":"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"}
|