import { useCallback, useMemo } from 'react' /** * useWebShare – abstracts native Web Share API with a fallback callback. * * Usage: * const { canNativeShare, share } = useWebShare({ onFallback }) * share({ title, text, url }) * * If `navigator.share` is available the browser-native share sheet opens. * Otherwise `onFallback({ title, text, url })` is called (e.g. open a modal). */ export default function useWebShare({ onFallback } = {}) { const canNativeShare = useMemo( () => typeof navigator !== 'undefined' && typeof navigator.share === 'function', [], ) const share = useCallback( async ({ title, text, url }) => { if (canNativeShare) { try { await navigator.share({ title, text, url }) return { shared: true, native: true } } catch (err) { // User cancelled the native share — don't fall through to modal if (err?.name === 'AbortError') { return { shared: false, native: true } } } } // Fallback — open modal onFallback?.({ title, text, url }) return { shared: false, native: false } }, [canNativeShare, onFallback], ) return { canNativeShare, share } }