Refactor authentication and async operation handling in useAuth composable

- Introduce useMultiAsyncOperation to manage multiple async operations in useAuth, enhancing error handling and loading state management.
- Replace manual loading and error state management with standardized async operation patterns for initialize, login, register, and logout functions.
- Update related components to utilize the new async operation structure, improving code clarity and maintainability.
- Add useAsyncOperation to other composables (useChat, useTicketPurchase, useMarket) for consistent async handling across the application.
This commit is contained in:
padreug 2025-09-05 06:08:08 +02:00
parent e0443742c5
commit 7c439361b7
5 changed files with 298 additions and 133 deletions

View file

@ -5,6 +5,7 @@ import { injectService, SERVICE_TOKENS } from '@/core/di-container'
import { config } from '@/lib/config'
import { nostrmarketService } from '../services/nostrmarketService'
import { nip04 } from 'nostr-tools'
import { useAsyncOperation } from '@/core/composables/useAsyncOperation'
// Nostr event kinds for market functionality
const MARKET_EVENT_KINDS = {
@ -44,9 +45,11 @@ export function useMarket() {
}
}
// Async operations
const marketOperation = useAsyncOperation()
const connectionOperation = useAsyncOperation()
// State
const isLoading = ref(false)
const error = ref<Error | null>(null)
const isConnected = ref(false)
const activeMarket = computed(() => marketStore.activeMarket)
const markets = computed(() => marketStore.markets)
@ -56,20 +59,15 @@ export function useMarket() {
// Connection state
const connectionStatus = computed(() => {
if (connectionOperation.isLoading.value) return 'connecting'
if (isConnected.value) return 'connected'
if (nostrStore.isConnecting) return 'connecting'
if (nostrStore.error) return 'error'
if (connectionOperation.error.value || nostrStore.error) return 'error'
return 'disconnected'
})
// Load market from naddr
const loadMarket = async (naddr: string) => {
try {
isLoading.value = true
error.value = null
// Load market from naddr
return await marketOperation.execute(async () => {
// Parse naddr to get market data
// TODO: Confirm if this should use nostrStore.account?.pubkey or authService.user.value?.pubkey
const marketData = {
@ -82,13 +80,10 @@ export function useMarket() {
}
await loadMarketData(marketData)
} catch (err) {
error.value = err instanceof Error ? err : new Error('Failed to load market')
throw err
} finally {
isLoading.value = false
}
return marketData
}, {
errorMessage: 'Failed to load market'
})
}
// Load market data from Nostr events
@ -560,7 +555,7 @@ export function useMarket() {
// Connect to market
const connectToMarket = async () => {
try {
return await connectionOperation.execute(async () => {
console.log('🛒 Checking RelayHub connection...')
// Use existing relay hub connection (should already be connected by base module)
isConnected.value = relayHub.isConnected.value
@ -602,18 +597,18 @@ export function useMarket() {
// Note: Order-related DMs are now handled by chat service forwarding
// No need for separate subscription
} catch (err) {
console.error('🛒 Failed to connect to market:', err)
error.value = err instanceof Error ? err : new Error('Failed to connect to market')
throw err
}
return { isConnected: isConnected.value }
}, {
errorMessage: 'Failed to connect to market'
})
}
// Disconnect from market
const disconnectFromMarket = () => {
isConnected.value = false
error.value = null
marketOperation.clear()
connectionOperation.clear()
// Market disconnected
}
@ -631,8 +626,10 @@ export function useMarket() {
return {
// State
isLoading: readonly(isLoading),
error: readonly(error),
isLoading: readonly(marketOperation.isLoading),
error: readonly(marketOperation.error),
isConnecting: readonly(connectionOperation.isLoading),
connectionError: readonly(connectionOperation.error),
isConnected: readonly(isConnected),
connectionStatus: readonly(connectionStatus),
activeMarket: readonly(activeMarket),