summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/timeline/placement/compatibility.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-03-31 15:47:30 +0200
committerMaze Winther <mazewinther@gmail.com>2026-03-31 15:47:30 +0200
commit70a6d58b8432e455ab1443d45bc23dd70b363bea (patch)
treeb4bcdb88b87cbd2cd295c54cde013f38481c7f2a /apps/web/src/lib/timeline/placement/compatibility.ts
parent5cc6abc3a44c9d046a1cb71a8c916f1d35827e8f (diff)
downloadopencut-70a6d58b8432e455ab1443d45bc23dd70b363bea.tar.gz
refactor: centralize track placement into its own module
Diffstat (limited to 'apps/web/src/lib/timeline/placement/compatibility.ts')
-rw-r--r--apps/web/src/lib/timeline/placement/compatibility.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/apps/web/src/lib/timeline/placement/compatibility.ts b/apps/web/src/lib/timeline/placement/compatibility.ts
new file mode 100644
index 00000000..de1baff3
--- /dev/null
+++ b/apps/web/src/lib/timeline/placement/compatibility.ts
@@ -0,0 +1,51 @@
+import type { ElementType, TrackType } from "@/lib/timeline";
+
+const ELEMENT_TRACK_MAP: Record<ElementType, TrackType> = {
+ audio: "audio",
+ text: "text",
+ sticker: "graphic",
+ graphic: "graphic",
+ effect: "effect",
+ video: "video",
+ image: "video",
+};
+
+export function getTrackTypeForElementType({
+ elementType,
+}: {
+ elementType: ElementType;
+}): TrackType {
+ return ELEMENT_TRACK_MAP[elementType];
+}
+
+export function canElementGoOnTrack({
+ elementType,
+ trackType,
+}: {
+ elementType: ElementType;
+ trackType: TrackType;
+}): boolean {
+ return getTrackTypeForElementType({ elementType }) === trackType;
+}
+
+export function validateElementTrackCompatibility({
+ element,
+ track,
+}: {
+ element: { type: ElementType };
+ track: { type: TrackType };
+}): { isValid: boolean; errorMessage?: string } {
+ const isValid = canElementGoOnTrack({
+ elementType: element.type,
+ trackType: track.type,
+ });
+
+ if (!isValid) {
+ return {
+ isValid: false,
+ errorMessage: `${element.type} elements cannot be placed on ${track.type} tracks`,
+ };
+ }
+
+ return { isValid: true };
+}