diff --git a/package.json b/package.json index 5bf20f5..5d1bdf3 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "type": "module", "scripts": { + "server": "node server.js", "dev": "vite", "build": "run-p type-check \"build-only {@}\" --", "preview": "vite preview", diff --git a/server.js b/server.js new file mode 100644 index 0000000..ab29e7a --- /dev/null +++ b/server.js @@ -0,0 +1,23 @@ +import http from "http"; + +const host = 'localhost'; +const port = 8000; + +const user = JSON.stringify({ + name: "Joe User", +}); + +const requestListener = function (req, res) { + res.setHeader("Content-Type", "application/json"); + switch (req.url) { + case "/login": + res.writeHead(200); + res.end(user); + break + } +}; + +const server = http.createServer(requestListener); +server.listen(port, host, () => { + console.log(`Server is running on http://${host}:${port}`); +}); diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue index d47956d..32ddf41 100644 --- a/src/components/Sidebar.vue +++ b/src/components/Sidebar.vue @@ -1,18 +1,57 @@ @@ -24,10 +63,16 @@ aside { display: flex; flex-direction: row; height: 100%; + .act-avatar { + display: none; + } } @media (screen(sm)) { aside { flex-direction: column; + .act-avatar { + display: block; + } } } diff --git a/src/components/TopBar.vue b/src/components/TopBar.vue index 72e2e7b..27d2a33 100644 --- a/src/components/TopBar.vue +++ b/src/components/TopBar.vue @@ -1,77 +1,104 @@ + - diff --git a/src/router/index.ts b/src/router/index.ts index 8b19960..71060c4 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,6 +1,7 @@ import { createRouter, createWebHistory } from 'vue-router' import AboutView from '../views/AboutView.vue' import HomeView from '../views/HomeView.vue' +import LoginView from '../views/LoginView.vue' import ProfileView from '../views/ProfileView.vue' import StickerView from '../views/StickerView.vue' @@ -39,6 +40,14 @@ const router = createRouter({ name: 'sticker', path: '/sticker', }, + { + component: LoginView, + meta: { + title: 'Login', + }, + name: 'login', + path: '/login', + }, ], }) diff --git a/src/stores/userActionsStore.ts b/src/stores/userActionsStore.ts new file mode 100644 index 0000000..29c2821 --- /dev/null +++ b/src/stores/userActionsStore.ts @@ -0,0 +1,18 @@ +export const userActions = [{ + icon: 'pi pi-inbox', + label: 'Inbox', + needsAuth: true, +}, { + icon: 'pi pi-bell', + label: 'Notifications', + needsAuth: true, +}, { + icon: 'pi pi-cog', + label: 'Settings', + needsAuth: true, +}, { + cmd: 'logout', + icon: 'pi pi-sign-out', + label: 'Logout', + needsAuth: true, +}]; diff --git a/src/stores/userStore.ts b/src/stores/userStore.ts new file mode 100644 index 0000000..6fd3cbd --- /dev/null +++ b/src/stores/userStore.ts @@ -0,0 +1,48 @@ +import { defineStore } from 'pinia' + +const anonymous = { + name: 'Anonymous', + username: null, +}; + +export const useUserStore = defineStore('user', { + actions: { + async login(username: string, password: string) { + const response = await fetch( + "/login", + { + method: 'POST', + }, + ); + const json = await response.json(); + // this.user.name = json.name; + this.user = { + name: json.name, + username: "username", + } + return json; + }, + logout() { + console.log('logout2'); + // this.user = anonymous; + // this.hasChanged = true; + // this.user.name = 'Anonymous'; + this.$reset(); + // this.$patch({user: anonymous}); + }, + }, + getters: { + initials: (state): string => { + return state.user.name[0] || ''; + }, + isAnonymous: (state): boolean => { + return state.user.name === 'Anonymous'; + }, + }, + state: () => { + console.log('reset state'); + return { + user: anonymous, + }; + }, +}) diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue new file mode 100644 index 0000000..eef1cd7 --- /dev/null +++ b/src/views/LoginView.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/src/views/ProfileView.vue b/src/views/ProfileView.vue index ab9b8b9..1cc2ccb 100644 --- a/src/views/ProfileView.vue +++ b/src/views/ProfileView.vue @@ -9,11 +9,13 @@ import Panel from 'primevue/panel'; import Sticker from "@/components/Sticker.vue"; import Timeline from 'primevue/timeline'; import {useRoute} from 'vue-router'; +import { useUserStore } from "@/stores/userStore"; + +const userStore = useUserStore(); const route = useRoute(); -const uuid = ref('uuid') -uuid.value = route.params.uuid; +const uuid = ref(route.params.uuid as string); const first = computed(() => { const parts = uuid.value.split('-') @@ -68,7 +70,7 @@ const events = [{ - +
@@ -76,8 +78,8 @@ const events = [{ -
-
+
+
-
- +
+ @@ -126,9 +128,13 @@ const events = [{ diff --git a/vite.config.ts b/vite.config.ts index 4217010..518e7a7 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -8,11 +8,21 @@ import vueDevTools from 'vite-plugin-vue-devtools' export default defineConfig({ plugins: [ vue(), - vueDevTools(), + // vueDevTools(), ], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) }, }, + server: { + proxy: { + '/login': { + target: 'http://localhost:8000', + changeOrigin: true, + secure: false, + // rewrite: (path) => path.replace(/^\/api/, '') + }, + }, + }, })