1- import { createSignal } from "solid-js" ;
1+ import { createEffect , createSignal , onMount } from "solid-js" ;
22import Tooltip from "~/components/Tooltip" ;
33import { createOptionsQuery } from "~/utils/queries" ;
44import { commands } from "~/utils/tauri" ;
5+ import { trackEvent } from "~/utils/analytics" ;
6+ import { createStore } from "solid-js/store" ;
7+
8+ // Create a global store for mode state that all components can access
9+ const [ modeState , setModeState ] = createStore ( {
10+ current : "studio" as "instant" | "studio" ,
11+ initialized : false ,
12+ } ) ;
13+
14+ // Export this so other components can directly access the current mode
15+ export const getModeState = ( ) => modeState . current ;
16+ export const setApplicationMode = ( mode : "instant" | "studio" ) => {
17+ setModeState ( { current : mode , initialized : true } ) ;
18+ // Also dispatch an event for components that might be listening
19+ window . dispatchEvent ( new CustomEvent ( "cap:mode-change" , { detail : mode } ) ) ;
20+ } ;
521
622const Mode = ( ) => {
723 const { options, setOptions } = createOptionsQuery ( ) ;
824 const [ isInfoHovered , setIsInfoHovered ] = createSignal ( false ) ;
925
26+ // Initialize the mode from options when data is available
27+ createEffect ( ( ) => {
28+ if ( options . data ?. mode ) {
29+ if ( ! modeState . initialized || options . data . mode !== modeState . current ) {
30+ console . log ( "Initializing mode state from options:" , options . data . mode ) ;
31+ setModeState ( { current : options . data . mode , initialized : true } ) ;
32+ }
33+ }
34+ } ) ;
35+
36+ // Listen for mode change events
37+ onMount ( ( ) => {
38+ const handleModeChange = ( e : CustomEvent ) => {
39+ console . log ( "Mode change event received:" , e . detail ) ;
40+ } ;
41+
42+ window . addEventListener (
43+ "cap:mode-change" ,
44+ handleModeChange as EventListener
45+ ) ;
46+
47+ return ( ) => {
48+ window . removeEventListener (
49+ "cap:mode-change" ,
50+ handleModeChange as EventListener
51+ ) ;
52+ } ;
53+ } ) ;
54+
1055 const openModeSelectWindow = async ( ) => {
1156 try {
1257 await commands . showWindow ( "ModeSelect" ) ;
@@ -15,6 +60,25 @@ const Mode = () => {
1560 }
1661 } ;
1762
63+ const handleModeChange = ( mode : "instant" | "studio" ) => {
64+ if ( ! options . data ) return ;
65+ if ( mode === modeState . current ) return ;
66+
67+ console . log ( "Mode changing from" , modeState . current , "to" , mode ) ;
68+
69+ // Update global state immediately for responsive UI
70+ setApplicationMode ( mode ) ;
71+
72+ // Track the mode change event
73+ trackEvent ( "mode_changed" , { from : modeState . current , to : mode } ) ;
74+
75+ // Update the backend options while preserving camera/microphone settings
76+ setOptions . mutate ( {
77+ ...options . data ,
78+ mode,
79+ } ) ;
80+ } ;
81+
1882 return (
1983 < div class = "flex gap-2 relative justify-end items-center p-1.5 rounded-full bg-gray-200 w-fit" >
2084 < div
@@ -35,11 +99,10 @@ const Mode = () => {
3599 >
36100 < div
37101 onClick = { ( ) => {
38- if ( ! options . data ) return ;
39- setOptions . mutate ( { ...options . data , mode : "instant" } ) ;
102+ handleModeChange ( "instant" ) ;
40103 } }
41104 class = { `flex justify-center items-center transition-all duration-200 rounded-full size-7 hover:cursor-pointer ${
42- options . data ?. mode === "instant"
105+ modeState . current === "instant"
43106 ? "ring-2 ring-offset-1 ring-offset-gray-50 bg-gray-300 hover:bg-[--gray-300] ring-[--blue-300]"
44107 : "bg-gray-200 hover:bg-[--gray-300]"
45108 } `}
@@ -58,11 +121,10 @@ const Mode = () => {
58121 >
59122 < div
60123 onClick = { ( ) => {
61- if ( ! options . data ) return ;
62- setOptions . mutate ( { ...options . data , mode : "studio" } ) ;
124+ handleModeChange ( "studio" ) ;
63125 } }
64126 class = { `flex justify-center items-center transition-all duration-200 rounded-full size-7 hover:cursor-pointer ${
65- options . data ?. mode === "studio"
127+ modeState . current === "studio"
66128 ? "ring-2 ring-offset-1 ring-offset-gray-50 bg-gray-300 hover:bg-[--gray-300] ring-[--blue-300]"
67129 : "bg-gray-200 hover:bg-[--gray-300]"
68130 } `}
@@ -76,11 +138,10 @@ const Mode = () => {
76138 < >
77139 < div
78140 onClick = { ( ) => {
79- if ( ! options . data ) return ;
80- setOptions . mutate ( { ...options . data , mode : "instant" } ) ;
141+ handleModeChange ( "instant" ) ;
81142 } }
82143 class = { `flex justify-center items-center transition-all duration-200 rounded-full size-7 hover:cursor-pointer ${
83- options . data ?. mode === "instant"
144+ modeState . current === "instant"
84145 ? "ring-2 ring-offset-1 ring-offset-gray-50 bg-gray-300 hover:bg-[--gray-300] ring-[--blue-300]"
85146 : "bg-gray-200 hover:bg-[--gray-300]"
86147 } `}
@@ -90,11 +151,10 @@ const Mode = () => {
90151
91152 < div
92153 onClick = { ( ) => {
93- if ( ! options . data ) return ;
94- setOptions . mutate ( { ...options . data , mode : "studio" } ) ;
154+ handleModeChange ( "studio" ) ;
95155 } }
96156 class = { `flex justify-center items-center transition-all duration-200 rounded-full size-7 hover:cursor-pointer ${
97- options . data ?. mode === "studio"
157+ modeState . current === "studio"
98158 ? "ring-2 ring-offset-1 ring-offset-gray-50 bg-gray-300 hover:bg-[--gray-300] ring-[--blue-300]"
99159 : "bg-gray-200 hover:bg-[--gray-300]"
100160 } `}
0 commit comments