You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.6 KiB
103 lines
2.6 KiB
import type { Types } from '@meshtastic/meshtasticjs';
|
|
import type { PayloadAction } from '@reduxjs/toolkit';
|
|
import { createSlice } from '@reduxjs/toolkit';
|
|
|
|
export type currentPageName = 'messages' | 'settings';
|
|
|
|
export enum connType {
|
|
HTTP,
|
|
BLE,
|
|
SERIAL,
|
|
}
|
|
|
|
interface AppState {
|
|
mobileNavOpen: boolean;
|
|
navCollapsed: boolean;
|
|
connectionModalOpen: boolean;
|
|
darkMode: boolean;
|
|
currentPage: currentPageName;
|
|
connType: connType;
|
|
connectionParams: {
|
|
BLE: Types.BLEConnectionParameters;
|
|
HTTP: Types.HTTPConnectionParameters;
|
|
SERIAL: Types.SerialConnectionParameters;
|
|
};
|
|
updateAvaliable: boolean;
|
|
}
|
|
|
|
const initialState: AppState = {
|
|
mobileNavOpen: false,
|
|
navCollapsed: false,
|
|
connectionModalOpen: true,
|
|
darkMode: localStorage.getItem('darkModeDisabled') !== 'true' ?? false,
|
|
currentPage: 'messages',
|
|
connType: connType.HTTP,
|
|
connectionParams: {
|
|
BLE: {},
|
|
HTTP: {
|
|
address:
|
|
localStorage.getItem('connectionUrl') ?? import.meta.env.PROD
|
|
? window.location.hostname
|
|
: (import.meta.env.VITE_PUBLIC_DEVICE_IP as string) ??
|
|
'meshtastic.local',
|
|
tls: false,
|
|
receiveBatchRequests: false,
|
|
fetchInterval: 2000,
|
|
},
|
|
SERIAL: {},
|
|
},
|
|
updateAvaliable: false,
|
|
};
|
|
|
|
export const appSlice = createSlice({
|
|
name: 'app',
|
|
initialState,
|
|
reducers: {
|
|
toggleMobileNav(state) {
|
|
state.mobileNavOpen = !state.mobileNavOpen;
|
|
},
|
|
openConnectionModal(state) {
|
|
state.connectionModalOpen = true;
|
|
},
|
|
closeConnectionModal(state) {
|
|
state.connectionModalOpen = false;
|
|
},
|
|
setDarkModeEnabled(state, action: PayloadAction<boolean>) {
|
|
localStorage.setItem('darkModeDisabled', String(!action.payload));
|
|
state.darkMode = action.payload;
|
|
},
|
|
setCurrentPage(state, action: PayloadAction<currentPageName>) {
|
|
state.currentPage = action.payload;
|
|
},
|
|
setConnType(state, action: PayloadAction<connType>) {
|
|
state.connType = action.payload;
|
|
},
|
|
setConnectionParams(
|
|
state,
|
|
action: PayloadAction<{
|
|
type: connType;
|
|
params: Types.ConnectionParameters;
|
|
}>,
|
|
) {
|
|
// @ts-ignore tmp
|
|
state.connectionParams[connType[action.payload.type]] =
|
|
action.payload.params;
|
|
},
|
|
setUpdateAvaliable(state, action: PayloadAction<boolean>) {
|
|
state.updateAvaliable = action.payload;
|
|
},
|
|
},
|
|
});
|
|
|
|
export const {
|
|
toggleMobileNav,
|
|
openConnectionModal,
|
|
closeConnectionModal,
|
|
setDarkModeEnabled,
|
|
setCurrentPage,
|
|
setConnType,
|
|
setConnectionParams,
|
|
setUpdateAvaliable,
|
|
} = appSlice.actions;
|
|
|
|
export default appSlice.reducer;
|
|
|