From 09d2f255237f7a482813b39a060c351b1849a8a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Sat, 29 Jul 2023 23:26:51 +0200 Subject: [PATCH] Prace s mapou, refresh tokenu (tak nejak), uprava vypisu POI, pridani breadcrumbs --- package.json | 3 +- quasar.config.js | 8 ++- src/boot/axios.js | 37 ++++++++++- src/components/FormWrapper.vue | 2 +- src/components/MapWithMarkers.vue | 58 ++++++++++++++++ src/components/MapWrapper.vue | 12 ++++ src/components/copilots/CopilotEditForm.vue | 5 ++ src/components/copilots/CopilotsList.vue | 8 +-- src/components/flights/FlightBasicInfo.vue | 65 +++++++++++------- src/components/flights/FlightsList.vue | 21 +----- .../flights/form/FlightFormPhotos.vue | 16 ++++- src/components/inputs/MapGPSInput.vue | 66 ++++++++++++++++++- src/components/poi/POIEditForm.vue | 53 +++++++++++++-- src/components/poi/POIList.vue | 5 +- src/composables/datetimeUtils.js | 2 +- src/composables/dialog.js | 6 ++ src/composables/meta.js | 10 --- src/composables/objects/copilot.js | 9 ++- src/composables/objects/poi.js | 9 ++- src/composables/random.js | 2 +- src/graphql/apollo.js | 53 ++++++++++++--- src/graphql/fragments/airport.js | 2 + src/graphql/fragments/flight.js | 2 + src/graphql/queries/copilots.js | 7 ++ src/layouts/ProfileLayout.vue | 21 +++--- src/pages/profile/ProfilePage.vue | 10 +++ .../profile/details/AircraftDetailPage.vue | 17 +++-- .../profile/details/CopilotDetailPage.vue | 41 +++++------- .../profile/details/FlightDetailPage.vue | 40 ++++++++--- .../details/PointOfInterestDetailPage.vue | 20 +++++- src/pages/profile/forms/EditCopilotPage.vue | 37 +++++------ src/pages/profile/forms/EditFlightPage.vue | 15 +++-- .../profile/forms/EditPointOfInterestPage.vue | 18 +++-- src/pages/profile/lists/AircraftsPage.vue | 2 +- .../{SecondPilotPage.vue => CopilotsPage.vue} | 12 ++-- src/pages/profile/lists/FlightsPage.vue | 2 +- .../profile/lists/PointsOfInterestPage.vue | 2 +- src/router/index.js | 29 ++------ src/router/routes.js | 4 +- src/stores/App.js | 5 -- src/stores/User.js | 61 ++++++++--------- yarn.lock | 41 ++++++++++-- 42 files changed, 597 insertions(+), 241 deletions(-) create mode 100644 src/components/MapWithMarkers.vue create mode 100644 src/components/MapWrapper.vue create mode 100644 src/components/copilots/CopilotEditForm.vue delete mode 100644 src/composables/meta.js rename src/pages/profile/lists/{SecondPilotPage.vue => CopilotsPage.vue} (58%) diff --git a/package.json b/package.json index d80455f..5acc465 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "pinia": "^2.0.33", "quasar": "^2.12.0", "vue": "^3.2.47", - "vue-router": "^4.1.6" + "vue-router": "^4.1.6", + "vue3-google-map": "^0.15.0" }, "devDependencies": { "@quasar/app-vite": "^1.3.0", diff --git a/quasar.config.js b/quasar.config.js index 1a4ff92..3b1ac1a 100644 --- a/quasar.config.js +++ b/quasar.config.js @@ -29,7 +29,9 @@ module.exports = configure(function (/* ctx */) { // app boot file (/src/boot) // --> boot files are part of "main.js" // https://v2.quasar.dev/quasar-cli/boot-files - boot: [], + boot: [ + "axios", + ], // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css css: [ @@ -57,6 +59,10 @@ module.exports = configure(function (/* ctx */) { node: 'node18' }, + env: { + GOOGLE_MAPS_API_KEY: "AIzaSyAfTU1VntF9rp2D9TR4CFXIMALF5GLgsio" + }, + vueRouterMode: 'history', // available values: 'hash', 'history' // vueRouterBase, // vueDevtools, diff --git a/src/boot/axios.js b/src/boot/axios.js index 30c076c..cc9d1c2 100644 --- a/src/boot/axios.js +++ b/src/boot/axios.js @@ -1,7 +1,8 @@ import {boot} from 'quasar/wrappers' import axios from 'axios' +import {useUserStore} from "stores/User"; +import {useRouter} from "vue-router"; -const accessToken = localStorage.getItem("accessToken") const api = axios.create({ baseURL: 'http://localhost:8000', withCredentials: true, @@ -12,10 +13,42 @@ const api = axios.create({ }, }) +api.interceptors.request.use((config) => { + const token = useUserStore().getAccessToken(); + if (token) { + config.headers['Authorization'] = `Bearer ${token}` + } + + if (config.url === '/refresh') { + delete config.headers['Authorization']; + } + + return config; +}) + +// Response interceptor for API calls +api.interceptors.response.use((response) => { + return response +}, async function (error) { + const originalRequest = error.config; + if (error.response.status === 401 && !originalRequest._retry) { + originalRequest._retry = true; + const newToken = await useUserStore().refreshAccessToken().catch(err => { + console.error(err); + useRouter().push({to: "login"}); + return Promise.reject("Logged out"); + }) + api.defaults.headers.common['Authorization'] = 'Bearer ' + newToken; + return api(originalRequest); + } + return Promise.reject(error); +}); + + export default boot(({app}) => { // for use inside Vue files (Options API) through this.$axios and this.$api - app.config.globalProperties.$axios = axios + // app.config.globalProperties.$axios = axios // ^ ^ ^ this will allow you to use this.$axios (for Vue Options API form) // so you won't necessarily have to import axios in each vue file diff --git a/src/components/FormWrapper.vue b/src/components/FormWrapper.vue index 32689dd..a9bb9a6 100644 --- a/src/components/FormWrapper.vue +++ b/src/components/FormWrapper.vue @@ -17,7 +17,7 @@ const props = defineProps({ type: [Object, Boolean], required: false, default: () => ({ - label: "Save", + label: "Uložit", icon: "save", align: "left" }) diff --git a/src/components/MapWithMarkers.vue b/src/components/MapWithMarkers.vue new file mode 100644 index 0000000..11a3f14 --- /dev/null +++ b/src/components/MapWithMarkers.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/components/MapWrapper.vue b/src/components/MapWrapper.vue new file mode 100644 index 0000000..4f36f45 --- /dev/null +++ b/src/components/MapWrapper.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/copilots/CopilotEditForm.vue b/src/components/copilots/CopilotEditForm.vue new file mode 100644 index 0000000..10801af --- /dev/null +++ b/src/components/copilots/CopilotEditForm.vue @@ -0,0 +1,5 @@ + + + diff --git a/src/components/copilots/CopilotsList.vue b/src/components/copilots/CopilotsList.vue index 789cfa9..7ebdc7d 100644 --- a/src/components/copilots/CopilotsList.vue +++ b/src/components/copilots/CopilotsList.vue @@ -12,13 +12,13 @@ const props = defineProps({