FluentReader/src/scripts/settings.ts

136 lines
4.5 KiB
TypeScript

import * as db from "./db"
import { IPartialTheme, loadTheme } from "@fluentui/react"
import locales from "./i18n/_locales"
import { ThemeSettings } from "../schema-types"
import intl from "react-intl-universal"
const lightTheme: IPartialTheme = {
defaultFontStyle: {
fontFamily:
'"Segoe UI", "Source Han Sans SC Regular", "Microsoft YaHei", sans-serif',
},
}
const darkTheme: IPartialTheme = {
...lightTheme,
palette: {
neutralLighterAlt: "#282828",
neutralLighter: "#313131",
neutralLight: "#3f3f3f",
neutralQuaternaryAlt: "#484848",
neutralQuaternary: "#4f4f4f",
neutralTertiaryAlt: "#6d6d6d",
neutralTertiary: "#c8c8c8",
neutralSecondary: "#d0d0d0",
neutralSecondaryAlt: "#d2d0ce",
neutralPrimaryAlt: "#dadada",
neutralPrimary: "#ffffff",
neutralDark: "#f4f4f4",
black: "#f8f8f8",
white: "#1f1f1f",
themePrimary: "#3a96dd",
themeLighterAlt: "#020609",
themeLighter: "#091823",
themeLight: "#112d43",
themeTertiary: "#235a85",
themeSecondary: "#3385c3",
themeDarkAlt: "#4ba0e1",
themeDark: "#65aee6",
themeDarker: "#8ac2ec",
accent: "#3a96dd",
},
}
export function setThemeSettings(theme: ThemeSettings) {
window.settings.setThemeSettings(theme)
applyThemeSettings()
}
export function getThemeSettings(): ThemeSettings {
return window.settings.getThemeSettings()
}
export function applyThemeSettings() {
loadTheme(window.settings.shouldUseDarkColors() ? darkTheme : lightTheme)
}
window.settings.addThemeUpdateListener(shouldDark => {
loadTheme(shouldDark ? darkTheme : lightTheme)
})
export function getCurrentLocale() {
let locale = window.settings.getCurrentLocale()
if (locale in locales) return locale
locale = locale.split("-")[0]
return locale in locales ? locale : "en-US"
}
export async function exportAll() {
const filters = [{ name: intl.get("app.frData"), extensions: ["frdata"] }]
const write = await window.utils.showSaveDialog(
filters,
"*/Fluent_Reader_Backup.frdata"
)
if (write) {
let output = window.settings.getAll()
output["lovefield"] = {
sources: await db.sourcesDB.select().from(db.sources).exec(),
items: await db.itemsDB.select().from(db.items).exec(),
}
write(JSON.stringify(output), intl.get("settings.writeError"))
}
}
export async function importAll() {
const filters = [{ name: intl.get("app.frData"), extensions: ["frdata"] }]
let data = await window.utils.showOpenDialog(filters)
if (!data) return true
let confirmed = await window.utils.showMessageBox(
intl.get("app.restore"),
intl.get("app.confirmImport"),
intl.get("confirm"),
intl.get("cancel"),
true,
"warning"
)
if (!confirmed) return true
let configs = JSON.parse(data)
await db.sourcesDB.delete().from(db.sources).exec()
await db.itemsDB.delete().from(db.items).exec()
if (configs.nedb) {
let openRequest = window.indexedDB.open("NeDB")
configs.useNeDB = true
openRequest.onsuccess = () => {
let db = openRequest.result
let objectStore = db
.transaction("nedbdata", "readwrite")
.objectStore("nedbdata")
let requests = Object.entries(configs.nedb).map(([key, value]) => {
return objectStore.put(value, key)
})
let promises = requests.map(
req =>
new Promise<void>((resolve, reject) => {
req.onsuccess = () => resolve()
req.onerror = () => reject()
})
)
Promise.all(promises).then(() => {
delete configs.nedb
window.settings.setAll(configs)
})
}
} else {
const sRows = configs.lovefield.sources.map(s => {
s.lastFetched = new Date(s.lastFetched)
return db.sources.createRow(s)
})
const iRows = configs.lovefield.items.map(i => {
i.date = new Date(i.date)
i.fetchedDate = new Date(i.fetchedDate)
return db.items.createRow(i)
})
await db.sourcesDB.insert().into(db.sources).values(sRows).exec()
await db.itemsDB.insert().into(db.items).values(iRows).exec()
delete configs.lovefield
window.settings.setAll(configs)
}
return false
}