From 911c44b50b68d68ab31baffa55cd00f95c14cc5d Mon Sep 17 00:00:00 2001
From: Remi <73385395+itsrubberduck@users.noreply.github.com>
Date: Sun, 5 Oct 2025 13:55:00 +0200
Subject: [PATCH] Add feedback page and gate classroom behind orientation
---
app/middleware/require-classroom-intro.ts | 10 ++++++++++
app/pages/classroom-introduction.vue | 20 ++++++++++++++++----
app/pages/classroom.vue | 8 +++++++-
shared/constants/storage.ts | 1 +
4 files changed, 34 insertions(+), 5 deletions(-)
create mode 100644 app/middleware/require-classroom-intro.ts
create mode 100644 shared/constants/storage.ts
diff --git a/app/middleware/require-classroom-intro.ts b/app/middleware/require-classroom-intro.ts
new file mode 100644
index 0000000..e0eff44
--- /dev/null
+++ b/app/middleware/require-classroom-intro.ts
@@ -0,0 +1,10 @@
+import {CLASSROOM_INTRO_STORAGE_KEY} from '~~/shared/constants/storage'
+
+export default defineNuxtRouteMiddleware(() => {
+ if (process.server) return
+
+ const introComplete = localStorage.getItem(CLASSROOM_INTRO_STORAGE_KEY) === 'true'
+ if (!introComplete) {
+ return navigateTo('/classroom-introduction')
+ }
+})
diff --git a/app/pages/classroom-introduction.vue b/app/pages/classroom-introduction.vue
index 423d838..6643a4e 100644
--- a/app/pages/classroom-introduction.vue
+++ b/app/pages/classroom-introduction.vue
@@ -13,7 +13,7 @@
Guided preflight briefing
-
+
Enter Classroom hub
@@ -167,7 +167,7 @@
Start guided tour
-
+
Skip to Classroom
@@ -382,10 +382,10 @@
Next stop
-
+
Enter Classroom hub
-
+
@@ -403,6 +403,7 @@
import { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue'
import { useHead } from '#imports'
import { useApi } from '~/composables/useApi'
+import { CLASSROOM_INTRO_STORAGE_KEY } from '~~/shared/constants/storage'
import type { PizzicatoLite } from '~~/shared/utils/pizzicatoLite'
import { loadPizzicatoLite } from '~~/shared/utils/pizzicatoLite'
import { clampReadability, createNoiseGenerators, getReadabilityProfile } from '~~/shared/utils/radioEffects'
@@ -420,6 +421,8 @@ interface StageStop {
voiceLine: string
}
+definePageMeta({ middleware: 'require-auth' })
+
useHead({ title: 'Classroom orientation • OpenSquawk' })
const stages: StageStop[] = [
@@ -497,6 +500,15 @@ const stages: StageStop[] = [
const api = useApi()
+function markClassroomIntroComplete() {
+ if (typeof window === 'undefined') return
+ localStorage.setItem(CLASSROOM_INTRO_STORAGE_KEY, 'true')
+}
+
+function handleClassroomEntry() {
+ markClassroomIntroComplete()
+}
+
const voiceMode = ref('text')
const radioLevel = ref(3)
const hasCompletedRadioCheck = ref(false)
diff --git a/app/pages/classroom.vue b/app/pages/classroom.vue
index 82d89bd..20956b9 100644
--- a/app/pages/classroom.vue
+++ b/app/pages/classroom.vue
@@ -122,6 +122,10 @@
+
+ mdi-message-draw
+ Feedback
+