{"version":3,"sources":["../node_modules/@tauri-apps/api/external/tslib/tslib.es6.js","../node_modules/@tauri-apps/api/core.js","../node_modules/@tauri-apps/api/event.js","../src/utils/logger.ts","../src/stores/useChartStore.ts","../src/services/mockTauriApi.ts","../src/services/tauriWrapper.ts","../src/services/HTTPDataProvider.ts","../src/services/ChartDataCoordinator.ts","../src/primitives/CountdownTimerPrimitive.ts","../src/primitives/TimeframeWatermarkPrimitive.ts","../src/constants/timeframes.ts","../src/hooks/usePlaceholderCandle.ts","../src/utils/chartHelpers.ts","../src/components/ErrorBoundary.tsx","../src/components/LoadingState.tsx","../src/components/EmptyState.tsx","../src/components/MarketDataChart.tsx","../src/components/StreamStatus.tsx","../src/hooks/useChartSetup.ts","../src/hooks/useChartZoom.ts","../src/hooks/useChartData.ts","../src/hooks/useCountdownTimer.ts","../src/services/ReconnectionManager.ts","../src/hooks/useReconnection.ts","../src/services/WebSocketService.ts","../src/hooks/useWebSocketData.ts","../src/stores/useTradingStore.ts","../src/pages/MarketChartPage.tsx","../src/index.ts"],"names":["once","message","TauriEvent","LogLevel","logger","CACHE_TTL","latency","isTauri","invoke","listen","jsxs","jsx","useRef","React","useEffect","createChart","useState","useCallback","scrollToTime","timeframe","retryCount","create","Box"],"mappings":"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","file":"index.mjs","sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nexport { __classPrivateFieldGet, __classPrivateFieldSet };\n","import { __classPrivateFieldGet, __classPrivateFieldSet } from './external/tslib/tslib.es6.js';\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\nvar _Channel_onmessage, _Channel_nextMessageIndex, _Channel_pendingMessages, _Channel_messageEndIndex, _Resource_rid;\n/**\n * Invoke your custom commands.\n *\n * This package is also accessible with `window.__TAURI__.core` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * A key to be used to implement a special function\n * on your types that define how your type should be serialized\n * when passing across the IPC.\n * @example\n * Given a type in Rust that looks like this\n * ```rs\n * #[derive(serde::Serialize, serde::Deserialize)\n * enum UserId {\n *   String(String),\n *   Number(u32),\n * }\n * ```\n * `UserId::String(\"id\")` would be serialized into `{ String: \"id\" }`\n * and so we need to pass the same structure back to Rust\n * ```ts\n * import { SERIALIZE_TO_IPC_FN } from \"@tauri-apps/api/core\"\n *\n * class UserIdString {\n *   id\n *   constructor(id) {\n *     this.id = id\n *   }\n *\n *   [SERIALIZE_TO_IPC_FN]() {\n *     return { String: this.id }\n *   }\n * }\n *\n * class UserIdNumber {\n *   id\n *   constructor(id) {\n *     this.id = id\n *   }\n *\n *   [SERIALIZE_TO_IPC_FN]() {\n *     return { Number: this.id }\n *   }\n * }\n *\n * type UserId = UserIdString | UserIdNumber\n * ```\n *\n */\n// if this value changes, make sure to update it in:\n// 1. ipc.js\n// 2. process-ipc-message-fn.js\nconst SERIALIZE_TO_IPC_FN = '__TAURI_TO_IPC_KEY__';\n/**\n * Stores the callback in a known location, and returns an identifier that can be passed to the backend.\n * The backend uses the identifier to `eval()` the callback.\n *\n * @return An unique identifier associated with the callback function.\n *\n * @since 1.0.0\n */\nfunction transformCallback(\n// TODO: Make this not optional in v3\ncallback, once = false) {\n    return window.__TAURI_INTERNALS__.transformCallback(callback, once);\n}\nclass Channel {\n    constructor(onmessage) {\n        _Channel_onmessage.set(this, void 0);\n        // the index is used as a mechanism to preserve message order\n        _Channel_nextMessageIndex.set(this, 0);\n        _Channel_pendingMessages.set(this, []);\n        _Channel_messageEndIndex.set(this, void 0);\n        __classPrivateFieldSet(this, _Channel_onmessage, onmessage || (() => { }), \"f\");\n        this.id = transformCallback((rawMessage) => {\n            const index = rawMessage.index;\n            if ('end' in rawMessage) {\n                if (index == __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n                    this.cleanupCallback();\n                }\n                else {\n                    __classPrivateFieldSet(this, _Channel_messageEndIndex, index, \"f\");\n                }\n                return;\n            }\n            const message = rawMessage.message;\n            // Process the message if we're at the right order\n            if (index == __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n                __classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n                __classPrivateFieldSet(this, _Channel_nextMessageIndex, __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n                // process pending messages\n                while (__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") in __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")) {\n                    const message = __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n                    __classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n                    // eslint-disable-next-line @typescript-eslint/no-array-delete\n                    delete __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n                    __classPrivateFieldSet(this, _Channel_nextMessageIndex, __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n                }\n                if (__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") === __classPrivateFieldGet(this, _Channel_messageEndIndex, \"f\")) {\n                    this.cleanupCallback();\n                }\n            }\n            // Queue the message if we're not\n            else {\n                // eslint-disable-next-line security/detect-object-injection\n                __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[index] = message;\n            }\n        });\n    }\n    cleanupCallback() {\n        window.__TAURI_INTERNALS__.unregisterCallback(this.id);\n    }\n    set onmessage(handler) {\n        __classPrivateFieldSet(this, _Channel_onmessage, handler, \"f\");\n    }\n    get onmessage() {\n        return __classPrivateFieldGet(this, _Channel_onmessage, \"f\");\n    }\n    [(_Channel_onmessage = new WeakMap(), _Channel_nextMessageIndex = new WeakMap(), _Channel_pendingMessages = new WeakMap(), _Channel_messageEndIndex = new WeakMap(), SERIALIZE_TO_IPC_FN)]() {\n        return `__CHANNEL__:${this.id}`;\n    }\n    toJSON() {\n        // eslint-disable-next-line security/detect-object-injection\n        return this[SERIALIZE_TO_IPC_FN]();\n    }\n}\nclass PluginListener {\n    constructor(plugin, event, channelId) {\n        this.plugin = plugin;\n        this.event = event;\n        this.channelId = channelId;\n    }\n    async unregister() {\n        return invoke(`plugin:${this.plugin}|remove_listener`, {\n            event: this.event,\n            channelId: this.channelId\n        });\n    }\n}\n/**\n * Adds a listener to a plugin event.\n *\n * @returns The listener object to stop listening to the events.\n *\n * @since 2.0.0\n */\nasync function addPluginListener(plugin, event, cb) {\n    const handler = new Channel(cb);\n    try {\n        return invoke(`plugin:${plugin}|register_listener`, {\n            event,\n            handler\n        }).then(() => new PluginListener(plugin, event, handler.id));\n    }\n    catch {\n        // TODO(v3): remove this fallback\n        // note: we must try with camelCase here for backwards compatibility\n        return invoke(`plugin:${plugin}|registerListener`, { event, handler }).then(() => new PluginListener(plugin, event, handler.id));\n    }\n}\n/**\n * Get permission state for a plugin.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function checkPermissions(plugin) {\n    return invoke(`plugin:${plugin}|check_permissions`);\n}\n/**\n * Request permissions.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function requestPermissions(plugin) {\n    return invoke(`plugin:${plugin}|request_permissions`);\n}\n/**\n * Sends a message to the backend.\n * @example\n * ```typescript\n * import { invoke } from '@tauri-apps/api/core';\n * await invoke('login', { user: 'tauri', password: 'poiwe3h4r5ip3yrhtew9ty' });\n * ```\n *\n * @param cmd The command name.\n * @param args The optional arguments to pass to the command.\n * @param options The request options.\n * @return A promise resolving or rejecting to the backend response.\n *\n * @since 1.0.0\n */\nasync function invoke(cmd, args = {}, options) {\n    return window.__TAURI_INTERNALS__.invoke(cmd, args, options);\n}\n/**\n * Convert a device file path to an URL that can be loaded by the webview.\n * Note that `asset:` and `http://asset.localhost` must be added to [`app.security.csp`](https://v2.tauri.app/reference/config/#csp-1) in `tauri.conf.json`.\n * Example CSP value: `\"csp\": \"default-src 'self' ipc: http://ipc.localhost; img-src 'self' asset: http://asset.localhost\"` to use the asset protocol on image sources.\n *\n * Additionally, `\"enable\" : \"true\"` must be added to [`app.security.assetProtocol`](https://v2.tauri.app/reference/config/#assetprotocolconfig)\n * in `tauri.conf.json` and its access scope must be defined on the `scope` array on the same `assetProtocol` object.\n *\n * @param  filePath The file path.\n * @param  protocol The protocol to use. Defaults to `asset`. You only need to set this when using a custom protocol.\n * @example\n * ```typescript\n * import { appDataDir, join } from '@tauri-apps/api/path';\n * import { convertFileSrc } from '@tauri-apps/api/core';\n * const appDataDirPath = await appDataDir();\n * const filePath = await join(appDataDirPath, 'assets/video.mp4');\n * const assetUrl = convertFileSrc(filePath);\n *\n * const video = document.getElementById('my-video');\n * const source = document.createElement('source');\n * source.type = 'video/mp4';\n * source.src = assetUrl;\n * video.appendChild(source);\n * video.load();\n * ```\n *\n * @return the URL that can be used as source on the webview.\n *\n * @since 1.0.0\n */\nfunction convertFileSrc(filePath, protocol = 'asset') {\n    return window.__TAURI_INTERNALS__.convertFileSrc(filePath, protocol);\n}\n/**\n * A rust-backed resource stored through `tauri::Manager::resources_table` API.\n *\n * The resource lives in the main process and does not exist\n * in the Javascript world, and thus will not be cleaned up automatiacally\n * except on application exit. If you want to clean it up early, call {@linkcode Resource.close}\n *\n * @example\n * ```typescript\n * import { Resource, invoke } from '@tauri-apps/api/core';\n * export class DatabaseHandle extends Resource {\n *   static async open(path: string): Promise<DatabaseHandle> {\n *     const rid: number = await invoke('open_db', { path });\n *     return new DatabaseHandle(rid);\n *   }\n *\n *   async execute(sql: string): Promise<void> {\n *     await invoke('execute_sql', { rid: this.rid, sql });\n *   }\n * }\n * ```\n */\nclass Resource {\n    get rid() {\n        return __classPrivateFieldGet(this, _Resource_rid, \"f\");\n    }\n    constructor(rid) {\n        _Resource_rid.set(this, void 0);\n        __classPrivateFieldSet(this, _Resource_rid, rid, \"f\");\n    }\n    /**\n     * Destroys and cleans up this resource from memory.\n     * **You should not call any method on this object anymore and should drop any reference to it.**\n     */\n    async close() {\n        return invoke('plugin:resources|close', {\n            rid: this.rid\n        });\n    }\n}\n_Resource_rid = new WeakMap();\nfunction isTauri() {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n    return !!(globalThis || window).isTauri;\n}\n\nexport { Channel, PluginListener, Resource, SERIALIZE_TO_IPC_FN, addPluginListener, checkPermissions, convertFileSrc, invoke, isTauri, requestPermissions, transformCallback };\n","import { invoke, transformCallback } from './core.js';\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\n/**\n * The event system allows you to emit events to the backend and listen to events from it.\n *\n * This package is also accessible with `window.__TAURI__.event` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * @since 1.1.0\n */\nvar TauriEvent;\n(function (TauriEvent) {\n    TauriEvent[\"WINDOW_RESIZED\"] = \"tauri://resize\";\n    TauriEvent[\"WINDOW_MOVED\"] = \"tauri://move\";\n    TauriEvent[\"WINDOW_CLOSE_REQUESTED\"] = \"tauri://close-requested\";\n    TauriEvent[\"WINDOW_DESTROYED\"] = \"tauri://destroyed\";\n    TauriEvent[\"WINDOW_FOCUS\"] = \"tauri://focus\";\n    TauriEvent[\"WINDOW_BLUR\"] = \"tauri://blur\";\n    TauriEvent[\"WINDOW_SCALE_FACTOR_CHANGED\"] = \"tauri://scale-change\";\n    TauriEvent[\"WINDOW_THEME_CHANGED\"] = \"tauri://theme-changed\";\n    TauriEvent[\"WINDOW_CREATED\"] = \"tauri://window-created\";\n    TauriEvent[\"WEBVIEW_CREATED\"] = \"tauri://webview-created\";\n    TauriEvent[\"DRAG_ENTER\"] = \"tauri://drag-enter\";\n    TauriEvent[\"DRAG_OVER\"] = \"tauri://drag-over\";\n    TauriEvent[\"DRAG_DROP\"] = \"tauri://drag-drop\";\n    TauriEvent[\"DRAG_LEAVE\"] = \"tauri://drag-leave\";\n})(TauriEvent || (TauriEvent = {}));\n/**\n * Unregister the event listener associated with the given name and id.\n *\n * @ignore\n * @param event The event name\n * @param eventId Event identifier\n * @returns\n */\nasync function _unlisten(event, eventId) {\n    window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(event, eventId);\n    await invoke('plugin:event|unlisten', {\n        event,\n        eventId\n    });\n}\n/**\n * Listen to an emitted event to any {@link EventTarget|target}.\n *\n * @example\n * ```typescript\n * import { listen } from '@tauri-apps/api/event';\n * const unlisten = await listen<string>('error', (event) => {\n *   console.log(`Got error, payload: ${event.payload}`);\n * });\n *\n * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted\n * unlisten();\n * ```\n *\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param handler Event handler callback.\n * @param options Event listening options.\n * @returns A promise resolving to a function to unlisten to the event.\n * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted.\n *\n * @since 1.0.0\n */\nasync function listen(event, handler, options) {\n    var _a;\n    const target = typeof (options === null || options === void 0 ? void 0 : options.target) === 'string'\n        ? { kind: 'AnyLabel', label: options.target }\n        : ((_a = options === null || options === void 0 ? void 0 : options.target) !== null && _a !== void 0 ? _a : { kind: 'Any' });\n    return invoke('plugin:event|listen', {\n        event,\n        target,\n        handler: transformCallback(handler)\n    }).then((eventId) => {\n        return async () => _unlisten(event, eventId);\n    });\n}\n/**\n * Listens once to an emitted event to any {@link EventTarget|target}.\n *\n * @example\n * ```typescript\n * import { once } from '@tauri-apps/api/event';\n * interface LoadedPayload {\n *   loggedIn: boolean,\n *   token: string\n * }\n * const unlisten = await once<LoadedPayload>('loaded', (event) => {\n *   console.log(`App is loaded, loggedIn: ${event.payload.loggedIn}, token: ${event.payload.token}`);\n * });\n *\n * // you need to call unlisten if your handler goes out of scope e.g. the component is unmounted\n * unlisten();\n * ```\n *\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param handler Event handler callback.\n * @param options Event listening options.\n * @returns A promise resolving to a function to unlisten to the event.\n * Note that removing the listener is required if your listener goes out of scope e.g. the component is unmounted.\n *\n * @since 1.0.0\n */\nasync function once(event, handler, options) {\n    return listen(event, (eventData) => {\n        void _unlisten(event, eventData.id);\n        handler(eventData);\n    }, options);\n}\n/**\n * Emits an event to all {@link EventTarget|targets}.\n *\n * @example\n * ```typescript\n * import { emit } from '@tauri-apps/api/event';\n * await emit('frontend-loaded', { loggedIn: true, token: 'authToken' });\n * ```\n *\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param payload Event payload.\n *\n * @since 1.0.0\n */\nasync function emit(event, payload) {\n    await invoke('plugin:event|emit', {\n        event,\n        payload\n    });\n}\n/**\n * Emits an event to all {@link EventTarget|targets} matching the given target.\n *\n * @example\n * ```typescript\n * import { emitTo } from '@tauri-apps/api/event';\n * await emitTo('main', 'frontend-loaded', { loggedIn: true, token: 'authToken' });\n * ```\n *\n * @param target Label of the target Window/Webview/WebviewWindow or raw {@link EventTarget} object.\n * @param event Event name. Must include only alphanumeric characters, `-`, `/`, `:` and `_`.\n * @param payload Event payload.\n *\n * @since 2.0.0\n */\nasync function emitTo(target, event, payload) {\n    const eventTarget = typeof target === 'string' ? { kind: 'AnyLabel', label: target } : target;\n    await invoke('plugin:event|emit_to', {\n        target: eventTarget,\n        event,\n        payload\n    });\n}\n\nexport { TauriEvent, emit, emitTo, listen, once };\n","export enum LogLevel {\n  ERROR = 0,\n  WARN = 1,\n  INFO = 2,\n  DEBUG = 3,\n  TRACE = 4\n}\n\nexport interface LoggerConfig {\n  level: LogLevel;\n  prefix?: string;\n  enableTimestamp?: boolean;\n  enableColors?: boolean;\n  customHandler?: (level: LogLevel, message: string, ...args: unknown[]) => void;\n}\n\nclass Logger {\n  private config: LoggerConfig = {\n    level: LogLevel.ERROR, // Only show errors, suppress INFO/DEBUG/TRACE\n    enableTimestamp: true,\n    enableColors: true\n  };\n\n  private colors = {\n    [LogLevel.ERROR]: '\\x1b[31m', // Red\n    [LogLevel.WARN]: '\\x1b[33m',  // Yellow\n    [LogLevel.INFO]: '\\x1b[36m',  // Cyan\n    [LogLevel.DEBUG]: '\\x1b[90m', // Gray\n    [LogLevel.TRACE]: '\\x1b[37m', // White\n    reset: '\\x1b[0m'\n  };\n\n  configure(config: Partial<LoggerConfig>) {\n    this.config = { ...this.config, ...config };\n  }\n\n  private shouldLog(level: LogLevel): boolean {\n    // Check window.__CHART_LOG_LEVEL__ dynamically each time (may be set after library loads)\n    if (typeof window !== 'undefined' && window.__CHART_LOG_LEVEL__) {\n      const dynamicLevel = LogLevel[window.__CHART_LOG_LEVEL__ as keyof typeof LogLevel];\n      if (dynamicLevel !== undefined) {\n        return level <= dynamicLevel;\n      }\n    }\n    return level <= this.config.level;\n  }\n\n  private formatMessage(level: LogLevel, message: string): string {\n    const parts: string[] = [];\n    \n    if (this.config.enableTimestamp) {\n      parts.push(`[${new Date().toISOString()}]`);\n    }\n    \n    if (this.config.prefix) {\n      parts.push(`[${this.config.prefix}]`);\n    }\n    \n    parts.push(`[${LogLevel[level]}]`);\n    parts.push(message);\n    \n    return parts.join(' ');\n  }\n\n  private log(level: LogLevel, message: string, ...args: unknown[]) {\n    if (!this.shouldLog(level)) return;\n\n    if (this.config.customHandler) {\n      this.config.customHandler(level, message, ...args);\n      return;\n    }\n\n    const formattedMessage = this.formatMessage(level, message);\n    const logMethod = level === LogLevel.ERROR ? console.error : \n                     level === LogLevel.WARN ? console.warn : \n                     console.log;\n\n    if (this.config.enableColors && typeof window === 'undefined') {\n      // Node.js environment\n      const color = this.colors[level];\n      logMethod(`${color}${formattedMessage}${this.colors.reset}`, ...args);\n    } else {\n      logMethod(formattedMessage, ...args);\n    }\n  }\n\n  error(message: string, ...args: unknown[]) {\n    this.log(LogLevel.ERROR, message, ...args);\n  }\n\n  warn(message: string, ...args: unknown[]) {\n    this.log(LogLevel.WARN, message, ...args);\n  }\n\n  info(message: string, ...args: unknown[]) {\n    this.log(LogLevel.INFO, message, ...args);\n  }\n\n  debug(message: string, ...args: unknown[]) {\n    this.log(LogLevel.DEBUG, message, ...args);\n  }\n\n  trace(message: string, ...args: unknown[]) {\n    this.log(LogLevel.TRACE, message, ...args);\n  }\n\n  // Create a child logger with a specific prefix\n  child(prefix: string): Logger {\n    const childLogger = new Logger();\n    childLogger.configure({\n      ...this.config,\n      prefix: this.config.prefix ? `${this.config.prefix}:${prefix}` : prefix\n    });\n    return childLogger;\n  }\n}\n\n// Create default logger instance\nexport const logger = new Logger();\n\n// Configure logger based on environment\nif (typeof window !== 'undefined') {\n  // Browser environment\n  const logLevel = window.__CHART_LOG_LEVEL__ ? \n                   (LogLevel[window.__CHART_LOG_LEVEL__ as keyof typeof LogLevel] || LogLevel.INFO) :\n                   (process.env.NODE_ENV === 'development' ? LogLevel.INFO : LogLevel.WARN);\n  logger.configure({ level: logLevel });\n} else {\n  // Node.js environment\n  const logLevel = process.env.LOG_LEVEL ? \n                   LogLevel[process.env.LOG_LEVEL as keyof typeof LogLevel] || LogLevel.INFO : \n                   LogLevel.INFO;\n  logger.configure({ level: logLevel });\n}\n\n// Export convenience functions\nexport const createLogger = (prefix: string) => logger.child(prefix);","import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\nimport { ChartData, ViewState } from '../types';\nimport { createLogger } from '../utils/logger';\n\ninterface CachedData {\n  candles: ChartData[];\n  timestamp: number;\n}\n\ninterface MetadataCache {\n  [symbol: string]: {\n    from: number;\n    to: number;\n    timestamp: number;\n  };\n}\n\ninterface ChartState {\n  // Cache\n  candleCache: Map<string, CachedData>;\n  viewStates: Map<string, ViewState>;\n  metadataCache: MetadataCache;\n\n  // Current state\n  isLoading: boolean;\n  currentSymbol: string;\n  currentTimeframe: string;\n\n  // Actions\n  setLoading: (loading: boolean) => void;\n  setCurrentSymbol: (symbol: string) => void;\n  setCurrentTimeframe: (timeframe: string) => void;\n\n  // Cache actions\n  getCachedCandles: (key: string) => ChartData[] | null;\n  setCachedCandles: (key: string, candles: ChartData[]) => void;\n  invalidateCache: (pattern?: string) => void;\n\n  // Metadata cache actions\n  getCachedMetadata: (symbol: string) => { from: number; to: number } | null;\n  setCachedMetadata: (symbol: string, from: number, to: number) => void;\n\n  // View state actions\n  saveViewState: (symbol: string, state: ViewState) => void;\n  getViewState: (symbol: string) => ViewState | null;\n\n  // Utility\n  getCacheKey: (symbol: string, timeframe: string, from: number, to: number) => string;\n}\n\nconst CACHE_TTL = 10 * 60 * 1000; // 10 minutes\n\nconst logger = createLogger('useChartStore');\n\nexport const useChartStore = create<ChartState>()(\n  devtools(\n    (set, get) => ({\n      // Initial state\n      candleCache: new Map(),\n      viewStates: new Map(),\n      metadataCache: {},\n      isLoading: false,\n      currentSymbol: 'EURUSD',\n      currentTimeframe: '1h',\n\n      // Basic setters\n      setLoading: (loading) => set({ isLoading: loading }),\n      setCurrentSymbol: (symbol) => set({ currentSymbol: symbol }),\n      setCurrentTimeframe: (timeframe) => set({ currentTimeframe: timeframe }),\n\n      // Cache key generator - MUST match backend normalization\n      getCacheKey: (symbol, timeframe, from, to) => {\n        // CRITICAL: Match backend timestamp normalization from candles/commands.rs\n        const normalizationFactor: Record<string, number> = {\n          '1m': 300,      // 5 minutes\n          '5m': 900,      // 15 minutes\n          '15m': 3600,    // 1 hour\n          '1h': 7200,     // 2 hours\n          '4h': 14400,    // 4 hours\n          '12h': 43200,   // 12 hours\n        };\n        \n        const factor = normalizationFactor[timeframe] || 3600;\n        const normalizedFrom = Math.floor(from / factor) * factor;\n        const normalizedTo = Math.floor(to / factor) * factor;\n        \n        return `${symbol}-${timeframe}-${normalizedFrom}-${normalizedTo}`;\n      },\n\n      // Get cached candles\n      getCachedCandles: (key) => {\n        const cached = get().candleCache.get(key);\n        if (!cached) {\n          logger.debug('Cache miss for:', key);\n          logger.debug('Current cache keys:', Array.from(get().candleCache.keys()));\n          return null;\n        }\n\n        // Check if expired\n        const now = Date.now();\n        const age = now - cached.timestamp;\n        if (age > CACHE_TTL) {\n          logger.debug('Cache expired for:', key, {\n            age: `${(age / 1000).toFixed(0)}s`,\n            ttl: `${(CACHE_TTL / 1000).toFixed(0)}s`,\n            cachedAt: new Date(cached.timestamp).toISOString(),\n            now: new Date(now).toISOString(),\n          });\n          // Remove expired entry\n          const newCache = new Map(get().candleCache);\n          newCache.delete(key);\n          set({ candleCache: newCache });\n          return null;\n        }\n\n        logger.debug(\n          'Cache hit for:',\n          key,\n          `(${cached.candles.length} candles, age: ${(age / 1000).toFixed(0)}s)`\n        );\n        return cached.candles;\n      },\n\n      // Set cached candles\n      setCachedCandles: (key, candles) => {\n        const newCache = new Map(get().candleCache);\n\n        // Simple LRU: if cache is too big, remove oldest\n        if (newCache.size >= 100) {\n          const entries = Array.from(newCache.entries()).sort(\n            (a, b) => a[1].timestamp - b[1].timestamp\n          );\n          if (entries.length > 0 && entries[0]) {\n            const oldestKey = entries[0][0];\n            newCache.delete(oldestKey);\n            logger.info('Cache eviction, removed:', oldestKey);\n          }\n        }\n\n        newCache.set(key, {\n          candles,\n          timestamp: Date.now(),\n        });\n\n        logger.debug('Cached', candles.length, 'candles for:', key);\n        set({ candleCache: newCache });\n      },\n\n      // Invalidate cache\n      invalidateCache: (pattern) => {\n        const cache = get().candleCache;\n        if (!pattern) {\n          logger.info('Clearing entire cache');\n          set({ candleCache: new Map() });\n          return;\n        }\n\n        const newCache = new Map(cache);\n        let removed = 0;\n\n        cache.forEach((_, key) => {\n          if (key.includes(pattern)) {\n            newCache.delete(key);\n            removed++;\n          }\n        });\n\n        logger.info(`Invalidated ${removed} cache entries matching:`, pattern);\n        set({ candleCache: newCache });\n      },\n\n      // Save view state\n      saveViewState: (symbol, state) => {\n        const newViewStates = new Map(get().viewStates);\n        newViewStates.set(symbol, state);\n        logger.debug('Saved view state for:', symbol, state);\n        set({ viewStates: newViewStates });\n      },\n\n      // Get view state\n      getViewState: (symbol) => {\n        const state = get().viewStates.get(symbol);\n        if (state) {\n          logger.debug('Retrieved view state for:', symbol, state);\n        }\n        return state || null;\n      },\n\n      // Get cached metadata\n      getCachedMetadata: (symbol) => {\n        const cached = get().metadataCache[symbol];\n        if (!cached) {\n          logger.debug(\n            'Metadata cache miss for:',\n            symbol,\n            'Available keys:',\n            Object.keys(get().metadataCache)\n          );\n          return null;\n        }\n\n        // Check if expired\n        const now = Date.now();\n        const age = now - cached.timestamp;\n        if (age > CACHE_TTL) {\n          logger.debug(\n            'Metadata cache expired for:',\n            symbol,\n            `age: ${(age / 1000).toFixed(0)}s`\n          );\n          // Remove expired entry\n          const newCache = { ...get().metadataCache };\n          delete newCache[symbol];\n          set({ metadataCache: newCache });\n          return null;\n        }\n\n        logger.debug('Metadata cache hit for:', symbol);\n        return { from: cached.from, to: cached.to };\n      },\n\n      // Set cached metadata\n      setCachedMetadata: (symbol, from, to) => {\n        const newCache = {\n          ...get().metadataCache,\n          [symbol]: {\n            from,\n            to,\n            timestamp: Date.now(),\n          },\n        };\n        logger.debug('Cached metadata for:', symbol, { from, to });\n        set({ metadataCache: newCache });\n      },\n    }),\n    {\n      name: 'chart-store',\n    }\n  )\n);","import { createLogger } from '../utils/logger';\nimport { Candle, FetchCandlesArgs } from '../types';\n\nconst logger = createLogger('MockTauriApi');\n\n// Cache for generated candles to simulate a real backend with caching\ninterface CacheEntry {\n  candles: Candle[];\n  timestamp: number;\n}\n\nconst candleCache = new Map<string, CacheEntry>();\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes (like a real API might cache)\n\n// Metrics tracking\ninterface RequestMetrics {\n  timestamp: number;\n  symbol: string;\n  timeframe: string;\n  from: number;\n  to: number;\n  candlesReturned: number;\n  cacheHit: boolean;\n  latencyMs: number;\n  bytesEstimate: number;\n}\n\ninterface MetricsSummary {\n  totalRequests: number;\n  cacheHits: number;\n  cacheMisses: number;\n  cacheHitRate: number;\n  totalCandles: number;\n  totalBytesEstimate: number;\n  averageLatencyMs: number;\n  byTimeframe: Record<string, {\n    requests: number;\n    candles: number;\n    avgCandlesPerRequest: number;\n    bytesEstimate: number;\n  }>;\n  bySymbol: Record<string, {\n    requests: number;\n    candles: number;\n    bytesEstimate: number;\n  }>;\n  requestLog: RequestMetrics[];\n}\n\nconst requestMetrics: RequestMetrics[] = [];\n\n// Network latency simulation\nconst LATENCY_ENABLED = false; // Set to false to disable for testing\nconst LATENCY_MIN = 50;  // Minimum latency in ms\nconst LATENCY_MAX = 150; // Maximum latency in ms\n\n// Simulate network delay with randomness (like real networks)\nconst simulateNetworkLatency = async (): Promise<number> => {\n  if (!LATENCY_ENABLED) return 0;\n\n  const delay = LATENCY_MIN + Math.random() * (LATENCY_MAX - LATENCY_MIN);\n  logger.info(`[NETWORK] Simulating ${Math.round(delay)}ms latency`);\n  await new Promise(resolve => setTimeout(resolve, delay));\n  return delay;\n};\n\n// Estimate bytes for a candle (rough approximation)\nconst estimateCandleBytes = (_candle: Candle): number => {\n  // Each number is 8 bytes (float64), plus overhead for JSON structure\n  // time, open, high, low, close, volume = 6 numbers * 8 bytes = 48 bytes\n  // Add ~20 bytes for JSON overhead (commas, brackets, property names)\n  return 68;\n};\n\n// Record a request in metrics\nconst recordRequest = (\n  symbol: string,\n  timeframe: string,\n  from: number,\n  to: number,\n  candles: Candle[],\n  cacheHit: boolean,\n  latencyMs: number\n): void => {\n  const bytesEstimate = candles.length * estimateCandleBytes(candles[0] || {\n    time: 0,\n    open: 0,\n    high: 0,\n    low: 0,\n    close: 0,\n    volume: 0\n  });\n\n  const metric: RequestMetrics = {\n    timestamp: Date.now(),\n    symbol,\n    timeframe,\n    from,\n    to,\n    candlesReturned: candles.length,\n    cacheHit,\n    latencyMs,\n    bytesEstimate\n  };\n\n  requestMetrics.push(metric);\n\n  // Log detailed request info\n  logger.info(\n    `[METRICS] ${cacheHit ? 'CACHE HIT' : 'CACHE MISS'} | ` +\n    `${symbol} ${timeframe} | ` +\n    `${candles.length} candles | ` +\n    `~${(bytesEstimate / 1024).toFixed(2)} KB | ` +\n    `${latencyMs.toFixed(0)}ms`\n  );\n};\n\n// Generate metrics summary\nexport const getMetricsSummary = (): MetricsSummary => {\n  if (requestMetrics.length === 0) {\n    return {\n      totalRequests: 0,\n      cacheHits: 0,\n      cacheMisses: 0,\n      cacheHitRate: 0,\n      totalCandles: 0,\n      totalBytesEstimate: 0,\n      averageLatencyMs: 0,\n      byTimeframe: {},\n      bySymbol: {},\n      requestLog: []\n    };\n  }\n\n  const cacheHits = requestMetrics.filter(m => m.cacheHit).length;\n  const cacheMisses = requestMetrics.length - cacheHits;\n  const totalCandles = requestMetrics.reduce((sum, m) => sum + m.candlesReturned, 0);\n  const totalBytes = requestMetrics.reduce((sum, m) => sum + m.bytesEstimate, 0);\n  const avgLatency = requestMetrics.reduce((sum, m) => sum + m.latencyMs, 0) / requestMetrics.length;\n\n  // Group by timeframe\n  const byTimeframe: MetricsSummary['byTimeframe'] = {};\n  requestMetrics.forEach(m => {\n    if (!byTimeframe[m.timeframe]) {\n      byTimeframe[m.timeframe] = { requests: 0, candles: 0, avgCandlesPerRequest: 0, bytesEstimate: 0 };\n    }\n    const tf = byTimeframe[m.timeframe];\n    if (tf) {\n      tf.requests++;\n      tf.candles += m.candlesReturned;\n      tf.bytesEstimate += m.bytesEstimate;\n    }\n  });\n\n  // Calculate averages for timeframes\n  Object.keys(byTimeframe).forEach(tf => {\n    const stats = byTimeframe[tf];\n    if (stats) {\n      stats.avgCandlesPerRequest = stats.candles / stats.requests;\n    }\n  });\n\n  // Group by symbol\n  const bySymbol: MetricsSummary['bySymbol'] = {};\n  requestMetrics.forEach(m => {\n    if (!bySymbol[m.symbol]) {\n      bySymbol[m.symbol] = { requests: 0, candles: 0, bytesEstimate: 0 };\n    }\n    const sym = bySymbol[m.symbol];\n    if (sym) {\n      sym.requests++;\n      sym.candles += m.candlesReturned;\n      sym.bytesEstimate += m.bytesEstimate;\n    }\n  });\n\n  return {\n    totalRequests: requestMetrics.length,\n    cacheHits,\n    cacheMisses,\n    cacheHitRate: (cacheHits / requestMetrics.length) * 100,\n    totalCandles,\n    totalBytesEstimate: totalBytes,\n    averageLatencyMs: avgLatency,\n    byTimeframe,\n    bySymbol,\n    requestLog: [...requestMetrics] // Return a copy\n  };\n};\n\n// Print formatted metrics summary to console\nexport const printMetricsSummary = (): void => {\n  const summary = getMetricsSummary();\n\n  console.log('\\n' + '='.repeat(80));\n  console.log('📊 MOCK API METRICS SUMMARY');\n  console.log('='.repeat(80));\n\n  console.log('\\n📈 OVERALL STATISTICS:');\n  console.log(`  Total Requests:        ${summary.totalRequests}`);\n  console.log(`  Cache Hits:            ${summary.cacheHits} (${summary.cacheHitRate.toFixed(1)}%)`);\n  console.log(`  Cache Misses:          ${summary.cacheMisses}`);\n  console.log(`  Total Candles:         ${summary.totalCandles.toLocaleString()}`);\n  console.log(`  Total Data Volume:     ~${(summary.totalBytesEstimate / 1024).toFixed(2)} KB`);\n  console.log(`  Average Latency:       ${summary.averageLatencyMs.toFixed(0)}ms`);\n\n  console.log('\\n📊 BY TIMEFRAME:');\n  Object.entries(summary.byTimeframe)\n    .sort(([, a], [, b]) => b.requests - a.requests)\n    .forEach(([timeframe, stats]) => {\n      console.log(`  ${timeframe.padEnd(6)} - ${stats.requests} requests | ` +\n        `${stats.candles.toLocaleString()} candles | ` +\n        `avg ${Math.round(stats.avgCandlesPerRequest)} candles/req | ` +\n        `~${(stats.bytesEstimate / 1024).toFixed(2)} KB`);\n    });\n\n  console.log('\\n🎯 BY SYMBOL:');\n  Object.entries(summary.bySymbol)\n    .sort(([, a], [, b]) => b.requests - a.requests)\n    .forEach(([symbol, stats]) => {\n      console.log(`  ${symbol.padEnd(10)} - ${stats.requests} requests | ` +\n        `${stats.candles.toLocaleString()} candles | ` +\n        `~${(stats.bytesEstimate / 1024).toFixed(2)} KB`);\n    });\n\n  console.log('\\n' + '='.repeat(80) + '\\n');\n};\n\n// Reset metrics (useful for testing different scenarios)\nexport const resetMetrics = (): void => {\n  requestMetrics.length = 0;\n  logger.info('[METRICS] Reset all metrics');\n};\n\n// Helper to get base price for a symbol\nconst getBasePrice = (symbol: string): number => {\n  if (symbol.includes('BTC')) return 112700;\n  if (symbol.includes('ETH')) return 3800;\n  if (symbol.includes('SOL')) return 220;\n  return 1.0800;\n};\n\n// Helper to get volatility for a symbol\nconst getVolatility = (symbol: string): number => {\n  return (symbol.includes('BTC') || symbol.includes('ETH') || symbol.includes('SOL')) ? 0.001 : 0.0001;\n};\n\n// Deterministic price generator with consistent seeding\nconst generateDeterministicPrice = (\n  basePrice: number,\n  volatility: number,\n  daySeed: number,\n  offset: number\n): number => {\n  // Multi-component price with consistent seed\n  const trend = Math.sin(daySeed / 30) * basePrice * volatility * 2;\n  const daily = Math.sin(daySeed) * basePrice * volatility;\n  const micro = Math.sin((daySeed + offset) * 12.9898) * 43758.5453;\n  const noise = (micro - Math.floor(micro) - 0.5) * basePrice * volatility * 0.5;\n\n  return basePrice + trend + daily + noise;\n};\n\n// Generate cache key from request parameters\nconst getCacheKey = (symbol: string, timeframe: string, from: number, to: number): string => {\n  return `${symbol}-${timeframe}-${from}-${to}`;\n};\n\n// Align time to candle boundary\nconst alignToCandleBoundary = (timestamp: number, interval: number): number => {\n  // For 4h and 12h candles, align to UTC midnight\n  if (interval === 14400) { // 4h in seconds\n    // Align to 00:00, 04:00, 08:00, 12:00, 16:00, 20:00 UTC\n    const date = new Date(timestamp * 1000);\n    const hours = date.getUTCHours();\n    const alignedHours = Math.floor(hours / 4) * 4;\n    date.setUTCHours(alignedHours, 0, 0, 0);\n    return Math.floor(date.getTime() / 1000);\n  } else if (interval === 43200) { // 12h in seconds\n    // Align to 00:00 and 12:00 UTC\n    const date = new Date(timestamp * 1000);\n    const hours = date.getUTCHours();\n    const alignedHours = hours < 12 ? 0 : 12;\n    date.setUTCHours(alignedHours, 0, 0, 0);\n    return Math.floor(date.getTime() / 1000);\n  }\n\n  // For other intervals, use simple floor division\n  return Math.floor(timestamp / interval) * interval;\n};\n\n// Generate candles hierarchically - always from 5m base for perfect alignment\nconst generateCandlesHierarchical = (\n  from: number,\n  to: number,\n  symbol: string,\n  timeframe: string\n): Candle[] => {\n  const intervals: Record<string, number> = {\n    '5m': 300,\n    '15m': 900,\n    '1h': 3600,\n    '4h': 14400,\n    '12h': 43200\n  };\n\n  const targetInterval = intervals[timeframe] || 3600;\n  const baseInterval = 300; // Always start with 5m base\n\n  const basePrice = getBasePrice(symbol);\n  const volatility = getVolatility(symbol);\n\n  // Step 1: Generate ALL 5m candles for the range\n  const base5mCandles: Candle[] = [];\n  const alignedStart = alignToCandleBoundary(from, baseInterval);\n  const alignedEnd = alignToCandleBoundary(to + targetInterval, baseInterval);\n\n  for (let time = alignedStart; time < alignedEnd; time += baseInterval) {\n    const seed = time / 86400;\n\n    const open = generateDeterministicPrice(basePrice, volatility, seed, 0);\n    const close = generateDeterministicPrice(basePrice, volatility, seed, 0.95);\n    const high = generateDeterministicPrice(basePrice, volatility, seed, 0.3) * 1.0002;\n    const low = generateDeterministicPrice(basePrice, volatility, seed, 0.6) * 0.9998;\n\n    base5mCandles.push({\n      time,\n      open,\n      high: Math.max(open, close, high),\n      low: Math.min(open, close, low),\n      close,\n      volume: Math.floor(10000 + Math.sin(seed * 123.456) * 5000)\n    });\n  }\n\n  // Step 2: If requesting 5m, return as-is\n  if (targetInterval === baseInterval) {\n    return base5mCandles.filter(c => c.time >= from && c.time <= to);\n  }\n\n  // Step 3: Aggregate 5m candles to target timeframe (OPTIMIZED - O(n) instead of O(n²))\n  const aggregated: Candle[] = [];\n  const targetAlignedStart = alignToCandleBoundary(from, targetInterval);\n  const targetAlignedEnd = alignToCandleBoundary(to + targetInterval, targetInterval);\n\n  let baseIndex = 0; // Track position in base5mCandles array\n\n  for (let time = targetAlignedStart; time < targetAlignedEnd; time += targetInterval) {\n    // Skip candles before this window (sequential scan, not filter)\n    while (baseIndex < base5mCandles.length) {\n      const candle = base5mCandles[baseIndex];\n      if (!candle || candle.time >= time) break;\n      baseIndex++;\n    }\n\n    // Collect candles for this target window\n    const subCandles: Candle[] = [];\n    let idx = baseIndex;\n    while (idx < base5mCandles.length) {\n      const candle = base5mCandles[idx];\n      if (!candle || candle.time >= time + targetInterval) break;\n      subCandles.push(candle);\n      idx++;\n    }\n\n    if (subCandles.length > 0) {\n      const firstCandle = subCandles[0]!;\n      const lastCandle = subCandles[subCandles.length - 1]!;\n\n      aggregated.push({\n        time,\n        open: firstCandle.open,\n        high: Math.max(...subCandles.map(c => c.high)),\n        low: Math.min(...subCandles.map(c => c.low)),\n        close: lastCandle.close,\n        volume: subCandles.reduce((sum, c) => sum + (c.volume || 0), 0)\n      });\n    }\n  }\n\n  return aggregated.filter(c => c.time >= from && c.time <= to);\n};\n\n// Mock Tauri API for browser development\nexport const mockInvoke = async <T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T> => {\n  logger.debug(`Command: ${cmd}`, args);\n\n  // Mock responses for different commands\n  switch (cmd) {\n    case 'fetch_candles':\n      // Return mock candle data\n      if (!args || !('request' in args)) {\n        throw new Error('Missing request parameter');\n      }\n      const { request } = args as unknown as FetchCandlesArgs;\n      const { symbol, timeframe, from } = request;\n      // Ensure we don't generate data beyond current time minus 2 minutes to leave room for real-time updates\n      const now = Math.floor(Date.now() / 1000);\n      const to = Math.min(request.to, now - 120);\n\n      // Check cache first\n      const cacheKey = getCacheKey(symbol, timeframe, from, to);\n      const cached = candleCache.get(cacheKey);\n\n      if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n        logger.info(`[CACHE HIT] Returning ${cached.candles.length} cached ${timeframe} candles for ${symbol}`);\n        // Even cache hits have some latency (network roundtrip)\n        const latency = await simulateNetworkLatency();\n\n        // Record metrics for cache hit\n        recordRequest(symbol, timeframe, from, to, cached.candles, true, latency);\n\n        return cached.candles as T;\n      }\n\n      // Cache miss - simulate network latency before generating\n      logger.info(`[CACHE MISS] Generating ${timeframe} candles for ${symbol}`);\n      const latency = await simulateNetworkLatency();\n\n      const candles = generateCandlesHierarchical(from, to, symbol, timeframe);\n\n      // Store in cache\n      candleCache.set(cacheKey, {\n        candles,\n        timestamp: Date.now()\n      });\n\n      // Record metrics for cache miss\n      recordRequest(symbol, timeframe, from, to, candles, false, latency);\n\n      logger.info(`Generated ${candles.length} ${timeframe} candles (cached for 5min)`);\n      return candles as T;\n\n    case 'get_symbol_metadata':\n      return {\n        data_from: Date.now() / 1000 - (365 * 24 * 60 * 60), // 1 year ago\n        data_to: Date.now() / 1000,\n        total_ticks: 1000000\n      } as T;\n\n    case 'start_candle_monitor':\n    case 'stop_candle_monitor':\n      return null as T;\n\n    default:\n      logger.warn(`Unknown command: ${cmd}`);\n      return null as T;\n  }\n};\n\nexport const mockListen = async <T = unknown>(event: string, handler: (payload: T) => void): Promise<() => void> => {\n  logger.debug(`Listening to event: ${event}`);\n\n  // Simulate some events for testing\n  if (event.includes('candles-updated')) {\n    // Simulate periodic candle updates\n    const interval = setInterval(() => {\n      const timeframe = event.split('-').pop(); // Extract timeframe from event name\n      handler({\n        symbol: 'EURUSD',\n        timeframe: timeframe || '1h',\n        timestamp: new Date().toISOString()\n      } as T);\n    }, 5000); // Every 5 seconds\n\n    // Return unlisten function that clears the interval\n    return () => {\n      logger.debug(`Stopped listening to event: ${event}`);\n      clearInterval(interval);\n    };\n  }\n\n  // Return a mock unlisten function for other events\n  return () => {\n    console.log(`[Mock Tauri] Stopped listening to event: ${event}`);\n  };\n};\n","import { mockInvoke, mockListen } from './mockTauriApi';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('TauriWrapper');\n\n// Check if we're running in Tauri\nconst isTauri = () => {\n  try {\n    // Check multiple ways to detect Tauri environment\n    return window.__TAURI__ !== undefined ||\n           (window as any).__TAURI_INTERNALS__ !== undefined ||\n           (window as any).__TAURI_IPC__ !== undefined ||\n           window.location.protocol === 'tauri:' ||\n           window.location.protocol === 'https:';  // Tauri v2 uses https protocol\n  } catch {\n    return false;\n  }\n};\n\n// Create invoke and listen functions that use the appropriate implementation\nexport const invoke = async <T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T> => {\n  if (isTauri()) {\n    // Dynamically import Tauri API only when needed\n    const { invoke: tauriInvoke } = await import('@tauri-apps/api/core');\n    return tauriInvoke<T>(cmd, args);\n  } else {\n    return mockInvoke<T>(cmd, args);\n  }\n};\n\nexport const listen = async <T = unknown>(event: string, handler: (event: { payload: T }) => void): Promise<() => void> => {\n  if (isTauri()) {\n    // Dynamically import Tauri API only when needed\n    const { listen: tauriListen } = await import('@tauri-apps/api/event');\n    return tauriListen<T>(event, handler);\n  } else {\n    // Mock listen needs to match the Tauri event structure\n    return mockListen(event, (payload: T) => handler({ payload }));\n  }\n};\n\n// Log the environment\nif (isTauri()) {\n  logger.info('Running in Tauri environment');\n} else {\n  logger.info('Running in browser - using mock API');\n}","import { createLogger } from '../utils/logger';\nimport { Candle } from '../types';\n\ninterface HTTPDataProviderConfig {\n  baseUrl: string;\n  apiKey?: string;\n  timeout?: number;\n}\n\ninterface FetchCandlesParams {\n  symbol: string;\n  timeframe: string;\n  from: number;\n  to: number;\n}\n\nexport class HTTPDataProvider {\n  private config: HTTPDataProviderConfig;\n  private logger = createLogger('HTTPDataProvider');\n\n  constructor(config: HTTPDataProviderConfig) {\n    this.config = {\n      timeout: 30000, // 30 second default timeout\n      ...config\n    };\n  }\n\n  /**\n   * Fetch historical candles from the API\n   */\n  async fetchCandles(params: FetchCandlesParams): Promise<Candle[]> {\n    const { symbol, timeframe, from, to } = params;\n\n    // Build query string\n    const queryParams = new URLSearchParams({\n      symbol,\n      timeframe,\n      from: from.toString(),\n      to: to.toString()\n    });\n\n    const url = `${this.config.baseUrl}/api/candles?${queryParams}`;\n\n    const startTime = performance.now();\n    this.logger.info(`📊 Fetching candles: ${symbol} ${timeframe} [${from} - ${to}]`);\n    this.logger.debug(`Full URL: ${url}`);\n\n    try {\n      const controller = new AbortController();\n      const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n      const headers: HeadersInit = {\n        'Content-Type': 'application/json'\n      };\n\n      // Add API key if provided\n      if (this.config.apiKey) {\n        headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n      }\n\n      const response = await fetch(url, {\n        method: 'GET',\n        headers,\n        signal: controller.signal\n      });\n\n      clearTimeout(timeoutId);\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const data = await response.json();\n\n      if (!Array.isArray(data)) {\n        this.logger.error('Invalid response format: expected array', data);\n        return [];\n      }\n\n      // Log any bad candles in the API response\n      const badCandles = data.filter((c: any) =>\n        c.time == null || c.open == null || c.high == null || c.low == null || c.close == null\n      );\n      if (badCandles.length > 0) {\n        this.logger.error(`Found ${badCandles.length} bad candles in API response:`, badCandles.slice(0, 5));\n      }\n\n      // Validate and transform data - filter out candles with null OHLC values\n      const candles: Candle[] = data\n        .filter((candle: any) => {\n          const isValid =\n            candle.time != null &&\n            candle.open != null && typeof candle.open === 'number' && !isNaN(candle.open) &&\n            candle.high != null && typeof candle.high === 'number' && !isNaN(candle.high) &&\n            candle.low != null && typeof candle.low === 'number' && !isNaN(candle.low) &&\n            candle.close != null && typeof candle.close === 'number' && !isNaN(candle.close);\n\n          return isValid;\n        })\n        .map((candle: any) => ({\n          time: candle.time,\n          open: candle.open,\n          high: candle.high,\n          low: candle.low,\n          close: candle.close\n        }));\n\n      const elapsed = ((performance.now() - startTime) / 1000).toFixed(2);\n      this.logger.info(`✅ Fetched ${candles.length} candles for ${symbol} ${timeframe} in ${elapsed}s`);\n      return candles;\n\n    } catch (error) {\n      if (error instanceof Error) {\n        if (error.name === 'AbortError') {\n          this.logger.error(`Request timeout after ${this.config.timeout}ms`);\n          throw new Error('Request timeout');\n        }\n        this.logger.error('Fetch error:', error.message);\n        throw error;\n      }\n      throw new Error('Unknown error fetching candles');\n    }\n  }\n\n  /**\n   * Fetch metadata for a symbol (date range info)\n   */\n  async fetchMetadata(symbol: string): Promise<{ earliest: number; latest: number }> {\n    const url = `${this.config.baseUrl}/api/metadata?symbol=${symbol}`;\n\n    this.logger.debug(`Fetching metadata for ${symbol}`);\n\n    try {\n      const controller = new AbortController();\n      const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n      const headers: HeadersInit = {\n        'Content-Type': 'application/json'\n      };\n\n      if (this.config.apiKey) {\n        headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n      }\n\n      const response = await fetch(url, {\n        method: 'GET',\n        headers,\n        signal: controller.signal\n      });\n\n      clearTimeout(timeoutId);\n\n      if (!response.ok) {\n        throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n      }\n\n      const data = await response.json();\n\n      if (!data.earliest || !data.latest) {\n        this.logger.error('Invalid metadata format:', data);\n        throw new Error('Invalid metadata response');\n      }\n\n      this.logger.info(`Metadata for ${symbol}: ${new Date(data.earliest * 1000).toISOString()} to ${new Date(data.latest * 1000).toISOString()}`);\n\n      return {\n        earliest: data.earliest,\n        latest: data.latest\n      };\n\n    } catch (error) {\n      if (error instanceof Error) {\n        if (error.name === 'AbortError') {\n          this.logger.error(`Metadata request timeout after ${this.config.timeout}ms`);\n          throw new Error('Metadata request timeout');\n        }\n        this.logger.error('Metadata fetch error:', error.message);\n        throw error;\n      }\n      throw new Error('Unknown error fetching metadata');\n    }\n  }\n\n  /**\n   * Update configuration\n   */\n  updateConfig(config: Partial<HTTPDataProviderConfig>) {\n    this.config = { ...this.config, ...config };\n    // Redact sensitive information before logging\n    const safeConfig = {\n      baseUrl: this.config.baseUrl,\n      timeout: this.config.timeout,\n      apiKey: this.config.apiKey ? '[REDACTED]' : undefined\n    };\n    this.logger.info('Configuration updated', safeConfig);\n  }\n\n  /**\n   * Get current configuration (without sensitive data)\n   */\n  getConfig() {\n    return {\n      baseUrl: this.config.baseUrl,\n      timeout: this.config.timeout,\n      hasApiKey: !!this.config.apiKey\n    };\n  }\n}\n\n// Singleton instance\nlet httpDataProvider: HTTPDataProvider | null = null;\n\n/**\n * Get or create the HTTPDataProvider singleton\n */\nexport function getHTTPDataProvider(config?: HTTPDataProviderConfig): HTTPDataProvider {\n  if (!httpDataProvider && !config) {\n    throw new Error('HTTPDataProvider must be initialized with config on first call');\n  }\n\n  if (config && !httpDataProvider) {\n    httpDataProvider = new HTTPDataProvider(config);\n  } else if (config && httpDataProvider) {\n    httpDataProvider.updateConfig(config);\n  }\n\n  return httpDataProvider!;\n}\n\n/**\n * Destroy the singleton instance\n */\nexport function destroyHTTPDataProvider() {\n  httpDataProvider = null;\n}\n","import { invoke } from './tauriWrapper';\nimport { getHTTPDataProvider } from './HTTPDataProvider';\nimport { createLogger } from '../utils/logger';\nimport { Candle } from '../types';\n\n// Auto-detect if we're in a browser environment (not Tauri)\nconst isBrowser = () => {\n  if (typeof window === 'undefined') return false;\n  try {\n    // If no Tauri globals exist, we're in a browser\n    return window.__TAURI__ === undefined &&\n           (window as any).__TAURI_INTERNALS__ === undefined &&\n           (window as any).__TAURI_IPC__ === undefined &&\n           window.location.protocol !== 'tauri:';\n  } catch {\n    return false;\n  }\n};\n\ninterface ChartData {\n  time: number;\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n}\n\ninterface CachedData {\n  data: ChartData[];\n  metadata: SymbolMetadata | null;\n  timestamp: number;\n  range: { from: number; to: number };\n}\n\ninterface FetchOptions {\n  forceRefresh?: boolean;\n  range?: { from: number; to: number };\n}\n\nexport interface SymbolMetadata {\n  data_from: number;\n  data_to: number;\n  total_ticks?: number;\n}\n\nexport class ChartDataCoordinator {\n  private cache = new Map<string, CachedData>();\n  private pendingRequests = new Map<string, Promise<ChartData[]>>();\n  private defaultRanges = new Map<string, { from: number; to: number }>();\n  private metadataCache = new Map<string, { metadata: SymbolMetadata; timestamp: number }>();\n  private cacheTimeout = 10 * 60 * 1000; // 10 minutes\n  private logger = createLogger('ChartDataCoordinator');\n  private useHTTP = isBrowser(); // Auto-detect: true in browser, false in Tauri\n\n  // Request tracking for debugging duplicate requests\n  private requestStats = {\n    totalRequests: 0,\n    cacheHits: 0,\n    cacheMisses: 0,\n    pendingReuse: 0,\n    backendCalls: 0\n  };\n\n  // Normalization factors must match backend\n  private normalizationFactors: Record<string, number> = {\n    '5m': 900,      // 15 minutes\n    '15m': 3600,    // 1 hour\n    '1h': 7200,     // 2 hours\n    '4h': 14400,    // 4 hours\n    '12h': 43200,   // 12 hours\n  };\n\n  /**\n   * Get or set the default range for a symbol-timeframe combination\n   */\n  public setDefaultRange(symbol: string, timeframe: string, from: number, to: number) {\n    const key = `${symbol}-${timeframe}`;\n    this.defaultRanges.set(key, { from, to });\n    this.logger.debug(`Set default range for ${key}: ${from} - ${to}`);\n  }\n\n  /**\n   * Generate cache key matching backend logic\n   */\n  private getCacheKey(symbol: string, timeframe: string, from: number, to: number): string {\n    const factor = this.normalizationFactors[timeframe] || 3600;\n    const normalizedFrom = Math.floor(from / factor) * factor;\n    const normalizedTo = Math.floor(to / factor) * factor;\n    \n    return `${symbol}-${timeframe}-${normalizedFrom}-${normalizedTo}`;\n  }\n\n  /**\n   * Check if cached data is still valid\n   */\n  private isCacheValid(cached: CachedData): boolean {\n    const age = Date.now() - cached.timestamp;\n    return age < this.cacheTimeout;\n  }\n\n  /**\n   * Calculate default range based on timeframe and available data\n   * Uses FULL data range for ALL timeframes to ensure smooth transitions\n   */\n  private async calculateDefaultRange(\n    symbol: string,\n    timeframe: string\n  ): Promise<{ from: number; to: number }> {\n    // Fetch metadata to get dynamic date range\n    const metadata = await this.getSymbolMetadata(symbol);\n\n    const dataEndTime = metadata?.data_to || Math.floor(Date.now() / 1000);\n    const dataStartTime = metadata?.data_from || (dataEndTime - 365 * 24 * 60 * 60); // fallback: 1 year ago\n\n    // Use FULL data range for ALL timeframes\n    // This ensures smooth transitions regardless of which timeframe you're viewing\n    this.logger.debug(\n      `Calculated default range for ${symbol} ${timeframe}: ${new Date(dataStartTime * 1000).toISOString()} to ${new Date(dataEndTime * 1000).toISOString()}`\n    );\n\n    return { from: dataStartTime, to: dataEndTime };\n  }\n\n  /**\n   * Main method to fetch chart data with coordination\n   */\n  public async fetchChartData(\n    symbol: string, \n    timeframe: string, \n    options?: FetchOptions\n  ): Promise<ChartData[]> {\n    // Validate inputs\n    if (!symbol || symbol.trim() === '') {\n      this.logger.warn('Cannot fetch data for empty symbol');\n      return [];\n    }\n    \n    // 1. Determine the range to use\n    let range: { from: number; to: number };\n    \n    if (options?.range) {\n      // Use explicitly provided range\n      range = options.range;\n    } else {\n      // Try to use stored default range for this symbol-timeframe\n      const defaultKey = `${symbol}-${timeframe}`;\n      const storedRange = this.defaultRanges.get(defaultKey);\n      \n      if (storedRange) {\n        range = storedRange;\n      } else {\n        // Calculate and store default range\n        range = await this.calculateDefaultRange(symbol, timeframe);\n        this.setDefaultRange(symbol, timeframe, range.from, range.to);\n      }\n    }\n\n    // Track request\n    this.requestStats.totalRequests++;\n\n    // 2. Generate cache key\n    const cacheKey = this.getCacheKey(symbol, timeframe, range.from, range.to);\n    this.logger.debug(`[REQUEST #${this.requestStats.totalRequests}] ${symbol}-${timeframe} → cache key: ${cacheKey}`);\n    this.logger.debug(`  Raw range: ${range.from} - ${range.to}`);\n    this.logger.debug(`  Normalized: ${this.getCacheKey(symbol, timeframe, range.from, range.to)}`);\n\n    // 3. Check for in-flight requests\n    if (this.pendingRequests.has(cacheKey)) {\n      this.requestStats.pendingReuse++;\n      this.logger.info(`[PENDING REUSE] Reusing pending request for ${cacheKey} (${this.requestStats.pendingReuse} total reuses)`);\n      return this.pendingRequests.get(cacheKey)!;\n    }\n\n    // 4. Check cache (unless force refresh)\n    if (!options?.forceRefresh) {\n      const cached = this.cache.get(cacheKey);\n      if (cached && this.isCacheValid(cached)) {\n        this.requestStats.cacheHits++;\n        this.logger.info(`[CACHE HIT] ${cacheKey} (${cached.data.length} candles, ${this.requestStats.cacheHits} total hits)`);\n        return cached.data;\n      }\n    }\n\n    // 5. Create new request\n    this.requestStats.cacheMisses++;\n    this.requestStats.backendCalls++;\n    this.logger.warn(`[CACHE MISS] ${cacheKey} → Backend call #${this.requestStats.backendCalls}`);\n    \n    const requestPromise = this.doFetch(symbol, timeframe, range.from, range.to)\n      .then(result => {\n        // Cache the result with metadata\n        this.cache.set(cacheKey, {\n          data: result.data,\n          metadata: result.metadata,\n          timestamp: Date.now(),\n          range\n        });\n        \n        // Clean up pending request\n        this.pendingRequests.delete(cacheKey);\n        \n        this.logger.info(`Fetched and cached ${result.data.length} candles for ${cacheKey}`);\n        return result.data;\n      })\n      .catch(error => {\n        // Clean up pending request on error\n        this.pendingRequests.delete(cacheKey);\n        throw error;\n      });\n\n    // Store as pending\n    this.pendingRequests.set(cacheKey, requestPromise);\n    \n    return requestPromise;\n  }\n\n  /**\n   * Enable HTTP data provider\n   */\n  public enableHTTP(enable: boolean = true) {\n    this.useHTTP = enable;\n    this.logger.info(`HTTP data provider ${enable ? 'enabled' : 'disabled'}`);\n  }\n\n  /**\n   * Perform the actual backend fetch\n   */\n  private async doFetch(\n    symbol: string,\n    timeframe: string,\n    from: number,\n    to: number\n  ): Promise<{ data: ChartData[]; metadata: SymbolMetadata | null }> {\n    try {\n      let response: any;\n\n      // Use HTTP data provider if enabled\n      if (this.useHTTP) {\n        try {\n          const httpProvider = getHTTPDataProvider();\n          const candles = await httpProvider.fetchCandles({\n            symbol,\n            timeframe,\n            from,\n            to\n          });\n          response = candles;\n        } catch (providerError) {\n          this.logger.error(\n            'HTTPDataProvider not initialized. Initialize it before using charts:\\n' +\n            'import { getHTTPDataProvider } from \"sptrader-chart-lib\";\\n' +\n            'getHTTPDataProvider({ baseUrl: \"http://localhost:8080\" });'\n          );\n          throw providerError;\n        }\n      } else {\n        // Use mock/tauri invoke\n        response = await invoke('fetch_candles', {\n          request: {\n            symbol,\n            timeframe,\n            from,\n            to\n          }\n        });\n      }\n\n      if (!response || !Array.isArray(response)) {\n        this.logger.error('Invalid response format:', response);\n        return { data: [], metadata: null };\n      }\n\n      // The backend returns candles with time as Unix timestamp\n      const data = response.map((candle: Candle) => ({\n        time: candle.time, // Already Unix timestamp from backend\n        open: candle.open,\n        high: candle.high,\n        low: candle.low,\n        close: candle.close,\n      }));\n\n      // For now, we don't have metadata from this endpoint\n      const metadata = null;\n\n      return { data, metadata };\n    } catch (error) {\n      this.logger.error('Fetch error:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Get metadata for a symbol\n   */\n  public async getSymbolMetadata(symbol: string): Promise<SymbolMetadata | null> {\n    // Don't fetch metadata for empty symbols\n    if (!symbol || symbol.trim() === '') {\n      this.logger.warn('Skipping metadata fetch for empty symbol');\n      return null;\n    }\n\n    // Check dedicated metadata cache first\n    const cachedMeta = this.metadataCache.get(symbol);\n    if (cachedMeta) {\n      const age = Date.now() - cachedMeta.timestamp;\n      if (age < this.cacheTimeout) {\n        this.logger.debug(`Using cached metadata for ${symbol}`);\n        return cachedMeta.metadata;\n      }\n    }\n\n    // Check if we have cached metadata from recent candles fetch\n    for (const [key, cached] of this.cache.entries()) {\n      if (key.startsWith(`${symbol}-`) && this.isCacheValid(cached) && cached.metadata) {\n        this.logger.trace('Using metadata from candles cache for', symbol);\n        return cached.metadata;\n      }\n    }\n\n    // If no cached metadata, make a separate request\n    try {\n      let metadata: SymbolMetadata;\n\n      if (this.useHTTP) {\n        // Use HTTP data provider\n        try {\n          const httpProvider = getHTTPDataProvider();\n          const httpMetadata = await httpProvider.fetchMetadata(symbol);\n          // Convert HTTP format to SymbolMetadata format\n          metadata = {\n            data_from: httpMetadata.earliest,\n            data_to: httpMetadata.latest\n          };\n        } catch (providerError) {\n          this.logger.error(\n            'HTTPDataProvider not initialized. Initialize it before using charts:\\n' +\n            'import { getHTTPDataProvider, chartDataCoordinator } from \"sptrader-chart-lib\";\\n' +\n            'getHTTPDataProvider({ baseUrl: \"http://localhost:8080\" });\\n' +\n            'chartDataCoordinator.enableHTTP(true); // Optional if auto-detected'\n          );\n          throw providerError;\n        }\n      } else {\n        // Use mock/tauri invoke\n        metadata = await invoke<SymbolMetadata>('get_symbol_metadata', { symbol });\n      }\n\n      // Cache the metadata\n      this.metadataCache.set(symbol, {\n        metadata,\n        timestamp: Date.now()\n      });\n\n      return metadata;\n    } catch (error) {\n      this.logger.error('Failed to get metadata:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Invalidate cache entries\n   */\n  public invalidateCache(pattern?: string) {\n    if (!pattern) {\n      this.logger.info('Clearing entire cache');\n      this.cache.clear();\n      this.metadataCache.clear();\n      this.defaultRanges.clear();\n      return;\n    }\n\n    let removed = 0;\n    let metadataRemoved = 0;\n\n    // Clear matching candle data cache entries\n    for (const [key] of this.cache) {\n      if (key.includes(pattern)) {\n        this.cache.delete(key);\n        removed++;\n      }\n    }\n\n    // Clear matching metadata cache entries\n    for (const [symbol] of this.metadataCache) {\n      if (symbol.includes(pattern)) {\n        this.metadataCache.delete(symbol);\n        metadataRemoved++;\n      }\n    }\n\n    // Clear matching default ranges\n    for (const [key] of this.defaultRanges) {\n      if (key.includes(pattern)) {\n        this.defaultRanges.delete(key);\n      }\n    }\n\n    this.logger.info(`Invalidated ${removed} cache entries and ${metadataRemoved} metadata entries matching: ${pattern}`);\n  }\n\n  /**\n   * Cancel all pending requests\n   */\n  public cancelPendingRequests() {\n    this.logger.info(`Cancelling ${this.pendingRequests.size} pending requests`);\n    this.pendingRequests.clear();\n  }\n\n  /**\n   * Get cache statistics\n   */\n  public getCacheStats() {\n    return {\n      cacheSize: this.cache.size,\n      pendingRequests: this.pendingRequests.size,\n      defaultRanges: this.defaultRanges.size,\n      requestStats: this.requestStats\n    };\n  }\n\n  /**\n   * Get request statistics for debugging\n   */\n  public getRequestStats() {\n    const hitRate = this.requestStats.totalRequests > 0\n      ? ((this.requestStats.cacheHits / this.requestStats.totalRequests) * 100).toFixed(1)\n      : '0';\n\n    return {\n      ...this.requestStats,\n      cacheHitRate: `${hitRate}%`,\n      duplicatesAvoided: this.requestStats.pendingReuse\n    };\n  }\n\n  /**\n   * Reset request statistics\n   */\n  public resetRequestStats() {\n    this.requestStats = {\n      totalRequests: 0,\n      cacheHits: 0,\n      cacheMisses: 0,\n      pendingReuse: 0,\n      backendCalls: 0\n    };\n    this.logger.info('Request statistics reset');\n  }\n}\n\n// Export singleton instance\nexport const chartDataCoordinator = new ChartDataCoordinator();","import { ISeriesPrimitivePaneView, SeriesPrimitivePaneViewZOrder } from 'lightweight-charts';\nimport type { ISeriesPrimitive, SeriesAttachedParameter } from 'lightweight-charts';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('CountdownTimerPrimitive');\n\ninterface CountdownTimerOptions {\n  timeframe: string;\n  position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n  offset?: { x: number; y: number };\n  onNewCandleBoundary?: (time: number) => void;\n}\n\nclass CountdownTimerPaneView implements ISeriesPrimitivePaneView {\n  private _primitive: CountdownTimerPrimitive;\n\n  constructor(primitive: CountdownTimerPrimitive) {\n    this._primitive = primitive;\n  }\n\n  zOrder(): SeriesPrimitivePaneViewZOrder {\n    return 'top';\n  }\n\n  renderer() {\n    return {\n      draw: (target: any) => {\n        const ctx = target._context;\n        if (!ctx) {\n          return;\n        }\n\n        const { countdown, color, position, offset } = this._primitive.getData();\n\n        ctx.save();\n\n        // Set font\n        ctx.font = '12px monospace';\n        ctx.textBaseline = 'top';\n\n        // Measure text for background box\n        const countdownWidth = ctx.measureText(countdown).width;\n        const totalWidth = countdownWidth + 16; // padding\n        const height = 24;\n\n        // Calculate position\n        const canvasWidth = target._mediaSize.width;\n        const canvasHeight = target._mediaSize.height;\n\n        let x = 0;\n        let y = 0;\n\n        switch (position) {\n          case 'top-left':\n            x = offset.x;\n            y = offset.y;\n            break;\n          case 'top-right':\n            x = canvasWidth - totalWidth - offset.x;\n            y = offset.y;\n            break;\n          case 'bottom-left':\n            x = offset.x;\n            y = canvasHeight - height - offset.y;\n            break;\n          case 'bottom-right':\n            x = canvasWidth - totalWidth - offset.x;\n            y = canvasHeight - height - offset.y;\n            break;\n        }\n\n        // Draw background (more transparent)\n        ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\n        ctx.fillRect(x, y, totalWidth, height);\n\n        // Draw countdown\n        ctx.fillStyle = color;\n        ctx.font = '12px monospace';\n        ctx.fillText(countdown, x + 8, y + 6);\n\n        ctx.restore();\n      }\n    };\n  }\n}\n\nexport class CountdownTimerPrimitive implements ISeriesPrimitive<any> {\n  private _paneViews: CountdownTimerPaneView[];\n  private _timeframe: string;\n  private _position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n  private _offset: { x: number; y: number };\n  private _onNewCandleBoundary?: (time: number) => void;\n  private _countdown: string = '00:00';\n  private _color: string = '#999';\n  private _intervalId: number | null = null;\n  private _requestUpdate: (() => void) | null = null;\n  private _hasTriggered: boolean = false;\n\n  constructor(options: CountdownTimerOptions) {\n    this._timeframe = options.timeframe;\n    this._position = options.position || 'bottom-right';\n    this._offset = options.offset || { x: 10, y: 10 };\n    this._onNewCandleBoundary = options.onNewCandleBoundary;\n    this._paneViews = [new CountdownTimerPaneView(this)];\n  }\n\n  updateTimeframe(timeframe: string) {\n    this._timeframe = timeframe;\n    this._requestUpdate?.();\n  }\n\n  attached(param: SeriesAttachedParameter<any>): void {\n    this._requestUpdate = param.requestUpdate;\n\n    // Start countdown interval\n    this._startCountdown();\n  }\n\n  detached(): void {\n    this._stopCountdown();\n  }\n\n  paneViews() {\n    return this._paneViews;\n  }\n\n  updateAllViews() {\n    // Views are updated via requestUpdate callback\n  }\n\n  private _startCountdown() {\n    // Initial update\n    this._updateCountdown();\n\n    // Update every second\n    this._intervalId = window.setInterval(() => {\n      this._updateCountdown();\n    }, 1000);\n  }\n\n  private _stopCountdown() {\n    if (this._intervalId !== null) {\n      clearInterval(this._intervalId);\n      this._intervalId = null;\n    }\n  }\n\n  private _calculateSecondsToNextCandle(): number {\n    const now = new Date();\n    // Use UTC methods to align with server-side candle boundaries\n    const seconds = now.getUTCSeconds();\n    const minutes = now.getUTCMinutes();\n    const hours = now.getUTCHours();\n\n    switch (this._timeframe) {\n      case '5m':\n        return (5 - (minutes % 5)) * 60 - seconds;\n      case '15m':\n        return (15 - (minutes % 15)) * 60 - seconds;\n      case '1h':\n        return (60 - minutes) * 60 - seconds;\n      case '4h':\n        return (4 - (hours % 4)) * 3600 + (60 - minutes) * 60 - seconds;\n      case '12h':\n        return (12 - (hours % 12)) * 3600 + (60 - minutes) * 60 - seconds;\n      default:\n        return (60 - minutes) * 60 - seconds;\n    }\n  }\n\n  private _formatCountdown(totalSeconds: number): string {\n    const displaySeconds = Math.max(0, totalSeconds);\n    const minutes = Math.floor(displaySeconds / 60);\n    const seconds = displaySeconds % 60;\n    return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n  }\n\n  private _getCountdownColor(seconds: number): string {\n    if (seconds <= 10) {\n      return '#ffae00'; // Yellow warning\n    } else if (seconds <= 30) {\n      return '#ccc'; // Brighter gray\n    } else {\n      return '#999'; // Dimmed gray\n    }\n  }\n\n  private _updateCountdown() {\n    const totalSeconds = this._calculateSecondsToNextCandle();\n    this._countdown = this._formatCountdown(totalSeconds);\n    this._color = this._getCountdownColor(totalSeconds);\n\n    // Trigger boundary callback\n    if (totalSeconds <= 0 && !this._hasTriggered) {\n      this._hasTriggered = true;\n      const candleTime = Math.floor(Date.now() / 1000);\n      this._onNewCandleBoundary?.(candleTime);\n      logger.debug('New candle boundary:', candleTime);\n    }\n\n    // Reset trigger when safely past boundary\n    if (totalSeconds > 5) {\n      this._hasTriggered = false;\n    }\n\n    // Request chart redraw\n    this._requestUpdate?.();\n  }\n\n  getData() {\n    return {\n      countdown: this._countdown,\n      color: this._color,\n      position: this._position,\n      offset: this._offset,\n    };\n  }\n}","import { ISeriesPrimitivePaneView, SeriesPrimitivePaneViewZOrder } from 'lightweight-charts';\nimport type { ISeriesPrimitive, SeriesAttachedParameter } from 'lightweight-charts';\n\ninterface WatermarkOptions {\n  timeframe: string;\n  opacity?: number;\n  fontSize?: number;\n}\n\nclass WatermarkPaneView implements ISeriesPrimitivePaneView {\n  private _primitive: TimeframeWatermarkPrimitive;\n\n  constructor(primitive: TimeframeWatermarkPrimitive) {\n    this._primitive = primitive;\n  }\n\n  zOrder(): SeriesPrimitivePaneViewZOrder {\n    return 'bottom';\n  }\n\n  renderer() {\n    return {\n      draw: (target: any) => {\n        const ctx = target._context;\n        if (!ctx) {\n          return;\n        }\n\n        const { timeframe, opacity, fontSize } = this._primitive.getData();\n\n        ctx.save();\n\n        // Calculate center position\n        const canvasWidth = target._mediaSize.width;\n        const canvasHeight = target._mediaSize.height;\n        const centerX = canvasWidth / 2;\n        const centerY = canvasHeight / 2;\n\n        // Set font and measure text\n        ctx.font = `700 ${fontSize}px system-ui, -apple-system, sans-serif`;\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'middle';\n\n        // Draw text\n        ctx.fillStyle = `rgba(255, 255, 255, ${opacity})`;\n        ctx.letterSpacing = '0.1em';\n        ctx.fillText(timeframe.toUpperCase(), centerX, centerY);\n\n        ctx.restore();\n      }\n    };\n  }\n}\n\nexport class TimeframeWatermarkPrimitive implements ISeriesPrimitive<any> {\n  private _paneViews: WatermarkPaneView[];\n  private _timeframe: string;\n  private _opacity: number;\n  private _fontSize: number;\n  private _requestUpdate: (() => void) | null = null;\n\n  constructor(options: WatermarkOptions) {\n    this._timeframe = options.timeframe;\n    this._opacity = options.opacity || 0.2;\n    this._fontSize = options.fontSize || 72;\n    this._paneViews = [new WatermarkPaneView(this)];\n  }\n\n  updateTimeframe(timeframe: string) {\n    this._timeframe = timeframe;\n    this._requestUpdate?.();\n  }\n\n  attached(param: SeriesAttachedParameter<any>): void {\n    this._requestUpdate = param.requestUpdate;\n  }\n\n  detached(): void {\n    // Cleanup if needed\n  }\n\n  paneViews() {\n    return this._paneViews;\n  }\n\n  updateAllViews() {\n    // Views are updated via requestUpdate callback\n  }\n\n  getData() {\n    return {\n      timeframe: this._timeframe,\n      opacity: this._opacity,\n      fontSize: this._fontSize,\n    };\n  }\n}","/**\n * Timeframe period durations in seconds\n */\nexport const TIMEFRAME_SECONDS = {\n  '5m': 5 * 60,      // 300\n  '15m': 15 * 60,    // 900\n  '1h': 60 * 60,     // 3600\n  '4h': 4 * 60 * 60, // 14400\n  '12h': 12 * 60 * 60 // 43200\n} as const;\n\n/**\n * All available timeframes for preloading\n */\nexport const ALL_TIMEFRAMES = ['5m', '15m', '1h', '4h', '12h'] as const;\n\n/**\n * Valid timeframe keys\n */\nexport type Timeframe = keyof typeof TIMEFRAME_SECONDS;\n\n/**\n * Default timeframe when none is specified\n */\nexport const DEFAULT_TIMEFRAME: Timeframe = '1h';\n\n/**\n * Get the period duration in seconds for a timeframe\n */\nexport function getTimeframePeriodSeconds(timeframe: string): number {\n  return TIMEFRAME_SECONDS[timeframe as Timeframe] || TIMEFRAME_SECONDS[DEFAULT_TIMEFRAME];\n}\n\n/**\n * Bar spacing thresholds for automatic timeframe switching\n * zoomOut: When bar spacing goes below this value, switch to longer timeframe\n * zoomIn: When bar spacing goes above this value, switch to shorter timeframe\n */\nexport const TIMEFRAME_SWITCH_THRESHOLDS = {\n  '5m': {\n    zoomOut: 5,   // Switch to 15m when bar spacing < 5 (wider gap prevents thrashing)\n    zoomIn: 40    // Switch from 15m when bar spacing > 40 (wider gap prevents thrashing)\n  },\n  '15m': {\n    zoomOut: 5,   // Switch to 1h when bar spacing < 5 (wider gap prevents thrashing)\n    zoomIn: 40    // Switch from 1h when bar spacing > 40 (wider gap prevents thrashing)\n  },\n  '1h': {\n    zoomOut: 5,   // Switch to 4h when bar spacing < 5 (wider gap prevents thrashing)\n    zoomIn: 40    // Switch from 4h when bar spacing > 40 (wider gap prevents thrashing)\n  },\n  '4h': {\n    zoomOut: 3,   // Switch to 12h when bar spacing < 3\n    zoomIn: 40    // Switch from 1h when bar spacing > 40 (wider gap prevents thrashing)\n  },\n  '12h': {\n    zoomOut: 3,   // Can't zoom out further\n    zoomIn: 30    // Switch from 4h when bar spacing > 30 (wider gap prevents thrashing)\n  }\n} as const;\n\n/**\n * Adjacent timeframes for preloading\n * Maps each timeframe to the timeframes you'd likely switch to (zoom in/out)\n */\nexport const ADJACENT_TIMEFRAMES: Record<string, string[]> = {\n  '5m': ['15m'],           // Can only zoom out to 15m\n  '15m': ['5m', '1h'],     // Can zoom in to 5m or out to 1h\n  '1h': ['15m', '4h'],     // Can zoom in to 15m or out to 4h\n  '4h': ['1h', '12h'],     // Can zoom in to 1h or out to 12h\n  '12h': ['4h'],           // Can only zoom in to 4h\n};","import { useRef, useCallback } from 'react';\nimport { ISeriesApi, CandlestickData, Time } from 'lightweight-charts';\nimport { TIMEFRAME_SECONDS } from '../constants/timeframes';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('usePlaceholderCandle');\n\nexport interface UsePlaceholderCandleOptions {\n  onPlaceholderCreated?: (time: number) => void;\n  resetDelay?: number;\n}\n\nexport interface UsePlaceholderCandleReturn {\n  createPlaceholder: (candleTime: number) => void;\n  updateWithRealData: (data: CandlestickData[]) => void;\n  hasPlaceholder: () => boolean;\n  getPlaceholderTime: () => number | null;\n  resetTrigger: () => void;\n}\n\n/**\n * Hook to manage placeholder candles on the chart\n * \n * Placeholders are temporary candles created at timeframe boundaries\n * before real data arrives, using the previous candle's close price\n * \n * @param series - The chart series to add placeholders to\n * @param options - Configuration options\n */\nexport function usePlaceholderCandle(\n  series: ISeriesApi<'Candlestick'> | null,\n  options?: UsePlaceholderCandleOptions\n): UsePlaceholderCandleReturn {\n  const { onPlaceholderCreated, resetDelay = 5000 } = options || {};\n  \n  const hasTriggeredRef = useRef<boolean>(false);\n  const placeholderTimeRef = useRef<number | null>(null);\n  const resetTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  // Create a placeholder candle\n  const createPlaceholder = useCallback((candleTime: number) => {\n    if (!series || hasTriggeredRef.current) {\n      logger.trace('Skipping - no series or already triggered');\n      return;\n    }\n\n    logger.debug(`Creating placeholder at ${new Date(candleTime * 1000).toISOString()}`);\n    hasTriggeredRef.current = true;\n    \n    const currentData = series.data();\n    if (currentData.length === 0) {\n      logger.debug('No data to create placeholder from');\n      return;\n    }\n\n    const lastCandle = currentData[currentData.length - 1];\n    \n    // Check if lastCandle exists and is actual candle data\n    if (!lastCandle || !('close' in lastCandle)) {\n      logger.debug('Last data point is not a valid candle');\n      return;\n    }\n    \n    // Create placeholder with previous close as all values\n    const placeholderCandle: CandlestickData = {\n      time: candleTime as Time,\n      open: lastCandle.close,\n      high: lastCandle.close,\n      low: lastCandle.close,\n      close: lastCandle.close,\n    };\n    \n    // Add placeholder to chart\n    const newData = [...currentData, placeholderCandle];\n    series.setData(newData);\n    logger.debug(\n      'Placeholder created at',\n      new Date(candleTime * 1000).toLocaleTimeString()\n    );\n    \n    // Store placeholder time for later update\n    placeholderTimeRef.current = candleTime;\n    \n    // Notify callback\n    onPlaceholderCreated?.(candleTime);\n    \n    // Reset trigger after delay\n    if (resetTimeoutRef.current) {\n      clearTimeout(resetTimeoutRef.current);\n    }\n    \n    resetTimeoutRef.current = setTimeout(() => {\n      logger.trace('Resetting trigger');\n      hasTriggeredRef.current = false;\n      if (placeholderTimeRef.current === -1) {\n        placeholderTimeRef.current = null;\n      }\n    }, resetDelay);\n  }, [series, onPlaceholderCreated, resetDelay]);\n\n  // Update placeholder with real data\n  const updateWithRealData = useCallback((data: CandlestickData[]) => {\n    if (!placeholderTimeRef.current || !series) {\n      return;\n    }\n\n    // Check if the new data includes our placeholder time\n    const placeholderTime = placeholderTimeRef.current;\n    const hasRealData = data.some(candle => \n      (candle.time as number) === placeholderTime\n    );\n\n    if (hasRealData) {\n      logger.debug(\n        'Replacing placeholder with real data at',\n        new Date(placeholderTime * 1000).toLocaleTimeString()\n      );\n      \n      // Clear placeholder reference\n      placeholderTimeRef.current = null;\n      \n      // Update the chart with new data\n      series.setData(data);\n    }\n  }, [series]);\n\n  // Check if there's an active placeholder\n  const hasPlaceholder = useCallback(() => {\n    return placeholderTimeRef.current !== null;\n  }, []);\n\n  // Get current placeholder time\n  const getPlaceholderTime = useCallback(() => {\n    return placeholderTimeRef.current;\n  }, []);\n\n  // Manually reset the trigger\n  const resetTrigger = useCallback(() => {\n    hasTriggeredRef.current = false;\n    placeholderTimeRef.current = null;\n    \n    if (resetTimeoutRef.current) {\n      clearTimeout(resetTimeoutRef.current);\n      resetTimeoutRef.current = null;\n    }\n  }, []);\n\n  return {\n    createPlaceholder,\n    updateWithRealData,\n    hasPlaceholder,\n    getPlaceholderTime,\n    resetTrigger,\n  };\n}\n\n/**\n * Helper function to calculate candle time for a given timeframe\n */\nexport function calculateCandleTime(timestamp: number, timeframe: string): number {\n  const period = TIMEFRAME_SECONDS[timeframe as keyof typeof TIMEFRAME_SECONDS] || TIMEFRAME_SECONDS['1h'];\n  return Math.floor(timestamp / period) * period;\n}","import { IChartApi, ISeriesApi, Time, CandlestickData } from 'lightweight-charts';\nimport { getTimeframePeriodSeconds } from '../constants/timeframes';\n\n/**\n * Calculate the appropriate bar spacing when switching timeframes\n * Maintains visual continuity during transitions\n */\nexport function calculateBarSpacingForTimeframeSwitch(\n  currentBarSpacing: number,\n  fromTimeframe: string,\n  toTimeframe: string\n): number {\n  // Define multipliers for timeframe transitions\n  const transitions: Record<string, number> = {\n    '5m->15m': 3,\n    '15m->5m': 1 / 3,\n    '15m->1h': 4,\n    '1h->15m': 1 / 4,\n    '1h->4h': 4,\n    '4h->1h': 1 / 4,\n    '4h->12h': 3,\n    '12h->4h': 1 / 3,\n  };\n\n  const key = `${fromTimeframe}->${toTimeframe}`;\n  const multiplier = transitions[key] || 1;\n\n  // Apply multiplier and clamp to reasonable bounds\n  const newBarSpacing = currentBarSpacing * multiplier;\n  return Math.max(3, Math.min(50, newBarSpacing));\n}\n\n/**\n * Calculate days to show based on timeframe\n * Used for initial chart view\n */\nexport function getDaysToShowForTimeframe(timeframe: string): number {\n  switch (timeframe) {\n    case '5m':\n      return 2;\n    case '15m':\n      return 3;\n    case '1h':\n      return 7;\n    case '4h':\n      return 14;\n    case '12h':\n      return 30;\n    default:\n      return 7;\n  }\n}\n\n/**\n * Set the visible range to show a specific number of days\n */\nexport function setVisibleRangeByDays(chart: IChartApi, days: number): void {\n  const now = Math.floor(Date.now() / 1000);\n  const from = now - days * 24 * 60 * 60;\n  \n  chart.timeScale().setVisibleRange({\n    from: from as Time,\n    to: now as Time,\n  });\n}\n\n/**\n * Get the current visible range duration in seconds\n */\nexport function getVisibleRangeDuration(chart: IChartApi): number {\n  const range = chart.timeScale().getVisibleRange();\n  if (!range) return 0;\n  \n  return (range.to as number) - (range.from as number);\n}\n\n/**\n * Check if a specific time is visible on the chart\n */\nexport function isTimeVisible(chart: IChartApi, time: number): boolean {\n  const range = chart.timeScale().getVisibleRange();\n  if (!range) return false;\n  \n  return time >= (range.from as number) && time <= (range.to as number);\n}\n\n/**\n * Scroll to a specific time, optionally centering it\n */\nexport function scrollToTime(chart: IChartApi, time: number, center = true): void {\n  if (center) {\n    const range = chart.timeScale().getVisibleRange();\n    if (range) {\n      const duration = (range.to as number) - (range.from as number);\n      chart.timeScale().setVisibleRange({\n        from: (time - duration / 2) as Time,\n        to: (time + duration / 2) as Time,\n      });\n    }\n  } else {\n    chart.timeScale().scrollToPosition(0, false);\n    chart.timeScale().scrollToRealTime();\n  }\n}\n\n/**\n * Find the last real candle (non-placeholder) in series data\n */\nexport function findLastRealCandle(series: ISeriesApi<'Candlestick'>): CandlestickData | null {\n  const data = series.data();\n  if (data.length === 0) return null;\n  \n  // Placeholders typically have all OHLC values the same\n  for (let i = data.length - 1; i >= 0; i--) {\n    const candle = data[i];\n    if (!candle) continue;\n    \n    // Check if it's a candlestick data (not whitespace)\n    if ('open' in candle && 'high' in candle && 'low' in candle && 'close' in candle) {\n      if (candle.open !== candle.high || \n          candle.open !== candle.low || \n          candle.open !== candle.close) {\n        return candle;\n      }\n    }\n  }\n  \n  const lastCandle = data[data.length - 1];\n  return lastCandle && 'close' in lastCandle ? lastCandle : null;\n}\n\n/**\n * Create a placeholder candle for the current time period\n */\nexport function createPlaceholderCandle(\n  lastCandle: CandlestickData | null,\n  timeframe: string,\n  currentTime: number\n): CandlestickData {\n  // Calculate the start of the current candle period\n  const periodSeconds = getTimeframePeriodSeconds(timeframe);\n  const candleTime = Math.floor(currentTime / periodSeconds) * periodSeconds;\n  \n  // Use the last candle's close price, or a default if not available\n  const price = lastCandle?.close ?? lastCandle?.open ?? 0;\n  \n  return {\n    time: candleTime as Time,\n    open: price,\n    high: price,\n    low: price,\n    close: price,\n  };\n}\n\n// Re-export from constants for backward compatibility\nexport { getTimeframePeriodSeconds } from '../constants/timeframes';\n\n","import React, { Component, ReactNode, ErrorInfo } from 'react';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('ErrorBoundary');\n\ninterface Props {\n  children: ReactNode;\n  fallback?: (error: Error, errorInfo: ErrorInfo, retry: () => void) => ReactNode;\n  onError?: (error: Error, errorInfo: ErrorInfo) => void;\n  resetKeys?: Array<string | number>;\n  resetOnPropsChange?: boolean;\n}\n\ninterface State {\n  hasError: boolean;\n  error: Error | null;\n  errorInfo: ErrorInfo | null;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      hasError: false,\n      error: null,\n      errorInfo: null,\n    };\n  }\n\n  static getDerivedStateFromError(error: Error): State {\n    return {\n      hasError: true,\n      error,\n      errorInfo: null,\n    };\n  }\n\n  componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n    logger.error('Error caught by boundary:', error, errorInfo);\n    \n    this.setState({\n      errorInfo,\n    });\n\n    // Call custom error handler if provided\n    if (this.props.onError) {\n      this.props.onError(error, errorInfo);\n    }\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    const { resetKeys, resetOnPropsChange } = this.props;\n    const { hasError } = this.state;\n    \n    // Reset error boundary when resetKeys change\n    if (hasError && prevProps.resetKeys !== resetKeys) {\n      if (resetKeys?.some((key, idx) => key !== prevProps.resetKeys?.[idx])) {\n        this.resetErrorBoundary();\n      }\n    }\n    \n    // Reset on any props change if specified\n    if (hasError && resetOnPropsChange && prevProps.children !== this.props.children) {\n      this.resetErrorBoundary();\n    }\n  }\n\n  resetErrorBoundary = () => {\n    logger.info('Resetting error boundary');\n    this.setState({\n      hasError: false,\n      error: null,\n      errorInfo: null,\n    });\n  };\n\n  render() {\n    const { hasError, error, errorInfo } = this.state;\n    const { fallback, children } = this.props;\n\n    if (hasError && error) {\n      if (fallback) {\n        return fallback(error, errorInfo!, this.resetErrorBoundary);\n      }\n\n      // Default fallback UI\n      return (\n        <div\n          style={{\n            padding: '20px',\n            margin: '20px',\n            border: '1px solid #ff6b6b',\n            borderRadius: '8px',\n            backgroundColor: '#ffe0e0',\n            fontFamily: 'system-ui, -apple-system, sans-serif',\n          }}\n        >\n          <h2 style={{ color: '#c92a2a', marginTop: 0 }}>Something went wrong</h2>\n          <details style={{ whiteSpace: 'pre-wrap', marginBottom: '20px' }}>\n            <summary style={{ cursor: 'pointer', color: '#666' }}>\n              Error details\n            </summary>\n            <p style={{ color: '#666', marginTop: '10px' }}>\n              {error.toString()}\n            </p>\n            {errorInfo && (\n              <pre style={{ color: '#666', fontSize: '12px', overflow: 'auto' }}>\n                {errorInfo.componentStack}\n              </pre>\n            )}\n          </details>\n          <button\n            onClick={this.resetErrorBoundary}\n            style={{\n              padding: '8px 16px',\n              fontSize: '14px',\n              color: '#fff',\n              backgroundColor: '#c92a2a',\n              border: 'none',\n              borderRadius: '4px',\n              cursor: 'pointer',\n            }}\n          >\n            Try Again\n          </button>\n        </div>\n      );\n    }\n\n    return children;\n  }\n}\n\n// Chart-specific error boundary with custom styling\nexport const ChartErrorBoundary: React.FC<{ children: ReactNode; onError?: (error: Error) => void }> = ({\n  children,\n  onError,\n}) => {\n  return (\n    <ErrorBoundary\n      onError={onError}\n      fallback={(error, _errorInfo, retry) => (\n        <div\n          style={{\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n            justifyContent: 'center',\n            height: '100%',\n            minHeight: '400px',\n            padding: '40px',\n            backgroundColor: '#f8f9fa',\n            borderRadius: '8px',\n            textAlign: 'center',\n          }}\n        >\n          <div\n            style={{\n              fontSize: '48px',\n              marginBottom: '20px',\n              color: '#dee2e6',\n            }}\n          >\n            📊\n          </div>\n          <h3\n            style={{\n              margin: '0 0 10px 0',\n              fontSize: '20px',\n              fontWeight: '600',\n              color: '#495057',\n            }}\n          >\n            Chart Error\n          </h3>\n          <p\n            style={{\n              margin: '0 0 20px 0',\n              fontSize: '14px',\n              color: '#6c757d',\n              maxWidth: '400px',\n            }}\n          >\n            {error.message || 'An unexpected error occurred while rendering the chart.'}\n          </p>\n          <div style={{ display: 'flex', gap: '10px' }}>\n            <button\n              onClick={retry}\n              style={{\n                padding: '10px 20px',\n                fontSize: '14px',\n                fontWeight: '500',\n                color: '#fff',\n                backgroundColor: '#007bff',\n                border: 'none',\n                borderRadius: '4px',\n                cursor: 'pointer',\n                transition: 'background-color 0.2s',\n              }}\n              onMouseEnter={(e) => {\n                e.currentTarget.style.backgroundColor = '#0056b3';\n              }}\n              onMouseLeave={(e) => {\n                e.currentTarget.style.backgroundColor = '#007bff';\n              }}\n            >\n              Reload Chart\n            </button>\n            <button\n              onClick={() => window.location.reload()}\n              style={{\n                padding: '10px 20px',\n                fontSize: '14px',\n                fontWeight: '500',\n                color: '#495057',\n                backgroundColor: '#fff',\n                border: '1px solid #dee2e6',\n                borderRadius: '4px',\n                cursor: 'pointer',\n                transition: 'all 0.2s',\n              }}\n              onMouseEnter={(e) => {\n                e.currentTarget.style.backgroundColor = '#f8f9fa';\n                e.currentTarget.style.borderColor = '#adb5bd';\n              }}\n              onMouseLeave={(e) => {\n                e.currentTarget.style.backgroundColor = '#fff';\n                e.currentTarget.style.borderColor = '#dee2e6';\n              }}\n            >\n              Refresh Page\n            </button>\n          </div>\n          {process.env.NODE_ENV === 'development' && (\n            <details\n              style={{\n                marginTop: '30px',\n                padding: '15px',\n                backgroundColor: '#fff',\n                border: '1px solid #dee2e6',\n                borderRadius: '4px',\n                textAlign: 'left',\n                maxWidth: '600px',\n                width: '100%',\n              }}\n            >\n              <summary\n                style={{\n                  cursor: 'pointer',\n                  fontWeight: '500',\n                  color: '#495057',\n                  marginBottom: '10px',\n                }}\n              >\n                Technical Details\n              </summary>\n              <pre\n                style={{\n                  margin: 0,\n                  fontSize: '12px',\n                  color: '#6c757d',\n                  whiteSpace: 'pre-wrap',\n                  wordBreak: 'break-word',\n                }}\n              >\n                {error.stack}\n              </pre>\n            </details>\n          )}\n        </div>\n      )}\n    >\n      {children}\n    </ErrorBoundary>\n  );\n};","import React from 'react';\n\ninterface LoadingStateProps {\n  message?: string;\n  subMessage?: string;\n  showSpinner?: boolean;\n  height?: string | number;\n  overlay?: boolean;\n}\n\nexport const LoadingState: React.FC<LoadingStateProps> = ({\n  message = 'Loading...',\n  subMessage,\n  showSpinner = true,\n  height = '100%',\n  overlay = false,\n}) => {\n  const content = (\n    <div\n      style={{\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center',\n        height: typeof height === 'number' ? `${height}px` : height,\n        minHeight: overlay ? 'auto' : '200px',\n        padding: '40px',\n        backgroundColor: overlay ? 'rgba(255, 255, 255, 0.9)' : 'transparent',\n        position: overlay ? 'absolute' : 'relative',\n        inset: overlay ? 0 : 'auto',\n        zIndex: overlay ? 1000 : 'auto',\n      }}\n    >\n      {showSpinner && (\n        <div\n          style={{\n            width: '40px',\n            height: '40px',\n            marginBottom: '20px',\n            border: '3px solid #e9ecef',\n            borderTopColor: '#007bff',\n            borderRadius: '50%',\n            animation: 'spin 1s linear infinite',\n          }}\n        />\n      )}\n      <div\n        style={{\n          fontSize: '16px',\n          fontWeight: '500',\n          color: '#495057',\n          marginBottom: subMessage ? '8px' : 0,\n        }}\n      >\n        {message}\n      </div>\n      {subMessage && (\n        <div\n          style={{\n            fontSize: '14px',\n            color: '#6c757d',\n          }}\n        >\n          {subMessage}\n        </div>\n      )}\n      <style>\n        {`\n          @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n          }\n        `}\n      </style>\n    </div>\n  );\n\n  return content;\n};\n\n// Chart-specific loading state\nexport const ChartLoadingState: React.FC<{ symbol?: string; timeframe?: string }> = ({\n  symbol,\n  timeframe,\n}) => {\n  return (\n    <LoadingState\n      message={`Loading ${symbol ? `${symbol} ` : ''}chart data${timeframe ? ` (${timeframe})` : ''}...`}\n      height=\"400px\"\n    />\n  );\n};\n\n// Skeleton loader for chart area\nexport const ChartSkeleton: React.FC<{ height?: string | number }> = ({ height = '400px' }) => {\n  return (\n    <div\n      style={{\n        position: 'relative',\n        width: '100%',\n        height: typeof height === 'number' ? `${height}px` : height,\n        backgroundColor: '#f8f9fa',\n        borderRadius: '8px',\n        overflow: 'hidden',\n      }}\n    >\n      {/* Price axis skeleton */}\n      <div\n        style={{\n          position: 'absolute',\n          right: 0,\n          top: 0,\n          bottom: 40,\n          width: '60px',\n          backgroundColor: '#e9ecef',\n          animation: 'shimmer 1.5s infinite',\n        }}\n      />\n      \n      {/* Time axis skeleton */}\n      <div\n        style={{\n          position: 'absolute',\n          left: 0,\n          right: 60,\n          bottom: 0,\n          height: '40px',\n          backgroundColor: '#e9ecef',\n          animation: 'shimmer 1.5s infinite',\n          animationDelay: '0.2s',\n        }}\n      />\n      \n      {/* Chart area skeleton */}\n      <div\n        style={{\n          position: 'absolute',\n          left: 0,\n          right: 60,\n          top: 0,\n          bottom: 40,\n          padding: '20px',\n        }}\n      >\n        {/* Candle placeholders */}\n        <div style={{ display: 'flex', justifyContent: 'space-around', height: '100%', alignItems: 'flex-end' }}>\n          {[...Array(8)].map((_, i) => (\n            <div\n              key={i}\n              style={{\n                width: '8px',\n                height: `${Math.random() * 60 + 20}%`,\n                backgroundColor: '#dee2e6',\n                borderRadius: '2px',\n                animation: 'shimmer 1.5s infinite',\n                animationDelay: `${i * 0.1}s`,\n              }}\n            />\n          ))}\n        </div>\n      </div>\n      \n      <style>\n        {`\n          @keyframes shimmer {\n            0% { opacity: 0.6; }\n            50% { opacity: 0.8; }\n            100% { opacity: 0.6; }\n          }\n        `}\n      </style>\n    </div>\n  );\n};\n\n// Inline loading indicator for updates\nexport const InlineLoader: React.FC<{ text?: string }> = ({ text = 'Updating...' }) => {\n  return (\n    <div\n      style={{\n        display: 'inline-flex',\n        alignItems: 'center',\n        gap: '8px',\n        padding: '4px 12px',\n        backgroundColor: '#e7f3ff',\n        borderRadius: '4px',\n        fontSize: '13px',\n        color: '#0066cc',\n      }}\n    >\n      <div\n        style={{\n          width: '12px',\n          height: '12px',\n          border: '2px solid #cce5ff',\n          borderTopColor: '#0066cc',\n          borderRadius: '50%',\n          animation: 'spin 0.8s linear infinite',\n        }}\n      />\n      {text}\n      <style>\n        {`\n          @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n          }\n        `}\n      </style>\n    </div>\n  );\n};","import React from 'react';\n\ninterface EmptyStateProps {\n  title?: string;\n  message?: string;\n  icon?: React.ReactNode;\n  action?: {\n    label: string;\n    onClick: () => void;\n  };\n  height?: string | number;\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({\n  title = 'No Data Available',\n  message = 'There is no data to display at this time.',\n  icon,\n  action,\n  height = '100%',\n}) => {\n  return (\n    <div\n      style={{\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center',\n        height: typeof height === 'number' ? `${height}px` : height,\n        minHeight: '300px',\n        padding: '40px',\n        textAlign: 'center',\n      }}\n    >\n      {icon || (\n        <div\n          style={{\n            fontSize: '48px',\n            marginBottom: '20px',\n            color: '#dee2e6',\n          }}\n        >\n          📊\n        </div>\n      )}\n      <h3\n        style={{\n          margin: '0 0 10px 0',\n          fontSize: '20px',\n          fontWeight: '600',\n          color: '#495057',\n        }}\n      >\n        {title}\n      </h3>\n      <p\n        style={{\n          margin: '0 0 20px 0',\n          fontSize: '14px',\n          color: '#6c757d',\n          maxWidth: '400px',\n        }}\n      >\n        {message}\n      </p>\n      {action && (\n        <button\n          onClick={action.onClick}\n          style={{\n            padding: '10px 20px',\n            fontSize: '14px',\n            fontWeight: '500',\n            color: '#fff',\n            backgroundColor: '#007bff',\n            border: 'none',\n            borderRadius: '4px',\n            cursor: 'pointer',\n            transition: 'background-color 0.2s',\n          }}\n          onMouseEnter={(e) => {\n            e.currentTarget.style.backgroundColor = '#0056b3';\n          }}\n          onMouseLeave={(e) => {\n            e.currentTarget.style.backgroundColor = '#007bff';\n          }}\n        >\n          {action.label}\n        </button>\n      )}\n    </div>\n  );\n};\n\n// Chart-specific empty state\nexport const ChartEmptyState: React.FC<{\n  symbol?: string;\n  onSelectSymbol?: () => void;\n}> = ({ symbol, onSelectSymbol }) => {\n  if (!symbol) {\n    return (\n      <EmptyState\n        title=\"No Symbol Selected\"\n        message=\"Please select a trading pair to view the chart.\"\n        icon={\n          <div style={{ fontSize: '48px', marginBottom: '20px', color: '#dee2e6' }}>\n            🔍\n          </div>\n        }\n        action={\n          onSelectSymbol\n            ? {\n                label: 'Select Symbol',\n                onClick: onSelectSymbol,\n              }\n            : undefined\n        }\n        height=\"400px\"\n      />\n    );\n  }\n\n  return (\n    <EmptyState\n      title=\"No Chart Data\"\n      message={`Unable to load chart data for ${symbol}. Please try again later.`}\n      height=\"400px\"\n    />\n  );\n};\n\n// No data in range state\nexport const NoDataInRangeState: React.FC<{\n  timeframe: string;\n  onChangeTimeframe?: () => void;\n}> = ({ timeframe, onChangeTimeframe }) => {\n  return (\n    <EmptyState\n      title=\"No Data in This Range\"\n      message={`There is no data available for the ${timeframe} timeframe in the current range.`}\n      icon={\n        <div style={{ fontSize: '48px', marginBottom: '20px', color: '#dee2e6' }}>\n          📅\n        </div>\n      }\n      action={\n        onChangeTimeframe\n          ? {\n              label: 'Change Timeframe',\n              onClick: onChangeTimeframe,\n            }\n          : undefined\n      }\n      height=\"400px\"\n    />\n  );\n};","/**\n * MARKET DATA CHART\n * Generic chart component for all market data (forex, bitcoin, crypto, etc.)\n * Based on the proven Bitcoin pattern with cascade aggregates\n *\n * Features:\n * - Fractal zoom with automatic timeframe switching\n * - Real-time data updates\n * - Works with any asset using the cascade pattern\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { createChart, IChartApi, ISeriesApi, CandlestickData, Time } from 'lightweight-charts';\nimport { useChartStore } from '../stores/useChartStore';\nimport { Box } from '@mantine/core';\nimport { chartDataCoordinator, type SymbolMetadata } from '../services/ChartDataCoordinator';\nimport { CountdownTimerPrimitive } from '../primitives/CountdownTimerPrimitive';\nimport { TimeframeWatermarkPrimitive } from '../primitives/TimeframeWatermarkPrimitive';\nimport { usePlaceholderCandle, calculateCandleTime } from '../hooks/usePlaceholderCandle';\nimport { getDaysToShowForTimeframe } from '../utils/chartHelpers';\nimport { TIMEFRAME_SWITCH_THRESHOLDS, ALL_TIMEFRAMES } from '../constants/timeframes';\nimport { createLogger } from '../utils/logger';\nimport { ChartErrorBoundary } from './ErrorBoundary';\nimport { ChartSkeleton } from './LoadingState';\nimport { ChartEmptyState } from './EmptyState';\n\nconst logger = createLogger('MarketDataChart');\n\ninterface ChartData {\n  time: number; // Unix timestamp\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n}\n\ninterface MarketDataChartProps {\n  symbol?: string;\n  timeframe?: string;\n  onTimeframeChange?: (timeframe: string) => void;\n  isFullscreen?: boolean;\n  onToggleFullscreen?: () => void;\n  enableTimeframeAutoSwitch?: boolean;\n  /** Preload adjacent timeframes in background for faster switching */\n  preloadAdjacentTimeframes?: boolean;\n}\n\n\nconst MarketDataChart: React.FC<MarketDataChartProps> = ({\n  symbol,\n  timeframe,\n  onTimeframeChange,\n  enableTimeframeAutoSwitch = true,\n  preloadAdjacentTimeframes = true,\n}) => {\n  const chartContainerRef = useRef<HTMLDivElement>(null);\n  const chartRef = useRef<IChartApi | null>(null);\n  const seriesRef = useRef<ISeriesApi<'Candlestick'> | null>(null);\n  const countdownTimerRef = useRef<CountdownTimerPrimitive | null>(null);\n  const watermarkRef = useRef<TimeframeWatermarkPrimitive | null>(null);\n\n  const [currentTimeframe, setCurrentTimeframe] = useState(timeframe || '1h');\n  const currentTimeframeRef = useRef(timeframe || '1h');\n  const symbolRef = useRef(symbol || 'EURUSD');\n  const [isLoading, setIsLoading] = useState(false);\n  const [_error, setError] = useState<Error | null>(null);\n  const isTransitioningRef = useRef(false);\n\n\n  // Zustand store\n  const {\n    setCurrentTimeframe: setStoreTimeframe,\n  } = useChartStore();\n\n  // Placeholder candle management\n  const {\n    createPlaceholder,\n    updateWithRealData,\n    hasPlaceholder,\n    resetTrigger,\n  } = usePlaceholderCandle(seriesRef.current);\n\n  // Transition cooldown tracking\n  const lastTransitionRef = useRef<number>(0);\n  const TRANSITION_COOLDOWN = 700; // Increased to match longer animation\n\n  // Left edge locking\n  const [isShiftPressed, setIsShiftPressed] = useState(false);\n  const lockedLeftEdgeRef = useRef<number | null>(null);\n\n  // Interval tracking\n  const checkIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n\n  // Track if initial load has been done\n  const initialLoadDoneRef = useRef(false);\n\n  // Format prices with appropriate precision based on magnitude\n  const formatPrice = (price: number): string => {\n    if (price >= 1000) {\n      // Large prices (BTC, ETH) - 2 decimals\n      return `$${price.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n    } else if (price >= 100) {\n      // Medium prices (SOL) - 2 decimals\n      return `$${price.toFixed(2)}`;\n    } else {\n      // Small prices (forex) - 5 decimals for precision\n      return `$${price.toFixed(5)}`;\n    }\n  };\n\n\n\n\n  const fetchChartData = async (\n    sym: string,\n    tf: string,\n    from?: number,\n    to?: number\n  ): Promise<{ data: ChartData[]; metadata: SymbolMetadata | null }> => {\n    try {\n      // Use coordinator for all data fetches\n      const data = await chartDataCoordinator.fetchChartData(sym, tf, {\n        range: from && to ? { from, to } : undefined\n      });\n\n      // Don't update dateRangeRef here - it should only be set during initial load\n\n      // Get metadata separately if needed\n      const metadata = await chartDataCoordinator.getSymbolMetadata(sym);\n\n      return {\n        data,\n        metadata\n      };\n    } catch (error) {\n      logger.error(`Error fetching market chart data for ${sym} ${tf}:`, error);\n      return { data: [], metadata: null };\n    }\n  };\n\n  // Rest of the component logic remains the same as AdaptiveChart\n  // Using generic market data fetching and formatting...\n\n  const switchTimeframe = async (newTimeframe: string) => {\n    if (newTimeframe === currentTimeframeRef.current || isTransitioningRef.current) return;\n\n    logger.debug(\n      'Timeframe transition:',\n      currentTimeframeRef.current,\n      '→',\n      newTimeframe\n    );\n\n    // Check cooldown\n    const now = Date.now();\n    if (now - lastTransitionRef.current < TRANSITION_COOLDOWN) {\n      logger.debug('[COOLDOWN] Too fast! Wait a bit...');\n      return;\n    }\n\n    lastTransitionRef.current = now;\n    isTransitioningRef.current = true;\n\n    // Store current view state before switching\n    const timeScale = chartRef.current!.timeScale();\n    const currentBarSpacing = timeScale.options().barSpacing;\n    const visibleRange = timeScale.getVisibleRange();\n    const previousTimeframe = currentTimeframeRef.current;\n\n    logger.info(\n      `Executing transition: ${previousTimeframe} → ${newTimeframe} at bar spacing ${currentBarSpacing}`\n    );\n\n    // Update ref immediately to prevent stale closures\n    currentTimeframeRef.current = newTimeframe;\n\n    // Update state\n    setCurrentTimeframe(newTimeframe);\n    setStoreTimeframe(newTimeframe);\n    if (onTimeframeChange) {\n      onTimeframeChange(newTimeframe);\n    }\n\n    // Update canvas primitives with new timeframe\n    watermarkRef.current?.updateTimeframe(newTimeframe);\n    countdownTimerRef.current?.updateTimeframe(newTimeframe);\n\n    // Skip fade effect to prevent flashing\n    // setChartOpacity(0.2);\n    // await new Promise((resolve) => setTimeout(resolve, 300));\n\n    try {\n      // Use coordinator's cached/default data (don't pass custom range to maximize cache hits)\n      logger.debug(`Fetching ${newTimeframe} data using cached/default range`);\n      const { data } = await fetchChartData(symbolRef.current!, newTimeframe);\n\n      logger.debug(`Fetch completed, got ${data.length} candles`);\n\n      if (data.length === 0) {\n        logger.error(`No data available for ${newTimeframe} - aborting transition`);\n        // Revert the transition\n        currentTimeframeRef.current = previousTimeframe;\n        setCurrentTimeframe(previousTimeframe);\n        setStoreTimeframe(previousTimeframe);\n        isTransitioningRef.current = false;\n        return;\n      }\n\n      if (data.length > 0 && seriesRef.current && chartRef.current) {\n        // Update data first\n        logger.debug(`Setting ${data.length} candles on series`);\n        seriesRef.current.setData(data.map(d => ({ ...d, time: d.time as Time })));\n        logger.debug(`Data set complete`);\n\n        // Clamp visible range to available data bounds\n        if (visibleRange && chartRef.current) {\n          const dataStart = data[0]!.time;\n          const dataEnd = data[data.length - 1]!.time;\n\n          // Clamp to data bounds to prevent bar spacing explosion\n          const clampedFrom = Math.max(visibleRange.from as number, dataStart);\n          const clampedTo = Math.min(visibleRange.to as number, dataEnd);\n\n          logger.debug(`Data range: ${new Date(dataStart * 1000).toISOString()} to ${new Date(dataEnd * 1000).toISOString()}`);\n          logger.debug(`Visible range: ${new Date((visibleRange.from as number) * 1000).toISOString()} to ${new Date((visibleRange.to as number) * 1000).toISOString()}`);\n          logger.debug(`Clamped range: ${new Date(clampedFrom * 1000).toISOString()} to ${new Date(clampedTo * 1000).toISOString()}`);\n\n          // Only set if we have a valid range within the data\n          if (clampedFrom < clampedTo) {\n            chartRef.current.timeScale().setVisibleRange({\n              from: clampedFrom as Time,\n              to: clampedTo as Time,\n            });\n          } else {\n            // Fallback: show last portion of data\n            logger.warn(`Visible range outside data bounds, showing end of data`);\n            const daysToShow = getDaysToShowForTimeframe(newTimeframe);\n            const from = dataEnd - daysToShow * 24 * 60 * 60;\n            chartRef.current.timeScale().setVisibleRange({\n              from: Math.max(from, dataStart) as Time,\n              to: dataEnd as Time,\n            });\n          }\n        }\n      }\n\n      // Fade back in\n      // setChartOpacity(1);\n      logger.info(`Transition complete to ${newTimeframe}`);\n    } catch (error) {\n      logger.error('Failed to switch timeframe:', error);\n      // Revert everything on error\n      currentTimeframeRef.current = previousTimeframe;\n      setCurrentTimeframe(previousTimeframe);\n      setStoreTimeframe(previousTimeframe);\n      // setChartOpacity(1);\n    } finally {\n      logger.debug(`Setting isTransitioningRef to false`);\n      isTransitioningRef.current = false;\n    }\n  };\n\n  useEffect(() => {\n    if (!chartContainerRef.current) return;\n\n    logger.info('Creating chart');\n\n    // Declare variables that need to be accessible in cleanup\n    let crosshairUnsubscribe: (() => void) | undefined;\n\n    // Create chart - matching AdaptiveChart exactly\n    const chart = createChart(chartContainerRef.current, {\n      autoSize: true, // Automatically size the chart to fit container\n      layout: {\n        background: { color: '#16161d' },\n        textColor: '#d0d0d2',\n      },\n      grid: {\n        vertLines: { color: '#1a2a3a' },\n        horzLines: { color: '#1a2a3a' },\n      },\n      crosshair: {\n        mode: 0, // Normal mode - shows both crosshair lines\n        vertLine: {\n          color: '#758696',\n          width: 1,\n          style: 3, // Dashed\n          labelBackgroundColor: '#2B2B43',\n        },\n        horzLine: {\n          color: '#758696',\n          width: 1,\n          style: 3, // Dashed\n          labelBackgroundColor: '#2B2B43',\n        },\n      },\n      timeScale: {\n        visible: true, // Show the time axis\n        timeVisible: true,\n        secondsVisible: false,\n        barSpacing: 12, // Default bar spacing\n        minBarSpacing: 2, // Prevent excessive zoom out\n        rightOffset: 0, // Set to 0 to work with fixRightEdge\n        rightBarStaysOnScroll: true, // Keep the latest bar in view when scrolling\n        fixLeftEdge: true, // Prevent panning before first candle\n        fixRightEdge: true, // Prevent panning after last candle\n        tickMarkFormatter: (time: number, tickMarkType: number) => {\n          // Display UTC time to match server-side candle boundaries\n          const date = new Date(time * 1000);\n\n          // Format based on the tick mark type (all using UTC)\n          if (tickMarkType === 0) {\n            // Year\n            return date.getUTCFullYear().toString();\n          } else if (tickMarkType === 1) {\n            // Month\n            const months = [\n              'Jan',\n              'Feb',\n              'Mar',\n              'Apr',\n              'May',\n              'Jun',\n              'Jul',\n              'Aug',\n              'Sep',\n              'Oct',\n              'Nov',\n              'Dec',\n            ];\n            return months[date.getUTCMonth()];\n          } else if (tickMarkType === 2) {\n            // DayOfMonth with day of week\n            const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n            const dayName = days[date.getUTCDay()];\n            return `${dayName} ${date.getUTCDate()}`;\n          } else if (tickMarkType === 3) {\n            // Time (24-hour UTC format)\n            const hours = date.getUTCHours();\n            const minutes = date.getUTCMinutes().toString().padStart(2, '0');\n            return `${hours.toString().padStart(2, '0')}:${minutes}`;\n          } else if (tickMarkType === 4) {\n            // TimeWithSeconds (24-hour UTC format)\n            const hours = date.getUTCHours();\n            const minutes = date.getUTCMinutes().toString().padStart(2, '0');\n            const seconds = date.getUTCSeconds().toString().padStart(2, '0');\n            return `${hours.toString().padStart(2, '0')}:${minutes}:${seconds}`;\n          }\n\n          // Default fallback\n          return date.toISOString();\n        },\n      },\n      localization: {\n        timeFormatter: (timestamp: number) => {\n          // Display UTC time (24-hour format)\n          const date = new Date(timestamp * 1000);\n          const hours = date.getUTCHours();\n          const minutes = date.getUTCMinutes().toString().padStart(2, '0');\n          return `${hours.toString().padStart(2, '0')}:${minutes} UTC`;\n        },\n      },\n    });\n\n    const candlestickSeries = chart.addCandlestickSeries({\n      upColor: '#00ff88',\n      downColor: '#ff4976',\n      borderVisible: false,\n      wickUpColor: '#00ff88',\n      wickDownColor: '#ff4976',\n      priceFormat: {\n        type: 'custom',\n        formatter: formatPrice,\n      },\n    });\n\n    chartRef.current = chart;\n    seriesRef.current = candlestickSeries;\n\n    // Create canvas-based primitives\n    watermarkRef.current = new TimeframeWatermarkPrimitive({\n      timeframe: currentTimeframe,\n      opacity: 0.2,\n      fontSize: 76,\n    });\n    candlestickSeries.attachPrimitive(watermarkRef.current);\n\n    countdownTimerRef.current = new CountdownTimerPrimitive({\n      timeframe: currentTimeframe,\n      position: 'bottom-right',\n      offset: { x: 10, y: 10 },\n      onNewCandleBoundary: (time: number) => {\n        const candleTime = calculateCandleTime(time, currentTimeframe);\n        createPlaceholder(candleTime);\n      },\n    });\n    candlestickSeries.attachPrimitive(countdownTimerRef.current);\n\n    // Create crosshair tooltip\n    const toolTip = document.createElement('div');\n    toolTip.style.cssText = `\n      position: absolute;\n      display: none;\n      padding: 8px;\n      box-sizing: border-box;\n      font-size: 12px;\n      text-align: left;\n      z-index: 1000;\n      top: 12px;\n      left: 12px;\n      pointer-events: none;\n      background: rgba(0, 0, 0, 0.8);\n      border: 1px solid rgba(255, 255, 255, 0.2);\n      border-radius: 4px;\n      color: white;\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n    `;\n    chartContainerRef.current.appendChild(toolTip);\n\n    // Subscribe to crosshair move\n    const unsubscribe = chart.subscribeCrosshairMove((param) => {\n      if (!param.time || !param.seriesData.has(candlestickSeries)) {\n        toolTip.style.display = 'none';\n        return;\n      }\n\n      const data = param.seriesData.get(candlestickSeries) as CandlestickData;\n      const timestamp =\n        typeof param.time === 'string'\n          ? parseInt(param.time) * 1000\n          : (param.time as number) * 1000;\n      const date = new Date(timestamp);\n      const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n      const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n      const dayOfWeek = days[date.getUTCDay()];\n      const month = months[date.getUTCMonth()];\n      const dayOfMonth = date.getUTCDate();\n\n      // Time is shown by crosshair, display date + OHLC values\n      toolTip.style.display = 'block';\n      toolTip.innerHTML = `\n        <div style=\"color: #666; margin-bottom: 4px; font-size: 11px\">${dayOfWeek} ${month} ${dayOfMonth}</div>\n        <div style=\"color: #fff\">O: ${formatPrice(data.open)}</div>\n        <div style=\"color: #fff\">H: ${formatPrice(data.high)}</div>\n        <div style=\"color: #fff\">L: ${formatPrice(data.low)}</div>\n        <div style=\"color: ${data.close >= data.open ? '#00ff88' : '#ff4976'}\">C: ${formatPrice(data.close)}</div>\n      `;\n    });\n\n    // Store the unsubscribe function\n    if (typeof unsubscribe === 'function') {\n      crosshairUnsubscribe = unsubscribe;\n    }\n\n    // autoSize handles resizing automatically, no manual resize needed\n\n    // CRITICAL: Monitor BAR SPACING changes instead of pixel widths\n    let lastBarSpacing = 13;\n\n    // Define checkTimeframeSwitch inside useEffect to access current state/refs\n    const checkTimeframeSwitch = (barSpacing: number) => {\n      logger.debug(`checkTimeframeSwitch called with barSpacing: ${barSpacing}`);\n      logger.debug(`isTransitioningRef.current: ${isTransitioningRef.current}`);\n      logger.debug(`currentTimeframeRef.current: ${currentTimeframeRef.current}`);\n\n      // Check if auto-switching is disabled\n      if (!enableTimeframeAutoSwitch) {\n        logger.debug('[SWITCH] Auto-switching disabled');\n        return;\n      }\n\n      if (isTransitioningRef.current) {\n        logger.debug('[SWITCH] Skipping - transition in progress');\n        return; // Silent skip during transitions\n      }\n\n      const currentTf = currentTimeframeRef.current;\n\n      // Enforce minimum bar spacing for 12h to prevent excessive zoom out\n      if (currentTf === '12h' && barSpacing < 3) {\n        logger.debug('[ZOOM LIMIT] Enforcing minimum bar spacing for 12h');\n        chartRef.current?.timeScale().applyOptions({\n          barSpacing: 3,\n        });\n        return;\n      }\n\n      // 12h → 4h (zooming in)\n      if (currentTf === '12h' && barSpacing > TIMEFRAME_SWITCH_THRESHOLDS['12h'].zoomIn) {\n        logger.info(\n          `[SWITCH] 12h bar spacing ${barSpacing} > ${TIMEFRAME_SWITCH_THRESHOLDS['12h'].zoomIn} → switching to 4h`\n        );\n        switchTimeframe('4h');\n      }\n      // 4h → 12h (zooming out)\n      else if (currentTf === '4h' && barSpacing < TIMEFRAME_SWITCH_THRESHOLDS['4h'].zoomOut) {\n        logger.info(\n          `[SWITCH] 4h bar spacing ${barSpacing} < ${TIMEFRAME_SWITCH_THRESHOLDS['4h'].zoomOut} → switching to 12h`\n        );\n        switchTimeframe('12h');\n      }\n      // 4h → 1h (zooming in)\n      else if (currentTf === '4h' && barSpacing > TIMEFRAME_SWITCH_THRESHOLDS['4h'].zoomIn) {\n        logger.info(\n          `[SWITCH] 4h bar spacing ${barSpacing} > ${TIMEFRAME_SWITCH_THRESHOLDS['4h'].zoomIn} → switching to 1h`\n        );\n        switchTimeframe('1h');\n      }\n      // 1h → 4h (zooming out)\n      else if (currentTf === '1h' && barSpacing < TIMEFRAME_SWITCH_THRESHOLDS['1h'].zoomOut) {\n        logger.info(\n          `[SWITCH] 1h bar spacing ${barSpacing} < ${TIMEFRAME_SWITCH_THRESHOLDS['1h'].zoomOut} → switching to 4h`\n        );\n        switchTimeframe('4h');\n      }\n      // 1h → 15m (zooming in)\n      else if (currentTf === '1h' && barSpacing > TIMEFRAME_SWITCH_THRESHOLDS['1h'].zoomIn) {\n        logger.info(\n          `[SWITCH] 1h bar spacing ${barSpacing} > ${TIMEFRAME_SWITCH_THRESHOLDS['1h'].zoomIn} → switching to 15m`\n        );\n        switchTimeframe('15m');\n      }\n      // 15m → 1h (zooming out)\n      else if (currentTf === '15m' && barSpacing < TIMEFRAME_SWITCH_THRESHOLDS['15m'].zoomOut) {\n        logger.info(\n          `[SWITCH] 15m bar spacing ${barSpacing} < ${TIMEFRAME_SWITCH_THRESHOLDS['15m'].zoomOut} → switching to 1h`\n        );\n        switchTimeframe('1h');\n      }\n      // 15m → 5m (zooming in)\n      else if (currentTf === '15m' && barSpacing > TIMEFRAME_SWITCH_THRESHOLDS['15m'].zoomIn) {\n        logger.info(\n          `[SWITCH] 15m bar spacing ${barSpacing} > ${TIMEFRAME_SWITCH_THRESHOLDS['15m'].zoomIn} → switching to 5m`\n        );\n        switchTimeframe('5m');\n      }\n      // 5m → 15m (zooming out)\n      else if (currentTf === '5m' && barSpacing < TIMEFRAME_SWITCH_THRESHOLDS['5m'].zoomOut) {\n        logger.info(\n          `[SWITCH] 5m bar spacing ${barSpacing} < ${TIMEFRAME_SWITCH_THRESHOLDS['5m'].zoomOut} → switching to 15m`\n        );\n        switchTimeframe('15m');\n      }\n    };\n\n    checkIntervalRef.current = setInterval(() => {\n      if (!chartRef.current) {\n        logger.debug('[ResolutionTracker] Chart not ready');\n        return;\n      }\n      \n      \n      if (isTransitioningRef.current) {\n        logger.debug('[ResolutionTracker] Skipping check - transition in progress');\n        return;\n      }\n\n      try {\n        const currentBarSpacing = chartRef.current.timeScale().options().barSpacing;\n\n        if (currentBarSpacing !== lastBarSpacing && !isTransitioningRef.current) {\n          logger.debug(\n            `[ResolutionTracker] Current timeframe: ${currentTimeframeRef.current}, bar spacing: ${currentBarSpacing} (was: ${lastBarSpacing})`\n          );\n          logger.debug(`[ResolutionTracker] isTransitioningRef.current = ${isTransitioningRef.current}`);\n          logger.debug(`[ResolutionTracker] About to call checkTimeframeSwitch`);\n          lastBarSpacing = currentBarSpacing;\n          checkTimeframeSwitch(currentBarSpacing);\n        }\n      } catch (e) {\n        logger.error('[ResolutionTracker] Error in interval:', e);\n        // Chart might be disposed, clear interval\n        if (checkIntervalRef.current) {\n          clearInterval(checkIntervalRef.current);\n          checkIntervalRef.current = null;\n        }\n      }\n    }, 100); // Check every 100ms\n\n    // Handle Shift key for left edge locking\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Shift' && !isShiftPressed) {\n        setIsShiftPressed(true);\n        const timeScale = chartRef.current?.timeScale();\n        if (timeScale) {\n          const visibleRange = timeScale.getVisibleRange();\n          if (visibleRange) {\n            lockedLeftEdgeRef.current = visibleRange.from as number;\n            logger.debug(\n              '[LOCK LEFT] Activated, locking left edge at:',\n              new Date((visibleRange.from as number) * 1000).toISOString()\n            );\n            // Disable rightBarStaysOnScroll temporarily\n            timeScale.applyOptions({\n              rightBarStaysOnScroll: false,\n            });\n          }\n        }\n      }\n    };\n\n    const handleKeyUp = (e: KeyboardEvent) => {\n      if (e.key === 'Shift') {\n        setIsShiftPressed(false);\n        lockedLeftEdgeRef.current = null;\n        logger.debug('[LOCK LEFT] Released, re-enabling right lock');\n        // Re-enable rightBarStaysOnScroll\n        chartRef.current?.timeScale().applyOptions({\n          rightBarStaysOnScroll: true,\n        });\n      }\n    };\n\n    window.addEventListener('keydown', handleKeyDown);\n    window.addEventListener('keyup', handleKeyUp);\n\n    return () => {\n      window.removeEventListener('keydown', handleKeyDown);\n      window.removeEventListener('keyup', handleKeyUp);\n      if (checkIntervalRef.current) {\n        clearInterval(checkIntervalRef.current);\n      }\n      // Unsubscribe from crosshair\n      if (crosshairUnsubscribe && typeof crosshairUnsubscribe === 'function') {\n        crosshairUnsubscribe();\n      }\n      // Remove tooltip\n      if (toolTip && toolTip.parentNode) {\n        toolTip.parentNode.removeChild(toolTip);\n      }\n      // Detach primitives before removing chart to prevent \"Object is disposed\" errors\n      if (watermarkRef.current && candlestickSeries) {\n        candlestickSeries.detachPrimitive(watermarkRef.current);\n        watermarkRef.current = null;\n      }\n      if (countdownTimerRef.current && candlestickSeries) {\n        candlestickSeries.detachPrimitive(countdownTimerRef.current);\n        countdownTimerRef.current = null;\n      }\n      chart.remove();\n    };\n  }, []); // Only create chart once\n\n\n  // Initial load effect\n  useEffect(() => {\n    if (initialLoadDoneRef.current) {\n      logger.debug('Initial load already done, skipping');\n      return;\n    }\n\n    let mounted = true;\n    const loadInitialData = async () => {\n      if (\n        !mounted ||\n        initialLoadDoneRef.current ||\n        !seriesRef.current ||\n        !chartRef.current ||\n        !symbol\n      )\n        return;\n\n      logger.info('Initial load triggered');\n      initialLoadDoneRef.current = true;\n\n      setIsLoading(true);\n      setError(null);\n      symbolRef.current = symbol;\n      currentTimeframeRef.current = timeframe || '1h';\n\n      try {\n        // Let coordinator use full data range (don't override with limited range)\n        // The coordinator's calculateDefaultRange() now returns full history for all timeframes\n        const { data } = await fetchChartData(\n          symbol || 'EURUSD',\n          currentTimeframeRef.current\n          // NO from/to - coordinator handles full range calculation\n        );\n        if (data.length > 0) {\n          // For initial load, set data directly since placeholder hook isn't ready yet\n          if (seriesRef.current && !hasPlaceholder()) {\n            seriesRef.current.setData(data.map(d => ({ ...d, time: d.time as Time })));\n          } else {\n            updateWithRealData(data.map(d => ({ ...d, time: d.time as Time })));\n          }\n          // Generate cache key using the same from/to values we used for fetching\n\n          // Set appropriate default view based on timeframe\n          if (chartRef.current && data.length > 0) {\n            const daysToShow = getDaysToShowForTimeframe(currentTimeframeRef.current);\n\n            // Use the last data point's time as the end time instead of current time\n            // This prevents issues with historical data\n            const lastDataTime = data[data.length - 1]!.time;\n            const from = lastDataTime - daysToShow * 24 * 60 * 60;\n\n            chartRef.current.timeScale().setVisibleRange({\n              from: from as Time,\n              to: lastDataTime as Time,\n            });\n\n            logger.debug(`Set visible range to ${daysToShow} days ending at data time ${new Date(lastDataTime * 1000).toISOString()}`);\n          }\n        }\n      } catch (error) {\n        logger.error('Error loading market chart data:', error);\n        setError(error instanceof Error ? error : new Error('Failed to load chart data'));\n      } finally {\n        setIsLoading(false);\n      }\n    };\n\n    loadInitialData();\n    return () => {\n      mounted = false;\n    };\n  }, []); // Only run once on mount\n\n  // Preload ALL timeframes in background after initial load\n  useEffect(() => {\n    if (!preloadAdjacentTimeframes || !initialLoadDoneRef.current || !symbol) {\n      return;\n    }\n\n    const preloadAllTimeframes = async () => {\n      const currentTf = currentTimeframeRef.current;\n      // Preload ALL timeframes except current one\n      const timeframesToPreload = ALL_TIMEFRAMES.filter(tf => tf !== currentTf);\n\n      logger.info(`Preloading all timeframes: ${timeframesToPreload.join(', ')}`);\n\n      // Preload in parallel - cache enabled for efficiency\n      Promise.all(\n        timeframesToPreload.map(async (tf: string) => {\n          try {\n            await chartDataCoordinator.fetchChartData(symbol, tf, { forceRefresh: false });\n            logger.debug(`Preloaded ${tf} data for ${symbol}`);\n          } catch (error) {\n            logger.warn(`Failed to preload ${tf} data:`, error);\n          }\n        })\n      ).then(() => {\n        logger.info(`All timeframe preloading complete`);\n      });\n    };\n\n    // Small delay to not compete with initial render\n    const timeoutId = setTimeout(preloadAllTimeframes, 500);\n    return () => clearTimeout(timeoutId);\n  }, [preloadAdjacentTimeframes, symbol, isLoading]); // Re-run when loading completes\n\n  // Handle external timeframe changes\n  useEffect(() => {\n    if (\n      timeframe &&\n      timeframe !== currentTimeframeRef.current &&\n      !isTransitioningRef.current &&\n      initialLoadDoneRef.current\n    ) {\n      logger.info(`[EXTERNAL] Switching to ${timeframe} from external control`);\n      switchTimeframe(timeframe);\n    }\n  }, [timeframe]);\n\n\n  // Handle symbol prop changes\n  useEffect(() => {\n    if (!symbol) return;\n\n    const prevSymbol = symbolRef.current;\n    symbolRef.current = symbol;\n\n    // Only reload if symbol actually changed AND initial load is done\n    if (\n      prevSymbol !== symbol &&\n      chartRef.current &&\n      initialLoadDoneRef.current &&\n      prevSymbol !== undefined\n    ) {\n      logger.info('Symbol changed from', prevSymbol, 'to', symbol);\n\n      // Clear existing chart data immediately\n      if (seriesRef.current) {\n        logger.debug('Clearing chart data for symbol change');\n        seriesRef.current.setData([]);\n      }\n\n      // Reset symbol-specific state\n      setIsLoading(true);\n      setError(null);\n      // Reset placeholder state via the hook\n      if (resetTrigger) {\n        resetTrigger();\n      }\n\n      // Reload data for new symbol using coordinator's default range\n      fetchChartData(symbol, currentTimeframeRef.current)\n        .then(({ data }) => {\n          if (data.length > 0 && seriesRef.current) {\n            // Direct setData for symbol change\n            seriesRef.current.setData(data.map(d => ({ ...d, time: d.time as Time })));\n            // Cache will be handled by the coordinator\n          }\n        })\n        .catch((error) => {\n          logger.error('Error loading new symbol:', error);\n          setError(error instanceof Error ? error : new Error('Failed to load symbol data'));\n        })\n        .finally(() => setIsLoading(false));\n    }\n  }, [symbol]);\n\n\n\n\n\n  // Show loading skeleton during initial load\n  if (isLoading && !initialLoadDoneRef.current) {\n    return (\n      <ChartErrorBoundary>\n        <Box style={{ position: 'relative', width: '100%', height: '100%' }}>\n          <ChartSkeleton height=\"100%\" />\n        </Box>\n      </ChartErrorBoundary>\n    );\n  }\n\n  // Show empty state if no symbol\n  if (!symbol) {\n    return (\n      <ChartErrorBoundary>\n        <Box style={{ position: 'relative', width: '100%', height: '100%' }}>\n          <ChartEmptyState />\n        </Box>\n      </ChartErrorBoundary>\n    );\n  }\n\n  // Regular mode\n  return (\n    <ChartErrorBoundary onError={(err) => setError(err)}>\n      <Box style={{ position: 'relative', width: '100%', height: '100%' }}>\n          <div\n            ref={chartContainerRef}\n            style={{\n              width: '100%',\n              height: '100%',\n              background: '#0a0a0a',\n              position: 'relative',\n              opacity: 1, // Always full opacity to prevent flashing\n              // transition: 'opacity 300ms ease-in-out',\n            }}\n          >\n          {isLoading && (\n            <div\n              style={{\n                position: 'absolute',\n                top: '10px',\n                right: '10px',\n                background: 'rgba(0,0,0,0.7)',\n                color: '#fff',\n                padding: '5px 10px',\n                borderRadius: '4px',\n                fontSize: '12px',\n              }}\n            >\n              Loading...\n            </div>\n          )}\n\n        <div\n          style={{\n            position: 'absolute',\n            top: '10px',\n            left: '10px',\n            background: 'rgba(0,0,0,0.7)',\n            color: '#00ff88',\n            padding: '5px 10px',\n            borderRadius: '4px',\n            fontSize: '12px',\n            fontFamily: 'monospace',\n          }}\n        >\n          {currentTimeframe}\n          {isShiftPressed && (\n            <span style={{ marginLeft: '10px', color: '#ff9900' }}>[LOCK LEFT]</span>\n          )}\n        </div>\n      </div>\n    </Box>\n    </ChartErrorBoundary>\n  );\n};\n\nexport { MarketDataChart };\nexport default MarketDataChart;\n","import React from 'react';\nimport { createLogger } from '../utils/logger';\nimport { ConnectionStatus } from '../services/ReconnectionManager';\n\nconst logger = createLogger('StreamStatus');\n\ninterface StreamStatusProps {\n  status: ConnectionStatus;\n  symbol?: string;\n  message?: string;\n  onRetry?: () => void;\n  position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n  compact?: boolean;\n}\n\ninterface StatusConfig {\n  color: string;\n  bgColor: string;\n  icon: string;\n  label: string;\n  animate?: boolean;\n}\n\nconst statusConfig: Record<ConnectionStatus, StatusConfig> = {\n  connected: {\n    color: '#4caf50',\n    bgColor: 'rgba(76, 175, 80, 0.1)',\n    icon: '●',\n    label: 'Connected',\n  },\n  connecting: {\n    color: '#2196f3',\n    bgColor: 'rgba(33, 150, 243, 0.1)',\n    icon: '◐',\n    label: 'Connecting',\n    animate: true,\n  },\n  disconnected: {\n    color: '#757575',\n    bgColor: 'rgba(117, 117, 117, 0.1)',\n    icon: '○',\n    label: 'Disconnected',\n  },\n  error: {\n    color: '#f44336',\n    bgColor: 'rgba(244, 67, 54, 0.1)',\n    icon: '✕',\n    label: 'Error',\n  },\n  reconnecting: {\n    color: '#ff9800',\n    bgColor: 'rgba(255, 152, 0, 0.1)',\n    icon: '↻',\n    label: 'Reconnecting',\n    animate: true,\n  },\n};\n\nexport const StreamStatus: React.FC<StreamStatusProps> = ({\n  status,\n  symbol,\n  message,\n  onRetry,\n  position = 'top-right',\n  compact = false,\n}) => {\n  const config = statusConfig[status];\n  \n  React.useEffect(() => {\n    logger.debug(`Status changed to: ${status}`, { symbol, message });\n  }, [status, symbol, message]);\n\n  const positionStyles = {\n    'top-left': { top: 10, left: 10 },\n    'top-right': { top: 10, right: 10 },\n    'bottom-left': { bottom: 10, left: 10 },\n    'bottom-right': { bottom: 10, right: 10 },\n  };\n\n  const handleRetry = () => {\n    logger.info('Retry connection requested');\n    onRetry?.();\n  };\n\n  return (\n    <div\n      style={{\n        position: 'absolute',\n        ...positionStyles[position],\n        padding: compact ? '4px 8px' : '8px 12px',\n        borderRadius: '4px',\n        backgroundColor: config.bgColor,\n        border: `1px solid ${config.color}`,\n        display: 'flex',\n        alignItems: 'center',\n        gap: '8px',\n        fontSize: compact ? '12px' : '14px',\n        fontFamily: 'system-ui, -apple-system, sans-serif',\n        zIndex: 1000,\n        userSelect: 'none',\n        transition: 'all 0.3s ease',\n      }}\n    >\n      <span\n        style={{\n          color: config.color,\n          fontSize: compact ? '12px' : '16px',\n          animation: config.animate ? 'pulse 1.5s infinite' : 'none',\n        }}\n      >\n        {config.icon}\n      </span>\n      \n      {!compact && (\n        <>\n          <span style={{ color: config.color, fontWeight: 500 }}>\n            {config.label}\n          </span>\n          \n          {symbol && (\n            <span style={{ color: config.color, opacity: 0.8 }}>\n              {symbol}\n            </span>\n          )}\n          \n          {message && (\n            <span style={{ color: config.color, opacity: 0.7, fontSize: '12px' }}>\n              {message}\n            </span>\n          )}\n          \n          {(status === 'error' || status === 'disconnected') && onRetry && (\n            <button\n              onClick={handleRetry}\n              style={{\n                marginLeft: '8px',\n                padding: '2px 8px',\n                fontSize: '12px',\n                color: config.color,\n                backgroundColor: 'transparent',\n                border: `1px solid ${config.color}`,\n                borderRadius: '3px',\n                cursor: 'pointer',\n                transition: 'all 0.2s ease',\n              }}\n              onMouseEnter={(e) => {\n                e.currentTarget.style.backgroundColor = config.color;\n                e.currentTarget.style.color = '#ffffff';\n              }}\n              onMouseLeave={(e) => {\n                e.currentTarget.style.backgroundColor = 'transparent';\n                e.currentTarget.style.color = config.color;\n              }}\n            >\n              Retry\n            </button>\n          )}\n        </>\n      )}\n      \n      <style>\n        {`\n          @keyframes pulse {\n            0% { opacity: 1; }\n            50% { opacity: 0.5; }\n            100% { opacity: 1; }\n          }\n        `}\n      </style>\n    </div>\n  );\n};\n\n// Minimal version for space-constrained layouts\nexport const MinimalStreamStatus: React.FC<Pick<StreamStatusProps, 'status'>> = ({ status }) => {\n  const config = statusConfig[status];\n  \n  return (\n    <span\n      style={{\n        color: config.color,\n        fontSize: '14px',\n        animation: config.animate ? 'pulse 1.5s infinite' : 'none',\n      }}\n      title={config.label}\n    >\n      {config.icon}\n    </span>\n  );\n};","import { useEffect, useRef, RefObject } from 'react';\nimport {\n  createChart,\n  IChartApi,\n  ISeriesApi,\n  ChartOptions,\n  DeepPartial,\n  CandlestickSeriesOptions,\n} from 'lightweight-charts';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('useChartSetup');\n\nexport interface ChartTheme {\n  backgroundColor: string;\n  textColor: string;\n  gridColor: string;\n  borderColor: string;\n  upColor: string;\n  downColor: string;\n  wickUpColor: string;\n  wickDownColor: string;\n}\n\n// Default dark theme\nexport const darkTheme: ChartTheme = {\n  backgroundColor: '#0d0d0d',\n  textColor: '#d1d4dc',\n  gridColor: 'rgba(42, 46, 57, 0.6)',\n  borderColor: '#2a2e39',\n  upColor: '#26a69a',\n  downColor: '#ef5350',\n  wickUpColor: '#26a69a',\n  wickDownColor: '#ef5350',\n};\n\n// Default chart options\nexport const defaultChartOptions = (theme: ChartTheme): DeepPartial<ChartOptions> => ({\n  layout: {\n    background: { color: theme.backgroundColor },\n    textColor: theme.textColor,\n  },\n  grid: {\n    vertLines: { color: theme.gridColor },\n    horzLines: { color: theme.gridColor },\n  },\n  crosshair: {\n    mode: 0, // Normal mode - free mouse movement\n    vertLine: {\n      color: theme.gridColor,\n      width: 1,\n      style: 3, // Dashed\n      labelBackgroundColor: theme.borderColor,\n    },\n    horzLine: {\n      color: theme.gridColor,\n      width: 1,\n      style: 3, // Dashed\n      labelBackgroundColor: theme.borderColor,\n    },\n  },\n  rightPriceScale: {\n    borderColor: theme.borderColor,\n    scaleMargins: {\n      top: 0.1,\n      bottom: 0.2,\n    },\n  },\n  timeScale: {\n    borderColor: theme.borderColor,\n    timeVisible: true,\n    secondsVisible: false,\n    rightBarStaysOnScroll: true,\n    barSpacing: 12,\n    minBarSpacing: 2,\n    fixRightEdge: false,\n    fixLeftEdge: false,\n    lockVisibleTimeRangeOnResize: false,\n  },\n  handleScroll: {\n    mouseWheel: true,\n    pressedMouseMove: true,\n    horzTouchDrag: true,\n    vertTouchDrag: false,\n  },\n  handleScale: {\n    axisPressedMouseMove: {\n      time: true,\n      price: true,\n    },\n    axisDoubleClickReset: true,\n    mouseWheel: true,\n    pinch: true,\n  },\n});\n\n// Default series options\nexport const defaultSeriesOptions = (theme: ChartTheme): DeepPartial<CandlestickSeriesOptions> => ({\n  upColor: theme.upColor,\n  downColor: theme.downColor,\n  borderVisible: false,\n  wickUpColor: theme.wickUpColor,\n  wickDownColor: theme.wickDownColor,\n  priceFormat: {\n    type: 'price',\n    precision: 5,\n    minMove: 0.00001,\n  },\n  priceScaleId: 'right',\n  lastValueVisible: true,\n  priceLineVisible: true,\n});\n\nexport interface UseChartSetupOptions {\n  theme?: ChartTheme;\n  chartOptions?: DeepPartial<ChartOptions>;\n  seriesOptions?: DeepPartial<CandlestickSeriesOptions>;\n}\n\nexport interface UseChartSetupReturn {\n  chart: IChartApi | null;\n  series: ISeriesApi<'Candlestick'> | null;\n  isReady: boolean;\n}\n\n/**\n * Hook to setup and manage a TradingView Lightweight Chart\n * \n * @param containerRef - Reference to the container element\n * @param options - Optional theme and configuration options\n * @returns Chart and series references\n */\nexport function useChartSetup(\n  containerRef: RefObject<HTMLDivElement>,\n  options?: UseChartSetupOptions\n): UseChartSetupReturn {\n  const chartRef = useRef<IChartApi | null>(null);\n  const seriesRef = useRef<ISeriesApi<'Candlestick'> | null>(null);\n  const isReadyRef = useRef(false);\n\n  const theme = options?.theme || darkTheme;\n  const chartOptions = options?.chartOptions || {};\n  const seriesOptions = options?.seriesOptions || {};\n\n  useEffect(() => {\n    if (!containerRef.current) return;\n\n    logger.debug('Creating chart');\n\n    // Create chart with merged options\n    const chart = createChart(containerRef.current, {\n      width: containerRef.current.clientWidth,\n      height: containerRef.current.clientHeight,\n      ...defaultChartOptions(theme),\n      ...chartOptions,\n    });\n\n    // Add candlestick series with merged options\n    const series = chart.addCandlestickSeries({\n      ...defaultSeriesOptions(theme),\n      ...seriesOptions,\n    });\n\n    // Store references\n    chartRef.current = chart;\n    seriesRef.current = series;\n    isReadyRef.current = true;\n\n    logger.debug('Chart created successfully');\n\n    // Cleanup\n    return () => {\n      logger.debug('Cleaning up chart');\n      isReadyRef.current = false;\n      chart.remove();\n      chartRef.current = null;\n      seriesRef.current = null;\n    };\n  }, []); // Only create chart once\n\n  // Handle container resize\n  useEffect(() => {\n    if (!chartRef.current || !containerRef.current) return;\n\n    const resizeObserver = new ResizeObserver((entries) => {\n      const entry = entries[0];\n      if (entry && chartRef.current) {\n        const { width, height } = entry.contentRect;\n        chartRef.current.applyOptions({ width, height });\n      }\n    });\n\n    resizeObserver.observe(containerRef.current);\n\n    return () => {\n      resizeObserver.disconnect();\n    };\n  }, []);\n\n  return {\n    chart: chartRef.current,\n    series: seriesRef.current,\n    isReady: isReadyRef.current,\n  };\n}","import { useEffect, useRef, useState, useCallback } from 'react';\nimport { IChartApi, Time } from 'lightweight-charts';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('useChartZoom');\n\nexport interface VisibleRange {\n  from: number;\n  to: number;\n}\n\nexport interface UseChartZoomOptions {\n  onBarSpacingChange?: (barSpacing: number) => void;\n  onVisibleRangeChange?: (range: VisibleRange | null) => void;\n  barSpacingCheckInterval?: number;\n}\n\nexport interface UseChartZoomReturn {\n  isShiftPressed: boolean;\n  lockedLeftEdge: number | null;\n  visibleRange: VisibleRange | null;\n  barSpacing: number;\n  zoomIn: (factor?: number) => void;\n  zoomOut: (factor?: number) => void;\n  resetZoom: () => void;\n  scrollToTime: (time: number, animate?: boolean) => void;\n  setVisibleRange: (range: VisibleRange) => void;\n  maintainLeftEdgeLock: () => void;\n}\n\n/**\n * Hook to manage chart zoom functionality including:\n * - Shift key handling for left edge locking\n * - Visible range tracking\n * - Bar spacing monitoring\n * - Zoom utilities\n */\nexport function useChartZoom(\n  chart: IChartApi | null,\n  options?: UseChartZoomOptions\n): UseChartZoomReturn {\n  const [isShiftPressed, setIsShiftPressed] = useState(false);\n  const [lockedLeftEdge, setLockedLeftEdge] = useState<number | null>(null);\n  const [visibleRange, setVisibleRange] = useState<VisibleRange | null>(null);\n  const [barSpacing, setBarSpacing] = useState(12);\n\n  const barSpacingCheckInterval = options?.barSpacingCheckInterval || 100;\n  const lastBarSpacingRef = useRef(12);\n\n  // Handle keyboard events for shift key\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Shift' && !isShiftPressed) {\n        setIsShiftPressed(true);\n        \n        // Lock the left edge when shift is pressed\n        if (chart && visibleRange) {\n          setLockedLeftEdge(visibleRange.from);\n          logger.debug(\n            'Left edge locked at:',\n            new Date(visibleRange.from * 1000).toISOString()\n          );\n          \n          // Disable rightBarStaysOnScroll for locked zooming\n          chart.timeScale().applyOptions({\n            rightBarStaysOnScroll: false,\n          });\n        }\n      }\n    };\n\n    const handleKeyUp = (e: KeyboardEvent) => {\n      if (e.key === 'Shift' && isShiftPressed) {\n        setIsShiftPressed(false);\n        setLockedLeftEdge(null);\n        logger.debug('Left edge lock released');\n        \n        // Re-enable rightBarStaysOnScroll\n        if (chart) {\n          chart.timeScale().applyOptions({\n            rightBarStaysOnScroll: true,\n          });\n        }\n      }\n    };\n\n    window.addEventListener('keydown', handleKeyDown);\n    window.addEventListener('keyup', handleKeyUp);\n\n    // Clean up on unmount or if shift was pressed when component unmounts\n    return () => {\n      window.removeEventListener('keydown', handleKeyDown);\n      window.removeEventListener('keyup', handleKeyUp);\n      \n      // Reset state if component unmounts while shift is pressed\n      if (isShiftPressed && chart) {\n        chart.timeScale().applyOptions({\n          rightBarStaysOnScroll: true,\n        });\n      }\n    };\n  }, [chart, isShiftPressed, visibleRange]);\n\n  // Track visible range changes\n  useEffect(() => {\n    if (!chart) return;\n\n    const handleVisibleRangeChange = () => {\n      const range = chart.timeScale().getVisibleRange();\n      if (range) {\n        const newRange = {\n          from: range.from as number,\n          to: range.to as number,\n        };\n        setVisibleRange(newRange);\n        options?.onVisibleRangeChange?.(newRange);\n      } else {\n        setVisibleRange(null);\n        options?.onVisibleRangeChange?.(null);\n      }\n    };\n\n    // Initial range\n    handleVisibleRangeChange();\n\n    // Subscribe to changes\n    chart.timeScale().subscribeVisibleTimeRangeChange(handleVisibleRangeChange);\n\n    return () => {\n      chart.timeScale().unsubscribeVisibleTimeRangeChange(handleVisibleRangeChange);\n    };\n  }, [chart, options]);\n\n  // Monitor bar spacing\n  useEffect(() => {\n    if (!chart) return;\n\n    const checkBarSpacing = () => {\n      try {\n        const currentBarSpacing = chart.timeScale().options().barSpacing;\n        \n        if (currentBarSpacing !== lastBarSpacingRef.current) {\n          logger.debug(\n            `Bar spacing changed: ${lastBarSpacingRef.current} → ${currentBarSpacing}`\n          );\n          lastBarSpacingRef.current = currentBarSpacing;\n          setBarSpacing(currentBarSpacing);\n          options?.onBarSpacingChange?.(currentBarSpacing);\n        }\n      } catch (e) {\n        // Chart might be disposed\n        logger.error('Error checking bar spacing:', e);\n      }\n    };\n\n    const intervalId = setInterval(checkBarSpacing, barSpacingCheckInterval);\n\n    return () => clearInterval(intervalId);\n  }, [chart, barSpacingCheckInterval, options]);\n\n  // Zoom in\n  const zoomIn = useCallback((factor = 1.2) => {\n    if (!chart) return;\n    \n    const timeScale = chart.timeScale();\n    const currentBarSpacing = timeScale.options().barSpacing;\n    const newBarSpacing = Math.min(currentBarSpacing * factor, 50); // Max bar spacing\n    \n    timeScale.applyOptions({ barSpacing: newBarSpacing });\n  }, [chart]);\n\n  // Zoom out\n  const zoomOut = useCallback((factor = 1.2) => {\n    if (!chart) return;\n    \n    const timeScale = chart.timeScale();\n    const currentBarSpacing = timeScale.options().barSpacing;\n    const newBarSpacing = Math.max(currentBarSpacing / factor, 2); // Min bar spacing\n    \n    timeScale.applyOptions({ barSpacing: newBarSpacing });\n  }, [chart]);\n\n  // Reset zoom to fit all data\n  const resetZoom = useCallback(() => {\n    if (!chart) return;\n    \n    chart.timeScale().fitContent();\n  }, [chart]);\n\n  // Scroll to specific time\n  const scrollToTime = useCallback((time: number, animate = true) => {\n    if (!chart || !visibleRange) return;\n    \n    const duration = visibleRange.to - visibleRange.from;\n    const newFrom = time - duration / 2;\n    const newTo = time + duration / 2;\n    \n    chart.timeScale().setVisibleRange({\n      from: newFrom as Time,\n      to: newTo as Time,\n    });\n    \n    if (animate) {\n      chart.timeScale().scrollToRealTime();\n    }\n  }, [chart, visibleRange]);\n\n  // Set visible range\n  const setVisibleRangeCallback = useCallback((range: VisibleRange) => {\n    if (!chart) return;\n    \n    chart.timeScale().setVisibleRange({\n      from: range.from as Time,\n      to: range.to as Time,\n    });\n  }, [chart]);\n\n  // Maintain left edge lock during zoom\n  const maintainLeftEdgeLock = useCallback(() => {\n    if (!chart || !isShiftPressed || lockedLeftEdge === null || !visibleRange) return;\n    \n    const currentDuration = visibleRange.to - visibleRange.from;\n    const newTo = lockedLeftEdge + currentDuration;\n    \n    chart.timeScale().setVisibleRange({\n      from: lockedLeftEdge as Time,\n      to: newTo as Time,\n    });\n  }, [chart, isShiftPressed, lockedLeftEdge, visibleRange]);\n\n  return {\n    isShiftPressed,\n    lockedLeftEdge,\n    visibleRange,\n    barSpacing,\n    zoomIn,\n    zoomOut,\n    resetZoom,\n    scrollToTime,\n    setVisibleRange: setVisibleRangeCallback,\n    maintainLeftEdgeLock,\n  };\n}","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { chartDataCoordinator } from '../services/ChartDataCoordinator';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('useChartData');\n\ninterface ChartData {\n  time: number;\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n}\n\ninterface UseChartDataOptions {\n  autoLoad?: boolean;\n  range?: { from: number; to: number };\n}\n\ninterface UseChartDataReturn {\n  data: ChartData[];\n  isLoading: boolean;\n  error: string | null;\n  fetchData: (options?: { forceRefresh?: boolean; range?: { from: number; to: number } }) => Promise<void>;\n  invalidateCache: (pattern?: string) => void;\n  setDefaultRange: (from: number, to: number) => void;\n}\n\nexport function useChartData(\n  symbol: string,\n  timeframe: string,\n  options?: UseChartDataOptions\n): UseChartDataReturn {\n  const [data, setData] = useState<ChartData[]>([]);\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  \n  // Track current symbol/timeframe to detect changes\n  const currentRef = useRef({ symbol, timeframe });\n  \n  // Fetch data with coordination\n  const fetchData = useCallback(async (fetchOptions?: { \n    forceRefresh?: boolean; \n    range?: { from: number; to: number } \n  }) => {\n    // Don't fetch if already loading\n    if (isLoading) {\n      logger.trace('Already loading, skipping fetch');\n      return;\n    }\n\n    setIsLoading(true);\n    setError(null);\n\n    try {\n      const result = await chartDataCoordinator.fetchChartData(\n        symbol,\n        timeframe,\n        {\n          forceRefresh: fetchOptions?.forceRefresh,\n          range: fetchOptions?.range || options?.range\n        }\n      );\n      \n      // Only update if we're still looking at the same symbol/timeframe\n      if (currentRef.current.symbol === symbol && currentRef.current.timeframe === timeframe) {\n        setData(result);\n        logger.debug(`Updated data for ${symbol}-${timeframe}: ${result.length} candles`);\n      }\n    } catch (err) {\n      logger.error('Fetch error:', err);\n      if (currentRef.current.symbol === symbol && currentRef.current.timeframe === timeframe) {\n        setError(err instanceof Error ? err.message : 'Failed to fetch data');\n      }\n    } finally {\n      if (currentRef.current.symbol === symbol && currentRef.current.timeframe === timeframe) {\n        setIsLoading(false);\n      }\n    }\n  }, [symbol, timeframe, isLoading, options?.range]);\n\n  // Set default range for this symbol/timeframe\n  const setDefaultRange = useCallback((from: number, to: number) => {\n    chartDataCoordinator.setDefaultRange(symbol, timeframe, from, to);\n  }, [symbol, timeframe]);\n\n  // Invalidate cache\n  const invalidateCache = useCallback((pattern?: string) => {\n    chartDataCoordinator.invalidateCache(pattern);\n  }, []);\n\n  // Auto-load on mount or when symbol/timeframe changes\n  useEffect(() => {\n    // Update ref\n    currentRef.current = { symbol, timeframe };\n    \n    // Clear previous data when switching\n    setData([]);\n    \n    // Auto-load if enabled (default true)\n    if (options?.autoLoad !== false) {\n      fetchData();\n    }\n  }, [symbol, timeframe, options?.autoLoad]); // Don't include fetchData to avoid loops\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => {\n      // Could cancel pending requests here if needed\n      logger.trace(`Unmounting for ${symbol}-${timeframe}`);\n    };\n  }, [symbol, timeframe]);\n\n  return {\n    data,\n    isLoading,\n    error,\n    fetchData,\n    invalidateCache,\n    setDefaultRange\n  };\n}","import { useEffect, useRef, useState, useCallback } from 'react';\nimport { TIMEFRAME_SECONDS } from '../constants/timeframes';\n\nexport interface UseCountdownTimerOptions {\n  onNewCandleBoundary?: (time: number) => void;\n  updateInterval?: number;\n  warningThreshold?: number;\n  criticalThreshold?: number;\n}\n\nexport interface UseCountdownTimerReturn {\n  countdown: string;\n  countdownColor: string;\n  secondsRemaining: number;\n  isNearBoundary: boolean;\n  isPastBoundary: boolean;\n}\n\n/**\n * Hook to manage countdown timer to next candle boundary\n * \n * @param timeframe - Current chart timeframe\n * @param options - Configuration options\n * @returns Countdown state and utilities\n */\nexport function useCountdownTimer(\n  timeframe: string,\n  options?: UseCountdownTimerOptions\n): UseCountdownTimerReturn {\n  const {\n    onNewCandleBoundary,\n    updateInterval = 1000,\n    warningThreshold = 30,\n    criticalThreshold = 10,\n  } = options || {};\n\n  const [countdown, setCountdown] = useState<string>('00:00');\n  const [countdownColor, setCountdownColor] = useState<string>('#999');\n  const [secondsRemaining, setSecondsRemaining] = useState<number>(0);\n  \n  const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n  const lastUpdateRef = useRef<number>(0);\n  const hasTriggeredRef = useRef<boolean>(false);\n\n  // Calculate seconds to next candle boundary\n  const calculateSecondsToNextCandle = useCallback((timeframe: string): number => {\n    const now = new Date();\n    // Use UTC methods to align with server-side candle boundaries\n    const seconds = now.getUTCSeconds();\n    const minutes = now.getUTCMinutes();\n    const hours = now.getUTCHours();\n\n    switch (timeframe) {\n      case '5m':\n        return (5 - (minutes % 5)) * 60 - seconds;\n      case '15m':\n        return (15 - (minutes % 15)) * 60 - seconds;\n      case '1h':\n        return (60 - minutes) * 60 - seconds;\n      case '4h':\n        return (4 - (hours % 4)) * 3600 + (60 - minutes) * 60 - seconds;\n      case '12h':\n        return (12 - (hours % 12)) * 3600 + (60 - minutes) * 60 - seconds;\n      default:\n        return (60 - minutes) * 60 - seconds; // Default to 1h\n    }\n  }, []);\n\n  // Format seconds to MM:SS\n  const formatCountdown = useCallback((totalSeconds: number): string => {\n    const displaySeconds = Math.max(0, totalSeconds);\n    const minutes = Math.floor(displaySeconds / 60);\n    const seconds = displaySeconds % 60;\n    return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n  }, []);\n\n  // Get color based on time remaining\n  const getCountdownColor = useCallback((seconds: number): string => {\n    if (seconds <= criticalThreshold) {\n      return '#ffae00'; // Yellow warning\n    } else if (seconds <= warningThreshold) {\n      return '#ccc'; // Brighter gray\n    } else {\n      return '#999'; // Dimmed gray\n    }\n  }, [criticalThreshold, warningThreshold]);\n\n  // Update countdown\n  const updateCountdown = useCallback(() => {\n    const now = Date.now();\n    const seconds = Math.floor(now / 1000) % 60;\n    \n    // Throttle updates based on proximity to boundary\n    const nearBoundary = seconds >= 58 || seconds <= 2;\n    const throttleMs = nearBoundary ? 100 : 950;\n    \n    if (now - lastUpdateRef.current < throttleMs) return;\n    lastUpdateRef.current = now;\n\n    const totalSeconds = calculateSecondsToNextCandle(timeframe);\n    setSecondsRemaining(totalSeconds);\n\n    // Update display\n    setCountdown(formatCountdown(totalSeconds));\n    setCountdownColor(getCountdownColor(totalSeconds));\n\n    // Trigger boundary callback\n    if (totalSeconds <= 0 && !hasTriggeredRef.current) {\n      hasTriggeredRef.current = true;\n      const candleTime = Math.floor(now / 1000);\n      onNewCandleBoundary?.(candleTime);\n    }\n\n    // Reset trigger when safely past boundary\n    if (totalSeconds > 5) {\n      hasTriggeredRef.current = false;\n    }\n  }, [timeframe, calculateSecondsToNextCandle, formatCountdown, getCountdownColor, onNewCandleBoundary]);\n\n  // Start/stop countdown based on visibility\n  useEffect(() => {\n    const startCountdown = () => {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n\n      // Initial update\n      updateCountdown();\n\n      // Start interval\n      intervalRef.current = setInterval(updateCountdown, updateInterval);\n    };\n\n    const stopCountdown = () => {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n        intervalRef.current = null;\n      }\n    };\n\n    // Handle visibility changes to save resources\n    const handleVisibilityChange = () => {\n      if (document.hidden) {\n        stopCountdown();\n      } else {\n        startCountdown();\n      }\n    };\n\n    // Start if page is visible\n    if (!document.hidden) {\n      startCountdown();\n    }\n\n    // Listen for visibility changes\n    document.addEventListener('visibilitychange', handleVisibilityChange);\n\n    return () => {\n      stopCountdown();\n      document.removeEventListener('visibilitychange', handleVisibilityChange);\n    };\n  }, [timeframe, updateCountdown, updateInterval]);\n\n  return {\n    countdown,\n    countdownColor,\n    secondsRemaining,\n    isNearBoundary: secondsRemaining <= 2 && secondsRemaining > 0,\n    isPastBoundary: secondsRemaining <= 0,\n  };\n}\n\n/**\n * Calculate the time of the next candle boundary\n */\nexport function getNextCandleTime(timeframe: string): number {\n  const now = Math.floor(Date.now() / 1000);\n  \n  const period = TIMEFRAME_SECONDS[timeframe as keyof typeof TIMEFRAME_SECONDS] || TIMEFRAME_SECONDS['1h'];\n  return Math.ceil(now / period) * period;\n}\n\n/**\n * Calculate the current candle's start time\n */\nexport function getCurrentCandleTime(timeframe: string): number {\n  const now = Math.floor(Date.now() / 1000);\n  \n  const period = TIMEFRAME_SECONDS[timeframe as keyof typeof TIMEFRAME_SECONDS] || TIMEFRAME_SECONDS['1h'];\n  return Math.floor(now / period) * period;\n}","import { createLogger } from '../utils/logger';\n\nconst logger = createLogger('ReconnectionManager');\n\nexport interface ReconnectionConfig {\n  maxRetries?: number;\n  initialDelay?: number;\n  maxDelay?: number;\n  backoffMultiplier?: number;\n  onStatusChange?: (status: ConnectionStatus) => void;\n  onError?: (error: Error, retryCount: number) => void;\n  onConnected?: () => void;\n  onDisconnected?: (reason?: string) => void;\n  onMaxRetriesReached?: () => void;\n}\n\nexport type ConnectionStatus = 'connected' | 'connecting' | 'disconnected' | 'error' | 'reconnecting';\n\nexport class ReconnectionManager {\n  private config: Required<ReconnectionConfig>;\n  private retryCount = 0;\n  private retryTimer?: NodeJS.Timeout;\n  private currentDelay: number;\n  private isDestroyed = false;\n  private connectFn: () => Promise<void>;\n  private currentStatus: ConnectionStatus = 'disconnected';\n\n  constructor(\n    connectFunction: () => Promise<void>,\n    config: ReconnectionConfig = {}\n  ) {\n    this.connectFn = connectFunction;\n    this.config = {\n      maxRetries: config.maxRetries ?? 10,\n      initialDelay: config.initialDelay ?? 1000,\n      maxDelay: config.maxDelay ?? 30000,\n      backoffMultiplier: config.backoffMultiplier ?? 1.5,\n      onStatusChange: config.onStatusChange ?? (() => {}),\n      onError: config.onError ?? (() => {}),\n      onConnected: config.onConnected ?? (() => {}),\n      onDisconnected: config.onDisconnected ?? (() => {}),\n      onMaxRetriesReached: config.onMaxRetriesReached ?? (() => {}),\n    };\n    this.currentDelay = this.config.initialDelay;\n  }\n\n  private setStatus(status: ConnectionStatus) {\n    if (this.currentStatus !== status) {\n      this.currentStatus = status;\n      logger.info(`Status changed: ${status}`);\n      this.config.onStatusChange(status);\n    }\n  }\n\n  async connect(): Promise<void> {\n    if (this.isDestroyed) {\n      logger.warn('Cannot connect: ReconnectionManager is destroyed');\n      return;\n    }\n\n    this.clearRetryTimer();\n    this.setStatus('connecting');\n\n    try {\n      await this.connectFn();\n      this.handleConnectionSuccess();\n    } catch (error) {\n      this.handleConnectionError(error as Error);\n    }\n  }\n\n  private handleConnectionSuccess() {\n    logger.info('Connection successful');\n    this.retryCount = 0;\n    this.currentDelay = this.config.initialDelay;\n    this.setStatus('connected');\n    this.config.onConnected();\n  }\n\n  private handleConnectionError(error: Error) {\n    logger.error('Connection failed:', error);\n    this.config.onError(error, this.retryCount);\n    \n    if (this.retryCount >= this.config.maxRetries) {\n      this.handleMaxRetriesReached();\n      return;\n    }\n\n    this.scheduleRetry();\n  }\n\n  private handleMaxRetriesReached() {\n    logger.error(`Max retries (${this.config.maxRetries}) reached`);\n    this.setStatus('error');\n    this.config.onMaxRetriesReached();\n  }\n\n  private scheduleRetry() {\n    if (this.isDestroyed) return;\n\n    this.retryCount++;\n    this.setStatus('reconnecting');\n    \n    logger.info(`Scheduling retry ${this.retryCount}/${this.config.maxRetries} in ${this.currentDelay}ms`);\n\n    this.retryTimer = setTimeout(() => {\n      this.connect();\n    }, this.currentDelay);\n\n    // Calculate next delay with exponential backoff\n    this.currentDelay = Math.min(\n      this.currentDelay * this.config.backoffMultiplier,\n      this.config.maxDelay\n    );\n  }\n\n  disconnect(reason?: string) {\n    logger.info('Disconnecting', reason ? `Reason: ${reason}` : '');\n    this.clearRetryTimer();\n    this.setStatus('disconnected');\n    this.config.onDisconnected(reason);\n  }\n\n  private clearRetryTimer() {\n    if (this.retryTimer) {\n      clearTimeout(this.retryTimer);\n      this.retryTimer = undefined;\n    }\n  }\n\n  resetRetryCount() {\n    this.retryCount = 0;\n    this.currentDelay = this.config.initialDelay;\n  }\n\n  getStatus(): ConnectionStatus {\n    return this.currentStatus;\n  }\n\n  getRetryCount(): number {\n    return this.retryCount;\n  }\n\n  getNextRetryDelay(): number {\n    return this.currentDelay;\n  }\n\n  destroy() {\n    logger.info('Destroying ReconnectionManager');\n    this.isDestroyed = true;\n    this.clearRetryTimer();\n    this.disconnect('Manager destroyed');\n  }\n}\n\n// Helper class for WebSocket reconnection\nexport class WebSocketReconnectionManager extends ReconnectionManager {\n  private ws?: WebSocket;\n  private url: string;\n  private protocols?: string | string[];\n  private heartbeatInterval?: NodeJS.Timeout;\n  private heartbeatTimeout?: NodeJS.Timeout;\n  private lastPingTime?: number;\n  private pingInterval = 30000; // 30 seconds\n  private pongTimeout = 5000; // 5 seconds\n\n  constructor(\n    url: string,\n    protocols?: string | string[],\n    config?: ReconnectionConfig & {\n      enableHeartbeat?: boolean;\n      pingInterval?: number;\n      pongTimeout?: number;\n      onMessage?: (event: MessageEvent) => void;\n    }\n  ) {\n    const wsConfig = { ...config };\n    const onMessage = wsConfig.onMessage;\n    delete wsConfig.onMessage;\n\n    super(async () => {\n      await this.createWebSocket(onMessage);\n    }, wsConfig);\n\n    this.url = url;\n    this.protocols = protocols;\n    \n    if (config?.enableHeartbeat) {\n      this.pingInterval = config.pingInterval ?? this.pingInterval;\n      this.pongTimeout = config.pongTimeout ?? this.pongTimeout;\n    } else {\n      // Clear ping values when heartbeat is disabled\n      this.pingInterval = undefined as any;\n      this.pongTimeout = undefined as any;\n    }\n  }\n\n  private async createWebSocket(onMessage?: (event: MessageEvent) => void): Promise<void> {\n    return new Promise((resolve, reject) => {\n      try {\n        this.ws = new WebSocket(this.url, this.protocols);\n        \n        this.ws.onopen = () => {\n          logger.info('WebSocket connected');\n          this.startHeartbeat();\n          resolve();\n        };\n\n        this.ws.onerror = (event) => {\n          logger.error('WebSocket error:', event);\n          reject(new Error('WebSocket connection failed'));\n        };\n\n        this.ws.onclose = (event) => {\n          logger.info('WebSocket closed:', { code: event.code, reason: event.reason });\n          this.stopHeartbeat();\n          \n          // Only reconnect if not a normal closure\n          if (event.code !== 1000 && event.code !== 1001) {\n            this.disconnect('WebSocket closed unexpectedly');\n            this.connect(); // Trigger reconnection\n          }\n        };\n\n        if (onMessage) {\n          this.ws.onmessage = onMessage;\n        }\n\n        // Handle ping/pong for heartbeat\n        this.ws.addEventListener('message', (event) => {\n          if (event.data === 'pong') {\n            this.handlePong();\n          }\n        });\n\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n\n  private startHeartbeat() {\n    if (!this.pingInterval) return;\n\n    this.heartbeatInterval = setInterval(() => {\n      this.sendPing();\n    }, this.pingInterval);\n  }\n\n  private stopHeartbeat() {\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = undefined;\n    }\n    if (this.heartbeatTimeout) {\n      clearTimeout(this.heartbeatTimeout);\n      this.heartbeatTimeout = undefined;\n    }\n  }\n\n  private sendPing() {\n    if (this.ws?.readyState === WebSocket.OPEN) {\n      this.lastPingTime = Date.now();\n      this.ws.send('ping');\n      \n      // Set timeout for pong response\n      this.heartbeatTimeout = setTimeout(() => {\n        logger.warn('Heartbeat timeout - no pong received');\n        this.ws?.close();\n      }, this.pongTimeout);\n    }\n  }\n\n  private handlePong() {\n    if (this.heartbeatTimeout) {\n      clearTimeout(this.heartbeatTimeout);\n      this.heartbeatTimeout = undefined;\n    }\n    \n    if (this.lastPingTime) {\n      const latency = Date.now() - this.lastPingTime;\n      logger.trace(`Heartbeat latency: ${latency}ms`);\n    }\n  }\n\n  send(data: string | ArrayBuffer | Blob): void {\n    if (this.ws?.readyState === WebSocket.OPEN) {\n      this.ws.send(data);\n    } else {\n      logger.warn('Cannot send: WebSocket is not open');\n    }\n  }\n\n  close(code?: number, reason?: string): void {\n    this.stopHeartbeat();\n    this.ws?.close(code, reason);\n    this.destroy();\n  }\n\n  getWebSocket(): WebSocket | undefined {\n    return this.ws;\n  }\n}","import { useEffect, useRef, useState, useCallback } from 'react';\nimport { ReconnectionManager, WebSocketReconnectionManager, ConnectionStatus, ReconnectionConfig } from '../services/ReconnectionManager';\nimport { createLogger } from '../utils/logger';\nimport { ChartData } from '../types';\n\nconst logger = createLogger('useReconnection');\n\nexport interface UseReconnectionOptions extends ReconnectionConfig {\n  enabled?: boolean;\n  autoConnect?: boolean;\n}\n\nexport interface UseReconnectionReturn {\n  status: ConnectionStatus;\n  retryCount: number;\n  nextRetryDelay: number;\n  connect: () => Promise<void>;\n  disconnect: (reason?: string) => void;\n  resetRetries: () => void;\n}\n\nexport function useReconnection(\n  connectFn: () => Promise<void>,\n  options: UseReconnectionOptions = {}\n): UseReconnectionReturn {\n  const { enabled = true, autoConnect = true, ...config } = options;\n  const [status, setStatus] = useState<ConnectionStatus>('disconnected');\n  const [retryCount, setRetryCount] = useState(0);\n  const [nextRetryDelay, setNextRetryDelay] = useState(0);\n  \n  const managerRef = useRef<ReconnectionManager>();\n\n  useEffect(() => {\n    if (!enabled) return;\n\n    const manager = new ReconnectionManager(connectFn, {\n      ...config,\n      onStatusChange: (newStatus) => {\n        setStatus(newStatus);\n        setRetryCount(manager.getRetryCount());\n        setNextRetryDelay(manager.getNextRetryDelay());\n        config.onStatusChange?.(newStatus);\n      },\n    });\n\n    managerRef.current = manager;\n\n    if (autoConnect) {\n      manager.connect();\n    }\n\n    return () => {\n      manager.destroy();\n    };\n  }, [enabled]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const connect = useCallback(async () => {\n    await managerRef.current?.connect();\n  }, []);\n\n  const disconnect = useCallback((reason?: string) => {\n    managerRef.current?.disconnect(reason);\n  }, []);\n\n  const resetRetries = useCallback(() => {\n    managerRef.current?.resetRetryCount();\n    setRetryCount(0);\n    setNextRetryDelay(config.initialDelay || 1000);\n  }, [config.initialDelay]);\n\n  return {\n    status,\n    retryCount,\n    nextRetryDelay,\n    connect,\n    disconnect,\n    resetRetries,\n  };\n}\n\n// WebSocket-specific hook\nexport interface UseWebSocketReconnectionOptions extends Omit<UseReconnectionOptions, 'onError'> {\n  url: string;\n  protocols?: string | string[];\n  enableHeartbeat?: boolean;\n  pingInterval?: number;\n  pongTimeout?: number;\n  onMessage?: (event: MessageEvent) => void;\n  onOpen?: (event: Event) => void;\n  onClose?: (event: CloseEvent) => void;\n  onError?: (error: Error, retryCount: number) => void;\n  onWebSocketError?: (event: Event) => void;\n}\n\nexport interface UseWebSocketReconnectionReturn extends UseReconnectionReturn {\n  ws: WebSocket | undefined;\n  send: (data: string | ArrayBuffer | Blob) => void;\n  close: (code?: number, reason?: string) => void;\n}\n\nexport function useWebSocketReconnection(\n  options: UseWebSocketReconnectionOptions\n): UseWebSocketReconnectionReturn {\n  const { \n    url, \n    protocols, \n    enableHeartbeat = true,\n    pingInterval,\n    pongTimeout,\n    onMessage,\n    onOpen,\n    onClose,\n    onError,\n    onWebSocketError,\n    enabled = true,\n    autoConnect = true,\n    ...reconnectionConfig \n  } = options;\n\n  const [ws, setWs] = useState<WebSocket>();\n  const managerRef = useRef<WebSocketReconnectionManager>();\n\n  useEffect(() => {\n    if (!enabled) return;\n\n    const manager = new WebSocketReconnectionManager(url, protocols, {\n      ...reconnectionConfig,\n      onError,\n      enableHeartbeat,\n      pingInterval,\n      pongTimeout,\n      onMessage,\n      onConnected: () => {\n        const websocket = manager.getWebSocket();\n        setWs(websocket);\n        \n        if (websocket && onOpen) {\n          onOpen(new Event('open'));\n        }\n        \n        reconnectionConfig.onConnected?.();\n      },\n      onDisconnected: (reason) => {\n        setWs(undefined);\n        \n        if (onClose) {\n          onClose(new CloseEvent('close', { reason }));\n        }\n        \n        reconnectionConfig.onDisconnected?.(reason);\n      },\n    });\n\n    managerRef.current = manager;\n\n    if (autoConnect) {\n      manager.connect();\n    }\n\n    return () => {\n      manager.destroy();\n    };\n  }, [url, enabled]); // eslint-disable-line react-hooks/exhaustive-deps\n\n  const reconnectionReturn = useReconnection(\n    async () => {\n      // This is handled by the WebSocketReconnectionManager\n      await Promise.resolve();\n    },\n    { ...reconnectionConfig, enabled: false } // Disable the base hook\n  );\n\n  const send = useCallback((data: string | ArrayBuffer | Blob) => {\n    managerRef.current?.send(data);\n  }, []);\n\n  const close = useCallback((code?: number, reason?: string) => {\n    managerRef.current?.close(code, reason);\n  }, []);\n\n  return {\n    ...reconnectionReturn,\n    status: managerRef.current?.getStatus() || 'disconnected',\n    retryCount: managerRef.current?.getRetryCount() || 0,\n    nextRetryDelay: managerRef.current?.getNextRetryDelay() || 0,\n    ws,\n    send,\n    close,\n    connect: async () => {\n      await managerRef.current?.connect();\n    },\n    disconnect: (reason?: string) => {\n      managerRef.current?.disconnect(reason);\n    },\n  };\n}\n\n// Example usage helper for chart data streaming\nexport function useChartDataStream(\n  symbol: string,\n  timeframe: string,\n  onCandle: (candle: ChartData) => void\n) {\n  const wsUrl = `wss://stream.example.com/ws/${symbol.toLowerCase()}@kline_${timeframe}`;\n  \n  const { status, send, retryCount } = useWebSocketReconnection({\n    url: wsUrl,\n    enableHeartbeat: true,\n    maxRetries: 10,\n    initialDelay: 1000,\n    maxDelay: 30000,\n    onMessage: (event) => {\n      try {\n        const data = JSON.parse(event.data);\n        if (data.type === 'kline') {\n          onCandle(data.kline);\n        }\n      } catch (error) {\n        logger.error('Failed to parse WebSocket message:', error);\n      }\n    },\n    onConnected: () => {\n      logger.info(`Connected to market data stream for ${symbol}`);\n      // Subscribe to the stream\n      send(JSON.stringify({\n        method: 'SUBSCRIBE',\n        params: [`${symbol.toLowerCase()}@kline_${timeframe}`],\n        id: Date.now(),\n      }));\n    },\n    onError: (error, retryCount) => {\n      logger.error(`Stream error (retry ${retryCount}):`, error);\n    },\n    onMaxRetriesReached: () => {\n      logger.error('Failed to connect to market data stream after max retries');\n    },\n  });\n\n  return { status, retryCount };\n}","import { WebSocketReconnectionManager } from './ReconnectionManager';\nimport { createLogger } from '../utils/logger';\nimport { ChartData } from '../types';\n\nconst logger = createLogger('WebSocketService');\n\nexport interface WebSocketConfig {\n  url: string;\n  apiKey?: string;\n  broker?: string; // Add broker field\n  enableHeartbeat?: boolean;\n  pingInterval?: number;\n  pongTimeout?: number;\n  maxRetries?: number;\n  initialDelay?: number;\n  maxDelay?: number;\n}\n\nexport interface StreamMessage {\n  type: 'candle' | 'trade' | 'error' | 'subscribed' | 'unsubscribed';\n  symbol?: string;\n  timeframe?: string;\n  data?: any;\n  error?: string;\n}\n\nexport interface CandleUpdate {\n  time: number;\n  open: number;\n  high: number;\n  low: number;\n  close: number;\n  volume?: number;\n}\n\nexport interface Subscription {\n  symbol: string;\n  timeframe: string;\n  callback: (candle: ChartData) => void;\n  onRawMessage?: (message: any) => void; // Add raw message callback\n}\n\nexport class WebSocketService {\n  private manager?: WebSocketReconnectionManager;\n  private subscriptions = new Map<string, Subscription>();\n  private config: WebSocketConfig;\n  private isConnected = false;\n\n  constructor(config: WebSocketConfig) {\n    this.config = config;\n  }\n\n  connect(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      logger.info('Connecting to WebSocket server...', { url: this.config.url });\n\n      this.manager = new WebSocketReconnectionManager(\n        this.config.url,\n        undefined,\n        {\n          enableHeartbeat: this.config.enableHeartbeat ?? true,\n          pingInterval: this.config.pingInterval ?? 30000,\n          pongTimeout: this.config.pongTimeout ?? 5000,\n          maxRetries: this.config.maxRetries ?? 10,\n          initialDelay: this.config.initialDelay ?? 1000,\n          maxDelay: this.config.maxDelay ?? 30000,\n          onConnected: () => {\n            logger.info('WebSocket connected');\n            this.isConnected = true;\n            this.sendAuthMessage();\n            this.resubscribeAll();\n            resolve();\n          },\n          onDisconnected: (reason) => {\n            logger.warn('WebSocket disconnected', { reason });\n            this.isConnected = false;\n          },\n          onError: (error, retryCount) => {\n            logger.error('WebSocket error', { error, retryCount });\n            if (retryCount === 0) {\n              reject(error);\n            }\n          },\n          onMessage: (event) => {\n            this.handleMessage(event);\n          }\n        }\n      );\n\n      this.manager.connect();\n    });\n  }\n\n  private sendAuthMessage() {\n    if (this.config.apiKey) {\n      this.send({\n        type: 'auth',\n        apiKey: this.config.apiKey\n      });\n    }\n  }\n\n  private resubscribeAll() {\n    logger.info('Resubscribing to all active subscriptions', { \n      count: this.subscriptions.size \n    });\n    \n    this.subscriptions.forEach(sub => {\n      this.sendSubscribeMessage(sub.symbol, sub.timeframe);\n    });\n  }\n\n  private handleMessage(event: MessageEvent) {\n    try {\n      // Skip ping/pong heartbeat messages (not JSON)\n      if (event.data === 'ping' || event.data === 'pong') {\n        return;\n      }\n\n      const message = JSON.parse(event.data);\n      logger.info('Received WebSocket message', { message });\n      \n      // Send raw message to all subscribers\n      this.subscriptions.forEach(sub => {\n        if (sub.onRawMessage) {\n          sub.onRawMessage(message);\n        }\n      });\n\n      // Handle your server's format\n      if (message.type === 'data' && message.data) {\n        const innerData = message.data;\n        \n        // Convert server format to our expected format\n        if (innerData.type === 'candle' && innerData.data) {\n          const candleMessage: StreamMessage = {\n            type: 'candle',\n            symbol: message.symbol,\n            timeframe: innerData.interval || '1h',\n            data: {\n              time: innerData.timestamp || innerData.data.time,\n              open: innerData.data.open,\n              high: innerData.data.high,\n              low: innerData.data.low,\n              close: innerData.data.close,\n              volume: innerData.data.volume\n            }\n          };\n          this.handleCandleUpdate(candleMessage);\n        } else if (innerData.type === 'tick' && innerData.data) {\n          // For tick data, create a candle (you might want to aggregate these)\n          const candleMessage: StreamMessage = {\n            type: 'candle',\n            symbol: message.symbol,\n            timeframe: '1m', // Default timeframe for ticks\n            data: {\n              time: innerData.timestamp,\n              open: innerData.data.price,\n              high: innerData.data.price,\n              low: innerData.data.price,\n              close: innerData.data.price,\n              volume: innerData.data.volume\n            }\n          };\n          this.handleCandleUpdate(candleMessage);\n        }\n      } else if (message.type === 'status' || message.type === 'subscribed') {\n        logger.info('Status update', { message });\n      } else if (message.type === 'error') {\n        logger.error('Stream error', { error: message.error || message });\n      }\n    } catch (error) {\n      logger.error('Failed to parse WebSocket message', { error, data: event.data });\n    }\n  }\n\n  private handleCandleUpdate(message: StreamMessage) {\n    if (!message.symbol || !message.timeframe || !message.data) {\n      logger.warn('Invalid candle update message', { message });\n      return;\n    }\n\n    const key = this.getSubscriptionKey(message.symbol, message.timeframe);\n    const subscription = this.subscriptions.get(key);\n    \n    if (subscription) {\n      const candle: ChartData = {\n        time: message.data.time,\n        open: message.data.open,\n        high: message.data.high,\n        low: message.data.low,\n        close: message.data.close\n      };\n      \n      subscription.callback(candle);\n    } else {\n      logger.trace('Received update for unsubscribed symbol', { \n        symbol: message.symbol, \n        timeframe: message.timeframe \n      });\n    }\n  }\n\n  subscribe(\n    symbol: string, \n    timeframe: string, \n    callback: (candle: ChartData) => void,\n    onRawMessage?: (message: any) => void\n  ): () => void {\n    const key = this.getSubscriptionKey(symbol, timeframe);\n    \n    if (this.subscriptions.has(key)) {\n      logger.warn('Already subscribed', { symbol, timeframe });\n      return () => {};\n    }\n\n    logger.info('Subscribing to stream', { symbol, timeframe });\n    \n    const subscription: Subscription = { symbol, timeframe, callback, onRawMessage };\n    this.subscriptions.set(key, subscription);\n\n    if (this.isConnected) {\n      this.sendSubscribeMessage(symbol, timeframe);\n    }\n\n    // Return unsubscribe function\n    return () => {\n      this.unsubscribe(symbol, timeframe);\n    };\n  }\n\n  unsubscribe(symbol: string, timeframe: string) {\n    const key = this.getSubscriptionKey(symbol, timeframe);\n    \n    if (!this.subscriptions.has(key)) {\n      logger.warn('Not subscribed', { symbol, timeframe });\n      return;\n    }\n\n    logger.info('Unsubscribing from stream', { symbol, timeframe });\n    \n    this.subscriptions.delete(key);\n\n    if (this.isConnected) {\n      this.sendUnsubscribeMessage(symbol, timeframe);\n    }\n  }\n\n  private sendSubscribeMessage(symbol: string, timeframe: string) {\n    // Send in your server's expected format\n    const broker = this.config.broker || 'binance';\n    this.send({\n      action: 'subscribe',\n      broker: broker,\n      symbols: [symbol],\n      types: broker === 'oanda' || broker === 'kraken' ? ['tick'] : ['candle'], // Oanda and Kraken use tick data\n      interval: timeframe\n    });\n  }\n\n  private sendUnsubscribeMessage(symbol: string, _timeframe: string) {\n    this.send({\n      action: 'unsubscribe',\n      symbols: [symbol]\n    });\n  }\n\n  private send(data: any) {\n    if (!this.manager) {\n      logger.error('Cannot send: WebSocket manager not initialized');\n      return;\n    }\n\n    const message = JSON.stringify(data);\n    logger.trace('Sending message', { data });\n    this.manager.send(message);\n  }\n\n  private getSubscriptionKey(symbol: string, timeframe: string): string {\n    return `${symbol}_${timeframe}`;\n  }\n\n  disconnect() {\n    logger.info('Disconnecting WebSocket');\n    this.subscriptions.clear();\n    \n    // Don't destroy the manager, just close the WebSocket connection\n    // This allows reconnection without creating a new manager instance\n    if (this.manager) {\n      const ws = (this.manager as any).getWebSocket?.();\n      if (ws && ws.readyState === WebSocket.OPEN) {\n        ws.close(1000, 'Client disconnect');\n      }\n    }\n    \n    this.isConnected = false;\n  }\n\n  getStatus() {\n    return this.manager?.getStatus() ?? 'disconnected';\n  }\n\n  getRetryCount() {\n    return this.manager?.getRetryCount() ?? 0;\n  }\n\n  isConnectedStatus() {\n    return this.isConnected;\n  }\n}\n\n// Singleton instance\nlet webSocketService: WebSocketService | null = null;\n\nexport function getWebSocketService(config?: WebSocketConfig): WebSocketService {\n  if (!webSocketService && config) {\n    webSocketService = new WebSocketService(config);\n  }\n  \n  if (!webSocketService) {\n    throw new Error('WebSocketService not initialized. Please provide config.');\n  }\n  \n  return webSocketService;\n}\n\nexport function destroyWebSocketService() {\n  if (webSocketService) {\n    webSocketService.disconnect();\n    // Don't null out the service - keep the singleton instance\n    // This prevents creating multiple instances in React StrictMode\n  }\n}","import { useEffect, useRef, useState } from 'react';\nimport { ChartData } from '../types';\nimport { WebSocketService, WebSocketConfig, getWebSocketService } from '../services/WebSocketService';\nimport { createLogger } from '../utils/logger';\n\nconst logger = createLogger('useWebSocketData');\n\nexport interface UseWebSocketDataProps {\n  symbol: string;\n  timeframe: string;\n  wsConfig: WebSocketConfig;\n  onUpdate?: (candle: ChartData) => void;\n  onRawMessage?: (message: any) => void;\n  enabled?: boolean;\n}\n\nexport interface UseWebSocketDataReturn {\n  status: 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'failed';\n  retryCount: number;\n  lastUpdate?: ChartData;\n  connect: () => Promise<void>;\n  disconnect: () => void;\n}\n\nexport function useWebSocketData({\n  symbol,\n  timeframe,\n  wsConfig,\n  onUpdate,\n  onRawMessage,\n  enabled = true\n}: UseWebSocketDataProps): UseWebSocketDataReturn {\n  const [status, setStatus] = useState<UseWebSocketDataReturn['status']>('disconnected');\n  const [retryCount, setRetryCount] = useState(0);\n  const [lastUpdate, setLastUpdate] = useState<ChartData>();\n  const serviceRef = useRef<WebSocketService>();\n  const unsubscribeRef = useRef<(() => void) | null>(null);\n\n  useEffect(() => {\n    if (!enabled) return;\n\n    const initWebSocket = async () => {\n      try {\n        setStatus('connecting');\n\n        // Use singleton pattern - get or create service\n        serviceRef.current = getWebSocketService(wsConfig);\n\n        // Only connect if not already connected\n        if (serviceRef.current.getStatus() === 'disconnected') {\n          await serviceRef.current.connect();\n        }\n\n        setStatus('connected');\n        setRetryCount(0);\n\n        // Subscribe to updates\n        unsubscribeRef.current = serviceRef.current.subscribe(\n          symbol,\n          timeframe,\n          (candle: ChartData) => {\n            logger.trace('Received candle update', { symbol, timeframe, candle });\n\n            setLastUpdate(candle);\n            onUpdate?.(candle);\n          },\n          onRawMessage\n        );\n      } catch (error) {\n        logger.error('Failed to connect WebSocket', { error });\n        setStatus('failed');\n      }\n    };\n\n    initWebSocket();\n\n    // Monitor connection status\n    const statusInterval = setInterval(() => {\n      if (serviceRef.current) {\n        const wsStatus = serviceRef.current.getStatus();\n        const wsRetryCount = serviceRef.current.getRetryCount();\n\n        setRetryCount(wsRetryCount);\n\n        if (wsStatus === 'reconnecting') {\n          setStatus('reconnecting');\n        } else if (wsStatus === 'connected') {\n          setStatus('connected');\n        } else if (wsStatus === 'error' || wsStatus === 'disconnected') {\n          setStatus('failed');\n        }\n      }\n    }, 1000);\n\n    return () => {\n      clearInterval(statusInterval);\n\n      // Unsubscribe from this specific subscription\n      unsubscribeRef.current?.();\n\n      // Disconnect the WebSocket when component unmounts\n      if (serviceRef.current) {\n        logger.info('Disconnecting WebSocket on component unmount');\n        serviceRef.current.disconnect();\n      }\n    };\n  }, [enabled, wsConfig.url, symbol, timeframe]);\n\n  const connect = async () => {\n    if (serviceRef.current && serviceRef.current.getStatus() === 'disconnected') {\n      await serviceRef.current.connect();\n    }\n  };\n\n  const disconnect = () => {\n    serviceRef.current?.disconnect();\n    setStatus('disconnected');\n  };\n\n  return {\n    status,\n    retryCount,\n    lastUpdate,\n    connect,\n    disconnect\n  };\n}","import { create } from 'zustand';\n\ninterface TradingStore {\n  selectedPair: string;\n  setSelectedPair: (pair: string) => void;\n}\n\nexport const useTradingStore = create<TradingStore>((set) => ({\n  selectedPair: 'EURUSD',\n  setSelectedPair: (pair) => set({ selectedPair: pair }),\n}));\n","import { Box } from '@mantine/core';\nimport MarketDataChart from '../components/MarketDataChart';\nimport { useTradingStore } from '../stores/useTradingStore';\n\ninterface MarketChartPageProps {\n  symbol?: string;\n  timeframe?: string;\n  enableTimeframeAutoSwitch?: boolean;\n}\n\nexport const MarketChartPage = ({\n  symbol,\n  enableTimeframeAutoSwitch = true\n}: MarketChartPageProps = {}) => {\n  const { selectedPair } = useTradingStore();\n\n  // Use props if provided, otherwise fall back to store\n  const chartSymbol = symbol || selectedPair;\n\n  return (\n    <Box style={{ height: '100%', width: '100%', background: '#0a0a0a', position: 'relative' }}>\n      <MarketDataChart\n        symbol={chartSymbol}\n        enableTimeframeAutoSwitch={enableTimeframeAutoSwitch}\n      />\n    </Box>\n  );\n};\n","// ============================================================================\n// COMPONENTS\n// ============================================================================\n\n// Main Charts\nexport { default as MarketDataChart } from './components/MarketDataChart';\n\n// UI Components\nexport { StreamStatus, MinimalStreamStatus } from './components/StreamStatus';\nexport { ErrorBoundary, ChartErrorBoundary } from './components/ErrorBoundary';\nexport { LoadingState, ChartLoadingState, ChartSkeleton, InlineLoader } from './components/LoadingState';\nexport { EmptyState, ChartEmptyState, NoDataInRangeState } from './components/EmptyState';\n\n// Canvas Primitives\nexport { CountdownTimerPrimitive } from './primitives/CountdownTimerPrimitive';\nexport { TimeframeWatermarkPrimitive } from './primitives/TimeframeWatermarkPrimitive';\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\n// Chart Hooks\nexport { useChartSetup } from './hooks/useChartSetup';\nexport type { ChartTheme, UseChartSetupOptions, UseChartSetupReturn } from './hooks/useChartSetup';\nexport { darkTheme, defaultChartOptions, defaultSeriesOptions } from './hooks/useChartSetup';\n\nexport { useChartZoom } from './hooks/useChartZoom';\nexport type { VisibleRange, UseChartZoomOptions, UseChartZoomReturn } from './hooks/useChartZoom';\n\nexport { useChartData } from './hooks/useChartData';\n\nexport { useCountdownTimer, getNextCandleTime, getCurrentCandleTime } from './hooks/useCountdownTimer';\nexport type { UseCountdownTimerOptions, UseCountdownTimerReturn } from './hooks/useCountdownTimer';\n\nexport { usePlaceholderCandle, calculateCandleTime } from './hooks/usePlaceholderCandle';\nexport type { UsePlaceholderCandleOptions, UsePlaceholderCandleReturn } from './hooks/usePlaceholderCandle';\n\n// WebSocket & Reconnection Hooks\nexport { useReconnection, useWebSocketReconnection, useChartDataStream } from './hooks/useReconnection';\nexport type {\n  UseReconnectionOptions,\n  UseReconnectionReturn,\n  UseWebSocketReconnectionOptions,\n  UseWebSocketReconnectionReturn\n} from './hooks/useReconnection';\n\nexport { useWebSocketData } from './hooks/useWebSocketData';\nexport type { UseWebSocketDataProps, UseWebSocketDataReturn } from './hooks/useWebSocketData';\n\n// ============================================================================\n// SERVICES\n// ============================================================================\n\n// Chart Data Coordinator\nimport { chartDataCoordinator } from './services/ChartDataCoordinator';\nexport { ChartDataCoordinator, chartDataCoordinator } from './services/ChartDataCoordinator';\nexport type { SymbolMetadata } from './services/ChartDataCoordinator';\n\n// Helper functions to get request stats for debugging\nexport const getChartRequestStats = () => chartDataCoordinator.getRequestStats();\nexport const resetChartRequestStats = () => chartDataCoordinator.resetRequestStats();\n\n// Reconnection Management\nexport { ReconnectionManager, WebSocketReconnectionManager } from './services/ReconnectionManager';\nexport type { ConnectionStatus, ReconnectionConfig } from './services/ReconnectionManager';\n\n// WebSocket Service\nexport { WebSocketService, getWebSocketService, destroyWebSocketService } from './services/WebSocketService';\nexport type { WebSocketConfig, StreamMessage, CandleUpdate, Subscription } from './services/WebSocketService';\n\n// HTTP Data Provider\nexport { HTTPDataProvider, getHTTPDataProvider, destroyHTTPDataProvider } from './services/HTTPDataProvider';\n\n// Tauri Wrapper (Auto-detect: Browser vs Tauri)\nexport { invoke, listen } from './services/tauriWrapper';\n\n// Mock API & Metrics\nexport { mockInvoke, mockListen } from './services/mockTauriApi';\nexport { getMetricsSummary, printMetricsSummary, resetMetrics } from './services/mockTauriApi';\n\n// ============================================================================\n// LIGHTWEIGHT-CHARTS RE-EXPORTS\n// ============================================================================\n\nexport type {\n  IChartApi,\n  ISeriesApi,\n  CandlestickData,\n  Time,\n  UTCTimestamp,\n  BusinessDay,\n  ChartOptions,\n  DeepPartial,\n  LayoutOptions,\n  TimeScaleOptions,\n  PriceScaleOptions,\n  CrosshairOptions,\n  GridOptions,\n  WatermarkOptions,\n  CandlestickSeriesOptions,\n  SeriesMarker,\n  MouseEventParams\n} from 'lightweight-charts';\n\nexport {\n  createChart,\n  CrosshairMode,\n  LineStyle,\n  PriceScaleMode,\n  isBusinessDay,\n  isUTCTimestamp\n} from 'lightweight-charts';\n\nexport type { SeriesType } from 'lightweight-charts';\n\n// ============================================================================\n// STORES\n// ============================================================================\n\nexport { useChartStore } from './stores/useChartStore';\nexport { useTradingStore } from './stores/useTradingStore';\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\n// Chart Helpers\nexport * from './utils/chartHelpers';\nexport {\n  calculateBarSpacingForTimeframeSwitch,\n  getDaysToShowForTimeframe,\n  setVisibleRangeByDays,\n  getVisibleRangeDuration,\n  isTimeVisible,\n  scrollToTime,\n  findLastRealCandle,\n  createPlaceholderCandle\n} from './utils/chartHelpers';\n\n// Logger\nexport { logger, createLogger, LogLevel } from './utils/logger';\nexport type { LoggerConfig } from './utils/logger';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\nexport * from './constants/timeframes';\nexport {\n  TIMEFRAME_SECONDS,\n  TIMEFRAME_SWITCH_THRESHOLDS,\n  ADJACENT_TIMEFRAMES,\n  DEFAULT_TIMEFRAME,\n  getTimeframePeriodSeconds\n} from './constants/timeframes';\nexport type { Timeframe } from './constants/timeframes';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport * from './types';\nexport type {\n  ChartData,\n  Tick,\n  Candle,\n  DataRequest,\n  FetchCandlesArgs,\n  StreamStatusData,\n  ViewState,\n  ChartConfig,\n  DataProvider\n} from './types';\n\n// ============================================================================\n// PAGES\n// ============================================================================\n\nexport { MarketChartPage } from './pages/MarketChartPage';\n"]}