diff --git a/src/App.scss b/src/App.scss index 5e03370..dac7414 100644 --- a/src/App.scss +++ b/src/App.scss @@ -69,7 +69,7 @@ padding: 0.5em 0.4em; max-width: 1100px; margin: 0 auto; - + border-radius: 0 0 1em 1em; } @@ -180,7 +180,7 @@ @include smallScreen() { flex-direction: column; - + a { margin: 0.25em 0; } @@ -201,8 +201,9 @@ width: 1.35em; } - & > .region { + .region { color: paleturquoise; + font-weight: bold; } } diff --git a/src/App.vue b/src/App.vue index 179853c..3e3ffdb 100644 --- a/src/App.vue +++ b/src/App.vue @@ -33,13 +33,13 @@
- - {{ currentRegion.value }} + + {{ store.region.value }} icon dispatcher - {{ dispatcherCount }} + {{ onlineDispatchers.length }} | - {{ trainCount }} + {{ store.trainList.length }} icon train
@@ -99,8 +99,6 @@ export default defineComponent({ const store = useStore(); store.connectToAPI(); - const currentRegion = store.region; - // const sceneryDataStatus = computed(() => data.value.sceneryDataStatus); const isFilterCardVisible = ref(false); @@ -108,18 +106,13 @@ export default defineComponent({ provide('isFilterCardVisible', isFilterCardVisible); return { - currentRegion, + store, isFilterCardVisible, + onlineDispatchers: computed(() => + store.stationList.filter((station) => station.onlineInfo && station.onlineInfo.region == store.region.id) + ), dispatcherDataStatus: store.dataStatuses.dispatchers, - - trainCount: store.trainCount, - - dispatcherCount: store.stationList.filter((station) => station.onlineInfo).length, - - openFilterCard() { - isFilterCardVisible.value = true; - }, }; }, @@ -163,6 +156,10 @@ export default defineComponent({ StorageManager.setBooleanValue('version_notes_read', true); }, + changeRegion() { + this.store.changeRegion({ id: 'cae', value: 'PL2' }); + }, + changeLang(lang: string) { this.$i18n.locale = lang; this.currentLang = lang; diff --git a/src/components/StationsView/StationFilterCard.vue b/src/components/StationsView/StationFilterCard.vue index 3dcf206..931ce08 100644 --- a/src/components/StationsView/StationFilterCard.vue +++ b/src/components/StationsView/StationFilterCard.vue @@ -13,7 +13,7 @@
{{ $t('filters.title') }}
-
+
({ + apiData: {} as unknown, + stationList: [], trainList: [], @@ -47,7 +49,9 @@ export const useStore = defineStore('store', { } as StoreState), actions: { - setTrainsOnlineData(trains?: TrainAPIData[]) { + setTrainsOnlineData() { + const { trains } = this.apiData; + if (!trains) return []; this.trainList = trains @@ -93,15 +97,17 @@ export const useStore = defineStore('store', { }) as Train[]; }, - getDispatcherStatus(dispatchers: any[][] | undefined, stationAPIData: StationAPIData) { + getDispatcherStatus(onlineStationData: StationAPIData) { + const { dispatchers } = this.apiData; + const prevDispatcherStatus = this.lastDispatcherStatuses.find( - (dispatcher) => dispatcher.hash === stationAPIData.stationHash + (dispatcher) => dispatcher.hash === onlineStationData.stationHash ); const stationStatus = !dispatchers ? undefined : dispatchers.find( - (status: string[]) => status[0] == stationAPIData.stationHash && status[1] == this.region.id + (status: string[]) => status[0] == onlineStationData.stationHash && status[1] == this.region.id ) || -1; const statusTimestamp = @@ -110,7 +116,7 @@ export const useStore = defineStore('store', { prevDispatcherStatus && !dispatchers ? prevDispatcherStatus.statusID : getStatusID(stationStatus); return { - hash: stationAPIData.stationHash, + hash: onlineStationData.stationHash, statusID, statusTimestamp, }; @@ -188,17 +194,17 @@ export const useStore = defineStore('store', { .map((train) => ({ driverName: train.driverName, driverId: train.driverId, trainNo: train.trainNo })); }, - setStationsOnlineInfo(data: APIData) { + setStationsOnlineInfo() { const onlineStationNames: string[] = []; - const prevDispatcherStatuses: StoreState['lastDispatcherStatuses'] = []; + const prevDispatcherStatuses: StoreState['lastDispatcherStatuses'] = []; - data.stations?.forEach((stationAPIData) => { + this.apiData.stations?.forEach((stationAPIData) => { if (stationAPIData.region !== this.region.id || !stationAPIData.isOnline) return; const station = this.stationList.find((s) => s.name === stationAPIData.stationName); onlineStationNames.push(stationAPIData.stationName); - const dispatcherStatus = this.getDispatcherStatus(data.dispatchers, stationAPIData); + const dispatcherStatus = this.getDispatcherStatus(stationAPIData); prevDispatcherStatuses.push(dispatcherStatus); const stationTrains = this.getStationTrains(stationAPIData); @@ -207,6 +213,7 @@ export const useStore = defineStore('store', { const onlineInfo = { name: stationAPIData.stationName, hash: stationAPIData.stationHash, + region: stationAPIData.region, maxUsers: stationAPIData.maxUsers, currentUsers: stationAPIData.currentUsers, spawns: parseSpawns(stationAPIData.spawnString), @@ -239,7 +246,7 @@ export const useStore = defineStore('store', { }); }); - if (data.dispatchers != null) this.lastDispatcherStatuses = prevDispatcherStatuses; + if (this.apiData.dispatchers != null) this.lastDispatcherStatuses = prevDispatcherStatuses; }, async fetchStationsGeneralInfo() { @@ -324,7 +331,9 @@ export const useStore = defineStore('store', { ); socket.on('UPDATE', (data: APIData) => { - this.fetchOnlineData(data); + this.apiData = data; + + this.setOnlineData(); }); socket.emit('connection'); @@ -337,8 +346,14 @@ export const useStore = defineStore('store', { this.connectToWebsocket(); }, - async fetchOnlineData(data: APIData) { - if (!data.stations) { + async changeRegion(region: StoreState['region']) { + this.region = region; + + await this.setOnlineData(); + }, + + async setOnlineData() { + if (!this.apiData.stations) { this.dataStatuses.sceneries = DataStatus.Error; this.dataStatuses.trains = DataStatus.Error; this.dataStatuses.dispatchers = DataStatus.Error; @@ -347,11 +362,14 @@ export const useStore = defineStore('store', { } this.dataStatuses.sceneries = DataStatus.Loaded; - this.dataStatuses.trains = !data.trains ? DataStatus.Warning : DataStatus.Loaded; - this.dataStatuses.dispatchers = !data.dispatchers ? DataStatus.Warning : DataStatus.Loaded; + this.dataStatuses.trains = !this.apiData.trains ? DataStatus.Warning : DataStatus.Loaded; + this.dataStatuses.dispatchers = !this.apiData.dispatchers ? DataStatus.Warning : DataStatus.Loaded; - this.setStationsOnlineInfo(data); - this.setTrainsOnlineData(data.trains); + this.setTrainsOnlineData(); + this.setStationsOnlineInfo(); + + console.log("Loading"); + }, }, }); diff --git a/src/store/storeTypes.ts b/src/store/storeTypes.ts index 62fef76..a9255e1 100644 --- a/src/store/storeTypes.ts +++ b/src/store/storeTypes.ts @@ -10,6 +10,7 @@ export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' export interface StoreState { stationList: Station[]; trainList: Train[]; + apiData: APIData; lastDispatcherStatuses: { hash: string; statusTimestamp: number; statusID: string }[]; diff --git a/src/views/StationsView.vue b/src/views/StationsView.vue index 0a3f257..bf87a7a 100644 --- a/src/views/StationsView.vue +++ b/src/views/StationsView.vue @@ -71,19 +71,16 @@ export default defineComponent({ const filterManager = reactive(new StationFilterManager()); const focusedStationName = ''; - const computedStations: ComputedRef = computed(() => { - return filterManager.getFilteredStationList(store.stationList); - }); - - const focusedStationInfo = computed(() => - computedStations.value.find((station) => station.name === focusedStationName) + const computedStations: ComputedRef = computed(() => + filterManager + .getFilteredStationList(store.stationList) + .filter((station) => !station.onlineInfo || station.onlineInfo.region == store.region.id) ); return { computedStations, filterManager, focusedStationName, - focusedStationInfo, }; }, mounted() { diff --git a/src/views/TrainsView.vue b/src/views/TrainsView.vue index 13f367f..e21b57f 100644 --- a/src/views/TrainsView.vue +++ b/src/views/TrainsView.vue @@ -2,8 +2,6 @@
- -
@@ -51,8 +49,6 @@ export default defineComponent({ setup() { const store = useStore(); - const trainList = store.trainList; - const sorterActive = ref({ id: 'distance', dir: -1 }); const filterList = reactive([...trainFilters]) as TrainFilter[]; const isTrainOptionsCardVisible = ref(false); @@ -67,11 +63,16 @@ export default defineComponent({ provide('isTrainOptionsCardVisible', isTrainOptionsCardVisible); const computedTrains: ComputedRef = computed(() => { - return filteredTrainList(trainList, searchedTrain.value, searchedDriver.value, sorterActive.value, filterList); + return filteredTrainList( + store.trainList, + searchedTrain.value, + searchedDriver.value, + sorterActive.value, + filterList + ); }); return { - trainList, computedTrains, searchedTrain, searchedDriver,