From 411a9a5f1cdb4b52c65f4a1344c9be7694d130d7 Mon Sep 17 00:00:00 2001 From: Pulkit Garg Date: Wed, 25 Jun 2025 10:26:29 +0530 Subject: feature: add project name editing functionality --- apps/web/src/stores/project-store.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'apps/web/src/stores') diff --git a/apps/web/src/stores/project-store.ts b/apps/web/src/stores/project-store.ts index 734c07e2..0d0812cd 100644 --- a/apps/web/src/stores/project-store.ts +++ b/apps/web/src/stores/project-store.ts @@ -7,6 +7,7 @@ interface ProjectStore { // Actions createNewProject: (name: string) => void; closeProject: () => void; + updateProjectName: (name: string) => void; } export const useProjectStore = create((set) => ({ @@ -25,4 +26,16 @@ export const useProjectStore = create((set) => ({ closeProject: () => { set({ activeProject: null }); }, + + updateProjectName: (name: string) => { + set((state) => ({ + activeProject: state.activeProject + ? { + ...state.activeProject, + name, + updatedAt: new Date(), + } + : null, + })); + }, })); -- cgit v1.3.1 From e14e137212d13293a9a8cd1d314e6cdfe8004df1 Mon Sep 17 00:00:00 2001 From: DevloperAmanSingh Date: Wed, 25 Jun 2025 13:27:55 +0530 Subject: feat(playback-store): implement mute and unmute functionality with improved volume handling --- apps/web/src/stores/playback-store.ts | 57 +++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 13 deletions(-) (limited to 'apps/web/src/stores') diff --git a/apps/web/src/stores/playback-store.ts b/apps/web/src/stores/playback-store.ts index a4794b7f..f887a081 100644 --- a/apps/web/src/stores/playback-store.ts +++ b/apps/web/src/stores/playback-store.ts @@ -10,7 +10,7 @@ let playbackTimer: number | null = null; const startTimer = (store: any) => { if (playbackTimer) cancelAnimationFrame(playbackTimer); - + // Use requestAnimationFrame for smoother updates const updateTime = () => { const state = store(); @@ -18,14 +18,16 @@ const startTimer = (store: any) => { const now = performance.now(); const delta = (now - lastUpdate) / 1000; // Convert to seconds lastUpdate = now; - - const newTime = state.currentTime + (delta * state.speed); + + const newTime = state.currentTime + delta * state.speed; if (newTime >= state.duration) { state.pause(); } else { state.setCurrentTime(newTime); // Notify video elements to sync - window.dispatchEvent(new CustomEvent('playback-update', { detail: { time: newTime } })); + window.dispatchEvent( + new CustomEvent("playback-update", { detail: { time: newTime } }) + ); } } playbackTimer = requestAnimationFrame(updateTime); @@ -47,6 +49,8 @@ export const usePlaybackStore = create((set, get) => ({ currentTime: 0, duration: 0, volume: 1, + muted: false, + previousVolume: 1, speed: 1.0, play: () => { @@ -72,22 +76,49 @@ export const usePlaybackStore = create((set, get) => ({ const { duration } = get(); const clampedTime = Math.max(0, Math.min(duration, time)); set({ currentTime: clampedTime }); - - // Notify video elements to seek - const event = new CustomEvent('playback-seek', { detail: { time: clampedTime } }); + + const event = new CustomEvent("playback-seek", { + detail: { time: clampedTime }, + }); window.dispatchEvent(event); }, - - setVolume: (volume: number) => set({ volume: Math.max(0, Math.min(1, volume)) }), - + + setVolume: (volume: number) => + set((state) => ({ + volume: Math.max(0, Math.min(1, volume)), + muted: volume === 0, + previousVolume: volume > 0 ? volume : state.previousVolume, + })), + setSpeed: (speed: number) => { const newSpeed = Math.max(0.1, Math.min(2.0, speed)); set({ speed: newSpeed }); - - const event = new CustomEvent('playback-speed', { detail: { speed: newSpeed } }); + + const event = new CustomEvent("playback-speed", { + detail: { speed: newSpeed }, + }); window.dispatchEvent(event); }, setDuration: (duration: number) => set({ duration }), setCurrentTime: (time: number) => set({ currentTime: time }), -})); \ No newline at end of file + + mute: () => { + const { volume } = get(); + set({ muted: true, previousVolume: volume, volume: 0 }); + }, + + unmute: () => { + const { previousVolume } = get(); + set({ muted: false, volume: previousVolume ?? 1 }); + }, + + toggleMute: () => { + const { muted } = get(); + if (muted) { + get().unmute(); + } else { + get().mute(); + } + }, +})); -- cgit v1.3.1 From 01b9dbccc277cff3b3d53ec241170f5c04102620 Mon Sep 17 00:00:00 2001 From: DevloperAmanSingh Date: Wed, 25 Jun 2025 14:17:26 +0530 Subject: fix(playback-store): improve mute functionality to retain previous volume state --- apps/web/src/stores/playback-store.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'apps/web/src/stores') diff --git a/apps/web/src/stores/playback-store.ts b/apps/web/src/stores/playback-store.ts index f887a081..0127edff 100644 --- a/apps/web/src/stores/playback-store.ts +++ b/apps/web/src/stores/playback-store.ts @@ -104,8 +104,12 @@ export const usePlaybackStore = create((set, get) => ({ setCurrentTime: (time: number) => set({ currentTime: time }), mute: () => { - const { volume } = get(); - set({ muted: true, previousVolume: volume, volume: 0 }); + const { volume, previousVolume } = get(); + set({ + muted: true, + previousVolume: volume > 0 ? volume : previousVolume, + volume: 0, + }); }, unmute: () => { -- cgit v1.3.1 From d9fcef93852d84a8f95778cef535fcd7233418a0 Mon Sep 17 00:00:00 2001 From: DevloperAmanSingh Date: Wed, 25 Jun 2025 16:34:12 +0530 Subject: fix(playback-store): reset playhead and notify video elements on completion --- apps/web/src/stores/playback-store.ts | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'apps/web/src/stores') diff --git a/apps/web/src/stores/playback-store.ts b/apps/web/src/stores/playback-store.ts index 0127edff..0cc01cc1 100644 --- a/apps/web/src/stores/playback-store.ts +++ b/apps/web/src/stores/playback-store.ts @@ -21,7 +21,13 @@ const startTimer = (store: any) => { const newTime = state.currentTime + delta * state.speed; if (newTime >= state.duration) { + // When video completes, pause and reset playhead to start state.pause(); + state.setCurrentTime(0); + // Notify video elements to sync with reset + window.dispatchEvent( + new CustomEvent("playback-seek", { detail: { time: 0 } }) + ); } else { state.setCurrentTime(newTime); // Notify video elements to sync -- cgit v1.3.1