11import { useState } from 'react'
2- import Select from 'react-select'
3- import Toggle from 'react-toggle'
4- import { ChipsSet } from 'src/components/Elements'
2+ import Select , { SingleValue } from 'react-select'
53
64type PauseSettingsProps = {
75 onSubmit : ( pauseToValue : number ) => void
@@ -12,108 +10,103 @@ type PauseOptionType = {
1210 label : string
1311}
1412
15- const pauseOptions : PauseOptionType [ ] = [
13+ const customPauseOptions : PauseOptionType [ ] = [
1614 { value : 1 , label : 'Minutes' } ,
1715 { value : 60 , label : 'Hours' } ,
18- { value : 1440 , label : 'Days' } ,
16+ ]
17+
18+ const PREDEFINED_OPTIONS : PauseOptionType [ ] = [
19+ { value : 15 , label : '15 Minutes' } ,
20+ { value : 30 , label : '30 Minutes' } ,
21+ { value : 60 , label : '1 Hour' } ,
22+ { value : - 1 , label : 'Custom...' } ,
1923]
2024
2125export const PauseSettings = ( { onSubmit } : PauseSettingsProps ) => {
22- const [ isPauseChecked , setIsPauseChecked ] = useState ( false )
2326 const [ pauseValue , setPauseValue ] = useState ( 0 )
2427 const [ isCustomInput , setIsCustomInput ] = useState ( false )
2528 const [ selectedNumber , setSelectedNumber ] = useState ( '' )
26- const [ selectedPeriod , setSelectedPeriod ] = useState < PauseOptionType > ( pauseOptions [ 0 ] )
29+ const [ selectedPeriod , setSelectedPeriod ] = useState < PauseOptionType > ( customPauseOptions [ 0 ] )
30+ const [ error , setError ] = useState < string | null > ( null )
2731
28- const onPauseAppChange = ( ) => {
29- setIsPauseChecked ( ! isPauseChecked )
30- }
3132 const onSubmitClick = ( ) => {
33+ setError ( null )
3234 try {
3335 let value = pauseValue
3436 if ( isCustomInput ) {
3537 value = parseInt ( selectedNumber ) * selectedPeriod . value
3638 }
37- if ( value <= 0 ) {
38- throw Error ( 'Invalid value' )
39+ if ( isNaN ( value ) || value <= 0 ) {
40+ setError ( 'Please select a valid value' )
41+ } else {
42+ const futureDate = new Date ( new Date ( ) . getTime ( ) + value * 60000 )
43+
44+ onSubmit ( futureDate . getTime ( ) )
3945 }
40- const futureDate = new Date ( new Date ( ) . getTime ( ) + pauseValue * 60000 )
41- onSubmit ( futureDate . getTime ( ) )
4246 } catch ( err ) {
4347 console . log ( 'PauseSettings Error:' , err )
48+ setError ( 'An error occurred, please try agian' )
4449 }
4550 }
4651
47- const onChipsChange = ( selectedChip ) => {
48- let value = parseInt ( selectedChip . value )
49- if ( value === - 1 ) {
52+ const onSearchEngineSelectChange = ( selectedOption : SingleValue < PauseOptionType > ) => {
53+ setError ( null )
54+ if ( ! selectedOption ) {
55+ return
56+ }
57+ if ( selectedOption . value === - 1 ) {
5058 setPauseValue ( 0 )
5159 return setIsCustomInput ( true )
5260 }
5361 setIsCustomInput ( false )
54- setPauseValue ( value )
62+ setPauseValue ( selectedOption . value )
5563 }
64+
5665 return (
5766 < div className = "settingRow" >
58- < p className = "settingTitle" > Pause App </ p >
67+ < p className = "settingTitle" > Focus Mode </ p >
5968 < div className = "settingContent" >
60- < Toggle checked = { isPauseChecked } icons = { false } onChange = { onPauseAppChange } />
61-
62- { isPauseChecked && (
63- < div className = "pauseFormWrapper" >
64- < div className = "pauseChips" >
65- < ChipsSet
66- className = { 'noMargin alternative-color' }
67- canSelectMultiple = { false }
68- options = { [
69- {
70- label : '30 Minutes' ,
71- value : '30' ,
72- } ,
73- {
74- label : '1 Hour' ,
75- value : '60' ,
76- } ,
77- {
78- label : '1 Day' ,
79- value : '1440' ,
80- } ,
81- {
82- label : 'Custom' ,
83- value : '-1' ,
84- } ,
85- ] }
86- defaultValues = { [ '60' ] }
87- onChange = { ( _ , selectedChips ) => {
88- onChipsChange ( selectedChips [ 0 ] )
89- } }
69+ < div className = "pauseFormWrapper" >
70+ < div className = "pauseChips" >
71+ < Select
72+ options = { PREDEFINED_OPTIONS }
73+ placeholder = "Select a period..."
74+ isMulti = { false }
75+ isClearable = { false }
76+ isSearchable = { false }
77+ classNamePrefix = { 'hackertab' }
78+ onChange = { onSearchEngineSelectChange }
79+ />
80+ </ div >
81+ { isCustomInput && (
82+ < div className = "pauseForm" >
83+ < input
84+ type = "number"
85+ value = { selectedNumber }
86+ onChange = { ( e ) => setSelectedNumber ( e . target . value ) }
87+ placeholder = "Number"
88+ />
89+ < Select
90+ value = { selectedPeriod }
91+ options = { customPauseOptions }
92+ isClearable = { false }
93+ isSearchable = { false }
94+ classNamePrefix = { 'hackertab' }
95+ onChange = { ( newValue ) => setSelectedPeriod ( newValue as PauseOptionType ) }
9096 />
9197 </ div >
92- { isCustomInput && (
93- < div className = "pauseForm" >
94- < input
95- type = "number"
96- value = { selectedNumber }
97- onChange = { ( e ) => setSelectedNumber ( e . target . value ) }
98- placeholder = "Number"
99- />
100- < Select
101- value = { selectedPeriod }
102- options = { pauseOptions }
103- isClearable = { false }
104- isSearchable = { false }
105- classNamePrefix = { 'hackertab' }
106- onChange = { ( newValue ) => setSelectedPeriod ( newValue as PauseOptionType ) }
107- />
108- </ div >
109- ) }
110- < div className = "buttonWrapper" >
111- < button className = "pauseButton" onClick = { onSubmitClick } >
112- Done
113- </ button >
98+ ) }
99+ { error && (
100+ < div className = "settingHint" >
101+ < p > { error } </ p >
114102 </ div >
103+ ) }
104+ < div className = "buttonWrapper" >
105+ < button className = "pauseButton" onClick = { onSubmitClick } >
106+ Done
107+ </ button >
115108 </ div >
116- ) }
109+ </ div >
117110 </ div >
118111 </ div >
119112 )
0 commit comments