@linktr.ee/messaging-react 1.38.0-rc-1777583423 → 1.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Card-BlXnKGaR.js → Card-DwgUtqsA.js} +2 -2
- package/dist/{Card-BlXnKGaR.js.map → Card-DwgUtqsA.js.map} +1 -1
- package/dist/{Card-DoNJA-jg.js → Card-RgHsp9x1.js} +2 -2
- package/dist/{Card-DoNJA-jg.js.map → Card-RgHsp9x1.js.map} +1 -1
- package/dist/{index-jnKl3mQ0.js → index-B_4pciGp.js} +46 -45
- package/dist/{index-jnKl3mQ0.js.map → index-B_4pciGp.js.map} +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/components/AttachmentCard/index.tsx +11 -9
- package/src/components/MediaMessage/MediaMessage.test.tsx +34 -1
- package/src/components/MediaMessage/index.tsx +18 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as e, jsxs as o } from "react/jsx-runtime";
|
|
2
2
|
import { LockSimpleIcon as N, DownloadSimpleIcon as A, LockOpenIcon as D, CheckCircleIcon as y } from "@phosphor-icons/react";
|
|
3
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-
|
|
4
|
+
import { A as E, a as F } from "./index-B_4pciGp.js";
|
|
5
5
|
const P = (r) => {
|
|
6
6
|
const {
|
|
7
7
|
isUnlocking: s = !1,
|
|
@@ -124,4 +124,4 @@ const P = (r) => {
|
|
|
124
124
|
export {
|
|
125
125
|
J as default
|
|
126
126
|
};
|
|
127
|
-
//# sourceMappingURL=Card-
|
|
127
|
+
//# sourceMappingURL=Card-DwgUtqsA.js.map
|
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"Card-DwgUtqsA.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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"}
|
|
@@ -2,7 +2,7 @@ import { jsxs as b, jsx as e } from "react/jsx-runtime";
|
|
|
2
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
3
|
import y from "classnames";
|
|
4
4
|
import I, { useState as g, useRef as O, useCallback as P } from "react";
|
|
5
|
-
import { A as X, a as q } from "./index-
|
|
5
|
+
import { A as X, a as q } from "./index-B_4pciGp.js";
|
|
6
6
|
function G(d) {
|
|
7
7
|
const { onDismiss: n, onToggle: r, isExpanded: o, paymentStatus: l, isLoading: f } = d;
|
|
8
8
|
return n ? {
|
|
@@ -135,4 +135,4 @@ const Y = ({
|
|
|
135
135
|
export {
|
|
136
136
|
Y as default
|
|
137
137
|
};
|
|
138
|
-
//# sourceMappingURL=Card-
|
|
138
|
+
//# sourceMappingURL=Card-RgHsp9x1.js.map
|
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"Card-RgHsp9x1.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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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as e, jsxs as d, Fragment as fe } from "react/jsx-runtime";
|
|
2
2
|
import A from "classnames";
|
|
3
|
-
import
|
|
3
|
+
import z, { createContext as mt, useContext as ht, useCallback as U, useState as M, useRef as Q, useEffect as K, useMemo as ze, Suspense as ft } from "react";
|
|
4
4
|
import { StreamChatService as Ot } from "@linktr.ee/messaging-core";
|
|
5
5
|
import { Chat as Ut, ChannelList as $t, DateSeparator as zt, useChannelStateContext as ue, useChatContext as He, areMessageUIPropsEqual as jt, useMessageReminder as Bt, useComponentContext as gt, Attachment as Gt, EditMessageModal as Vt, MessageBlocked as Ht, MessageBouncePrompt as Yt, MessageDeleted as Wt, MessageIsThreadReplyInChannelButtonIndicator as qt, MessageRepliesCountButton as Xt, ReminderNotification as Zt, StreamedMessageText as Kt, messageHasAttachments as Jt, messageHasReactions as Qt, isDateSeparatorMessage as es, isMessageBlocked as ts, isMessageBounced as ss, MessageBounceModal as ns, MessageText as Qe, Poll as as, MessageErrorIcon as rs, useMessageContext as bt, useMessageComposer as is, useStateStore as os, MessageInput as ls, useMessageInputContext as cs, useMessageComposerHasSendableData as ds, SimpleAttachmentSelector as us, QuotedMessagePreview as ms, AttachmentPreviewList as hs, TextareaComposer as fs, MessageTimestamp as Fe, useTypingContext as gs, Channel as bs, WithComponents as xs, Window as ps, MessageList as vs } from "stream-chat-react";
|
|
6
6
|
import { StarIcon as je, GiftIcon as ws, XIcon as Ye, SpinnerGapIcon as Se, SignOutIcon as ys, ProhibitInsetIcon as et, FlagIcon as Ns, ArrowUpIcon as Cs, SparkleIcon as Be, ProhibitIcon as _s, ArrowLeftIcon as tt, CaretRightIcon as st, DotsThreeIcon as nt, MagnifyingGlassIcon as Es, ChatCircleDotsIcon as at, FileIcon as xt, ImageIcon as ks, SpeakerHighIcon as Ss, VideoCameraIcon as Is, FileMdIcon as Ms, FileTextIcon as Ts, FileZipIcon as Ds, FilePptIcon as Rs, FileCsvIcon as Ls, FileXlsIcon as Ps, FileDocIcon as As, FilePdfIcon as Fs, CircleNotchIcon as pt, PlayIcon as rt, PauseIcon as Os, LinkIcon as Us, DownloadSimpleIcon as $s } from "@phosphor-icons/react";
|
|
@@ -175,7 +175,7 @@ const vt = mt({
|
|
|
175
175
|
} finally {
|
|
176
176
|
C(!1), i("🔄 CONNECTION REFRESH FINISHED", { userId: s.id });
|
|
177
177
|
}
|
|
178
|
-
}, [c, s, i]), N =
|
|
178
|
+
}, [c, s, i]), N = z.useMemo(() => (i("💫 CONTEXT VALUE MEMOIZATION", {
|
|
179
179
|
hasService: !!c,
|
|
180
180
|
hasClient: !!u,
|
|
181
181
|
isConnected: f,
|
|
@@ -223,13 +223,13 @@ function js(t) {
|
|
|
223
223
|
for (const n of s)
|
|
224
224
|
t.state.addMessageSorted(n.message);
|
|
225
225
|
}
|
|
226
|
-
const wt =
|
|
226
|
+
const wt = z.createContext({
|
|
227
227
|
selectedChannel: void 0,
|
|
228
228
|
onChannelSelect: () => {
|
|
229
229
|
},
|
|
230
230
|
debug: !1,
|
|
231
231
|
renderMessagePreview: void 0
|
|
232
|
-
}), Bs = wt.Provider, Gs = () =>
|
|
232
|
+
}), Bs = wt.Provider, Gs = () => z.useContext(wt), yt = (t) => {
|
|
233
233
|
var r, o;
|
|
234
234
|
const [s, n] = M(
|
|
235
235
|
!!((o = (r = t == null ? void 0 : t.state) == null ? void 0 : r.membership) != null && o.pinned_at)
|
|
@@ -448,7 +448,7 @@ const ne = ({
|
|
|
448
448
|
m,
|
|
449
449
|
u
|
|
450
450
|
] }) });
|
|
451
|
-
}, Ct =
|
|
451
|
+
}, Ct = z.memo(
|
|
452
452
|
({ channel: t, unread: s }) => {
|
|
453
453
|
var F, N, b, k;
|
|
454
454
|
const { selectedChannel: n, onChannelSelect: r, debug: o, renderMessagePreview: l } = Gs(), i = (n == null ? void 0 : n.id) === (t == null ? void 0 : t.id), c = () => {
|
|
@@ -535,7 +535,7 @@ const ne = ({
|
|
|
535
535
|
}
|
|
536
536
|
);
|
|
537
537
|
Ct.displayName = "CustomChannelPreview";
|
|
538
|
-
const Qs = { last_message_at: -1 }, _t =
|
|
538
|
+
const Qs = { last_message_at: -1 }, _t = z.memo(
|
|
539
539
|
({
|
|
540
540
|
onChannelSelect: t,
|
|
541
541
|
selectedChannel: s,
|
|
@@ -549,9 +549,9 @@ const Qs = { last_message_at: -1 }, _t = j.memo(
|
|
|
549
549
|
customEmptyStateIndicator: u,
|
|
550
550
|
renderMessagePreview: m
|
|
551
551
|
}) => {
|
|
552
|
-
const f =
|
|
552
|
+
const f = z.useRef(0);
|
|
553
553
|
f.current++;
|
|
554
|
-
const { debug: v = !1 } = De(), a =
|
|
554
|
+
const { debug: v = !1 } = De(), a = z.useCallback(
|
|
555
555
|
(g) => {
|
|
556
556
|
for (const y of g)
|
|
557
557
|
js(y);
|
|
@@ -564,7 +564,7 @@ const Qs = { last_message_at: -1 }, _t = j.memo(
|
|
|
564
564
|
selectedChannelId: s == null ? void 0 : s.id,
|
|
565
565
|
filters: n
|
|
566
566
|
});
|
|
567
|
-
const C =
|
|
567
|
+
const C = z.useMemo(
|
|
568
568
|
() => ({
|
|
569
569
|
selectedChannel: s,
|
|
570
570
|
onChannelSelect: t,
|
|
@@ -669,10 +669,10 @@ const en = ({
|
|
|
669
669
|
}
|
|
670
670
|
);
|
|
671
671
|
y(H);
|
|
672
|
-
} catch (
|
|
672
|
+
} catch (j) {
|
|
673
673
|
console.error(
|
|
674
674
|
"[ChannelInfoDialog] Failed to check blocked status:",
|
|
675
|
-
|
|
675
|
+
j
|
|
676
676
|
);
|
|
677
677
|
}
|
|
678
678
|
}, [a, ($ = n == null ? void 0 : n.user) == null ? void 0 : $.id]);
|
|
@@ -684,20 +684,20 @@ const en = ({
|
|
|
684
684
|
if (!p) {
|
|
685
685
|
h == null || h(), C && console.log("[ChannelInfoDialog] Leave conversation", r.cid), S(!0);
|
|
686
686
|
try {
|
|
687
|
-
const
|
|
688
|
-
await r.hide(
|
|
689
|
-
} catch (
|
|
690
|
-
console.error("[ChannelInfoDialog] Failed to leave conversation",
|
|
687
|
+
const j = ((_ = r._client) == null ? void 0 : _.userID) ?? null;
|
|
688
|
+
await r.hide(j, !1), l && await l(r), s();
|
|
689
|
+
} catch (j) {
|
|
690
|
+
console.error("[ChannelInfoDialog] Failed to leave conversation", j);
|
|
691
691
|
} finally {
|
|
692
692
|
S(!1);
|
|
693
693
|
}
|
|
694
694
|
}
|
|
695
695
|
}, b = async () => {
|
|
696
|
-
var _,
|
|
696
|
+
var _, j, H;
|
|
697
697
|
if (!(w || !a)) {
|
|
698
698
|
u == null || u(), C && console.log("[ChannelInfoDialog] Block member", (_ = n == null ? void 0 : n.user) == null ? void 0 : _.id), E(!0);
|
|
699
699
|
try {
|
|
700
|
-
await a.blockUser((
|
|
700
|
+
await a.blockUser((j = n == null ? void 0 : n.user) == null ? void 0 : j.id), i && await i((H = n == null ? void 0 : n.user) == null ? void 0 : H.id), s();
|
|
701
701
|
} catch (ee) {
|
|
702
702
|
console.error("[ChannelInfoDialog] Failed to block member", ee);
|
|
703
703
|
} finally {
|
|
@@ -705,11 +705,11 @@ const en = ({
|
|
|
705
705
|
}
|
|
706
706
|
}
|
|
707
707
|
}, k = async () => {
|
|
708
|
-
var _,
|
|
708
|
+
var _, j, H;
|
|
709
709
|
if (!(w || !a)) {
|
|
710
710
|
u == null || u(), C && console.log("[ChannelInfoDialog] Unblock member", (_ = n == null ? void 0 : n.user) == null ? void 0 : _.id), E(!0);
|
|
711
711
|
try {
|
|
712
|
-
await a.unBlockUser((
|
|
712
|
+
await a.unBlockUser((j = n == null ? void 0 : n.user) == null ? void 0 : j.id), i && await i((H = n == null ? void 0 : n.user) == null ? void 0 : H.id), s();
|
|
713
713
|
} catch (ee) {
|
|
714
714
|
console.error("[ChannelInfoDialog] Failed to unblock member", ee);
|
|
715
715
|
} finally {
|
|
@@ -860,7 +860,7 @@ function nn(t) {
|
|
|
860
860
|
}, [s, n == null ? void 0 : n.userID, t.id, r]);
|
|
861
861
|
return { selected: r, voteUp: o, voteDown: l };
|
|
862
862
|
}
|
|
863
|
-
const an =
|
|
863
|
+
const an = z.lazy(() => import("./Card-RgHsp9x1.js")), rn = z.lazy(() => import("./Card-DwgUtqsA.js")), St = () => /* @__PURE__ */ e(
|
|
864
864
|
"div",
|
|
865
865
|
{
|
|
866
866
|
className: "w-[280px] min-h-[200px] animate-pulse rounded-[24px] bg-black/[0.06] shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_4px_8px_rgba(0,0,0,0.06)]",
|
|
@@ -950,7 +950,7 @@ const mn = ({ filled: t }) => /* @__PURE__ */ e("svg", { width: "16", height: "1
|
|
|
950
950
|
ReminderNotification: Z = Zt,
|
|
951
951
|
StreamedMessageText: ae = Kt,
|
|
952
952
|
PinIndicator: J
|
|
953
|
-
} = gt("CustomMessage"), x = Jt(a), _ = Qt(a),
|
|
953
|
+
} = gt("CustomMessage"), x = Jt(a), _ = Qt(a), j = ze(
|
|
954
954
|
() => f == null ? void 0 : f(a),
|
|
955
955
|
[f, a]
|
|
956
956
|
), H = ze(
|
|
@@ -1079,7 +1079,7 @@ const mn = ({ filled: t }) => /* @__PURE__ */ e("svg", { width: "16", height: "1
|
|
|
1079
1079
|
attachments: H
|
|
1080
1080
|
}
|
|
1081
1081
|
) : null,
|
|
1082
|
-
|
|
1082
|
+
j ? /* @__PURE__ */ e(
|
|
1083
1083
|
ae,
|
|
1084
1084
|
{
|
|
1085
1085
|
message: a,
|
|
@@ -1117,7 +1117,7 @@ const mn = ({ filled: t }) => /* @__PURE__ */ e("svg", { width: "16", height: "1
|
|
|
1117
1117
|
ie && /* @__PURE__ */ e(P, {})
|
|
1118
1118
|
] }, a.id)
|
|
1119
1119
|
] });
|
|
1120
|
-
}, bn =
|
|
1120
|
+
}, bn = z.memo(
|
|
1121
1121
|
gn,
|
|
1122
1122
|
(t, s) => t.chatbotVotingEnabled !== s.chatbotVotingEnabled ? !1 : jt(t, s)
|
|
1123
1123
|
), xn = (t) => {
|
|
@@ -1468,7 +1468,7 @@ const mn = ({ filled: t }) => /* @__PURE__ */ e("svg", { width: "16", height: "1
|
|
|
1468
1468
|
s && /* @__PURE__ */ e("span", { className: "text-stone", children: s })
|
|
1469
1469
|
]
|
|
1470
1470
|
}
|
|
1471
|
-
), Me =
|
|
1471
|
+
), Me = z.memo(() => /* @__PURE__ */ e("div", { className: "messaging-loading-state flex items-center justify-center h-full", children: /* @__PURE__ */ d("div", { className: "flex items-center", children: [
|
|
1472
1472
|
/* @__PURE__ */ e(An, { className: "w-6 h-6" }),
|
|
1473
1473
|
/* @__PURE__ */ e("span", { className: "text-sm text-stone", children: "Loading messages" })
|
|
1474
1474
|
] }) }));
|
|
@@ -1482,7 +1482,7 @@ const he = "size-10 rounded-full bg-[#F1F0EE] hover:bg-[#E5E4E1] flex items-cent
|
|
|
1482
1482
|
dmAgentEnabled: l = !1
|
|
1483
1483
|
}) => {
|
|
1484
1484
|
var v, a, C, g, y;
|
|
1485
|
-
const { channel: i } = ue(), c =
|
|
1485
|
+
const { channel: i } = ue(), c = z.useMemo(() => Object.values(i.state.members || {}).find(
|
|
1486
1486
|
(S) => {
|
|
1487
1487
|
var w;
|
|
1488
1488
|
return ((w = S.user) == null ? void 0 : w.id) && S.user.id !== i._client.userID;
|
|
@@ -1668,15 +1668,15 @@ const he = "size-10 rounded-full bg-[#F1F0EE] hover:bg-[#E5E4E1] flex items-cent
|
|
|
1668
1668
|
dmAgentEnabled: y = !1
|
|
1669
1669
|
}) => {
|
|
1670
1670
|
var T, B;
|
|
1671
|
-
const { channel: p } = ue(), S = Q(null), w =
|
|
1671
|
+
const { channel: p } = ue(), S = Q(null), w = z.useMemo(() => Object.values(p.state.members || {}).find(
|
|
1672
1672
|
(G) => {
|
|
1673
1673
|
var $;
|
|
1674
1674
|
return (($ = G.user) == null ? void 0 : $.id) && G.user.id !== p._client.userID;
|
|
1675
1675
|
}
|
|
1676
|
-
), [p._client.userID, p.state.members]), E =
|
|
1676
|
+
), [p._client.userID, p.state.members]), E = z.useMemo(() => Object.values(p.state.members || {}).find((G) => {
|
|
1677
1677
|
var $;
|
|
1678
1678
|
return (($ = G.user) == null ? void 0 : $.id) === p._client.userID;
|
|
1679
|
-
}), [p._client.userID, p.state.members]), F = ((T = E == null ? void 0 : E.user) == null ? void 0 : T.is_account) ?? (E == null ? void 0 : E.is_account), N = ((B = w == null ? void 0 : w.user) == null ? void 0 : B.is_account) ?? (w == null ? void 0 : w.is_account), b = y && F === !1 && N === !0, k =
|
|
1679
|
+
}), [p._client.userID, p.state.members]), F = ((T = E == null ? void 0 : E.user) == null ? void 0 : T.is_account) ?? (E == null ? void 0 : E.is_account), N = ((B = w == null ? void 0 : w.user) == null ? void 0 : B.is_account) ?? (w == null ? void 0 : w.is_account), b = y && F === !1 && N === !0, k = z.useMemo(() => {
|
|
1680
1680
|
const O = p.data ?? {};
|
|
1681
1681
|
if (O.followerStatus)
|
|
1682
1682
|
return String(O.followerStatus);
|
|
@@ -1744,7 +1744,7 @@ const he = "size-10 rounded-full bg-[#F1F0EE] hover:bg-[#E5E4E1] flex items-cent
|
|
|
1744
1744
|
}
|
|
1745
1745
|
)
|
|
1746
1746
|
] });
|
|
1747
|
-
}, Mt =
|
|
1747
|
+
}, Mt = z.memo(
|
|
1748
1748
|
({
|
|
1749
1749
|
channel: t,
|
|
1750
1750
|
onBack: s,
|
|
@@ -2150,7 +2150,7 @@ const $n = ({
|
|
|
2150
2150
|
] })
|
|
2151
2151
|
]
|
|
2152
2152
|
}
|
|
2153
|
-
), Tt =
|
|
2153
|
+
), Tt = z.memo(
|
|
2154
2154
|
({ hasChannels: t, channelsLoaded: s }) => /* @__PURE__ */ e("div", { className: "messaging-empty-state flex items-center justify-center h-full p-8 text-balance", children: /* @__PURE__ */ d("div", { className: "flex flex-col items-center max-w-sm text-center", children: [
|
|
2155
2155
|
/* @__PURE__ */ e(zn, {}),
|
|
2156
2156
|
s && !t && /* @__PURE__ */ d("div", { className: "mt-8", children: [
|
|
@@ -2160,7 +2160,7 @@ const $n = ({
|
|
|
2160
2160
|
] }) })
|
|
2161
2161
|
);
|
|
2162
2162
|
Tt.displayName = "EmptyState";
|
|
2163
|
-
const Ie =
|
|
2163
|
+
const Ie = z.memo(({ message: t, onBack: s }) => /* @__PURE__ */ e("div", { className: "messaging-error-state flex items-center justify-center h-full p-8", children: /* @__PURE__ */ d("div", { className: "text-center max-w-sm", children: [
|
|
2164
2164
|
/* @__PURE__ */ e("div", { className: "w-24 h-24 bg-danger-alt/20 rounded-full flex items-center justify-center mx-auto mb-6", children: /* @__PURE__ */ e("span", { className: "text-4xl", children: "⚠️" }) }),
|
|
2165
2165
|
/* @__PURE__ */ e("h2", { className: "font-semibold text-charcoal mb-2", children: "Oops!" }),
|
|
2166
2166
|
/* @__PURE__ */ e("p", { className: "text-stone text-sm mb-6", children: t }),
|
|
@@ -2212,11 +2212,11 @@ const ga = ({
|
|
|
2212
2212
|
error: G,
|
|
2213
2213
|
refreshConnection: $,
|
|
2214
2214
|
debug: P
|
|
2215
|
-
} = zs(), [W, Z] = M(null), [ae, J] = M(!1), [x, _] = M(!1), [
|
|
2215
|
+
} = zs(), [W, Z] = M(null), [ae, J] = M(!1), [x, _] = M(!1), [j, H] = M(!1), [ee, ie] = M(/* @__PURE__ */ new Set()), [be, Le] = M(0), [q, te] = M(!1), [xe, re] = M(null), me = Q(null), {
|
|
2216
2216
|
participantSource: oe,
|
|
2217
2217
|
participantLabel: pe = "participants",
|
|
2218
2218
|
showDeleteConversation: ge = !0
|
|
2219
|
-
} = t, ve =
|
|
2219
|
+
} = t, ve = z.useMemo(() => {
|
|
2220
2220
|
const D = T == null ? void 0 : T.userID;
|
|
2221
2221
|
return {
|
|
2222
2222
|
...{
|
|
@@ -2603,7 +2603,7 @@ function Yn(t) {
|
|
|
2603
2603
|
return s !== "document" ? Vn[s] : Hn[Gn(t)];
|
|
2604
2604
|
}
|
|
2605
2605
|
function Te(t, s) {
|
|
2606
|
-
return
|
|
2606
|
+
return z.createElement(Yn(t), s);
|
|
2607
2607
|
}
|
|
2608
2608
|
const Wn = (t) => {
|
|
2609
2609
|
var s, n;
|
|
@@ -2625,10 +2625,10 @@ const Wn = (t) => {
|
|
|
2625
2625
|
}, []), $ = U((x) => {
|
|
2626
2626
|
const _ = v.current;
|
|
2627
2627
|
if (!_) return 0;
|
|
2628
|
-
const
|
|
2628
|
+
const j = _.getBoundingClientRect();
|
|
2629
2629
|
return Math.max(
|
|
2630
2630
|
0,
|
|
2631
|
-
Math.min(1, (Wn(x) -
|
|
2631
|
+
Math.min(1, (Wn(x) - j.left) / j.width)
|
|
2632
2632
|
);
|
|
2633
2633
|
}, []), P = U((x) => {
|
|
2634
2634
|
const _ = f.current;
|
|
@@ -2659,8 +2659,8 @@ const Wn = (t) => {
|
|
|
2659
2659
|
}) : x.pause());
|
|
2660
2660
|
}, [g]), K(() => {
|
|
2661
2661
|
if (!w) return;
|
|
2662
|
-
const x = (
|
|
2663
|
-
E(!1), P($(
|
|
2662
|
+
const x = (j) => S($(j)), _ = (j) => {
|
|
2663
|
+
E(!1), P($(j));
|
|
2664
2664
|
};
|
|
2665
2665
|
return window.addEventListener("mousemove", x), window.addEventListener("mouseup", _), window.addEventListener("touchmove", x, { passive: !0 }), window.addEventListener("touchend", _), () => {
|
|
2666
2666
|
window.removeEventListener("mousemove", x), window.removeEventListener("mouseup", _), window.removeEventListener("touchmove", x), window.removeEventListener("touchend", _);
|
|
@@ -2965,7 +2965,7 @@ const Wn = (t) => {
|
|
|
2965
2965
|
u ? /* @__PURE__ */ e("div", { className: "pointer-events-auto absolute right-3 top-3 z-50", children: u }) : null,
|
|
2966
2966
|
s,
|
|
2967
2967
|
/* @__PURE__ */ d("div", { className: "px-4 pb-3 pt-3", children: [
|
|
2968
|
-
/* @__PURE__ */ e(
|
|
2968
|
+
a.trim() !== "" && /* @__PURE__ */ e(
|
|
2969
2969
|
"p",
|
|
2970
2970
|
{
|
|
2971
2971
|
className: A("mb-0.5 truncate text-base font-medium", {
|
|
@@ -3024,8 +3024,7 @@ function ea(t) {
|
|
|
3024
3024
|
return t ? "text-white/20" : "text-black/20";
|
|
3025
3025
|
}
|
|
3026
3026
|
const Xe = ({ attachment: t, isMyMessage: s }) => {
|
|
3027
|
-
const { title: n, text: r, image_url: o, og_scrape_url: l, title_link: i } = t, c = l ?? i
|
|
3028
|
-
return /* @__PURE__ */ d("a", { href: c, target: "_blank", rel: "noopener noreferrer", className: "block no-underline", children: [
|
|
3027
|
+
const { title: n, text: r, image_url: o, og_scrape_url: l, title_link: i } = t, c = l ?? i, h = typeof c == "string" && c.trim() !== "" ? c : void 0, u = /* @__PURE__ */ d(z.Fragment, { children: [
|
|
3029
3028
|
/* @__PURE__ */ e("div", { className: "p-2", children: o ? /* @__PURE__ */ e(
|
|
3030
3029
|
"img",
|
|
3031
3030
|
{
|
|
@@ -3043,14 +3042,15 @@ const Xe = ({ attachment: t, isMyMessage: s }) => {
|
|
|
3043
3042
|
/* @__PURE__ */ d("div", { className: "px-3 pb-3", children: [
|
|
3044
3043
|
n && /* @__PURE__ */ e("p", { className: `truncate text-[14px] font-medium leading-5 ${Kn(s)}`, children: n }),
|
|
3045
3044
|
r && /* @__PURE__ */ e("p", { className: `truncate text-[12px] leading-4 ${Jn(s)}`, children: r }),
|
|
3046
|
-
|
|
3045
|
+
h && /* @__PURE__ */ e("p", { className: `mt-1 truncate text-[12px] leading-4 ${Qn(s)}`, children: h })
|
|
3047
3046
|
] })
|
|
3048
3047
|
] });
|
|
3048
|
+
return h ? /* @__PURE__ */ e("a", { href: h, target: "_blank", rel: "noopener noreferrer", className: "block no-underline", children: u }) : /* @__PURE__ */ e("div", { className: "block", children: u });
|
|
3049
3049
|
};
|
|
3050
3050
|
function Ze(t) {
|
|
3051
3051
|
var s;
|
|
3052
3052
|
return (s = t.attachments) == null ? void 0 : s.find(
|
|
3053
|
-
(n) => n.type === "link" || n.og_scrape_url
|
|
3053
|
+
(n) => n.type === "link" || !!n.og_scrape_url && !n.asset_url
|
|
3054
3054
|
);
|
|
3055
3055
|
}
|
|
3056
3056
|
async function ta(t, s) {
|
|
@@ -3085,7 +3085,7 @@ const sa = ({
|
|
|
3085
3085
|
},
|
|
3086
3086
|
disabled: n,
|
|
3087
3087
|
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",
|
|
3088
|
-
children: n ? /* @__PURE__ */ e(pt, { className: "size-4 animate-spin text-white", weight: "bold" }) : /* @__PURE__ */ d(
|
|
3088
|
+
children: n ? /* @__PURE__ */ e(pt, { className: "size-4 animate-spin text-white", weight: "bold" }) : /* @__PURE__ */ d(z.Fragment, { children: [
|
|
3089
3089
|
/* @__PURE__ */ e($s, { className: "size-4 text-white", weight: "bold" }),
|
|
3090
3090
|
"Download"
|
|
3091
3091
|
] })
|
|
@@ -3126,6 +3126,7 @@ const Pt = ({
|
|
|
3126
3126
|
{
|
|
3127
3127
|
variant: "dark",
|
|
3128
3128
|
title: n,
|
|
3129
|
+
placeholderTitle: "",
|
|
3129
3130
|
mimeType: s,
|
|
3130
3131
|
detail: l,
|
|
3131
3132
|
thumbnail: /* @__PURE__ */ e(
|
|
@@ -3285,4 +3286,4 @@ export {
|
|
|
3285
3286
|
Ze as r,
|
|
3286
3287
|
un as u
|
|
3287
3288
|
};
|
|
3288
|
-
//# sourceMappingURL=index-
|
|
3289
|
+
//# sourceMappingURL=index-B_4pciGp.js.map
|