mirror of
https://github.com/priyanshujain/margin.git
synced 2026-10-02 11:07:04 +00:00
refactor(store): nullable open book with open/close for library nav
This commit is contained in:
1 parent
4896e10aba
commit
a6404847d1
1 file changed
+26
-37
+26
-37
@@ -1,61 +1,50 @@
|
|||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
import type { JSONContent } from "@tiptap/core";
|
import type { JSONContent } from "@tiptap/core";
|
||||||
import { type Book, type BookMetadata, type BookSettings, createChapter, starterBook } from "../model/book";
|
import { type Book, type BookMetadata, type BookSettings, createChapter } from "../model/book";
|
||||||
|
|
||||||
interface BookState {
|
interface BookState {
|
||||||
book: Book;
|
book: Book | null;
|
||||||
activeChapterId: string;
|
activeChapterId: string;
|
||||||
path: string | null;
|
|
||||||
dirty: boolean;
|
dirty: boolean;
|
||||||
|
openBook: (book: Book) => void;
|
||||||
|
closeBook: () => void;
|
||||||
setActiveChapter: (id: string) => void;
|
setActiveChapter: (id: string) => void;
|
||||||
setChapterContent: (id: string, content: JSONContent) => void;
|
setChapterContent: (id: string, content: JSONContent) => void;
|
||||||
setChapterTitle: (id: string, title: string) => void;
|
setChapterTitle: (id: string, title: string) => void;
|
||||||
addChapter: () => void;
|
addChapter: () => void;
|
||||||
setMetadata: (patch: Partial<BookMetadata>) => void;
|
setMetadata: (patch: Partial<BookMetadata>) => void;
|
||||||
setSettings: (patch: Partial<BookSettings>) => void;
|
setSettings: (patch: Partial<BookSettings>) => void;
|
||||||
replaceBook: (book: Book, path: string) => void;
|
markSaved: () => void;
|
||||||
markSaved: (path: string) => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useBook = create<BookState>((set) => {
|
export const useBook = create<BookState>((set) => ({
|
||||||
const book = starterBook();
|
book: null,
|
||||||
return {
|
activeChapterId: "",
|
||||||
book,
|
|
||||||
activeChapterId: book.chapters[0].id,
|
|
||||||
path: null,
|
|
||||||
dirty: false,
|
dirty: false,
|
||||||
|
openBook: (book) => set({ book, activeChapterId: book.chapters[0]?.id ?? "", dirty: false }),
|
||||||
|
closeBook: () => set({ book: null, activeChapterId: "", dirty: false }),
|
||||||
setActiveChapter: (id) => set({ activeChapterId: id }),
|
setActiveChapter: (id) => set({ activeChapterId: id }),
|
||||||
setChapterContent: (id, content) =>
|
setChapterContent: (id, content) =>
|
||||||
set((s) => ({
|
set((s) =>
|
||||||
dirty: true,
|
s.book
|
||||||
book: {
|
? { dirty: true, book: { ...s.book, chapters: s.book.chapters.map((c) => (c.id === id ? { ...c, content } : c)) } }
|
||||||
...s.book,
|
: {}
|
||||||
chapters: s.book.chapters.map((c) => (c.id === id ? { ...c, content } : c)),
|
),
|
||||||
},
|
|
||||||
})),
|
|
||||||
setChapterTitle: (id, title) =>
|
setChapterTitle: (id, title) =>
|
||||||
set((s) => ({
|
set((s) =>
|
||||||
dirty: true,
|
s.book
|
||||||
book: {
|
? { dirty: true, book: { ...s.book, chapters: s.book.chapters.map((c) => (c.id === id ? { ...c, title } : c)) } }
|
||||||
...s.book,
|
: {}
|
||||||
chapters: s.book.chapters.map((c) => (c.id === id ? { ...c, title } : c)),
|
),
|
||||||
},
|
|
||||||
})),
|
|
||||||
addChapter: () =>
|
addChapter: () =>
|
||||||
set((s) => {
|
set((s) => {
|
||||||
|
if (!s.book) return {};
|
||||||
const chapter = createChapter();
|
const chapter = createChapter();
|
||||||
return {
|
return { activeChapterId: chapter.id, dirty: true, book: { ...s.book, chapters: [...s.book.chapters, chapter] } };
|
||||||
activeChapterId: chapter.id,
|
|
||||||
dirty: true,
|
|
||||||
book: { ...s.book, chapters: [...s.book.chapters, chapter] },
|
|
||||||
};
|
|
||||||
}),
|
}),
|
||||||
setMetadata: (patch) =>
|
setMetadata: (patch) =>
|
||||||
set((s) => ({ dirty: true, book: { ...s.book, metadata: { ...s.book.metadata, ...patch } } })),
|
set((s) => (s.book ? { dirty: true, book: { ...s.book, metadata: { ...s.book.metadata, ...patch } } } : {})),
|
||||||
setSettings: (patch) =>
|
setSettings: (patch) =>
|
||||||
set((s) => ({ dirty: true, book: { ...s.book, settings: { ...s.book.settings, ...patch } } })),
|
set((s) => (s.book ? { dirty: true, book: { ...s.book, settings: { ...s.book.settings, ...patch } } } : {})),
|
||||||
replaceBook: (book, path) =>
|
markSaved: () => set({ dirty: false }),
|
||||||
set({ book, activeChapterId: book.chapters[0]?.id ?? "", path, dirty: false }),
|
}));
|
||||||
markSaved: (path) => set({ path, dirty: false }),
|
|
||||||
};
|
|
||||||
});
|
|
||||||
Reference in new issue
Block a user