mirror of
https://github.com/movie-web/movie-web.git
synced 2025-01-15 04:19:08 +01:00
103 lines
2.3 KiB
TypeScript
103 lines
2.3 KiB
TypeScript
import { create } from "zustand";
|
|
import { persist } from "zustand/middleware";
|
|
import { immer } from "zustand/middleware/immer";
|
|
|
|
import { PlayerMeta } from "@/stores/player/slices/source";
|
|
|
|
export interface BookmarkMediaItem {
|
|
title: string;
|
|
year?: number;
|
|
poster?: string;
|
|
type: "show" | "movie";
|
|
updatedAt: number;
|
|
}
|
|
|
|
export interface BookmarkUpdateItem {
|
|
tmdbId: string;
|
|
title?: string;
|
|
year?: number;
|
|
id: string;
|
|
poster?: string;
|
|
type?: "show" | "movie";
|
|
action: "delete" | "add";
|
|
}
|
|
|
|
export interface BookmarkStore {
|
|
bookmarks: Record<string, BookmarkMediaItem>;
|
|
updateQueue: BookmarkUpdateItem[];
|
|
addBookmark(meta: PlayerMeta): void;
|
|
removeBookmark(id: string): void;
|
|
replaceBookmarks(items: Record<string, BookmarkMediaItem>): void;
|
|
clear(): void;
|
|
clearUpdateQueue(): void;
|
|
removeUpdateItem(id: string): void;
|
|
}
|
|
|
|
let updateId = 0;
|
|
|
|
export const useBookmarkStore = create(
|
|
persist(
|
|
immer<BookmarkStore>((set) => ({
|
|
bookmarks: {},
|
|
updateQueue: [],
|
|
removeBookmark(id) {
|
|
set((s) => {
|
|
updateId += 1;
|
|
s.updateQueue.push({
|
|
id: updateId.toString(),
|
|
action: "delete",
|
|
tmdbId: id,
|
|
});
|
|
|
|
delete s.bookmarks[id];
|
|
});
|
|
},
|
|
addBookmark(meta) {
|
|
set((s) => {
|
|
updateId += 1;
|
|
s.updateQueue.push({
|
|
id: updateId.toString(),
|
|
action: "add",
|
|
tmdbId: meta.tmdbId,
|
|
type: meta.type,
|
|
title: meta.title,
|
|
year: meta.releaseYear,
|
|
poster: meta.poster,
|
|
});
|
|
|
|
s.bookmarks[meta.tmdbId] = {
|
|
type: meta.type,
|
|
title: meta.title,
|
|
year: meta.releaseYear,
|
|
poster: meta.poster,
|
|
updatedAt: Date.now(),
|
|
};
|
|
});
|
|
},
|
|
replaceBookmarks(items: Record<string, BookmarkMediaItem>) {
|
|
set((s) => {
|
|
s.bookmarks = items;
|
|
});
|
|
},
|
|
clear() {
|
|
set((s) => {
|
|
s.bookmarks = {};
|
|
});
|
|
},
|
|
clearUpdateQueue() {
|
|
set((s) => {
|
|
s.updateQueue = [];
|
|
});
|
|
},
|
|
removeUpdateItem(id: string) {
|
|
set((s) => {
|
|
s.updateQueue = [...s.updateQueue.filter((v) => v.id !== id)];
|
|
});
|
|
},
|
|
})),
|
|
{
|
|
name: "__MW::bookmarks",
|
|
},
|
|
),
|
|
);
|