mirror of
https://github.com/OpenSquawk/OpenSquawk
synced 2026-08-01 06:06:05 +08:00
feat: persist pilot monitoring selection
This commit is contained in:
@@ -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<any[]>([])
|
||||
const selectedPlan = ref<any>(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<MediaRecorder | null>(null)
|
||||
const audioChunks = ref<Blob[]>([])
|
||||
@@ -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 }
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
15
plugins/auth-init.client.ts
Normal file
15
plugins/auth-init.client.ts
Normal file
@@ -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)
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user