summaryrefslogtreecommitdiff
path: root/apps/web/src/stores
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/stores')
-rw-r--r--apps/web/src/stores/project-store.ts66
1 files changed, 46 insertions, 20 deletions
diff --git a/apps/web/src/stores/project-store.ts b/apps/web/src/stores/project-store.ts
index 69aca3ec..bfabba1f 100644
--- a/apps/web/src/stores/project-store.ts
+++ b/apps/web/src/stores/project-store.ts
@@ -11,6 +11,7 @@ interface ProjectStore {
savedProjects: TProject[];
isLoading: boolean;
isInitialized: boolean;
+ invalidProjectIds?: Set<string>;
// Actions
createNewProject: (name: string) => Promise<string>;
@@ -27,7 +28,7 @@ interface ProjectStore {
options?: { backgroundColor?: string; blurIntensity?: number }
) => Promise<void>;
updateProjectFps: (fps: number) => Promise<void>;
-
+
// Bookmark methods
toggleBookmark: (time: number) => Promise<void>;
isBookmarked: (time: number) => boolean;
@@ -37,6 +38,11 @@ interface ProjectStore {
searchQuery: string,
sortOption: string
) => TProject[];
+
+ // Global invalid project ID tracking
+ isInvalidProjectId: (id: string) => boolean;
+ markProjectIdAsInvalid: (id: string) => void;
+ clearInvalidProjectIds: () => void;
}
export const useProjectStore = create<ProjectStore>((set, get) => ({
@@ -44,24 +50,25 @@ export const useProjectStore = create<ProjectStore>((set, get) => ({
savedProjects: [],
isLoading: true,
isInitialized: false,
-
+ invalidProjectIds: new Set<string>(),
+
// Implementation of bookmark methods
toggleBookmark: async (time: number) => {
const { activeProject } = get();
if (!activeProject) return;
-
+
// Round time to the nearest frame
const fps = activeProject.fps || 30;
const frameTime = Math.round(time * fps) / fps;
-
+
const bookmarks = activeProject.bookmarks || [];
let updatedBookmarks: number[];
-
+
// Check if already bookmarked
const bookmarkIndex = bookmarks.findIndex(
- bookmark => Math.abs(bookmark - frameTime) < 0.001
+ (bookmark) => Math.abs(bookmark - frameTime) < 0.001
);
-
+
if (bookmarkIndex !== -1) {
// Remove bookmark
updatedBookmarks = bookmarks.filter((_, i) => i !== bookmarkIndex);
@@ -69,13 +76,13 @@ export const useProjectStore = create<ProjectStore>((set, get) => ({
// Add bookmark
updatedBookmarks = [...bookmarks, frameTime].sort((a, b) => a - b);
}
-
+
const updatedProject = {
...activeProject,
bookmarks: updatedBookmarks,
updatedAt: new Date(),
};
-
+
try {
await storageService.saveProject(updatedProject);
set({ activeProject: updatedProject });
@@ -87,43 +94,43 @@ export const useProjectStore = create<ProjectStore>((set, get) => ({
});
}
},
-
+
isBookmarked: (time: number) => {
const { activeProject } = get();
if (!activeProject || !activeProject.bookmarks) return false;
-
+
// Round time to the nearest frame
const fps = activeProject.fps || 30;
const frameTime = Math.round(time * fps) / fps;
-
+
return activeProject.bookmarks.some(
- bookmark => Math.abs(bookmark - frameTime) < 0.001
+ (bookmark) => Math.abs(bookmark - frameTime) < 0.001
);
},
-
+
removeBookmark: async (time: number) => {
const { activeProject } = get();
if (!activeProject || !activeProject.bookmarks) return;
-
+
// Round time to the nearest frame
const fps = activeProject.fps || 30;
const frameTime = Math.round(time * fps) / fps;
-
+
const updatedBookmarks = activeProject.bookmarks.filter(
- bookmark => Math.abs(bookmark - frameTime) >= 0.001
+ (bookmark) => Math.abs(bookmark - frameTime) >= 0.001
);
-
+
if (updatedBookmarks.length === activeProject.bookmarks.length) {
// No bookmark found to remove
return;
}
-
+
const updatedProject = {
...activeProject,
bookmarks: updatedBookmarks,
updatedAt: new Date(),
};
-
+
try {
await storageService.saveProject(updatedProject);
set({ activeProject: updatedProject });
@@ -454,4 +461,23 @@ export const useProjectStore = create<ProjectStore>((set, get) => ({
return sortedProjects;
},
+
+ // Global invalid project ID tracking implementation
+ isInvalidProjectId: (id: string) => {
+ const invalidIds = get().invalidProjectIds || new Set();
+ return invalidIds.has(id);
+ },
+
+ markProjectIdAsInvalid: (id: string) => {
+ set((state) => ({
+ invalidProjectIds: new Set([
+ ...(state.invalidProjectIds || new Set()),
+ id,
+ ]),
+ }));
+ },
+
+ clearInvalidProjectIds: () => {
+ set({ invalidProjectIds: new Set() });
+ },
}));