import React, { useState, useMemo, useCallback, } from 'react'; import { pagePathUtils } from '@growi/core/dist/utils'; import { useTranslation } from 'next-i18next'; import PropTypes from 'prop-types'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem, Tooltip, } from 'reactstrap'; import styles from './CopyDropdown.module.scss'; const { encodeSpaces } = pagePathUtils; /* eslint-disable react/prop-types */ const DropdownItemContents = ({ title, contents }) => ( <>
{title}
{contents}
); /* eslint-enable react/prop-types */ export const CopyDropdown = (props) => { const [dropdownOpen, setDropdownOpen] = useState(false); const [tooltipOpen, setTooltipOpen] = useState(false); const [isParamsAppended, setParamsAppended] = useState(!props.isShareLinkMode); /* * functions to construct labels and URLs */ const getUriParams = useCallback(() => { if (!isParamsAppended || !dropdownOpen) { return ''; } const { search, hash, } = window.location; return `${search}${hash}`; }, [isParamsAppended, dropdownOpen]); const pagePathWithParams = useMemo(() => { const { pagePath } = props; return decodeURI(`${pagePath}${getUriParams()}`); }, [props, getUriParams]); const pagePathUrl = useMemo(() => { const { origin } = window.location; return `${origin}${encodeSpaces(pagePathWithParams)}`; }, [pagePathWithParams]); const permalink = useMemo(() => { const { origin } = window.location; const { pageId, isShareLinkMode } = props; if (pageId == null) { return null; } if (isShareLinkMode) { return decodeURI(`${origin}/share/${pageId}`); } return encodeSpaces(decodeURI(`${origin}/${pageId}${getUriParams()}`)); }, [props, getUriParams]); const markdownLink = useMemo(() => { const { pagePath } = props; const label = decodeURI(`${pagePath}${getUriParams()}`); // const permalink = generatePermalink(); return `[${label}](${permalink})`; }, [props, getUriParams, permalink]); /** * control */ const toggleDropdown = useCallback(() => { setDropdownOpen(!dropdownOpen); }, [dropdownOpen]); const toggleAppendParams = useCallback(() => { setParamsAppended(!isParamsAppended); }, [isParamsAppended]); const showToolTip = useCallback(() => { setTooltipOpen(true); setTimeout(() => { setTooltipOpen(false); }, 1000); }, []); /* * render */ const { t } = useTranslation('commons'); const { dropdownToggleId, pageId, dropdownToggleClassName, children, isShareLinkMode, } = props; const customSwitchForParamsId = `customSwitchForParams_${dropdownToggleId}`; return ( <> {children}
{ t('copy_to_clipboard.Copy to clipboard') } { !isShareLinkMode && (
) }
{/* Page path */} {/* Page path URL */} {/* Permanent Link */} { pageId && ( )} {/* Page path + Permanent Link */} { pageId && ( {pagePathWithParams}
{permalink}} />
)} {/* Markdown Link */} { pageId && ( )}
copied! ); }; CopyDropdown.propTypes = { children: PropTypes.node.isRequired, dropdownToggleId: PropTypes.string.isRequired, pagePath: PropTypes.string.isRequired, pageId: PropTypes.string, dropdownToggleClassName: PropTypes.string, isShareLinkMode: PropTypes.bool, };