diff --git a/app/pages/pm.vue b/app/pages/pm.vue index 4ea0dfc..d6445ea 100644 --- a/app/pages/pm.vue +++ b/app/pages/pm.vue @@ -901,6 +901,28 @@ const engine = useCommunicationsEngine() const auth = useAuthStore() const api = useApi() const router = useRouter() + +const STORAGE_KEYS = { + selectedPlan: 'pm_selected_plan', + vatsimId: 'pm_vatsim_id' +} as const + +let restoringFromStorage = true + +const persistSelectedPlan = (plan: any | null) => { + if (typeof window === 'undefined') return + + try { + if (plan) { + window.localStorage.setItem(STORAGE_KEYS.selectedPlan, JSON.stringify(plan)) + } else { + window.localStorage.removeItem(STORAGE_KEYS.selectedPlan) + } + } catch (err) { + console.warn('Failed to persist flight selection', err) + } +} + const { currentState, nextCandidates, @@ -1010,19 +1032,41 @@ const frequencySources = ref({ vatsim: false, openaip: false }) const atisPlaybackLoading = ref(false) onMounted(async () => { - if (!auth.accessToken) { - const refreshed = await auth.tryRefresh() - if (!refreshed) { - router.push('/login') - return + try { + if (!auth.accessToken) { + const refreshed = await auth.tryRefresh() + if (!refreshed) { + router.push('/login') + return + } } - } - if (!auth.user) { - await auth.fetchUser().catch((err) => { - console.error('Session initialisation failed', err) - router.push('/login') - }) + if (!auth.user) { + await auth.fetchUser().catch((err) => { + console.error('Session initialisation failed', err) + router.push('/login') + }) + } + + if (typeof window !== 'undefined') { + const storedVatsimId = window.localStorage.getItem(STORAGE_KEYS.vatsimId) + if (storedVatsimId) { + vatsimId.value = storedVatsimId + } + + const storedPlanRaw = window.localStorage.getItem(STORAGE_KEYS.selectedPlan) + if (storedPlanRaw) { + try { + const parsedPlan = JSON.parse(storedPlanRaw) + await startMonitoring(parsedPlan) + } catch (err) { + console.warn('Failed to restore stored flight plan', err) + window.localStorage.removeItem(STORAGE_KEYS.selectedPlan) + } + } + } + } finally { + restoringFromStorage = false } }) @@ -1030,6 +1074,7 @@ watch( () => auth.accessToken, (token) => { if (!token) { + persistSelectedPlan(null) router.push('/login') } } @@ -1040,6 +1085,19 @@ const vatsimId = ref('1857215') const flightPlans = ref([]) const selectedPlan = ref(null) +watch(vatsimId, (id) => { + if (restoringFromStorage || typeof window === 'undefined') { + return + } + + const trimmed = id.trim() + if (trimmed) { + window.localStorage.setItem(STORAGE_KEYS.vatsimId, trimmed) + } else { + window.localStorage.removeItem(STORAGE_KEYS.vatsimId) + } +}) + // Audio const mediaRecorder = ref(null) const audioChunks = ref([]) @@ -1535,6 +1593,7 @@ const startMonitoring = async (flightPlan: any) => { selectedPlan.value = flightPlan initializeFlight(flightPlan) currentScreen.value = 'monitor' + persistSelectedPlan(flightPlan) // Set appropriate frequency based on departure airport if (flightPlan.dep === 'EDDF') { @@ -1560,6 +1619,7 @@ const startDemoFlight = () => { const backToSetup = () => { currentScreen.value = 'login' selectedPlan.value = null + persistSelectedPlan(null) clearLastTransmission() airportFrequencies.value = [] frequencySources.value = { vatsim: false, openaip: false } diff --git a/app/stores/auth.ts b/app/stores/auth.ts index a022033..c375ff5 100644 --- a/app/stores/auth.ts +++ b/app/stores/auth.ts @@ -1,5 +1,7 @@ import { defineStore } from 'pinia' +export const AUTH_TOKEN_STORAGE_KEY = 'os_access_token' + interface Credentials { email: string password: string @@ -30,15 +32,15 @@ interface AuthState { function loadToken(): string { if (typeof window === 'undefined') return '' - return localStorage.getItem('os_access_token') || '' + return localStorage.getItem(AUTH_TOKEN_STORAGE_KEY) || '' } function persistToken(token: string) { if (typeof window === 'undefined') return if (token) { - localStorage.setItem('os_access_token', token) + localStorage.setItem(AUTH_TOKEN_STORAGE_KEY, token) } else { - localStorage.removeItem('os_access_token') + localStorage.removeItem(AUTH_TOKEN_STORAGE_KEY) } } diff --git a/plugins/auth-init.client.ts b/plugins/auth-init.client.ts new file mode 100644 index 0000000..a49418f --- /dev/null +++ b/plugins/auth-init.client.ts @@ -0,0 +1,15 @@ +import { defineNuxtPlugin } from '#app' +import { useAuthStore, AUTH_TOKEN_STORAGE_KEY } from '~/stores/auth' + +export default defineNuxtPlugin(() => { + if (typeof window === 'undefined') { + return + } + + const auth = useAuthStore() + const storedToken = window.localStorage.getItem(AUTH_TOKEN_STORAGE_KEY) + + if (storedToken && auth.accessToken !== storedToken) { + auth.setAccessToken(storedToken) + } +})