Určitě se po ceste stalo něco vzrušujícího. Proč o tom nenapsat pár vět?
@@ -29,7 +29,8 @@
- Létat v sóle je super, ale ještě lepší je se o zážitek podělit. Jedním kliknutím můžeš svůj let zveřejnit a sdílet odkaz kde chceš. Třeba s tvým kopilotem.
+ Létat v sóle je super, ale ještě lepší je se o zážitek podělit. Jedním kliknutím můžeš svůj let zveřejnit a
+ sdílet odkaz kde chceš. Třeba s tvým kopilotem.
diff --git a/src/layouts/ProfileLayout.vue b/src/layouts/ProfileLayout.vue
index 0f6185f..e3d55ac 100644
--- a/src/layouts/ProfileLayout.vue
+++ b/src/layouts/ProfileLayout.vue
@@ -97,6 +97,7 @@ import SidebarNavigation from "components/navigation/SidebarNavigation.vue";
import TopMenuButton from "components/navigation/TopMenuButton.vue";
import {metaData} from "src/composables/meta";
import AvatarFromPhoto from "components/avatars/AvatarFromPhoto.vue";
+import {useAuthStore} from "stores/Auth";
const $q = useQuasar();
const $router = useRouter();
@@ -117,7 +118,7 @@ const toggleLeftDrawer = () => {
const {isQueryRunning, user} = storeToRefs(useLoggedUserStore());
const logout = () => {
- useLoggedUserStore().logout().then(() => {
+ useAuthStore().logout().then(() => {
$q.notify(successObject("Odhlášení bylo úspěšné"));
$router.push({name: "homepage"});
})
diff --git a/src/pages/public/user/ForgottenPasswordPage.vue b/src/pages/public/user/ForgottenPasswordPage.vue
index 84200b2..bb153c8 100644
--- a/src/pages/public/user/ForgottenPasswordPage.vue
+++ b/src/pages/public/user/ForgottenPasswordPage.vue
@@ -17,35 +17,29 @@ useMeta(() => metaData({
title: "Zapomenuté heslo",
}));
-const registerUser = () => {
+const requestPasswordChange = () => {
if (!form.value.validate()) return;
- return api.post('/forgotten-password', formData).then(response => {
- useAuthStore().login({email: formData.email, password: formData.password}).then(() => {
- $q.notify(successObject("Registrace úspěšná, vítej!"));
- router.push({name: "myFlights"});
- })
-
+ return api.post('/forgotten-password/request', formData).then(response => {
+ $q.notify(successObject("Žádost o změnu hesla odeslána, zkontroluj si svůj e-mail."))
}).catch(({response}) => {
- if (response.detail === 'User already exists') {
- $q.notify(errorObject("Uživatel s tímto e-mailem je již registrovaný. Zkus se přihlásit."));
+ if (response.status === 404) {
+ $q.notify(errorObject(`E-mail ${formData.email} není registrovaný.`));
} else {
- $q.notify(errorObject("Registrace se nepovedla, zkus to prosím znovu za chvíli"));
+ console.error(response)
+ $q.notify(errorObject("Při odesílání se stala chyba. Zkus to za chvíli znovu."));
}
})
}
const form = ref(null);
const formData = reactive({
- name: "",
email: "",
- password: ""
});
const rules = {
email: [isRequired, isValidEmail],
- password: [isRequired, minLength(4)]
}
@@ -62,7 +56,7 @@ const rules = {
@@ -75,7 +69,7 @@ const rules = {
+import {onMounted, reactive, ref} from "vue";
+import {useRoute, useRouter} from "vue-router";
+import {useMeta, useQuasar} from "quasar";
+import {errorObject, successObject} from "src/composables/dialog";
+import {useAppStore} from "stores/App";
+import {isRequired, isValidEmail, minLength} from "src/composables/form/rules";
+import {api} from "boot/axios";
+import {useAuthStore} from "stores/Auth";
+import {metaData} from "src/composables/meta";
+import {formatDatetime} from "../../../composables/datetimeUtils";
+
+const router = useRouter();
+const route = useRoute();
+const $q = useQuasar();
+
+useAppStore().setPageTitle("Změna hesla");
+useMeta(() => metaData({
+ title: "Změna hesla",
+}));
+
+const tokenInfo = reactive({
+ email: "",
+ name: "",
+ validity: null
+});
+const loadingTokenInfo = ref(true);
+
+onMounted(() => {
+ api.get(`/forgotten-password/token/${route.params.token}`).then((resp) => {
+ tokenInfo.email = resp.data.user_email;
+ tokenInfo.name = resp.data.user_name;
+ tokenInfo.validity = new Date(resp.data.token_validity);
+ }).finally(() => loadingTokenInfo.value = false);
+})
+
+const resetPassword = () => {
+ if (!form.value.validate()) return;
+
+ return api.post('/forgotten-password/reset', formData).then(response => {
+ useAuthStore().login({email: tokenInfo.email, password: formData.password}).then(() => {
+ $q.notify(successObject("Heslo úspěšně změněno. Vítej zpět!"));
+ router.push({name: "myFlights"});
+ });
+ }).catch(({response}) => {
+ console.error(response)
+ $q.notify(errorObject("Při odesílání se stala chyba. Zkus to za chvíli znovu."));
+ })
+}
+
+const form = ref(null);
+const formData = reactive({
+ password: "",
+ token: route.params.token
+});
+
+
+const rules = {
+ password: [isRequired],
+}
+
+
+
+
+
+
+
+
+ Změna hesla
+
+
+
+
+
+
+
+
+
+
+ Token pro reset hesla je platný do {{ formatDatetime(tokenInfo.validity) }}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Zpět na login
+
+
+
+
+
+
diff --git a/src/router/routes.js b/src/router/routes.js
index 6b2b054..7494c30 100644
--- a/src/router/routes.js
+++ b/src/router/routes.js
@@ -4,6 +4,7 @@ const routes = [
{path: '/login', name: "login", component: () => import('pages/public/user/LoginPage.vue'), meta: {layout: PlainLayout}},
{path: '/registrace', name: "registration", component: () => import('pages/public/user/RegisterPage.vue'), meta: {layout: PlainLayout}},
{path: '/zapomenute-heslo', name: "forgottenPassword", component: () => import('pages/public/user/ForgottenPasswordPage.vue'), meta: {layout: PlainLayout}},
+ {path: '/zapomenute-heslo/:token', name: "resetPassword", component: () => import('pages/public/user/PasswordResetPage.vue'), meta: {layout: PlainLayout}},
{path: '', name: "homepage", component: () => import('pages/public/IndexPage.vue'), meta: {layout: PlainLayout}},
diff --git a/src/stores/Auth.js b/src/stores/Auth.js
index a067da6..ba3c5d2 100644
--- a/src/stores/Auth.js
+++ b/src/stores/Auth.js
@@ -1,6 +1,7 @@
import {defineStore} from 'pinia'
import {api} from "boot/axios";
import {cookies} from "boot/cookies";
+import {useFlightsStore} from "stores/Flights";
export const useAuthStore = defineStore('Auth', () => {
const login = async (formData) => {
@@ -12,6 +13,7 @@ export const useAuthStore = defineStore('Auth', () => {
const logout = () => {
return api.post("/logout").then(response => {
unsetTokens();
+ useFlightsStore().flights = [];
});
};
diff --git a/src/stores/LoggedUser.js b/src/stores/LoggedUser.js
index 66d329d..43764d8 100644
--- a/src/stores/LoggedUser.js
+++ b/src/stores/LoggedUser.js
@@ -7,28 +7,28 @@ import {mutate, query} from "stores/helpers";
import {cookies} from "boot/cookies";
export const useLoggedUserStore = defineStore('LoggedUser', () => {
- const user = ref(null);
- const isQueryRunning = ref(false);
- const isMutationRunning = ref(false);
+ const user = ref(null);
+ const isQueryRunning = ref(false);
+ const isMutationRunning = ref(false);
- const fetchLoggedUserDetail = ({refresh}) => query({
- isQueryRunning,
- query: LOGGED_USER_DETAIL,
- refreshUnauthorized: refresh || false,
- }).then(item => {
- user.value = item;
- return item;
- });
+ const fetchLoggedUserDetail = ({refresh}) => query({
+ isQueryRunning,
+ query: LOGGED_USER_DETAIL,
+ refreshUnauthorized: refresh || false,
+ }).then(item => {
+ user.value = item;
+ return item;
+ });
- const update = (input) => mutate({
- isMutationRunning,
- mutation: EDIT_USER,
- variables: {input}
- }).then(item => {
- user.value = item;
- return item;
- });
+ const update = (input) => mutate({
+ isMutationRunning,
+ mutation: EDIT_USER,
+ variables: {input}
+ }).then(item => {
+ user.value = item;
+ return item;
+ });
- return {isQueryRunning, isMutationRunning, user, fetchLoggedUserDetail, update}
+ return {isQueryRunning, isMutationRunning, user, fetchLoggedUserDetail, update}
});