diff --git a/src/modules/chat/index.ts b/src/modules/chat/index.ts index 1d27bec..6c475c5 100644 --- a/src/modules/chat/index.ts +++ b/src/modules/chat/index.ts @@ -34,6 +34,9 @@ export const chatModule: ModulePlugin = { // Create and register chat service const chatService = new ChatService(config) container.provide(CHAT_SERVICE_TOKEN, chatService) + + // Also make it globally available for other modules (like market) + ;(globalThis as any).chatService = chatService // Register global components app.component('ChatComponent', ChatComponent) diff --git a/src/modules/chat/services/chat-service.ts b/src/modules/chat/services/chat-service.ts index 84b6374..6c922bb 100644 --- a/src/modules/chat/services/chat-service.ts +++ b/src/modules/chat/services/chat-service.ts @@ -15,6 +15,7 @@ export class ChatService { private config: ChatConfig private subscriptionUnsubscriber?: () => void private isInitialized = ref(false) + private marketMessageHandler?: (event: any) => Promise constructor(config: ChatConfig) { this.config = config @@ -24,6 +25,11 @@ export class ChatService { this.deferredInitialization() } + // Register market message handler for forwarding market-related DMs + setMarketMessageHandler(handler: (event: any) => Promise) { + this.marketMessageHandler = handler + } + // Defer initialization until services are ready private deferredInitialization(): void { // Try initialization immediately @@ -511,22 +517,45 @@ export class ChatService { // Decrypt the message const decryptedContent = await nip04.decrypt(userPrivkey, senderPubkey, event.content) - // Create a chat message - const message: ChatMessage = { - id: event.id, - content: decryptedContent, - created_at: event.created_at, - sent: false, - pubkey: senderPubkey + // Check if this is a market-related message (JSON with type field) + let isMarketMessage = false + try { + const parsedContent = JSON.parse(decryptedContent) + if (parsedContent && typeof parsedContent.type === 'number' && (parsedContent.type === 1 || parsedContent.type === 2)) { + // This is a market message (payment request type 1 or status update type 2) + isMarketMessage = true + console.log('🛒 Forwarding market message to market handler:', parsedContent.type) + + // Forward to market handler + if (this.marketMessageHandler) { + await this.marketMessageHandler(event) + } else { + console.warn('Market message handler not available, message will be treated as chat') + } + } + } catch (e) { + // Not JSON or not a market message, treat as regular chat } - // Ensure we have a peer record for the sender - this.addPeer(senderPubkey) + // Only process as chat message if it's not a market message + if (!isMarketMessage) { + // Create a chat message + const message: ChatMessage = { + id: event.id, + content: decryptedContent, + created_at: event.created_at, + sent: false, + pubkey: senderPubkey + } - // Add the message - this.addMessage(senderPubkey, message) + // Ensure we have a peer record for the sender + this.addPeer(senderPubkey) - console.log('Received encrypted message from:', senderPubkey.slice(0, 8)) + // Add the message + this.addMessage(senderPubkey, message) + + console.log('Received encrypted chat message from:', senderPubkey.slice(0, 8)) + } } catch (error) { console.error('Failed to decrypt incoming message:', error) diff --git a/src/modules/market/composables/useMarket.ts b/src/modules/market/composables/useMarket.ts index d667b52..c5e96f8 100644 --- a/src/modules/market/composables/useMarket.ts +++ b/src/modules/market/composables/useMarket.ts @@ -28,6 +28,22 @@ export function useMarket() { throw new Error('AuthService not available. Make sure base module is installed.') } + // Register market DM handler with chat service (if available) + const registerMarketMessageHandler = () => { + try { + // Try to get the chat service (it might not be available if chat module isn't loaded) + const chatService = (globalThis as any).chatService + if (chatService && chatService.setMarketMessageHandler) { + chatService.setMarketMessageHandler(handleOrderDM) + console.log('🛒 Registered market message handler with chat service') + } else { + console.log('🛒 Chat service not available, market will use its own DM subscription') + } + } catch (error) { + console.log('🛒 Could not register with chat service:', error) + } + } + // State const isLoading = ref(false) const error = ref(null) @@ -403,12 +419,14 @@ export function useMarket() { // Handle different types of messages switch (messageData.type) { case 1: // Payment request - console.log('💰 Processing payment request') + console.log('💰 Processing payment request for order:', messageData.id) await nostrmarketService.handlePaymentRequest(messageData) + console.log('✅ Payment request processed successfully') break case 2: // Order status update - console.log('📦 Processing order status update') + console.log('📦 Processing order status update for order:', messageData.id) await nostrmarketService.handleOrderStatusUpdate(messageData) + console.log('✅ Order status update processed successfully') break default: console.log('❓ Unknown message type:', messageData.type) @@ -558,6 +576,9 @@ export function useMarket() { console.log('🛒 Market connected successfully') + // Register market message handler with chat service + registerMarketMessageHandler() + // Load market data console.log('🛒 Loading basic market data...') // TODO: Confirm if this should use nostrStore.account?.pubkey or authService.user.value?.pubkey @@ -580,9 +601,8 @@ export function useMarket() { console.log('🛒 Subscribing to market updates...') subscribeToMarketUpdates() - // Subscribe to order-related DMs - console.log('🛒 Subscribing to order updates...') - subscribeToOrderUpdates() + // 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) diff --git a/src/modules/market/services/nostrmarketService.ts b/src/modules/market/services/nostrmarketService.ts index bf6cbb8..4b305db 100644 --- a/src/modules/market/services/nostrmarketService.ts +++ b/src/modules/market/services/nostrmarketService.ts @@ -377,6 +377,16 @@ export class NostrmarketService { paymentStatus: updatedOrder.paymentStatus, hasQRCode: !!updatedOrder.qrCodeDataUrl }) + + // Debug: Check if the order was actually updated in the store + const verifyOrder = Object.values(marketStore.orders).find(o => + o.id === paymentRequest.id || o.originalOrderId === paymentRequest.id + ) + console.log('Verified order in store after update:', { + found: !!verifyOrder, + hasPaymentRequest: !!verifyOrder?.paymentRequest, + paymentStatus: verifyOrder?.paymentStatus + }) } else { console.warn('Payment request received for unknown order:', paymentRequest.id) } diff --git a/src/modules/market/stores/market.ts b/src/modules/market/stores/market.ts index 517a7ad..404c061 100644 --- a/src/modules/market/stores/market.ts +++ b/src/modules/market/stores/market.ts @@ -641,9 +641,26 @@ export const useMarketStore = defineStore('market', () => { const updateOrder = (orderId: string, updatedOrder: Partial) => { const order = orders.value[orderId] if (order) { - Object.assign(order, updatedOrder) - order.updatedAt = Date.now() / 1000 + // Create a completely new order object to ensure reactivity + const newOrder = { + ...order, + ...updatedOrder, + updatedAt: Date.now() / 1000 + } + + // Replace the entire order object to trigger reactivity + orders.value[orderId] = newOrder + + console.log('🔄 Order updated in store:', { + orderId, + hasPaymentRequest: !!newOrder.paymentRequest, + status: newOrder.status, + paymentStatus: newOrder.paymentStatus + }) + saveOrdersToStorage() + } else { + console.warn('updateOrder: Order not found:', orderId) } }