Skip to content

refactor: reorgnize directors and refactor settings #9

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions build/renderer/webpack.config.common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import HtmlWebpackPlugin from 'html-webpack-plugin'
import baseConfig from '../webpack.config.base'
import { src, dist } from '../paths'

const context = path.resolve(src, './renderer')
const context = path.resolve(src, './ui')

const config = merge(baseConfig, {
context,
target: ['web'],
entry: ['./index.tsx'],
output: {
path: path.resolve(dist, './renderer'),
path: path.resolve(dist, './ui'),
publicPath: './',
},
plugins: [
Expand Down
16 changes: 16 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
"@electron-forge/publisher-github": "^6.4.2",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
"@types/lodash.get": "^4.4.7",
"@types/lodash.set": "^4.3.9",
"@types/node": "^20.5.9",
"@types/react": "^18.2.21",
"@types/react-dom": "^18.2.7",
Expand Down Expand Up @@ -92,6 +93,7 @@
"@fluentui/react-icons": "^2.0.218",
"electron-squirrel-startup": "^1.0.0",
"lodash.get": "^4.4.2",
"lodash.set": "^4.3.2",
"mobx": "^6.10.2",
"mobx-react-lite": "^4.0.4",
"react": "^18.2.0",
Expand Down
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.
27 changes: 23 additions & 4 deletions src/main/main.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import '@/main/setup'
import * as fs from 'node:fs'
import { join } from 'node:path'
import { app } from 'electron'
import { isMac } from '@/utils/electron-main/env'
import { createWindow } from './window'
import { isMac } from '@/base/electron-main/env'
import { createPushChannel } from '@/services/push/electron-main/push'
import { register as registerCommands } from '@/services/commands/electron-main/commands'
import { createWindow } from '@/services/window/electron-main/window'
import * as themeService from '@/services/theme/electron-main/theme'
import * as settingService from '@/services/settings/electron-main/settings'
import { createApp as createReaderApp } from './reader'
import { createApp as createSettingsApp } from './setttings'
import { createPushChannel } from './push'
import { register as registerCommands } from './commands'

registerCommands()

Expand All @@ -15,6 +19,21 @@ createReaderApp()
const window = createWindow()
createPushChannel(window)

themeService.init()

settingService.on('change', (path, dataPath, oldDataPath) => {
if (path !== 'dataPath' || !dataPath) {
return
}

if (!fs.existsSync(join(dataPath, 'emo.db'))) {
fs.renameSync(join(oldDataPath, 'emo.db'), join(dataPath, 'emo.db'))
}

app.relaunch()
app.exit()
})

app.on('window-all-closed', () => {
if (!isMac) {
app.quit()
Expand Down
4 changes: 2 additions & 2 deletions src/main/reader/db.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { exec } from '@/main/db'
import { logger } from '@/utils/electron-main/logger'
import { exec } from '@/services/db/electron-main/db'
import { logger } from '@/services/logger/electron-main/logger'

const sql = `
CREATE TABLE IF NOT EXISTS feeds (
Expand Down
4 changes: 2 additions & 2 deletions src/main/reader/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { router } from '@/router/reader/electron-main'
import { startCrawler } from '@/services/reader/electron-main/crawler'
import { init as initDB } from './db'
import { router } from './router'
import { startCrawler } from './crawler'

export function createApp() {
initDB()
Expand Down
3 changes: 0 additions & 3 deletions src/main/reader/router/router.ts

This file was deleted.

58 changes: 1 addition & 57 deletions src/main/setttings/index.ts
Original file line number Diff line number Diff line change
@@ -1,61 +1,5 @@
import * as path from 'node:path'
import * as fs from 'node:fs'
import { app, nativeTheme } from 'electron'
import { Router } from '@/main/router'
import { readJSON, writeJSON } from '@/utils/node/fs'

const router = new Router({ prefix: '/settings' })

const settingsFilePath = path.join(app.getPath('userData'), 'settings.json')

type Settings = {
locale: string
appearance: 'light' | 'dark' | 'auto'
defaultDataPath: string
dataPath: string
}

export const settings: Settings = {
locale: '',
appearance: 'auto',
defaultDataPath: app.getPath('userData'),
dataPath: app.getPath('userData'),
...readJSON(settingsFilePath),
}

const getTheme = () => settings.appearance === 'auto' ? 'system' : settings.appearance

router.use('get', () => settings)

router.use('put', (_, data: Partial<Settings> = {}) => {
let restart = false

if (data.dataPath && data.dataPath !== settings.dataPath) {
if (!fs.existsSync(path.join(data.dataPath, 'emo.db'))) {
fs.renameSync(path.join(settings.dataPath, 'emo.db'), path.join(data.dataPath, 'emo.db'))
}

restart = true
}

Object.assign(settings, data)

nativeTheme.themeSource = getTheme()

writeJSON(settingsFilePath, settings)

if (restart) {
app.relaunch()
app.exit()
}
})
import { router } from '@/router/settings/electron-main/settings'

export const createApp = () => {
app.whenReady()
.then(() => {
settings.locale = settings.locale || app.getLocale()
nativeTheme.themeSource = getTheme()
})

router.listen()
}
2 changes: 1 addition & 1 deletion src/main/setup.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { app } from 'electron'
import { isDev } from '@/utils/electron-main/env'
import { isDev } from '@/base/electron-main/env'

if (isDev) {
app.setName(`${app.getName()}-dev`)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as articleService from '@/main/reader/services/article'
import * as articleService from '@/services/reader/electron-main/article'
import { router } from './router'

router.get('/articles', async (_, params) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Feed } from '@/types/reader'
import * as feedService from '@/main/reader/services/feed'
import * as articleService from '@/main/reader/services/article'
import { parseURL } from '@/utils/node/feed'
import { logger } from '@/utils/electron-main/logger'
import * as feedService from '@/services/reader/electron-main/feed'
import * as articleService from '@/services/reader/electron-main/article'
import { parseURL } from '@/base/node/feed'
import { logger } from '@/services/logger/electron-main/logger'
import { router } from './router'

router.get('/feed/preflight', async (_, url: string) => {
Expand Down
3 changes: 3 additions & 0 deletions src/router/reader/electron-main/router.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { Router } from '@/services/router/electron-main/router'

export const router = new Router({ prefix: '/reader' })
10 changes: 10 additions & 0 deletions src/router/settings/electron-main/settings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Router } from '@/services/router/electron-main/router'
import * as settingService from '@/services/settings/electron-main/settings'

export const router = new Router({ prefix: '/settings' })

// const getTheme = () => settings.appearance === 'auto' ? 'system' : settings.appearance

router.use('get', () => settingService.get())

router.use('set', (_, { path, value }: { path: string, value: any }) => settingService.set(path, value))
File renamed without changes.
8 changes: 3 additions & 5 deletions src/main/db.ts → src/services/db/electron-main/db.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import * as path from 'node:path'
import { verbose } from 'sqlite3'
import { logger } from '@/utils/electron-main/logger'
import { logger } from '@/services/logger/electron-main/logger'
import * as settingService from '@/services/settings/electron-main/settings'

import { settings } from './setttings'

const { dataPath } = settings
const { Database } = verbose()

const file = path.join(dataPath, 'emo.db')
const file = path.join(settingService.get('dataPath'), 'emo.db')

const db = new Database(file)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Window } from './window'
import { Window } from '../../window/electron-main/window'

let window: Window

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import fetch from '@/utils/browser/fetch'
import fetch from '@/base/browser/fetch'
import { Tab, Article } from '@/types/reader'

export const find = (param: { tab: Tab | number, page: number, size: number }) => fetch('/reader/get/articles', param)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import fetch from '@/utils/browser/fetch'
import fetch from '@/base/browser/fetch'

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

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import db, { get, all, run } from '@/main/db'
import db, { get, all, run } from '@/services/db/electron-main/db'
import { Article, Tab } from '@/types/reader'

export const upsert = (articles: Article | Article[]) => new Promise<void>((resolve, reject) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as feedService from '@/main/reader/services/feed'
import * as articleService from '@/main/reader/services/article'
import { parseURL } from '@/utils/node/feed'
import { logger } from '@/utils/electron-main/logger'
import * as feedService from '@/services/reader/electron-main/feed'
import * as articleService from '@/services/reader/electron-main/article'
import { parseURL } from '@/base/node/feed'
import { logger } from '@/services/logger/electron-main/logger'
import { Feed } from '@/types/reader'

const crawlOne = async (f: Feed) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import db, { run, get, all } from '@/main/db'
import { push } from '@/main/push'
import db, { run, get, all } from '@/services/db/electron-main/db'
import { push } from '@/services/push/electron-main/push'
import { Feed } from '@/types/reader'

export const upsert = (feed: Feed) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { app, ipcMain } from 'electron'
import { logger } from '@/utils/electron-main/logger'
import { logger } from '@/services/logger/electron-main/logger'

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

Expand Down
5 changes: 5 additions & 0 deletions src/services/settings/browser/settings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import fetch from '@/base/browser/fetch'

export const get = (path?: string) => fetch('/settings/get', path)

export const set = (path: string, value: any) => fetch('/settings/set', { path, value })
46 changes: 46 additions & 0 deletions src/services/settings/electron-main/settings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { join } from 'node:path'
import { EventEmitter } from 'node:events'
import { app } from 'electron'
import _get from 'lodash.get'
import _set from 'lodash.set'
import { readJSON, writeJSON } from '@/base/node/fs'

const emitter = new EventEmitter()
const settingsFilePath = join(app.getPath('userData'), 'settings.json')

export type Settings = {
locale: string
appearance: 'light' | 'dark' | 'auto'
defaultDataPath: string
dataPath: string
}

const settings: Settings = {
locale: '',
appearance: 'auto',
defaultDataPath: app.getPath('userData'),
dataPath: app.getPath('userData'),
...readJSON(settingsFilePath),
}

export const get = (path?: string) => path ? _get(settings, path) : settings

export const set = (path: string, value: any) => {
const oldValue = get(path)

_set(settings, path, value)
writeJSON(settingsFilePath, settings)

if (oldValue !== value) {
emitter.emit('change', path, value, oldValue)
}
}

type changeListener = (path: string, newValue: any, oldValue: any) => void

export const on = (eventName: 'change', listener: changeListener): EventEmitter => emitter.on(eventName, listener)

app.whenReady()
.then(() => {
settings.locale = settings.locale || app.getLocale()
})
20 changes: 20 additions & 0 deletions src/services/theme/electron-main/theme.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { app, nativeTheme } from 'electron'
import * as settingService from '@/services/settings/electron-main/settings'

const getTheme = () => {
const appearance = settingService.get('appearance')
return appearance === 'auto' ? 'system' : appearance
}

export const init = () => {
app.whenReady()
.then(() => {
nativeTheme.themeSource = getTheme()
})

settingService.on('change', (path) => {
if (path === 'appearance') {
nativeTheme.themeSource = getTheme()
}
})
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as path from 'node:path'
import { app, BrowserWindow } from 'electron'
import { isDev, isMac, isWin } from '@/utils/electron-main/env'
import { WindowStateManager } from './windowState'
import { isDev, isMac, isWin } from '@/base/electron-main/env'
import { WindowStateManager } from '@/services/windowState/electron-main/windowState'

export class Window {
window: BrowserWindow | null = null
Expand Down
Loading