66import { useCallback , useEffect , useRef , useState } from "react"
77
88// 3rd Party Imports
9- import { useLocalStorage , useSessionStorage } from "@mantine/hooks"
9+ import {
10+ useDisclosure ,
11+ useLocalStorage ,
12+ useSessionStorage ,
13+ } from "@mantine/hooks"
1014import { ResizableBox } from "react-resizable"
1115import { v4 as uuidv4 } from "uuid"
1216
1317// Custom component and helpers
14- import { Button , Divider , FileButton , Tabs , Tooltip } from "@mantine/core"
18+ import {
19+ Button ,
20+ Divider ,
21+ FileButton ,
22+ Modal ,
23+ Progress ,
24+ Tabs ,
25+ Tooltip ,
26+ } from "@mantine/core"
1527import { IconInfoCircle } from "@tabler/icons-react"
1628import Layout from "./components/layout"
1729import MissionItemsTable from "./components/missions/missionItemsTable"
@@ -71,6 +83,15 @@ export default function Missions() {
7183
7284 const newMissionItemAltitude = 30 // TODO: Make this configurable
7385
86+ const [
87+ missionProgressModalOpened ,
88+ { open : openMissionProgressModal , close : closeMissionProgressModal } ,
89+ ] = useDisclosure ( false )
90+ const [ missionProgressModalTitle , setMissionProgressModalTitle ] = useState (
91+ "Mission progress update" ,
92+ )
93+ const [ missionProgressModalData , setMissionProgressModalData ] = useState ( { } )
94+
7495 // Heartbeat data
7596 const [ heartbeatData , setHeartbeatData ] = useState ( { system_status : 0 } )
7697
@@ -126,6 +147,8 @@ export default function Missions() {
126147 } )
127148
128149 socket . on ( "current_mission" , ( data ) => {
150+ closeMissionProgressModal ( )
151+
129152 if ( ! data . success ) {
130153 showErrorNotification ( data . message )
131154 return
@@ -152,6 +175,8 @@ export default function Missions() {
152175 } )
153176
154177 socket . on ( "write_mission_result" , ( data ) => {
178+ closeMissionProgressModal ( )
179+
155180 if ( data . success ) {
156181 showSuccessNotification ( data . message )
157182 } else {
@@ -194,6 +219,10 @@ export default function Missions() {
194219 }
195220 } )
196221
222+ socket . on ( "current_mission_progress" , ( data ) => {
223+ setMissionProgressModalData ( data )
224+ } )
225+
197226 return ( ) => {
198227 socket . off ( "incoming_msg" )
199228 socket . off ( "home_position_result" )
@@ -202,6 +231,7 @@ export default function Missions() {
202231 socket . off ( "write_mission_result" )
203232 socket . off ( "import_mission_result" )
204233 socket . off ( "export_mission_result" )
234+ socket . off ( "current_mission_progress" )
205235 }
206236 } , [ connected ] )
207237
@@ -211,6 +241,13 @@ export default function Missions() {
211241 }
212242 } , [ importFile ] )
213243
244+ function resetMissionProgressModalData ( ) {
245+ setMissionProgressModalData ( {
246+ message : "" ,
247+ progress : null ,
248+ } )
249+ }
250+
214251 function isGlobalFrameHomeCommand ( waypoint ) {
215252 const globalFrameValue = parseInt (
216253 Object . keys ( MAV_FRAME_LIST ) . find (
@@ -414,6 +451,9 @@ export default function Missions() {
414451
415452 function readMissionFromDrone ( ) {
416453 socket . emit ( "get_current_mission" , { type : activeTab } )
454+ setMissionProgressModalTitle ( `Reading ${ activeTab } from drone` )
455+ resetMissionProgressModalData ( )
456+ openMissionProgressModal ( )
417457 }
418458
419459 function writeMissionToDrone ( ) {
@@ -427,6 +467,9 @@ export default function Missions() {
427467 } else if ( activeTab === "rally" ) {
428468 socket . emit ( "write_current_mission" , { type : "rally" , items : rallyItems } )
429469 }
470+ setMissionProgressModalTitle ( `Writing ${ activeTab } to drone` )
471+ resetMissionProgressModalData ( )
472+ openMissionProgressModal ( )
430473 }
431474
432475 function importMissionFromFile ( filePath ) {
@@ -548,6 +591,40 @@ export default function Missions() {
548591
549592 return (
550593 < Layout currentPage = "missions" >
594+ < Modal
595+ opened = { missionProgressModalOpened }
596+ onClose = { closeMissionProgressModal }
597+ title = { missionProgressModalTitle }
598+ closeOnClickOutside = { false }
599+ closeOnEscape = { false }
600+ withCloseButton = { false }
601+ centered
602+ overlayProps = { {
603+ backgroundOpacity : 0.55 ,
604+ blur : 3 ,
605+ } }
606+ >
607+ < div className = "flex flex-col items-center justify-center mt-4" >
608+ { missionProgressModalData . message && (
609+ < p className = "text-center mb-2" >
610+ { missionProgressModalData . message }
611+ </ p >
612+ ) }
613+
614+ { ( missionProgressModalData . progress !== null ||
615+ missionProgressModalData !== undefined ) && (
616+ < Progress
617+ color = "lime"
618+ animated
619+ size = "lg"
620+ transitionDuration = { 300 }
621+ value = { missionProgressModalData . progress * 100 }
622+ className = "w-full mx-auto my-auto"
623+ />
624+ ) }
625+ </ div >
626+ </ Modal >
627+
551628 { /* Banner to let people know that things are still under development */ }
552629 < div className = "bg-falconred-700 text-white text-center" >
553630 Missions is still under development so some features are still missing.
0 commit comments