From d67cf2df4596c2963d43e51cb7aa9bb49e75dcb9 Mon Sep 17 00:00:00 2001 From: Lin Onetwo Date: Thu, 25 Jun 2020 14:56:22 +0800 Subject: [PATCH] feat: start wiki upon workspace creation and on startup --- public/libs/get-constants.js | 2 + public/libs/start-nodejs-wiki.js | 16 ++++--- public/libs/views.js | 4 ++ public/listeners/index.js | 17 +++++--- src/components/dialog-add-workspace/index.js | 46 +++++++++++++++----- src/senders/index.js | 18 +++++--- 6 files changed, 74 insertions(+), 29 deletions(-) diff --git a/public/libs/get-constants.js b/public/libs/get-constants.js index 35d6ae97..89a26080 100644 --- a/public/libs/get-constants.js +++ b/public/libs/get-constants.js @@ -1,3 +1,5 @@ const { ICON_PATH } = require('../constants/paths'); +const { TIDDLYWIKI_FOLDER_NAME } = require('../constants/file-names'); module.exports.getIconPath = () => ICON_PATH; +module.exports.getDefaultTiddlywikiFolderName = () => TIDDLYWIKI_FOLDER_NAME; diff --git a/public/libs/start-nodejs-wiki.js b/public/libs/start-nodejs-wiki.js index 127f4946..5b2a9e37 100644 --- a/public/libs/start-nodejs-wiki.js +++ b/public/libs/start-nodejs-wiki.js @@ -1,22 +1,28 @@ +const path = require('path'); const $tw = require('tiddlywiki/boot/boot.js').TiddlyWiki(); -const { TIDDLYWIKI_FOLDER_PATH } = require('../constants/paths'); const tiddlyWikiPort = 5112; const userName = 'LinOnetwoTest'; -module.exports = function startNodeJSWiki() { +module.exports = function startNodeJSWiki(homePath) { if ($tw.wiki) { console.error('Wiki has already started'); return; } + if (!homePath || typeof homePath !== 'string' || !path.isAbsolute(homePath)) { + console.error( + `valie absolute homePath not provided to startNodeJSWiki(homePath), received ${homePath} which is invalid.` + ); + return; + } - process.env.TIDDLYWIKI_PLUGIN_PATH = `${TIDDLYWIKI_FOLDER_PATH}/plugins`; - process.env.TIDDLYWIKI_THEME_PATH = `${TIDDLYWIKI_FOLDER_PATH}/themes`; + process.env.TIDDLYWIKI_PLUGIN_PATH = path.resolve(homePath, 'plugins'); + process.env.TIDDLYWIKI_THEME_PATH = path.resolve(homePath, 'themes'); // add tiddly filesystem back https://github.com/Jermolene/TiddlyWiki5/issues/4484#issuecomment-596779416 $tw.boot.argv = [ '+plugins/tiddlywiki/filesystem', '+plugins/tiddlywiki/tiddlyweb', - TIDDLYWIKI_FOLDER_PATH, + homePath, '--listen', `anon-username=${userName}`, `port=${tiddlyWikiPort}`, diff --git a/public/libs/views.js b/public/libs/views.js index 55bc23b2..53fd1389 100644 --- a/public/libs/views.js +++ b/public/libs/views.js @@ -10,6 +10,7 @@ const path = require('path'); const fsExtra = require('fs-extra'); const { ElectronBlocker } = require('@cliqz/adblocker-electron'); +const startNodeJSWiki = require('./start-nodejs-wiki') const { getPreferences } = require('./preferences'); const { getWorkspace, @@ -118,6 +119,9 @@ const addView = (browserWindow, workspace) => { // configure session, proxy & ad blocker const partitionId = shareWorkspaceBrowsingData ? 'persist:shared' : `persist:${workspace.id}`; + // start wiki on startup + const wikiPath = workspace.name; + startNodeJSWiki(wikiPath); // session const ses = session.fromPartition(partitionId); // proxy diff --git a/public/listeners/index.js b/public/listeners/index.js index 37fd9bf0..b987bea0 100755 --- a/public/listeners/index.js +++ b/public/listeners/index.js @@ -3,7 +3,7 @@ const { BrowserView, Notification, app, dialog, ipcMain, nativeTheme, shell } = const createWiki = require('../libs/create-wiki'); const startNodeJSWiki = require('../libs/start-nodejs-wiki'); -const { getIconPath } = require('../libs/get-constants') ; +const { getIconPath, getDefaultTiddlywikiFolderName } = require('../libs/get-constants'); const { getPreference, getPreferences, resetPreferences, setPreference } = require('../libs/preferences'); @@ -58,16 +58,19 @@ const loadListeners = () => { ipcMain.on('copy-wiki-template', async (event, newFolderPath) => { try { const createdWikiPath = await createWiki(newFolderPath); - event.reply('copy-wiki-template-result', `Wiki 已成功创建到 ${createdWikiPath}`); + event.reply('copy-wiki-template-result', `Wiki 已成功创建到 ${createdWikiPath}/${getDefaultTiddlywikiFolderName()}`); } catch (error) { event.reply('copy-wiki-template-result', String(error)); } }); - ipcMain.on('request-start-tiddlywiki', () => { - startNodeJSWiki(); + ipcMain.on('request-start-tiddlywiki', (wikiPath) => { + startNodeJSWiki(wikiPath); }); - ipcMain.on('get-icon-path', (event) => { - event.returnValue = getIconPath(); + ipcMain.on('get-constant', (event, name) => { + event.returnValue = { + getIconPath, + getDefaultTiddlywikiFolderName, + }[name](); }); ipcMain.on('request-open-in-browser', (e, url) => { @@ -239,6 +242,8 @@ const loadListeners = () => { }); ipcMain.on('request-create-workspace', (e, name, homeUrl, picture, transparentBackground) => { + const wikiPath = name; + startNodeJSWiki(wikiPath); createWorkspaceView(name, homeUrl, picture, transparentBackground); createMenu(); }); diff --git a/src/components/dialog-add-workspace/index.js b/src/components/dialog-add-workspace/index.js index 9ef27dcf..7128dc03 100644 --- a/src/components/dialog-add-workspace/index.js +++ b/src/components/dialog-add-workspace/index.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import styled from 'styled-components'; import is from 'styled-is'; @@ -13,7 +13,7 @@ import GithubIcon from '@material-ui/icons/GitHub'; import connectComponent from '../../helpers/connect-component'; import { updateForm, save } from '../../state/dialog-add-workspace/actions'; -import { requestCopyWikiTemplate, getIconPath } from '../../senders'; +import { requestCopyWikiTemplate, getIconPath, getDefaultTiddlywikiFolderName } from '../../senders'; const Container = styled.main` height: 100vh; @@ -55,10 +55,15 @@ const CloseButton = styled(Button)` `; function AddWorkspace({ wikiCreationMessage, onUpdateForm, onSave }) { - const [folderLocation, folderLocationSetter] = useState(''); + const [parentFolderLocation, parentFolderLocationSetter] = useState(''); + const [wikiFolderLocation, wikiFolderLocationSetter] = useState(''); + useEffect(() => { + wikiFolderLocationSetter(`${parentFolderLocation}/${getDefaultTiddlywikiFolderName()}`); + }, [parentFolderLocation]); const messageHasError = wikiCreationMessage.startsWith('Error: '); const message = wikiCreationMessage.replace('Error: ', ''); const succeed = !messageHasError && wikiCreationMessage.length > 0; + const workspaceFormData = { name: wikiFolderLocation, homeUrl: 'http://localhost:5112/', picturePath: getIconPath() }; return ( @@ -78,12 +83,12 @@ function AddWorkspace({ wikiCreationMessage, onUpdateForm, onSave }) { }) .then(({ canceled, filePaths }) => { if (!canceled && filePaths.length > 0) { - folderLocationSetter(filePaths[0]); + parentFolderLocationSetter(filePaths[0]); } }); }} variant="contained" - color={folderLocation ? 'default' : 'primary'} + color={parentFolderLocation ? 'default' : 'primary'} disableElevation endIcon={} > @@ -95,18 +100,28 @@ function AddWorkspace({ wikiCreationMessage, onUpdateForm, onSave }) { error={messageHasError} helperText={message} fullWidth - onChange={(event) => folderLocationSetter(event.target.value)} + onChange={(event) => parentFolderLocationSetter(event.target.value)} label="知识库的父文件夹" - value={folderLocation} + value={parentFolderLocation} disabled={succeed} /> + {parentFolderLocation && !succeed && ( +
+ + WIKI将被创建到 + + + {wikiFolderLocation} + +
+ )} { - requestCopyWikiTemplate(folderLocation); - onUpdateForm({ name: folderLocation, homeUrl: 'http://localhost:5112', picturePath: getIconPath() }); + requestCopyWikiTemplate(parentFolderLocation); + onUpdateForm(workspaceFormData); }} > 创建知识库 @@ -122,8 +137,15 @@ function AddWorkspace({ wikiCreationMessage, onUpdateForm, onSave }) { - onSave()}> - 完成 + { + onUpdateForm(workspaceFormData); + onSave(); + }} + > + 启动WIKI
); diff --git a/src/senders/index.js b/src/senders/index.js index 7cf6b408..2b41445a 100644 --- a/src/senders/index.js +++ b/src/senders/index.js @@ -1,7 +1,7 @@ const { ipcRenderer } = window.require('electron'); export const requestCopyWikiTemplate = (newFolderPath) => ipcRenderer.send('copy-wiki-template', newFolderPath); -export const requestStartTiddlyWiki = (url) => ipcRenderer.send('request-start-tiddlywiki', url); +export const requestStartTiddlyWiki = (wikiPath) => ipcRenderer.send('request-start-tiddlywiki', wikiPath); export const requestOpenInBrowser = (url) => ipcRenderer.send('request-open-in-browser', url); export const requestShowMessageBox = (message, type) => ipcRenderer.send('request-show-message-box', message, type); export const requestLoadUrl = (url, id) => ipcRenderer.send('request-load-url', url, id); @@ -40,13 +40,15 @@ export const requestShowRequireRestartDialog = () => ipcRenderer.send('request-s // System Preferences export const getSystemPreference = (name) => ipcRenderer.sendSync('get-system-preference', name); export const getSystemPreferences = () => ipcRenderer.sendSync('get-system-preferences'); -export const requestSetSystemPreference = (name, value) => ipcRenderer.send('request-set-system-preference', name, value); +export const requestSetSystemPreference = (name, value) => + ipcRenderer.send('request-set-system-preference', name, value); // Workspace export const getWorkspace = (id) => ipcRenderer.sendSync('get-workspace', id); export const getWorkspaces = () => ipcRenderer.sendSync('get-workspaces'); export const requestClearBrowsingData = () => ipcRenderer.send('request-clear-browsing-data'); -export const requestCreateWorkspace = (name, homeUrl, picture, transparentBackground) => ipcRenderer.send('request-create-workspace', name, homeUrl, picture, transparentBackground); +export const requestCreateWorkspace = (name, homeUrl, picture, transparentBackground) => + ipcRenderer.send('request-create-workspace', name, homeUrl, picture, transparentBackground); export const requestHibernateWorkspace = (id) => ipcRenderer.send('request-hibernate-workspace', id); export const requestOpenUrlInWorkspace = (url, id) => ipcRenderer.send('request-open-url-in-workspace', url, id); export const requestRealignActiveWorkspace = () => ipcRenderer.send('request-realign-active-workspace'); @@ -55,10 +57,13 @@ export const requestRemoveWorkspacePicture = (id) => ipcRenderer.send('request-r export const requestSetActiveWorkspace = (id) => ipcRenderer.send('request-set-active-workspace', id); export const requestSetWorkspace = (id, opts) => ipcRenderer.send('request-set-workspace', id, opts); export const requestSetWorkspaces = (workspaces) => ipcRenderer.send('request-set-workspaces', workspaces); -export const requestSetWorkspacePicture = (id, picturePath) => ipcRenderer.send('request-set-workspace-picture', id, picturePath); +export const requestSetWorkspacePicture = (id, picturePath) => + ipcRenderer.send('request-set-workspace-picture', id, picturePath); export const requestWakeUpWorkspace = (id) => ipcRenderer.send('request-wake-up-workspace', id); -export const getIconPath = () => ipcRenderer.sendSync('get-icon-path'); +export const getIconPath = () => ipcRenderer.sendSync('get-constant', 'getIconPath'); +export const getDefaultTiddlywikiFolderName = () => + ipcRenderer.sendSync('get-constant', 'getDefaultTiddlywikiFolderName'); // Workspace Meta export const getWorkspaceMeta = (id) => ipcRenderer.sendSync('get-workspace-meta', id); @@ -69,7 +74,8 @@ export const requestFindInPage = (text, forward) => ipcRenderer.send('request-fi export const requestStopFindInPage = (close) => ipcRenderer.send('request-stop-find-in-page', close); // Auth -export const requestValidateAuthIdentity = (windowId, username, password) => ipcRenderer.send('request-validate-auth-identity', windowId, username, password); +export const requestValidateAuthIdentity = (windowId, username, password) => + ipcRenderer.send('request-validate-auth-identity', windowId, username, password); // Native Theme export const getShouldUseDarkColors = () => ipcRenderer.sendSync('get-should-use-dark-colors');