web-app/src/lib/config/index.ts

121 lines
No EOL
3.1 KiB
TypeScript

// Centralized configuration management
// Handles all environment variables and app configuration
interface NostrConfig {
relays: string[]
adminPubkeys: string[]
}
interface ApiConfig {
baseUrl: string
key: string
lightningDomain?: string // Optional override for Lightning Address domain
}
interface PushConfig {
vapidPublicKey: string
enabled: boolean
}
interface MarketConfig {
defaultNaddr: string
lightningEnabled: boolean
defaultCurrency: string
}
interface AppConfig {
nostr: NostrConfig
api: ApiConfig
push: PushConfig
market: MarketConfig
nostrclient: {
url: string
enabled: boolean
}
support: {
npub: string
}
}
// Parse JSON environment variables safely
function parseJsonEnv(envVar: string | undefined, fallback: any = []): any {
if (!envVar) return fallback
try {
return JSON.parse(envVar)
} catch (error) {
console.warn(`Failed to parse environment variable: ${envVar}`)
return fallback
}
}
// Create the configuration object
export const config: AppConfig = {
nostr: {
relays: parseJsonEnv(import.meta.env.VITE_NOSTR_RELAYS, []),
adminPubkeys: parseJsonEnv(import.meta.env.VITE_ADMIN_PUBKEYS, [])
},
api: {
baseUrl: import.meta.env.VITE_LNBITS_BASE_URL || '',
key: import.meta.env.VITE_API_KEY || '',
lightningDomain: import.meta.env.VITE_LIGHTNING_DOMAIN // Optional override for Lightning Address domain
},
push: {
vapidPublicKey: import.meta.env.VITE_VAPID_PUBLIC_KEY || '',
enabled: Boolean(import.meta.env.VITE_PUSH_NOTIFICATIONS_ENABLED)
},
market: {
defaultNaddr: import.meta.env.VITE_MARKET_NADDR || '',
lightningEnabled: Boolean(import.meta.env.VITE_LIGHTNING_ENABLED),
defaultCurrency: import.meta.env.VITE_MARKET_DEFAULT_CURRENCY || 'sat'
},
nostrclient: {
url: import.meta.env.VITE_NOSTRCLIENT_URL || 'wss://localhost:5000/nostrclient/api/v1',
enabled: Boolean(import.meta.env.VITE_NOSTRCLIENT_ENABLED)
},
support: {
npub: import.meta.env.VITE_SUPPORT_NPUB || ''
}
} as const
// Debug logging
console.log('🔧 Config loaded:', {
VITE_LNBITS_BASE_URL: import.meta.env.VITE_LNBITS_BASE_URL,
apiBaseUrl: config.api.baseUrl,
apiKey: config.api.key ? '***' : 'not set'
})
// Utility functions for common config operations
export const configUtils = {
isAdminPubkey: (pubkey: string): boolean => {
return config.nostr.adminPubkeys.includes(pubkey)
},
hasNostrConfig: (): boolean => {
return config.nostr.relays.length > 0
},
hasApiConfig: (): boolean => {
return Boolean(config.api.baseUrl && config.api.key)
},
hasPushConfig: (): boolean => {
return Boolean(config.push.vapidPublicKey && config.push.enabled)
},
hasMarketConfig: (): boolean => {
return Boolean(config.market.defaultNaddr)
},
getDefaultRelays: (): string[] => {
return config.nostr.relays
},
getMarketRelays: (): string[] => {
// Market now uses the same relays as the main Nostr configuration
return config.nostr.relays
}
}
// Export individual config sections for convenience
export const { nostr: nostrConfig, api: apiConfig, market: marketConfig } = config