summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/timeline/bookmarks.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/lib/timeline/bookmarks.ts')
-rw-r--r--apps/web/src/lib/timeline/bookmarks.ts112
1 files changed, 100 insertions, 12 deletions
diff --git a/apps/web/src/lib/timeline/bookmarks.ts b/apps/web/src/lib/timeline/bookmarks.ts
index 0b06c2f6..efaa8f74 100644
--- a/apps/web/src/lib/timeline/bookmarks.ts
+++ b/apps/web/src/lib/timeline/bookmarks.ts
@@ -1,14 +1,27 @@
+import type { Bookmark } from "@/types/timeline";
import { roundToFrame } from "@/lib/time";
+export const BOOKMARK_TIME_EPSILON = 0.001;
+
+function bookmarkTimeEqual({
+ bookmarkTime,
+ frameTime,
+}: {
+ bookmarkTime: number;
+ frameTime: number;
+}): boolean {
+ return Math.abs(bookmarkTime - frameTime) < BOOKMARK_TIME_EPSILON;
+}
+
export function findBookmarkIndex({
bookmarks,
frameTime,
}: {
- bookmarks: number[];
+ bookmarks: Bookmark[];
frameTime: number;
}): number {
- return bookmarks.findIndex(
- (bookmark) => Math.abs(bookmark - frameTime) < 0.001,
+ return bookmarks.findIndex((bookmark) =>
+ bookmarkTimeEqual({ bookmarkTime: bookmark.time, frameTime }),
);
}
@@ -16,40 +29,84 @@ export function isBookmarkAtTime({
bookmarks,
frameTime,
}: {
- bookmarks: number[];
+ bookmarks: Bookmark[];
frameTime: number;
}): boolean {
- return bookmarks.some((bookmark) => Math.abs(bookmark - frameTime) < 0.001);
+ return bookmarks.some((bookmark) =>
+ bookmarkTimeEqual({ bookmarkTime: bookmark.time, frameTime }),
+ );
}
export function toggleBookmarkInArray({
bookmarks,
frameTime,
}: {
- bookmarks: number[];
+ bookmarks: Bookmark[];
frameTime: number;
-}): number[] {
+}): Bookmark[] {
const bookmarkIndex = findBookmarkIndex({ bookmarks, frameTime });
if (bookmarkIndex !== -1) {
- return bookmarks.filter((_, i) => i !== bookmarkIndex);
+ return bookmarks.filter((_, index) => index !== bookmarkIndex);
}
- return [...bookmarks, frameTime].sort((a, b) => a - b);
+ const newBookmarks = [...bookmarks, { time: frameTime }];
+ return newBookmarks.slice().sort((a, b) => a.time - b.time);
}
export function removeBookmarkFromArray({
bookmarks,
frameTime,
}: {
- bookmarks: number[];
+ bookmarks: Bookmark[];
frameTime: number;
-}): number[] {
+}): Bookmark[] {
return bookmarks.filter(
- (bookmark) => Math.abs(bookmark - frameTime) >= 0.001,
+ (bookmark) =>
+ !bookmarkTimeEqual({ bookmarkTime: bookmark.time, frameTime }),
);
}
+export function updateBookmarkInArray({
+ bookmarks,
+ frameTime,
+ updates,
+}: {
+ bookmarks: Bookmark[];
+ frameTime: number;
+ updates: Partial<Omit<Bookmark, "time">>;
+}): Bookmark[] {
+ const index = findBookmarkIndex({ bookmarks, frameTime });
+ if (index === -1) {
+ return bookmarks;
+ }
+
+ const updated = { ...bookmarks[index], ...updates };
+ const result = [...bookmarks];
+ result[index] = updated;
+ return result;
+}
+
+export function moveBookmarkInArray({
+ bookmarks,
+ fromTime,
+ toTime,
+}: {
+ bookmarks: Bookmark[];
+ fromTime: number;
+ toTime: number;
+}): Bookmark[] {
+ const index = findBookmarkIndex({ bookmarks, frameTime: fromTime });
+ if (index === -1) {
+ return bookmarks;
+ }
+
+ const updated = { ...bookmarks[index], time: toTime };
+ const result = [...bookmarks];
+ result[index] = updated;
+ return result.slice().sort((a, b) => a.time - b.time);
+}
+
export function getFrameTime({
time,
fps,
@@ -59,3 +116,34 @@ export function getFrameTime({
}): number {
return roundToFrame({ time, fps });
}
+
+export function getBookmarkAtTime({
+ bookmarks,
+ frameTime,
+}: {
+ bookmarks: Bookmark[];
+ frameTime: number;
+}): Bookmark | null {
+ const index = findBookmarkIndex({ bookmarks, frameTime });
+ return index === -1 ? null : bookmarks[index];
+}
+
+export function getBookmarksActiveAtTime({
+ bookmarks,
+ time,
+}: {
+ bookmarks: Bookmark[];
+ time: number;
+}): Bookmark[] {
+ return bookmarks.filter((bookmark) => {
+ const start = bookmark.time;
+ const end =
+ bookmark.duration != null && bookmark.duration > 0
+ ? start + bookmark.duration
+ : start;
+ return (
+ time >= start - BOOKMARK_TIME_EPSILON &&
+ time <= end + BOOKMARK_TIME_EPSILON
+ );
+ });
+}