Files

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 = {}
}
}
})