1- import React , { useEffect , useState } from 'react' ;
1+ import React , { useMemo , useState } from 'react' ;
22import getServerSchedules , { Schedule } from '@/api/server/schedules/getServerSchedules' ;
33import { ServerContext } from '@/state/server' ;
44import Spinner from '@/components/elements/Spinner' ;
5- import { Link } from 'react-router-dom' ;
6- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' ;
7- import { faCalendarAlt } from '@fortawesome/free-solid-svg-icons/faCalendarAlt' ;
8- import classNames from 'classnames' ;
9- import format from 'date-fns/format' ;
5+ import { Link , RouteComponentProps } from 'react-router-dom' ;
106import FlashMessageRender from '@/components/FlashMessageRender' ;
7+ import ScheduleRow from '@/components/server/schedules/ScheduleRow' ;
8+ import { httpErrorToHuman } from '@/api/http' ;
119import { Actions , useStoreActions } from 'easy-peasy' ;
1210import { ApplicationStore } from '@/state' ;
13- import { httpErrorToHuman } from '@/api/http' ;
11+ import EditScheduleModal from '@/components/server/schedules/EditScheduleModal' ;
12+
13+ interface Params {
14+ schedule ?: string ;
15+ }
1416
15- export default ( ) => {
17+ export default ( { history , match , location : { hash } } : RouteComponentProps < Params > ) => {
1618 const { id, uuid } = ServerContext . useStoreState ( state => state . server . data ! ) ;
1719 const [ schedules , setSchedules ] = useState < Schedule [ ] | null > ( null ) ;
20+ const { clearFlashes, addError } = useStoreActions ( ( actions : Actions < ApplicationStore > ) => actions . flashes ) ;
1821
19- const { addError, clearFlashes } = useStoreActions ( ( actions : Actions < ApplicationStore > ) => actions . flashes ) ;
20-
21- useEffect ( ( ) => {
22+ useMemo ( ( ) => {
2223 clearFlashes ( 'schedules' ) ;
2324 getServerSchedules ( uuid )
2425 . then ( schedules => setSchedules ( schedules ) )
2526 . catch ( error => {
2627 addError ( { message : httpErrorToHuman ( error ) , key : 'schedules' } ) ;
2728 console . error ( error ) ;
2829 } ) ;
29- } , [ uuid , setSchedules ] ) ;
30+ } , [ setSchedules ] ) ;
31+
32+ const matched = ( schedules || [ ] ) . find ( schedule => schedule . id === Number ( hash . match ( / \d + $ / ) || 0 ) ) ;
3033
3134 return (
3235 < div className = { 'my-10 mb-6' } >
@@ -35,49 +38,23 @@ export default () => {
3538 < Spinner size = { 'large' } centered = { true } />
3639 :
3740 schedules . map ( schedule => (
38- < Link key = { schedule . id } to = { `/servers/${ id } /schedules/${ schedule . id } ` } className = { 'grey-row-box' } >
39- < div className = { 'icon' } >
40- < FontAwesomeIcon icon = { faCalendarAlt } fixedWidth = { true } />
41- </ div >
42- < div className = { 'flex-1 ml-4' } >
43- < p > { schedule . name } </ p >
44- < p className = { 'text-xs text-neutral-400' } >
45- Last run at: { schedule . lastRunAt ? format ( schedule . lastRunAt , 'MMM Do [at] h:mma' ) : 'never' }
46- </ p >
47- </ div >
48- < div className = { 'flex items-center mx-8' } >
49- < div >
50- < p className = { 'font-medium text-center' } > { schedule . cron . minute } </ p >
51- < p className = { 'text-2xs text-neutral-500 uppercase' } > Minute</ p >
52- </ div >
53- < div className = { 'ml-4' } >
54- < p className = { 'font-medium text-center' } > { schedule . cron . hour } </ p >
55- < p className = { 'text-2xs text-neutral-500 uppercase' } > Hour</ p >
56- </ div >
57- < div className = { 'ml-4' } >
58- < p className = { 'font-medium text-center' } > { schedule . cron . dayOfMonth } </ p >
59- < p className = { 'text-2xs text-neutral-500 uppercase' } > Day (Month)</ p >
60- </ div >
61- < div className = { 'ml-4' } >
62- < p className = { 'font-medium text-center' } > *</ p >
63- < p className = { 'text-2xs text-neutral-500 uppercase' } > Month</ p >
64- </ div >
65- < div className = { 'ml-4' } >
66- < p className = { 'font-medium text-center' } > { schedule . cron . dayOfWeek } </ p >
67- < p className = { 'text-2xs text-neutral-500 uppercase' } > Day (Week)</ p >
68- </ div >
69- </ div >
70- < div >
71- < p className = { classNames ( 'py-1 px-3 rounded text-xs uppercase' , {
72- 'bg-green-600' : schedule . isActive ,
73- 'bg-neutral-400' : ! schedule . isActive ,
74- } ) } >
75- { schedule . isActive ? 'Active' : 'Inactive' }
76- </ p >
77- </ div >
41+ < Link
42+ key = { schedule . id }
43+ to = { `/server/${ id } /schedules/#/schedule/${ schedule . id } ` }
44+ className = { 'grey-row-box' }
45+ >
46+ < ScheduleRow schedule = { schedule } />
7847 </ Link >
7948 ) )
8049 }
50+ { matched &&
51+ < EditScheduleModal
52+ schedule = { matched }
53+ visible = { true }
54+ appear = { true }
55+ onDismissed = { ( ) => history . push ( match . url ) }
56+ />
57+ }
8158 </ div >
8259 ) ;
8360} ;
0 commit comments