1- import React from 'react' ;
2- import { Task } from '@/api/server/schedules/getServerSchedules' ;
1+ import React , { useState } from 'react' ;
2+ import { Schedule , Task } from '@/api/server/schedules/getServerSchedules' ;
33import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' ;
44import { faTrashAlt } from '@fortawesome/free-solid-svg-icons/faTrashAlt' ;
55import { faCode } from '@fortawesome/free-solid-svg-icons/faCode' ;
66import { faToggleOn } from '@fortawesome/free-solid-svg-icons/faToggleOn' ;
7+ import ConfirmTaskDeletionModal from '@/components/server/schedules/ConfirmTaskDeletionModal' ;
8+ import { ServerContext } from '@/state/server' ;
9+ import { Actions , useStoreActions } from 'easy-peasy' ;
10+ import { ApplicationStore } from '@/state' ;
11+ import deleteScheduleTask from '@/api/server/schedules/deleteScheduleTask' ;
12+ import { httpErrorToHuman } from '@/api/http' ;
13+ import SpinnerOverlay from '@/components/elements/SpinnerOverlay' ;
714
815interface Props {
16+ schedule : number ;
917 task : Task ;
18+ onTaskRemoved : ( ) => void ;
1019}
1120
12- export default ( { task } : Props ) => {
21+ export default ( { schedule, task, onTaskRemoved } : Props ) => {
22+ const [ visible , setVisible ] = useState ( false ) ;
23+ const [ isLoading , setIsLoading ] = useState ( false ) ;
24+ const uuid = ServerContext . useStoreState ( state => state . server . data ! . uuid ) ;
25+ const { clearFlashes, addError } = useStoreActions ( ( actions : Actions < ApplicationStore > ) => actions . flashes ) ;
26+
27+ const onConfirmDeletion = ( ) => {
28+ setIsLoading ( true ) ;
29+ clearFlashes ( 'schedules' ) ;
30+ deleteScheduleTask ( uuid , schedule , task . id )
31+ . then ( ( ) => onTaskRemoved ( ) )
32+ . catch ( error => {
33+ console . error ( error ) ;
34+ setIsLoading ( false ) ;
35+ addError ( { message : httpErrorToHuman ( error ) , key : 'schedules' } ) ;
36+ } ) ;
37+ } ;
38+
1339 return (
1440 < div className = { 'flex items-center' } >
41+ < SpinnerOverlay visible = { isLoading } fixed = { true } size = { 'large' } />
42+ < ConfirmTaskDeletionModal
43+ visible = { visible }
44+ onDismissed = { ( ) => setVisible ( false ) }
45+ onConfirmed = { ( ) => onConfirmDeletion ( ) }
46+ />
1547 < FontAwesomeIcon icon = { task . action === 'command' ? faCode : faToggleOn } className = { 'text-lg text-white' } />
1648 < div className = { 'flex-1' } >
1749 < p className = { 'ml-6 text-neutral-300 mb-2 uppercase text-xs' } >
@@ -34,7 +66,9 @@ export default ({ task }: Props) => {
3466 < div >
3567 < a
3668 href = { '#' }
69+ aria-label = { 'Delete scheduled task' }
3770 className = { 'text-sm p-2 text-neutral-500 hover:text-red-600 transition-color duration-150' }
71+ onClick = { ( ) => setVisible ( true ) }
3872 >
3973 < FontAwesomeIcon icon = { faTrashAlt } />
4074 </ a >
0 commit comments