-
+
+
diff --git a/software/src/data/api/accountApi.ts b/software/src/data/api/accountApi.ts
new file mode 100644
index 0000000..ea1202a
--- /dev/null
+++ b/software/src/data/api/accountApi.ts
@@ -0,0 +1,15 @@
+import axios from "axios"
+import { AccountModel } from "../models/accountModel"
+
+const BASE_URL = "http://localhost:3000/accounts"
+
+export async function login(username: string, password: string) {
+ return await axios.post(BASE_URL + "/login", {
+ username: username,
+ password: password
+ })
+}
+
+export async function register(account: AccountModel) {
+ return await axios.post(BASE_URL + "/register", account)
+}
\ No newline at end of file
diff --git a/software/src/data/enums/bannerStateEnum.ts b/software/src/data/enums/bannerStateEnum.ts
index 53b2fde..2167388 100644
--- a/software/src/data/enums/bannerStateEnum.ts
+++ b/software/src/data/enums/bannerStateEnum.ts
@@ -2,5 +2,7 @@ export enum BannerStateEnum {
DATABASERESETSUCCESSFUL,
ERROR,
WRONGLOGIN,
- LOGINSUCCESSFUL
+ LOGINSUCCESSFUL,
+ REGISTERSUCCESSFUL,
+ USERNAMEINUSE
}
\ No newline at end of file
diff --git a/software/src/data/models/bannerModel.ts b/software/src/data/models/bannerModel.ts
deleted file mode 100644
index 737a09d..0000000
--- a/software/src/data/models/bannerModel.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { BannerStateEnum } from "../enums/bannerStateEnum"
-
-export default class BannerModel {
- show: boolean = false
- bannerState: BannerStateEnum = BannerStateEnum.ERROR
-}
\ No newline at end of file
diff --git a/software/src/data/stores/feedbackStore.ts b/software/src/data/stores/feedbackStore.ts
new file mode 100644
index 0000000..45f90dd
--- /dev/null
+++ b/software/src/data/stores/feedbackStore.ts
@@ -0,0 +1,63 @@
+import { defineStore } from "pinia";
+import { ref } from "vue";
+import { BannerStateEnum } from "../enums/bannerStateEnum";
+import { Composer } from 'vue-i18n';
+
+export const useFeedbackStore = defineStore("feedbackStore", {
+ state: () => ({
+ showBanner: ref(false),
+ title: ref(""),
+ color: ref(""),
+ icon: ref(""),
+ $i18n: {}
+ }),
+
+ getters: {
+ i18n(): Composer {
+ return this.$i18n.global as Composer
+ }
+ },
+
+ actions: {
+ changeBanner(bannerState: BannerStateEnum) {
+ switch (bannerState) {
+ case BannerStateEnum.ERROR: {
+ this.title = this.i18n.t('bannerMessages.error'); break;
+ }
+ case BannerStateEnum.DATABASERESETSUCCESSFUL: {
+ this.title = this.i18n.t('bannerMessages.databaseResetSuccessful'); break;
+ }
+ case BannerStateEnum.LOGINSUCCESSFUL: {
+ this.title = this.i18n.t('bannerMessages.loginSuccessful'); break;
+ }
+ case BannerStateEnum.WRONGLOGIN: {
+ this.title = this.i18n.t('bannerMessages.wrongLogin'); break;
+ }
+ case BannerStateEnum.REGISTERSUCCESSFUL: {
+ this.title = this.i18n.t("bannerMessages.registerSuccessful"); break;
+ }
+ case BannerStateEnum.USERNAMEINUSE: {
+ this.title = this.i18n.t("bannerMessages.usernameInUse"); break;
+ }
+ }
+
+ switch (bannerState) {
+ case BannerStateEnum.ERROR:
+ case BannerStateEnum.WRONGLOGIN:
+ case BannerStateEnum.USERNAMEINUSE:
+ this.color = "red"
+ this.icon = "mdi-alert-circle"
+ break;
+
+ case BannerStateEnum.DATABASERESETSUCCESSFUL:
+ case BannerStateEnum.LOGINSUCCESSFUL:
+ case BannerStateEnum.REGISTERSUCCESSFUL:
+ this.color = "green"
+ this.icon = "mdi-check-circle"
+ break
+ }
+
+ this.showBanner = true
+ }
+ }
+})
\ No newline at end of file
diff --git a/software/src/data/stores/userStore.ts b/software/src/data/stores/userStore.ts
index 4d6bf6a..14fd0d8 100644
--- a/software/src/data/stores/userStore.ts
+++ b/software/src/data/stores/userStore.ts
@@ -2,11 +2,61 @@ import { defineStore } from "pinia";
import { useLocalStorage } from "@vueuse/core";
import { ThemeEnum } from "../enums/themeEnums";
import { LanguageEnum } from "../enums/languageEnum";
+import { AccountModel } from "../models/accountModel";
+import { login, register } from "../api/accountApi";
+import { useFeedbackStore } from "./feedbackStore";
+import { BannerStateEnum } from "../enums/bannerStateEnum";
-export const useUserStore = defineStore('user', {
+export const useUserStore = defineStore('userStore', {
state: () => ({
theme: useLocalStorage
("hackmycart/userStore/theme", ThemeEnum.DARKRED),
language: useLocalStorage("hackmycart/userStore/language", LanguageEnum.GERMAN),
- userAccountId: useLocalStorage("hackmycart/userStore/userAccountId", -1)
- })
+ userAccount: useLocalStorage("hackmycart/userStore/userAccount", new AccountModel()),
+ loggedIn: useLocalStorage("hackmycart/userStore/loggedIn", false)
+ }),
+
+ actions: {
+ async login(username: string, password: string) {
+ const feedbackStore = useFeedbackStore()
+
+ await login(username, password)
+ .then(result => {
+ if (result.data.loginSuccessful) {
+ this.userAccount = result.data.account
+ this.loggedIn = true
+
+ feedbackStore.changeBanner(BannerStateEnum.LOGINSUCCESSFUL)
+ }
+ })
+ .catch(error => {
+ this.userAccount = new AccountModel()
+ this.loggedIn = false
+
+ feedbackStore.changeBanner(BannerStateEnum.WRONGLOGIN)
+ })
+ },
+
+ async registerAccount(account: AccountModel) {
+ const feedbackStore = useFeedbackStore()
+
+ await register(account)
+ .then(res => {
+ console.log(res)
+ if (res.status == 200) {
+ feedbackStore.changeBanner(BannerStateEnum.REGISTERSUCCESSFUL)
+ }
+ })
+ .catch((error) => {
+ console.log(error)
+ if (error.status == 400) {
+ feedbackStore.changeBanner(BannerStateEnum.USERNAMEINUSE)
+ }
+ })
+ },
+
+ logout() {
+ this.userAccount = new AccountModel()
+ this.loggedIn = false
+ }
+ }
})
\ No newline at end of file
diff --git a/software/src/locales/de.json b/software/src/locales/de.json
index 3465ae8..3d87ea6 100644
--- a/software/src/locales/de.json
+++ b/software/src/locales/de.json
@@ -62,7 +62,9 @@
"loginSuccessful": "Login erfolgreich!",
"wrongLogin": "Falscher Username oder falsches Passwort!",
"error": "Es ist ein Fehler aufgetreten...",
- "databaseResetSuccessful": "Datenbank erfolgreich zurück gesetzt!"
+ "databaseResetSuccessful": "Datenbank erfolgreich zurück gesetzt!",
+ "registerSuccessful": "Account erfolgreich erstellt!",
+ "usernameInUse": "Der Accountname ist bereits vergeben!"
},
"oclock": "Uhr"
}
diff --git a/software/src/locales/en.json b/software/src/locales/en.json
index 1cf6417..ac2574e 100644
--- a/software/src/locales/en.json
+++ b/software/src/locales/en.json
@@ -62,7 +62,9 @@
"loginSuccessful": "Login erfolgreich!",
"wrongLogin": "Falscher Username oder falsches Passwort!",
"error": "Some error occurred...",
- "databaseResetSuccessful": "Database reset successful!"
+ "databaseResetSuccessful": "Database reset successful!",
+ "usernameInUse": "Username always in use!",
+ "registerSuccessful": "Account successfully created!"
},
"oclock": "o'clock"
}
diff --git a/software/src/main.ts b/software/src/main.ts
index 53bd27b..8a853fb 100644
--- a/software/src/main.ts
+++ b/software/src/main.ts
@@ -5,6 +5,7 @@ import vuetify from './plugins/vuetify'
import router from './plugins/router'
import pinia from './plugins/pinia'
import { i18n } from './plugins/i18n'
+import { useFeedbackStore } from './data/stores/feedbackStore'
createApp(App)
.use(vuetify)
@@ -12,3 +13,6 @@ createApp(App)
.use(pinia)
.use(i18n)
.mount('#app')
+
+const feedbackStore = useFeedbackStore()
+feedbackStore.$i18n = i18n
\ No newline at end of file
diff --git a/software/src/pages/accountPage/index.vue b/software/src/pages/accountPage/index.vue
index a03c718..cd02af7 100644
--- a/software/src/pages/accountPage/index.vue
+++ b/software/src/pages/accountPage/index.vue
@@ -1,23 +1,83 @@
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Save
+
diff --git a/software/src/pages/loginPage/index.vue b/software/src/pages/loginPage/index.vue
index 38e3c81..55fe8d3 100644
--- a/software/src/pages/loginPage/index.vue
+++ b/software/src/pages/loginPage/index.vue
@@ -2,25 +2,23 @@
import { ref } from 'vue';
import loginForm from './loginForm.vue';
import registerForm from './registerForm.vue';
-import BannerModel from '@/data/models/bannerModel';
import alertBanner from '@/components/alertBanner.vue';
const showRegisterCard = ref(false)
-const banner = ref(new BannerModel())
-
+
-
+
@@ -28,7 +26,7 @@ const banner = ref(new BannerModel())
-
+
diff --git a/software/src/pages/loginPage/loginForm.vue b/software/src/pages/loginPage/loginForm.vue
index 7c0f443..40c2745 100644
--- a/software/src/pages/loginPage/loginForm.vue
+++ b/software/src/pages/loginPage/loginForm.vue
@@ -1,33 +1,15 @@
diff --git a/software/src/pages/loginPage/registerForm.vue b/software/src/pages/loginPage/registerForm.vue
index 8996347..7109885 100644
--- a/software/src/pages/loginPage/registerForm.vue
+++ b/software/src/pages/loginPage/registerForm.vue
@@ -1,31 +1,13 @@
@@ -103,7 +85,7 @@ function registerUser() {
+ @click="userStore.registerAccount(newUser)">
{{ $t('account.register') }}
diff --git a/software/src/pages/preferencesPage/index.vue b/software/src/pages/preferencesPage/index.vue
index d57e4b8..23592d2 100644
--- a/software/src/pages/preferencesPage/index.vue
+++ b/software/src/pages/preferencesPage/index.vue
@@ -2,15 +2,12 @@
import { Ref, ref } from 'vue';
import pageSetup from './pageSetup.vue';
import systemSetup from './systemSetup.vue';
-import BannerModel from '@/data/models/bannerModel';
import alertBanner from '@/components/alertBanner.vue';
-
-const banner: Ref = ref(new BannerModel())
-
+
@@ -20,7 +17,7 @@ const banner: Ref = ref(new BannerModel())
-
+
diff --git a/software/src/pages/preferencesPage/systemSetup.vue b/software/src/pages/preferencesPage/systemSetup.vue
index ec8eddc..73afb46 100644
--- a/software/src/pages/preferencesPage/systemSetup.vue
+++ b/software/src/pages/preferencesPage/systemSetup.vue
@@ -1,16 +1,15 @@