import { Trans } from "@lingui/macro" import { ActionIcon, Box, CopyButton, Divider, SimpleGrid } from "@mantine/core" import { Constants } from "app/constants" import { useAppSelector } from "app/store" import type { SharingSettings } from "app/types" import { useBrowserExtension } from "hooks/useBrowserExtension" import { useMobile } from "hooks/useMobile" import type { IconType } from "react-icons" import { TbCheck, TbCopy, TbDeviceDesktopShare, TbDeviceMobileShare } from "react-icons/tb" import { tss } from "tss" type Color = `#${string}` const useStyles = tss .withParams<{ color: Color }>() .create(({ theme, colorScheme, color }) => ({ icon: { color, backgroundColor: colorScheme === "dark" ? theme.colors.gray[2] : "white", }, })) function ShareButton({ icon, color, onClick }: { icon: IconType; color: Color; onClick: () => void }) { const { classes } = useStyles({ color, }) return ( {icon({ size: 18 })} ) } function SiteShareButton({ url, icon, color }: { icon: IconType; color: Color; url: string }) { const onClick = () => { window.open(url, "", "menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=800,height=600") } return } function CopyUrlButton({ url }: { url: string }) { return ( {({ copied, copy }) => } ) } function BrowserNativeShareButton({ url, description }: { url: string; description: string }) { const mobile = useMobile() const { isBrowserExtensionPopup } = useBrowserExtension() const onClick = () => { navigator.share({ title: description, url, }) } return ( ) } export function ShareButtons(props: { url: string; description: string }) { const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings) const enabledSharingSites = (Object.keys(Constants.sharing) as Array).filter(site => sharingSettings?.[site]) const url = encodeURIComponent(props.url) const desc = encodeURIComponent(props.description) const clipboardAvailable = typeof navigator.clipboard !== "undefined" const nativeSharingAvailable = typeof navigator.share !== "undefined" const showNativeSection = clipboardAvailable || nativeSharingAvailable const showSharingSites = enabledSharingSites.length > 0 const showDivider = showNativeSection && showSharingSites const showNoSharingOptionsAvailable = !showNativeSection && !showSharingSites return ( <> {showNativeSection && ( {clipboardAvailable && } {nativeSharingAvailable && } )} {showDivider && } {showSharingSites && ( {enabledSharingSites.map(site => ( ))} )} {showNoSharingOptionsAvailable && No sharing options available.} ) }