import { defineStore } from 'pinia' import { ref, reactive } from 'vue' import { playNavSound } from '@/composables/useNavSounds' const RECENT_ITEMS_KEY = 'archipelago-spotlight-recent' const MAX_RECENT_ITEMS = 8 export interface RecentItem { id: string label: string path?: string type: 'navigate' | 'learn' | 'action' | 'goal' timestamp: number } export const useSpotlightStore = defineStore('spotlight', () => { const isOpen = ref(false) const selectedIndex = ref(0) const recentItems = ref([]) function loadRecentItems() { try { const raw = localStorage.getItem(RECENT_ITEMS_KEY) if (raw) { const parsed = JSON.parse(raw) as RecentItem[] recentItems.value = parsed.slice(0, MAX_RECENT_ITEMS) } else { recentItems.value = [] } } catch { recentItems.value = [] } } function addRecentItem(item: Omit) { const withTimestamp: RecentItem = { ...item, timestamp: Date.now() } const filtered = recentItems.value.filter( (r) => !(r.id === item.id && r.type === item.type) ) recentItems.value = [withTimestamp, ...filtered].slice(0, MAX_RECENT_ITEMS) try { localStorage.setItem(RECENT_ITEMS_KEY, JSON.stringify(recentItems.value)) } catch (e) { if (import.meta.env.DEV) console.warn('Failed to save recent items to storage', e) } } function open() { isOpen.value = true selectedIndex.value = 0 loadRecentItems() playNavSound('action') } function close() { isOpen.value = false selectedIndex.value = 0 } function toggle() { isOpen.value ? close() : open() } function setSelectedIndex(index: number) { selectedIndex.value = index } const helpModal = reactive({ show: false, title: '', content: '', relatedPath: undefined as string | undefined, }) const helpModalRestoreFocusRef = ref(null) function showHelpModal(payload: { title: string; content: string; relatedPath?: string }) { helpModalRestoreFocusRef.value = document.activeElement as HTMLElement | null helpModal.show = true helpModal.title = payload.title helpModal.content = payload.content helpModal.relatedPath = payload.relatedPath } function closeHelpModal() { helpModalRestoreFocusRef.value?.focus?.() helpModalRestoreFocusRef.value = null helpModal.show = false } return { isOpen, selectedIndex, recentItems, open, close, toggle, setSelectedIndex, addRecentItem, loadRecentItems, helpModal, showHelpModal, closeHelpModal, } })