@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.
@@ -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-jnKl3mQ0.js";
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-BlXnKGaR.js.map
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\">&bull;</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\">&bull;</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\">&bull;</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\">&bull;</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-jnKl3mQ0.js";
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-DoNJA-jg.js.map
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\">&bull;</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\">&bull;</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\">&bull;</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\">&bull;</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 j, { 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";
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 = j.useMemo(() => (i("💫 CONTEXT VALUE MEMOIZATION", {
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 = j.createContext({
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 = () => j.useContext(wt), yt = (t) => {
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 = j.memo(
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 = j.memo(
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 = j.useRef(0);
552
+ const f = z.useRef(0);
553
553
  f.current++;
554
- const { debug: v = !1 } = De(), a = j.useCallback(
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 = j.useMemo(
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 (z) {
672
+ } catch (j) {
673
673
  console.error(
674
674
  "[ChannelInfoDialog] Failed to check blocked status:",
675
- z
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 z = ((_ = r._client) == null ? void 0 : _.userID) ?? null;
688
- await r.hide(z, !1), l && await l(r), s();
689
- } catch (z) {
690
- console.error("[ChannelInfoDialog] Failed to leave conversation", z);
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 _, z, H;
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((z = n == null ? void 0 : n.user) == null ? void 0 : z.id), i && await i((H = n == null ? void 0 : n.user) == null ? void 0 : H.id), s();
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 _, z, H;
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((z = n == null ? void 0 : n.user) == null ? void 0 : z.id), i && await i((H = n == null ? void 0 : n.user) == null ? void 0 : H.id), s();
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 = j.lazy(() => import("./Card-DoNJA-jg.js")), rn = j.lazy(() => import("./Card-BlXnKGaR.js")), St = () => /* @__PURE__ */ e(
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), z = ze(
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
- z ? /* @__PURE__ */ e(
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 = j.memo(
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 = j.memo(() => /* @__PURE__ */ e("div", { className: "messaging-loading-state flex items-center justify-center h-full", children: /* @__PURE__ */ d("div", { className: "flex items-center", children: [
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 = j.useMemo(() => Object.values(i.state.members || {}).find(
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 = j.useMemo(() => Object.values(p.state.members || {}).find(
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 = j.useMemo(() => Object.values(p.state.members || {}).find((G) => {
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 = j.useMemo(() => {
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 = j.memo(
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 = j.memo(
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 = j.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: [
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), [z, H] = M(!1), [ee, ie] = M(/* @__PURE__ */ new Set()), [be, Le] = M(0), [q, te] = M(!1), [xe, re] = M(null), me = Q(null), {
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 = j.useMemo(() => {
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 j.createElement(Yn(t), s);
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 z = _.getBoundingClientRect();
2628
+ const j = _.getBoundingClientRect();
2629
2629
  return Math.max(
2630
2630
  0,
2631
- Math.min(1, (Wn(x) - z.left) / z.width)
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 = (z) => S($(z)), _ = (z) => {
2663
- E(!1), P($(z));
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
- c && /* @__PURE__ */ e("p", { className: `mt-1 truncate text-[12px] leading-4 ${Qn(s)}`, children: c })
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 != null && !n.asset_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(j.Fragment, { children: [
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-jnKl3mQ0.js.map
3289
+ //# sourceMappingURL=index-B_4pciGp.js.map