Spaces:
Runtime error
Runtime error
| /** | |||
| * βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| * CONFIGURATION FILE | |||
| * Dashboard Settings - Easy Customization | |||
| * βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| */ | |||
| // π§ Main Backend Settings | |||
| window.DASHBOARD_CONFIG = { | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // API and WebSocket URLs | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Auto-detect localhost and use port 7860, otherwise use current origin | |||
| BACKEND_URL: (() => { | |||
| const hostname = window.location.hostname; | |||
| if (hostname === 'localhost' || hostname === '127.0.0.1') { | |||
| return `http://${hostname}:7860`; | |||
| } | |||
| return window.location.origin || 'https://really-amin-datasourceforcryptocurrency.hf.space'; | |||
| })(), | |||
| WS_URL: (() => { | |||
| const hostname = window.location.hostname; | |||
| let backendUrl; | |||
| if (hostname === 'localhost' || hostname === '127.0.0.1') { | |||
| backendUrl = `http://${hostname}:7860`; | |||
| } else { | |||
| backendUrl = window.location.origin || 'https://really-amin-datasourceforcryptocurrency.hf.space'; | |||
| } | |||
| return backendUrl.replace('http://', 'ws://').replace('https://', 'wss://') + '/ws'; | |||
| })(), | |||
| // β±οΈ Update Timing (milliseconds) | |||
| UPDATE_INTERVAL: 30000, // Every 30 seconds | |||
| CACHE_TTL: 60000, // 1 minute | |||
| HEARTBEAT_INTERVAL: 30000, // 30 seconds | |||
| // π Reconnection Settings | |||
| MAX_RECONNECT_ATTEMPTS: 5, | |||
| RECONNECT_DELAY: 3000, // 3 seconds | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Display Settings | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Number of items to display | |||
| MAX_COINS_DISPLAY: 20, // Number of coins in table | |||
| MAX_NEWS_DISPLAY: 20, // Number of news items | |||
| MAX_TRENDING_DISPLAY: 10, // Number of trending items | |||
| // Table settings | |||
| TABLE_ROWS_PER_PAGE: 10, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Chart Settings | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| CHART: { | |||
| DEFAULT_SYMBOL: 'BTCUSDT', | |||
| DEFAULT_INTERVAL: '1h', | |||
| AVAILABLE_INTERVALS: ['1m', '5m', '15m', '1h', '4h', '1d'], | |||
| THEME: 'dark', | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // AI Settings | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| AI: { | |||
| ENABLE_SENTIMENT: true, | |||
| ENABLE_NEWS_SUMMARY: true, | |||
| ENABLE_PRICE_PREDICTION: false, // Currently disabled | |||
| ENABLE_PATTERN_DETECTION: false, // Currently disabled | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Notification Settings | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| NOTIFICATIONS: { | |||
| ENABLE: true, | |||
| SHOW_PRICE_ALERTS: true, | |||
| SHOW_NEWS_ALERTS: true, | |||
| AUTO_DISMISS_TIME: 5000, // 5 seconds | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // UI Settings | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| UI: { | |||
| DEFAULT_THEME: 'dark', // 'dark' or 'light' | |||
| ENABLE_ANIMATIONS: true, | |||
| ENABLE_SOUNDS: false, | |||
| LANGUAGE: 'en', // 'en' or 'fa' | |||
| RTL: false, | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Debug Settings | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| DEBUG: { | |||
| ENABLE_CONSOLE_LOGS: true, | |||
| ENABLE_PERFORMANCE_MONITORING: true, | |||
| SHOW_API_REQUESTS: true, | |||
| SHOW_WS_MESSAGES: false, | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Default Filters and Sorting | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| FILTERS: { | |||
| DEFAULT_MARKET_FILTER: 'all', // 'all', 'gainers', 'losers', 'trending' | |||
| DEFAULT_NEWS_FILTER: 'all', // 'all', 'bitcoin', 'ethereum', 'defi', 'nft' | |||
| DEFAULT_SORT: 'market_cap', // 'market_cap', 'volume', 'price', 'change' | |||
| SORT_ORDER: 'desc', // 'asc' or 'desc' | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // HuggingFace Configuration | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| HF_TOKEN: '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', | |||
| HF_API_BASE: '/static-proxy?url=https%3A%2F%2Fapi-inference.huggingface.co%2Fmodels%26%23x27%3B%3C%2Fspan%3E%2C%3C!----%3E%3C%2Ftd%3E%3C%2Ftr%3E%3Ctr id="L128"> | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // API Endpoints (Optional - if your backend differs) | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| ENDPOINTS: { | |||
| HEALTH: '/api/health', | |||
| MARKET: '/api/market/stats', | |||
| MARKET_PRICES: '/api/market/prices', | |||
| COINS_TOP: '/api/coins/top', | |||
| COIN_DETAILS: '/api/coins', | |||
| TRENDING: '/api/trending', | |||
| SENTIMENT: '/api/sentiment', | |||
| SENTIMENT_ANALYZE: '/api/sentiment/analyze', | |||
| NEWS: '/api/news/latest', | |||
| NEWS_SUMMARIZE: '/api/news/summarize', | |||
| STATS: '/api/stats', | |||
| PROVIDERS: '/api/providers', | |||
| PROVIDER_STATUS: '/api/providers/status', | |||
| CHART_HISTORY: '/api/charts/price', | |||
| CHART_ANALYZE: '/api/charts/analyze', | |||
| OHLCV: '/api/ohlcv', | |||
| QUERY: '/api/query', | |||
| DATASETS: '/api/datasets/list', | |||
| MODELS: '/api/models/list', | |||
| HF_HEALTH: '/api/hf/health', | |||
| HF_REGISTRY: '/api/hf/registry', | |||
| SYSTEM_STATUS: '/api/system/status', | |||
| SYSTEM_CONFIG: '/api/system/config', | |||
| CATEGORIES: '/api/categories', | |||
| RATE_LIMITS: '/api/rate-limits', | |||
| LOGS: '/api/logs', | |||
| ALERTS: '/api/alerts', | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // WebSocket Events | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| WS_EVENTS: { | |||
| MARKET_UPDATE: 'market_update', | |||
| SENTIMENT_UPDATE: 'sentiment_update', | |||
| NEWS_UPDATE: 'news_update', | |||
| STATS_UPDATE: 'stats_update', | |||
| PRICE_UPDATE: 'price_update', | |||
| API_UPDATE: 'api_update', | |||
| STATUS_UPDATE: 'status_update', | |||
| SCHEDULE_UPDATE: 'schedule_update', | |||
| CONNECTED: 'connected', | |||
| DISCONNECTED: 'disconnected', | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Display Formats | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| FORMATS: { | |||
| CURRENCY: { | |||
| LOCALE: 'en-US', | |||
| STYLE: 'currency', | |||
| CURRENCY: 'USD', | |||
| }, | |||
| DATE: { | |||
| LOCALE: 'en-US', | |||
| OPTIONS: { | |||
| year: 'numeric', | |||
| month: 'long', | |||
| day: 'numeric', | |||
| hour: '2-digit', | |||
| minute: '2-digit', | |||
| }, | |||
| }, | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Rate Limiting | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| RATE_LIMITS: { | |||
| API_REQUESTS_PER_MINUTE: 60, | |||
| SEARCH_DEBOUNCE_MS: 300, | |||
| }, | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Storage Settings | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| STORAGE: { | |||
| USE_LOCAL_STORAGE: true, | |||
| SAVE_PREFERENCES: true, | |||
| STORAGE_PREFIX: 'hts_dashboard_', | |||
| }, | |||
| }; | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Predefined Profiles | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| window.DASHBOARD_PROFILES = { | |||
| // High Performance Profile | |||
| HIGH_PERFORMANCE: { | |||
| UPDATE_INTERVAL: 15000, // Faster updates | |||
| CACHE_TTL: 30000, // Shorter cache | |||
| ENABLE_ANIMATIONS: false, // No animations | |||
| MAX_COINS_DISPLAY: 50, | |||
| }, | |||
| // Data Saver Profile | |||
| DATA_SAVER: { | |||
| UPDATE_INTERVAL: 60000, // Less frequent updates | |||
| CACHE_TTL: 300000, // Longer cache (5 minutes) | |||
| MAX_COINS_DISPLAY: 10, | |||
| MAX_NEWS_DISPLAY: 10, | |||
| }, | |||
| // Presentation Profile | |||
| PRESENTATION: { | |||
| ENABLE_ANIMATIONS: true, | |||
| UPDATE_INTERVAL: 20000, | |||
| SHOW_API_REQUESTS: false, | |||
| ENABLE_CONSOLE_LOGS: false, | |||
| }, | |||
| // Development Profile | |||
| DEVELOPMENT: { | |||
| DEBUG: { | |||
| ENABLE_CONSOLE_LOGS: true, | |||
| ENABLE_PERFORMANCE_MONITORING: true, | |||
| SHOW_API_REQUESTS: true, | |||
| SHOW_WS_MESSAGES: true, | |||
| }, | |||
| UPDATE_INTERVAL: 10000, | |||
| }, | |||
| }; | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Helper Function to Change Profile | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| window.applyDashboardProfile = function (profileName) { | |||
| if (window.DASHBOARD_PROFILES[profileName]) { | |||
| const profile = window.DASHBOARD_PROFILES[profileName]; | |||
| Object.assign(window.DASHBOARD_CONFIG, profile); | |||
| console.log(`β Profile "${profileName}" applied`); | |||
| // Reload application with new settings | |||
| if (window.app) { | |||
| window.app.destroy(); | |||
| window.app = new DashboardApp(); | |||
| window.app.init(); | |||
| } | |||
| } else { | |||
| console.error(`β Profile "${profileName}" not found`); | |||
| } | |||
| }; | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Helper Function to Change Backend URL | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| window.changeBackendURL = function (httpUrl, wsUrl) { | |||
| window.DASHBOARD_CONFIG.BACKEND_URL = httpUrl; | |||
| window.DASHBOARD_CONFIG.WS_URL = wsUrl || httpUrl.replace('https://', 'wss://').replace('http://', 'ws://') + '/ws'; | |||
| console.log('β Backend URL changed:'); | |||
| console.log(' HTTP:', window.DASHBOARD_CONFIG.BACKEND_URL); | |||
| console.log(' WS:', window.DASHBOARD_CONFIG.WS_URL); | |||
| // Reload application | |||
| if (window.app) { | |||
| window.app.destroy(); | |||
| window.app = new DashboardApp(); | |||
| window.app.init(); | |||
| } | |||
| }; | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Save Settings to LocalStorage | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| window.saveConfig = function () { | |||
| if (window.DASHBOARD_CONFIG.STORAGE.USE_LOCAL_STORAGE) { | |||
| try { | |||
| const configString = JSON.stringify(window.DASHBOARD_CONFIG); | |||
| localStorage.setItem( | |||
| window.DASHBOARD_CONFIG.STORAGE.STORAGE_PREFIX + 'config', | |||
| configString | |||
| ); | |||
| console.log('β Settings saved'); | |||
| } catch (error) { | |||
| console.error('β Error saving settings:', error); | |||
| } | |||
| } | |||
| }; | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Load Settings from LocalStorage | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| window.loadConfig = function () { | |||
| if (window.DASHBOARD_CONFIG.STORAGE.USE_LOCAL_STORAGE) { | |||
| try { | |||
| const configString = localStorage.getItem( | |||
| window.DASHBOARD_CONFIG.STORAGE.STORAGE_PREFIX + 'config' | |||
| ); | |||
| if (configString) { | |||
| const savedConfig = JSON.parse(configString); | |||
| Object.assign(window.DASHBOARD_CONFIG, savedConfig); | |||
| console.log('β Settings loaded'); | |||
| } | |||
| } catch (error) { | |||
| console.error('β Error loading settings:', error); | |||
| } | |||
| } | |||
| }; | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Auto-load Settings on Page Load | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| if (document.readyState === 'loading') { | |||
| document.addEventListener('DOMContentLoaded', () => { | |||
| window.loadConfig(); | |||
| }); | |||
| } else { | |||
| window.loadConfig(); | |||
| } | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| // Console Usage Guide | |||
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| console.log(` | |||
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| β HTS CRYPTO DASHBOARD - CONFIGURATION β | |||
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| π Available Commands: | |||
| 1. Change Profile: | |||
| applyDashboardProfile('HIGH_PERFORMANCE') | |||
| applyDashboardProfile('DATA_SAVER') | |||
| applyDashboardProfile('PRESENTATION') | |||
| applyDashboardProfile('DEVELOPMENT') | |||
| 2. Change Backend: | |||
| changeBackendURL('https://your-backend.com') | |||
| 3. Save/Load Settings: | |||
| saveConfig() | |||
| loadConfig() | |||
| 4. View Current Settings: | |||
| console.log(DASHBOARD_CONFIG) | |||
| 5. Manual Settings Change: | |||
| DASHBOARD_CONFIG.UPDATE_INTERVAL = 20000 | |||
| saveConfig() | |||
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |||
| `); | |||