From 5fe4557d943fa3c32d9ba987ef2447a03de231f5 Mon Sep 17 00:00:00 2001
From: Pascal Syma
Date: Fri, 31 Jul 2026 19:22:48 +0200
Subject: [PATCH] refactor(app): simplify head link and meta rendering, add
more titles and descriptions
---
TODO.md | 10 +++++-----
app/app.vue | 14 ++------------
app/lang/de.json | 8 +++++---
app/lang/en.json | 8 +++++---
app/pages/hunt/[huntSlug]/showcase.vue | 7 +++++++
app/pages/index.vue | 14 ++++++++++++++
app/pages/profile.vue | 5 +++++
server/api/auth/register.post.ts | 1 +
8 files changed, 44 insertions(+), 23 deletions(-)
diff --git a/TODO.md b/TODO.md
index 4f56410..9efc465 100644
--- a/TODO.md
+++ b/TODO.md
@@ -25,20 +25,20 @@
- [ ] Fetch name from LDAP
- [ ] Social Login
- **Hunt Admin**
- - [ ] Create hunt
- - [ ] Add Questions
+ - [x] Create hunt
+ - [x] Add Questions
- [ ] View Answers on Map
- [x] Image Diashow
- **Hunt User**
- [x] View all images on one page
- [x] i18n data
- - [ ] Mark image as private
+ - [x] Mark image as private
- [ ] How-to/Guide/Good explanation
- - [ ] Leave/Remove/Edit team
+ - [x] Leave/Remove/Edit team
- [ ] Support chat
- [ ] Copy team from different hunt
- [ ] Get Geo-Location
- - [ ] View other answers
+ - [-] View other answers
- [ ] View other reviews and scores
- [x] Process image uploads (resize, remove EXIF, etc.)
- [ ] Review other answers (Fan-Favorite)
diff --git a/app/app.vue b/app/app.vue
index 0ca68a4..e2fe117 100644
--- a/app/app.vue
+++ b/app/app.vue
@@ -22,19 +22,9 @@ const { s3Bucket, s3Host } = useRuntimeConfig().public;
>
{{ title }}
-
-
-
-
+
-
-
-
+
diff --git a/app/lang/de.json b/app/lang/de.json
index f1956be..93d6ae1 100644
--- a/app/lang/de.json
+++ b/app/lang/de.json
@@ -176,12 +176,12 @@
"how_it_works": "So funktioniert es",
"login_to_see_hunts": "Melde dich an, um deine beigetretenen Hunts zu sehen und neuen beizutreten!",
"step_number": "Schritt {n}",
+ "step_quests_text": "Erkunde die Quests, mache kreative Fotos und reiche deine Antworten ein.",
+ "step_quests_title": "Quests erfüllen",
"step_register_text": "Erstelle in Sekunden ein kostenloses Konto und erhalte Zugang zu allen Hunts.",
"step_register_title": "Registrieren",
"step_team_text": "Gründe ein Team mit Freunden oder tritt einem bestehenden Team mit einem Einladungscode bei.",
"step_team_title": "Team gründen",
- "step_quests_text": "Erkunde die Quests, mache kreative Fotos und reiche deine Antworten ein.",
- "step_quests_title": "Quests erfüllen",
"step_win_text": "Sammle Punkte, klettere die Rangliste hinauf und feiere in der Showcase.",
"step_win_title": "Punkte gewinnen"
},
@@ -205,6 +205,7 @@
"role_changed": "Rolle aktualisiert!",
"role_confirm": "Möchtest du die Rolle von {name} zu {role} ändern?",
"search_user": "Benutzer per E-Mail suchen...",
+ "title": "Profil",
"uploaded_pictures": "Hochgeladene Bilder",
"user_management": "Benutzerverwaltung"
},
@@ -281,6 +282,7 @@
},
"teams": "Teams",
"third_place": "Dritter Platz",
+ "title": "Abschluss",
"total_points": "Punkte erzielt",
"users": "Spieler"
}
@@ -367,4 +369,4 @@
"uploadFile": "Datei hochladen",
"voteRating": "vote rating {value} of {max}"
}
-}
+}
\ No newline at end of file
diff --git a/app/lang/en.json b/app/lang/en.json
index 913e3f1..b006450 100644
--- a/app/lang/en.json
+++ b/app/lang/en.json
@@ -176,12 +176,12 @@
"how_it_works": "How it works",
"login_to_see_hunts": "Login to see your joined hunts and join new ones!",
"step_number": "Step {n}",
+ "step_quests_text": "Explore the quests, take creative photos and submit your answers.",
+ "step_quests_title": "Complete quests",
"step_register_text": "Create a free account in seconds and get access to all hunts.",
"step_register_title": "Register",
"step_team_text": "Team up with friends or join an existing team with an invite code.",
"step_team_title": "Form a team",
- "step_quests_text": "Explore the quests, take creative photos and submit your answers.",
- "step_quests_title": "Complete quests",
"step_win_text": "Collect points, climb the leaderboard and celebrate in the showcase.",
"step_win_title": "Win points"
},
@@ -205,6 +205,7 @@
"role_changed": "Role updated!",
"role_confirm": "Do you want to change the role of {name} to {role}?",
"search_user": "Search user by email...",
+ "title": "Profile",
"uploaded_pictures": "Uploaded pictures",
"user_management": "User management"
},
@@ -281,6 +282,7 @@
},
"teams": "Teams",
"third_place": "Third place",
+ "title": "Showcase",
"total_points": "Total points earned",
"users": "Users"
}
@@ -367,4 +369,4 @@
"uploadFile": "Upload file",
"voteRating": "vote rating {value} of {max}"
}
-}
+}
\ No newline at end of file
diff --git a/app/pages/hunt/[huntSlug]/showcase.vue b/app/pages/hunt/[huntSlug]/showcase.vue
index ea300ae..298557b 100644
--- a/app/pages/hunt/[huntSlug]/showcase.vue
+++ b/app/pages/hunt/[huntSlug]/showcase.vue
@@ -15,6 +15,13 @@ const app = useNuxtApp();
const { name, id } = app.$slugData.huntSlug!;
const { data, error } = await useFetch(`/api/hunt/${id}/showcase`);
+useHead({
+ title: t('layouts.two_title', {
+ title: tKey(data.value ?? { name_de: name, name_en: name }, 'name').value,
+ subtitle: t('page.showcase.title')
+ })
+});
+
const { toggle, isFullscreen, isSupported } = useFullscreen();
const leaderboardColumns: DataTableColumnSource[] = [
diff --git a/app/pages/index.vue b/app/pages/index.vue
index 48296b4..58b3ba4 100644
--- a/app/pages/index.vue
+++ b/app/pages/index.vue
@@ -19,6 +19,20 @@ const steps = [
{ icon: 'photo_camera', key: 'step_quests' },
{ icon: 'emoji_events', key: 'step_win' }
];
+
+useHead({
+ title: t('layouts.default_tile'),
+ meta: [
+ {
+ property: 'og:title',
+ content: t('page.landing.hero_title')
+ },
+ {
+ property: 'og:description',
+ content: t('page.landing.hero_subtitle')
+ }
+ ]
+});
diff --git a/app/pages/profile.vue b/app/pages/profile.vue
index 3428ff0..9089900 100644
--- a/app/pages/profile.vue
+++ b/app/pages/profile.vue
@@ -18,6 +18,11 @@ watch(loggedIn, (isLoggedIn) => {
});
const { data, refresh, pending } = await useFetch('/api/auth/profile');
+useHead({
+ title: t('layouts.title', {
+ title: t('page.profile.title')
+ })
+});
const form = reactive({
email: data.value!.email,
name: data.value!.name
diff --git a/server/api/auth/register.post.ts b/server/api/auth/register.post.ts
index a8f99d3..2a21e9a 100644
--- a/server/api/auth/register.post.ts
+++ b/server/api/auth/register.post.ts
@@ -42,6 +42,7 @@ export default defineEventHandler(async (event) => {
console.warn(`Successful register: ${email}`);
await setUserSession(event, {
+ loggedInAt: new Date().toISOString(),
user: user
});