web-app/src/modules/market/index.ts
padreug b25e502c17 Add NostrmarketAPI integration and enhance MerchantStore component
- Introduce NostrmarketAPI service for improved merchant profile management.
- Update MerchantStore component to handle loading and error states during merchant profile checks.
- Implement logic to check for merchant profiles using the new API, enhancing user experience.
- Refactor computed properties and lifecycle methods to accommodate the new API integration.

These changes streamline the process of checking and managing merchant profiles, providing users with real-time feedback and improving overall functionality.
2025-09-08 16:58:10 +02:00

198 lines
5.7 KiB
TypeScript

import type { App } from 'vue'
import type { ModulePlugin } from '@/core/types'
import type { RouteRecordRaw } from 'vue-router'
import { container, SERVICE_TOKENS } from '@/core/di-container'
import { eventBus } from '@/core/event-bus'
// Import components
import MarketSettings from './components/MarketSettings.vue'
import MerchantStore from './components/MerchantStore.vue'
import ShoppingCart from './components/ShoppingCart.vue'
// NostrmarketService will be dynamically imported in install()
// Store will be imported when needed
// Import composables
import { useMarket } from './composables/useMarket'
import { useMarketPreloader } from './composables/useMarketPreloader'
// Import services
import { NostrmarketService } from './services/nostrmarketService'
import { PaymentMonitorService } from './services/paymentMonitor'
import { NostrmarketAPI } from './services/nostrmarketAPI'
export interface MarketModuleConfig {
defaultCurrency: string
paymentTimeout: number
maxOrderHistory: number
supportedRelays?: string[]
}
/**
* Market Module Plugin
* Provides market, stall, and product management functionality
*/
export const marketModule: ModulePlugin = {
name: 'market',
version: '1.0.0',
dependencies: ['base'],
async install(app: App, options?: { config?: MarketModuleConfig }) {
console.log('🛒 Installing market module...')
const config = options?.config
if (!config) {
throw new Error('Market module requires configuration')
}
// Create and register service instances
const nostrmarketService = new NostrmarketService()
container.provide(SERVICE_TOKENS.NOSTRMARKET_SERVICE, nostrmarketService)
const nostrmarketAPI = new NostrmarketAPI()
container.provide(SERVICE_TOKENS.NOSTRMARKET_API, nostrmarketAPI)
const paymentMonitorService = new PaymentMonitorService()
container.provide(SERVICE_TOKENS.PAYMENT_MONITOR, paymentMonitorService)
// Initialize services (will handle dependency injection)
await nostrmarketService.initialize({
waitForDependencies: true,
maxRetries: 3
}).catch(error => {
console.warn('🛒 NostrmarketService initialization deferred:', error)
// Service will auto-initialize when dependencies are available
})
await nostrmarketAPI.initialize({
waitForDependencies: true,
maxRetries: 3
}).catch(error => {
console.warn('🛒 NostrmarketAPI initialization deferred:', error)
// Service will auto-initialize when dependencies are available
})
await paymentMonitorService.initialize({
waitForDependencies: true,
maxRetries: 3
}).catch(error => {
console.warn('🛒 PaymentMonitorService initialization deferred:', error)
// Service will auto-initialize when dependencies are available
})
// Register global components
app.component('MarketSettings', MarketSettings)
app.component('MerchantStore', MerchantStore)
app.component('ShoppingCart', ShoppingCart)
// Market store will be initialized when first used
// Set up event listeners for integration with other modules
setupEventListeners()
console.log('✅ Market module installed successfully')
},
async uninstall() {
console.log('🗑️ Uninstalling market module...')
// Clean up services
container.remove(SERVICE_TOKENS.NOSTRMARKET_SERVICE)
container.remove(SERVICE_TOKENS.NOSTRMARKET_API)
container.remove(SERVICE_TOKENS.PAYMENT_MONITOR)
console.log('✅ Market module uninstalled')
},
routes: [
{
path: '/market',
name: 'market',
component: () => import('./views/MarketPage.vue'),
meta: {
title: 'Market',
requiresAuth: false
}
},
{
path: '/market/dashboard',
name: 'market-dashboard',
component: () => import('./views/MarketDashboard.vue'),
meta: {
title: 'Market Dashboard',
requiresAuth: true
}
},
{
path: '/market-dashboard',
redirect: '/market/dashboard'
},
{
path: '/cart',
name: 'cart',
component: () => import('./views/CartPage.vue'),
meta: {
title: 'Shopping Cart',
requiresAuth: false
}
},
{
path: '/checkout/:stallId',
name: 'checkout',
component: () => import('./views/CheckoutPage.vue'),
meta: {
title: 'Checkout',
requiresAuth: false
}
}
] as RouteRecordRaw[],
components: {
MarketSettings,
MerchantStore,
ShoppingCart
},
composables: {
useMarket,
useMarketPreloader
},
services: {
nostrmarket: SERVICE_TOKENS.NOSTRMARKET_SERVICE
}
}
// Set up event listeners for integration with other modules
function setupEventListeners() {
// Listen for auth events
eventBus.on('auth:logout', () => {
console.log('Market module: user logged out, clearing market data')
// Could clear market-specific user data here
})
// Listen for payment events from other modules
eventBus.on('payment:completed', (event) => {
console.log('Market module: payment completed', event.data)
// Could update order status or refresh market data here
})
// Emit market-specific events
eventBus.on('market:order-placed', (event) => {
console.log('Market order placed:', event.data)
// Other modules can listen to this event
})
eventBus.on('market:product-added', (event) => {
console.log('Market product added:', event.data)
// Other modules can listen to this event
})
}
export default marketModule
// Re-export types and composables for external use
export type * from './types/market'
export { useMarket, useMarketPreloader } from './composables'
export { useMarketStore } from './stores/market'