Skip to content

Commit d584d37

Browse files
authored
Merge pull request #9 from xwcoder/refact/reorgnize
refactor: reorgnize directors and refactor settings
2 parents 987efe1 + 55f7908 commit d584d37

File tree

75 files changed

+211
-157
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+211
-157
lines changed

build/renderer/webpack.config.common.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import HtmlWebpackPlugin from 'html-webpack-plugin'
44
import baseConfig from '../webpack.config.base'
55
import { src, dist } from '../paths'
66

7-
const context = path.resolve(src, './renderer')
7+
const context = path.resolve(src, './ui')
88

99
const config = merge(baseConfig, {
1010
context,
1111
target: ['web'],
1212
entry: ['./index.tsx'],
1313
output: {
14-
path: path.resolve(dist, './renderer'),
14+
path: path.resolve(dist, './ui'),
1515
publicPath: './',
1616
},
1717
plugins: [

package-lock.json

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"@electron-forge/publisher-github": "^6.4.2",
5757
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
5858
"@types/lodash.get": "^4.4.7",
59+
"@types/lodash.set": "^4.3.9",
5960
"@types/node": "^20.5.9",
6061
"@types/react": "^18.2.21",
6162
"@types/react-dom": "^18.2.7",
@@ -92,6 +93,7 @@
9293
"@fluentui/react-icons": "^2.0.218",
9394
"electron-squirrel-startup": "^1.0.0",
9495
"lodash.get": "^4.4.2",
96+
"lodash.set": "^4.3.2",
9597
"mobx": "^6.10.2",
9698
"mobx-react-lite": "^4.0.4",
9799
"react": "^18.2.0",
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

src/main/main.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import '@/main/setup'
2+
import * as fs from 'node:fs'
3+
import { join } from 'node:path'
24
import { app } from 'electron'
3-
import { isMac } from '@/utils/electron-main/env'
4-
import { createWindow } from './window'
5+
import { isMac } from '@/base/electron-main/env'
6+
import { createPushChannel } from '@/services/push/electron-main/push'
7+
import { register as registerCommands } from '@/services/commands/electron-main/commands'
8+
import { createWindow } from '@/services/window/electron-main/window'
9+
import * as themeService from '@/services/theme/electron-main/theme'
10+
import * as settingService from '@/services/settings/electron-main/settings'
511
import { createApp as createReaderApp } from './reader'
612
import { createApp as createSettingsApp } from './setttings'
7-
import { createPushChannel } from './push'
8-
import { register as registerCommands } from './commands'
913

1014
registerCommands()
1115

@@ -15,6 +19,21 @@ createReaderApp()
1519
const window = createWindow()
1620
createPushChannel(window)
1721

22+
themeService.init()
23+
24+
settingService.on('change', (path, dataPath, oldDataPath) => {
25+
if (path !== 'dataPath' || !dataPath) {
26+
return
27+
}
28+
29+
if (!fs.existsSync(join(dataPath, 'emo.db'))) {
30+
fs.renameSync(join(oldDataPath, 'emo.db'), join(dataPath, 'emo.db'))
31+
}
32+
33+
app.relaunch()
34+
app.exit()
35+
})
36+
1837
app.on('window-all-closed', () => {
1938
if (!isMac) {
2039
app.quit()

src/main/reader/db.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { exec } from '@/main/db'
2-
import { logger } from '@/utils/electron-main/logger'
1+
import { exec } from '@/services/db/electron-main/db'
2+
import { logger } from '@/services/logger/electron-main/logger'
33

44
const sql = `
55
CREATE TABLE IF NOT EXISTS feeds (

src/main/reader/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import { router } from '@/router/reader/electron-main'
2+
import { startCrawler } from '@/services/reader/electron-main/crawler'
13
import { init as initDB } from './db'
2-
import { router } from './router'
3-
import { startCrawler } from './crawler'
44

55
export function createApp() {
66
initDB()

src/main/reader/router/router.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/main/setttings/index.ts

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,5 @@
1-
import * as path from 'node:path'
2-
import * as fs from 'node:fs'
3-
import { app, nativeTheme } from 'electron'
4-
import { Router } from '@/main/router'
5-
import { readJSON, writeJSON } from '@/utils/node/fs'
6-
7-
const router = new Router({ prefix: '/settings' })
8-
9-
const settingsFilePath = path.join(app.getPath('userData'), 'settings.json')
10-
11-
type Settings = {
12-
locale: string
13-
appearance: 'light' | 'dark' | 'auto'
14-
defaultDataPath: string
15-
dataPath: string
16-
}
17-
18-
export const settings: Settings = {
19-
locale: '',
20-
appearance: 'auto',
21-
defaultDataPath: app.getPath('userData'),
22-
dataPath: app.getPath('userData'),
23-
...readJSON(settingsFilePath),
24-
}
25-
26-
const getTheme = () => settings.appearance === 'auto' ? 'system' : settings.appearance
27-
28-
router.use('get', () => settings)
29-
30-
router.use('put', (_, data: Partial<Settings> = {}) => {
31-
let restart = false
32-
33-
if (data.dataPath && data.dataPath !== settings.dataPath) {
34-
if (!fs.existsSync(path.join(data.dataPath, 'emo.db'))) {
35-
fs.renameSync(path.join(settings.dataPath, 'emo.db'), path.join(data.dataPath, 'emo.db'))
36-
}
37-
38-
restart = true
39-
}
40-
41-
Object.assign(settings, data)
42-
43-
nativeTheme.themeSource = getTheme()
44-
45-
writeJSON(settingsFilePath, settings)
46-
47-
if (restart) {
48-
app.relaunch()
49-
app.exit()
50-
}
51-
})
1+
import { router } from '@/router/settings/electron-main/settings'
522

533
export const createApp = () => {
54-
app.whenReady()
55-
.then(() => {
56-
settings.locale = settings.locale || app.getLocale()
57-
nativeTheme.themeSource = getTheme()
58-
})
59-
604
router.listen()
615
}

src/main/setup.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { app } from 'electron'
2-
import { isDev } from '@/utils/electron-main/env'
2+
import { isDev } from '@/base/electron-main/env'
33

44
if (isDev) {
55
app.setName(`${app.getName()}-dev`)

src/main/reader/router/article.ts renamed to src/router/reader/electron-main/article.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import * as articleService from '@/main/reader/services/article'
1+
import * as articleService from '@/services/reader/electron-main/article'
22
import { router } from './router'
33

44
router.get('/articles', async (_, params) => {

src/main/reader/router/feed.ts renamed to src/router/reader/electron-main/feed.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Feed } from '@/types/reader'
2-
import * as feedService from '@/main/reader/services/feed'
3-
import * as articleService from '@/main/reader/services/article'
4-
import { parseURL } from '@/utils/node/feed'
5-
import { logger } from '@/utils/electron-main/logger'
2+
import * as feedService from '@/services/reader/electron-main/feed'
3+
import * as articleService from '@/services/reader/electron-main/article'
4+
import { parseURL } from '@/base/node/feed'
5+
import { logger } from '@/services/logger/electron-main/logger'
66
import { router } from './router'
77

88
router.get('/feed/preflight', async (_, url: string) => {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { Router } from '@/services/router/electron-main/router'
2+
3+
export const router = new Router({ prefix: '/reader' })
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Router } from '@/services/router/electron-main/router'
2+
import * as settingService from '@/services/settings/electron-main/settings'
3+
4+
export const router = new Router({ prefix: '/settings' })
5+
6+
// const getTheme = () => settings.appearance === 'auto' ? 'system' : settings.appearance
7+
8+
router.use('get', () => settingService.get())
9+
10+
router.use('set', (_, { path, value }: { path: string, value: any }) => settingService.set(path, value))

src/main/db.ts renamed to src/services/db/electron-main/db.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import * as path from 'node:path'
22
import { verbose } from 'sqlite3'
3-
import { logger } from '@/utils/electron-main/logger'
3+
import { logger } from '@/services/logger/electron-main/logger'
4+
import * as settingService from '@/services/settings/electron-main/settings'
45

5-
import { settings } from './setttings'
6-
7-
const { dataPath } = settings
86
const { Database } = verbose()
97

10-
const file = path.join(dataPath, 'emo.db')
8+
const file = path.join(settingService.get('dataPath'), 'emo.db')
119

1210
const db = new Database(file)
1311

src/main/push.ts renamed to src/services/push/electron-main/push.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Window } from './window'
1+
import { Window } from '../../window/electron-main/window'
22

33
let window: Window
44

src/renderer/services/reader/article.ts renamed to src/services/reader/browser/article.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import fetch from '@/utils/browser/fetch'
1+
import fetch from '@/base/browser/fetch'
22
import { Tab, Article } from '@/types/reader'
33

44
export const find = (param: { tab: Tab | number, page: number, size: number }) => fetch('/reader/get/articles', param)

src/renderer/services/reader/feed.ts renamed to src/services/reader/browser/feed.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import fetch from '@/utils/browser/fetch'
1+
import fetch from '@/base/browser/fetch'
22

33
export const preflight = (url: string) => fetch('/reader/get/feed/preflight', url)
44

src/main/reader/services/article.ts renamed to src/services/reader/electron-main/article.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import db, { get, all, run } from '@/main/db'
1+
import db, { get, all, run } from '@/services/db/electron-main/db'
22
import { Article, Tab } from '@/types/reader'
33

44
export const upsert = (articles: Article | Article[]) => new Promise<void>((resolve, reject) => {

src/main/reader/crawler.ts renamed to src/services/reader/electron-main/crawler.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import * as feedService from '@/main/reader/services/feed'
2-
import * as articleService from '@/main/reader/services/article'
3-
import { parseURL } from '@/utils/node/feed'
4-
import { logger } from '@/utils/electron-main/logger'
1+
import * as feedService from '@/services/reader/electron-main/feed'
2+
import * as articleService from '@/services/reader/electron-main/article'
3+
import { parseURL } from '@/base/node/feed'
4+
import { logger } from '@/services/logger/electron-main/logger'
55
import { Feed } from '@/types/reader'
66

77
const crawlOne = async (f: Feed) => {

src/main/reader/services/feed.ts renamed to src/services/reader/electron-main/feed.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import db, { run, get, all } from '@/main/db'
2-
import { push } from '@/main/push'
1+
import db, { run, get, all } from '@/services/db/electron-main/db'
2+
import { push } from '@/services/push/electron-main/push'
33
import { Feed } from '@/types/reader'
44

55
export const upsert = (feed: Feed) => {

src/main/router.ts renamed to src/services/router/electron-main/router.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { app, ipcMain } from 'electron'
2-
import { logger } from '@/utils/electron-main/logger'
2+
import { logger } from '@/services/logger/electron-main/logger'
33

44
type RouteHandler = (ch: string, data?: any) => any
55

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import fetch from '@/base/browser/fetch'
2+
3+
export const get = (path?: string) => fetch('/settings/get', path)
4+
5+
export const set = (path: string, value: any) => fetch('/settings/set', { path, value })
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { join } from 'node:path'
2+
import { EventEmitter } from 'node:events'
3+
import { app } from 'electron'
4+
import _get from 'lodash.get'
5+
import _set from 'lodash.set'
6+
import { readJSON, writeJSON } from '@/base/node/fs'
7+
8+
const emitter = new EventEmitter()
9+
const settingsFilePath = join(app.getPath('userData'), 'settings.json')
10+
11+
export type Settings = {
12+
locale: string
13+
appearance: 'light' | 'dark' | 'auto'
14+
defaultDataPath: string
15+
dataPath: string
16+
}
17+
18+
const settings: Settings = {
19+
locale: '',
20+
appearance: 'auto',
21+
defaultDataPath: app.getPath('userData'),
22+
dataPath: app.getPath('userData'),
23+
...readJSON(settingsFilePath),
24+
}
25+
26+
export const get = (path?: string) => path ? _get(settings, path) : settings
27+
28+
export const set = (path: string, value: any) => {
29+
const oldValue = get(path)
30+
31+
_set(settings, path, value)
32+
writeJSON(settingsFilePath, settings)
33+
34+
if (oldValue !== value) {
35+
emitter.emit('change', path, value, oldValue)
36+
}
37+
}
38+
39+
type changeListener = (path: string, newValue: any, oldValue: any) => void
40+
41+
export const on = (eventName: 'change', listener: changeListener): EventEmitter => emitter.on(eventName, listener)
42+
43+
app.whenReady()
44+
.then(() => {
45+
settings.locale = settings.locale || app.getLocale()
46+
})
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { app, nativeTheme } from 'electron'
2+
import * as settingService from '@/services/settings/electron-main/settings'
3+
4+
const getTheme = () => {
5+
const appearance = settingService.get('appearance')
6+
return appearance === 'auto' ? 'system' : appearance
7+
}
8+
9+
export const init = () => {
10+
app.whenReady()
11+
.then(() => {
12+
nativeTheme.themeSource = getTheme()
13+
})
14+
15+
settingService.on('change', (path) => {
16+
if (path === 'appearance') {
17+
nativeTheme.themeSource = getTheme()
18+
}
19+
})
20+
}

src/main/window.ts renamed to src/services/window/electron-main/window.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as path from 'node:path'
22
import { app, BrowserWindow } from 'electron'
3-
import { isDev, isMac, isWin } from '@/utils/electron-main/env'
4-
import { WindowStateManager } from './windowState'
3+
import { isDev, isMac, isWin } from '@/base/electron-main/env'
4+
import { WindowStateManager } from '@/services/windowState/electron-main/windowState'
55

66
export class Window {
77
window: BrowserWindow | null = null

0 commit comments

Comments
 (0)