diff --git a/src/App.vue b/src/App.vue index 91bca8c..71a03d6 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@ diff --git a/src/components/layout/Navbar.vue b/src/components/layout/Navbar.vue index 77afc2e..91d2fd9 100644 --- a/src/components/layout/Navbar.vue +++ b/src/components/layout/Navbar.vue @@ -12,6 +12,7 @@ import LoginDialog from '@/components/auth/LoginDialog.vue' import ProfileDialog from '@/components/auth/ProfileDialog.vue' import CurrencyDisplay from '@/components/ui/CurrencyDisplay.vue' import { auth } from '@/composables/useAuth' +import { useMarketPreloader } from '@/composables/useMarketPreloader' interface NavigationItem { name: string @@ -24,6 +25,7 @@ const { theme, setTheme } = useTheme() const isOpen = ref(false) const showLoginDialog = ref(false) const showProfileDialog = ref(false) +const marketPreloader = useMarketPreloader() const navigation = computed(() => [ { name: t('nav.home'), href: '/' }, @@ -89,6 +91,9 @@ const handleLogout = async () => { 'text-foreground': $route.path === item.href }"> {{ item.name }} + + @@ -223,6 +228,9 @@ const handleLogout = async () => { 'text-foreground': $route.path === item.href }" @click="isOpen = false"> {{ item.name }} + + diff --git a/src/composables/useMarket.ts b/src/composables/useMarket.ts index a488f70..fc5f6b9 100644 --- a/src/composables/useMarket.ts +++ b/src/composables/useMarket.ts @@ -81,6 +81,9 @@ export function useMarket() { // Don't fail the entire load process if subscription fails } + // Clear any error state since we successfully loaded the market data + marketStore.setError(null) + } catch (err) { console.error('Error loading market data:', err) throw err diff --git a/src/composables/useMarketPreloader.ts b/src/composables/useMarketPreloader.ts new file mode 100644 index 0000000..4f2f89f --- /dev/null +++ b/src/composables/useMarketPreloader.ts @@ -0,0 +1,65 @@ +import { ref, readonly } from 'vue' +import { useMarket } from './useMarket' +import { useMarketStore } from '@/stores/market' +import { config } from '@/lib/config' + +export function useMarketPreloader() { + const isPreloading = ref(false) + const isPreloaded = ref(false) + const preloadError = ref(null) + + const market = useMarket() + const marketStore = useMarketStore() + + const preloadMarket = async () => { + // Don't preload if already done or currently preloading + if (isPreloaded.value || isPreloading.value) { + return + } + + try { + isPreloading.value = true + preloadError.value = null + + const naddr = config.market.defaultNaddr + if (!naddr) { + console.log('No market naddr configured, skipping preload') + return + } + + console.log('Preloading market data...') + + // Connect to market + await market.connectToMarket() + + // Load market data + await market.loadMarket(naddr) + + // Clear any error state since preloading succeeded + marketStore.setError(null) + + isPreloaded.value = true + console.log('Market data preloaded successfully') + + } catch (error) { + console.error('Failed to preload market:', error) + preloadError.value = error instanceof Error ? error.message : 'Failed to preload market' + // Don't throw error, let the UI handle it gracefully + } finally { + isPreloading.value = false + } + } + + const resetPreload = () => { + isPreloaded.value = false + preloadError.value = null + } + + return { + isPreloading: readonly(isPreloading), + isPreloaded: readonly(isPreloaded), + preloadError: readonly(preloadError), + preloadMarket, + resetPreload + } +} \ No newline at end of file diff --git a/src/pages/Market.vue b/src/pages/Market.vue index a4305b8..aa1ecaf 100644 --- a/src/pages/Market.vue +++ b/src/pages/Market.vue @@ -1,18 +1,20 @@ - + - Loading market... + + {{ marketPreloader.isPreloading ? 'Preloading market...' : 'Loading market...' }} + - + Failed to load market - {{ marketStore.error }} + {{ marketStore.error || marketPreloader.preloadError }} Try Again @@ -66,13 +68,13 @@ - + No products found Try adjusting your search or filters - +
Loading market...
+ {{ marketPreloader.isPreloading ? 'Preloading market...' : 'Loading market...' }} +
{{ marketStore.error }}
{{ marketStore.error || marketPreloader.preloadError }}
Try adjusting your search or filters