web-app/src/app.ts
padreug ee8dd37761 Refactor imports and remove legacy composables for improved code clarity
- Simplify imports in app.ts by removing unused SERVICE_TOKENS.
- Eliminate the NavigationItem interface in Navbar.vue as its functionality is now managed by useModularNavigation.
- Introduce new legacy composable stubs for useNostrChat and useRelayHub, indicating a shift towards modular chat and relay services.
- Update MyTicketsPage.vue to correct the import path for useUserTickets, enhancing module organization.
- Refactor ChatService to improve type handling for event tags, ensuring better type safety.

Remove ChatComponent, useNostrChat composable, and ChatPage for a modular chat architecture

- Delete ChatComponent.vue to streamline chat functionality.
- Remove legacy useNostrChat composable, transitioning to a more modular chat service approach.
- Eliminate ChatPage.vue as part of the refactor to enhance code organization and maintainability.
2025-09-05 05:27:45 +02:00

180 lines
No EOL
4.7 KiB
TypeScript

import { createApp } from 'vue'
import { createRouter, createWebHistory } from 'vue-router'
import { createPinia } from 'pinia'
// Core plugin system
import { pluginManager } from './core/plugin-manager'
import { eventBus } from './core/event-bus'
import { container } from './core/di-container'
// App configuration
import appConfig from './app.config'
// Base modules
import baseModule from './modules/base'
import nostrFeedModule from './modules/nostr-feed'
import chatModule from './modules/chat'
import eventsModule from './modules/events'
import marketModule from './modules/market'
// Root component
import App from './App.vue'
// Styles
import './assets/index.css'
// Use existing i18n setup
import { i18n } from './i18n'
/**
* Initialize and start the modular application
*/
export async function createAppInstance() {
console.log('🚀 Starting modular application...')
// Create Vue app
const app = createApp(App)
// Create router
const router = createRouter({
history: createWebHistory(),
routes: [
// Default route - will be populated by modules
{
path: '/',
name: 'home',
component: () => import('./pages/Home.vue'),
meta: { requiresAuth: true }
},
{
path: '/login',
name: 'login',
component: () => import('./pages/LoginDemo.vue'),
meta: { requiresAuth: false }
}
]
})
// Use existing i18n setup
// Create Pinia store
const pinia = createPinia()
// Install core plugins
app.use(router)
app.use(pinia)
app.use(i18n)
// Initialize plugin manager
pluginManager.init(app, router)
// Register modules based on configuration
const moduleRegistrations = []
// Register base module first (required)
if (appConfig.modules.base.enabled) {
moduleRegistrations.push(
pluginManager.register(baseModule, appConfig.modules.base)
)
}
// Register nostr-feed module
if (appConfig.modules['nostr-feed'].enabled) {
moduleRegistrations.push(
pluginManager.register(nostrFeedModule, appConfig.modules['nostr-feed'])
)
}
// Register chat module
if (appConfig.modules.chat.enabled) {
moduleRegistrations.push(
pluginManager.register(chatModule, appConfig.modules.chat)
)
}
// Register events module
if (appConfig.modules.events.enabled) {
moduleRegistrations.push(
pluginManager.register(eventsModule, appConfig.modules.events)
)
}
// Register market module
if (appConfig.modules.market.enabled) {
moduleRegistrations.push(
pluginManager.register(marketModule, appConfig.modules.market)
)
}
// Wait for all modules to register
await Promise.all(moduleRegistrations)
// Install all enabled modules
await pluginManager.installAll()
// Set up auth guard
router.beforeEach(async (to, _from, next) => {
// Import the auth composable to ensure we're using the same instance as the rest of the app
const { auth } = await import('@/composables/useAuth')
if (to.meta.requiresAuth && !auth.isAuthenticated.value) {
console.log('Auth guard: User not authenticated, redirecting to login')
next('/login')
} else if (to.path === '/login' && auth.isAuthenticated.value) {
console.log('Auth guard: User already authenticated, redirecting to home')
next('/')
} else {
console.log(`Auth guard: Allowing navigation to ${to.path}`)
next()
}
})
// Global error handling
app.config.errorHandler = (err, _vm, info) => {
console.error('Global error:', err, info)
eventBus.emit('app:error', { error: err, info }, 'app')
}
// Development helpers
if (appConfig.features.developmentMode) {
// Expose debugging helpers globally
;(window as any).__pluginManager = pluginManager
;(window as any).__eventBus = eventBus
;(window as any).__container = container
console.log('🔧 Development mode enabled')
console.log('Available globals: __pluginManager, __eventBus, __container')
}
console.log('✅ Application initialized successfully')
return { app, router }
}
/**
* Start the application
*/
export async function startApp() {
try {
const { app } = await createAppInstance()
// Mount the app
app.mount('#app')
console.log('🎉 Application started!')
// Emit app started event
eventBus.emit('app:started', {}, 'app')
} catch (error) {
console.error('💥 Failed to start application:', error)
// Show error to user
document.getElementById('app')!.innerHTML = `
<div style="padding: 20px; text-align: center; color: red;">
<h1>Application Failed to Start</h1>
<p>${error instanceof Error ? error.message : 'Unknown error'}</p>
<p>Please refresh the page or contact support.</p>
</div>
`
}
}