diff --git a/frontend/src/pages/wiki2/editor-component/header-icon.jsx b/frontend/src/pages/wiki2/editor-component/header-icon.jsx
deleted file mode 100644
index 3468efe007..0000000000
--- a/frontend/src/pages/wiki2/editor-component/header-icon.jsx
+++ /dev/null
@@ -1,123 +0,0 @@
-import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
-import { Popover, PopoverBody } from 'reactstrap';
-import { init } from 'emoji-mart';
-import Picker from '@emoji-mart/react';
-import classnames from 'classnames';
-import data from '@emoji-mart/data';
-import PropTypes from 'prop-types';
-import { gettext } from '../../../utils/constants';
-
-// init data for emoji-mart, used in Picker and `getRandomEmoji` method
-init({ data });
-
-const HeaderIcon = ({ currentPageConfig, onUpdatePage }, ref) => {
- const [isShowIconPanel, setIsShowIconPanel] = useState(false);
- const iconPanelPopoverRef = useRef(null);
-
-
- const handleSetIcon = useCallback((emoji, cb) => {
- onUpdatePage(currentPageConfig.id, { name: currentPageConfig.name, icon: emoji });
- cb && cb();
- }, [currentPageConfig.id, currentPageConfig.name, onUpdatePage]);
-
- const setRandomEmoji = useCallback(() => {
- const nativeEmojis = Reflect.ownKeys(data.natives);
- const emojiCount = nativeEmojis.length;
- const emoji = nativeEmojis[Math.floor(Math.random() * emojiCount)];
- handleSetIcon(emoji);
- }, [handleSetIcon]);
-
- const handleIconRemove = () => {
- handleSetIcon('');
- handleIconPanelDisplayedChange(false);
- };
-
- const handleIconPanelDisplayedChange = useCallback((isShowIconPanel) => {
- setIsShowIconPanel(isShowIconPanel);
- // setIsShowCoverPanel(false);
- }, []);
-
- const handleClickAddIcon = useCallback(() => {
- setRandomEmoji();
- handleIconPanelDisplayedChange(false);
- }, [handleIconPanelDisplayedChange, setRandomEmoji]);
-
- useImperativeHandle(ref, () => {
- return { handleClickAddIcon };
- }, [handleClickAddIcon]);
-
- const handleIconPanelListener = useCallback((e) => {
- const isClickInPopover = iconPanelPopoverRef.current.contains(e.target);
- if (!isClickInPopover) handleIconPanelDisplayedChange(false);
- }, [handleIconPanelDisplayedChange]);
-
- useEffect(() => {
- if (isShowIconPanel) {
- setTimeout(() => {
- // Avoid open behavior closing popover
- addEventListener('click', handleIconPanelListener);
- }, 0);
- }
- if (!isShowIconPanel) removeEventListener('click', handleIconPanelListener);
-
- return () => {
- removeEventListener('click', handleIconPanelListener);
- };
- }, [handleIconPanelListener, isShowIconPanel]);
-
- // Update current page favicon
- useEffect(() => {
- let faviconUrl = '';
- if (currentPageConfig.icon) {
- faviconUrl = `data:image/svg+xml,`;
- } else {
- const { serviceUrl, mediaUrl, faviconPath } = window.seafile;
- faviconUrl = `${serviceUrl}${mediaUrl}${faviconPath}`;
- }
- document.getElementById('favicon').href = faviconUrl;
- }, [currentPageConfig.icon]);
-
- return (
- <>
-
-
- {currentPageConfig.icon}
-
-
- void 0}
- placement="bottom"
- isOpen={!!(isShowIconPanel && !!currentPageConfig.icon)}
- popperClassName='wiki-icon-popover'
- hideArrow={true}
- >
-
-
- {gettext('Emojis')}
- {gettext('Remove')}
-
-
- handleSetIcon(emoji.native, handleIconPanelDisplayedChange.bind(null, false))}
- previewPosition="none"
- skinTonePosition="none"
- locale={window.seafile.lang.slice(0, 2)}
- maxFrequentRows={2}
- theme="light"
- />
-
-
-
- >
- );
-};
-
-HeaderIcon.propTypes = {
- currentPageConfig: PropTypes.object.isRequired,
- onUpdatePage: PropTypes.func.isRequired,
-};
-
-export default forwardRef(HeaderIcon);
diff --git a/frontend/src/pages/wiki2/editor-component/page-header.jsx b/frontend/src/pages/wiki2/editor-component/page-header.jsx
deleted file mode 100644
index 6a2743be40..0000000000
--- a/frontend/src/pages/wiki2/editor-component/page-header.jsx
+++ /dev/null
@@ -1,166 +0,0 @@
-import React, { useCallback, useEffect, useRef, useState } from 'react';
-import PropTypes from 'prop-types';
-import classnames from 'classnames';
-import { Input, Popover, PopoverBody } from 'reactstrap';
-import { gettext } from '../../../utils/constants';
-import { WIKI_COVER_LIST } from '../constant';
-import HeaderIcon from './header-icon';
-
-const propTypes = {
- currentPageConfig: PropTypes.object.isRequired,
- onUpdatePage: PropTypes.func.isRequired,
-};
-
-const PageHeader = ({ currentPageConfig, onUpdatePage }) => {
- const [isShowController, setIsShowController] = useState(false);
- const [isShowCoverController, setIsShowCoverController] = useState(false);
- const [isShowCoverPanel, setIsShowCoverPanel] = useState(false);
- const coverPanelPopoverRef = useRef(null);
- const headerWrapperRef = useRef(null);
- const headerIconRef = useRef({ handleClickAddIcon: () => void 0 });
-
- const getCoverImgUrl = useCallback((imageName) => {
- const { serviceUrl, mediaUrl } = window.seafile;
- return `${serviceUrl}${mediaUrl}img/wiki/cover/${imageName}`;
- }, []);
-
- const handleRenameDocument = useCallback((e) => {
- const { nativeEvent: { isComposing } } = e;
- if (isComposing) return;
-
- const newName = e.target.value.trim();
- const { id, name, icon } = currentPageConfig;
- if (newName === name) return;
- const pageConfig = { name: newName, icon };
- onUpdatePage && onUpdatePage(id, pageConfig);
- }, [currentPageConfig, onUpdatePage]);
-
- const changeControllerDisplayed = useCallback((isShowController) => {
- if (isShowCoverPanel) return;
- setIsShowController(isShowController);
- }, [isShowCoverPanel]);
-
- const handleCoverPanelDisplayedChange = useCallback((isShowCoverPanel) => {
- setIsShowCoverPanel(isShowCoverPanel);
- }, []);
-
- const handleCoverPanelListener = useCallback((e) => {
- const isClickInPopover = coverPanelPopoverRef.current.contains(e.target);
- if (!isClickInPopover) handleCoverPanelDisplayedChange(false);
- }, [handleCoverPanelDisplayedChange]);
-
- useEffect(() => {
- if (isShowCoverPanel) {
- setTimeout(() => {
- // Avoid open behavior closing popover
- addEventListener('click', handleCoverPanelListener);
- }, 0);
- }
- if (!isShowCoverPanel) removeEventListener('click', handleCoverPanelListener);
-
- return () => {
- removeEventListener('click', handleCoverPanelListener);
- };
- }, [handleCoverPanelListener, isShowCoverPanel]);
-
- const handleAddCover = useCallback(() => {
- const coverName = WIKI_COVER_LIST[Math.floor(Math.random() * WIKI_COVER_LIST.length)];
- const coverImgUrl = `${coverName}`;
- onUpdatePage(currentPageConfig.id, { name: currentPageConfig.name, cover_img_url: coverImgUrl });
- }, [currentPageConfig.id, currentPageConfig.name, onUpdatePage]);
-
- const showCoverController = useCallback(() => {
- setIsShowCoverController(true);
- }, []);
-
- const hideCoverController = useCallback((e) => {
- if (isShowCoverPanel) return;
- setIsShowCoverController(false);
- }, [isShowCoverPanel]);
-
- const handleSetCoverImage = (coverName) => {
- const coverImgUrl = `${coverName}`;
- onUpdatePage(currentPageConfig.id, { name: currentPageConfig.name, cover_img_url: coverImgUrl });
- handleCoverPanelDisplayedChange(false);
- };
-
- const handleCoverRemove = () => {
- onUpdatePage(currentPageConfig.id, { name: currentPageConfig.name, cover_img_url: '' });
- handleCoverPanelDisplayedChange(false);
- };
-
- return (
-
- {currentPageConfig.cover_img_url && (
-
-
})
- {isShowCoverController && (
-
-
{gettext('Change cover')}
-
void 0}
- placement="bottom"
- isOpen={!!(isShowCoverPanel && currentPageConfig.cover_img_url)}
- innerClassName='wiki-cover-panel'
- hideArrow={true}
- popperClassName='wiki-cover-popover'
- >
-
-
- {gettext('Gallery')}
- {gettext('Remove')}
-
-
- {
- WIKI_COVER_LIST.map(imgName => (
-
- ))
- }
-
-
-
-
- )}
-
-
- )}
-
-
-
-
- {!currentPageConfig.icon && (
-
-
- {gettext('Add icon')}
-
- )}
- {!currentPageConfig.cover_img_url && (
-
-
- {gettext('Add cover')}
-
- )}
-
-
-
-
-
-
- );
-};
-
-PageHeader.propTypes = propTypes;
-
-export default PageHeader;
diff --git a/frontend/src/pages/wiki2/main-panel.js b/frontend/src/pages/wiki2/main-panel.js
index f38f40c675..075b8e279d 100644
--- a/frontend/src/pages/wiki2/main-panel.js
+++ b/frontend/src/pages/wiki2/main-panel.js
@@ -7,7 +7,7 @@ import { Utils } from '../../utils/utils';
import Account from '../../components/common/account';
import WikiTopNav from './top-nav';
import { getCurrentPageConfig } from './utils';
-import PageHeader from './editor-component/page-header';
+import RightHeader from './wiki-right-header';
const propTypes = {
path: PropTypes.string.isRequired,
@@ -82,7 +82,7 @@ class MainPanel extends Component {
{isViewingFile && Utils.isSdocFile(this.props.path) && (