Files
markone/packages/web/src/app/bookmarks/-store.tsx

64 lines
1.6 KiB
TypeScript
Raw Normal View History

2025-05-21 13:18:16 +01:00
import type { Bookmark } from "@markone/core/bookmark"
2025-05-13 18:34:08 +01:00
import { create } from "zustand/react"
import { router } from "~/router"
2025-05-21 13:18:16 +01:00
import { BookmarkListItemAction } from "./-bookmark-list"
2025-05-13 18:34:08 +01:00
enum LayoutMode {
Popup = "Popup",
SideBySide = "SideBySide",
}
enum ActiveDialog {
None = "None",
AddBookmark = "AddBookmark",
DeleteBookmark = "DeleteBookmark",
}
interface BookmarkPageState {
2025-05-21 13:18:16 +01:00
bookmarkToBeDeleted: Bookmark | null
2025-05-13 18:34:08 +01:00
layoutMode: LayoutMode
activeDialog: ActiveDialog
2025-05-21 13:18:16 +01:00
handleBookmarkListItemAction: (bookmark: Bookmark, action: BookmarkListItemAction) => void
2025-05-13 18:34:08 +01:00
setActiveDialog: (dialog: ActiveDialog) => void
setLayoutMode: (mode: LayoutMode) => void
}
const useBookmarkPageStore = create<BookmarkPageState>()((set, get) => ({
bookmarkCount: 0,
bookmarks: [],
selectedBookmarkId: "",
selectedBookmarkIndex: 0,
isBookmarkItemExpanded: false,
isBookmarkPreviewOpened: false,
bookmarkToBeDeleted: null,
layoutMode: LayoutMode.Popup,
activeDialog: ActiveDialog.None,
actionBarHeight: 0,
2025-05-21 13:18:16 +01:00
handleBookmarkListItemAction(bookmark: Bookmark, action: BookmarkListItemAction) {
2025-05-13 18:34:08 +01:00
switch (action) {
case BookmarkListItemAction.Open:
router.navigate({ to: `/bookmarks/${bookmark.id}` })
break
case BookmarkListItemAction.Delete:
set({ bookmarkToBeDeleted: bookmark, activeDialog: ActiveDialog.DeleteBookmark })
break
default:
break
}
},
setActiveDialog(dialog: ActiveDialog) {
set({ activeDialog: dialog })
},
setLayoutMode(mode: LayoutMode) {
set({ layoutMode: mode })
},
}))
export { LayoutMode, ActiveDialog, useBookmarkPageStore }
export type { BookmarkPageState }