Reorganize React project structure.

Whatever I was doing was getting out of control :)
This commit is contained in:
Dan Albert 2022-03-01 00:48:08 -08:00
parent 406a64ae3f
commit 6ff9208d46
19 changed files with 67 additions and 66 deletions

View File

@ -1,12 +1,12 @@
import "./App.css";
import { ControlPoint } from "./game/controlpoint";
import { Flight } from "./game/flight";
import { ControlPoint } from "./api/controlpoint";
import { Flight } from "./api/flight";
import { LatLng } from "leaflet";
import { LiberationMap } from "./map/liberationmap/LiberationMap";
import LiberationMap from "./components/liberationmap";
import axios from "axios";
import { registerFlight } from "./game/ato/atoSlice";
import { setControlPoints } from "./game/theater/theaterSlice";
import { registerFlight } from "./api/flightsSlice";
import { setControlPoints } from "./api/controlPointsSlice";
import { useAppDispatch } from "./app/hooks";
import { useEffect } from "react";

View File

@ -0,0 +1,22 @@
import { PayloadAction, createSlice } from "@reduxjs/toolkit";
import { ControlPoint } from "./controlpoint";
import { RootState } from "../app/store";
const initialState: ControlPoint[] = [];
export const controlPointsSlice = createSlice({
name: "controlPoints",
initialState,
reducers: {
setControlPoints: (state, action: PayloadAction<ControlPoint[]>) => {
state = action.payload;
},
},
});
export const { setControlPoints } = controlPointsSlice.actions;
export const selectControlPoints = (state: RootState) => state.controlPoints;
export default controlPointsSlice.reducer;

View File

@ -1,20 +1,20 @@
import { PayloadAction, createSlice } from "@reduxjs/toolkit";
import { Flight } from "../flight";
import { RootState } from "../../app/store";
import { Flight } from "./flight";
import { RootState } from "../app/store";
interface AtoState {
interface FlightsState {
blue: { [id: string]: Flight };
red: { [id: string]: Flight };
}
const initialState: AtoState = {
const initialState: FlightsState = {
blue: {},
red: {},
};
export const atoSlice = createSlice({
name: "ato",
export const flightsSlice = createSlice({
name: "flights",
initialState,
reducers: {
clearFlights: (state) => {
@ -23,11 +23,11 @@ export const atoSlice = createSlice({
},
registerFlight: (state, action: PayloadAction<Flight>) => {
const flight = action.payload;
const ato = flight.blue ? state.blue : state.red;
if (flight.id in ato) {
const coalitionFlights = flight.blue ? state.blue : state.red;
if (flight.id in coalitionFlights) {
console.log(`Overriding flight with ID: ${flight.id}`);
}
ato[flight.id] = flight;
coalitionFlights[flight.id] = flight;
},
unregisterFlight: (state, action: PayloadAction<string>) => {
const id = action.payload;
@ -46,8 +46,8 @@ export const atoSlice = createSlice({
});
export const { clearFlights, registerFlight, unregisterFlight } =
atoSlice.actions;
flightsSlice.actions;
export const selectAtos = (state: RootState) => state.atos;
export const selectFlights = (state: RootState) => state.flights;
export default atoSlice.reducer;
export default flightsSlice.reducer;

View File

@ -1,12 +1,12 @@
import { Action, ThunkAction, configureStore } from "@reduxjs/toolkit";
import atoReducer from "../game/ato/atoSlice";
import theaterReducer from "../game/theater/theaterSlice";
import controlPointsReducer from "../api/controlPointsSlice";
import flightsReducer from "../api/flightsSlice";
export const store = configureStore({
reducer: {
atos: atoReducer,
theater: theaterReducer,
flights: flightsReducer,
controlPoints: controlPointsReducer,
},
});

View File

@ -1,6 +1,7 @@
import { Icon, Point } from "leaflet";
import { Marker, Popup } from "react-leaflet";
import { ControlPoint as ControlPointModel } from "../../game/controlpoint";
import { ControlPoint as ControlPointModel } from "../../api/controlpoint";
import { Symbol as MilSymbol } from "milsymbol";
function iconForControlPoint(cp: ControlPointModel) {
@ -19,7 +20,7 @@ interface ControlPointProps {
controlPoint: ControlPointModel;
}
export function ControlPoint(props: ControlPointProps) {
export default function ControlPoint(props: ControlPointProps) {
return (
<Marker
position={props.controlPoint.position}

View File

@ -0,0 +1 @@
export { default } from "./ControlPoint";

View File

@ -1,9 +1,9 @@
import ControlPoint from "../controlpoints";
import { LayerGroup } from "react-leaflet";
import { selectControlPoints } from "../../api/controlPointsSlice";
import { useAppSelector } from "../../app/hooks";
import { selectControlPoints } from "../../game/theater/theaterSlice";
import { ControlPoint } from "../controlpoint/ControlPoint";
export function ControlPointsLayer() {
export default function ControlPointsLayer() {
const controlPoints = useAppSelector(selectControlPoints);
return (
<LayerGroup>

View File

@ -0,0 +1 @@
export { default } from "./ControlPointsLayer";

View File

@ -1,4 +1,4 @@
import { Flight } from "../../game/flight";
import { Flight } from "../../api/flight";
import { Polyline } from "react-leaflet";
const BLUE_PATH = "#0084ff";
@ -9,7 +9,7 @@ interface FlightPlanProps {
selected: boolean;
}
export function FlightPlanPath(props: FlightPlanProps) {
function FlightPlanPath(props: FlightPlanProps) {
const color = props.flight.blue ? BLUE_PATH : RED_PATH;
const waypoints = props.flight.waypoints;
if (waypoints == null) {
@ -24,7 +24,7 @@ export function FlightPlanPath(props: FlightPlanProps) {
);
}
export function FlightPlan(props: FlightPlanProps) {
export default function FlightPlan(props: FlightPlanProps) {
return (
<>
<FlightPlanPath {...props} />

View File

@ -0,0 +1 @@
export { default } from "./FlightPlan";

View File

@ -1,14 +1,14 @@
import { FlightPlan } from "../flightplan/FlightPlan";
import FlightPlan from "../flightplan";
import { LayerGroup } from "react-leaflet";
import { selectAtos } from "../../game/ato/atoSlice";
import { selectFlights } from "../../api/flightsSlice";
import { useAppSelector } from "../../app/hooks";
interface FlightPlansLayerProps {
blue: boolean;
}
export function FlightPlansLayer(props: FlightPlansLayerProps) {
const atos = useAppSelector(selectAtos);
export default function FlightPlansLayer(props: FlightPlansLayerProps) {
const atos = useAppSelector(selectFlights);
const flights = props.blue ? atos.blue : atos.red;
return (
<LayerGroup>

View File

@ -0,0 +1 @@
export { default } from "./FlightPlansLayer";

View File

@ -1,15 +1,16 @@
import { MapContainer } from "react-leaflet";
import { BasemapLayer } from "react-esri-leaflet";
import { ControlPointsLayer } from "../controlpointslayer/ControlPointsLayer";
import "./LiberationMap.css";
import { BasemapLayer } from "react-esri-leaflet";
import ControlPointsLayer from "../controlpointslayer";
import FlightPlansLayer from "../flightplanslayer";
import { LatLng } from "leaflet";
import { FlightPlansLayer } from "../flightplanslayer/FlightPlansLayer";
import { MapContainer } from "react-leaflet";
interface GameProps {
mapCenter: LatLng;
}
export function LiberationMap(props: GameProps) {
export default function LiberationMap(props: GameProps) {
return (
<MapContainer zoom={8} center={props.mapCenter}>
<BasemapLayer name="ImageryClarity" />

View File

@ -0,0 +1 @@
export { default } from "./LiberationMap";

View File

@ -1,28 +0,0 @@
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { RootState } from "../../app/store";
import { ControlPoint } from "../controlpoint";
interface TheaterState {
controlPoints: ControlPoint[];
}
const initialState: TheaterState = {
controlPoints: [],
};
export const theaterSlice = createSlice({
name: "theater",
initialState,
reducers: {
setControlPoints: (state, action: PayloadAction<ControlPoint[]>) => {
state.controlPoints = action.payload;
},
},
});
export const { setControlPoints } = theaterSlice.actions;
export const selectControlPoints = (state: RootState) =>
state.theater.controlPoints;
export default theaterSlice.reducer;