Pobieranie danych o sceneriach / caching

This commit is contained in:
2022-11-15 19:50:30 +01:00
parent 2878c5d79b
commit 6240297e84
4 changed files with 60 additions and 14 deletions
+25 -10
View File
@@ -27,13 +27,13 @@
<div v-else> <div v-else>
<b class="text--accent">Kliknij na gracza, aby wypełnić obecny rozkaz jego danymi</b> <b class="text--accent">Kliknij na gracza, aby wypełnić obecny rozkaz jego danymi</b>
<p>Gracze bez rozkładu jazdy</p> <p>Gracze online bez RJ</p>
<ul class="train-list"> <ul class="train-list">
<li v-for="train in sceneryTrains" @click="fillOrder(train.trainNo)"> <li v-for="train in sceneryTrains" @click="fillOrder(train.trainNo)">
<b>{{ train.trainNo }} | {{ train.driverName }}</b> <b>{{ train.trainNo }} | {{ train.driverName }}</b>
</li> </li>
<li class="no-trains" v-if="sceneryTrains.length == 0 && selectedSceneryName">Brak graczy na scenerii</li> <li class="no-trains" v-if="sceneryTrains.length == 0 && selectedSceneryName">Brak graczy</li>
</ul> </ul>
<p>Aktywne rozkłady jazdy</p> <p>Aktywne rozkłady jazdy</p>
@@ -53,16 +53,17 @@
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import axios from 'axios'; import axios from 'axios';
import { ApiSWDR, ApiStacjownik } from '../types/apiTypes'; import { ApiSWDR, ApiStacjownik } from '../types/apiTypes';
import { ISceneryData } from '../types/dataTypes';
import { useStore } from '../store/store'; import { useStore } from '../store/store';
import { currentFormattedDate } from '../utils/dateUtils'; import { currentFormattedDate } from '../utils/dateUtils';
import { ISceneryOnline, ISceneryData } from '../types/dataTypes';
export default defineComponent({ export default defineComponent({
name: 'order-train-picker', name: 'order-train-picker',
data() { data() {
return { return {
sceneriesOnline: [] as ISceneryData[], sceneriesData: [] as ISceneryData[],
sceneriesOnline: [] as ISceneryOnline[],
trainsOnline: [] as ApiStacjownik.IActiveTrain[], trainsOnline: [] as ApiStacjownik.IActiveTrain[],
selectedSceneryName: null as string | null, selectedSceneryName: null as string | null,
@@ -73,12 +74,16 @@ export default defineComponent({
}; };
}, },
created() {
this.fetchSceneriesData();
},
activated() { activated() {
this.fetchData(); this.fetchOnlineData();
this.refreshInterval = window.setInterval(() => { this.refreshInterval = window.setInterval(() => {
this.fetchData(); this.fetchOnlineData();
}, 5 * 1000); }, 35 * 1000);
}, },
deactivated() { deactivated() {
@@ -101,7 +106,9 @@ export default defineComponent({
}, },
dispatcherNameList() { dispatcherNameList() {
return [...new Set(this.sceneriesOnlinePL1.map((s) => s.dispatcherName))].sort((a, b) => (a < b ? -1 : 1)); return [...new Set(this.sceneriesOnlinePL1.map((s) => s.dispatcherName))].sort((a, b) =>
a.toLocaleLowerCase() < b.toLocaleLowerCase() ? -1 : 1
);
}, },
sceneryNameList() { sceneryNameList() {
@@ -128,7 +135,15 @@ export default defineComponent({
}, },
methods: { methods: {
async fetchData() { async fetchSceneriesData() {
const data: ISceneryData[] = await (await axios.get(`${import.meta.env['VITE_APP_API_URL']}/getSceneries`)).data;
if (!data) return;
this.sceneriesData = data;
},
async fetchOnlineData() {
this.fetchSceneriesOnline(); this.fetchSceneriesOnline();
this.fetchTrainsOnline(); this.fetchTrainsOnline();
}, },
@@ -154,7 +169,7 @@ export default defineComponent({
}, },
fillOrder(trainNo: number) { fillOrder(trainNo: number) {
if(!this.selectedDispatcherName || !this.selectedSceneryName) return; if (!this.selectedDispatcherName || !this.selectedSceneryName) return;
const chosenOrder = this.store[this.store.chosenOrderType]; const chosenOrder = this.store[this.store.chosenOrderType];
chosenOrder.header.trainNo = trainNo.toString(); chosenOrder.header.trainNo = trainNo.toString();
-2
View File
@@ -1,5 +1,3 @@
import { ISceneryData } from './dataTypes';
export declare module ApiSWDR { export declare module ApiSWDR {
export interface IStationsOnline { export interface IStationsOnline {
success: boolean; success: boolean;
+17 -1
View File
@@ -1,4 +1,4 @@
export interface ISceneryData { export interface ISceneryOnline {
dispatcherId: number; dispatcherId: number;
dispatcherName: string; dispatcherName: string;
dispatcherIsSupporter: boolean; dispatcherIsSupporter: boolean;
@@ -17,6 +17,21 @@ export interface ISceneryData {
dispatcherRate: number; dispatcherRate: number;
} }
export interface ISceneryData {
id: string;
name: string;
SUP: boolean;
authors: string;
availability: string;
checkpoints: string;
controlType: string;
lines: string;
project: string;
reqLevel: number;
routes: string;
signalType: string;
url: string;
}
// export interface ITrainData { // export interface ITrainData {
// trainNo: number; // trainNo: number;
// driverId: number; // driverId: number;
@@ -35,3 +50,4 @@ export interface ISceneryData {
// station?: ISceneryData; // station?: ISceneryData;
// } // }
+18 -1
View File
@@ -5,7 +5,7 @@ import { VitePWA } from 'vite-plugin-pwa';
export default defineConfig({ export default defineConfig({
server: { server: {
port: 8081 port: 8081,
}, },
plugins: [ plugins: [
vue(), vue(),
@@ -13,6 +13,22 @@ export default defineConfig({
registerType: 'prompt', registerType: 'prompt',
workbox: { workbox: {
globPatterns: ['**/*.{js,css,html,png,svg,img}'], globPatterns: ['**/*.{js,css,html,png,svg,img}'],
runtimeCaching: [
{
urlPattern: /^https:\/\/stacjownik-api-b9mrc\.ondigitalocean\.app\/api\/getSceneries/i,
handler: 'CacheFirst',
options: {
cacheName: 'sceneries-data-cache',
expiration: {
maxEntries: 250,
maxAgeSeconds: 60 * 60 * 24 * 7, // <== 7 days
},
cacheableResponse: {
statuses: [0, 200],
},
},
},
],
}, },
devOptions: { devOptions: {
enabled: true, enabled: true,
@@ -20,3 +36,4 @@ export default defineConfig({
}), }),
], ],
}); });