diff --git a/frontend/src/pages/wiki2/index.js b/frontend/src/pages/wiki2/index.js index 05d5cd0854..9c315c801a 100644 --- a/frontend/src/pages/wiki2/index.js +++ b/frontend/src/pages/wiki2/index.js @@ -11,6 +11,7 @@ import toaster from '../../components/toast'; import SidePanel from './side-panel'; import MainPanel from './main-panel'; import PageUtils from './view-structure/page-utils'; +import LocalStorage from '../../utils/local-storage-utils'; import '../../css/layout.css'; import '../../css/side-panel.css'; @@ -37,6 +38,7 @@ class Wiki extends Component { repoId: '', seadoc_access_token: '', assets_url: '', + wikiRepoId: null, }; } @@ -56,14 +58,19 @@ class Wiki extends Component { getWikiConfig = () => { wikiAPI.getWiki2Config(wikiId).then(res => { - const { wiki_config, repo_id } = res.data.wiki; + const { wiki_config, repo_id, id: wikiRepoId } = res.data.wiki; const config = new WikiConfig(wiki_config || {}); this.setState({ config, isConfigLoading: false, repoId: repo_id, + wikiRepoId, }, () => { - const pageId = this.getFirstPageId(config); + let pageId = this.getFirstPageId(config); + // opened by url + const urlSearchParams = new URLSearchParams(location.search); + const urlPageId = urlSearchParams.get('page_id'); + if (urlPageId) pageId = urlPageId; if (pageId) { this.setCurrentPage(pageId); } @@ -151,6 +158,27 @@ class Wiki extends Component { window.history.pushState({ url: fileUrl, path: filePath }, filePath, fileUrl); }; + cacheHistoryFiles = (docUuid, name, pageId) => { + let arr = []; + const { wikiRepoId } = this.state; // different from repoId + const recentFiles = LocalStorage.getItem('wiki-recent-files', []); + const newFile = { doc_uuid: docUuid, name: name, wikiRepoId, pageId }; + if (recentFiles.length) { + const isExist = recentFiles.find((item) => item.doc_uuid === docUuid); + if (isExist) return; + if (!isExist) { + let newRecentFiles = recentFiles.slice(0); + if (recentFiles.length === 10) { + newRecentFiles.shift(); + } + arr = [newFile, ...newRecentFiles]; + } + } else { + arr.push(newFile); + } + LocalStorage.setItem('wiki-recent-files', arr); + }; + setCurrentPage = (pageId, callback) => { const { currentPageId, config } = this.state; if (pageId === currentPageId) { @@ -159,10 +187,8 @@ class Wiki extends Component { } const { pages } = config; const currentPage = PageUtils.getPageById(pages, pageId); - const path = currentPage.path; - if (path !== this.state.path) { - this.showPage(pageId, path); - } + const { path, id, name, docUuid } = currentPage; + if (path !== this.state.path) this.showPage(pageId, path); this.onCloseSide(); this.setState({ currentPageId: pageId, @@ -170,6 +196,7 @@ class Wiki extends Component { }, () => { callback && callback(); }); + this.cacheHistoryFiles(docUuid,name,id); }; onUpdatePage = (pageId, newPage) => { diff --git a/frontend/src/pages/wiki2/main-panel.js b/frontend/src/pages/wiki2/main-panel.js index 68f233eb9b..73369d5a88 100644 --- a/frontend/src/pages/wiki2/main-panel.js +++ b/frontend/src/pages/wiki2/main-panel.js @@ -8,7 +8,6 @@ import { Utils } from '../../utils/utils'; import Account from '../../components/common/account'; import WikiTopNav from './top-nav'; import { getCurrentPageConfig } from './utils'; -import WikiExternalOperations from './wiki-external-operations'; const propTypes = { path: PropTypes.string.isRequired, diff --git a/frontend/src/utils/local-storage-utils.js b/frontend/src/utils/local-storage-utils.js new file mode 100644 index 0000000000..1dc483d3ee --- /dev/null +++ b/frontend/src/utils/local-storage-utils.js @@ -0,0 +1,51 @@ +class LocalStorage { + + static setItem(key, value) { + let savedValue; + const valueType = typeof value; + if (valueType === 'string') { + savedValue = value; + } else if (valueType === 'number') { + savedValue = value + ''; + } else { + savedValue = JSON.stringify(value); + } + return window.localStorage.setItem(key, savedValue); + } + + static getItem(key, defaultValue) { + const value = window.localStorage.getItem(key); + try { + return JSON.parse(value) || defaultValue; + } catch { + return value || defaultValue; + } + } + + static removeItem(key) { + return window.localStorage.removeItem(key); + } + + // The setExpire and getExpire methods used to satisfy some cases that need to be updated regularly + static setExpire(key, value, expire) { + let obj = { + data: value, + time: Date.now(), + expire: expire + }; + this.setItem(key, JSON.stringify(obj)); + } + + static getExpire(key) { + let val = this.getItem(key); + if (!val) return val; + val = JSON.parse(val); + if (Date.now() - val.time > val.expire) { + this.removeItem(key); + return null; + } + return val.data; + } +} + +export default LocalStorage; diff --git a/media/sdoc-editor/locales/cs/sdoc-editor.json b/media/sdoc-editor/locales/cs/sdoc-editor.json index e7144b79f0..292908a199 100644 --- a/media/sdoc-editor/locales/cs/sdoc-editor.json +++ b/media/sdoc-editor/locales/cs/sdoc-editor.json @@ -445,7 +445,7 @@ "Recent_visited": "Recent visited", "The_document_does_not_exist": "The document does not exist", "Create_a_new_sdoc_file": "Create a new sdoc file", - "Create_a_new_wiki_page": "Create a new wiki page", + "New_page": "New page", "Create": "Vytvořit", "Top_align": "Top", "Center_align": "Middle", diff --git a/media/sdoc-editor/locales/de/sdoc-editor.json b/media/sdoc-editor/locales/de/sdoc-editor.json index bff13d6185..f5c9485003 100644 --- a/media/sdoc-editor/locales/de/sdoc-editor.json +++ b/media/sdoc-editor/locales/de/sdoc-editor.json @@ -445,7 +445,7 @@ "Recent_visited": "Recent visited", "The_document_does_not_exist": "The document does not exist", "Create_a_new_sdoc_file": "Create a new sdoc file", - "Create_a_new_wiki_page": "Create a new wiki page", + "New_page": "New page", "Create": "Erstellen", "Top_align": "Top", "Center_align": "Middle", diff --git a/media/sdoc-editor/locales/en/sdoc-editor.json b/media/sdoc-editor/locales/en/sdoc-editor.json index ec7b584df2..eadd3774dd 100644 --- a/media/sdoc-editor/locales/en/sdoc-editor.json +++ b/media/sdoc-editor/locales/en/sdoc-editor.json @@ -445,7 +445,7 @@ "Recent_visited": "Recent visited", "The_document_does_not_exist": "The document does not exist", "Create_a_new_sdoc_file": "Create a new sdoc file", - "Create_a_new_wiki_page": "Create a new wiki page", + "New_page": "New page", "Create": "Create", "Top_align": "Top", "Center_align": "Middle", @@ -462,4 +462,4 @@ "Enter_text_or_press_forward_slash_to_insert_element": "Enter text or press '/' to insert element", "Vertical_align": "Vertical alignment", "Horizontal_align": "Horizontal alignment" -} +} \ No newline at end of file diff --git a/media/sdoc-editor/locales/es/sdoc-editor.json b/media/sdoc-editor/locales/es/sdoc-editor.json index d8721f9ac1..1321866052 100644 --- a/media/sdoc-editor/locales/es/sdoc-editor.json +++ b/media/sdoc-editor/locales/es/sdoc-editor.json @@ -445,7 +445,7 @@ "Recent_visited": "Recent visited", "The_document_does_not_exist": "The document does not exist", "Create_a_new_sdoc_file": "Create a new sdoc file", - "Create_a_new_wiki_page": "Create a new wiki page", + "New_page": "New page", "Create": "Crear", "Top_align": "Top", "Center_align": "Middle", diff --git a/media/sdoc-editor/locales/fr/sdoc-editor.json b/media/sdoc-editor/locales/fr/sdoc-editor.json index 9f26951aea..db40a0d4eb 100644 --- a/media/sdoc-editor/locales/fr/sdoc-editor.json +++ b/media/sdoc-editor/locales/fr/sdoc-editor.json @@ -445,7 +445,7 @@ "Recent_visited": "Recent visited", "The_document_does_not_exist": "The document does not exist", "Create_a_new_sdoc_file": "Create a new sdoc file", - "Create_a_new_wiki_page": "Create a new wiki page", + "New_page": "New page", "Create": "Créer", "Top_align": "Top", "Center_align": "Middle", diff --git a/media/sdoc-editor/locales/it/sdoc-editor.json b/media/sdoc-editor/locales/it/sdoc-editor.json index e185aa0c7f..3c93d7b52d 100644 --- a/media/sdoc-editor/locales/it/sdoc-editor.json +++ b/media/sdoc-editor/locales/it/sdoc-editor.json @@ -445,7 +445,7 @@ "Recent_visited": "Recent visited", "The_document_does_not_exist": "The document does not exist", "Create_a_new_sdoc_file": "Create a new sdoc file", - "Create_a_new_wiki_page": "Create a new wiki page", + "New_page": "New page", "Create": "Crea", "Top_align": "Top", "Center_align": "Middle", diff --git a/media/sdoc-editor/locales/ru/sdoc-editor.json b/media/sdoc-editor/locales/ru/sdoc-editor.json index 473130105e..ff2ecb9dec 100644 --- a/media/sdoc-editor/locales/ru/sdoc-editor.json +++ b/media/sdoc-editor/locales/ru/sdoc-editor.json @@ -445,7 +445,7 @@ "Recent_visited": "Недавно посещенные", "The_document_does_not_exist": "Документ не существует", "Create_a_new_sdoc_file": "Создать новый файл sdoc", - "Create_a_new_wiki_page": "Create a new wiki page", + "New_page": "New page", "Create": "Создать", "Top_align": "Верх", "Center_align": "Середина", diff --git a/media/sdoc-editor/locales/zh-CN/sdoc-editor.json b/media/sdoc-editor/locales/zh-CN/sdoc-editor.json index 6ad3a692a2..347790adc8 100644 --- a/media/sdoc-editor/locales/zh-CN/sdoc-editor.json +++ b/media/sdoc-editor/locales/zh-CN/sdoc-editor.json @@ -445,7 +445,7 @@ "Recent_visited": "最近浏览", "The_document_does_not_exist": "不存在该文档", "Create_a_new_sdoc_file": "新建 sdoc 文件", - "Create_a_new_wiki_page": "创建一个 Wiki 页面", + "New_page": "新建页面", "Create": "创建", "Top_align": "顶端对齐", "Center_align": "居中对齐", @@ -462,4 +462,4 @@ "Enter_text_or_press_forward_slash_to_insert_element": "输入文本或按下 '/' 插入元素", "Vertical_align": "垂直对齐", "Horizontal_align": "水平对齐" -} +} \ No newline at end of file diff --git a/media/sdoc-editor/locales/zh_CN/sdoc-editor.json b/media/sdoc-editor/locales/zh_CN/sdoc-editor.json index 2a3b74d388..347790adc8 100644 --- a/media/sdoc-editor/locales/zh_CN/sdoc-editor.json +++ b/media/sdoc-editor/locales/zh_CN/sdoc-editor.json @@ -445,7 +445,7 @@ "Recent_visited": "最近浏览", "The_document_does_not_exist": "不存在该文档", "Create_a_new_sdoc_file": "新建 sdoc 文件", - "Create_a_new_wiki_page": "创建一个 Wiki 页面", + "New_page": "新建页面", "Create": "创建", "Top_align": "顶端对齐", "Center_align": "居中对齐",