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,
};