@@ -11,6 +11,7 @@ import {
1111 ChevronDown ,
1212 ChevronUp ,
1313 ArrowLeft ,
14+ Save ,
1415 AlarmClock ,
1516 Loader2 ,
1617} from "lucide-react" ;
@@ -30,6 +31,7 @@ const Icons = {
3031 ChevronDown : ( ) => < ChevronDown size = { 15 } /> ,
3132 ChevronUp : ( ) => < ChevronUp size = { 15 } /> ,
3233 ArrowLeft : ( ) => < ArrowLeft size = { 18 } /> ,
34+ Save : ( ) => < Save size = { 15 } /> ,
3335 Discord : ( ) => < Discord /> ,
3436 Loader : ( ) => < Loader2 size = { 24 } className = "animate-spin" /> ,
3537} ;
@@ -60,6 +62,8 @@ export default function App() {
6062 const [ currentUrl , setCurrentUrl ] = useState ( "" ) ;
6163 const [ startMonochromate , setStartMonochromate ] = useState ( "" ) ;
6264 const [ endMonochromate , setEndMonochromate ] = useState ( "" ) ;
65+ const [ tempStartTime , setTempStartTime ] = useState ( "" ) ;
66+ const [ tempEndTime , setTempEndTime ] = useState ( "" ) ;
6367 const [ scheduleToggle , setScheduleToggle ] = useState ( false ) ;
6468 const [ view , setView ] = useState < "main" | "blacklist" > ( "main" ) ;
6569
@@ -101,8 +105,12 @@ export default function App() {
101105 setEnabled ( data . Monofilter . enabled ?? false ) ;
102106 setIntensity ( data . Monofilter . intensity ?? 100 ) ;
103107 setBlacklist ( data . Monofilter . blacklist ?? [ ] ) ;
104- setStartMonochromate ( data . Monofilter . scheduleStart ?? "17:00" ) ;
105- setEndMonochromate ( data . Monofilter . scheduleEnd ?? "09:00" ) ;
108+ const scheduleStart = data . Monofilter . scheduleStart ?? "17:00" ;
109+ const scheduleEnd = data . Monofilter . scheduleEnd ?? "09:00" ;
110+ setStartMonochromate ( scheduleStart ) ;
111+ setEndMonochromate ( scheduleEnd ) ;
112+ setTempStartTime ( scheduleStart ) ;
113+ setTempEndTime ( scheduleEnd ) ;
106114 setScheduleToggle ( data . Monofilter . schedule ?? true ) ;
107115 }
108116 // Only turn off loading when data is actually loaded
@@ -124,8 +132,12 @@ export default function App() {
124132 setEnabled ( newValue . enabled ?? false ) ;
125133 setIntensity ( newValue . intensity ?? 100 ) ;
126134 setBlacklist ( newValue . blacklist ?? [ ] ) ;
127- setStartMonochromate ( newValue . scheduleStart ?? "17:00" ) ;
128- setEndMonochromate ( newValue . scheduleEnd ?? "09:00" ) ;
135+ const scheduleStart = newValue . scheduleStart ?? "17:00" ;
136+ const scheduleEnd = newValue . scheduleEnd ?? "09:00" ;
137+ setStartMonochromate ( scheduleStart ) ;
138+ setEndMonochromate ( scheduleEnd ) ;
139+ setTempStartTime ( scheduleStart ) ;
140+ setTempEndTime ( scheduleEnd ) ;
129141 setScheduleToggle ( newValue . schedule ?? true ) ;
130142 }
131143 }
@@ -168,33 +180,18 @@ export default function App() {
168180 } ,
169181 [ loading ]
170182 ) ;
171- const changeStartTime = useCallback (
172- ( e : React . ChangeEvent < HTMLInputElement > ) => {
173- if ( loading ) return ;
174-
175- const newStartTime = e . target . value ;
176- setStartMonochromate ( newStartTime ) ;
177- browser . runtime . sendMessage ( {
178- type : "setScheduleStart" ,
179- value : newStartTime ,
180- } ) ;
181- } ,
182- [ loading ]
183- ) ;
184183
185- const changeEndTime = useCallback (
186- ( e : React . ChangeEvent < HTMLInputElement > ) => {
187- if ( loading ) return ;
184+ const saveScheduleTimes = useCallback ( ( ) => {
185+ if ( loading ) return ;
188186
189- const newEndTime = e . target . value ;
190- setEndMonochromate ( newEndTime ) ;
191- browser . runtime . sendMessage ( {
192- type : "setScheduleEnd" ,
193- value : newEndTime ,
194- } ) ;
195- } ,
196- [ loading ]
197- ) ;
187+ setStartMonochromate ( tempStartTime ) ;
188+ setEndMonochromate ( tempEndTime ) ;
189+ browser . runtime . sendMessage ( {
190+ type : "saveSchedule" ,
191+ startTime : tempStartTime ,
192+ endTime : tempEndTime ,
193+ } ) ;
194+ } , [ tempStartTime , tempEndTime , loading ] ) ;
198195
199196 const toggleSchedule = useCallback ( ( ) => {
200197 if ( loading ) return ;
@@ -371,35 +368,54 @@ export default function App() {
371368 </ div >
372369
373370 < div
374- className = { `flex gap-2 items-center ${
375- ! scheduleToggle ? "opacity-60" : ""
376- } `}
371+ className = { `space-y-3 ${ ! scheduleToggle ? "opacity-60" : "" } ` }
377372 >
378- < div className = "flex-1 bg-white rounded-lg border border-neutral-200 px-3 py-2 hover:border-neutral-400 transition-all" >
379- < div className = "flex items-center justify-between" >
380- < span className = "text-xs text-neutral-500" > Start:</ span >
381- < input
382- type = "time"
383- className = "bg-transparent border-0 text-sm text-right focus:outline-hidden"
384- value = { startMonochromate }
385- onChange = { ( e ) => changeStartTime ( e ) }
386- disabled = { ! scheduleToggle }
387- />
373+ < div className = "flex gap-2 items-center" >
374+ < div className = "flex-1 bg-white rounded-lg border border-neutral-200 px-3 py-2 hover:border-neutral-400 transition-all" >
375+ < div className = "flex items-center justify-between" >
376+ < span className = "text-xs text-neutral-500" > Start:</ span >
377+ < input
378+ type = "time"
379+ className = "bg-transparent border-0 text-sm text-right focus:outline-hidden"
380+ value = { tempStartTime }
381+ onChange = { ( e ) => setTempStartTime ( e . target . value ) }
382+ disabled = { ! scheduleToggle }
383+ />
384+ </ div >
388385 </ div >
389- </ div >
390386
391- < div className = "flex-1 bg-white rounded-lg border border-neutral-200 px-3 py-2 hover:border-neutral-400 transition-all" >
392- < div className = "flex items-center justify-between" >
393- < span className = "text-xs text-neutral-500" > End:</ span >
394- < input
395- type = "time"
396- className = "bg-transparent border-0 text-sm text-right focus:outline-hidden"
397- value = { endMonochromate }
398- onChange = { ( e ) => changeEndTime ( e ) }
399- disabled = { ! scheduleToggle }
400- />
387+ < div className = "flex-1 bg-white rounded-lg border border-neutral-200 px-3 py-2 hover:border-neutral-400 transition-all" >
388+ < div className = "flex items-center justify-between" >
389+ < span className = "text-xs text-neutral-500" > End:</ span >
390+ < input
391+ type = "time"
392+ className = "bg-transparent border-0 text-sm text-right focus:outline-hidden"
393+ value = { tempEndTime }
394+ onChange = { ( e ) => setTempEndTime ( e . target . value ) }
395+ disabled = { ! scheduleToggle }
396+ />
397+ </ div >
401398 </ div >
402399 </ div >
400+
401+ < button
402+ onClick = { saveScheduleTimes }
403+ disabled = {
404+ ! scheduleToggle ||
405+ ( tempStartTime === startMonochromate &&
406+ tempEndTime === endMonochromate )
407+ }
408+ className = { `w-full flex items-center justify-center gap-2 px-3 py-2 rounded-lg text-sm transition-colors ${
409+ ! scheduleToggle ||
410+ ( tempStartTime === startMonochromate &&
411+ tempEndTime === endMonochromate )
412+ ? "bg-neutral-200 text-neutral-400 cursor-not-allowed"
413+ : "bg-neutral-900 text-white hover:bg-neutral-800"
414+ } `}
415+ >
416+ < Icons . Save />
417+ Save Schedule
418+ </ button >
403419 </ div >
404420 </ div >
405421
0 commit comments