89 lines
1.9 KiB
TypeScript
89 lines
1.9 KiB
TypeScript
// stores/book.ts
|
|
import { defineStore } from 'pinia'
|
|
import type { IBookDetail, IBook, IReaderSettings, IReadProgress } from '@/types/book'
|
|
|
|
interface BookState {
|
|
currentBook: IBookDetail | null
|
|
myBooks: IBook[]
|
|
readerSettings: IReaderSettings
|
|
readProgressCache: Record<number, IReadProgress>
|
|
}
|
|
|
|
export const useBookStore = defineStore('book', {
|
|
state: (): BookState => ({
|
|
// 当前查看的书籍
|
|
currentBook: null,
|
|
|
|
// 书单列表
|
|
myBooks: [],
|
|
|
|
// 阅读器设置
|
|
readerSettings: {
|
|
fontSize: 1,
|
|
lineHeight: 34,
|
|
theme: 'default',
|
|
readMode: 'scroll'
|
|
},
|
|
|
|
// 阅读进度缓存
|
|
readProgressCache: {}
|
|
}),
|
|
|
|
getters: {
|
|
/**
|
|
* 获取指定书籍的阅读进度
|
|
*/
|
|
getReadProgress: (state) => (bookId: number) => {
|
|
return state.readProgressCache[bookId]
|
|
}
|
|
},
|
|
|
|
actions: {
|
|
/**
|
|
* 设置当前书籍
|
|
*/
|
|
setCurrentBook(book: IBookDetail) {
|
|
this.currentBook = book
|
|
},
|
|
|
|
/**
|
|
* 更新阅读设置
|
|
*/
|
|
updateReaderSettings(settings: Partial<IReaderSettings>) {
|
|
Object.assign(this.readerSettings, settings)
|
|
// 持久化到本地存储
|
|
uni.setStorageSync('readerSettings', this.readerSettings)
|
|
},
|
|
|
|
/**
|
|
* 缓存阅读进度
|
|
*/
|
|
cacheReadProgress(bookId: number, progress: IReadProgress) {
|
|
this.readProgressCache[bookId] = progress
|
|
},
|
|
|
|
/**
|
|
* 从本地存储恢复设置
|
|
*/
|
|
restoreSettings() {
|
|
try {
|
|
const settings = uni.getStorageSync('readerSettings')
|
|
if (settings) {
|
|
this.readerSettings = settings
|
|
}
|
|
} catch (e) {
|
|
console.error('Failed to restore reader settings:', e)
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 重置store
|
|
*/
|
|
reset() {
|
|
this.currentBook = null
|
|
this.myBooks = []
|
|
this.readProgressCache = {}
|
|
}
|
|
}
|
|
})
|