|
@@ -1,13 +1,10 @@
|
|
|
-import type {
|
|
|
|
|
- ReactNode,
|
|
|
|
|
- CSSProperties,
|
|
|
|
|
-} from 'react';
|
|
|
|
|
import React, {
|
|
import React, {
|
|
|
useState, useMemo, useCallback,
|
|
useState, useMemo, useCallback,
|
|
|
} from 'react';
|
|
} from 'react';
|
|
|
|
|
|
|
|
import { pagePathUtils } from '@growi/core/dist/utils';
|
|
import { pagePathUtils } from '@growi/core/dist/utils';
|
|
|
import { useTranslation } from 'next-i18next';
|
|
import { useTranslation } from 'next-i18next';
|
|
|
|
|
+import PropTypes from 'prop-types';
|
|
|
import { CopyToClipboard } from 'react-copy-to-clipboard';
|
|
import { CopyToClipboard } from 'react-copy-to-clipboard';
|
|
|
import {
|
|
import {
|
|
|
Dropdown, DropdownToggle, DropdownMenu, DropdownItem,
|
|
Dropdown, DropdownToggle, DropdownMenu, DropdownItem,
|
|
@@ -18,35 +15,19 @@ import styles from './CopyDropdown.module.scss';
|
|
|
|
|
|
|
|
const { encodeSpaces } = pagePathUtils;
|
|
const { encodeSpaces } = pagePathUtils;
|
|
|
|
|
|
|
|
-type DropdownItemContentsProps = {
|
|
|
|
|
- title: string,
|
|
|
|
|
- contents: ReactNode,
|
|
|
|
|
- className?: string,
|
|
|
|
|
- style?: CSSProperties,
|
|
|
|
|
-}
|
|
|
|
|
-const DropdownItemContents = (props: DropdownItemContentsProps) => {
|
|
|
|
|
- const {
|
|
|
|
|
- title, contents, className, style,
|
|
|
|
|
- } = props;
|
|
|
|
|
- return (
|
|
|
|
|
- <>
|
|
|
|
|
- <div className="h6 mt-1 mb-2"><strong>{title}</strong></div>
|
|
|
|
|
- <div className={`card mb-1 p-2 ${className}`} style={style}>{contents}</div>
|
|
|
|
|
- </>
|
|
|
|
|
- );
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
|
|
+/* eslint-disable react/prop-types */
|
|
|
|
|
+const DropdownItemContents = ({
|
|
|
|
|
+ title, contents, className, style,
|
|
|
|
|
+}) => (
|
|
|
|
|
+ <>
|
|
|
|
|
+ <div className="h6 mt-1 mb-2"><strong>{title}</strong></div>
|
|
|
|
|
+ <div className={`card mb-1 p-2 ${className}`} style={style}>{contents}</div>
|
|
|
|
|
+ </>
|
|
|
|
|
+);
|
|
|
|
|
+/* eslint-enable react/prop-types */
|
|
|
|
|
|
|
|
-type CopyDropdownProps = {
|
|
|
|
|
- children: ReactNode,
|
|
|
|
|
- dropdownToggleId: string,
|
|
|
|
|
- pagePath: string,
|
|
|
|
|
- pageId?: string,
|
|
|
|
|
- dropdownToggleClassName?: string,
|
|
|
|
|
- isShareLinkMode?: boolean,
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-export const CopyDropdown = (props: CopyDropdownProps): JSX.Element => {
|
|
|
|
|
|
|
+export const CopyDropdown = (props) => {
|
|
|
const [dropdownOpen, setDropdownOpen] = useState(false);
|
|
const [dropdownOpen, setDropdownOpen] = useState(false);
|
|
|
const [tooltipOpen, setTooltipOpen] = useState(false);
|
|
const [tooltipOpen, setTooltipOpen] = useState(false);
|
|
|
const [isParamsAppended, setParamsAppended] = useState(!props.isShareLinkMode);
|
|
const [isParamsAppended, setParamsAppended] = useState(!props.isShareLinkMode);
|
|
@@ -227,7 +208,7 @@ export const CopyDropdown = (props: CopyDropdownProps): JSX.Element => {
|
|
|
{ pageId && (
|
|
{ pageId && (
|
|
|
<CopyToClipboard text={markdownLink} onCopy={showToolTip}>
|
|
<CopyToClipboard text={markdownLink} onCopy={showToolTip}>
|
|
|
<DropdownItem className="px-3 text-wrap">
|
|
<DropdownItem className="px-3 text-wrap">
|
|
|
- <DropdownItemContents title={t('copy_to_clipboard.Markdown link')} contents={markdownLink} />
|
|
|
|
|
|
|
+ <DropdownItemContents title={t('copy_to_clipboard.Markdown link')} contents={markdownLink} isContentsWrap />
|
|
|
</DropdownItem>
|
|
</DropdownItem>
|
|
|
</CopyToClipboard>
|
|
</CopyToClipboard>
|
|
|
)}
|
|
)}
|
|
@@ -241,3 +222,13 @@ export const CopyDropdown = (props: CopyDropdownProps): JSX.Element => {
|
|
|
</>
|
|
</>
|
|
|
);
|
|
);
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
|
|
+CopyDropdown.propTypes = {
|
|
|
|
|
+ children: PropTypes.node.isRequired,
|
|
|
|
|
+ dropdownToggleId: PropTypes.string.isRequired,
|
|
|
|
|
+ pagePath: PropTypes.string.isRequired,
|
|
|
|
|
+
|
|
|
|
|
+ pageId: PropTypes.string,
|
|
|
|
|
+ dropdownToggleClassName: PropTypes.string,
|
|
|
|
|
+ isShareLinkMode: PropTypes.bool,
|
|
|
|
|
+};
|