diff --git a/quasar.config.js b/quasar.config.js
index b7d3f55..cebc930 100644
--- a/quasar.config.js
+++ b/quasar.config.js
@@ -29,6 +29,7 @@ module.exports = configure(function (ctx) {
// --> boot files are part of "main.js"
// https://v2.quasar.dev/quasar-cli/boot-files
boot: [
+ "cookies",
"axios",
"apollo",
"chartJs"
@@ -109,6 +110,7 @@ module.exports = configure(function (ctx) {
// Quasar plugins
plugins: [
+ 'Cookies',
'Dialog',
'Meta',
'Notify'
diff --git a/src/boot/apollo.js b/src/boot/apollo.js
index f32c893..e64d38d 100644
--- a/src/boot/apollo.js
+++ b/src/boot/apollo.js
@@ -10,6 +10,7 @@ import {createUploadLink} from "apollo-upload-client";
const handleRefreshToken = (store, router, forward, operation) => {
if (!operation.query?._refreshUnauthorizedUser) return;
+ console.log("refreshing token, ", operation.query);
return fromPromise(useUserStore(store).refreshAccessToken()
.catch((error) => {
Notify.create(warningObject("Tvoje přihlášení vypřešlo. Přihlaš se prosím znovu."));
@@ -34,6 +35,7 @@ export const apolloWrapper = {};
export default (({store, router}) => {
const uploadLink = createUploadLink({
uri: process.env.API_URL + '/graphql',
+ credentials: 'include'
})
const authLink = new ApolloLink((operation, forward) => {
diff --git a/src/boot/cookies.js b/src/boot/cookies.js
new file mode 100644
index 0000000..bda4ef9
--- /dev/null
+++ b/src/boot/cookies.js
@@ -0,0 +1,9 @@
+import {Cookies} from 'quasar'
+import {boot} from "quasar/wrappers";
+
+let cookies = Cookies;
+export default boot(({ssrContext}) => {
+ cookies = process.env.SERVER ? Cookies.parseSSR(ssrContext) : Cookies
+});
+
+export {cookies}
diff --git a/src/layouts/ProfileLayout.vue b/src/layouts/ProfileLayout.vue
index b914aa1..28e0d9a 100644
--- a/src/layouts/ProfileLayout.vue
+++ b/src/layouts/ProfileLayout.vue
@@ -3,12 +3,12 @@
@@ -21,9 +21,9 @@
@@ -34,18 +34,24 @@
-
-
+
-
-
+
diff --git a/src/pages/public/AircraftDetailPage.vue b/src/pages/public/AircraftDetailPage.vue
index eb98497..ee647a6 100644
--- a/src/pages/public/AircraftDetailPage.vue
+++ b/src/pages/public/AircraftDetailPage.vue
@@ -1,22 +1,11 @@
-
-
@@ -66,7 +64,8 @@ useAppStore().setBreadcrumbs([
-
+
+
Lety
diff --git a/src/pages/public/PointOfInterestDetailPage.vue b/src/pages/public/PointOfInterestDetailPage.vue
index 3bc2720..621a4a3 100644
--- a/src/pages/public/PointOfInterestDetailPage.vue
+++ b/src/pages/public/PointOfInterestDetailPage.vue
@@ -1,13 +1,3 @@
-
-
-
@@ -63,10 +72,10 @@ usePhotosStore().fetchPublic({copilotId: copilot.value.id})
Společné lety
diff --git a/src/stores/Copilots.js b/src/stores/Copilots.js
index 990467b..71d9d8e 100644
--- a/src/stores/Copilots.js
+++ b/src/stores/Copilots.js
@@ -18,12 +18,15 @@ export const useCopilotsStore = defineStore('Copilots', () => {
}).then(item => copilot.value = item);
};
- const fetchPublicDetail = (id, username) => {
+ const fetchPublicDetail = (copilotId, username) => {
return query({
isQueryRunning,
query: COPILOT_PUBLIC_DETAIL,
- variables: {id, pilotUsername: username},
- }).then(item => copilot.value = item);
+ variables: {id: copilotId, pilotUsername: username},
+ }).then(item => {
+ copilot.value = item;
+ return item;
+ });
};
const fetch = () => {
diff --git a/src/stores/User.js b/src/stores/User.js
index c318467..0993083 100644
--- a/src/stores/User.js
+++ b/src/stores/User.js
@@ -4,95 +4,91 @@ import {EDIT_USER} from "src/graphql/mutations/user";
import {LOGGED_USER_DETAIL, USER_DETAIL} from "src/graphql/queries/user";
import {ref} from "vue";
import {mutate, query} from "stores/helpers";
+import {cookies} from "boot/cookies";
export const useUserStore = defineStore('LoggedUser', () => {
- const user = ref(null);
- const publicUser = ref(null);
- const isQueryRunning = ref(false);
- const isMutationRunning = ref(false);
- const isRefreshing = ref(false);
+ const user = ref(null);
+ const publicUser = ref(null);
+ const isQueryRunning = ref(false);
+ const isMutationRunning = ref(false);
+ const isRefreshing = ref(false);
- const fetchLoggedUserDetail = ({refresh}) => query({
- isQueryRunning,
- query: LOGGED_USER_DETAIL,
- refreshUnauthorized: refresh || false,
- }).then(item => {
- user.value = item;
- return item;
- });
-
- const fetchPublicUserDetail = (username) => query({
- isQueryRunning,
- query: USER_DETAIL,
- variables: {username}
- }).then(item => {
- publicUser.value = item;
- return item;
- });
-
- const update = (input) => mutate({
- isMutationRunning,
- mutation: EDIT_USER,
- variables: {input}
- }).then(item => {
- user.value = item;
- return item;
- });
-
- const register = async (formData) => {
- return api.post('/registration', formData).then(response => {
- const registeredUser = response.data;
- const isSuccess = response.status === 201
- })
- };
-
- const login = async (formData) => {
- return api.post("/login", formData).then(({data}) => {
- setTokens(data);
- user.value = data.user;
- })
- };
-
- const logout = () => {
- return api.post("/logout").then(response => {
- localStorage.removeItem("accessToken");
- localStorage.removeItem("accessTokenValidity");
- user.value = null;
+ const fetchLoggedUserDetail = ({refresh}) => query({
+ isQueryRunning,
+ query: LOGGED_USER_DETAIL,
+ refreshUnauthorized: refresh || false,
+ }).then(item => {
+ user.value = item;
+ return item;
});
- };
- const setTokens = ({access_token, access_token_validity}) => {
- const now = new Date().getTime() / 1000;
- localStorage.setItem("accessToken", access_token);
- localStorage.setItem("accessTokenValidity", now + access_token_validity);
- };
+ const fetchPublicUserDetail = (username) => query({
+ isQueryRunning,
+ query: USER_DETAIL,
+ variables: {username}
+ }).then(item => {
+ publicUser.value = item;
+ return item;
+ });
- const getAccessToken = () => {
- // TODO: https://dev.to/quasar/quasar-ssr-using-cookies-with-other-libs-services-4nkl
- if (typeof localStorage === 'undefined') return null;
+ const update = (input) => mutate({
+ isMutationRunning,
+ mutation: EDIT_USER,
+ variables: {input}
+ }).then(item => {
+ user.value = item;
+ return item;
+ });
- const tokenValidity = localStorage.getItem("accessTokenValidity");
- const now = new Date().getTime() / 1000;
+ const register = async (formData) => {
+ return api.post('/registration', formData).then(response => {
+ const registeredUser = response.data;
+ const isSuccess = response.status === 201
+ })
+ };
- if (tokenValidity < now) {
- localStorage.removeItem("accessToken");
- localStorage.removeItem("accessTokenValidity");
+ const login = async (formData) => {
+ return api.post("/login", formData).then(({data}) => {
+ setTokens(data);
+ user.value = data.user;
+ })
+ };
+
+ const logout = () => {
+ return api.post("/logout").then(response => {
+ unsetTokens();
+ user.value = null;
+ });
+ };
+
+ const unsetTokens = () => {
+ cookies.remove("accessToken")
+ };
+
+ const setTokens = ({access_token, access_token_validity}) => {
+ const now = new Date().getTime() / 1000;
+ // TODO: asi nefunguje expirace
+ cookies.set("accessToken", access_token, {expires: now + access_token_validity})
+ };
+
+ const getAccessToken = () => {
+ return cookies.get("accessToken");
+ };
+
+ const hasAccessToken = () => !!getAccessToken();
+
+ const refreshAccessToken = async () => api.post("/refresh")
+ .then(({data}) => {
+ setTokens(data);
+ console.log("token refreshed");
+ return data.access_token;
+ }).catch((e) => {
+ console.log("cannot refresh token", e);
+ })
+
+ return {
+ isQueryRunning, isMutationRunning, user, publicUser, fetchLoggedUserDetail, fetchPublicUserDetail, update,
+ register, login, logout,
+ getAccessToken, hasAccessToken, refreshAccessToken, isRefreshing
}
-
- return localStorage.getItem(`accessToken`);
- };
-
- const hasAccessToken = () => !!localStorage.getItem("accessToken");
-
- const refreshAccessToken = async () => api.post("/refresh")
- .then(({data}) => {
- setTokens(data);
- return data.access_token;
- });
-
- return {
- isQueryRunning, isMutationRunning, user, publicUser, fetchLoggedUserDetail, fetchPublicUserDetail, update,
- register, login, logout,
- getAccessToken, hasAccessToken, refreshAccessToken, isRefreshing
- }
});