Skip to content

Commit

Permalink
optimize code (#7084)
Browse files Browse the repository at this point in the history
  • Loading branch information
shuntian authored Nov 22, 2024
1 parent 0317bb2 commit 2ff5e91
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 46 deletions.
28 changes: 18 additions & 10 deletions frontend/src/pages/wiki2/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import PageUtils from './wiki-nav/page-utils';
import LocalStorage from '../../utils/local-storage-utils';
import { DEFAULT_PAGE_NAME } from './constant';
import { eventBus } from '../../components/common/event-bus';
import { throttle } from './utils';

import '../../css/layout.css';
import '../../css/side-panel.css';
Expand Down Expand Up @@ -117,21 +118,28 @@ class Wiki extends Component {
this.setState({ config: new WikiConfig(wikiConfig || {}) });
};

saveWikiConfig = (wikiConfig, isUpdateBySide = false) => {
updatePageNameToServer = throttle((wikiConfig) => {
wikiAPI.updateWiki2Config(wikiId, JSON.stringify(wikiConfig)).then(res => {
this.setState({
config: new WikiConfig(wikiConfig),
isUpdateBySide,
});
if (isUpdateBySide) {
setTimeout(() => {
this.setState({ isUpdateBySide: false });
}, 300);
}
// nothing todo
}).catch((error) => {
let errorMsg = Utils.getErrorMsg(error);
toaster.danger(errorMsg);
});
}, 1000);

saveWikiConfig = (wikiConfig, isUpdateBySide = false) => {
this.setState({
config: new WikiConfig(wikiConfig),
isUpdateBySide,
}, () => {
this.updatePageNameToServer(wikiConfig);
});

if (isUpdateBySide) {
setTimeout(() => {
this.setState({ isUpdateBySide: false });
}, 300);
}
};

getFirstPageId = (config) => {
Expand Down
44 changes: 8 additions & 36 deletions frontend/src/pages/wiki2/wiki-right-header/page-title-editor.js
Original file line number Diff line number Diff line change
@@ -1,40 +1,12 @@
import React, { useCallback, useEffect, useRef, useState } from 'react';
import PropTypes from 'prop-types';
import { throttle } from '../utils';
import { wikiPermission } from '../../../utils/constants';

function PageTitleEditor({ isUpdateBySide, currentPageConfig, onUpdatePage }) {

const [pageName, setPageName] = useState(currentPageConfig.name);
const isChineseInput = useRef(false);
const contentEditableRef = useRef(null);
const selectionRef = useRef(null);

const saveSelection = () => {
const sel = window.getSelection();
if (sel.rangeCount > 0) {
const range = sel.getRangeAt(0);
selectionRef.current = {
startContainer: range.startContainer,
startOffset: range.startOffset,
endContainer: range.endContainer,
endOffset: range.endOffset
};
}
};

const restoreSelection = () => {
if (selectionRef.current) {
const { startContainer, startOffset, endContainer, endOffset } = selectionRef.current;
const range = window.document.createRange();
range.setStart(startContainer, startOffset);
range.setEnd(endContainer, endOffset);

const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
}
};

const onKeyDown = (event) => {
if (event.keyCode === 13) {
Expand All @@ -50,17 +22,14 @@ function PageTitleEditor({ isUpdateBySide, currentPageConfig, onUpdatePage }) {
const onCompositionEnd = useCallback((e) => {
isChineseInput.current = false;
setPageName(e.target.innerText);
saveSelection();

const newName = e.target.innerText.trim();
const { id, icon } = currentPageConfig;
const pageConfig = { name: newName, icon };
const delayUpdate = throttle(onUpdatePage, 500);
delayUpdate(id, pageConfig);
onUpdatePage(id, pageConfig);
}, [currentPageConfig, onUpdatePage]);

const handleInput = useCallback((e) => {
saveSelection();
if (isChineseInput.current === false) {
setPageName(e.target.innerText);

Expand All @@ -69,21 +38,24 @@ function PageTitleEditor({ isUpdateBySide, currentPageConfig, onUpdatePage }) {
const { id, icon } = currentPageConfig;
const pageConfig = { name: newName, icon };

const delayUpdate = throttle(onUpdatePage, 500);
delayUpdate(id, pageConfig);
onUpdatePage(id, pageConfig);
}
}, [currentPageConfig, onUpdatePage, pageName]);

useEffect(() => {
if (pageName !== currentPageConfig.name && isUpdateBySide) {
setPageName(currentPageConfig.name);
selectionRef.current = null;
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [currentPageConfig.name, isUpdateBySide]);

useEffect(() => {
restoreSelection();
const range = document.createRange();
const selection = window.getSelection();
range.selectNodeContents(contentEditableRef.current);
range.collapse(false);
selection.removeAllRanges();
selection.addRange(range);
}, [pageName]);


Expand Down

0 comments on commit 2ff5e91

Please sign in to comment.