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({