Skip to content

Commit 1ce545f

Browse files
authored
send the precedence field (#126)
1 parent 7239d50 commit 1ce545f

File tree

10 files changed

+83
-46
lines changed

10 files changed

+83
-46
lines changed

src/components/stats.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import TopSelectedItem from '@/libs/classes/top-selected-item';
3939
} else {
4040
this.$data.selectedItem = item;
4141
}
42-
store.commit('topSelectedItem', this.$data.selectedItem);
42+
store.dispatch('topSelectedItem', this.$data.selectedItem);
4343
},
4444
},
4545
})

src/components/world-map.vue

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ import { streamWS } from '@/libs/endpoints';
1313
import { AirportList, AirportListEvent } from '@/interfaces/airport';
1414
import { AirportInfo, Flight, FlightList, FlightListEvent } from '@/interfaces/flight';
1515
import MapEngine from '@/libs/map-engine';
16-
import { CoordinatesBox, types } from '@/interfaces/serverProtocol';
16+
import { CoordinatesBox, types, Precedence } from '@/interfaces/serverProtocol';
1717
import { store } from '@/store';
1818
import TopSelectedItem from '../libs/classes/top-selected-item';
1919
import MaxSpeedFlight from '../libs/classes/max-speed-flight';
2020
import { Airport } from '../interfaces/stats';
2121
import DVSEvent from '../interfaces/dvs.event';
22+
import { fromTopSelectedItem } from '../libs/precedence.factory';
2223
2324
@Component({
2425
name: 'world-map',
@@ -116,9 +117,9 @@ export default class extends Vue {
116117
share(),
117118
);
118119
messages.pipe(filter<FlightListEvent>((event: DVSEvent) => event.eventType === 'FlightList'))
119-
.subscribe((event: FlightListEvent) => this.manageFlightList(event.eventPayload));
120+
.subscribe((event) => this.manageFlightList(event.eventPayload));
120121
messages.pipe(filter<AirportListEvent>((event: DVSEvent) => event.eventType === 'AirportList'))
121-
.subscribe((event: AirportListEvent) => this.manageAirportList(event.eventPayload));
122+
.subscribe((event) => this.manageAirportList(event.eventPayload));
122123
});
123124
this.isListening = true;
124125
}
@@ -155,24 +156,20 @@ export default class extends Vue {
155156
}
156157
157158
private createCommand(): CoordinatesBox {
158-
const {
159-
leftHighLat,
160-
leftHighLon,
161-
rightLowLat,
162-
rightLowLon,
163-
} = this.map!.getBoundingBox();
164-
159+
const { leftHighLat, leftHighLon, rightLowLat, rightLowLon } = this.map!.getBoundingBox();
165160
const zoom = this.map!.getZoom();
166161
const updateRate = this.getUpdateRate(Math.max(0, 10 - zoom));
162+
const precedence: Precedence = fromTopSelectedItem(store.getters.topSelectedItem);
167163
168164
return {
169165
'@type': types.startFlightList,
170166
'maxFlights': store.getters.maxFlights,
171-
'updateRate': updateRate,
172-
'leftHighLat': leftHighLat,
173-
'leftHighLon': leftHighLon,
174-
'rightLowLat': rightLowLat,
175-
'rightLowLon': rightLowLon,
167+
precedence,
168+
updateRate,
169+
leftHighLat,
170+
leftHighLon,
171+
rightLowLat,
172+
rightLowLon,
176173
};
177174
}
178175

src/interfaces/dvs.event.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export default interface DVSEvent {
22
eventType: 'FlightList' | 'AirportList';
3-
};
3+
}

src/interfaces/serverProtocol.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,16 @@ interface ServerProtocol {
1111
readonly '@type': keyof typeof types;
1212
}
1313

14+
export interface Precedence {
15+
readonly airline?: string;
16+
readonly arrivalAirport?: string;
17+
readonly departureAirport?: string;
18+
}
19+
1420
export interface CoordinatesBox extends ServerProtocol {
1521
readonly '@type': typeof types.startFlightList;
1622
readonly maxFlights?: number;
23+
readonly precedence: Precedence;
1724
readonly updateRate?: number;
1825
readonly leftHighLat: number;
1926
readonly leftHighLon: number;

src/interfaces/store.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { WebSocketSubject } from 'rxjs/webSocket';
22
import TopSelectedItem from '@/libs/classes/top-selected-item';
33
import MaxSpeedFlight from '@/libs/classes/max-speed-flight';
4+
import { CoordinatesBox } from './serverProtocol';
45

56
interface SocketConfiguration {
67
maxFlights: number;
@@ -10,6 +11,7 @@ interface SocketConfiguration {
1011
export interface State {
1112
configuration: SocketConfiguration;
1213
paused: boolean;
14+
latestBox?: CoordinatesBox;
1315
maxSpeed: number;
1416
maximized: boolean;
1517
socket?: WebSocketSubject<unknown>;

src/libs/precedence.factory.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Precedence } from '@/interfaces/serverProtocol';
2+
import TopSelectedItem from './classes/top-selected-item';
3+
4+
export function fromTopSelectedItem(topSelectedItem: TopSelectedItem | undefined): Precedence {
5+
let precedence: Precedence = {};
6+
const typeOfPrecedence = topSelectedItem?.type;
7+
switch (typeOfPrecedence) {
8+
case 'originAirport':
9+
precedence = { departureAirport: topSelectedItem!.value };
10+
break;
11+
case 'destinationAirport':
12+
precedence = { arrivalAirport: topSelectedItem!.value };
13+
break;
14+
case 'airlines':
15+
precedence = { airline: topSelectedItem!.value };
16+
break;
17+
case 'fastestFlights':
18+
precedence = {};
19+
break;
20+
}
21+
return precedence;
22+
}

src/store/actions.ts

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { ActionTree } from 'vuex';
1+
import { ActionTree, ActionContext } from 'vuex';
22
import { webSocket, WebSocketSubject } from 'rxjs/webSocket';
33
import { State } from '@/interfaces/store';
4-
import { CoordinatesBox, types } from '@/interfaces/serverProtocol';
5-
import { store } from '@/store';
4+
import { CoordinatesBox, Precedence, types } from '@/interfaces/serverProtocol';
5+
import TopSelectedItem from '@/libs/classes/top-selected-item';
6+
import { fromTopSelectedItem } from '@/libs/precedence.factory';
67

78
const actions: ActionTree<State, any> = {
89
attachWebSocket({ state }, url: string): WebSocketSubject<unknown> {
@@ -11,36 +12,58 @@ const actions: ActionTree<State, any> = {
1112
}
1213
return state.socket;
1314
},
14-
startFlightList({ state: { socket } }, message: CoordinatesBox): void {
15+
startFlightList({ commit, state: { socket } }, message: CoordinatesBox): void {
1516
if (socket) {
1617
socket.next(message);
18+
commit('latestBox', message);
1719
}
1820
},
1921
stopFlightList({ state: { socket } }): void {
2022
if (socket) {
2123
socket.next({ '@type': types.stopFlightList });
2224
}
2325
},
24-
startTop({ state: { socket } }): void {
26+
startTop({ getters, state: { socket } }): void {
2527
if (socket) {
26-
socket.next({ '@type': types.startTop, 'updateRate': store.getters.updateRate });
28+
socket.next({ '@type': types.startTop, 'updateRate': getters.updateRate });
2729
}
2830
},
2931
stopTop({ state: { socket } }): void {
3032
if (socket) {
3133
socket.next({ '@type': types.stopTop });
3234
}
3335
},
34-
startTotal({ state: { socket } }): void {
36+
startTotal({ getters, state: { socket } }): void {
3537
if (socket) {
36-
socket.next({ '@type': types.startTotal, 'updateRate': store.getters.updateRate });
38+
socket.next({ '@type': types.startTotal, 'updateRate': getters.updateRate });
3739
}
3840
},
3941
stopTotal({ state: { socket } }): void {
4042
if (socket) {
4143
socket.next({ '@type': types.stopTotal });
4244
}
4345
},
46+
toggleMaximize({ dispatch, state }: ActionContext<State, any>) {
47+
state.maximized = !state.maximized;
48+
if (state.maximized) {
49+
dispatch(types.startTop);
50+
dispatch(types.startTotal);
51+
} else {
52+
dispatch(types.stopTop);
53+
dispatch(types.stopTotal);
54+
}
55+
},
56+
topSelectedItem({ dispatch, getters, state }: ActionContext<State, any>, item?: TopSelectedItem) {
57+
state.topSelectedItem = item;
58+
if (!!item) {
59+
dispatch(types.stopTop);
60+
} else {
61+
dispatch(types.startTop);
62+
}
63+
if (!state.paused) {
64+
dispatch(types.startFlightList, { ...state.latestBox, precedence: fromTopSelectedItem(getters.topSelectedItem) });
65+
}
66+
},
4467
};
4568

4669
export {

src/store/getters.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { State } from '@/interfaces/store';
2+
import TopSelectedItem from '@/libs/classes/top-selected-item';
23
import { GetterTree } from 'vuex';
34
import { WebSocketSubject } from 'rxjs/webSocket';
45

@@ -7,6 +8,7 @@ const getters: GetterTree<State, any> = {
78
maxFlights: (state: State): number => state.configuration.maxFlights,
89
maxSpeed: (state: State): number => state.maxSpeed,
910
socket: (state: State): (WebSocketSubject<unknown> | undefined) => state.socket,
11+
topSelectedItem: (state: State): (TopSelectedItem | undefined) => state.topSelectedItem,
1012
updateRate: (state: State): number => state.configuration.updateRate,
1113
};
1214

src/store/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const state: State = {
1212
maxFlights: 1500,
1313
updateRate: 30,
1414
},
15+
latestBox: undefined,
1516
maximized: true,
1617
paused: false,
1718
maxSpeed: 0,

src/store/mutations.ts

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,18 @@
11
import { State } from '@/interfaces/store';
2-
import { types } from '@/interfaces/serverProtocol';
3-
import { store } from '@/store';
42
import { MutationTree } from 'vuex';
5-
import TopSelectedItem from '@/libs/classes/top-selected-item';
63
import MaxSpeedFlight from '@/libs/classes/max-speed-flight';
4+
import { CoordinatesBox } from '@/interfaces/serverProtocol';
75

86
const mutations: MutationTree<State> = {
7+
latestBox(currentState: State, latestBox: CoordinatesBox) {
8+
currentState.latestBox = latestBox;
9+
},
910
togglePause(currentState: State) {
1011
currentState.paused = !currentState.paused;
1112
},
12-
toggleMaximize(currentState: State) {
13-
currentState.maximized = !currentState.maximized;
14-
if (currentState.maximized) {
15-
store.dispatch(types.startTop);
16-
store.dispatch(types.startTotal);
17-
} else {
18-
store.dispatch(types.stopTop);
19-
store.dispatch(types.stopTotal);
20-
}
21-
},
2213
setMaxSpeed(currentState: State, speed: number) {
2314
currentState.maxSpeed = speed;
2415
},
25-
topSelectedItem(currentState: State, item?: TopSelectedItem) {
26-
currentState.topSelectedItem = item;
27-
if (!!item) {
28-
store.dispatch(types.stopTop);
29-
} else {
30-
store.dispatch(types.startTop);
31-
}
32-
},
3316
toggleBoxedMaxSpeedFlightPopup(currentState: State, maxSpeedFlight?: MaxSpeedFlight) {
3417
currentState.boxedMapSpeedFlight = maxSpeedFlight;
3518
},

0 commit comments

Comments
 (0)