diff --git a/gcs/src/missions.jsx b/gcs/src/missions.jsx
index 1b6f57b3f..89284af7a 100644
--- a/gcs/src/missions.jsx
+++ b/gcs/src/missions.jsx
@@ -11,7 +11,7 @@ import { ResizableBox } from "react-resizable"
import { v4 as uuidv4 } from "uuid"
// Custom component and helpers
-import { Button, Divider, Tabs } from "@mantine/core"
+import { Button, Divider, FileButton, Tabs } from "@mantine/core"
import Layout from "./components/layout"
import MissionItemsTable from "./components/missions/missionItemsTable"
import MissionsMapSection from "./components/missions/missionsMap"
@@ -65,6 +65,8 @@ export default function Missions() {
key: "targetInfo",
defaultValue: { target_component: 0, target_system: 255 },
})
+ const [importFile, setImportFile] = useState(null)
+ const importFileResetRef = useRef(null)
const newMissionItemAltitude = 30 // TODO: Make this configurable
@@ -155,15 +157,45 @@ export default function Missions() {
}
})
+ socket.on("import_mission_result", (data) => {
+ if (data.success) {
+ if (data.mission_type === "mission") {
+ const missionItemsWithIds = []
+ for (let missionItem of data.items) {
+ missionItemsWithIds.push(addIdToItem(missionItem))
+ }
+ setMissionItems(missionItemsWithIds)
+ } else if (data.mission_type === "fence") {
+ setFenceItems(data.items)
+ } else if (data.mission_type === "rally") {
+ const rallyItemsWithIds = []
+ for (let rallyItem of data.items) {
+ rallyItemsWithIds.push(addIdToItem(rallyItem))
+ }
+ setRallyItems(rallyItemsWithIds)
+ }
+ showSuccessNotification(data.message)
+ } else {
+ showErrorNotification(data.message)
+ }
+ })
+
return () => {
socket.off("incoming_msg")
socket.off("home_position_result")
socket.off("target_info")
socket.off("current_mission")
socket.off("write_mission_result")
+ socket.off("import_mission_result")
}
}, [connected])
+ useEffect(() => {
+ if (importFile) {
+ importMissionFromFile(importFile.path)
+ }
+ }, [importFile])
+
function getFlightMode() {
if (aircraftType === 1) {
return PLANE_MODES_FLIGHT_MODE_MAP[heartbeatData.custom_mode]
@@ -290,8 +322,15 @@ export default function Missions() {
}
}
- function importMissionFromFile() {
- return
+ function importMissionFromFile(filePath) {
+ socket.emit("import_mission_from_file", {
+ type: activeTab,
+ file_path: filePath,
+ })
+
+ // Reset the import file after sending
+ setImportFile(null)
+ importFileResetRef.current?.()
}
function saveMissionToFile() {
@@ -346,14 +385,14 @@ export default function Missions() {
-
+ {(props) => }
+