import { useState } from 'react'; import { createPortal } from 'react-dom'; import { useLocation, useParams } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { autoUpdate, flip, FloatingFocusManager, offset, shift, useClick, useDismiss, useFloating, useId, useInteractions, useRole } from '@floating-ui/react'; import { Comment, useBlock } from '@plebbit/plebbit-react-hooks'; import styles from './post-menu-desktop.module.css'; import { getCommentMediaInfo } from '../../../lib/utils/media-utils'; import { copyShareLinkToClipboard, isValidURL } from '../../../lib/utils/url-utils'; import { isAllView, isCatalogView, isPostPageView, isSubscriptionsView } from '../../../lib/utils/view-utils'; import useHide from '../../../hooks/use-hide'; import _ from 'lodash'; interface PostMenuDesktopProps { cid: string; isDescription?: boolean; isInAllView?: boolean; isInSubscriptionsView?: boolean; isRules?: boolean; subplebbitAddress: string; onClose: () => void; } const CopyLinkButton = ({ cid, subplebbitAddress, onClose }: PostMenuDesktopProps) => { const { t } = useTranslation(); return (
{ copyShareLinkToClipboard(subplebbitAddress, cid); onClose(); }} >
{t('copy_link')}
); }; const ImageSearchButton = ({ url, onClose }: { url: string; onClose: () => void }) => { const { t } = useTranslation(); const [isImageSearchMenuOpen, setIsImageSearchMenuOpen] = useState(false); const { refs, floatingStyles } = useFloating({ placement: 'right-start', middleware: [flip(), shift({ padding: 10 })], }); return (
setIsImageSearchMenuOpen(true)} onMouseLeave={() => setIsImageSearchMenuOpen(false)} ref={refs.setReference} onClick={onClose} > {_.capitalize(t('image_search'))} » {isImageSearchMenuOpen && (
Google
Yandex
SauceNAO
)}
); }; const ViewOnButton = ({ cid, isDescription, isInAllView, isInSubscriptionsView, isRules, subplebbitAddress, onClose }: PostMenuDesktopProps) => { const { t } = useTranslation(); const [isClientRedirectMenuOpen, setIsClientRedirectMenuOpen] = useState(false); const viewOnOtherClientLink = `p/${isInAllView ? 'all' : isInSubscriptionsView ? 'subscriptions' : subplebbitAddress}${isDescription || isRules ? '' : `/c/${cid}`}`; const { refs, floatingStyles } = useFloating({ placement: 'right-start', middleware: [flip(), shift({ padding: 10 })], }); return (
setIsClientRedirectMenuOpen(true)} onMouseLeave={() => setIsClientRedirectMenuOpen(false)} ref={refs.setReference} onClick={onClose} > {_.capitalize(t('view_on'))} » {isClientRedirectMenuOpen && (
Seedit
Plebones
)}
); }; const BlockUserButton = ({ address }: { address: string }) => { const { t } = useTranslation(); const { blocked, unblock, block } = useBlock({ address }); return (
{blocked ? t('unblock_user') : t('block_user')}
); }; const BlockBoardButton = ({ address }: { address: string }) => { const { t } = useTranslation(); const { blocked, unblock, block } = useBlock({ address }); return (
{blocked ? t('unblock_board') : t('block_board')}
); }; const PostMenuDesktop = ({ post }: { post: Comment }) => { const { t } = useTranslation(); const { author, cid, isDescription, isRules, link, postCid, subplebbitAddress } = post || {}; const commentMediaInfo = getCommentMediaInfo(post); const { thumbnail, type, url } = commentMediaInfo || {}; const [menuBtnRotated, setMenuBtnRotated] = useState(false); const { hidden, unhide, hide } = useHide({ cid }); const location = useLocation(); const params = useParams(); const isInAllView = isAllView(location.pathname); const isInCatalogView = isCatalogView(location.pathname, params); const isInPostPageView = isPostPageView(location.pathname, params); const isInSubscriptionsView = isSubscriptionsView(location.pathname); const { refs, floatingStyles, context } = useFloating({ placement: 'bottom-start', open: menuBtnRotated, onOpenChange: setMenuBtnRotated, middleware: [offset({ mainAxis: isInCatalogView ? -2 : 6, crossAxis: isInCatalogView ? -1 : 5 }), flip({ fallbackAxisSideDirection: 'end' }), shift({ padding: 10 })], whileElementsMounted: autoUpdate, }); const click = useClick(context); const dismiss = useDismiss(context); const role = useRole(context); const { getReferenceProps, getFloatingProps } = useInteractions([click, dismiss, role]); const headingId = useId(); const handleClose = () => setMenuBtnRotated(false); return ( <> setMenuBtnRotated((prev) => !prev)} style={{ transform: menuBtnRotated ? 'rotate(90deg)' : 'rotate(0deg)' }} > ▶ {menuBtnRotated && createPortal(
{cid && subplebbitAddress && } {!isInPostPageView && !isDescription && !isRules && (
{ hidden ? unhide() : hide(); handleClose(); }} > {hidden ? (postCid === cid ? t('unhide_thread') : t('unhide_post')) : postCid === cid ? t('hide_thread') : t('hide_post')}
)} {link && isValidURL(link) && (type === 'image' || type === 'gif' || thumbnail) && url && } {(isInAllView || isInSubscriptionsView) && }
, document.body, )} ); }; export default PostMenuDesktop;