Skip to content

Commit 418885f

Browse files
committed
use Select for focus mode predefined options
1 parent 0d5d5c1 commit 418885f

1 file changed

Lines changed: 65 additions & 72 deletions

File tree

src/features/settings/components/PauseSettings.tsx

Lines changed: 65 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { 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

64
type 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

2125
export 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

Comments
 (0)