- 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.
198 lines
5.7 KiB
TypeScript
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'
|