Skip to content

Commit 4e7d39c

Browse files
authored
Convert navbar to redux (#627)
* Moved over some initial things and com ports * Finished conversions * kept things persistent * Changed to useSelector for connected everywhere now :D * formatted * AI suggestions * fixed wireless * null vs undefined :DDD * Replaced session storage * All use session storages converted over * Revert "Replaced session storage" This reverts commit ade054e. * Revert "All use session storages converted over" This reverts commit 7798b80. * Actually fixed that mantine issue * Added todo
1 parent 5511e89 commit 4e7d39c

9 files changed

Lines changed: 247 additions & 282 deletions

File tree

gcs/src/components/navbar.jsx

Lines changed: 99 additions & 199 deletions
Large diffs are not rendered by default.

gcs/src/config.jsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@ import { useEffect, useState } from "react"
99

1010
// 3rd Party Imports
1111
import { Tabs } from "@mantine/core"
12-
import { useSessionStorage } from "@mantine/hooks"
13-
14-
// Styling imports
15-
import resolveConfig from "tailwindcss/resolveConfig"
16-
import tailwindConfig from "../tailwind.config"
1712

1813
// Custom component and helpers
1914
import FlightModes from "./components/config/flightModes"
@@ -28,13 +23,18 @@ import {
2823
} from "./helpers/notification"
2924
import { socket } from "./helpers/socket"
3025

26+
// Redux
27+
import { useSelector } from "react-redux"
28+
import { selectConnectedToDrone } from "./redux/slices/droneConnectionSlice"
29+
30+
// Styling imports
31+
import resolveConfig from "tailwindcss/resolveConfig"
32+
import tailwindConfig from "../tailwind.config"
33+
3134
const tailwindColors = resolveConfig(tailwindConfig).theme.colors
3235

3336
export default function Config() {
34-
const [connected] = useSessionStorage({
35-
key: "connectedToDrone",
36-
defaultValue: false,
37-
})
37+
const connected = useSelector(selectConnectedToDrone)
3838

3939
// States in the frontend
4040
const [activeTab, setActiveTab] = useState(null)

gcs/src/graphs.jsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@
88
import { useEffect, useRef } from "react"
99

1010
// 3rd Party Imports
11-
import { useLocalStorage, usePrevious, useSessionStorage } from "@mantine/hooks"
12-
13-
// Styling imports
14-
import resolveConfig from "tailwindcss/resolveConfig"
15-
import tailwindConfig from "../tailwind.config.js"
11+
import { useLocalStorage, usePrevious } from "@mantine/hooks"
1612

1713
// Custom components and helpers
1814
import GraphPanel from "./components/graphs/graphPanel.jsx"
@@ -23,6 +19,13 @@ import { dataFormatters } from "./helpers/dataFormatters.js"
2319
import { graphOptions } from "./helpers/realTimeGraphOptions.js"
2420
import { socket } from "./helpers/socket"
2521

22+
// Redux
23+
import { useSelector } from "react-redux"
24+
import { selectConnectedToDrone } from "./redux/slices/droneConnectionSlice.js"
25+
26+
// Styling imports
27+
import resolveConfig from "tailwindcss/resolveConfig"
28+
import tailwindConfig from "../tailwind.config.js"
2629
const tailwindColors = resolveConfig(tailwindConfig).theme.colors
2730

2831
const graphLabelColors = {
@@ -40,10 +43,7 @@ const graphColors = {
4043
}
4144

4245
export default function Graphs() {
43-
const [connected] = useSessionStorage({
44-
key: "connectedToDrone",
45-
defaultValue: false,
46-
})
46+
const connected = useSelector(selectConnectedToDrone)
4747

4848
const [selectValues, setSelectValues] = useLocalStorage({
4949
key: "graphSelectedValues",

gcs/src/missions.jsx

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@
66
import { useCallback, useEffect, useRef, useState } from "react"
77

88
// 3rd Party Imports
9-
import {
10-
useDisclosure,
11-
useLocalStorage,
12-
useSessionStorage,
13-
} from "@mantine/hooks"
9+
import { useDisclosure, useSessionStorage } from "@mantine/hooks"
1410
import { ResizableBox } from "react-resizable"
1511
import { v4 as uuidv4 } from "uuid"
1612

@@ -46,6 +42,11 @@ import {
4642
} from "./helpers/notification"
4743
import { socket } from "./helpers/socket"
4844

45+
// Redux
46+
import { useSelector } from "react-redux"
47+
import { selectConnectedToDrone } from "./redux/slices/droneConnectionSlice"
48+
import { selectAircraftType } from "./redux/slices/droneInfoSlice"
49+
4950
// Tailwind styling
5051
import resolveConfig from "tailwindcss/resolveConfig"
5152
import tailwindConfig from "../tailwind.config"
@@ -70,14 +71,9 @@ function UnwrittenChangesWarning({ unwrittenChanges }) {
7071
}
7172

7273
export default function Missions() {
73-
// Local Storage
74-
const [connected] = useSessionStorage({
75-
key: "connectedToDrone",
76-
defaultValue: false,
77-
})
78-
const [aircraftType] = useLocalStorage({
79-
key: "aircraftType",
80-
})
74+
// Redux
75+
const connected = useSelector(selectConnectedToDrone)
76+
const aircraftType = useSelector(selectAircraftType)
8177

8278
const [activeTab, setActiveTab] = useState("mission")
8379

gcs/src/params.jsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
useDebouncedValue,
1414
useDisclosure,
1515
useListState,
16-
useSessionStorage,
1716
useToggle,
1817
} from "@mantine/hooks"
1918
import AutoSizer from "react-virtualized-auto-sizer"
@@ -31,11 +30,12 @@ import {
3130
} from "./helpers/notification.js"
3231
import { socket } from "./helpers/socket.js"
3332

33+
// Redux
34+
import { useSelector } from "react-redux"
35+
import { selectConnectedToDrone } from "./redux/slices/droneConnectionSlice.js"
36+
3437
export default function Params() {
35-
const [connected] = useSessionStorage({
36-
key: "connectedToDrone",
37-
defaultValue: true,
38-
})
38+
const connected = useSelector(selectConnectedToDrone)
3939

4040
// Parameter states
4141
const [params, paramsHandler] = useListState([])

gcs/src/redux/middleware/socketMiddleware.js

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99

1010
// drone actions
1111
import {
12+
emitGetComPorts,
1213
emitGetHomePosition,
1314
emitIsConnectedToDrone,
1415
emitSetState,
@@ -131,6 +132,7 @@ const socketMiddleware = (store) => {
131132
// SINCE IT'S MIDDLEWARE, OTHER FUNCTIONS CAN ALSO BE CALLED
132133
console.log(`Connected to socket from redux, ${socket.socket.id}`)
133134
store.dispatch(socketConnected())
135+
store.dispatch(emitIsConnectedToDrone())
134136
})
135137

136138
socket.socket.on(SocketEvents.Disconnect, () => {
@@ -144,18 +146,6 @@ const socketMiddleware = (store) => {
144146
====================
145147
*/
146148

147-
socket.socket.on("is_connected_to_drone", (msg) => {
148-
if (msg) {
149-
store.dispatch(setConnected(true))
150-
} else {
151-
store.dispatch(setConnected(false))
152-
store.dispatch(setConnecting(false))
153-
// Get com ports?
154-
// check if we're connected
155-
// emit get_com_ports
156-
}
157-
})
158-
159149
socket.socket.on("connected", () => {
160150
store.dispatch(setConnected(true))
161151
})
@@ -165,6 +155,16 @@ const socketMiddleware = (store) => {
165155
store.dispatch(setConnecting(false))
166156
})
167157

158+
socket.socket.on("is_connected_to_drone", (msg) => {
159+
if (msg) {
160+
store.dispatch(setConnected(true))
161+
} else {
162+
store.dispatch(setConnected(false))
163+
store.dispatch(setConnecting(false))
164+
store.dispatch(emitGetComPorts())
165+
}
166+
})
167+
168168
// Fetch com ports and list them
169169
socket.socket.on("list_com_ports", (msg) => {
170170
store.dispatch(setFetchingComPorts(false))
@@ -194,6 +194,11 @@ const socketMiddleware = (store) => {
194194
store.dispatch(setConnected(false))
195195
})
196196

197+
// Setting connection status
198+
socket.socket.on("drone_connect_status", (msg) => {
199+
store.dispatch(setConnectionStatus(msg.message))
200+
})
201+
197202
// Flags that the drone is connected
198203
socket.socket.on("connected_to_drone", (msg) => {
199204
store.dispatch(setDroneAircraftType(msg.aircraft_type)) // There are two aircraftTypes, make sure to not use FLA one haha :D
@@ -208,14 +213,9 @@ const socketMiddleware = (store) => {
208213
store.dispatch(setConnecting(false))
209214
store.dispatch(setConnectionModal(false))
210215

211-
store.dispatch(emitSetState({ state: "dashboard" })) // Potential issue with state?
216+
store.dispatch(emitSetState({ state: "dashboard" }))
212217
store.dispatch(emitGetHomePosition())
213218
})
214-
215-
// Setting connection status
216-
socket.socket.on("drone_connect_status", (msg) => {
217-
store.dispatch(setConnectionStatus(msg.message))
218-
})
219219
}
220220
}
221221

gcs/src/redux/slices/droneConnectionSlice.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,19 @@ const droneConnectionSlice = createSlice({
9797
state.connection_status = action.payload
9898
}
9999
},
100+
setWireless: (state, action) => {
101+
if (action.payload !== state.wireless) {
102+
state.wireless = action.payload
103+
}
104+
},
100105

101106
// Emits
102107
emitIsConnectedToDrone: () => {
103108
socket.emit("is_connected_to_drone")
104109
},
105-
emitGetComPorts: () => {
110+
emitGetComPorts: (state) => {
106111
socket.emit("get_com_ports")
112+
state.fetching_com_ports = true
107113
},
108114
emitDisconnectFromDrone: () => {
109115
console.log("Disconnecting from drone")
@@ -138,6 +144,7 @@ const droneConnectionSlice = createSlice({
138144
selectPort: (state) => state.port,
139145
selectConnectionModal: (state) => state.connection_modal,
140146
selectConnectionStatus: (state) => state.connection_status,
147+
selectWireless: (state) => state.wireless,
141148
},
142149
})
143150

@@ -155,6 +162,7 @@ export const {
155162
setPort,
156163
setConnectionModal,
157164
setConnectionStatus,
165+
setWireless,
158166

159167
// Emitters
160168
emitIsConnectedToDrone,
@@ -178,6 +186,7 @@ export const {
178186
selectPort,
179187
selectConnectionModal,
180188
selectConnectionStatus,
189+
selectWireless,
181190
} = droneConnectionSlice.selectors
182191

183192
export default droneConnectionSlice

gcs/src/redux/store.js

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@ import socketSlice from "./slices/socketSlice"
44
import droneInfoSlice from "./slices/droneInfoSlice"
55

66
import socketMiddleware from "./middleware/socketMiddleware"
7-
import droneConnectionSlice from "./slices/droneConnectionSlice"
7+
import droneConnectionSlice, {
8+
setBaudrate,
9+
setConnectionType,
10+
setIp,
11+
setNetworkType,
12+
setPort,
13+
setWireless,
14+
} from "./slices/droneConnectionSlice"
815
import missionInfoSlice from "./slices/missionSlice"
916
import statusTextSlice from "./slices/statusTextSlice"
1017
import notificationSlice from "./slices/notificationSlice"
@@ -19,6 +26,11 @@ const rootReducer = combineSlices(
1926
notificationSlice,
2027
)
2128

29+
// Get the persisted state, we only want to take a couple of things from here.
30+
const persistedState = localStorage.getItem("reduxState")
31+
? JSON.parse(localStorage.getItem("reduxState"))
32+
: {}
33+
2234
export const store = configureStore({
2335
reducer: rootReducer,
2436
middleware: (getDefaultMiddleware) => {
@@ -28,3 +40,49 @@ export const store = configureStore({
2840
}).concat([socketMiddleware])
2941
},
3042
})
43+
44+
let droneConnection = persistedState.droneConnection
45+
if (droneConnection !== undefined) {
46+
if (droneConnection.wireless !== undefined) {
47+
store.dispatch(setWireless(droneConnection.wireless))
48+
}
49+
if (droneConnection.baudrate !== undefined) {
50+
store.dispatch(setBaudrate(droneConnection.baudrate))
51+
}
52+
if (droneConnection.connection_type !== undefined) {
53+
store.dispatch(setConnectionType(droneConnection.connection_type))
54+
}
55+
if (droneConnection.network_type !== undefined) {
56+
store.dispatch(setNetworkType(droneConnection.network_type))
57+
}
58+
if (droneConnection.ip !== undefined) {
59+
store.dispatch(setIp(droneConnection.ip))
60+
}
61+
if (droneConnection.port !== undefined) {
62+
store.dispatch(setPort(droneConnection.port))
63+
}
64+
}
65+
66+
// Update states when a new message comes in, probably inefficient
67+
// TODO: In the future we should check to see if the variables have changed before updating
68+
store.subscribe(() => {
69+
let store_mut = store.getState()
70+
let local_storage = window.localStorage
71+
let session_storage = window.sessionStorage
72+
local_storage.setItem("reduxState", JSON.stringify(store.getState()))
73+
74+
// Drone connection
75+
local_storage.setItem(
76+
"wirelessConnection",
77+
store_mut.droneConnection.wireless,
78+
)
79+
local_storage.setItem("baudrate", store_mut.droneConnection.baudrate)
80+
local_storage.setItem(
81+
"connectionType",
82+
store_mut.droneConnection.connection_type,
83+
)
84+
local_storage.setItem("networkType", store_mut.droneConnection.network_type)
85+
local_storage.setItem("ip", store_mut.droneConnection.ip)
86+
local_storage.setItem("port", store_mut.droneConnection.port)
87+
session_storage.setItem("connectedToDrone", store_mut.droneConnection.connected)
88+
})

0 commit comments

Comments
 (0)