refactor(modules/web): Mirgrat to typescript; fix bugs
This commit is contained in:
@@ -1,116 +0,0 @@
|
||||
import { defineStore } from "pinia";
|
||||
import API from "@api";
|
||||
|
||||
export const useBookStore = defineStore("book", {
|
||||
state: () => {
|
||||
return {
|
||||
connectStatus: "正在连接后端服务器……",
|
||||
/**@type {"primary" | "success" |"danger"} */
|
||||
connectType: "primary",
|
||||
newConnect: true,
|
||||
/**@type {Array<{respondTime:number}>} */
|
||||
searchBooks: [],
|
||||
shelf: [],
|
||||
catalog: [],
|
||||
/**@type {{index: number,chapterPos:number}} */
|
||||
readingBook: { index: 0, chapterPos: 0 },
|
||||
popCataVisible: false,
|
||||
contentLoading: true,
|
||||
showContent: false,
|
||||
config: {
|
||||
theme: 0,
|
||||
font: 0,
|
||||
fontSize: 18,
|
||||
readWidth: 800,
|
||||
infiniteLoading: false,
|
||||
customFontName: "",
|
||||
jumpDuration: 1000,
|
||||
spacing: {
|
||||
paragraph: 1,
|
||||
line: 0.8,
|
||||
letter: 0,
|
||||
},
|
||||
},
|
||||
miniInterface: false,
|
||||
readSettingsVisible: false,
|
||||
};
|
||||
},
|
||||
getters: {
|
||||
bookProgress: (state) => {
|
||||
if (state.catalog.length == 0) return;
|
||||
// @ts-ignore
|
||||
const { index, chapterPos, bookName, bookAuthor } = state.readingBook;
|
||||
let title = state.catalog[index]?.title;
|
||||
if (!title) return;
|
||||
return {
|
||||
name: bookName,
|
||||
author: bookAuthor,
|
||||
durChapterIndex: index,
|
||||
durChapterPos: chapterPos,
|
||||
durChapterTime: new Date().getTime(),
|
||||
durChapterTitle: title,
|
||||
};
|
||||
},
|
||||
theme: (state) => {
|
||||
return state.config.theme;
|
||||
},
|
||||
isNight: (state) => state.config.theme == 6,
|
||||
},
|
||||
actions: {
|
||||
setConnectStatus(connectStatus) {
|
||||
this.connectStatus = connectStatus;
|
||||
},
|
||||
setConnectType(connectType) {
|
||||
this.connectType = connectType;
|
||||
},
|
||||
setNewConnect(newConnect) {
|
||||
this.newConnect = newConnect;
|
||||
},
|
||||
addBooks(books) {
|
||||
this.shelf = books;
|
||||
},
|
||||
clearBooks() {
|
||||
this.shelf = [];
|
||||
},
|
||||
setCatalog(catalog) {
|
||||
this.catalog = catalog;
|
||||
},
|
||||
setPopCataVisible(visible) {
|
||||
this.popCataVisible = visible;
|
||||
},
|
||||
setContentLoading(loading) {
|
||||
this.contentLoading = loading;
|
||||
},
|
||||
setReadingBook(readingBook) {
|
||||
this.readingBook = readingBook;
|
||||
},
|
||||
setConfig(config) {
|
||||
this.config = Object.assign({}, this.config, config);
|
||||
},
|
||||
setReadSettingsVisible(visible) {
|
||||
this.readSettingsVisible = visible;
|
||||
},
|
||||
setShowContent(visible) {
|
||||
this.showContent = visible;
|
||||
},
|
||||
setMiniInterface(mini) {
|
||||
this.miniInterface = mini;
|
||||
},
|
||||
async setSearchBooks(books) {
|
||||
books.forEach((book) => {
|
||||
let findBook = this.shelf.find((item) => item.bookUrl == book.bookUrl);
|
||||
if (findBook === undefined) {
|
||||
this.searchBooks.push(book);
|
||||
}
|
||||
});
|
||||
},
|
||||
clearSearchBooks() {
|
||||
this.searchBooks = [];
|
||||
},
|
||||
//保存进度到app
|
||||
async saveBookProgress() {
|
||||
if (!this.bookProgress) return Promise.resolve();
|
||||
return API.saveBookProgress(this.bookProgress);
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,127 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import API from '@api'
|
||||
import type {
|
||||
BaseBook,
|
||||
Book,
|
||||
BookChapter,
|
||||
BookProgress,
|
||||
SeachBook,
|
||||
} from '@/book'
|
||||
import type { webReadConfig } from '@/web'
|
||||
|
||||
export const useBookStore = defineStore('book', {
|
||||
state: () => {
|
||||
return {
|
||||
connectStatus: '正在连接后端服务器……',
|
||||
connectType: 'primary' as 'primary' | 'success' | 'danger',
|
||||
newConnect: true,
|
||||
searchBooks: [] as SeachBook[],
|
||||
shelf: [] as Book[],
|
||||
catalog: [] as BookChapter[],
|
||||
readingBook: {} as BaseBook & {
|
||||
chapterPos: number
|
||||
chapterIndex: number
|
||||
isSeachBook?: boolean
|
||||
},
|
||||
popCataVisible: false,
|
||||
contentLoading: true,
|
||||
showContent: false,
|
||||
config: {
|
||||
theme: -1,
|
||||
font: 0,
|
||||
fontSize: 18,
|
||||
readWidth: 800,
|
||||
infiniteLoading: false,
|
||||
customFontName: '',
|
||||
jumpDuration: 1000,
|
||||
spacing: {
|
||||
paragraph: 1,
|
||||
line: 0.8,
|
||||
letter: 0,
|
||||
},
|
||||
} as webReadConfig,
|
||||
miniInterface: false,
|
||||
readSettingsVisible: false,
|
||||
}
|
||||
},
|
||||
getters: {
|
||||
bookProgress: (state): BookProgress | undefined => {
|
||||
if (state.catalog.length == 0) return
|
||||
const { chapterIndex, chapterPos, name, author } = state.readingBook
|
||||
const title = state.catalog[chapterIndex]?.title
|
||||
if (!title) return
|
||||
return {
|
||||
name,
|
||||
author,
|
||||
durChapterIndex: chapterIndex,
|
||||
durChapterPos: chapterPos,
|
||||
durChapterTime: new Date().getTime(),
|
||||
durChapterTitle: title,
|
||||
}
|
||||
},
|
||||
theme: state => {
|
||||
return state.config.theme
|
||||
},
|
||||
configInited: state => state.config.theme !== -1,
|
||||
isNight: state => state.config.theme == 6,
|
||||
},
|
||||
actions: {
|
||||
setConnectStatus(connectStatus: string) {
|
||||
this.connectStatus = connectStatus
|
||||
},
|
||||
setConnectType(connectType: 'primary' | 'success' | 'danger') {
|
||||
this.connectType = connectType
|
||||
},
|
||||
setNewConnect(newConnect: boolean) {
|
||||
this.newConnect = newConnect
|
||||
},
|
||||
addBooks(books: Book[]) {
|
||||
this.shelf = books
|
||||
},
|
||||
clearBooks() {
|
||||
this.shelf = []
|
||||
},
|
||||
setCatalog(catalog: BookChapter[]) {
|
||||
this.catalog = catalog
|
||||
},
|
||||
setPopCataVisible(visible: boolean) {
|
||||
this.popCataVisible = visible
|
||||
},
|
||||
setContentLoading(loading: boolean) {
|
||||
this.contentLoading = loading
|
||||
},
|
||||
setReadingBook(readingBook: typeof this.readingBook) {
|
||||
this.readingBook = readingBook
|
||||
},
|
||||
setConfig(config: webReadConfig) {
|
||||
this.config = Object.assign({}, this.config, config)
|
||||
},
|
||||
setReadSettingsVisible(visible: boolean) {
|
||||
this.readSettingsVisible = visible
|
||||
},
|
||||
setShowContent(visible: boolean) {
|
||||
this.showContent = visible
|
||||
},
|
||||
setMiniInterface(mini: boolean) {
|
||||
this.miniInterface = mini
|
||||
},
|
||||
async setSearchBooks(books: SeachBook[]) {
|
||||
books.forEach(book => {
|
||||
const isSeachBook = this.shelf.every(
|
||||
item => item.bookUrl !== book.bookUrl,
|
||||
)
|
||||
if (isSeachBook === true) {
|
||||
this.searchBooks.push(book)
|
||||
}
|
||||
})
|
||||
},
|
||||
clearSearchBooks() {
|
||||
this.searchBooks = []
|
||||
},
|
||||
//保存进度到app
|
||||
async saveBookProgress() {
|
||||
if (!this.bookProgress) return Promise.resolve()
|
||||
return API.saveBookProgress(this.bookProgress)
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -1,5 +0,0 @@
|
||||
import { createPinia } from "pinia";
|
||||
|
||||
export * from "./bookStore";
|
||||
export * from "./sourceStore";
|
||||
export default createPinia();
|
||||
@@ -0,0 +1,5 @@
|
||||
import { createPinia } from 'pinia'
|
||||
|
||||
export * from './bookStore'
|
||||
export * from './sourceStore'
|
||||
export default createPinia()
|
||||
@@ -1,132 +0,0 @@
|
||||
import { defineStore } from "pinia";
|
||||
import {
|
||||
emptyBookSource,
|
||||
emptyRssSource,
|
||||
getSourceUniqueKey,
|
||||
convertSourcesToMap,
|
||||
} from "@utils/souce";
|
||||
|
||||
const isBookSource = /bookSource/i.test(location.href);
|
||||
const emptySource = isBookSource ? emptyBookSource : emptyRssSource;
|
||||
|
||||
export const useSourceStore = defineStore("source", {
|
||||
state: () => {
|
||||
return {
|
||||
/** @type {import("@/source").BookSoure[]} */
|
||||
bookSources: [], // 临时存放所有书源,
|
||||
/** @type {import("@/source").RssSource[]} */
|
||||
rssSources: [], // 临时存放所有订阅源
|
||||
/** @type {import("@/source").Source[]} */
|
||||
savedSources: [], // 批量保存到阅读app成功的源
|
||||
/** @type {import("@/source").Source} */
|
||||
currentSource: JSON.parse(JSON.stringify(emptySource)), // 当前编辑的源
|
||||
currentTab: localStorage.getItem("tabName") || "editTab",
|
||||
editTabSource: {}, // 生成序列化的json数据
|
||||
isDebuging: false,
|
||||
};
|
||||
},
|
||||
getters: {
|
||||
sources: (state) => (isBookSource ? state.bookSources : state.rssSources),
|
||||
// @ts-ignore
|
||||
sourcesMap: (state) => convertSourcesToMap(state.sources),
|
||||
savedSourcesMap: (state) => convertSourcesToMap(state.savedSources),
|
||||
currentSourceUrl: (state) =>
|
||||
isBookSource
|
||||
? state.currentSource.bookSourceUrl
|
||||
: state.currentSource.sourceUrl,
|
||||
searchKey: (state) =>
|
||||
isBookSource
|
||||
? state.currentSource.ruleSearch.checkKeyWord || "我的"
|
||||
: null,
|
||||
},
|
||||
actions: {
|
||||
startDebug() {
|
||||
this.currentTab = "editDebug";
|
||||
this.isDebuging = true;
|
||||
},
|
||||
debugFinish() {
|
||||
this.isDebuging = false;
|
||||
},
|
||||
|
||||
//拉取源后保存
|
||||
saveSources(data) {
|
||||
if (isBookSource) {
|
||||
this.bookSources = data;
|
||||
} else {
|
||||
this.rssSources = data;
|
||||
}
|
||||
},
|
||||
//批量推送
|
||||
setPushReturnSources(returnSoures) {
|
||||
this.savedSources = returnSoures;
|
||||
},
|
||||
//删除源
|
||||
deleteSources(data) {
|
||||
let sources = isBookSource ? this.bookSources : this.rssSources;
|
||||
data.forEach((source) => {
|
||||
let index = sources.indexOf(source);
|
||||
if (index > -1) sources.splice(index, 1);
|
||||
});
|
||||
},
|
||||
//保存当前编辑源
|
||||
saveCurrentSource() {
|
||||
let source = this.currentSource,
|
||||
map = this.sourcesMap;
|
||||
map.set(getSourceUniqueKey(source), JSON.parse(JSON.stringify(source)));
|
||||
this.saveSources(Array.from(map.values()));
|
||||
},
|
||||
// 更改当前编辑的源qq
|
||||
changeCurrentSource(source) {
|
||||
this.currentSource = JSON.parse(JSON.stringify(source));
|
||||
},
|
||||
// update editTab tabName and editTab info
|
||||
changeTabName(tabName) {
|
||||
this.currentTab = tabName;
|
||||
localStorage.setItem("tabName", tabName);
|
||||
},
|
||||
changeEditTabSource(source) {
|
||||
this.editTabSource = JSON.parse(JSON.stringify(source));
|
||||
},
|
||||
editHistory(history) {
|
||||
let historyObj;
|
||||
if (localStorage.getItem("history")) {
|
||||
historyObj = JSON.parse(localStorage.getItem("history"));
|
||||
historyObj.new.push(history);
|
||||
if (historyObj.new.length > 50) {
|
||||
historyObj.new.shift();
|
||||
}
|
||||
if (historyObj.old.length > 50) {
|
||||
historyObj.old.shift();
|
||||
}
|
||||
localStorage.setItem("history", JSON.stringify(historyObj));
|
||||
} else {
|
||||
const arr = { new: [history], old: [] };
|
||||
localStorage.setItem("history", JSON.stringify(arr));
|
||||
}
|
||||
},
|
||||
editHistoryUndo() {
|
||||
if (localStorage.getItem("history")) {
|
||||
let historyObj = JSON.parse(localStorage.getItem("history"));
|
||||
historyObj.old.push(this.currentSource);
|
||||
if (historyObj.new.length) {
|
||||
this.currentSource = historyObj.new.pop();
|
||||
}
|
||||
localStorage.setItem("history", JSON.stringify(historyObj));
|
||||
}
|
||||
},
|
||||
clearAllHistory() {
|
||||
localStorage.setItem("history", JSON.stringify({ new: [], old: [] }));
|
||||
},
|
||||
clearEdit() {
|
||||
this.editTabSource = {};
|
||||
this.currentSource = JSON.parse(JSON.stringify(emptySource)); //复制一份新对象
|
||||
},
|
||||
|
||||
// clear all source
|
||||
clearAllSource() {
|
||||
this.bookSources = [];
|
||||
this.rssSources = [];
|
||||
this.savedSources = [];
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,134 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import {
|
||||
emptyBookSource,
|
||||
emptyRssSource,
|
||||
getSourceUniqueKey,
|
||||
convertSourcesToMap,
|
||||
} from '@utils/souce'
|
||||
import type { BookSoure, RssSource, Source } from '@/source'
|
||||
|
||||
const isBookSource = /bookSource/i.test(location.href)
|
||||
const emptySource = isBookSource ? emptyBookSource : emptyRssSource
|
||||
|
||||
export const useSourceStore = defineStore('source', {
|
||||
state: () => {
|
||||
return {
|
||||
bookSources: [] as BookSoure[], // 临时存放所有书源,
|
||||
rssSources: [] as RssSource[], // 临时存放所有订阅源
|
||||
savedSources: [] as Source[], // 批量保存到阅读app成功的源
|
||||
currentSource: JSON.parse(JSON.stringify(emptySource)) as Source, // 当前编辑的源
|
||||
currentTab: localStorage.getItem('tabName') || 'editTab',
|
||||
editTabSource: {} as Source, // 生成序列化的json数据
|
||||
isDebuging: false,
|
||||
}
|
||||
},
|
||||
getters: {
|
||||
sources: (state): Source[] =>
|
||||
isBookSource ? state.bookSources : state.rssSources,
|
||||
sourcesMap: function (): Map<string, Source> {
|
||||
return convertSourcesToMap(this.sources)
|
||||
},
|
||||
savedSourcesMap: (state): Map<string, Source> =>
|
||||
convertSourcesToMap(state.savedSources),
|
||||
currentSourceUrl: state =>
|
||||
isBookSource
|
||||
? (state.currentSource as BookSoure).bookSourceUrl
|
||||
: (state.currentSource as RssSource).sourceUrl,
|
||||
searchKey: (state): string =>
|
||||
isBookSource
|
||||
? (state.currentSource as BookSoure)?.ruleSearch?.checkKeyWord || '我的'
|
||||
: '',
|
||||
},
|
||||
actions: {
|
||||
startDebug() {
|
||||
this.currentTab = 'editDebug'
|
||||
this.isDebuging = true
|
||||
},
|
||||
debugFinish() {
|
||||
this.isDebuging = false
|
||||
},
|
||||
|
||||
//拉取源后保存
|
||||
saveSources(data: Source[]) {
|
||||
if (isBookSource) {
|
||||
this.bookSources = data as BookSoure[]
|
||||
} else {
|
||||
this.rssSources = data as RssSource[]
|
||||
}
|
||||
},
|
||||
//批量推送
|
||||
setPushReturnSources(returnSoures: Source[]) {
|
||||
this.savedSources = returnSoures
|
||||
},
|
||||
//删除源
|
||||
deleteSources(data: Source[]) {
|
||||
const sources: Source[] = isBookSource
|
||||
? this.bookSources
|
||||
: this.rssSources
|
||||
data.forEach(source => {
|
||||
const index = sources.indexOf(source)
|
||||
if (index > -1) sources.splice(index, 1)
|
||||
})
|
||||
},
|
||||
//保存当前编辑源
|
||||
saveCurrentSource() {
|
||||
const source = this.currentSource,
|
||||
map = this.sourcesMap
|
||||
map.set(getSourceUniqueKey(source), JSON.parse(JSON.stringify(source)))
|
||||
this.saveSources(Array.from(map.values()))
|
||||
},
|
||||
// 更改当前编辑的源qq
|
||||
changeCurrentSource(source: Source) {
|
||||
this.currentSource = JSON.parse(JSON.stringify(source))
|
||||
},
|
||||
// update editTab tabName and editTab info
|
||||
changeTabName(tabName: string) {
|
||||
this.currentTab = tabName
|
||||
localStorage.setItem('tabName', tabName)
|
||||
},
|
||||
changeEditTabSource(source: Source) {
|
||||
this.editTabSource = JSON.parse(JSON.stringify(source))
|
||||
},
|
||||
editHistory(history: Source) {
|
||||
let historyObj
|
||||
if (localStorage.getItem('history')) {
|
||||
historyObj = JSON.parse(localStorage.getItem('history')!)
|
||||
historyObj.new.push(history)
|
||||
if (historyObj.new.length > 50) {
|
||||
historyObj.new.shift()
|
||||
}
|
||||
if (historyObj.old.length > 50) {
|
||||
historyObj.old.shift()
|
||||
}
|
||||
localStorage.setItem('history', JSON.stringify(historyObj))
|
||||
} else {
|
||||
const arr = { new: [history], old: [] }
|
||||
localStorage.setItem('history', JSON.stringify(arr))
|
||||
}
|
||||
},
|
||||
editHistoryUndo() {
|
||||
if (localStorage.getItem('history')) {
|
||||
const historyObj = JSON.parse(localStorage.getItem('history')!)
|
||||
historyObj.old.push(this.currentSource)
|
||||
if (historyObj.new.length) {
|
||||
this.currentSource = historyObj.new.pop()
|
||||
}
|
||||
localStorage.setItem('history', JSON.stringify(historyObj))
|
||||
}
|
||||
},
|
||||
clearAllHistory() {
|
||||
localStorage.setItem('history', JSON.stringify({ new: [], old: [] }))
|
||||
},
|
||||
clearEdit() {
|
||||
this.editTabSource = {} as Source
|
||||
this.currentSource = JSON.parse(JSON.stringify(emptySource)) //复制一份新对象
|
||||
},
|
||||
|
||||
// clear all source
|
||||
clearAllSource() {
|
||||
this.bookSources = []
|
||||
this.rssSources = []
|
||||
this.savedSources = []
|
||||
},
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user