-
Notifications
You must be signed in to change notification settings - Fork 5
/
Scheduler.tsx
121 lines (108 loc) · 3.15 KB
/
Scheduler.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import Box from '@material-ui/core/Box'
import { makeStyles } from '@material-ui/styles'
import React from 'react'
import {
useRecoilState,
useRecoilValue,
useResetRecoilState,
useSetRecoilState,
} from 'recoil'
import CronExp from './components/CronExp'
import CronReader from './components/CronReader'
import DayOfMonth from './fields/DayOfMonth'
import Hour from './fields/Hour'
import Minute from './fields/Minute'
import Month from './fields/Month'
import Period from './fields/Period'
import Week from './fields/Week'
import { supportedLanguages } from './i18n'
import { cronExpState } from './selector'
import {
cronExpInputState,
cronValidationErrorMessageState,
dayOfMonthState,
hourState,
isAdminState,
localeState,
minuteState,
monthState,
periodState,
weekState,
} from './store'
import { SchedulerProps } from './types'
import { getPeriodIndex } from './utils'
const useStyles = makeStyles({
box: {
minHeight: 'min-content',
},
})
export default function Scheduler(props: SchedulerProps) {
const { cron, setCron, setCronError, isAdmin, locale, customLocale } = props
const classes = useStyles()
const period = useRecoilValue(periodState)
const [periodIndex, setPeriodIndex] = React.useState(0)
const setCronExp = useSetRecoilState(cronExpState)
const cronError = useRecoilValue(cronValidationErrorMessageState)
const setIsAdmin = useSetRecoilState(isAdminState)
const [cronExpInput, setCronExpInput] = useRecoilState(cronExpInputState)
const setResolvedLocale = useSetRecoilState(localeState)
const resetCronExpInput = useResetRecoilState(cronExpInputState)
const resetMinute = useResetRecoilState(minuteState)
const resetHour = useResetRecoilState(hourState)
const resetDayOfMonth = useResetRecoilState(dayOfMonthState)
const resetDayOfWeek = useResetRecoilState(weekState)
const resetMonth = useResetRecoilState(monthState)
const resetPeriod = useResetRecoilState(periodState)
React.useEffect(() => {
setCronError(cronError)
}, [cronError])
React.useEffect(() => {
setPeriodIndex(getPeriodIndex(period))
}, [period])
React.useEffect(() => {
setCron(cronExpInput)
}, [cronExpInput])
React.useEffect(() => {
if (isAdmin) {
setIsAdmin(isAdmin)
} else {
setIsAdmin(false)
}
}, [isAdmin])
React.useEffect(() => {
setCronExpInput(cron)
return () => {
setCronExp('0 0 * * 1-5')
resetCronExpInput()
resetMinute()
resetHour()
resetDayOfMonth()
resetDayOfWeek()
resetMonth()
resetPeriod()
}
}, [])
React.useEffect(() => {
if (customLocale) {
setResolvedLocale(customLocale)
} else if (locale) {
setResolvedLocale(supportedLanguages[locale])
} else {
setResolvedLocale(supportedLanguages['en'])
}
}, [locale, customLocale])
return (
<>
<Box display='flex' flexDirection='column' className={classes.box}>
<Period />
{periodIndex > 3 && <Month />}
{periodIndex > 2 && <DayOfMonth />}
{periodIndex > 1 && <Week />}
{periodIndex > 0 && <Hour />}
<Minute />
<CronExp />
<CronReader />
</Box>
</>
)
}