diff --git a/frontend/src/lib/auth.ts b/frontend/src/lib/auth.ts index 6546c85..a156f66 100644 --- a/frontend/src/lib/auth.ts +++ b/frontend/src/lib/auth.ts @@ -4,6 +4,7 @@ import { browser } from '$app/environment'; const TOKEN_KEY = 'eventsnap_jwt'; const PIN_KEY = 'eventsnap_pin'; const USER_ID_KEY = 'eventsnap_user_id'; +const DISPLAY_NAME_KEY = 'eventsnap_display_name'; export const isAuthenticated = writable(false); @@ -22,11 +23,28 @@ export function getUserId(): string | null { return localStorage.getItem(USER_ID_KEY); } -export function setAuth(jwt: string, pin: string | null, userId: string): void { +export function getDisplayName(): string | null { + if (!browser) return null; + return localStorage.getItem(DISPLAY_NAME_KEY); +} + +export function getExpiry(): Date | null { + const token = getToken(); + if (!token) return null; + try { + const payload = JSON.parse(atob(token.split('.')[1])); + return payload.exp ? new Date(payload.exp * 1000) : null; + } catch { + return null; + } +} + +export function setAuth(jwt: string, pin: string | null, userId: string, displayName?: string): void { if (!browser) return; localStorage.setItem(TOKEN_KEY, jwt); if (pin) localStorage.setItem(PIN_KEY, pin); localStorage.setItem(USER_ID_KEY, userId); + if (displayName) localStorage.setItem(DISPLAY_NAME_KEY, displayName); isAuthenticated.set(true); } diff --git a/frontend/src/routes/account/+page.svelte b/frontend/src/routes/account/+page.svelte new file mode 100644 index 0000000..4e1977e --- /dev/null +++ b/frontend/src/routes/account/+page.svelte @@ -0,0 +1,137 @@ + + +
+ +
+
+

Mein Konto

+ Zur Galerie +
+
+ +
+ +
+
+
+ {#if displayName} + {displayName[0].toUpperCase()} + {:else} + ? + {/if} +
+
+

{displayName ?? 'Unbekannt'}

+ + {roleLabel(role)} + +
+
+ {#if expiry} +

Sitzung gültig bis {formatDate(expiry)}

+ {/if} +
+ + +
+

Wiederherstellungs-PIN

+

+ Du brauchst diesen PIN, um dein Konto auf einem anderen Gerät wiederherzustellen. Schreib ihn auf! +

+ {#if pin} +
+ {pin} + +
+ {:else} +
+ PIN nicht gespeichert. Nutze die Wiederherstellungs-Seite, um dich mit deinem PIN anzumelden. +
+ {/if} +
+ + +
+

Gerät wechseln?

+

+ Auf einem anderen Gerät kannst du dein Konto mit deinem Namen und PIN wiederherstellen. +

+ + Zur Wiederherstellungs-Seite → + +
+ + + +
+
diff --git a/frontend/src/routes/feed/+page.svelte b/frontend/src/routes/feed/+page.svelte index 9d4a156..fa24442 100644 --- a/frontend/src/routes/feed/+page.svelte +++ b/frontend/src/routes/feed/+page.svelte @@ -1,6 +1,6 @@
@@ -171,12 +167,15 @@ > Hochladen - + + + +
diff --git a/frontend/src/routes/join/+page.svelte b/frontend/src/routes/join/+page.svelte index e1856c7..81585aa 100644 --- a/frontend/src/routes/join/+page.svelte +++ b/frontend/src/routes/join/+page.svelte @@ -22,7 +22,7 @@ is_new: boolean; }>('/join', { display_name: displayName.trim() }); - setAuth(res.jwt, res.pin, res.user_id); + setAuth(res.jwt, res.pin, res.user_id, displayName.trim()); pin = res.pin; showPinModal = true; } catch (e) { diff --git a/frontend/src/routes/recover/+page.svelte b/frontend/src/routes/recover/+page.svelte index e9618e0..14c6905 100644 --- a/frontend/src/routes/recover/+page.svelte +++ b/frontend/src/routes/recover/+page.svelte @@ -25,7 +25,7 @@ user_id: string; }>('/recover', { display_name: displayName.trim(), pin: pin.trim() }); - setAuth(res.jwt, pin.trim(), res.user_id); + setAuth(res.jwt, pin.trim(), res.user_id, displayName.trim()); goto('/feed'); } catch (e) { if (e instanceof ApiError) {