summaryrefslogtreecommitdiff
path: root/apps/web/src/stores
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2025-07-22 12:36:17 +0200
committerMaze Winther <mazewinther@gmail.com>2025-07-22 12:36:17 +0200
commit87a29963c3220e82f5d8512b178fd3d14e52ca63 (patch)
tree1e301228891cd55c94735d0787ab69948eb1cb8e /apps/web/src/stores
parenta7c0b920516750af14e505a829ea4f7b6e4ae729 (diff)
downloadopencut-87a29963c3220e82f5d8512b178fd3d14e52ca63.tar.gz
Merge pull request [#366](https://github.com/mazeincoding/AppCut/issues/366)
Diffstat (limited to 'apps/web/src/stores')
-rw-r--r--apps/web/src/stores/timeline-store.ts37
1 files changed, 37 insertions, 0 deletions
diff --git a/apps/web/src/stores/timeline-store.ts b/apps/web/src/stores/timeline-store.ts
index 81e135da..8a4abc6a 100644
--- a/apps/web/src/stores/timeline-store.ts
+++ b/apps/web/src/stores/timeline-store.ts
@@ -161,6 +161,7 @@ interface TimelineStore {
// Computed values
getTotalDuration: () => number;
+ getProjectThumbnail: (projectId: string) => Promise<string | null>;
// History actions
undo: () => void;
@@ -1178,6 +1179,42 @@ export const useTimelineStore = create<TimelineStore>((set, get) => {
return Math.max(...trackEndTimes, 0);
},
+ getProjectThumbnail: async (projectId) => {
+ try {
+ const tracks = await storageService.loadTimeline(projectId);
+ const mediaItems = await storageService.loadAllMediaItems(projectId);
+
+ if (!tracks || !mediaItems.length) return null;
+
+ const firstMediaElement = tracks
+ .flatMap((track) => track.elements)
+ .filter((element) => element.type === "media")
+ .sort((a, b) => a.startTime - b.startTime)[0];
+
+ if (!firstMediaElement) return null;
+
+ const mediaItem = mediaItems.find(
+ (item) => item.id === firstMediaElement.mediaId
+ );
+ if (!mediaItem) return null;
+
+ if (mediaItem.type === "video" && mediaItem.file) {
+ const { generateVideoThumbnail } = await import(
+ "@/stores/media-store"
+ );
+ const { thumbnailUrl } = await generateVideoThumbnail(mediaItem.file);
+ return thumbnailUrl;
+ } else if (mediaItem.type === "image" && mediaItem.url) {
+ return mediaItem.url;
+ }
+
+ return null;
+ } catch (error) {
+ console.error("Failed to get project thumbnail:", error);
+ return null;
+ }
+ },
+
redo: () => {
const { redoStack } = get();
if (redoStack.length === 0) return;