react-sharesheet 1.1.0 → 1.3.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,70 +1,4 @@
1
- import { U as UseShareSheetReturn } from './platforms-CDJmSY8E.js';
2
- export { P as PLATFORMS, o as PLATFORM_COLORS, r as PLATFORM_CSS_VARS, p as PLATFORM_ICONS, n as PLATFORM_IDS, q as PLATFORM_LABELS, z as PlatformColor, y as PlatformConfig, i as ShareButtonConfig, h as ShareOption, j as UseShareMenuReturn, x as generateCssVarDefaults, t as getAllPlatforms, s as getPlatform, u as getPlatformColor, v as getPlatformIcon, w as getPlatformLabel } from './platforms-CDJmSY8E.js';
3
- import { ClassValue } from 'clsx';
1
+ export { O as OGData, c as UseShareMenuOptions, U as UseShareSheetOptions, d as clearOGCache, e as cn, f as fetchOGData, g as getSafeUrl, r as openInstagram, v as openThreads, t as openTikTok, o as openUrl, q as shareToFacebook, A as shareToLinkedIn, B as shareToReddit, x as shareToSnapchat, n as shareToTelegram, s as shareToWhatsApp, p as shareToX, z as shareViaEmail, y as shareViaSMS, b as useOGData, a as useShareMenu, u as useShareSheet } from './headless-BiSYHizs.js';
2
+ export { n as PLATFORMS, p as PLATFORM_COLORS, s as PLATFORM_CSS_VARS, q as PLATFORM_ICONS, o as PLATFORM_IDS, r as PLATFORM_LABELS, A as PlatformColor, z as PlatformConfig, i as ShareButtonConfig, h as ShareOption, j as UseShareMenuReturn, U as UseShareSheetReturn, y as generateCssVarDefaults, u as getAllPlatforms, t as getPlatform, v as getPlatformColor, w as getPlatformIcon, x as getPlatformLabel } from './platforms-omqzPfYX.js';
3
+ import 'clsx';
4
4
  import 'react';
5
-
6
- interface OGData {
7
- title?: string;
8
- description?: string;
9
- image?: string;
10
- url?: string;
11
- siteName?: string;
12
- }
13
- declare function fetchOGData(url: string): Promise<OGData | null>;
14
- declare function clearOGCache(): void;
15
-
16
- interface UseShareSheetOptions {
17
- /** URL to share */
18
- shareUrl: string;
19
- /** Text to share */
20
- shareText: string;
21
- /** Download URL (optional) */
22
- downloadUrl?: string | null;
23
- /** Download filename (optional) */
24
- downloadFilename?: string;
25
- /** Email subject (optional) */
26
- emailSubject?: string;
27
- /** Callback after native share */
28
- onNativeShare?: () => void;
29
- /** Callback after copy */
30
- onCopy?: () => void;
31
- /** Callback after download starts */
32
- onDownload?: () => void;
33
- }
34
- /**
35
- * Headless hook for share sheet functionality.
36
- * Use this to build your own custom share UI.
37
- */
38
- declare function useShareSheet({ shareUrl, shareText, downloadUrl, downloadFilename, emailSubject, onNativeShare, onCopy, onDownload, }: UseShareSheetOptions): UseShareSheetReturn;
39
- /**
40
- * Hook to fetch OG (Open Graph) data from a URL.
41
- * Automatically fetches and caches OG metadata for link previews.
42
- */
43
- declare function useOGData(url: string | undefined): {
44
- ogData: OGData | null;
45
- loading: boolean;
46
- error: string | null;
47
- };
48
- /** @deprecated Use useShareSheet instead */
49
- declare const useShareMenu: typeof useShareSheet;
50
- /** @deprecated Use UseShareSheetOptions instead */
51
- type UseShareMenuOptions = UseShareSheetOptions;
52
-
53
- declare function cn(...inputs: ClassValue[]): string;
54
- declare function openUrl(url: string): void;
55
- declare function getSafeUrl(shareUrl: string): string;
56
-
57
- declare function shareToWhatsApp(url: string, text: string): void;
58
- declare function shareToTelegram(url: string, text: string): void;
59
- declare function shareToX(url: string, text: string): void;
60
- declare function shareToFacebook(url: string): void;
61
- declare function openInstagram(): void;
62
- declare function openTikTok(): void;
63
- declare function openThreads(): void;
64
- declare function shareToSnapchat(url: string): void;
65
- declare function shareViaSMS(url: string, text: string): void;
66
- declare function shareViaEmail(url: string, text: string, subject?: string): void;
67
- declare function shareToLinkedIn(url: string): void;
68
- declare function shareToReddit(url: string, text: string): void;
69
-
70
- export { type OGData, type UseShareMenuOptions, type UseShareSheetOptions, UseShareSheetReturn, clearOGCache, cn, fetchOGData, getSafeUrl, openInstagram, openThreads, openTikTok, openUrl, shareToFacebook, shareToLinkedIn, shareToReddit, shareToSnapchat, shareToTelegram, shareToWhatsApp, shareToX, shareViaEmail, shareViaSMS, useOGData, useShareMenu, useShareSheet };
package/dist/headless.js CHANGED
@@ -70,6 +70,75 @@ function openUrl(url) {
70
70
  function getSafeUrl(shareUrl) {
71
71
  return shareUrl || (typeof window !== "undefined" ? window.location.href : "");
72
72
  }
73
+ function isMobileDevice() {
74
+ if (typeof navigator === "undefined") return false;
75
+ const userAgent = navigator.userAgent || navigator.vendor || "";
76
+ const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;
77
+ const hasTouch = typeof window !== "undefined" && ("ontouchstart" in window || navigator.maxTouchPoints > 0);
78
+ return mobileRegex.test(userAgent);
79
+ }
80
+ var MOBILE_ONLY_PLATFORMS = [
81
+ "instagram",
82
+ "tiktok",
83
+ "threads",
84
+ "sms"
85
+ ];
86
+ function checkPlatformAvailability(platform) {
87
+ const isMobile = isMobileDevice();
88
+ if (MOBILE_ONLY_PLATFORMS.includes(platform)) {
89
+ if (!isMobile) {
90
+ return {
91
+ available: false,
92
+ reason: `${platform} requires a mobile device with the app installed`
93
+ };
94
+ }
95
+ }
96
+ if (platform === "sms" && !isMobile) {
97
+ return {
98
+ available: false,
99
+ reason: "SMS sharing requires a mobile device"
100
+ };
101
+ }
102
+ if (platform === "native") {
103
+ const canShare = typeof navigator !== "undefined" && "share" in navigator;
104
+ if (!canShare) {
105
+ return {
106
+ available: false,
107
+ reason: "Native share is not supported by this browser"
108
+ };
109
+ }
110
+ }
111
+ return { available: true };
112
+ }
113
+ function getAllPlatformAvailability() {
114
+ const platforms = [
115
+ "native",
116
+ "copy",
117
+ "download",
118
+ "whatsapp",
119
+ "telegram",
120
+ "instagram",
121
+ "facebook",
122
+ "snapchat",
123
+ "sms",
124
+ "email",
125
+ "linkedin",
126
+ "reddit",
127
+ "x",
128
+ "tiktok",
129
+ "threads"
130
+ ];
131
+ const result = {};
132
+ for (const platform of platforms) {
133
+ result[platform] = checkPlatformAvailability(platform);
134
+ }
135
+ return result;
136
+ }
137
+ function warnUnavailablePlatform(platform, reason) {
138
+ console.warn(
139
+ `[react-sharesheet] ${platform} sharing is not available: ${reason}. This share option may not work correctly on this device.`
140
+ );
141
+ }
73
142
 
74
143
  // src/og-fetcher.ts
75
144
  var ogCache = /* @__PURE__ */ new Map();
@@ -127,12 +196,24 @@ function shareToFacebook(url) {
127
196
  openUrl(`https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`);
128
197
  }
129
198
  function openInstagram() {
199
+ const availability = checkPlatformAvailability("instagram");
200
+ if (!availability.available) {
201
+ warnUnavailablePlatform("instagram", availability.reason);
202
+ }
130
203
  window.location.href = "instagram://";
131
204
  }
132
205
  function openTikTok() {
206
+ const availability = checkPlatformAvailability("tiktok");
207
+ if (!availability.available) {
208
+ warnUnavailablePlatform("tiktok", availability.reason);
209
+ }
133
210
  window.location.href = "tiktok://";
134
211
  }
135
212
  function openThreads() {
213
+ const availability = checkPlatformAvailability("threads");
214
+ if (!availability.available) {
215
+ warnUnavailablePlatform("threads", availability.reason);
216
+ }
136
217
  window.location.href = "threads://";
137
218
  }
138
219
  function shareToSnapchat(url) {
@@ -140,6 +221,10 @@ function shareToSnapchat(url) {
140
221
  openUrl(`https://www.snapchat.com/scan?attachmentUrl=${encodedUrl}`);
141
222
  }
142
223
  function shareViaSMS(url, text) {
224
+ const availability = checkPlatformAvailability("sms");
225
+ if (!availability.available) {
226
+ warnUnavailablePlatform("sms", availability.reason);
227
+ }
143
228
  const body = encodeURIComponent(`${text}
144
229
  ${url}`);
145
230
  window.location.href = `sms:?body=${body}`;
@@ -162,6 +247,23 @@ function shareToReddit(url, text) {
162
247
  }
163
248
 
164
249
  // src/hooks.ts
250
+ var DEFAULT_PLATFORM_AVAILABILITY = {
251
+ native: { available: true },
252
+ copy: { available: true },
253
+ download: { available: true },
254
+ whatsapp: { available: true },
255
+ telegram: { available: true },
256
+ instagram: { available: true },
257
+ facebook: { available: true },
258
+ snapchat: { available: true },
259
+ sms: { available: true },
260
+ email: { available: true },
261
+ linkedin: { available: true },
262
+ reddit: { available: true },
263
+ x: { available: true },
264
+ tiktok: { available: true },
265
+ threads: { available: true }
266
+ };
165
267
  function useShareSheet({
166
268
  shareUrl,
167
269
  shareText,
@@ -174,8 +276,15 @@ function useShareSheet({
174
276
  }) {
175
277
  const [copied, setCopied] = (0, import_react.useState)(false);
176
278
  const [downloading, setDownloading] = (0, import_react.useState)(false);
177
- const canNativeShare = (0, import_react.useMemo)(() => {
178
- return typeof navigator !== "undefined" && "share" in navigator;
279
+ const [canNativeShare, setCanNativeShare] = (0, import_react.useState)(false);
280
+ const [isMobile, setIsMobile] = (0, import_react.useState)(false);
281
+ const [platformAvailability, setPlatformAvailability] = (0, import_react.useState)(
282
+ DEFAULT_PLATFORM_AVAILABILITY
283
+ );
284
+ (0, import_react.useEffect)(() => {
285
+ setCanNativeShare(typeof navigator !== "undefined" && "share" in navigator);
286
+ setIsMobile(isMobileDevice());
287
+ setPlatformAvailability(getAllPlatformAvailability());
179
288
  }, []);
180
289
  const safeUrl = getSafeUrl(shareUrl);
181
290
  const copyLink = (0, import_react.useCallback)(async () => {
@@ -265,6 +374,8 @@ function useShareSheet({
265
374
  copied,
266
375
  downloading,
267
376
  safeUrl,
377
+ isMobile,
378
+ platformAvailability,
268
379
  copyLink,
269
380
  nativeShare,
270
381
  downloadFile,
@@ -316,7 +427,7 @@ function useOGData(url) {
316
427
  var useShareMenu = useShareSheet;
317
428
 
318
429
  // src/platforms.tsx
319
- var import_lucide_react = require("lucide-react");
430
+ var import_lu = require("react-icons/lu");
320
431
  var import_fa = require("react-icons/fa");
321
432
  var import_fa6 = require("react-icons/fa6");
322
433
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -372,16 +483,16 @@ var PLATFORM_LABELS = {
372
483
  threads: "Threads"
373
484
  };
374
485
  var PLATFORM_ICONS = {
375
- native: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Send, { size, className }),
376
- copy: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Link, { size, className }),
377
- download: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Download, { size, className }),
486
+ native: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lu.LuSend, { size, className }),
487
+ copy: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lu.LuLink, { size, className }),
488
+ download: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lu.LuDownload, { size, className }),
378
489
  whatsapp: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaWhatsapp, { size, className }),
379
490
  telegram: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaTelegramPlane, { size, className }),
380
491
  instagram: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaInstagram, { size, className }),
381
492
  facebook: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaFacebookF, { size, className }),
382
493
  snapchat: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa6.FaSnapchat, { size, className }),
383
- sms: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.MessageCircle, { size, className }),
384
- email: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Mail, { size, className }),
494
+ sms: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lu.LuMessageCircle, { size, className }),
495
+ email: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lu.LuMail, { size, className }),
385
496
  linkedin: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaLinkedin, { size, className }),
386
497
  reddit: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa.FaReddit, { size, className }),
387
498
  x: ({ size = 22, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_fa6.FaXTwitter, { size, className }),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/headless.ts","../src/hooks.ts","../src/utils.ts","../src/og-fetcher.ts","../src/share-functions.ts","../src/platforms.tsx"],"sourcesContent":["// Headless exports - just the hook and utilities, no styled components\n\nexport { useShareSheet, useShareMenu, useOGData, type UseShareSheetOptions, type UseShareMenuOptions } from \"./hooks\";\n\n// OG Data fetcher\nexport { fetchOGData, clearOGCache, type OGData } from \"./og-fetcher\";\n\nexport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\n\nexport { cn, openUrl, getSafeUrl } from \"./utils\";\n\n// Platform configs (colors, icons, labels) - SINGLE SOURCE OF TRUTH\nexport {\n PLATFORMS,\n PLATFORM_IDS,\n PLATFORM_COLORS,\n PLATFORM_ICONS,\n PLATFORM_LABELS,\n PLATFORM_CSS_VARS,\n getPlatform,\n getAllPlatforms,\n getPlatformColor,\n getPlatformIcon,\n getPlatformLabel,\n generateCssVarDefaults,\n type PlatformConfig,\n type PlatformColor,\n} from \"./platforms\";\n\nexport type {\n UseShareSheetReturn,\n UseShareMenuReturn,\n ShareOption,\n ShareButtonConfig,\n} from \"./types\";\n","\"use client\";\n\nimport { useMemo, useState, useCallback, useEffect } from \"react\";\nimport { getSafeUrl } from \"./utils\";\nimport { fetchOGData, type OGData } from \"./og-fetcher\";\nimport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\nimport type { UseShareSheetReturn } from \"./types\";\n\nexport interface UseShareSheetOptions {\n /** URL to share */\n shareUrl: string;\n /** Text to share */\n shareText: string;\n /** Download URL (optional) */\n downloadUrl?: string | null;\n /** Download filename (optional) */\n downloadFilename?: string;\n /** Email subject (optional) */\n emailSubject?: string;\n /** Callback after native share */\n onNativeShare?: () => void;\n /** Callback after copy */\n onCopy?: () => void;\n /** Callback after download starts */\n onDownload?: () => void;\n}\n\n/**\n * Headless hook for share sheet functionality.\n * Use this to build your own custom share UI.\n */\nexport function useShareSheet({\n shareUrl,\n shareText,\n downloadUrl,\n downloadFilename,\n emailSubject = \"Share\",\n onNativeShare,\n onCopy,\n onDownload,\n}: UseShareSheetOptions): UseShareSheetReturn {\n const [copied, setCopied] = useState(false);\n const [downloading, setDownloading] = useState(false);\n\n const canNativeShare = useMemo(() => {\n return typeof navigator !== \"undefined\" && \"share\" in navigator;\n }, []);\n\n const safeUrl = getSafeUrl(shareUrl);\n\n const copyLink = useCallback(async () => {\n if (!safeUrl) return;\n try {\n await navigator.clipboard.writeText(safeUrl);\n setCopied(true);\n onCopy?.();\n setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignore\n }\n }, [safeUrl, onCopy]);\n\n const nativeShare = useCallback(async () => {\n if (!safeUrl) return;\n const nav = navigator as Navigator & {\n share?: (data: ShareData) => Promise<void>;\n };\n if (!(\"share\" in nav) || typeof nav.share !== \"function\") return;\n try {\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n } catch {\n // user canceled or share failed -> ignore\n }\n }, [safeUrl, shareText, onNativeShare]);\n\n const downloadFile = useCallback(async () => {\n const url = (downloadUrl ?? \"\").trim();\n if (!url) return;\n try {\n setDownloading(true);\n onDownload?.();\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch file (${res.status})`);\n const blob = await res.blob();\n const href = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = href;\n a.download = downloadFilename || \"download\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(href);\n } catch {\n // ignore\n } finally {\n setDownloading(false);\n }\n }, [downloadUrl, downloadFilename, onDownload]);\n\n const shareWhatsApp = useCallback(() => {\n shareToWhatsApp(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareTelegram = useCallback(() => {\n shareToTelegram(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareX = useCallback(() => {\n shareToX(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareFacebook = useCallback(() => {\n shareToFacebook(safeUrl);\n }, [safeUrl]);\n\n const shareInstagram = useCallback(() => {\n openInstagram();\n }, []);\n\n const shareTikTok = useCallback(() => {\n openTikTok();\n }, []);\n\n const shareThreads = useCallback(() => {\n openThreads();\n }, []);\n\n const shareSnapchat = useCallback(() => {\n shareToSnapchat(safeUrl);\n }, [safeUrl]);\n\n const shareSMS = useCallback(() => {\n shareViaSMS(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareEmail = useCallback(() => {\n shareViaEmail(safeUrl, shareText, emailSubject);\n }, [safeUrl, shareText, emailSubject]);\n\n const shareLinkedIn = useCallback(() => {\n shareToLinkedIn(safeUrl);\n }, [safeUrl]);\n\n const shareReddit = useCallback(() => {\n shareToReddit(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n return {\n canNativeShare,\n copied,\n downloading,\n safeUrl,\n copyLink,\n nativeShare,\n downloadFile,\n shareWhatsApp,\n shareTelegram,\n shareX,\n shareFacebook,\n shareInstagram,\n shareTikTok,\n shareThreads,\n shareSnapchat,\n shareSMS,\n shareEmail,\n shareLinkedIn,\n shareReddit,\n };\n}\n\n/**\n * Hook to fetch OG (Open Graph) data from a URL.\n * Automatically fetches and caches OG metadata for link previews.\n */\nexport function useOGData(url: string | undefined): {\n ogData: OGData | null;\n loading: boolean;\n error: string | null;\n} {\n const [ogData, setOgData] = useState<OGData | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!url) {\n setOgData(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n fetchOGData(url)\n .then((data) => {\n if (!cancelled) {\n setOgData(data);\n setLoading(false);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to fetch OG data\");\n setLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n return { ogData, loading, error };\n}\n\n// Legacy export for backwards compatibility\n/** @deprecated Use useShareSheet instead */\nexport const useShareMenu = useShareSheet;\n/** @deprecated Use UseShareSheetOptions instead */\nexport type UseShareMenuOptions = UseShareSheetOptions;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function openUrl(url: string) {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function getSafeUrl(shareUrl: string): string {\n return shareUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n}\n\n","// OG Data fetcher using Microlink API (free, no API key required)\n\nexport interface OGData {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n siteName?: string;\n}\n\nexport interface OGFetchResult {\n data: OGData | null;\n loading: boolean;\n error: string | null;\n}\n\n// Cache to avoid re-fetching the same URL\nconst ogCache = new Map<string, OGData>();\n\nexport async function fetchOGData(url: string): Promise<OGData | null> {\n // Check cache first\n if (ogCache.has(url)) {\n return ogCache.get(url)!;\n }\n\n try {\n // Use Microlink API to fetch OG data (free tier, no API key needed)\n const apiUrl = `https://api.microlink.io?url=${encodeURIComponent(url)}`;\n const response = await fetch(apiUrl);\n \n if (!response.ok) {\n throw new Error(`Failed to fetch OG data: ${response.status}`);\n }\n\n const json = await response.json();\n \n if (json.status !== \"success\" || !json.data) {\n return null;\n }\n\n const { title, description, image, url: canonicalUrl, publisher } = json.data;\n\n const ogData: OGData = {\n title: title || undefined,\n description: description || undefined,\n image: image?.url || undefined,\n url: canonicalUrl || url,\n siteName: publisher || undefined,\n };\n\n // Cache the result\n ogCache.set(url, ogData);\n\n return ogData;\n } catch (error) {\n console.warn(\"[react-sharesheet] Failed to fetch OG data:\", error);\n return null;\n }\n}\n\n// Clear cache (useful for testing or forcing refresh)\nexport function clearOGCache(): void {\n ogCache.clear();\n}\n","import { openUrl } from \"./utils\";\n\nexport function shareToWhatsApp(url: string, text: string) {\n const encoded = encodeURIComponent(`${text}\\n${url}`);\n openUrl(`https://api.whatsapp.com/send?text=${encoded}`);\n}\n\nexport function shareToTelegram(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://t.me/share/url?url=${encodedUrl}&text=${encodedText}`);\n}\n\nexport function shareToX(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://x.com/intent/tweet?text=${encodedText}&url=${encodedUrl}`);\n}\n\nexport function shareToFacebook(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`);\n}\n\nexport function openInstagram() {\n window.location.href = \"instagram://\";\n}\n\nexport function openTikTok() {\n window.location.href = \"tiktok://\";\n}\n\nexport function openThreads() {\n window.location.href = \"threads://\";\n}\n\nexport function shareToSnapchat(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.snapchat.com/scan?attachmentUrl=${encodedUrl}`);\n}\n\nexport function shareViaSMS(url: string, text: string) {\n const body = encodeURIComponent(`${text}\\n${url}`);\n window.location.href = `sms:?body=${body}`;\n}\n\nexport function shareViaEmail(url: string, text: string, subject = \"Share\") {\n const encodedSubject = encodeURIComponent(subject);\n const body = encodeURIComponent(`${text}\\n\\n${url}`);\n window.location.href = `mailto:?subject=${encodedSubject}&body=${body}`;\n}\n\nexport function shareToLinkedIn(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`);\n}\n\nexport function shareToReddit(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.reddit.com/submit?url=${encodedUrl}&title=${encodedText}`);\n}\n\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n Download,\n Link as LinkIcon,\n Mail,\n MessageCircle,\n Send,\n} from \"lucide-react\";\nimport {\n FaFacebookF,\n FaInstagram,\n FaLinkedin,\n FaReddit,\n FaTelegramPlane,\n FaTiktok,\n FaWhatsapp,\n} from \"react-icons/fa\";\nimport { FaXTwitter, FaThreads, FaSnapchat } from \"react-icons/fa6\";\nimport type { ShareOption } from \"./types\";\n\n/** Platform color configuration */\nexport interface PlatformColor {\n /** Background color (hex) */\n bg: string;\n /** Text/icon color (hex) */\n text: string;\n}\n\n/** Platform configuration */\nexport interface PlatformConfig {\n /** Platform identifier */\n id: ShareOption;\n /** Display label */\n label: string;\n /** Colors */\n colors: PlatformColor;\n /** Icon component (accepts size prop) */\n Icon: (props: { size?: number; className?: string }) => ReactNode;\n /** CSS variable name for background */\n cssVar: string;\n}\n\n/** All platform IDs in default order */\nexport const PLATFORM_IDS: readonly ShareOption[] = [\n \"native\",\n \"copy\",\n \"download\",\n \"whatsapp\",\n \"telegram\",\n \"instagram\",\n \"facebook\",\n \"snapchat\",\n \"sms\",\n \"email\",\n \"linkedin\",\n \"reddit\",\n \"x\",\n \"tiktok\",\n \"threads\",\n] as const;\n\n/** Platform colors - hex values for each platform (SOURCE OF TRUTH) */\nexport const PLATFORM_COLORS: Record<ShareOption, PlatformColor> = {\n native: { bg: \"#7c3aed\", text: \"#ffffff\" },\n copy: { bg: \"#3b82f6\", text: \"#ffffff\" },\n download: { bg: \"#ef4444\", text: \"#ffffff\" },\n whatsapp: { bg: \"#25D366\", text: \"#ffffff\" },\n telegram: { bg: \"#229ED9\", text: \"#ffffff\" },\n instagram: { bg: \"#E1306C\", text: \"#ffffff\" },\n facebook: { bg: \"#1877F2\", text: \"#ffffff\" },\n snapchat: { bg: \"#FFFC00\", text: \"#000000\" },\n sms: { bg: \"#22c55e\", text: \"#ffffff\" },\n email: { bg: \"#f97316\", text: \"#ffffff\" },\n linkedin: { bg: \"#0A66C2\", text: \"#ffffff\" },\n reddit: { bg: \"#FF4500\", text: \"#ffffff\" },\n x: { bg: \"#000000\", text: \"#ffffff\" },\n tiktok: { bg: \"#000000\", text: \"#ffffff\" },\n threads: { bg: \"#000000\", text: \"#ffffff\" },\n} as const;\n\n/** Platform labels (SOURCE OF TRUTH) */\nexport const PLATFORM_LABELS: Record<ShareOption, string> = {\n native: \"Share…\",\n copy: \"Copy\",\n download: \"Download\",\n whatsapp: \"WhatsApp\",\n telegram: \"Telegram\",\n instagram: \"Instagram\",\n facebook: \"Facebook\",\n snapchat: \"Snapchat\",\n sms: \"SMS\",\n email: \"Email\",\n linkedin: \"LinkedIn\",\n reddit: \"Reddit\",\n x: \"X\",\n tiktok: \"TikTok\",\n threads: \"Threads\",\n} as const;\n\n/** Platform icons - React components (SOURCE OF TRUTH) */\nexport const PLATFORM_ICONS: Record<ShareOption, (props: { size?: number; className?: string }) => ReactNode> = {\n native: ({ size = 22, className }) => <Send size={size} className={className} />,\n copy: ({ size = 22, className }) => <LinkIcon size={size} className={className} />,\n download: ({ size = 22, className }) => <Download size={size} className={className} />,\n whatsapp: ({ size = 22, className }) => <FaWhatsapp size={size} className={className} />,\n telegram: ({ size = 22, className }) => <FaTelegramPlane size={size} className={className} />,\n instagram: ({ size = 22, className }) => <FaInstagram size={size} className={className} />,\n facebook: ({ size = 22, className }) => <FaFacebookF size={size} className={className} />,\n snapchat: ({ size = 22, className }) => <FaSnapchat size={size} className={className} />,\n sms: ({ size = 22, className }) => <MessageCircle size={size} className={className} />,\n email: ({ size = 22, className }) => <Mail size={size} className={className} />,\n linkedin: ({ size = 22, className }) => <FaLinkedin size={size} className={className} />,\n reddit: ({ size = 22, className }) => <FaReddit size={size} className={className} />,\n x: ({ size = 22, className }) => <FaXTwitter size={size} className={className} />,\n tiktok: ({ size = 22, className }) => <FaTiktok size={size} className={className} />,\n threads: ({ size = 22, className }) => <FaThreads size={size} className={className} />,\n} as const;\n\n/** CSS variable names for platform backgrounds */\nexport const PLATFORM_CSS_VARS: Record<ShareOption, string> = {\n native: \"--sharesheet-native-bg\",\n copy: \"--sharesheet-copy-bg\",\n download: \"--sharesheet-download-bg\",\n whatsapp: \"--sharesheet-whatsapp-bg\",\n telegram: \"--sharesheet-telegram-bg\",\n instagram: \"--sharesheet-instagram-bg\",\n facebook: \"--sharesheet-facebook-bg\",\n snapchat: \"--sharesheet-snapchat-bg\",\n sms: \"--sharesheet-sms-bg\",\n email: \"--sharesheet-email-bg\",\n linkedin: \"--sharesheet-linkedin-bg\",\n reddit: \"--sharesheet-reddit-bg\",\n x: \"--sharesheet-x-bg\",\n tiktok: \"--sharesheet-tiktok-bg\",\n threads: \"--sharesheet-threads-bg\",\n} as const;\n\n/** Full platform configurations */\nexport const PLATFORMS: Record<ShareOption, PlatformConfig> = Object.fromEntries(\n PLATFORM_IDS.map((id) => [\n id,\n {\n id,\n label: PLATFORM_LABELS[id],\n colors: PLATFORM_COLORS[id],\n Icon: PLATFORM_ICONS[id],\n cssVar: PLATFORM_CSS_VARS[id],\n },\n ])\n) as Record<ShareOption, PlatformConfig>;\n\n/** Get platform config by id */\nexport function getPlatform(id: ShareOption): PlatformConfig {\n return PLATFORMS[id];\n}\n\n/** Get all platform configs as array */\nexport function getAllPlatforms(): PlatformConfig[] {\n return PLATFORM_IDS.map((id) => PLATFORMS[id]);\n}\n\n/** Get platform color */\nexport function getPlatformColor(id: ShareOption): PlatformColor {\n return PLATFORM_COLORS[id];\n}\n\n/** Get platform icon component */\nexport function getPlatformIcon(id: ShareOption): (props: { size?: number; className?: string }) => ReactNode {\n return PLATFORM_ICONS[id];\n}\n\n/** Get platform label */\nexport function getPlatformLabel(id: ShareOption): string {\n return PLATFORM_LABELS[id];\n}\n\n/** Generate CSS variable defaults from platform colors */\nexport function generateCssVarDefaults(): Record<string, string> {\n const defaults: Record<string, string> = {};\n PLATFORM_IDS.forEach((id) => {\n defaults[PLATFORM_CSS_VARS[id]] = PLATFORM_COLORS[id].bg;\n });\n return defaults;\n}\n"],"mappings":"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","names":["LinkIcon"]}
1
+ {"version":3,"sources":["../src/headless.ts","../src/hooks.ts","../src/utils.ts","../src/og-fetcher.ts","../src/share-functions.ts","../src/platforms.tsx"],"sourcesContent":["// Headless exports - just the hook and utilities, no styled components\n\nexport { useShareSheet, useShareMenu, useOGData, type UseShareSheetOptions, type UseShareMenuOptions } from \"./hooks\";\n\n// OG Data fetcher\nexport { fetchOGData, clearOGCache, type OGData } from \"./og-fetcher\";\n\nexport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\n\nexport { cn, openUrl, getSafeUrl } from \"./utils\";\n\n// Platform configs (colors, icons, labels) - SINGLE SOURCE OF TRUTH\nexport {\n PLATFORMS,\n PLATFORM_IDS,\n PLATFORM_COLORS,\n PLATFORM_ICONS,\n PLATFORM_LABELS,\n PLATFORM_CSS_VARS,\n getPlatform,\n getAllPlatforms,\n getPlatformColor,\n getPlatformIcon,\n getPlatformLabel,\n generateCssVarDefaults,\n type PlatformConfig,\n type PlatformColor,\n} from \"./platforms\";\n\nexport type {\n UseShareSheetReturn,\n UseShareMenuReturn,\n ShareOption,\n ShareButtonConfig,\n} from \"./types\";\n","\"use client\";\n\nimport { useMemo, useState, useCallback, useEffect } from \"react\";\nimport { getSafeUrl, isMobileDevice, getAllPlatformAvailability } from \"./utils\";\nimport { fetchOGData, type OGData } from \"./og-fetcher\";\nimport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\nimport type { UseShareSheetReturn, PlatformAvailability, ShareOption } from \"./types\";\n\n// Default platform availability (assumes desktop/all platforms available)\n// This is used for SSR to avoid hydration mismatch\nconst DEFAULT_PLATFORM_AVAILABILITY: Record<ShareOption, PlatformAvailability> = {\n native: { available: true },\n copy: { available: true },\n download: { available: true },\n whatsapp: { available: true },\n telegram: { available: true },\n instagram: { available: true },\n facebook: { available: true },\n snapchat: { available: true },\n sms: { available: true },\n email: { available: true },\n linkedin: { available: true },\n reddit: { available: true },\n x: { available: true },\n tiktok: { available: true },\n threads: { available: true },\n};\n\nexport interface UseShareSheetOptions {\n /** URL to share */\n shareUrl: string;\n /** Text to share */\n shareText: string;\n /** Download URL (optional) */\n downloadUrl?: string | null;\n /** Download filename (optional) */\n downloadFilename?: string;\n /** Email subject (optional) */\n emailSubject?: string;\n /** Callback after native share */\n onNativeShare?: () => void;\n /** Callback after copy */\n onCopy?: () => void;\n /** Callback after download starts */\n onDownload?: () => void;\n}\n\n/**\n * Headless hook for share sheet functionality.\n * Use this to build your own custom share UI.\n */\nexport function useShareSheet({\n shareUrl,\n shareText,\n downloadUrl,\n downloadFilename,\n emailSubject = \"Share\",\n onNativeShare,\n onCopy,\n onDownload,\n}: UseShareSheetOptions): UseShareSheetReturn {\n const [copied, setCopied] = useState(false);\n const [downloading, setDownloading] = useState(false);\n\n // Use state for values that depend on browser APIs to avoid hydration mismatch\n // Initial values match what server renders (conservative defaults)\n const [canNativeShare, setCanNativeShare] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n const [platformAvailability, setPlatformAvailability] = useState<Record<ShareOption, PlatformAvailability>>(\n DEFAULT_PLATFORM_AVAILABILITY\n );\n\n // Detect browser capabilities after mount (client-side only)\n useEffect(() => {\n setCanNativeShare(typeof navigator !== \"undefined\" && \"share\" in navigator);\n setIsMobile(isMobileDevice());\n setPlatformAvailability(getAllPlatformAvailability());\n }, []);\n\n const safeUrl = getSafeUrl(shareUrl);\n\n const copyLink = useCallback(async () => {\n if (!safeUrl) return;\n try {\n await navigator.clipboard.writeText(safeUrl);\n setCopied(true);\n onCopy?.();\n setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignore\n }\n }, [safeUrl, onCopy]);\n\n const nativeShare = useCallback(async () => {\n if (!safeUrl) return;\n const nav = navigator as Navigator & {\n share?: (data: ShareData) => Promise<void>;\n };\n if (!(\"share\" in nav) || typeof nav.share !== \"function\") return;\n try {\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n } catch {\n // user canceled or share failed -> ignore\n }\n }, [safeUrl, shareText, onNativeShare]);\n\n const downloadFile = useCallback(async () => {\n const url = (downloadUrl ?? \"\").trim();\n if (!url) return;\n try {\n setDownloading(true);\n onDownload?.();\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch file (${res.status})`);\n const blob = await res.blob();\n const href = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = href;\n a.download = downloadFilename || \"download\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(href);\n } catch {\n // ignore\n } finally {\n setDownloading(false);\n }\n }, [downloadUrl, downloadFilename, onDownload]);\n\n const shareWhatsApp = useCallback(() => {\n shareToWhatsApp(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareTelegram = useCallback(() => {\n shareToTelegram(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareX = useCallback(() => {\n shareToX(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareFacebook = useCallback(() => {\n shareToFacebook(safeUrl);\n }, [safeUrl]);\n\n const shareInstagram = useCallback(() => {\n openInstagram();\n }, []);\n\n const shareTikTok = useCallback(() => {\n openTikTok();\n }, []);\n\n const shareThreads = useCallback(() => {\n openThreads();\n }, []);\n\n const shareSnapchat = useCallback(() => {\n shareToSnapchat(safeUrl);\n }, [safeUrl]);\n\n const shareSMS = useCallback(() => {\n shareViaSMS(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareEmail = useCallback(() => {\n shareViaEmail(safeUrl, shareText, emailSubject);\n }, [safeUrl, shareText, emailSubject]);\n\n const shareLinkedIn = useCallback(() => {\n shareToLinkedIn(safeUrl);\n }, [safeUrl]);\n\n const shareReddit = useCallback(() => {\n shareToReddit(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n return {\n canNativeShare,\n copied,\n downloading,\n safeUrl,\n isMobile,\n platformAvailability,\n copyLink,\n nativeShare,\n downloadFile,\n shareWhatsApp,\n shareTelegram,\n shareX,\n shareFacebook,\n shareInstagram,\n shareTikTok,\n shareThreads,\n shareSnapchat,\n shareSMS,\n shareEmail,\n shareLinkedIn,\n shareReddit,\n };\n}\n\n/**\n * Hook to fetch OG (Open Graph) data from a URL.\n * Automatically fetches and caches OG metadata for link previews.\n */\nexport function useOGData(url: string | undefined): {\n ogData: OGData | null;\n loading: boolean;\n error: string | null;\n} {\n const [ogData, setOgData] = useState<OGData | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!url) {\n setOgData(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n fetchOGData(url)\n .then((data) => {\n if (!cancelled) {\n setOgData(data);\n setLoading(false);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to fetch OG data\");\n setLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n return { ogData, loading, error };\n}\n\n// Legacy export for backwards compatibility\n/** @deprecated Use useShareSheet instead */\nexport const useShareMenu = useShareSheet;\n/** @deprecated Use UseShareSheetOptions instead */\nexport type UseShareMenuOptions = UseShareSheetOptions;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { ShareOption, PlatformAvailability } from \"./types\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function openUrl(url: string) {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function getSafeUrl(shareUrl: string): string {\n return shareUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n}\n\n/**\n * Detect if the current device is a mobile device.\n * Uses user agent detection as the primary method.\n */\nexport function isMobileDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || navigator.vendor || \"\";\n \n // Check for mobile user agents\n const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;\n \n // Also check for touch capability as a secondary signal\n const hasTouch = typeof window !== \"undefined\" && (\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0\n );\n \n // User agent is more reliable than touch detection alone\n // (many desktop browsers support touch)\n return mobileRegex.test(userAgent);\n}\n\n/**\n * Detect if the current device is iOS\n */\nexport function isIOSDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /iPhone|iPad|iPod/i.test(userAgent);\n}\n\n/**\n * Detect if the current device is Android\n */\nexport function isAndroidDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /Android/i.test(userAgent);\n}\n\n/** Platforms that require mobile devices (deep links / URL schemes) */\nexport const MOBILE_ONLY_PLATFORMS: readonly ShareOption[] = [\n \"instagram\",\n \"tiktok\", \n \"threads\",\n \"sms\",\n] as const;\n\n/** Platforms that work better on mobile but may partially work on desktop */\nexport const MOBILE_PREFERRED_PLATFORMS: readonly ShareOption[] = [\n \"snapchat\",\n \"whatsapp\",\n] as const;\n\n/**\n * Check if a share platform is available on the current device.\n * Returns availability status and reason if unavailable.\n */\nexport function checkPlatformAvailability(platform: ShareOption): PlatformAvailability {\n const isMobile = isMobileDevice();\n \n // Deep link platforms - require mobile device\n if (MOBILE_ONLY_PLATFORMS.includes(platform)) {\n if (!isMobile) {\n return {\n available: false,\n reason: `${platform} requires a mobile device with the app installed`,\n };\n }\n }\n \n // SMS - requires mobile or device with SMS capability\n if (platform === \"sms\" && !isMobile) {\n return {\n available: false,\n reason: \"SMS sharing requires a mobile device\",\n };\n }\n \n // Native share - check browser support\n if (platform === \"native\") {\n const canShare = typeof navigator !== \"undefined\" && \"share\" in navigator;\n if (!canShare) {\n return {\n available: false,\n reason: \"Native share is not supported by this browser\",\n };\n }\n }\n \n return { available: true };\n}\n\n/**\n * Get availability status for all platforms.\n */\nexport function getAllPlatformAvailability(): Record<ShareOption, PlatformAvailability> {\n const platforms: ShareOption[] = [\n \"native\", \"copy\", \"download\", \"whatsapp\", \"telegram\",\n \"instagram\", \"facebook\", \"snapchat\", \"sms\", \"email\",\n \"linkedin\", \"reddit\", \"x\", \"tiktok\", \"threads\",\n ];\n \n const result: Partial<Record<ShareOption, PlatformAvailability>> = {};\n for (const platform of platforms) {\n result[platform] = checkPlatformAvailability(platform);\n }\n \n return result as Record<ShareOption, PlatformAvailability>;\n}\n\n/**\n * Log a warning to console when a platform is not available.\n */\nexport function warnUnavailablePlatform(platform: ShareOption, reason: string): void {\n console.warn(\n `[react-sharesheet] ${platform} sharing is not available: ${reason}. ` +\n `This share option may not work correctly on this device.`\n );\n}\n\n","// OG Data fetcher using Microlink API (free, no API key required)\n\nexport interface OGData {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n siteName?: string;\n}\n\nexport interface OGFetchResult {\n data: OGData | null;\n loading: boolean;\n error: string | null;\n}\n\n// Cache to avoid re-fetching the same URL\nconst ogCache = new Map<string, OGData>();\n\nexport async function fetchOGData(url: string): Promise<OGData | null> {\n // Check cache first\n if (ogCache.has(url)) {\n return ogCache.get(url)!;\n }\n\n try {\n // Use Microlink API to fetch OG data (free tier, no API key needed)\n const apiUrl = `https://api.microlink.io?url=${encodeURIComponent(url)}`;\n const response = await fetch(apiUrl);\n \n if (!response.ok) {\n throw new Error(`Failed to fetch OG data: ${response.status}`);\n }\n\n const json = await response.json();\n \n if (json.status !== \"success\" || !json.data) {\n return null;\n }\n\n const { title, description, image, url: canonicalUrl, publisher } = json.data;\n\n const ogData: OGData = {\n title: title || undefined,\n description: description || undefined,\n image: image?.url || undefined,\n url: canonicalUrl || url,\n siteName: publisher || undefined,\n };\n\n // Cache the result\n ogCache.set(url, ogData);\n\n return ogData;\n } catch (error) {\n console.warn(\"[react-sharesheet] Failed to fetch OG data:\", error);\n return null;\n }\n}\n\n// Clear cache (useful for testing or forcing refresh)\nexport function clearOGCache(): void {\n ogCache.clear();\n}\n","import { \n openUrl, \n checkPlatformAvailability, \n warnUnavailablePlatform,\n} from \"./utils\";\n\nexport function shareToWhatsApp(url: string, text: string) {\n const encoded = encodeURIComponent(`${text}\\n${url}`);\n openUrl(`https://api.whatsapp.com/send?text=${encoded}`);\n}\n\nexport function shareToTelegram(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://t.me/share/url?url=${encodedUrl}&text=${encodedText}`);\n}\n\nexport function shareToX(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://x.com/intent/tweet?text=${encodedText}&url=${encodedUrl}`);\n}\n\nexport function shareToFacebook(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`);\n}\n\nexport function openInstagram() {\n const availability = checkPlatformAvailability(\"instagram\");\n if (!availability.available) {\n warnUnavailablePlatform(\"instagram\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"instagram://\";\n}\n\nexport function openTikTok() {\n const availability = checkPlatformAvailability(\"tiktok\");\n if (!availability.available) {\n warnUnavailablePlatform(\"tiktok\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"tiktok://\";\n}\n\nexport function openThreads() {\n const availability = checkPlatformAvailability(\"threads\");\n if (!availability.available) {\n warnUnavailablePlatform(\"threads\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"threads://\";\n}\n\nexport function shareToSnapchat(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.snapchat.com/scan?attachmentUrl=${encodedUrl}`);\n}\n\nexport function shareViaSMS(url: string, text: string) {\n const availability = checkPlatformAvailability(\"sms\");\n if (!availability.available) {\n warnUnavailablePlatform(\"sms\", availability.reason!);\n // Still attempt to open - it may work on some devices\n }\n const body = encodeURIComponent(`${text}\\n${url}`);\n window.location.href = `sms:?body=${body}`;\n}\n\nexport function shareViaEmail(url: string, text: string, subject = \"Share\") {\n const encodedSubject = encodeURIComponent(subject);\n const body = encodeURIComponent(`${text}\\n\\n${url}`);\n window.location.href = `mailto:?subject=${encodedSubject}&body=${body}`;\n}\n\nexport function shareToLinkedIn(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`);\n}\n\nexport function shareToReddit(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.reddit.com/submit?url=${encodedUrl}&title=${encodedText}`);\n}\n\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n LuDownload,\n LuLink,\n LuMail,\n LuMessageCircle,\n LuSend,\n} from \"react-icons/lu\";\nimport {\n FaFacebookF,\n FaInstagram,\n FaLinkedin,\n FaReddit,\n FaTelegramPlane,\n FaTiktok,\n FaWhatsapp,\n} from \"react-icons/fa\";\nimport { FaXTwitter, FaThreads, FaSnapchat } from \"react-icons/fa6\";\nimport type { ShareOption } from \"./types\";\n\n/** Platform color configuration */\nexport interface PlatformColor {\n /** Background color (hex) */\n bg: string;\n /** Text/icon color (hex) */\n text: string;\n}\n\n/** Platform configuration */\nexport interface PlatformConfig {\n /** Platform identifier */\n id: ShareOption;\n /** Display label */\n label: string;\n /** Colors */\n colors: PlatformColor;\n /** Icon component (accepts size prop) */\n Icon: (props: { size?: number; className?: string }) => ReactNode;\n /** CSS variable name for background */\n cssVar: string;\n}\n\n/** All platform IDs in default order */\nexport const PLATFORM_IDS: readonly ShareOption[] = [\n \"native\",\n \"copy\",\n \"download\",\n \"whatsapp\",\n \"telegram\",\n \"instagram\",\n \"facebook\",\n \"snapchat\",\n \"sms\",\n \"email\",\n \"linkedin\",\n \"reddit\",\n \"x\",\n \"tiktok\",\n \"threads\",\n] as const;\n\n/** Platform colors - hex values for each platform (SOURCE OF TRUTH) */\nexport const PLATFORM_COLORS: Record<ShareOption, PlatformColor> = {\n native: { bg: \"#7c3aed\", text: \"#ffffff\" },\n copy: { bg: \"#3b82f6\", text: \"#ffffff\" },\n download: { bg: \"#ef4444\", text: \"#ffffff\" },\n whatsapp: { bg: \"#25D366\", text: \"#ffffff\" },\n telegram: { bg: \"#229ED9\", text: \"#ffffff\" },\n instagram: { bg: \"#E1306C\", text: \"#ffffff\" },\n facebook: { bg: \"#1877F2\", text: \"#ffffff\" },\n snapchat: { bg: \"#FFFC00\", text: \"#000000\" },\n sms: { bg: \"#22c55e\", text: \"#ffffff\" },\n email: { bg: \"#f97316\", text: \"#ffffff\" },\n linkedin: { bg: \"#0A66C2\", text: \"#ffffff\" },\n reddit: { bg: \"#FF4500\", text: \"#ffffff\" },\n x: { bg: \"#000000\", text: \"#ffffff\" },\n tiktok: { bg: \"#000000\", text: \"#ffffff\" },\n threads: { bg: \"#000000\", text: \"#ffffff\" },\n} as const;\n\n/** Platform labels (SOURCE OF TRUTH) */\nexport const PLATFORM_LABELS: Record<ShareOption, string> = {\n native: \"Share…\",\n copy: \"Copy\",\n download: \"Download\",\n whatsapp: \"WhatsApp\",\n telegram: \"Telegram\",\n instagram: \"Instagram\",\n facebook: \"Facebook\",\n snapchat: \"Snapchat\",\n sms: \"SMS\",\n email: \"Email\",\n linkedin: \"LinkedIn\",\n reddit: \"Reddit\",\n x: \"X\",\n tiktok: \"TikTok\",\n threads: \"Threads\",\n} as const;\n\n/** Platform icons - React components (SOURCE OF TRUTH) */\nexport const PLATFORM_ICONS: Record<ShareOption, (props: { size?: number; className?: string }) => ReactNode> = {\n native: ({ size = 22, className }) => <LuSend size={size} className={className} />,\n copy: ({ size = 22, className }) => <LuLink size={size} className={className} />,\n download: ({ size = 22, className }) => <LuDownload size={size} className={className} />,\n whatsapp: ({ size = 22, className }) => <FaWhatsapp size={size} className={className} />,\n telegram: ({ size = 22, className }) => <FaTelegramPlane size={size} className={className} />,\n instagram: ({ size = 22, className }) => <FaInstagram size={size} className={className} />,\n facebook: ({ size = 22, className }) => <FaFacebookF size={size} className={className} />,\n snapchat: ({ size = 22, className }) => <FaSnapchat size={size} className={className} />,\n sms: ({ size = 22, className }) => <LuMessageCircle size={size} className={className} />,\n email: ({ size = 22, className }) => <LuMail size={size} className={className} />,\n linkedin: ({ size = 22, className }) => <FaLinkedin size={size} className={className} />,\n reddit: ({ size = 22, className }) => <FaReddit size={size} className={className} />,\n x: ({ size = 22, className }) => <FaXTwitter size={size} className={className} />,\n tiktok: ({ size = 22, className }) => <FaTiktok size={size} className={className} />,\n threads: ({ size = 22, className }) => <FaThreads size={size} className={className} />,\n} as const;\n\n/** CSS variable names for platform backgrounds */\nexport const PLATFORM_CSS_VARS: Record<ShareOption, string> = {\n native: \"--sharesheet-native-bg\",\n copy: \"--sharesheet-copy-bg\",\n download: \"--sharesheet-download-bg\",\n whatsapp: \"--sharesheet-whatsapp-bg\",\n telegram: \"--sharesheet-telegram-bg\",\n instagram: \"--sharesheet-instagram-bg\",\n facebook: \"--sharesheet-facebook-bg\",\n snapchat: \"--sharesheet-snapchat-bg\",\n sms: \"--sharesheet-sms-bg\",\n email: \"--sharesheet-email-bg\",\n linkedin: \"--sharesheet-linkedin-bg\",\n reddit: \"--sharesheet-reddit-bg\",\n x: \"--sharesheet-x-bg\",\n tiktok: \"--sharesheet-tiktok-bg\",\n threads: \"--sharesheet-threads-bg\",\n} as const;\n\n/** Full platform configurations */\nexport const PLATFORMS: Record<ShareOption, PlatformConfig> = Object.fromEntries(\n PLATFORM_IDS.map((id) => [\n id,\n {\n id,\n label: PLATFORM_LABELS[id],\n colors: PLATFORM_COLORS[id],\n Icon: PLATFORM_ICONS[id],\n cssVar: PLATFORM_CSS_VARS[id],\n },\n ])\n) as Record<ShareOption, PlatformConfig>;\n\n/** Get platform config by id */\nexport function getPlatform(id: ShareOption): PlatformConfig {\n return PLATFORMS[id];\n}\n\n/** Get all platform configs as array */\nexport function getAllPlatforms(): PlatformConfig[] {\n return PLATFORM_IDS.map((id) => PLATFORMS[id]);\n}\n\n/** Get platform color */\nexport function getPlatformColor(id: ShareOption): PlatformColor {\n return PLATFORM_COLORS[id];\n}\n\n/** Get platform icon component */\nexport function getPlatformIcon(id: ShareOption): (props: { size?: number; className?: string }) => ReactNode {\n return PLATFORM_ICONS[id];\n}\n\n/** Get platform label */\nexport function getPlatformLabel(id: ShareOption): string {\n return PLATFORM_LABELS[id];\n}\n\n/** Generate CSS variable defaults from platform colors */\nexport function generateCssVarDefaults(): Record<string, string> {\n const defaults: Record<string, string> = {};\n PLATFORM_IDS.forEach((id) => {\n defaults[PLATFORM_CSS_VARS[id]] = PLATFORM_COLORS[id].bg;\n });\n return defaults;\n}\n"],"mappings":"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","names":[]}
package/dist/headless.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/hooks.ts
2
- import { useMemo, useState, useCallback, useEffect } from "react";
2
+ import { useState, useCallback, useEffect } from "react";
3
3
 
4
4
  // src/utils.ts
5
5
  import { clsx } from "clsx";
@@ -13,6 +13,75 @@ function openUrl(url) {
13
13
  function getSafeUrl(shareUrl) {
14
14
  return shareUrl || (typeof window !== "undefined" ? window.location.href : "");
15
15
  }
16
+ function isMobileDevice() {
17
+ if (typeof navigator === "undefined") return false;
18
+ const userAgent = navigator.userAgent || navigator.vendor || "";
19
+ const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;
20
+ const hasTouch = typeof window !== "undefined" && ("ontouchstart" in window || navigator.maxTouchPoints > 0);
21
+ return mobileRegex.test(userAgent);
22
+ }
23
+ var MOBILE_ONLY_PLATFORMS = [
24
+ "instagram",
25
+ "tiktok",
26
+ "threads",
27
+ "sms"
28
+ ];
29
+ function checkPlatformAvailability(platform) {
30
+ const isMobile = isMobileDevice();
31
+ if (MOBILE_ONLY_PLATFORMS.includes(platform)) {
32
+ if (!isMobile) {
33
+ return {
34
+ available: false,
35
+ reason: `${platform} requires a mobile device with the app installed`
36
+ };
37
+ }
38
+ }
39
+ if (platform === "sms" && !isMobile) {
40
+ return {
41
+ available: false,
42
+ reason: "SMS sharing requires a mobile device"
43
+ };
44
+ }
45
+ if (platform === "native") {
46
+ const canShare = typeof navigator !== "undefined" && "share" in navigator;
47
+ if (!canShare) {
48
+ return {
49
+ available: false,
50
+ reason: "Native share is not supported by this browser"
51
+ };
52
+ }
53
+ }
54
+ return { available: true };
55
+ }
56
+ function getAllPlatformAvailability() {
57
+ const platforms = [
58
+ "native",
59
+ "copy",
60
+ "download",
61
+ "whatsapp",
62
+ "telegram",
63
+ "instagram",
64
+ "facebook",
65
+ "snapchat",
66
+ "sms",
67
+ "email",
68
+ "linkedin",
69
+ "reddit",
70
+ "x",
71
+ "tiktok",
72
+ "threads"
73
+ ];
74
+ const result = {};
75
+ for (const platform of platforms) {
76
+ result[platform] = checkPlatformAvailability(platform);
77
+ }
78
+ return result;
79
+ }
80
+ function warnUnavailablePlatform(platform, reason) {
81
+ console.warn(
82
+ `[react-sharesheet] ${platform} sharing is not available: ${reason}. This share option may not work correctly on this device.`
83
+ );
84
+ }
16
85
 
17
86
  // src/og-fetcher.ts
18
87
  var ogCache = /* @__PURE__ */ new Map();
@@ -70,12 +139,24 @@ function shareToFacebook(url) {
70
139
  openUrl(`https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`);
71
140
  }
72
141
  function openInstagram() {
142
+ const availability = checkPlatformAvailability("instagram");
143
+ if (!availability.available) {
144
+ warnUnavailablePlatform("instagram", availability.reason);
145
+ }
73
146
  window.location.href = "instagram://";
74
147
  }
75
148
  function openTikTok() {
149
+ const availability = checkPlatformAvailability("tiktok");
150
+ if (!availability.available) {
151
+ warnUnavailablePlatform("tiktok", availability.reason);
152
+ }
76
153
  window.location.href = "tiktok://";
77
154
  }
78
155
  function openThreads() {
156
+ const availability = checkPlatformAvailability("threads");
157
+ if (!availability.available) {
158
+ warnUnavailablePlatform("threads", availability.reason);
159
+ }
79
160
  window.location.href = "threads://";
80
161
  }
81
162
  function shareToSnapchat(url) {
@@ -83,6 +164,10 @@ function shareToSnapchat(url) {
83
164
  openUrl(`https://www.snapchat.com/scan?attachmentUrl=${encodedUrl}`);
84
165
  }
85
166
  function shareViaSMS(url, text) {
167
+ const availability = checkPlatformAvailability("sms");
168
+ if (!availability.available) {
169
+ warnUnavailablePlatform("sms", availability.reason);
170
+ }
86
171
  const body = encodeURIComponent(`${text}
87
172
  ${url}`);
88
173
  window.location.href = `sms:?body=${body}`;
@@ -105,6 +190,23 @@ function shareToReddit(url, text) {
105
190
  }
106
191
 
107
192
  // src/hooks.ts
193
+ var DEFAULT_PLATFORM_AVAILABILITY = {
194
+ native: { available: true },
195
+ copy: { available: true },
196
+ download: { available: true },
197
+ whatsapp: { available: true },
198
+ telegram: { available: true },
199
+ instagram: { available: true },
200
+ facebook: { available: true },
201
+ snapchat: { available: true },
202
+ sms: { available: true },
203
+ email: { available: true },
204
+ linkedin: { available: true },
205
+ reddit: { available: true },
206
+ x: { available: true },
207
+ tiktok: { available: true },
208
+ threads: { available: true }
209
+ };
108
210
  function useShareSheet({
109
211
  shareUrl,
110
212
  shareText,
@@ -117,8 +219,15 @@ function useShareSheet({
117
219
  }) {
118
220
  const [copied, setCopied] = useState(false);
119
221
  const [downloading, setDownloading] = useState(false);
120
- const canNativeShare = useMemo(() => {
121
- return typeof navigator !== "undefined" && "share" in navigator;
222
+ const [canNativeShare, setCanNativeShare] = useState(false);
223
+ const [isMobile, setIsMobile] = useState(false);
224
+ const [platformAvailability, setPlatformAvailability] = useState(
225
+ DEFAULT_PLATFORM_AVAILABILITY
226
+ );
227
+ useEffect(() => {
228
+ setCanNativeShare(typeof navigator !== "undefined" && "share" in navigator);
229
+ setIsMobile(isMobileDevice());
230
+ setPlatformAvailability(getAllPlatformAvailability());
122
231
  }, []);
123
232
  const safeUrl = getSafeUrl(shareUrl);
124
233
  const copyLink = useCallback(async () => {
@@ -208,6 +317,8 @@ function useShareSheet({
208
317
  copied,
209
318
  downloading,
210
319
  safeUrl,
320
+ isMobile,
321
+ platformAvailability,
211
322
  copyLink,
212
323
  nativeShare,
213
324
  downloadFile,
@@ -260,12 +371,12 @@ var useShareMenu = useShareSheet;
260
371
 
261
372
  // src/platforms.tsx
262
373
  import {
263
- Download,
264
- Link as LinkIcon,
265
- Mail,
266
- MessageCircle,
267
- Send
268
- } from "lucide-react";
374
+ LuDownload,
375
+ LuLink,
376
+ LuMail,
377
+ LuMessageCircle,
378
+ LuSend
379
+ } from "react-icons/lu";
269
380
  import {
270
381
  FaFacebookF,
271
382
  FaInstagram,
@@ -329,16 +440,16 @@ var PLATFORM_LABELS = {
329
440
  threads: "Threads"
330
441
  };
331
442
  var PLATFORM_ICONS = {
332
- native: ({ size = 22, className }) => /* @__PURE__ */ jsx(Send, { size, className }),
333
- copy: ({ size = 22, className }) => /* @__PURE__ */ jsx(LinkIcon, { size, className }),
334
- download: ({ size = 22, className }) => /* @__PURE__ */ jsx(Download, { size, className }),
443
+ native: ({ size = 22, className }) => /* @__PURE__ */ jsx(LuSend, { size, className }),
444
+ copy: ({ size = 22, className }) => /* @__PURE__ */ jsx(LuLink, { size, className }),
445
+ download: ({ size = 22, className }) => /* @__PURE__ */ jsx(LuDownload, { size, className }),
335
446
  whatsapp: ({ size = 22, className }) => /* @__PURE__ */ jsx(FaWhatsapp, { size, className }),
336
447
  telegram: ({ size = 22, className }) => /* @__PURE__ */ jsx(FaTelegramPlane, { size, className }),
337
448
  instagram: ({ size = 22, className }) => /* @__PURE__ */ jsx(FaInstagram, { size, className }),
338
449
  facebook: ({ size = 22, className }) => /* @__PURE__ */ jsx(FaFacebookF, { size, className }),
339
450
  snapchat: ({ size = 22, className }) => /* @__PURE__ */ jsx(FaSnapchat, { size, className }),
340
- sms: ({ size = 22, className }) => /* @__PURE__ */ jsx(MessageCircle, { size, className }),
341
- email: ({ size = 22, className }) => /* @__PURE__ */ jsx(Mail, { size, className }),
451
+ sms: ({ size = 22, className }) => /* @__PURE__ */ jsx(LuMessageCircle, { size, className }),
452
+ email: ({ size = 22, className }) => /* @__PURE__ */ jsx(LuMail, { size, className }),
342
453
  linkedin: ({ size = 22, className }) => /* @__PURE__ */ jsx(FaLinkedin, { size, className }),
343
454
  reddit: ({ size = 22, className }) => /* @__PURE__ */ jsx(FaReddit, { size, className }),
344
455
  x: ({ size = 22, className }) => /* @__PURE__ */ jsx(FaXTwitter, { size, className }),