From c5fd3df23525a1e25f6f87e5327a62f027cec453 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Tue, 8 Mar 2022 18:36:21 -0800 Subject: [PATCH] Fix caching behavior of flight plan data. This is far from complete but it at least covers anything related to flight plans. Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2060 --- client/openapi-config.ts | 4 +- client/src/api/_liberationApi.ts | 486 +++++++++++++++ client/src/api/liberationApi.ts | 553 +++--------------- .../waypointmarker/WaypointMarker.tsx | 25 +- 4 files changed, 574 insertions(+), 494 deletions(-) create mode 100644 client/src/api/_liberationApi.ts diff --git a/client/openapi-config.ts b/client/openapi-config.ts index 8dfd0420..96512958 100644 --- a/client/openapi-config.ts +++ b/client/openapi-config.ts @@ -4,8 +4,8 @@ const config: ConfigFile = { schemaFile: "http://[::1]:16880/openapi.json", apiFile: "./src/api/baseApi.ts", apiImport: "baseApi", - outputFile: "./src/api/liberationApi.ts", - exportName: "liberationApi", + outputFile: "./src/api/_liberationApi.ts", + exportName: "_liberationApi", hooks: true, }; diff --git a/client/src/api/_liberationApi.ts b/client/src/api/_liberationApi.ts new file mode 100644 index 00000000..58f37821 --- /dev/null +++ b/client/src/api/_liberationApi.ts @@ -0,0 +1,486 @@ +import { baseApi as api } from "./baseApi"; + +const injectedRtkApi = api.injectEndpoints({ + endpoints: (build) => ({ + listControlPoints: build.query< + ListControlPointsApiResponse, + ListControlPointsApiArg + >({ + query: () => ({ url: `/control-points/` }), + }), + getControlPointById: build.query< + GetControlPointByIdApiResponse, + GetControlPointByIdApiArg + >({ + query: (queryArg) => ({ url: `/control-points/${queryArg.cpId}` }), + }), + controlPointDestinationInRange: build.query< + ControlPointDestinationInRangeApiResponse, + ControlPointDestinationInRangeApiArg + >({ + query: (queryArg) => ({ + url: `/control-points/${queryArg.cpId}/destination-in-range`, + params: { lat: queryArg.lat, lng: queryArg.lng }, + }), + }), + setControlPointDestination: build.mutation< + SetControlPointDestinationApiResponse, + SetControlPointDestinationApiArg + >({ + query: (queryArg) => ({ + url: `/control-points/${queryArg.cpId}/destination`, + method: "PUT", + body: queryArg.body, + }), + }), + clearControlPointDestination: build.mutation< + ClearControlPointDestinationApiResponse, + ClearControlPointDestinationApiArg + >({ + query: (queryArg) => ({ + url: `/control-points/${queryArg.cpId}/cancel-travel`, + method: "PUT", + }), + }), + getDebugHoldZones: build.query< + GetDebugHoldZonesApiResponse, + GetDebugHoldZonesApiArg + >({ + query: (queryArg) => ({ + url: `/debug/waypoint-geometries/hold/${queryArg.flightId}`, + }), + }), + getDebugIpZones: build.query< + GetDebugIpZonesApiResponse, + GetDebugIpZonesApiArg + >({ + query: (queryArg) => ({ + url: `/debug/waypoint-geometries/ip/${queryArg.flightId}`, + }), + }), + getDebugJoinZones: build.query< + GetDebugJoinZonesApiResponse, + GetDebugJoinZonesApiArg + >({ + query: (queryArg) => ({ + url: `/debug/waypoint-geometries/join/${queryArg.flightId}`, + }), + }), + listFlights: build.query({ + query: (queryArg) => ({ + url: `/flights/`, + params: { with_waypoints: queryArg.withWaypoints }, + }), + }), + getFlightById: build.query({ + query: (queryArg) => ({ + url: `/flights/${queryArg.flightId}`, + params: { with_waypoints: queryArg.withWaypoints }, + }), + }), + getCommitBoundaryForFlight: build.query< + GetCommitBoundaryForFlightApiResponse, + GetCommitBoundaryForFlightApiArg + >({ + query: (queryArg) => ({ + url: `/flights/${queryArg.flightId}/commit-boundary`, + }), + }), + listFrontLines: build.query< + ListFrontLinesApiResponse, + ListFrontLinesApiArg + >({ + query: () => ({ url: `/front-lines/` }), + }), + getFrontLineById: build.query< + GetFrontLineByIdApiResponse, + GetFrontLineByIdApiArg + >({ + query: (queryArg) => ({ url: `/front-lines/${queryArg.frontLineId}` }), + }), + getGameState: build.query({ + query: () => ({ url: `/game/` }), + }), + getTerrainZones: build.query< + GetTerrainZonesApiResponse, + GetTerrainZonesApiArg + >({ + query: () => ({ url: `/map-zones/terrain` }), + }), + listUnculledZones: build.query< + ListUnculledZonesApiResponse, + ListUnculledZonesApiArg + >({ + query: () => ({ url: `/map-zones/unculled` }), + }), + getThreatZones: build.query< + GetThreatZonesApiResponse, + GetThreatZonesApiArg + >({ + query: () => ({ url: `/map-zones/threats` }), + }), + getNavmesh: build.query({ + query: (queryArg) => ({ + url: `/navmesh/`, + params: { for_player: queryArg.forPlayer }, + }), + }), + openNewFrontLinePackageDialog: build.mutation< + OpenNewFrontLinePackageDialogApiResponse, + OpenNewFrontLinePackageDialogApiArg + >({ + query: (queryArg) => ({ + url: `/qt/create-package/front-line/${queryArg.frontLineId}`, + method: "POST", + }), + }), + openNewTgoPackageDialog: build.mutation< + OpenNewTgoPackageDialogApiResponse, + OpenNewTgoPackageDialogApiArg + >({ + query: (queryArg) => ({ + url: `/qt/create-package/tgo/${queryArg.tgoId}`, + method: "POST", + }), + }), + openTgoInfoDialog: build.mutation< + OpenTgoInfoDialogApiResponse, + OpenTgoInfoDialogApiArg + >({ + query: (queryArg) => ({ + url: `/qt/info/tgo/${queryArg.tgoId}`, + method: "POST", + }), + }), + openNewControlPointPackageDialog: build.mutation< + OpenNewControlPointPackageDialogApiResponse, + OpenNewControlPointPackageDialogApiArg + >({ + query: (queryArg) => ({ + url: `/qt/create-package/control-point/${queryArg.cpId}`, + method: "POST", + }), + }), + openControlPointInfoDialog: build.mutation< + OpenControlPointInfoDialogApiResponse, + OpenControlPointInfoDialogApiArg + >({ + query: (queryArg) => ({ + url: `/qt/info/control-point/${queryArg.cpId}`, + method: "POST", + }), + }), + listSupplyRoutes: build.query< + ListSupplyRoutesApiResponse, + ListSupplyRoutesApiArg + >({ + query: () => ({ url: `/supply-routes/` }), + }), + listTgos: build.query({ + query: () => ({ url: `/tgos/` }), + }), + getTgoById: build.query({ + query: (queryArg) => ({ url: `/tgos/${queryArg.tgoId}` }), + }), + listAllWaypointsForFlight: build.query< + ListAllWaypointsForFlightApiResponse, + ListAllWaypointsForFlightApiArg + >({ + query: (queryArg) => ({ url: `/waypoints/${queryArg.flightId}` }), + }), + setWaypointPosition: build.mutation< + SetWaypointPositionApiResponse, + SetWaypointPositionApiArg + >({ + query: (queryArg) => ({ + url: `/waypoints/${queryArg.flightId}/${queryArg.waypointIdx}/position`, + method: "POST", + body: queryArg.leafletPoint, + }), + }), + }), + overrideExisting: false, +}); +export { injectedRtkApi as _liberationApi }; +export type ListControlPointsApiResponse = + /** status 200 Successful Response */ ControlPoint[]; +export type ListControlPointsApiArg = void; +export type GetControlPointByIdApiResponse = + /** status 200 Successful Response */ ControlPoint; +export type GetControlPointByIdApiArg = { + cpId: number; +}; +export type ControlPointDestinationInRangeApiResponse = + /** status 200 Successful Response */ boolean; +export type ControlPointDestinationInRangeApiArg = { + cpId: number; + lat: number; + lng: number; +}; +export type SetControlPointDestinationApiResponse = + /** status 204 Successful Response */ undefined; +export type SetControlPointDestinationApiArg = { + cpId: number; + body: LatLng; +}; +export type ClearControlPointDestinationApiResponse = + /** status 204 Successful Response */ undefined; +export type ClearControlPointDestinationApiArg = { + cpId: number; +}; +export type GetDebugHoldZonesApiResponse = + /** status 200 Successful Response */ HoldZones; +export type GetDebugHoldZonesApiArg = { + flightId: string; +}; +export type GetDebugIpZonesApiResponse = + /** status 200 Successful Response */ IpZones; +export type GetDebugIpZonesApiArg = { + flightId: string; +}; +export type GetDebugJoinZonesApiResponse = + /** status 200 Successful Response */ JoinZones; +export type GetDebugJoinZonesApiArg = { + flightId: string; +}; +export type ListFlightsApiResponse = + /** status 200 Successful Response */ Flight[]; +export type ListFlightsApiArg = { + withWaypoints?: boolean; +}; +export type GetFlightByIdApiResponse = + /** status 200 Successful Response */ Flight; +export type GetFlightByIdApiArg = { + flightId: string; + withWaypoints?: boolean; +}; +export type GetCommitBoundaryForFlightApiResponse = + /** status 200 Successful Response */ LatLng[]; +export type GetCommitBoundaryForFlightApiArg = { + flightId: string; +}; +export type ListFrontLinesApiResponse = + /** status 200 Successful Response */ FrontLine[]; +export type ListFrontLinesApiArg = void; +export type GetFrontLineByIdApiResponse = + /** status 200 Successful Response */ FrontLine; +export type GetFrontLineByIdApiArg = { + frontLineId: string; +}; +export type GetGameStateApiResponse = + /** status 200 Successful Response */ Game; +export type GetGameStateApiArg = void; +export type GetTerrainZonesApiResponse = + /** status 200 Successful Response */ MapZones; +export type GetTerrainZonesApiArg = void; +export type ListUnculledZonesApiResponse = + /** status 200 Successful Response */ UnculledZone[]; +export type ListUnculledZonesApiArg = void; +export type GetThreatZonesApiResponse = + /** status 200 Successful Response */ ThreatZoneContainer; +export type GetThreatZonesApiArg = void; +export type GetNavmeshApiResponse = + /** status 200 Successful Response */ NavMesh; +export type GetNavmeshApiArg = { + forPlayer: boolean; +}; +export type OpenNewFrontLinePackageDialogApiResponse = + /** status 204 Successful Response */ undefined; +export type OpenNewFrontLinePackageDialogApiArg = { + frontLineId: string; +}; +export type OpenNewTgoPackageDialogApiResponse = + /** status 204 Successful Response */ undefined; +export type OpenNewTgoPackageDialogApiArg = { + tgoId: string; +}; +export type OpenTgoInfoDialogApiResponse = + /** status 204 Successful Response */ undefined; +export type OpenTgoInfoDialogApiArg = { + tgoId: string; +}; +export type OpenNewControlPointPackageDialogApiResponse = + /** status 204 Successful Response */ undefined; +export type OpenNewControlPointPackageDialogApiArg = { + cpId: number; +}; +export type OpenControlPointInfoDialogApiResponse = + /** status 204 Successful Response */ undefined; +export type OpenControlPointInfoDialogApiArg = { + cpId: number; +}; +export type ListSupplyRoutesApiResponse = + /** status 200 Successful Response */ SupplyRoute[]; +export type ListSupplyRoutesApiArg = void; +export type ListTgosApiResponse = /** status 200 Successful Response */ Tgo[]; +export type ListTgosApiArg = void; +export type GetTgoByIdApiResponse = /** status 200 Successful Response */ Tgo; +export type GetTgoByIdApiArg = { + tgoId: string; +}; +export type ListAllWaypointsForFlightApiResponse = + /** status 200 Successful Response */ Waypoint[]; +export type ListAllWaypointsForFlightApiArg = { + flightId: string; +}; +export type SetWaypointPositionApiResponse = + /** status 204 Successful Response */ undefined; +export type SetWaypointPositionApiArg = { + flightId: string; + waypointIdx: number; + leafletPoint: LatLng; +}; +export type LatLng = { + lat: number; + lng: number; +}; +export type ControlPoint = { + id: number; + name: string; + blue: boolean; + position: LatLng; + mobile: boolean; + destination?: LatLng; + sidc: string; +}; +export type ValidationError = { + loc: string[]; + msg: string; + type: string; +}; +export type HttpValidationError = { + detail?: ValidationError[]; +}; +export type HoldZones = { + homeBubble: LatLng[]; + targetBubble: LatLng[]; + joinBubble: LatLng[]; + excludedZones: LatLng[][]; + permissibleZones: LatLng[][]; + preferredLines: LatLng[][]; +}; +export type IpZones = { + homeBubble: LatLng[]; + ipBubble: LatLng[]; + permissibleZone: LatLng[]; + safeZones: LatLng[][]; +}; +export type JoinZones = { + homeBubble: LatLng[]; + targetBubble: LatLng[]; + ipBubble: LatLng[]; + excludedZones: LatLng[][]; + permissibleZones: LatLng[][]; + preferredLines: LatLng[][]; +}; +export type Waypoint = { + name: string; + position: LatLng; + altitude_ft: number; + altitude_reference: string; + is_movable: boolean; + should_mark: boolean; + include_in_path: boolean; + timing: string; +}; +export type Flight = { + id: string; + blue: boolean; + position?: LatLng; + sidc: string; + waypoints?: Waypoint[]; +}; +export type FrontLine = { + id: string; + extents: LatLng[]; +}; +export type Tgo = { + id: string; + name: string; + control_point_name: string; + category: string; + blue: boolean; + position: LatLng; + units: string[]; + threat_ranges: number[]; + detection_ranges: number[]; + dead: boolean; + sidc: string; +}; +export type SupplyRoute = { + points: LatLng[]; + front_active: boolean; + is_sea: boolean; + blue: boolean; + active_transports: string[]; +}; +export type ThreatZones = { + full: LatLng[][]; + aircraft: LatLng[][]; + air_defenses: LatLng[][]; + radar_sams: LatLng[][]; +}; +export type ThreatZoneContainer = { + blue: ThreatZones; + red: ThreatZones; +}; +export type NavMeshPoly = { + poly: LatLng[]; + threatened: boolean; +}; +export type NavMesh = { + polys: NavMeshPoly[]; +}; +export type NavMeshes = { + blue: NavMesh; + red: NavMesh; +}; +export type Game = { + control_points: ControlPoint[]; + tgos: Tgo[]; + supply_routes: SupplyRoute[]; + front_lines: FrontLine[]; + flights: Flight[]; + threat_zones: ThreatZoneContainer; + navmeshes: NavMeshes; + map_center?: LatLng; +}; +export type MapZones = { + inclusion: LatLng[][]; + exclusion: LatLng[][]; + sea: LatLng[][]; +}; +export type UnculledZone = { + position: LatLng; + radius: number; +}; +export const { + useListControlPointsQuery, + useGetControlPointByIdQuery, + useControlPointDestinationInRangeQuery, + useSetControlPointDestinationMutation, + useClearControlPointDestinationMutation, + useGetDebugHoldZonesQuery, + useGetDebugIpZonesQuery, + useGetDebugJoinZonesQuery, + useListFlightsQuery, + useGetFlightByIdQuery, + useGetCommitBoundaryForFlightQuery, + useListFrontLinesQuery, + useGetFrontLineByIdQuery, + useGetGameStateQuery, + useGetTerrainZonesQuery, + useListUnculledZonesQuery, + useGetThreatZonesQuery, + useGetNavmeshQuery, + useOpenNewFrontLinePackageDialogMutation, + useOpenNewTgoPackageDialogMutation, + useOpenTgoInfoDialogMutation, + useOpenNewControlPointPackageDialogMutation, + useOpenControlPointInfoDialogMutation, + useListSupplyRoutesQuery, + useListTgosQuery, + useGetTgoByIdQuery, + useListAllWaypointsForFlightQuery, + useSetWaypointPositionMutation, +} = injectedRtkApi; diff --git a/client/src/api/liberationApi.ts b/client/src/api/liberationApi.ts index 295554ab..84a58377 100644 --- a/client/src/api/liberationApi.ts +++ b/client/src/api/liberationApi.ts @@ -1,486 +1,71 @@ -import { baseApi as api } from "./baseApi"; +import { _liberationApi } from "./_liberationApi"; -const injectedRtkApi = api.injectEndpoints({ - endpoints: (build) => ({ - listControlPoints: build.query< - ListControlPointsApiResponse, - ListControlPointsApiArg - >({ - query: () => ({ url: `/control-points/` }), - }), - getControlPointById: build.query< - GetControlPointByIdApiResponse, - GetControlPointByIdApiArg - >({ - query: (queryArg) => ({ url: `/control-points/${queryArg.cpId}` }), - }), - controlPointDestinationInRange: build.query< - ControlPointDestinationInRangeApiResponse, - ControlPointDestinationInRangeApiArg - >({ - query: (queryArg) => ({ - url: `/control-points/${queryArg.cpId}/destination-in-range`, - params: { lat: queryArg.lat, lng: queryArg.lng }, - }), - }), - setControlPointDestination: build.mutation< - SetControlPointDestinationApiResponse, - SetControlPointDestinationApiArg - >({ - query: (queryArg) => ({ - url: `/control-points/${queryArg.cpId}/destination`, - method: "PUT", - body: queryArg.body, - }), - }), - clearControlPointDestination: build.mutation< - ClearControlPointDestinationApiResponse, - ClearControlPointDestinationApiArg - >({ - query: (queryArg) => ({ - url: `/control-points/${queryArg.cpId}/cancel-travel`, - method: "PUT", - }), - }), - getDebugHoldZones: build.query< - GetDebugHoldZonesApiResponse, - GetDebugHoldZonesApiArg - >({ - query: (queryArg) => ({ - url: `/debug/waypoint-geometries/hold/${queryArg.flightId}`, - }), - }), - getDebugIpZones: build.query< - GetDebugIpZonesApiResponse, - GetDebugIpZonesApiArg - >({ - query: (queryArg) => ({ - url: `/debug/waypoint-geometries/ip/${queryArg.flightId}`, - }), - }), - getDebugJoinZones: build.query< - GetDebugJoinZonesApiResponse, - GetDebugJoinZonesApiArg - >({ - query: (queryArg) => ({ - url: `/debug/waypoint-geometries/join/${queryArg.flightId}`, - }), - }), - listFlights: build.query({ - query: (queryArg) => ({ - url: `/flights/`, - params: { with_waypoints: queryArg.withWaypoints }, - }), - }), - getFlightById: build.query({ - query: (queryArg) => ({ - url: `/flights/${queryArg.flightId}`, - params: { with_waypoints: queryArg.withWaypoints }, - }), - }), - getCommitBoundaryForFlight: build.query< - GetCommitBoundaryForFlightApiResponse, - GetCommitBoundaryForFlightApiArg - >({ - query: (queryArg) => ({ - url: `/flights/${queryArg.flightId}/commit-boundary`, - }), - }), - listFrontLines: build.query< - ListFrontLinesApiResponse, - ListFrontLinesApiArg - >({ - query: () => ({ url: `/front-lines/` }), - }), - getFrontLineById: build.query< - GetFrontLineByIdApiResponse, - GetFrontLineByIdApiArg - >({ - query: (queryArg) => ({ url: `/front-lines/${queryArg.frontLineId}` }), - }), - getGameState: build.query({ - query: () => ({ url: `/game/` }), - }), - getTerrainZones: build.query< - GetTerrainZonesApiResponse, - GetTerrainZonesApiArg - >({ - query: () => ({ url: `/map-zones/terrain` }), - }), - listUnculledZones: build.query< - ListUnculledZonesApiResponse, - ListUnculledZonesApiArg - >({ - query: () => ({ url: `/map-zones/unculled` }), - }), - getThreatZones: build.query< - GetThreatZonesApiResponse, - GetThreatZonesApiArg - >({ - query: () => ({ url: `/map-zones/threats` }), - }), - getNavmesh: build.query({ - query: (queryArg) => ({ - url: `/navmesh/`, - params: { for_player: queryArg.forPlayer }, - }), - }), - openNewFrontLinePackageDialog: build.mutation< - OpenNewFrontLinePackageDialogApiResponse, - OpenNewFrontLinePackageDialogApiArg - >({ - query: (queryArg) => ({ - url: `/qt/create-package/front-line/${queryArg.frontLineId}`, - method: "POST", - }), - }), - openNewTgoPackageDialog: build.mutation< - OpenNewTgoPackageDialogApiResponse, - OpenNewTgoPackageDialogApiArg - >({ - query: (queryArg) => ({ - url: `/qt/create-package/tgo/${queryArg.tgoId}`, - method: "POST", - }), - }), - openTgoInfoDialog: build.mutation< - OpenTgoInfoDialogApiResponse, - OpenTgoInfoDialogApiArg - >({ - query: (queryArg) => ({ - url: `/qt/info/tgo/${queryArg.tgoId}`, - method: "POST", - }), - }), - openNewControlPointPackageDialog: build.mutation< - OpenNewControlPointPackageDialogApiResponse, - OpenNewControlPointPackageDialogApiArg - >({ - query: (queryArg) => ({ - url: `/qt/create-package/control-point/${queryArg.cpId}`, - method: "POST", - }), - }), - openControlPointInfoDialog: build.mutation< - OpenControlPointInfoDialogApiResponse, - OpenControlPointInfoDialogApiArg - >({ - query: (queryArg) => ({ - url: `/qt/info/control-point/${queryArg.cpId}`, - method: "POST", - }), - }), - listSupplyRoutes: build.query< - ListSupplyRoutesApiResponse, - ListSupplyRoutesApiArg - >({ - query: () => ({ url: `/supply-routes/` }), - }), - listTgos: build.query({ - query: () => ({ url: `/tgos/` }), - }), - getTgoById: build.query({ - query: (queryArg) => ({ url: `/tgos/${queryArg.tgoId}` }), - }), - listAllWaypointsForFlight: build.query< - ListAllWaypointsForFlightApiResponse, - ListAllWaypointsForFlightApiArg - >({ - query: (queryArg) => ({ url: `/waypoints/${queryArg.flightId}` }), - }), - setWaypointPosition: build.mutation< - SetWaypointPositionApiResponse, - SetWaypointPositionApiArg - >({ - query: (queryArg) => ({ - url: `/waypoints/${queryArg.flightId}/${queryArg.waypointIdx}/position`, - method: "POST", - body: queryArg.leafletPoint, - }), - }), - }), - overrideExisting: false, +// See https://redux-toolkit.js.org/rtk-query/usage/automated-refetching for an +// explanation of tag behavior. + +export enum Tags { + FLIGHT_PLAN = "FlightPlan", +} + +const LIST_ID = "LIST"; + +function providesList( + resultsWithIds: R | undefined, + tagType: T +) { + return resultsWithIds + ? [ + { type: tagType, id: LIST_ID }, + ...resultsWithIds.map(({ id }) => ({ type: tagType, id })), + ] + : [{ type: tagType, id: LIST_ID }]; +} + +export const liberationApi = _liberationApi.enhanceEndpoints({ + addTagTypes: Object.values(Tags), + endpoints: { + // /debug/waypoint-geometries + getDebugHoldZones: { + providesTags: (result, error, arg) => [ + { type: Tags.FLIGHT_PLAN, id: arg.flightId }, + ], + }, + getDebugIpZones: { + providesTags: (result, error, arg) => [ + { type: Tags.FLIGHT_PLAN, id: arg.flightId }, + ], + }, + getDebugJoinZones: { + providesTags: (result, error, arg) => [ + { type: Tags.FLIGHT_PLAN, id: arg.flightId }, + ], + }, + // /flights/ + getCommitBoundaryForFlight: { + providesTags: (result, error, arg) => [ + { type: Tags.FLIGHT_PLAN, id: arg.flightId }, + ], + }, + getFlightById: { + providesTags: (result, error, arg) => [ + { type: Tags.FLIGHT_PLAN, id: arg.flightId }, + ], + }, + listFlights: { + providesTags: (result) => providesList(result, Tags.FLIGHT_PLAN), + }, + // /waypoints/ + listAllWaypointsForFlight: { + providesTags: (result, error, arg) => [ + { type: Tags.FLIGHT_PLAN, id: arg.flightId }, + ], + }, + setWaypointPosition: { + invalidatesTags: (result, error, arg) => [ + { type: Tags.FLIGHT_PLAN, id: arg.flightId }, + ], + }, + }, }); -export { injectedRtkApi as liberationApi }; -export type ListControlPointsApiResponse = - /** status 200 Successful Response */ ControlPoint[]; -export type ListControlPointsApiArg = void; -export type GetControlPointByIdApiResponse = - /** status 200 Successful Response */ ControlPoint; -export type GetControlPointByIdApiArg = { - cpId: number; -}; -export type ControlPointDestinationInRangeApiResponse = - /** status 200 Successful Response */ boolean; -export type ControlPointDestinationInRangeApiArg = { - cpId: number; - lat: number; - lng: number; -}; -export type SetControlPointDestinationApiResponse = - /** status 204 Successful Response */ undefined; -export type SetControlPointDestinationApiArg = { - cpId: number; - body: LatLng; -}; -export type ClearControlPointDestinationApiResponse = - /** status 204 Successful Response */ undefined; -export type ClearControlPointDestinationApiArg = { - cpId: number; -}; -export type GetDebugHoldZonesApiResponse = - /** status 200 Successful Response */ HoldZones; -export type GetDebugHoldZonesApiArg = { - flightId: string; -}; -export type GetDebugIpZonesApiResponse = - /** status 200 Successful Response */ IpZones; -export type GetDebugIpZonesApiArg = { - flightId: string; -}; -export type GetDebugJoinZonesApiResponse = - /** status 200 Successful Response */ JoinZones; -export type GetDebugJoinZonesApiArg = { - flightId: string; -}; -export type ListFlightsApiResponse = - /** status 200 Successful Response */ Flight[]; -export type ListFlightsApiArg = { - withWaypoints?: boolean; -}; -export type GetFlightByIdApiResponse = - /** status 200 Successful Response */ Flight; -export type GetFlightByIdApiArg = { - flightId: string; - withWaypoints?: boolean; -}; -export type GetCommitBoundaryForFlightApiResponse = - /** status 200 Successful Response */ LatLng[]; -export type GetCommitBoundaryForFlightApiArg = { - flightId: string; -}; -export type ListFrontLinesApiResponse = - /** status 200 Successful Response */ FrontLine[]; -export type ListFrontLinesApiArg = void; -export type GetFrontLineByIdApiResponse = - /** status 200 Successful Response */ FrontLine; -export type GetFrontLineByIdApiArg = { - frontLineId: string; -}; -export type GetGameStateApiResponse = - /** status 200 Successful Response */ Game; -export type GetGameStateApiArg = void; -export type GetTerrainZonesApiResponse = - /** status 200 Successful Response */ MapZones; -export type GetTerrainZonesApiArg = void; -export type ListUnculledZonesApiResponse = - /** status 200 Successful Response */ UnculledZone[]; -export type ListUnculledZonesApiArg = void; -export type GetThreatZonesApiResponse = - /** status 200 Successful Response */ ThreatZoneContainer; -export type GetThreatZonesApiArg = void; -export type GetNavmeshApiResponse = - /** status 200 Successful Response */ NavMesh; -export type GetNavmeshApiArg = { - forPlayer: boolean; -}; -export type OpenNewFrontLinePackageDialogApiResponse = - /** status 204 Successful Response */ undefined; -export type OpenNewFrontLinePackageDialogApiArg = { - frontLineId: string; -}; -export type OpenNewTgoPackageDialogApiResponse = - /** status 204 Successful Response */ undefined; -export type OpenNewTgoPackageDialogApiArg = { - tgoId: string; -}; -export type OpenTgoInfoDialogApiResponse = - /** status 204 Successful Response */ undefined; -export type OpenTgoInfoDialogApiArg = { - tgoId: string; -}; -export type OpenNewControlPointPackageDialogApiResponse = - /** status 204 Successful Response */ undefined; -export type OpenNewControlPointPackageDialogApiArg = { - cpId: number; -}; -export type OpenControlPointInfoDialogApiResponse = - /** status 204 Successful Response */ undefined; -export type OpenControlPointInfoDialogApiArg = { - cpId: number; -}; -export type ListSupplyRoutesApiResponse = - /** status 200 Successful Response */ SupplyRoute[]; -export type ListSupplyRoutesApiArg = void; -export type ListTgosApiResponse = /** status 200 Successful Response */ Tgo[]; -export type ListTgosApiArg = void; -export type GetTgoByIdApiResponse = /** status 200 Successful Response */ Tgo; -export type GetTgoByIdApiArg = { - tgoId: string; -}; -export type ListAllWaypointsForFlightApiResponse = - /** status 200 Successful Response */ Waypoint[]; -export type ListAllWaypointsForFlightApiArg = { - flightId: string; -}; -export type SetWaypointPositionApiResponse = - /** status 204 Successful Response */ undefined; -export type SetWaypointPositionApiArg = { - flightId: string; - waypointIdx: number; - leafletPoint: LatLng; -}; -export type LatLng = { - lat: number; - lng: number; -}; -export type ControlPoint = { - id: number; - name: string; - blue: boolean; - position: LatLng; - mobile: boolean; - destination?: LatLng; - sidc: string; -}; -export type ValidationError = { - loc: string[]; - msg: string; - type: string; -}; -export type HttpValidationError = { - detail?: ValidationError[]; -}; -export type HoldZones = { - homeBubble: LatLng[]; - targetBubble: LatLng[]; - joinBubble: LatLng[]; - excludedZones: LatLng[][]; - permissibleZones: LatLng[][]; - preferredLines: LatLng[][]; -}; -export type IpZones = { - homeBubble: LatLng[]; - ipBubble: LatLng[]; - permissibleZone: LatLng[]; - safeZones: LatLng[][]; -}; -export type JoinZones = { - homeBubble: LatLng[]; - targetBubble: LatLng[]; - ipBubble: LatLng[]; - excludedZones: LatLng[][]; - permissibleZones: LatLng[][]; - preferredLines: LatLng[][]; -}; -export type Waypoint = { - name: string; - position: LatLng; - altitude_ft: number; - altitude_reference: string; - is_movable: boolean; - should_mark: boolean; - include_in_path: boolean; - timing: string; -}; -export type Flight = { - id: string; - blue: boolean; - position?: LatLng; - sidc: string; - waypoints?: Waypoint[]; -}; -export type FrontLine = { - id: string; - extents: LatLng[]; -}; -export type Tgo = { - id: string; - name: string; - control_point_name: string; - category: string; - blue: boolean; - position: LatLng; - units: string[]; - threat_ranges: number[]; - detection_ranges: number[]; - dead: boolean; - sidc: string; -}; -export type SupplyRoute = { - points: LatLng[]; - front_active: boolean; - is_sea: boolean; - blue: boolean; - active_transports: string[]; -}; -export type ThreatZones = { - full: LatLng[][]; - aircraft: LatLng[][]; - air_defenses: LatLng[][]; - radar_sams: LatLng[][]; -}; -export type ThreatZoneContainer = { - blue: ThreatZones; - red: ThreatZones; -}; -export type NavMeshPoly = { - poly: LatLng[]; - threatened: boolean; -}; -export type NavMesh = { - polys: NavMeshPoly[]; -}; -export type NavMeshes = { - blue: NavMesh; - red: NavMesh; -}; -export type Game = { - control_points: ControlPoint[]; - tgos: Tgo[]; - supply_routes: SupplyRoute[]; - front_lines: FrontLine[]; - flights: Flight[]; - threat_zones: ThreatZoneContainer; - navmeshes: NavMeshes; - map_center?: LatLng; -}; -export type MapZones = { - inclusion: LatLng[][]; - exclusion: LatLng[][]; - sea: LatLng[][]; -}; -export type UnculledZone = { - position: LatLng; - radius: number; -}; -export const { - useListControlPointsQuery, - useGetControlPointByIdQuery, - useControlPointDestinationInRangeQuery, - useSetControlPointDestinationMutation, - useClearControlPointDestinationMutation, - useGetDebugHoldZonesQuery, - useGetDebugIpZonesQuery, - useGetDebugJoinZonesQuery, - useListFlightsQuery, - useGetFlightByIdQuery, - useGetCommitBoundaryForFlightQuery, - useListFrontLinesQuery, - useGetFrontLineByIdQuery, - useGetGameStateQuery, - useGetTerrainZonesQuery, - useListUnculledZonesQuery, - useGetThreatZonesQuery, - useGetNavmeshQuery, - useOpenNewFrontLinePackageDialogMutation, - useOpenNewTgoPackageDialogMutation, - useOpenTgoInfoDialogMutation, - useOpenNewControlPointPackageDialogMutation, - useOpenControlPointInfoDialogMutation, - useListSupplyRoutesQuery, - useListTgosQuery, - useGetTgoByIdQuery, - useListAllWaypointsForFlightQuery, - useSetWaypointPositionMutation, -} = injectedRtkApi; + +export * from "./_liberationApi"; diff --git a/client/src/components/waypointmarker/WaypointMarker.tsx b/client/src/components/waypointmarker/WaypointMarker.tsx index 3047f5ff..6899fc94 100644 --- a/client/src/components/waypointmarker/WaypointMarker.tsx +++ b/client/src/components/waypointmarker/WaypointMarker.tsx @@ -1,6 +1,8 @@ -import backend from "../../api/backend"; -import { Flight } from "../../api/liberationApi"; -import { Waypoint } from "../../api/liberationApi"; +import { + Flight, + Waypoint, + useSetWaypointPositionMutation, +} from "../../api/liberationApi"; import { Icon } from "leaflet"; import { Marker as LMarker } from "leaflet"; import icon from "leaflet/dist/images/marker-icon.png"; @@ -36,6 +38,8 @@ const WaypointMarker = (props: WaypointMarkerProps) => { const map = useMap(); const marker: MutableRefObject = useRef(); + const [putDestination] = useSetWaypointPositionMutation(); + const rebindTooltip = useCallback(() => { if (marker.current === undefined) { return; @@ -73,13 +77,18 @@ const WaypointMarker = (props: WaypointMarkerProps) => { const m: LMarker = e.target; m.setTooltipContent("Waiting to recompute TOT..."); }, - dragend: (e) => { + dragend: async (e) => { const m: LMarker = e.target; const destination = m.getLatLng(); - backend.post( - `/waypoints/${props.flight.id}/${props.number}/position`, - destination - ); + try { + await putDestination({ + flightId: props.flight.id, + waypointIdx: props.number, + leafletPoint: { lat: destination.lat, lng: destination.lng }, + }); + } catch (e) { + console.error("Failed to set waypoint position", e); + } }, }} ref={(ref) => {