@forgecharts/sdk 1.1.23 → 1.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/backwardCompatibility.test.d.ts +14 -0
- package/dist/__tests__/backwardCompatibility.test.d.ts.map +1 -0
- package/dist/__tests__/backwardCompatibility.test.js +159 -0
- package/dist/__tests__/backwardCompatibility.test.js.map +1 -0
- package/dist/__tests__/candleInvariant.test.d.ts +20 -0
- package/dist/__tests__/candleInvariant.test.d.ts.map +1 -0
- package/dist/__tests__/candleInvariant.test.js +415 -0
- package/dist/__tests__/candleInvariant.test.js.map +1 -0
- package/dist/__tests__/public-api-surface.d.ts +13 -0
- package/dist/__tests__/public-api-surface.d.ts.map +1 -0
- package/{src/__tests__/public-api-surface.ts → dist/__tests__/public-api-surface.js} +4 -42
- package/dist/__tests__/public-api-surface.js.map +1 -0
- package/dist/__tests__/timeframeBoundary.test.d.ts +17 -0
- package/dist/__tests__/timeframeBoundary.test.d.ts.map +1 -0
- package/dist/__tests__/timeframeBoundary.test.js +452 -0
- package/dist/__tests__/timeframeBoundary.test.js.map +1 -0
- package/dist/api/DrawingManager.d.ts +20 -0
- package/dist/api/DrawingManager.d.ts.map +1 -0
- package/dist/api/DrawingManager.js +190 -0
- package/dist/api/DrawingManager.js.map +1 -0
- package/dist/api/EventBus.d.ts +19 -0
- package/dist/api/EventBus.d.ts.map +1 -0
- package/dist/api/EventBus.js +44 -0
- package/dist/api/EventBus.js.map +1 -0
- package/dist/api/IndicatorDAG.d.ts +85 -0
- package/dist/api/IndicatorDAG.d.ts.map +1 -0
- package/dist/api/IndicatorDAG.js +316 -0
- package/dist/api/IndicatorDAG.js.map +1 -0
- package/dist/api/IndicatorRegistry.d.ts +22 -0
- package/dist/api/IndicatorRegistry.d.ts.map +1 -0
- package/dist/api/IndicatorRegistry.js +39 -0
- package/dist/api/IndicatorRegistry.js.map +1 -0
- package/dist/api/LayoutManager.d.ts +30 -0
- package/dist/api/LayoutManager.d.ts.map +1 -0
- package/dist/api/LayoutManager.js +51 -0
- package/dist/api/LayoutManager.js.map +1 -0
- package/dist/api/PaneManager.d.ts +42 -0
- package/dist/api/PaneManager.d.ts.map +1 -0
- package/dist/api/PaneManager.js +119 -0
- package/dist/api/PaneManager.js.map +1 -0
- package/dist/api/ReferenceAPI.d.ts +78 -0
- package/dist/api/ReferenceAPI.d.ts.map +1 -0
- package/dist/api/ReferenceAPI.js +153 -0
- package/dist/api/ReferenceAPI.js.map +1 -0
- package/dist/api/TChart.d.ts +345 -0
- package/dist/api/TChart.d.ts.map +1 -0
- package/dist/api/TChart.js +765 -0
- package/dist/api/TChart.js.map +1 -0
- package/{src/api/createChart.ts → dist/api/createChart.d.ts} +2 -7
- package/dist/api/createChart.d.ts.map +1 -0
- package/dist/api/createChart.js +42 -0
- package/dist/api/createChart.js.map +1 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts +4 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts.map +1 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js +22 -0
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +1 -0
- package/dist/api/drawing tools/lines menu/crossLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/crossLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/crossLine.js +16 -0
- package/dist/api/drawing tools/lines menu/crossLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.d.ts +17 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.js +59 -0
- package/dist/api/drawing tools/lines menu/disjointChannel.js.map +1 -0
- package/dist/api/drawing tools/lines menu/extendedLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/extendedLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/extendedLine.js +17 -0
- package/dist/api/drawing tools/lines menu/extendedLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.js +41 -0
- package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontal.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/horizontal.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontal.js +19 -0
- package/dist/api/drawing tools/lines menu/horizontal.js.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.js +20 -0
- package/dist/api/drawing tools/lines menu/horizontalRay.js.map +1 -0
- package/dist/api/drawing tools/lines menu/infoLine.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/infoLine.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/infoLine.js +107 -0
- package/dist/api/drawing tools/lines menu/infoLine.js.map +1 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.js +31 -0
- package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +15 -0
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.js +43 -0
- package/dist/api/drawing tools/lines menu/parallelChannel.js.map +1 -0
- package/dist/api/drawing tools/lines menu/pitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/pitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/pitchfork.js +12 -0
- package/dist/api/drawing tools/lines menu/pitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/ray.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/ray.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/ray.js +23 -0
- package/dist/api/drawing tools/lines menu/ray.js.map +1 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.js +127 -0
- package/dist/api/drawing tools/lines menu/regressionTrend.js.map +1 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js +15 -0
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +1 -0
- package/dist/api/drawing tools/lines menu/trendAngle.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/trendAngle.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/trendAngle.js +51 -0
- package/dist/api/drawing tools/lines menu/trendAngle.js.map +1 -0
- package/dist/api/drawing tools/lines menu/trendline.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/trendline.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/trendline.js +11 -0
- package/dist/api/drawing tools/lines menu/trendline.js.map +1 -0
- package/dist/api/drawing tools/lines menu/vertical.d.ts +4 -0
- package/dist/api/drawing tools/lines menu/vertical.d.ts.map +1 -0
- package/dist/api/drawing tools/lines menu/vertical.js +11 -0
- package/dist/api/drawing tools/lines menu/vertical.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/crosshair.d.ts +16 -0
- package/dist/api/drawing tools/pointers menu/crosshair.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/crosshair.ts → dist/api/drawing tools/pointers menu/crosshair.js } +6 -7
- package/dist/api/drawing tools/pointers menu/crosshair.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/cursor.d.ts +15 -0
- package/dist/api/drawing tools/pointers menu/cursor.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/cursor.ts → dist/api/drawing tools/pointers menu/cursor.js } +7 -8
- package/dist/api/drawing tools/pointers menu/cursor.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/demonstration.d.ts +30 -0
- package/dist/api/drawing tools/pointers menu/demonstration.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/demonstration.ts → dist/api/drawing tools/pointers menu/demonstration.js } +9 -14
- package/dist/api/drawing tools/pointers menu/demonstration.js.map +1 -0
- package/dist/api/drawing tools/pointers menu/dot.d.ts +23 -0
- package/dist/api/drawing tools/pointers menu/dot.d.ts.map +1 -0
- package/{src/api/drawing tools/pointers menu/dot.ts → dist/api/drawing tools/pointers menu/dot.js } +8 -11
- package/dist/api/drawing tools/pointers menu/dot.js.map +1 -0
- package/dist/api/drawing tools/shapes menu/rectangle.d.ts +4 -0
- package/dist/api/drawing tools/shapes menu/rectangle.d.ts.map +1 -0
- package/dist/api/drawing tools/shapes menu/rectangle.js +19 -0
- package/dist/api/drawing tools/shapes menu/rectangle.js.map +1 -0
- package/dist/api/drawing tools/shapes menu/text.d.ts +4 -0
- package/dist/api/drawing tools/shapes menu/text.d.ts.map +1 -0
- package/dist/api/drawing tools/shapes menu/text.js +25 -0
- package/dist/api/drawing tools/shapes menu/text.js.map +1 -0
- package/dist/api/drawingUtils.d.ts +22 -0
- package/dist/api/drawingUtils.d.ts.map +1 -0
- package/dist/api/drawingUtils.js +83 -0
- package/dist/api/drawingUtils.js.map +1 -0
- package/dist/core/CanvasLayer.d.ts +26 -0
- package/dist/core/CanvasLayer.d.ts.map +1 -0
- package/dist/core/CanvasLayer.js +56 -0
- package/dist/core/CanvasLayer.js.map +1 -0
- package/dist/core/Chart.d.ts +164 -0
- package/dist/core/Chart.d.ts.map +1 -0
- package/dist/core/Chart.js +839 -0
- package/dist/core/Chart.js.map +1 -0
- package/dist/core/CoordTransform.d.ts +168 -0
- package/dist/core/CoordTransform.d.ts.map +1 -0
- package/dist/core/CoordTransform.js +224 -0
- package/dist/core/CoordTransform.js.map +1 -0
- package/dist/core/Crosshair.d.ts +30 -0
- package/dist/core/Crosshair.d.ts.map +1 -0
- package/dist/core/Crosshair.js +186 -0
- package/dist/core/Crosshair.js.map +1 -0
- package/dist/core/IndicatorEngine.d.ts +51 -0
- package/dist/core/IndicatorEngine.d.ts.map +1 -0
- package/dist/core/IndicatorEngine.js +181 -0
- package/dist/core/IndicatorEngine.js.map +1 -0
- package/dist/core/InteractionManager.d.ts +197 -0
- package/dist/core/InteractionManager.d.ts.map +1 -0
- package/dist/core/InteractionManager.js +698 -0
- package/dist/core/InteractionManager.js.map +1 -0
- package/dist/core/PriceScale.d.ts +27 -0
- package/dist/core/PriceScale.d.ts.map +1 -0
- package/dist/core/PriceScale.js +113 -0
- package/dist/core/PriceScale.js.map +1 -0
- package/dist/core/Series.d.ts +40 -0
- package/dist/core/Series.d.ts.map +1 -0
- package/dist/core/Series.js +114 -0
- package/dist/core/Series.js.map +1 -0
- package/dist/core/TimeScale.d.ts +43 -0
- package/dist/core/TimeScale.d.ts.map +1 -0
- package/dist/core/TimeScale.js +150 -0
- package/dist/core/TimeScale.js.map +1 -0
- package/dist/datafeed/DatafeedConnector.d.ts +89 -0
- package/dist/datafeed/DatafeedConnector.d.ts.map +1 -0
- package/dist/datafeed/DatafeedConnector.js +268 -0
- package/dist/datafeed/DatafeedConnector.js.map +1 -0
- package/dist/engine/CandleEngine.d.ts +207 -0
- package/dist/engine/CandleEngine.d.ts.map +1 -0
- package/dist/engine/CandleEngine.js +318 -0
- package/dist/engine/CandleEngine.js.map +1 -0
- package/dist/engine/__tests__/CandleEngine.test.d.ts +2 -0
- package/dist/engine/__tests__/CandleEngine.test.d.ts.map +1 -0
- package/dist/engine/__tests__/CandleEngine.test.js +300 -0
- package/dist/engine/__tests__/CandleEngine.test.js.map +1 -0
- package/dist/engine/candleInvariants.d.ts +66 -0
- package/dist/engine/candleInvariants.d.ts.map +1 -0
- package/dist/engine/candleInvariants.js +134 -0
- package/dist/engine/candleInvariants.js.map +1 -0
- package/{src/engine/mergeUtils.ts → dist/engine/mergeUtils.d.ts} +15 -52
- package/dist/engine/mergeUtils.d.ts.map +1 -0
- package/dist/engine/mergeUtils.js +64 -0
- package/dist/engine/mergeUtils.js.map +1 -0
- package/dist/engine/timeframeUtils.d.ts +80 -0
- package/dist/engine/timeframeUtils.d.ts.map +1 -0
- package/{src/engine/timeframeUtils.ts → dist/engine/timeframeUtils.js} +30 -48
- package/dist/engine/timeframeUtils.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +29 -0
- package/dist/internal.d.ts.map +1 -0
- package/{src/internal.ts → dist/internal.js} +2 -11
- package/dist/internal.js.map +1 -0
- package/dist/licensing/ChartRuntimeResolver.d.ts +233 -0
- package/dist/licensing/ChartRuntimeResolver.d.ts.map +1 -0
- package/dist/licensing/ChartRuntimeResolver.js +310 -0
- package/dist/licensing/ChartRuntimeResolver.js.map +1 -0
- package/dist/licensing/LicenseManager.d.ts +55 -0
- package/dist/licensing/LicenseManager.d.ts.map +1 -0
- package/dist/licensing/LicenseManager.js +114 -0
- package/dist/licensing/LicenseManager.js.map +1 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts +13 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts.map +1 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +177 -0
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +1 -0
- package/dist/licensing/__tests__/LicenseManager.test.d.ts +12 -0
- package/dist/licensing/__tests__/LicenseManager.test.d.ts.map +1 -0
- package/dist/licensing/__tests__/LicenseManager.test.js +153 -0
- package/dist/licensing/__tests__/LicenseManager.test.js.map +1 -0
- package/dist/licensing/licenseTypes.d.ts +18 -0
- package/dist/licensing/licenseTypes.d.ts.map +1 -0
- package/dist/licensing/licenseTypes.js +2 -0
- package/dist/licensing/licenseTypes.js.map +1 -0
- package/dist/pine/PineCompiler.d.ts +35 -0
- package/dist/pine/PineCompiler.d.ts.map +1 -0
- package/dist/pine/PineCompiler.js +44 -0
- package/dist/pine/PineCompiler.js.map +1 -0
- package/dist/pine/diagnostics.d.ts +20 -0
- package/dist/pine/diagnostics.d.ts.map +1 -0
- package/dist/pine/diagnostics.js +11 -0
- package/dist/pine/diagnostics.js.map +1 -0
- package/{src/pine/index.ts → dist/pine/index.d.ts} +4 -3
- package/dist/pine/index.d.ts.map +1 -0
- package/dist/pine/index.js +5 -0
- package/dist/pine/index.js.map +1 -0
- package/dist/pine/pine-ast.d.ts +142 -0
- package/dist/pine/pine-ast.d.ts.map +1 -0
- package/dist/pine/pine-ast.js +19 -0
- package/dist/pine/pine-ast.js.map +1 -0
- package/dist/pine/pine-lexer.d.ts +41 -0
- package/dist/pine/pine-lexer.d.ts.map +1 -0
- package/dist/pine/pine-lexer.js +249 -0
- package/dist/pine/pine-lexer.js.map +1 -0
- package/dist/pine/pine-parser.d.ts +51 -0
- package/dist/pine/pine-parser.d.ts.map +1 -0
- package/dist/pine/pine-parser.js +416 -0
- package/dist/pine/pine-parser.js.map +1 -0
- package/dist/pine/pine-transpiler.d.ts +33 -0
- package/dist/pine/pine-transpiler.d.ts.map +1 -0
- package/dist/pine/pine-transpiler.js +260 -0
- package/dist/pine/pine-transpiler.js.map +1 -0
- package/dist/pixi/LayerName.d.ts +18 -0
- package/dist/pixi/LayerName.d.ts.map +1 -0
- package/dist/pixi/LayerName.js +35 -0
- package/dist/pixi/LayerName.js.map +1 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts +23 -0
- package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiCandlestickRenderer.js +107 -0
- package/dist/pixi/PixiCandlestickRenderer.js.map +1 -0
- package/dist/pixi/PixiChart.d.ts +72 -0
- package/dist/pixi/PixiChart.d.ts.map +1 -0
- package/dist/pixi/PixiChart.js +367 -0
- package/dist/pixi/PixiChart.js.map +1 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts +29 -0
- package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiCrosshairRenderer.js +110 -0
- package/dist/pixi/PixiCrosshairRenderer.js.map +1 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts +17 -0
- package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiDrawingRenderer.js +111 -0
- package/dist/pixi/PixiDrawingRenderer.js.map +1 -0
- package/dist/pixi/PixiGridRenderer.d.ts +22 -0
- package/dist/pixi/PixiGridRenderer.d.ts.map +1 -0
- package/dist/pixi/PixiGridRenderer.js +114 -0
- package/dist/pixi/PixiGridRenderer.js.map +1 -0
- package/dist/pixi/PixiLayerManager.d.ts +56 -0
- package/dist/pixi/PixiLayerManager.d.ts.map +1 -0
- package/dist/pixi/PixiLayerManager.js +92 -0
- package/dist/pixi/PixiLayerManager.js.map +1 -0
- package/dist/react/canvas/ChartCanvas.d.ts +85 -0
- package/dist/react/canvas/ChartCanvas.d.ts.map +1 -0
- package/dist/react/canvas/ChartCanvas.js +604 -0
- package/dist/react/canvas/ChartCanvas.js.map +1 -0
- package/dist/react/canvas/ChartContextMenu.d.ts +18 -0
- package/dist/react/canvas/ChartContextMenu.d.ts.map +1 -0
- package/dist/react/canvas/ChartContextMenu.js +5 -0
- package/dist/react/canvas/ChartContextMenu.js.map +1 -0
- package/dist/react/canvas/ChartSettingsDialog.d.ts +25 -0
- package/dist/react/canvas/ChartSettingsDialog.d.ts.map +1 -0
- package/dist/react/canvas/ChartSettingsDialog.js +28 -0
- package/dist/react/canvas/ChartSettingsDialog.js.map +1 -0
- package/dist/react/canvas/IndicatorLabel.d.ts +21 -0
- package/dist/react/canvas/IndicatorLabel.d.ts.map +1 -0
- package/dist/react/canvas/IndicatorLabel.js +196 -0
- package/dist/react/canvas/IndicatorLabel.js.map +1 -0
- package/dist/react/canvas/IndicatorPane.d.ts +32 -0
- package/dist/react/canvas/IndicatorPane.d.ts.map +1 -0
- package/dist/react/canvas/IndicatorPane.js +395 -0
- package/dist/react/canvas/IndicatorPane.js.map +1 -0
- package/dist/react/canvas/PointerOverlay.d.ts +23 -0
- package/dist/react/canvas/PointerOverlay.d.ts.map +1 -0
- package/dist/react/canvas/PointerOverlay.js +61 -0
- package/dist/react/canvas/PointerOverlay.js.map +1 -0
- package/dist/react/canvas/toolbars/LeftToolbar.d.ts +19 -0
- package/dist/react/canvas/toolbars/LeftToolbar.d.ts.map +1 -0
- package/dist/react/canvas/toolbars/LeftToolbar.js +407 -0
- package/dist/react/canvas/toolbars/LeftToolbar.js.map +1 -0
- package/dist/react/hooks/useChartCapabilities.d.ts +21 -0
- package/dist/react/hooks/useChartCapabilities.d.ts.map +1 -0
- package/dist/react/hooks/useChartCapabilities.js +66 -0
- package/dist/react/hooks/useChartCapabilities.js.map +1 -0
- package/dist/react/index.d.ts +30 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +28 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/internal.d.ts +38 -0
- package/dist/react/internal.d.ts.map +1 -0
- package/dist/react/internal.js +44 -0
- package/dist/react/internal.js.map +1 -0
- package/dist/react/shell/ManagedAppShell.d.ts +91 -0
- package/dist/react/shell/ManagedAppShell.d.ts.map +1 -0
- package/dist/react/shell/ManagedAppShell.js +440 -0
- package/dist/react/shell/ManagedAppShell.js.map +1 -0
- package/dist/react/trading/TradingBridge.d.ts +86 -0
- package/dist/react/trading/TradingBridge.d.ts.map +1 -0
- package/dist/react/trading/TradingBridge.js +73 -0
- package/dist/react/trading/TradingBridge.js.map +1 -0
- package/dist/react/workspace/ChartWorkspace.d.ts +73 -0
- package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -0
- package/dist/react/workspace/ChartWorkspace.js +42 -0
- package/dist/react/workspace/ChartWorkspace.js.map +1 -0
- package/dist/react/workspace/FloatingPanel.d.ts +18 -0
- package/dist/react/workspace/FloatingPanel.d.ts.map +1 -0
- package/dist/react/workspace/FloatingPanel.js +82 -0
- package/dist/react/workspace/FloatingPanel.js.map +1 -0
- package/dist/react/workspace/IndicatorsDialog.d.ts +8 -0
- package/dist/react/workspace/IndicatorsDialog.d.ts.map +1 -0
- package/dist/react/workspace/IndicatorsDialog.js +121 -0
- package/dist/react/workspace/IndicatorsDialog.js.map +1 -0
- package/dist/react/workspace/LayoutMenu.d.ts +33 -0
- package/dist/react/workspace/LayoutMenu.d.ts.map +1 -0
- package/dist/react/workspace/LayoutMenu.js +113 -0
- package/dist/react/workspace/LayoutMenu.js.map +1 -0
- package/dist/react/workspace/SymbolSearchDialog.d.ts +10 -0
- package/dist/react/workspace/SymbolSearchDialog.d.ts.map +1 -0
- package/dist/react/workspace/SymbolSearchDialog.js +245 -0
- package/dist/react/workspace/SymbolSearchDialog.js.map +1 -0
- package/dist/react/workspace/TabBar.d.ts +17 -0
- package/dist/react/workspace/TabBar.d.ts.map +1 -0
- package/dist/react/workspace/TabBar.js +29 -0
- package/dist/react/workspace/TabBar.js.map +1 -0
- package/dist/react/workspace/toolbars/BottomToolbar.d.ts +19 -0
- package/dist/react/workspace/toolbars/BottomToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/BottomToolbar.js +236 -0
- package/dist/react/workspace/toolbars/BottomToolbar.js.map +1 -0
- package/dist/react/workspace/toolbars/RightToolbar.d.ts +8 -0
- package/dist/react/workspace/toolbars/RightToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/RightToolbar.js +18 -0
- package/dist/react/workspace/toolbars/RightToolbar.js.map +1 -0
- package/dist/react/workspace/toolbars/TopToolbar.d.ts +41 -0
- package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -0
- package/dist/react/workspace/toolbars/TopToolbar.js +82 -0
- package/dist/react/workspace/toolbars/TopToolbar.js.map +1 -0
- package/dist/renderers/CandlestickRenderer.d.ts +13 -0
- package/dist/renderers/CandlestickRenderer.d.ts.map +1 -0
- package/dist/renderers/CandlestickRenderer.js +98 -0
- package/dist/renderers/CandlestickRenderer.js.map +1 -0
- package/dist/renderers/HistogramRenderer.d.ts +11 -0
- package/dist/renderers/HistogramRenderer.d.ts.map +1 -0
- package/dist/renderers/HistogramRenderer.js +50 -0
- package/dist/renderers/HistogramRenderer.js.map +1 -0
- package/dist/renderers/LineRenderer.d.ts +12 -0
- package/dist/renderers/LineRenderer.d.ts.map +1 -0
- package/dist/renderers/LineRenderer.js +64 -0
- package/dist/renderers/LineRenderer.js.map +1 -0
- package/dist/theme/colors.d.ts +4 -0
- package/dist/theme/colors.d.ts.map +1 -0
- package/dist/theme/colors.js +19 -0
- package/dist/theme/colors.js.map +1 -0
- package/dist/tools/barDivergenceCheck.d.ts +120 -0
- package/dist/tools/barDivergenceCheck.d.ts.map +1 -0
- package/dist/tools/barDivergenceCheck.js +200 -0
- package/dist/tools/barDivergenceCheck.js.map +1 -0
- package/dist/trading/TradingOverlayStore.d.ts +86 -0
- package/dist/trading/TradingOverlayStore.d.ts.map +1 -0
- package/dist/trading/TradingOverlayStore.js +139 -0
- package/dist/trading/TradingOverlayStore.js.map +1 -0
- package/dist/trading/UnmanagedIngestion.d.ts +91 -0
- package/dist/trading/UnmanagedIngestion.d.ts.map +1 -0
- package/dist/trading/UnmanagedIngestion.js +114 -0
- package/dist/trading/UnmanagedIngestion.js.map +1 -0
- package/dist/trading/__tests__/ManagedTradingController.test.d.ts +18 -0
- package/dist/trading/__tests__/ManagedTradingController.test.d.ts.map +1 -0
- package/dist/trading/__tests__/ManagedTradingController.test.js +271 -0
- package/dist/trading/__tests__/ManagedTradingController.test.js.map +1 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.d.ts +16 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.d.ts.map +1 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.js +267 -0
- package/dist/trading/__tests__/TradingOverlayStore.test.js.map +1 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts +16 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts.map +1 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.js +170 -0
- package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +1 -0
- package/dist/trading/managed/ManagedTradingController.d.ts +110 -0
- package/dist/trading/managed/ManagedTradingController.d.ts.map +1 -0
- package/dist/trading/managed/ManagedTradingController.js +247 -0
- package/dist/trading/managed/ManagedTradingController.js.map +1 -0
- package/dist/trading/managed/managedCapabilities.d.ts +45 -0
- package/dist/trading/managed/managedCapabilities.d.ts.map +1 -0
- package/dist/trading/managed/managedCapabilities.js +79 -0
- package/dist/trading/managed/managedCapabilities.js.map +1 -0
- package/dist/trading/managed/managedTypes.d.ts +122 -0
- package/dist/trading/managed/managedTypes.d.ts.map +1 -0
- package/dist/trading/managed/managedTypes.js +13 -0
- package/dist/trading/managed/managedTypes.js.map +1 -0
- package/dist/trading/tradingTypes.d.ts +89 -0
- package/dist/trading/tradingTypes.d.ts.map +1 -0
- package/dist/trading/tradingTypes.js +8 -0
- package/dist/trading/tradingTypes.js.map +1 -0
- package/dist/tscript/TScriptIndicator.d.ts +41 -0
- package/dist/tscript/TScriptIndicator.d.ts.map +1 -0
- package/dist/tscript/TScriptIndicator.js +47 -0
- package/dist/tscript/TScriptIndicator.js.map +1 -0
- package/dist/tscript/ast.d.ts +89 -0
- package/dist/tscript/ast.d.ts.map +1 -0
- package/dist/tscript/ast.js +22 -0
- package/dist/tscript/ast.js.map +1 -0
- package/dist/tscript/lexer.d.ts +36 -0
- package/dist/tscript/lexer.d.ts.map +1 -0
- package/dist/tscript/lexer.js +187 -0
- package/dist/tscript/lexer.js.map +1 -0
- package/dist/tscript/parser.d.ts +50 -0
- package/dist/tscript/parser.d.ts.map +1 -0
- package/dist/tscript/parser.js +318 -0
- package/dist/tscript/parser.js.map +1 -0
- package/dist/tscript/runtime.d.ts +123 -0
- package/dist/tscript/runtime.d.ts.map +1 -0
- package/dist/tscript/runtime.js +475 -0
- package/dist/tscript/runtime.js.map +1 -0
- package/dist/tscript/series.d.ts +49 -0
- package/dist/tscript/series.d.ts.map +1 -0
- package/dist/tscript/series.js +79 -0
- package/dist/tscript/series.js.map +1 -0
- package/dist/types/IChart.d.ts +48 -0
- package/dist/types/IChart.d.ts.map +1 -0
- package/dist/types/IChart.js +2 -0
- package/dist/types/IChart.js.map +1 -0
- package/{src/types/IRenderer.ts → dist/types/IRenderer.d.ts} +2 -8
- package/dist/types/IRenderer.d.ts.map +1 -0
- package/dist/types/IRenderer.js +2 -0
- package/dist/types/IRenderer.js.map +1 -0
- package/dist/types/ISeries.d.ts +26 -0
- package/dist/types/ISeries.d.ts.map +1 -0
- package/dist/types/ISeries.js +2 -0
- package/dist/types/ISeries.js.map +1 -0
- package/package.json +32 -4
- package/src/__tests__/backwardCompatibility.test.ts +0 -191
- package/src/__tests__/candleInvariant.test.ts +0 -500
- package/src/__tests__/timeframeBoundary.test.ts +0 -583
- package/src/api/DrawingManager.ts +0 -188
- package/src/api/EventBus.ts +0 -53
- package/src/api/IndicatorDAG.ts +0 -389
- package/src/api/IndicatorRegistry.ts +0 -47
- package/src/api/LayoutManager.ts +0 -72
- package/src/api/PaneManager.ts +0 -129
- package/src/api/ReferenceAPI.ts +0 -195
- package/src/api/TChart.ts +0 -881
- package/src/api/drawing tools/fib gann menu/fibRetracement.ts +0 -27
- package/src/api/drawing tools/lines menu/crossLine.ts +0 -21
- package/src/api/drawing tools/lines menu/disjointChannel.ts +0 -74
- package/src/api/drawing tools/lines menu/extendedLine.ts +0 -22
- package/src/api/drawing tools/lines menu/flatTopBottom.ts +0 -45
- package/src/api/drawing tools/lines menu/horizontal.ts +0 -24
- package/src/api/drawing tools/lines menu/horizontalRay.ts +0 -25
- package/src/api/drawing tools/lines menu/infoLine.ts +0 -127
- package/src/api/drawing tools/lines menu/insidePitchfork.ts +0 -21
- package/src/api/drawing tools/lines menu/modifiedSchiffPitchfork.ts +0 -18
- package/src/api/drawing tools/lines menu/parallelChannel.ts +0 -47
- package/src/api/drawing tools/lines menu/pitchfork.ts +0 -15
- package/src/api/drawing tools/lines menu/ray.ts +0 -28
- package/src/api/drawing tools/lines menu/regressionTrend.ts +0 -157
- package/src/api/drawing tools/lines menu/schiffPitchfork.ts +0 -18
- package/src/api/drawing tools/lines menu/trendAngle.ts +0 -64
- package/src/api/drawing tools/lines menu/trendline.ts +0 -16
- package/src/api/drawing tools/lines menu/vertical.ts +0 -16
- package/src/api/drawing tools/shapes menu/rectangle.ts +0 -24
- package/src/api/drawing tools/shapes menu/text.ts +0 -30
- package/src/api/drawingUtils.ts +0 -82
- package/src/core/CanvasLayer.ts +0 -77
- package/src/core/Chart.ts +0 -917
- package/src/core/CoordTransform.ts +0 -282
- package/src/core/Crosshair.ts +0 -207
- package/src/core/IndicatorEngine.ts +0 -216
- package/src/core/InteractionManager.ts +0 -899
- package/src/core/PriceScale.ts +0 -133
- package/src/core/Series.ts +0 -132
- package/src/core/TimeScale.ts +0 -175
- package/src/datafeed/DatafeedConnector.ts +0 -300
- package/src/engine/CandleEngine.ts +0 -458
- package/src/engine/__tests__/CandleEngine.test.ts +0 -402
- package/src/engine/candleInvariants.ts +0 -172
- package/src/index.ts +0 -190
- package/src/licensing/ChartRuntimeResolver.ts +0 -380
- package/src/licensing/LicenseManager.ts +0 -131
- package/src/licensing/__tests__/ChartRuntimeResolver.test.ts +0 -207
- package/src/licensing/__tests__/LicenseManager.test.ts +0 -180
- package/src/licensing/licenseTypes.ts +0 -19
- package/src/pine/PineCompiler.ts +0 -68
- package/src/pine/diagnostics.ts +0 -30
- package/src/pine/pine-ast.ts +0 -163
- package/src/pine/pine-lexer.ts +0 -265
- package/src/pine/pine-parser.ts +0 -439
- package/src/pine/pine-transpiler.ts +0 -301
- package/src/pixi/LayerName.ts +0 -35
- package/src/pixi/PixiCandlestickRenderer.ts +0 -125
- package/src/pixi/PixiChart.ts +0 -425
- package/src/pixi/PixiCrosshairRenderer.ts +0 -134
- package/src/pixi/PixiDrawingRenderer.ts +0 -121
- package/src/pixi/PixiGridRenderer.ts +0 -136
- package/src/pixi/PixiLayerManager.ts +0 -102
- package/src/renderers/CandlestickRenderer.ts +0 -130
- package/src/renderers/HistogramRenderer.ts +0 -63
- package/src/renderers/LineRenderer.ts +0 -77
- package/src/theme/colors.ts +0 -21
- package/src/tools/barDivergenceCheck.ts +0 -305
- package/src/trading/TradingOverlayStore.ts +0 -161
- package/src/trading/UnmanagedIngestion.ts +0 -156
- package/src/trading/__tests__/ManagedTradingController.test.ts +0 -338
- package/src/trading/__tests__/TradingOverlayStore.test.ts +0 -323
- package/src/trading/__tests__/UnmanagedIngestion.test.ts +0 -205
- package/src/trading/managed/ManagedTradingController.ts +0 -292
- package/src/trading/managed/managedCapabilities.ts +0 -98
- package/src/trading/managed/managedTypes.ts +0 -151
- package/src/trading/tradingTypes.ts +0 -135
- package/src/tscript/TScriptIndicator.ts +0 -54
- package/src/tscript/ast.ts +0 -105
- package/src/tscript/lexer.ts +0 -190
- package/src/tscript/parser.ts +0 -334
- package/src/tscript/runtime.ts +0 -525
- package/src/tscript/series.ts +0 -84
- package/src/types/IChart.ts +0 -56
- package/src/types/ISeries.ts +0 -30
- package/tsconfig.json +0 -22
- package/tsup.config.ts +0 -15
- package/vitest.config.ts +0 -25
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ManagedAppShell — stateful chart application shell.
|
|
4
|
+
*
|
|
5
|
+
* Owns all workspace state (tabs, symbol, timeframe, layout persistence, etc.)
|
|
6
|
+
* and wires injected API clients to ChartWorkspace. App-specific drawers (script,
|
|
7
|
+
* watchlist, trade) are passed as render-prop factories so this shell never
|
|
8
|
+
* imports from the app layer.
|
|
9
|
+
*/
|
|
10
|
+
import { useState, useEffect, useRef, useCallback, forwardRef, useImperativeHandle, } from 'react';
|
|
11
|
+
import { ChartCanvas } from '../canvas/ChartCanvas';
|
|
12
|
+
import { ChartWorkspace } from '../workspace/ChartWorkspace';
|
|
13
|
+
import { DEFAULT_FAVORITES } from '../workspace/toolbars/TopToolbar';
|
|
14
|
+
import { useChartCapabilities } from '../hooks/useChartCapabilities';
|
|
15
|
+
import { LicenseManager } from '../../';
|
|
16
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
17
|
+
function uid() { return Math.random().toString(36).slice(2, 10); }
|
|
18
|
+
const DEFAULT_INDICATORS = [];
|
|
19
|
+
// ─── License loaders ──────────────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Fetches the license payload from the API and loads it into LicenseManager.
|
|
22
|
+
*
|
|
23
|
+
* @param apiUrl Optional base URL (defaults to current origin).
|
|
24
|
+
* @param getAuthToken Optional async callback to obtain a Bearer token.
|
|
25
|
+
*/
|
|
26
|
+
async function loadLicenseFromApi(apiUrl, getAuthToken) {
|
|
27
|
+
try {
|
|
28
|
+
const url = `${apiUrl ?? ''}/api/license`;
|
|
29
|
+
const headers = {};
|
|
30
|
+
if (getAuthToken) {
|
|
31
|
+
try {
|
|
32
|
+
const tok = await getAuthToken();
|
|
33
|
+
if (tok)
|
|
34
|
+
headers['Authorization'] = `Bearer ${tok}`;
|
|
35
|
+
}
|
|
36
|
+
catch { /* token fetch failed — continue unauthenticated */ }
|
|
37
|
+
}
|
|
38
|
+
const r = await fetch(url, { headers });
|
|
39
|
+
const data = r.ok
|
|
40
|
+
? await r.json()
|
|
41
|
+
: { licensePayload: null };
|
|
42
|
+
if (data.licensePayload && typeof data.licensePayload === 'object') {
|
|
43
|
+
LicenseManager.getInstance().loadLicense(data.licensePayload);
|
|
44
|
+
}
|
|
45
|
+
// If the endpoint returns no payload, leave LicenseManager in its current
|
|
46
|
+
// state (unmanaged mode) rather than clearing a previously loaded license.
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Network failure — leave LicenseManager in its current state.
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function makeTab(n) {
|
|
53
|
+
return { id: uid(), label: `Chart ${n}`, symbol: 'BINANCE:BTCUSDT', timeframe: '1h', remountCount: 0 };
|
|
54
|
+
}
|
|
55
|
+
const DEFAULT_TAB = makeTab(1);
|
|
56
|
+
const DEFAULT_WORKSPACE = {
|
|
57
|
+
tabs: [{ id: DEFAULT_TAB.id, label: DEFAULT_TAB.label, symbol: DEFAULT_TAB.symbol, timeframe: DEFAULT_TAB.timeframe }],
|
|
58
|
+
activeTabId: DEFAULT_TAB.id,
|
|
59
|
+
autoSave: false,
|
|
60
|
+
timezone: 'UTC',
|
|
61
|
+
customTimeframes: [],
|
|
62
|
+
favoriteTfs: DEFAULT_FAVORITES,
|
|
63
|
+
session: 'regular',
|
|
64
|
+
theme: 'dark',
|
|
65
|
+
};
|
|
66
|
+
function workspaceFromPrefs(raw) {
|
|
67
|
+
if (!raw || typeof raw !== 'object')
|
|
68
|
+
return DEFAULT_WORKSPACE;
|
|
69
|
+
const p = raw;
|
|
70
|
+
const tabs = Array.isArray(p['tabs']) && p['tabs'].length > 0
|
|
71
|
+
? p['tabs']
|
|
72
|
+
: DEFAULT_WORKSPACE.tabs;
|
|
73
|
+
const activeTabId = typeof p['activeTabId'] === 'string' && tabs.some((t) => t.id === p['activeTabId'])
|
|
74
|
+
? p['activeTabId']
|
|
75
|
+
: tabs[0].id;
|
|
76
|
+
return {
|
|
77
|
+
tabs,
|
|
78
|
+
activeTabId,
|
|
79
|
+
autoSave: typeof p['autoSave'] === 'boolean' ? p['autoSave'] : false,
|
|
80
|
+
timezone: typeof p['timezone'] === 'string' ? p['timezone'] : 'UTC',
|
|
81
|
+
customTimeframes: Array.isArray(p['customTimeframes']) ? p['customTimeframes'] : [],
|
|
82
|
+
favoriteTfs: Array.isArray(p['favoriteTfs']) && p['favoriteTfs'].length > 0
|
|
83
|
+
? p['favoriteTfs']
|
|
84
|
+
: DEFAULT_FAVORITES,
|
|
85
|
+
session: p['session'] === 'extended' ? 'extended' : 'regular',
|
|
86
|
+
theme: p['theme'] === 'light' ? 'light' : 'dark',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// ─── ManagedAppShell ──────────────────────────────────────────────────────────
|
|
90
|
+
export const ManagedAppShell = forwardRef(function ManagedAppShell({ datafeed, layouts, preferences, symbolResolver, getExchangeLogoUrl, config, getAuthToken, apiUrl, tradingBridge, renderScriptDrawer, renderWatchlistDrawer, renderTradeDrawer }, ref) {
|
|
91
|
+
const containerRef = useRef(null);
|
|
92
|
+
const [theme, setTheme] = useState('dark');
|
|
93
|
+
const [wsLoaded, setWsLoaded] = useState(false);
|
|
94
|
+
const [timezone, setTimezone] = useState(DEFAULT_WORKSPACE.timezone);
|
|
95
|
+
const [autoSave, setAutoSave] = useState(DEFAULT_WORKSPACE.autoSave);
|
|
96
|
+
const [tabs, setTabs] = useState(() => DEFAULT_WORKSPACE.tabs.map((t) => ({ ...t, remountCount: 0 })));
|
|
97
|
+
const [activeTabId, setActiveTabId] = useState(DEFAULT_WORKSPACE.activeTabId);
|
|
98
|
+
const [customTimeframes, setCustomTimeframes] = useState(DEFAULT_WORKSPACE.customTimeframes);
|
|
99
|
+
const [favoriteTfs, setFavoriteTfs] = useState(DEFAULT_WORKSPACE.favoriteTfs);
|
|
100
|
+
const [session, setSession] = useState(DEFAULT_WORKSPACE.session);
|
|
101
|
+
const [scriptDrawerOpen, setScriptDrawerOpen] = useState(false);
|
|
102
|
+
const [watchlistOpen, setWatchlistOpen] = useState(false);
|
|
103
|
+
const [tradeDrawerOpen, setTradeDrawerOpen] = useState(false);
|
|
104
|
+
const [chartDirty, setChartDirty] = useState(0);
|
|
105
|
+
const [isFullscreen, setIsFullscreen] = useState(false);
|
|
106
|
+
const capabilities = useChartCapabilities(config);
|
|
107
|
+
// ── Init warnings (dev only) ───────────────────────────────────────────────
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (process.env.NODE_ENV === 'production')
|
|
110
|
+
return;
|
|
111
|
+
if ((capabilities.orderEntry || capabilities.draggableOrders || capabilities.renderManagedTradingControls) &&
|
|
112
|
+
!renderTradeDrawer) {
|
|
113
|
+
console.warn('[ManagedAppShell] Trading capabilities are active ' +
|
|
114
|
+
'(orderEntry=%s, draggableOrders=%s, managedTrading=%s) but ' +
|
|
115
|
+
'renderTradeDrawer was not provided. Trading UI will be suppressed.', capabilities.orderEntry, capabilities.draggableOrders, capabilities.managedTrading);
|
|
116
|
+
}
|
|
117
|
+
// Warn once on mount and whenever trading caps or the slot presence changes.
|
|
118
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
119
|
+
}, [capabilities.orderEntry, capabilities.draggableOrders, capabilities.managedTrading]);
|
|
120
|
+
const [isLicensed, setIsLicensed] = useState(() => LicenseManager.getInstance().getLicense() !== null);
|
|
121
|
+
useEffect(() => LicenseManager.getInstance().subscribe(() => {
|
|
122
|
+
setIsLicensed(LicenseManager.getInstance().getLicense() !== null);
|
|
123
|
+
}), []);
|
|
124
|
+
// Per-tab chart instance registry — all tabs remain mounted simultaneously
|
|
125
|
+
const chartInstancesRef = useRef(new Map());
|
|
126
|
+
const chartHandleRef = useRef(null);
|
|
127
|
+
useImperativeHandle(ref, () => ({
|
|
128
|
+
getActiveChartHandle: () => chartHandleRef.current,
|
|
129
|
+
}));
|
|
130
|
+
useEffect(() => { document.documentElement.dataset.theme = theme; }, [theme]);
|
|
131
|
+
// ── Load workspace from DB on startup ──────────────────────────────────────
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
preferences.get().then((data) => {
|
|
134
|
+
const ws = workspaceFromPrefs(data);
|
|
135
|
+
setTabs(ws.tabs.map((t) => ({ ...t, remountCount: 0 })));
|
|
136
|
+
setActiveTabId(ws.activeTabId);
|
|
137
|
+
setAutoSave(ws.autoSave);
|
|
138
|
+
setTimezone(ws.timezone);
|
|
139
|
+
setCustomTimeframes(ws.customTimeframes);
|
|
140
|
+
setFavoriteTfs(ws.favoriteTfs);
|
|
141
|
+
setSession(ws.session);
|
|
142
|
+
setTheme(ws.theme);
|
|
143
|
+
if (data['licensePayload'] && typeof data['licensePayload'] === 'object') {
|
|
144
|
+
LicenseManager.getInstance().loadLicense(data['licensePayload']);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
void loadLicenseFromApi(apiUrl, getAuthToken);
|
|
148
|
+
}
|
|
149
|
+
}).catch(() => {
|
|
150
|
+
void loadLicenseFromApi(apiUrl, getAuthToken);
|
|
151
|
+
}).finally(() => {
|
|
152
|
+
setWsLoaded(true);
|
|
153
|
+
});
|
|
154
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
155
|
+
}, []); // run once on mount
|
|
156
|
+
// ── Debounced workspace save to DB ─────────────────────────────────────────
|
|
157
|
+
const saveTimerRef = useRef(null);
|
|
158
|
+
// Stable refs so the debounced callback always sees latest values
|
|
159
|
+
const activeTabIdRef = useRef(activeTabId);
|
|
160
|
+
const autoSaveRef = useRef(autoSave);
|
|
161
|
+
const timezoneRef = useRef(timezone);
|
|
162
|
+
const customTimeframesRef = useRef(customTimeframes);
|
|
163
|
+
const favoriteTfsRef = useRef(favoriteTfs);
|
|
164
|
+
const sessionRef = useRef(session);
|
|
165
|
+
const themeRef = useRef(theme);
|
|
166
|
+
activeTabIdRef.current = activeTabId;
|
|
167
|
+
autoSaveRef.current = autoSave;
|
|
168
|
+
timezoneRef.current = timezone;
|
|
169
|
+
customTimeframesRef.current = customTimeframes;
|
|
170
|
+
favoriteTfsRef.current = favoriteTfs;
|
|
171
|
+
sessionRef.current = session;
|
|
172
|
+
themeRef.current = theme;
|
|
173
|
+
const saveWorkspace = useCallback(() => {
|
|
174
|
+
if (!wsLoaded)
|
|
175
|
+
return;
|
|
176
|
+
if (saveTimerRef.current)
|
|
177
|
+
clearTimeout(saveTimerRef.current);
|
|
178
|
+
saveTimerRef.current = setTimeout(() => {
|
|
179
|
+
const snap = chartHandleRef.current?.getLayoutSnapshot();
|
|
180
|
+
setTabs((prev) => {
|
|
181
|
+
const persisted = prev.map(({ remountCount: _r, ...rest }) => rest.id === activeTabIdRef.current && snap ? { ...rest, snapshot: snap } : rest);
|
|
182
|
+
const ws = {
|
|
183
|
+
tabs: persisted,
|
|
184
|
+
activeTabId: activeTabIdRef.current,
|
|
185
|
+
autoSave: autoSaveRef.current,
|
|
186
|
+
timezone: timezoneRef.current,
|
|
187
|
+
customTimeframes: customTimeframesRef.current,
|
|
188
|
+
favoriteTfs: favoriteTfsRef.current,
|
|
189
|
+
session: sessionRef.current,
|
|
190
|
+
theme: themeRef.current,
|
|
191
|
+
};
|
|
192
|
+
const license = LicenseManager.getInstance().getLicense();
|
|
193
|
+
preferences.put({ ...ws, ...(license ? { licensePayload: license } : {}) })
|
|
194
|
+
.catch(() => { });
|
|
195
|
+
return prev;
|
|
196
|
+
});
|
|
197
|
+
}, 1_500);
|
|
198
|
+
}, [wsLoaded, preferences]);
|
|
199
|
+
// Keep chartHandleRef in sync with active tab
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
chartHandleRef.current = chartInstancesRef.current.get(activeTabId) ?? null;
|
|
202
|
+
}, [activeTabId]);
|
|
203
|
+
// Trigger save whenever workspace state changes
|
|
204
|
+
useEffect(() => { saveWorkspace(); }, [tabs, activeTabId, autoSave, timezone, customTimeframes, favoriteTfs, session, theme, chartDirty, saveWorkspace]);
|
|
205
|
+
// Track browser fullscreen changes
|
|
206
|
+
useEffect(() => {
|
|
207
|
+
const handler = () => setIsFullscreen(!!document.fullscreenElement);
|
|
208
|
+
document.addEventListener('fullscreenchange', handler);
|
|
209
|
+
return () => document.removeEventListener('fullscreenchange', handler);
|
|
210
|
+
}, []);
|
|
211
|
+
const handleFullscreen = useCallback(() => {
|
|
212
|
+
if (!document.fullscreenElement) {
|
|
213
|
+
containerRef.current?.requestFullscreen().catch(() => { });
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
document.exitFullscreen().catch(() => { });
|
|
217
|
+
}
|
|
218
|
+
}, []);
|
|
219
|
+
const handleCopyScreenshot = useCallback(async () => {
|
|
220
|
+
const url = await chartHandleRef.current?.captureScreenshot();
|
|
221
|
+
if (!url)
|
|
222
|
+
return;
|
|
223
|
+
try {
|
|
224
|
+
const resp = await fetch(url);
|
|
225
|
+
const blob = await resp.blob();
|
|
226
|
+
await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);
|
|
227
|
+
}
|
|
228
|
+
catch { /* Clipboard API unavailable */ }
|
|
229
|
+
}, []);
|
|
230
|
+
const handleDownloadScreenshot = useCallback(async () => {
|
|
231
|
+
const url = await chartHandleRef.current?.captureScreenshot();
|
|
232
|
+
if (!url)
|
|
233
|
+
return;
|
|
234
|
+
const a = document.createElement('a');
|
|
235
|
+
a.href = url;
|
|
236
|
+
a.download = `forgecharts-${Date.now()}.png`;
|
|
237
|
+
a.click();
|
|
238
|
+
}, []);
|
|
239
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
240
|
+
const activeTab = (tabs.find((t) => t.id === activeTabId) ?? tabs[0]);
|
|
241
|
+
const captureSnapshot = useCallback(() => chartHandleRef.current?.getLayoutSnapshot() ?? null, []);
|
|
242
|
+
// ── Tab management ─────────────────────────────────────────────────────────
|
|
243
|
+
const selectTab = useCallback((id) => {
|
|
244
|
+
const snap = captureSnapshot();
|
|
245
|
+
setTabs((prev) => prev.map((t) => t.id === activeTabId ? { ...t, ...(snap !== null ? { snapshot: snap } : {}) } : t));
|
|
246
|
+
setActiveTabId(id);
|
|
247
|
+
}, [activeTabId, captureSnapshot]);
|
|
248
|
+
const addTab = useCallback(() => {
|
|
249
|
+
const snap = captureSnapshot();
|
|
250
|
+
setTabs((prev) => {
|
|
251
|
+
const updated = prev.map((t) => t.id === activeTabId ? { ...t, ...(snap !== null ? { snapshot: snap } : {}) } : t);
|
|
252
|
+
const newTab = makeTab(updated.length + 1);
|
|
253
|
+
setActiveTabId(newTab.id);
|
|
254
|
+
return [...updated, newTab];
|
|
255
|
+
});
|
|
256
|
+
}, [activeTabId, captureSnapshot]);
|
|
257
|
+
const closeTab = useCallback((id) => {
|
|
258
|
+
setTabs((prev) => {
|
|
259
|
+
if (prev.length <= 1)
|
|
260
|
+
return prev;
|
|
261
|
+
const remaining = prev.filter((t) => t.id !== id);
|
|
262
|
+
if (id === activeTabId) {
|
|
263
|
+
const closedIdx = prev.findIndex((t) => t.id === id);
|
|
264
|
+
const next = remaining[Math.min(closedIdx, remaining.length - 1)];
|
|
265
|
+
if (next)
|
|
266
|
+
setActiveTabId(next.id);
|
|
267
|
+
}
|
|
268
|
+
return remaining;
|
|
269
|
+
});
|
|
270
|
+
}, [activeTabId]);
|
|
271
|
+
const renameTab = useCallback((id, label) => {
|
|
272
|
+
setTabs((prev) => prev.map((t) => (t.id === id ? { ...t, label } : t)));
|
|
273
|
+
}, []);
|
|
274
|
+
// ── Symbol / timeframe ─────────────────────────────────────────────────────
|
|
275
|
+
const handleSymbolChange = useCallback((symbol) => {
|
|
276
|
+
setTabs((prev) => prev.map((t) => (t.id === activeTabId ? { ...t, symbol } : t)));
|
|
277
|
+
}, [activeTabId]);
|
|
278
|
+
const handleTimeframeChange = useCallback((timeframe) => {
|
|
279
|
+
setTabs((prev) => prev.map((t) => (t.id === activeTabId ? { ...t, timeframe } : t)));
|
|
280
|
+
}, [activeTabId]);
|
|
281
|
+
const handleAddCustomTimeframe = useCallback((tf) => {
|
|
282
|
+
setCustomTimeframes((prev) => prev.includes(tf) ? prev : [...prev, tf]);
|
|
283
|
+
}, []);
|
|
284
|
+
const handleAddIndicator = useCallback((config) => {
|
|
285
|
+
chartHandleRef.current?.addIndicator(config);
|
|
286
|
+
}, []);
|
|
287
|
+
const toggleTheme = useCallback(() => setTheme((t) => (t === 'dark' ? 'light' : 'dark')), []);
|
|
288
|
+
// ── Layout helpers ─────────────────────────────────────────────────────────
|
|
289
|
+
const buildConfig = useCallback((snap) => ({
|
|
290
|
+
chartLayout: snap,
|
|
291
|
+
customTimeframes,
|
|
292
|
+
timezone,
|
|
293
|
+
}), [customTimeframes, timezone]);
|
|
294
|
+
const applyConfig = useCallback((cfg) => {
|
|
295
|
+
const chartLayout = (cfg['chartLayout'] != null ? cfg['chartLayout'] : cfg);
|
|
296
|
+
if (Array.isArray(cfg['customTimeframes'])) {
|
|
297
|
+
setCustomTimeframes(cfg['customTimeframes']);
|
|
298
|
+
}
|
|
299
|
+
if (typeof cfg['timezone'] === 'string') {
|
|
300
|
+
setTimezone(cfg['timezone']);
|
|
301
|
+
}
|
|
302
|
+
return chartLayout;
|
|
303
|
+
}, []);
|
|
304
|
+
// ── Layout save ────────────────────────────────────────────────────────────
|
|
305
|
+
const handleSaveLayout = useCallback(async (name) => {
|
|
306
|
+
const snap = captureSnapshot();
|
|
307
|
+
if (!snap)
|
|
308
|
+
throw new Error('No chart snapshot available');
|
|
309
|
+
const config = buildConfig(snap);
|
|
310
|
+
if (activeTab.savedLayoutId) {
|
|
311
|
+
await layouts.update(activeTab.savedLayoutId, {
|
|
312
|
+
name, symbol: activeTab.symbol, timeframe: activeTab.timeframe, config,
|
|
313
|
+
});
|
|
314
|
+
setTabs((prev) => prev.map((t) => (t.id === activeTabId ? { ...t, label: name } : t)));
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
const record = await layouts.create({ name, symbol: activeTab.symbol, timeframe: activeTab.timeframe, config });
|
|
318
|
+
setTabs((prev) => prev.map((t) => t.id === activeTabId ? { ...t, savedLayoutId: record.id, label: name } : t));
|
|
319
|
+
}
|
|
320
|
+
}, [activeTab, activeTabId, buildConfig, captureSnapshot, layouts]);
|
|
321
|
+
// ── Layout load ────────────────────────────────────────────────────────────
|
|
322
|
+
const handleLoadLayout = useCallback(async (layoutId) => {
|
|
323
|
+
const record = await layouts.get(layoutId);
|
|
324
|
+
const chartLayout = applyConfig(record.config);
|
|
325
|
+
setTabs((prev) => prev.map((t) => t.id === activeTabId
|
|
326
|
+
? { ...t, symbol: record.symbol, timeframe: record.timeframe, snapshot: chartLayout, savedLayoutId: record.id, label: record.name, remountCount: t.remountCount + 1 }
|
|
327
|
+
: t));
|
|
328
|
+
}, [activeTabId, applyConfig, layouts]);
|
|
329
|
+
// ── Layout rename ──────────────────────────────────────────────────────────
|
|
330
|
+
const handleRenameLayout = useCallback(async (newName) => {
|
|
331
|
+
if (!activeTab.savedLayoutId)
|
|
332
|
+
throw new Error('Layout is not saved yet');
|
|
333
|
+
await layouts.update(activeTab.savedLayoutId, { name: newName });
|
|
334
|
+
setTabs((prev) => prev.map((t) => (t.id === activeTabId ? { ...t, label: newName } : t)));
|
|
335
|
+
}, [activeTab.savedLayoutId, activeTabId, layouts]);
|
|
336
|
+
// ── Layout copy ────────────────────────────────────────────────────────────
|
|
337
|
+
const handleCopyLayout = useCallback(async (copyName) => {
|
|
338
|
+
const snap = captureSnapshot();
|
|
339
|
+
if (!snap)
|
|
340
|
+
throw new Error('No chart snapshot available');
|
|
341
|
+
const record = await layouts.create({
|
|
342
|
+
name: copyName, symbol: activeTab.symbol, timeframe: activeTab.timeframe, config: buildConfig(snap),
|
|
343
|
+
});
|
|
344
|
+
const chartLayout = applyConfig(record.config);
|
|
345
|
+
const newTab = {
|
|
346
|
+
id: uid(), label: record.name, symbol: record.symbol, timeframe: record.timeframe,
|
|
347
|
+
snapshot: chartLayout, savedLayoutId: record.id, remountCount: 0,
|
|
348
|
+
};
|
|
349
|
+
setTabs((prev) => [
|
|
350
|
+
...prev.map((t) => (t.id === activeTabId ? { ...t, snapshot: snap } : t)),
|
|
351
|
+
newTab,
|
|
352
|
+
]);
|
|
353
|
+
setActiveTabId(newTab.id);
|
|
354
|
+
}, [activeTab, activeTabId, applyConfig, buildConfig, captureSnapshot, layouts]);
|
|
355
|
+
// ── Layout delete ──────────────────────────────────────────────────────────
|
|
356
|
+
const handleDeleteLayout = useCallback(async (layoutId) => {
|
|
357
|
+
await layouts.remove(layoutId);
|
|
358
|
+
setTabs((prev) => prev.map((t) => {
|
|
359
|
+
if (t.savedLayoutId !== layoutId)
|
|
360
|
+
return t;
|
|
361
|
+
const { savedLayoutId: _removed, ...rest } = t;
|
|
362
|
+
return rest;
|
|
363
|
+
}));
|
|
364
|
+
}, [layouts]);
|
|
365
|
+
// ── Open layout in new tab ─────────────────────────────────────────────────
|
|
366
|
+
const handleOpenLayoutInNewTab = useCallback(async (layoutId) => {
|
|
367
|
+
const snap = captureSnapshot();
|
|
368
|
+
const record = await layouts.get(layoutId);
|
|
369
|
+
const chartLayout = applyConfig(record.config);
|
|
370
|
+
const newTab = {
|
|
371
|
+
id: uid(), label: record.name, symbol: record.symbol, timeframe: record.timeframe,
|
|
372
|
+
snapshot: chartLayout, savedLayoutId: record.id, remountCount: 0,
|
|
373
|
+
};
|
|
374
|
+
setTabs((prev) => [
|
|
375
|
+
...prev.map((t) => (t.id === activeTabId && snap ? { ...t, snapshot: snap } : t)),
|
|
376
|
+
newTab,
|
|
377
|
+
]);
|
|
378
|
+
setActiveTabId(newTab.id);
|
|
379
|
+
}, [activeTabId, applyConfig, captureSnapshot, layouts]);
|
|
380
|
+
// ── Auto-save ──────────────────────────────────────────────────────────────
|
|
381
|
+
const handleToggleAutoSave = useCallback((enabled) => { setAutoSave(enabled); }, []);
|
|
382
|
+
const autoSaveFnRef = useRef(() => { });
|
|
383
|
+
autoSaveFnRef.current = () => {
|
|
384
|
+
if (!autoSave || !activeTab.savedLayoutId)
|
|
385
|
+
return;
|
|
386
|
+
const snap = chartHandleRef.current?.getLayoutSnapshot();
|
|
387
|
+
if (!snap)
|
|
388
|
+
return;
|
|
389
|
+
layouts.update(activeTab.savedLayoutId, {
|
|
390
|
+
name: activeTab.label, symbol: activeTab.symbol, timeframe: activeTab.timeframe, config: buildConfig(snap),
|
|
391
|
+
}).catch(() => { });
|
|
392
|
+
};
|
|
393
|
+
useEffect(() => {
|
|
394
|
+
if (!autoSave || !activeTab.savedLayoutId)
|
|
395
|
+
return;
|
|
396
|
+
const id = setInterval(() => autoSaveFnRef.current(), 5_000);
|
|
397
|
+
return () => clearInterval(id);
|
|
398
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
399
|
+
}, [autoSave, activeTab.savedLayoutId, activeTab.id]);
|
|
400
|
+
// ── Chart slot assembly ────────────────────────────────────────────────────
|
|
401
|
+
const chartSlots = (_jsx(_Fragment, { children: tabs.map((tab) => (_jsx("div", { style: tab.id === activeTabId
|
|
402
|
+
? { position: 'absolute', inset: 0, display: 'flex' }
|
|
403
|
+
: { position: 'absolute', inset: 0, visibility: 'hidden', pointerEvents: 'none' }, children: _jsx(ChartCanvas, { ref: (handle) => {
|
|
404
|
+
if (handle) {
|
|
405
|
+
chartInstancesRef.current.set(tab.id, handle);
|
|
406
|
+
if (tab.id === activeTabId)
|
|
407
|
+
chartHandleRef.current = handle;
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
chartInstancesRef.current.delete(tab.id);
|
|
411
|
+
}
|
|
412
|
+
}, symbol: tab.symbol, timeframe: tab.timeframe, theme: theme, timezone: timezone, datafeed: datafeed, initialIndicators: tab.snapshot ? [] : DEFAULT_INDICATORS, ...(tab.snapshot ? { layoutToRestore: tab.snapshot } : {}), ...(getExchangeLogoUrl ? { getExchangeLogoUrl } : {}), ...(tradingBridge ? { tradingBridge } : {}), onIndicatorsChanged: () => setChartDirty((d) => d + 1) }, `${tab.id}-${tab.remountCount}`) }, tab.id))) }));
|
|
413
|
+
// ── Drawer assembly ────────────────────────────────────────────────────────
|
|
414
|
+
const drawers = (_jsxs(_Fragment, { children: [scriptDrawerOpen && renderScriptDrawer?.({
|
|
415
|
+
onClose: () => setScriptDrawerOpen(false),
|
|
416
|
+
onAddIndicator: handleAddIndicator,
|
|
417
|
+
}), watchlistOpen && renderWatchlistDrawer?.({
|
|
418
|
+
onClose: () => setWatchlistOpen(false),
|
|
419
|
+
onSelectSymbol: (sym) => { handleSymbolChange(sym); },
|
|
420
|
+
})] }));
|
|
421
|
+
// ── Render ─────────────────────────────────────────────────────────────────
|
|
422
|
+
return (_jsxs("div", { ref: containerRef, style: { height: '100%' }, children: [tradeDrawerOpen && capabilities.renderManagedTradingControls && renderTradeDrawer?.({
|
|
423
|
+
onClose: () => setTradeDrawerOpen(false),
|
|
424
|
+
}), _jsx(ChartWorkspace
|
|
425
|
+
// TabBar
|
|
426
|
+
, {
|
|
427
|
+
// TabBar
|
|
428
|
+
tabs: tabs.map((t) => ({ id: t.id, label: t.label, isSaved: !!t.savedLayoutId })), activeTabId: activeTabId, onSelectTab: selectTab, onAddTab: addTab, onCloseTab: closeTab, onRenameTab: renameTab,
|
|
429
|
+
// TopToolbar
|
|
430
|
+
symbol: activeTab.symbol, timeframe: activeTab.timeframe, theme: theme, customTimeframes: customTimeframes, favoriteTfs: favoriteTfs, onSymbolChange: handleSymbolChange, onTimeframeChange: handleTimeframeChange, onAddCustomTimeframe: handleAddCustomTimeframe, onFavoriteTfsChange: setFavoriteTfs, onAddIndicator: handleAddIndicator, onToggleTheme: toggleTheme, onCopyScreenshot: handleCopyScreenshot, onDownloadScreenshot: handleDownloadScreenshot, onFullscreen: handleFullscreen, isFullscreen: isFullscreen, ...(activeTab.savedLayoutId ? { currentLayoutName: activeTab.label, currentLayoutId: activeTab.savedLayoutId } : {}), autoSave: autoSave, onFetchLayouts: () => layouts.list(), onSaveLayout: handleSaveLayout, onLoadLayout: handleLoadLayout, onRenameLayout: handleRenameLayout, onCopyLayout: handleCopyLayout, onToggleAutoSave: handleToggleAutoSave, onDeleteLayout: handleDeleteLayout, onOpenLayoutInNewTab: handleOpenLayoutInNewTab, symbolResolver: symbolResolver, showTradeButton: capabilities.renderManagedTradingControls, tradeDrawerOpen: tradeDrawerOpen, onToggleTradeDrawer: () => setTradeDrawerOpen((o) => !o),
|
|
431
|
+
// RightToolbar
|
|
432
|
+
watchlistOpen: watchlistOpen, onToggleWatchlist: () => setWatchlistOpen((o) => !o),
|
|
433
|
+
// BottomToolbar
|
|
434
|
+
activeSymbol: activeTab.symbol, timezone: timezone, onTimezoneChange: setTimezone, session: session, onSessionChange: setSession, scriptDrawerOpen: scriptDrawerOpen, onToggleScriptDrawer: () => setScriptDrawerOpen((o) => !o),
|
|
435
|
+
// State
|
|
436
|
+
isLicensed: isLicensed, wsLoaded: wsLoaded,
|
|
437
|
+
// Slots
|
|
438
|
+
chartSlots: chartSlots, drawers: drawers })] }));
|
|
439
|
+
});
|
|
440
|
+
//# sourceMappingURL=ManagedAppShell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManagedAppShell.js","sourceRoot":"","sources":["../../../src/react/shell/ManagedAppShell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TradingBridge — host-side trading callback contract for Unmanaged mode.
|
|
3
|
+
*
|
|
4
|
+
* When a chart user performs a trading action (drag-to-place, cancel, bracket
|
|
5
|
+
* adjust, etc.) the chart emits a typed Intent and defers all confirmation to
|
|
6
|
+
* the host. The chart NEVER self-confirms order state. The host must push
|
|
7
|
+
* the resulting confirmed ChartOrder back via TradingOverlayStore.
|
|
8
|
+
*
|
|
9
|
+
* Usage (consumer / host app):
|
|
10
|
+
*
|
|
11
|
+
* ```tsx
|
|
12
|
+
* import type { TradingBridgeCallbacks } from '@forgecharts/sdk/react';
|
|
13
|
+
*
|
|
14
|
+
* const bridge: TradingBridgeCallbacks = {
|
|
15
|
+
* onPlaceOrderIntent: (intent) => myBroker.placeOrder(intent),
|
|
16
|
+
* onModifyOrderIntent: (intent) => myBroker.modifyOrder(intent),
|
|
17
|
+
* onCancelOrderIntent: (intent) => myBroker.cancelOrder(intent),
|
|
18
|
+
* onBracketAdjustIntent: (intent) => myBroker.adjustBracket(intent),
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* <ChartCanvas
|
|
22
|
+
* symbol="BTCUSDT"
|
|
23
|
+
* timeframe="1h"
|
|
24
|
+
* tradingBridge={bridge}
|
|
25
|
+
* />
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* Debug logging:
|
|
29
|
+
* Wrap your callbacks with `createTradingBridgeLogger` to get structured
|
|
30
|
+
* console output in development:
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* tradingBridge={createTradingBridgeLogger(bridge, 'MyChart')}
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
import type { PlaceOrderIntent, ModifyOrderIntent, CancelOrderIntent, BracketAdjustIntent } from '@forgecharts/types';
|
|
37
|
+
/**
|
|
38
|
+
* Injectable callback bag for the chart-to-host trading bridge.
|
|
39
|
+
*
|
|
40
|
+
* All callbacks are optional — omit any you do not handle. The chart will
|
|
41
|
+
* still emit the intent but silently discard it if the corresponding callback
|
|
42
|
+
* is not provided.
|
|
43
|
+
*
|
|
44
|
+
* The return types are `void | Promise<void>` so hosts can fire-and-forget or
|
|
45
|
+
* await before side-effects. The chart does not await the returned promise —
|
|
46
|
+
* confirmation always flows back through `TradingOverlayStore`.
|
|
47
|
+
*/
|
|
48
|
+
export interface TradingBridgeCallbacks {
|
|
49
|
+
/**
|
|
50
|
+
* Called when the user triggers a new order placement.
|
|
51
|
+
* The host should validate, forward to the broker, and then call
|
|
52
|
+
* `overlayStore.upsertOrder(confirmedOrder)` once acknowledged.
|
|
53
|
+
*/
|
|
54
|
+
onPlaceOrderIntent?: (intent: PlaceOrderIntent) => void | Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Called when the user drags an order line to a new price or edits it via UI.
|
|
57
|
+
* The host should send the modification to the broker and update the overlay
|
|
58
|
+
* store with the modified order.
|
|
59
|
+
*/
|
|
60
|
+
onModifyOrderIntent?: (intent: ModifyOrderIntent) => void | Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Called when the user clicks the cancel control on an order line.
|
|
63
|
+
* The host should cancel at the venue and call `overlayStore.removeOrder(id)`.
|
|
64
|
+
*/
|
|
65
|
+
onCancelOrderIntent?: (intent: CancelOrderIntent) => void | Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Called when the user drags a bracket leg (stop-loss or take-profit).
|
|
68
|
+
* The host adjusts both legs atomically and updates the overlay store.
|
|
69
|
+
*/
|
|
70
|
+
onBracketAdjustIntent?: (intent: BracketAdjustIntent) => void | Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Wraps a `TradingBridgeCallbacks` object and logs all emitted intents to the
|
|
74
|
+
* console. Only active when `process.env.NODE_ENV !== 'production'`.
|
|
75
|
+
*
|
|
76
|
+
* @param callbacks The real callbacks to delegate to after logging.
|
|
77
|
+
* @param label Optional label prepended to log messages (e.g. chart id or symbol).
|
|
78
|
+
* @returns A new `TradingBridgeCallbacks` that logs then delegates.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```ts
|
|
82
|
+
* tradingBridge={createTradingBridgeLogger(bridge, 'BTCUSDT')}
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare function createTradingBridgeLogger(callbacks: TradingBridgeCallbacks, label?: string): TradingBridgeCallbacks;
|
|
86
|
+
//# sourceMappingURL=TradingBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TradingBridge.d.ts","sourceRoot":"","sources":["../../../src/react/trading/TradingBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAI5B;;;;;;;;;;GAUG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,kBAAkB,CAAC,EAAK,CAAC,MAAM,EAAE,gBAAgB,KAAQ,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9E;;;;OAIG;IACH,mBAAmB,CAAC,EAAI,CAAC,MAAM,EAAE,iBAAiB,KAAO,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9E;;;OAGG;IACH,mBAAmB,CAAC,EAAI,CAAC,MAAM,EAAE,iBAAiB,KAAO,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9E;;;OAGG;IACH,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,sBAAsB,EACjC,KAAK,CAAC,EAAE,MAAM,GACb,sBAAsB,CAqDxB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TradingBridge — host-side trading callback contract for Unmanaged mode.
|
|
3
|
+
*
|
|
4
|
+
* When a chart user performs a trading action (drag-to-place, cancel, bracket
|
|
5
|
+
* adjust, etc.) the chart emits a typed Intent and defers all confirmation to
|
|
6
|
+
* the host. The chart NEVER self-confirms order state. The host must push
|
|
7
|
+
* the resulting confirmed ChartOrder back via TradingOverlayStore.
|
|
8
|
+
*
|
|
9
|
+
* Usage (consumer / host app):
|
|
10
|
+
*
|
|
11
|
+
* ```tsx
|
|
12
|
+
* import type { TradingBridgeCallbacks } from '@forgecharts/sdk/react';
|
|
13
|
+
*
|
|
14
|
+
* const bridge: TradingBridgeCallbacks = {
|
|
15
|
+
* onPlaceOrderIntent: (intent) => myBroker.placeOrder(intent),
|
|
16
|
+
* onModifyOrderIntent: (intent) => myBroker.modifyOrder(intent),
|
|
17
|
+
* onCancelOrderIntent: (intent) => myBroker.cancelOrder(intent),
|
|
18
|
+
* onBracketAdjustIntent: (intent) => myBroker.adjustBracket(intent),
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* <ChartCanvas
|
|
22
|
+
* symbol="BTCUSDT"
|
|
23
|
+
* timeframe="1h"
|
|
24
|
+
* tradingBridge={bridge}
|
|
25
|
+
* />
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* Debug logging:
|
|
29
|
+
* Wrap your callbacks with `createTradingBridgeLogger` to get structured
|
|
30
|
+
* console output in development:
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* tradingBridge={createTradingBridgeLogger(bridge, 'MyChart')}
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
// ─── Debug logger ─────────────────────────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* Wraps a `TradingBridgeCallbacks` object and logs all emitted intents to the
|
|
39
|
+
* console. Only active when `process.env.NODE_ENV !== 'production'`.
|
|
40
|
+
*
|
|
41
|
+
* @param callbacks The real callbacks to delegate to after logging.
|
|
42
|
+
* @param label Optional label prepended to log messages (e.g. chart id or symbol).
|
|
43
|
+
* @returns A new `TradingBridgeCallbacks` that logs then delegates.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* tradingBridge={createTradingBridgeLogger(bridge, 'BTCUSDT')}
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export function createTradingBridgeLogger(callbacks, label) {
|
|
51
|
+
if (process.env.NODE_ENV === 'production')
|
|
52
|
+
return callbacks;
|
|
53
|
+
const tag = label ? `[TradingBridge:${label}]` : '[TradingBridge]';
|
|
54
|
+
return {
|
|
55
|
+
onPlaceOrderIntent: (intent) => {
|
|
56
|
+
console.debug(`${tag} PLACE side=%s type=%s qty=%s price=%s stopPrice=%s correlationId=%s`, intent.side, intent.orderType, intent.qty, intent.limitPrice ?? '—', intent.stopPrice ?? '—', intent.correlationId, intent);
|
|
57
|
+
return callbacks.onPlaceOrderIntent?.(intent);
|
|
58
|
+
},
|
|
59
|
+
onModifyOrderIntent: (intent) => {
|
|
60
|
+
console.debug(`${tag} MODIFY orderId=%s limitPrice=%s stopPrice=%s qty=%s`, intent.orderId, intent.limitPrice ?? '—', intent.stopPrice ?? '—', intent.qty ?? '—', intent);
|
|
61
|
+
return callbacks.onModifyOrderIntent?.(intent);
|
|
62
|
+
},
|
|
63
|
+
onCancelOrderIntent: (intent) => {
|
|
64
|
+
console.debug(`${tag} CANCEL orderId=%s symbol=%s`, intent.orderId, intent.symbol, intent);
|
|
65
|
+
return callbacks.onCancelOrderIntent?.(intent);
|
|
66
|
+
},
|
|
67
|
+
onBracketAdjustIntent: (intent) => {
|
|
68
|
+
console.debug(`${tag} BRACKET_ADJUST entry=%s sl=%s tp=%s`, intent.entryOrderId, intent.stopLossPrice ?? '—', intent.takeProfitPrice ?? '—', intent);
|
|
69
|
+
return callbacks.onBracketAdjustIntent?.(intent);
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=TradingBridge.js.map
|