@metamask-previews/advanced-chart-core 0.0.0-preview-e58fe0640 → 0.0.0-preview-238cb7063
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/core/bootstrap.cjs +185 -0
- package/dist/core/bootstrap.cjs.map +1 -0
- package/dist/core/bootstrap.d.cts +10 -0
- package/dist/core/bootstrap.d.cts.map +1 -0
- package/dist/core/bootstrap.d.mts +10 -0
- package/dist/core/bootstrap.d.mts.map +1 -0
- package/dist/core/bootstrap.mjs +181 -0
- package/dist/core/bootstrap.mjs.map +1 -0
- package/dist/core/bridge.cjs +115 -0
- package/dist/core/bridge.cjs.map +1 -0
- package/dist/core/bridge.d.cts +37 -0
- package/dist/core/bridge.d.cts.map +1 -0
- package/dist/core/bridge.d.mts +37 -0
- package/dist/core/bridge.d.mts.map +1 -0
- package/dist/core/bridge.mjs +108 -0
- package/dist/core/bridge.mjs.map +1 -0
- package/dist/core/dataLifecycle.cjs +52 -0
- package/dist/core/dataLifecycle.cjs.map +1 -0
- package/dist/core/dataLifecycle.d.cts +8 -0
- package/dist/core/dataLifecycle.d.cts.map +1 -0
- package/dist/core/dataLifecycle.d.mts +8 -0
- package/dist/core/dataLifecycle.d.mts.map +1 -0
- package/dist/core/dataLifecycle.mjs +46 -0
- package/dist/core/dataLifecycle.mjs.map +1 -0
- package/dist/core/loadLibrary.cjs +63 -0
- package/dist/core/loadLibrary.cjs.map +1 -0
- package/dist/core/loadLibrary.d.cts +16 -0
- package/dist/core/loadLibrary.d.cts.map +1 -0
- package/dist/core/loadLibrary.d.mts +16 -0
- package/dist/core/loadLibrary.d.mts.map +1 -0
- package/dist/core/loadLibrary.mjs +58 -0
- package/dist/core/loadLibrary.mjs.map +1 -0
- package/dist/core/resolution.cjs +58 -0
- package/dist/core/resolution.cjs.map +1 -0
- package/dist/core/resolution.d.cts +15 -0
- package/dist/core/resolution.d.cts.map +1 -0
- package/dist/core/resolution.d.mts +15 -0
- package/dist/core/resolution.d.mts.map +1 -0
- package/dist/core/resolution.mjs +54 -0
- package/dist/core/resolution.mjs.map +1 -0
- package/dist/core/state.cjs +343 -0
- package/dist/core/state.cjs.map +1 -0
- package/dist/core/state.d.cts +67 -0
- package/dist/core/state.d.cts.map +1 -0
- package/dist/core/state.d.mts +67 -0
- package/dist/core/state.d.mts.map +1 -0
- package/dist/core/state.mjs +283 -0
- package/dist/core/state.mjs.map +1 -0
- package/dist/core/timeUtils.cjs +72 -0
- package/dist/core/timeUtils.cjs.map +1 -0
- package/dist/core/timeUtils.d.cts +32 -0
- package/dist/core/timeUtils.d.cts.map +1 -0
- package/dist/core/timeUtils.d.mts +32 -0
- package/dist/core/timeUtils.d.mts.map +1 -0
- package/dist/core/timeUtils.mjs +66 -0
- package/dist/core/timeUtils.mjs.map +1 -0
- package/dist/core/timezone.cjs +135 -0
- package/dist/core/timezone.cjs.map +1 -0
- package/dist/core/timezone.d.cts +16 -0
- package/dist/core/timezone.d.cts.map +1 -0
- package/dist/core/timezone.d.mts +16 -0
- package/dist/core/timezone.d.mts.map +1 -0
- package/dist/core/timezone.mjs +131 -0
- package/dist/core/timezone.mjs.map +1 -0
- package/dist/core/types.cjs +20 -0
- package/dist/core/types.cjs.map +1 -0
- package/dist/core/types.d.cts +323 -0
- package/dist/core/types.d.cts.map +1 -0
- package/dist/core/types.d.mts +323 -0
- package/dist/core/types.d.mts.map +1 -0
- package/dist/core/types.mjs +17 -0
- package/dist/core/types.mjs.map +1 -0
- package/dist/features/indicators/index.cjs +183 -0
- package/dist/features/indicators/index.cjs.map +1 -0
- package/dist/features/indicators/index.d.cts +6 -0
- package/dist/features/indicators/index.d.cts.map +1 -0
- package/dist/features/indicators/index.d.mts +6 -0
- package/dist/features/indicators/index.d.mts.map +1 -0
- package/dist/features/indicators/index.mjs +177 -0
- package/dist/features/indicators/index.mjs.map +1 -0
- package/dist/features/indicators/legend.cjs +575 -0
- package/dist/features/indicators/legend.cjs.map +1 -0
- package/dist/features/indicators/legend.d.cts +40 -0
- package/dist/features/indicators/legend.d.cts.map +1 -0
- package/dist/features/indicators/legend.d.mts +40 -0
- package/dist/features/indicators/legend.d.mts.map +1 -0
- package/dist/features/indicators/legend.mjs +564 -0
- package/dist/features/indicators/legend.mjs.map +1 -0
- package/dist/features/indicators/resize.cjs +34 -0
- package/dist/features/indicators/resize.cjs.map +1 -0
- package/dist/features/indicators/resize.d.cts +2 -0
- package/dist/features/indicators/resize.d.cts.map +1 -0
- package/dist/features/indicators/resize.d.mts +2 -0
- package/dist/features/indicators/resize.d.mts.map +1 -0
- package/dist/features/indicators/resize.mjs +30 -0
- package/dist/features/indicators/resize.mjs.map +1 -0
- package/dist/features/indicators/studies.cjs +147 -0
- package/dist/features/indicators/studies.cjs.map +1 -0
- package/dist/features/indicators/studies.d.cts +36 -0
- package/dist/features/indicators/studies.d.cts.map +1 -0
- package/dist/features/indicators/studies.d.mts +36 -0
- package/dist/features/indicators/studies.d.mts.map +1 -0
- package/dist/features/indicators/studies.mjs +140 -0
- package/dist/features/indicators/studies.mjs.map +1 -0
- package/dist/features/indicators/subPane.cjs +78 -0
- package/dist/features/indicators/subPane.cjs.map +1 -0
- package/dist/features/indicators/subPane.d.cts +6 -0
- package/dist/features/indicators/subPane.d.cts.map +1 -0
- package/dist/features/indicators/subPane.d.mts +6 -0
- package/dist/features/indicators/subPane.d.mts.map +1 -0
- package/dist/features/indicators/subPane.mjs +72 -0
- package/dist/features/indicators/subPane.mjs.map +1 -0
- package/dist/features/volume/index.cjs +145 -0
- package/dist/features/volume/index.cjs.map +1 -0
- package/dist/features/volume/index.d.cts +4 -0
- package/dist/features/volume/index.d.cts.map +1 -0
- package/dist/features/volume/index.d.mts +4 -0
- package/dist/features/volume/index.d.mts.map +1 -0
- package/dist/features/volume/index.mjs +140 -0
- package/dist/features/volume/index.mjs.map +1 -0
- package/dist/index.cjs +20 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +18 -0
- package/dist/index.mjs.map +1 -0
- package/dist/interaction/crosshair.cjs +147 -0
- package/dist/interaction/crosshair.cjs.map +1 -0
- package/dist/interaction/crosshair.d.cts +21 -0
- package/dist/interaction/crosshair.d.cts.map +1 -0
- package/dist/interaction/crosshair.d.mts +21 -0
- package/dist/interaction/crosshair.d.mts.map +1 -0
- package/dist/interaction/crosshair.mjs +141 -0
- package/dist/interaction/crosshair.mjs.map +1 -0
- package/dist/interaction/visibleRange.cjs +102 -0
- package/dist/interaction/visibleRange.cjs.map +1 -0
- package/dist/interaction/visibleRange.d.cts +11 -0
- package/dist/interaction/visibleRange.d.cts.map +1 -0
- package/dist/interaction/visibleRange.d.mts +11 -0
- package/dist/interaction/visibleRange.d.mts.map +1 -0
- package/dist/interaction/visibleRange.mjs +97 -0
- package/dist/interaction/visibleRange.mjs.map +1 -0
- package/dist/messages/contract.cjs +27 -0
- package/dist/messages/contract.cjs.map +1 -0
- package/dist/messages/contract.d.cts +262 -0
- package/dist/messages/contract.d.cts.map +1 -0
- package/dist/messages/contract.d.mts +262 -0
- package/dist/messages/contract.d.mts.map +1 -0
- package/dist/messages/contract.mjs +26 -0
- package/dist/messages/contract.mjs.map +1 -0
- package/dist/messages/handler.cjs +54 -0
- package/dist/messages/handler.cjs.map +1 -0
- package/dist/messages/handler.d.cts +25 -0
- package/dist/messages/handler.d.cts.map +1 -0
- package/dist/messages/handler.d.mts +25 -0
- package/dist/messages/handler.d.mts.map +1 -0
- package/dist/messages/handler.mjs +48 -0
- package/dist/messages/handler.mjs.map +1 -0
- package/dist/overlays/focusTime/index.cjs +161 -0
- package/dist/overlays/focusTime/index.cjs.map +1 -0
- package/dist/overlays/focusTime/index.d.cts +6 -0
- package/dist/overlays/focusTime/index.d.cts.map +1 -0
- package/dist/overlays/focusTime/index.d.mts +6 -0
- package/dist/overlays/focusTime/index.d.mts.map +1 -0
- package/dist/overlays/focusTime/index.mjs +155 -0
- package/dist/overlays/focusTime/index.mjs.map +1 -0
- package/dist/overlays/positionLines/index.cjs +188 -0
- package/dist/overlays/positionLines/index.cjs.map +1 -0
- package/dist/overlays/positionLines/index.d.cts +4 -0
- package/dist/overlays/positionLines/index.d.cts.map +1 -0
- package/dist/overlays/positionLines/index.d.mts +4 -0
- package/dist/overlays/positionLines/index.d.mts.map +1 -0
- package/dist/overlays/positionLines/index.mjs +183 -0
- package/dist/overlays/positionLines/index.mjs.map +1 -0
- package/dist/overlays/positionLines/state.cjs +35 -0
- package/dist/overlays/positionLines/state.cjs.map +1 -0
- package/dist/overlays/positionLines/state.d.cts +8 -0
- package/dist/overlays/positionLines/state.d.cts.map +1 -0
- package/dist/overlays/positionLines/state.d.mts +8 -0
- package/dist/overlays/positionLines/state.d.mts.map +1 -0
- package/dist/overlays/positionLines/state.mjs +26 -0
- package/dist/overlays/positionLines/state.mjs.map +1 -0
- package/dist/overlays/socialLeaderboard/index.cjs +229 -0
- package/dist/overlays/socialLeaderboard/index.cjs.map +1 -0
- package/dist/overlays/socialLeaderboard/index.d.cts +48 -0
- package/dist/overlays/socialLeaderboard/index.d.cts.map +1 -0
- package/dist/overlays/socialLeaderboard/index.d.mts +48 -0
- package/dist/overlays/socialLeaderboard/index.d.mts.map +1 -0
- package/dist/overlays/socialLeaderboard/index.mjs +222 -0
- package/dist/overlays/socialLeaderboard/index.mjs.map +1 -0
- package/dist/overlays/tradeMarkers/animation.cjs +123 -0
- package/dist/overlays/tradeMarkers/animation.cjs.map +1 -0
- package/dist/overlays/tradeMarkers/animation.d.cts +5 -0
- package/dist/overlays/tradeMarkers/animation.d.cts.map +1 -0
- package/dist/overlays/tradeMarkers/animation.d.mts +5 -0
- package/dist/overlays/tradeMarkers/animation.d.mts.map +1 -0
- package/dist/overlays/tradeMarkers/animation.mjs +118 -0
- package/dist/overlays/tradeMarkers/animation.mjs.map +1 -0
- package/dist/overlays/tradeMarkers/index.cjs +334 -0
- package/dist/overlays/tradeMarkers/index.cjs.map +1 -0
- package/dist/overlays/tradeMarkers/index.d.cts +35 -0
- package/dist/overlays/tradeMarkers/index.d.cts.map +1 -0
- package/dist/overlays/tradeMarkers/index.d.mts +35 -0
- package/dist/overlays/tradeMarkers/index.d.mts.map +1 -0
- package/dist/overlays/tradeMarkers/index.mjs +324 -0
- package/dist/overlays/tradeMarkers/index.mjs.map +1 -0
- package/dist/overlays/tradeMarkers/markerHitTest.cjs +337 -0
- package/dist/overlays/tradeMarkers/markerHitTest.cjs.map +1 -0
- package/dist/overlays/tradeMarkers/markerHitTest.d.cts +15 -0
- package/dist/overlays/tradeMarkers/markerHitTest.d.cts.map +1 -0
- package/dist/overlays/tradeMarkers/markerHitTest.d.mts +15 -0
- package/dist/overlays/tradeMarkers/markerHitTest.d.mts.map +1 -0
- package/dist/overlays/tradeMarkers/markerHitTest.mjs +331 -0
- package/dist/overlays/tradeMarkers/markerHitTest.mjs.map +1 -0
- package/dist/overlays/tradeMarkers/state.cjs +75 -0
- package/dist/overlays/tradeMarkers/state.cjs.map +1 -0
- package/dist/overlays/tradeMarkers/state.d.cts +20 -0
- package/dist/overlays/tradeMarkers/state.d.cts.map +1 -0
- package/dist/overlays/tradeMarkers/state.d.mts +20 -0
- package/dist/overlays/tradeMarkers/state.d.mts.map +1 -0
- package/dist/overlays/tradeMarkers/state.mjs +60 -0
- package/dist/overlays/tradeMarkers/state.mjs.map +1 -0
- package/dist/pagination/priceApi.cjs +102 -0
- package/dist/pagination/priceApi.cjs.map +1 -0
- package/dist/pagination/priceApi.d.cts +43 -0
- package/dist/pagination/priceApi.d.cts.map +1 -0
- package/dist/pagination/priceApi.d.mts +43 -0
- package/dist/pagination/priceApi.d.mts.map +1 -0
- package/dist/pagination/priceApi.mjs +97 -0
- package/dist/pagination/priceApi.mjs.map +1 -0
- package/dist/pagination/rnBacked.cjs +108 -0
- package/dist/pagination/rnBacked.cjs.map +1 -0
- package/dist/pagination/rnBacked.d.cts +15 -0
- package/dist/pagination/rnBacked.d.cts.map +1 -0
- package/dist/pagination/rnBacked.d.mts +15 -0
- package/dist/pagination/rnBacked.d.mts.map +1 -0
- package/dist/pagination/rnBacked.mjs +100 -0
- package/dist/pagination/rnBacked.mjs.map +1 -0
- package/dist/widget/chartType.cjs +39 -0
- package/dist/widget/chartType.cjs.map +1 -0
- package/dist/widget/chartType.d.cts +4 -0
- package/dist/widget/chartType.d.cts.map +1 -0
- package/dist/widget/chartType.d.mts +4 -0
- package/dist/widget/chartType.d.mts.map +1 -0
- package/dist/widget/chartType.mjs +34 -0
- package/dist/widget/chartType.mjs.map +1 -0
- package/dist/widget/datafeed.cjs +228 -0
- package/dist/widget/datafeed.cjs.map +1 -0
- package/dist/widget/datafeed.d.cts +22 -0
- package/dist/widget/datafeed.d.cts.map +1 -0
- package/dist/widget/datafeed.d.mts +22 -0
- package/dist/widget/datafeed.d.mts.map +1 -0
- package/dist/widget/datafeed.mjs +223 -0
- package/dist/widget/datafeed.mjs.map +1 -0
- package/dist/widget/externalLinkBridge.cjs +134 -0
- package/dist/widget/externalLinkBridge.cjs.map +1 -0
- package/dist/widget/externalLinkBridge.d.cts +14 -0
- package/dist/widget/externalLinkBridge.d.cts.map +1 -0
- package/dist/widget/externalLinkBridge.d.mts +14 -0
- package/dist/widget/externalLinkBridge.d.mts.map +1 -0
- package/dist/widget/externalLinkBridge.mjs +127 -0
- package/dist/widget/externalLinkBridge.mjs.map +1 -0
- package/dist/widget/initChart.cjs +242 -0
- package/dist/widget/initChart.cjs.map +1 -0
- package/dist/widget/initChart.d.cts +53 -0
- package/dist/widget/initChart.d.cts.map +1 -0
- package/dist/widget/initChart.d.mts +53 -0
- package/dist/widget/initChart.d.mts.map +1 -0
- package/dist/widget/initChart.mjs +235 -0
- package/dist/widget/initChart.mjs.map +1 -0
- package/dist/widget/ohlcvIngestion.cjs +240 -0
- package/dist/widget/ohlcvIngestion.cjs.map +1 -0
- package/dist/widget/ohlcvIngestion.d.cts +16 -0
- package/dist/widget/ohlcvIngestion.d.cts.map +1 -0
- package/dist/widget/ohlcvIngestion.d.mts +16 -0
- package/dist/widget/ohlcvIngestion.d.mts.map +1 -0
- package/dist/widget/ohlcvIngestion.mjs +233 -0
- package/dist/widget/ohlcvIngestion.mjs.map +1 -0
- package/dist/widget/priceFormatter.cjs +142 -0
- package/dist/widget/priceFormatter.cjs.map +1 -0
- package/dist/widget/priceFormatter.d.cts +38 -0
- package/dist/widget/priceFormatter.d.cts.map +1 -0
- package/dist/widget/priceFormatter.d.mts +38 -0
- package/dist/widget/priceFormatter.d.mts.map +1 -0
- package/dist/widget/priceFormatter.mjs +134 -0
- package/dist/widget/priceFormatter.mjs.map +1 -0
- package/dist/widget/scaleLayout.cjs +89 -0
- package/dist/widget/scaleLayout.cjs.map +1 -0
- package/dist/widget/scaleLayout.d.cts +9 -0
- package/dist/widget/scaleLayout.d.cts.map +1 -0
- package/dist/widget/scaleLayout.d.mts +9 -0
- package/dist/widget/scaleLayout.d.mts.map +1 -0
- package/dist/widget/scaleLayout.mjs +85 -0
- package/dist/widget/scaleLayout.mjs.map +1 -0
- package/dist/widget/theme.cjs +286 -0
- package/dist/widget/theme.cjs.map +1 -0
- package/dist/widget/theme.d.cts +99 -0
- package/dist/widget/theme.d.cts.map +1 -0
- package/dist/widget/theme.d.mts +99 -0
- package/dist/widget/theme.d.mts.map +1 -0
- package/dist/widget/theme.mjs +270 -0
- package/dist/widget/theme.mjs.map +1 -0
- package/dist/widget/tvDomHelpers.cjs +65 -0
- package/dist/widget/tvDomHelpers.cjs.map +1 -0
- package/dist/widget/tvDomHelpers.d.cts +19 -0
- package/dist/widget/tvDomHelpers.d.cts.map +1 -0
- package/dist/widget/tvDomHelpers.d.mts +19 -0
- package/dist/widget/tvDomHelpers.d.mts.map +1 -0
- package/dist/widget/tvDomHelpers.mjs +60 -0
- package/dist/widget/tvDomHelpers.mjs.map +1 -0
- package/dist/widget/visualOverrides.cjs +63 -0
- package/dist/widget/visualOverrides.cjs.map +1 -0
- package/dist/widget/visualOverrides.d.cts +27 -0
- package/dist/widget/visualOverrides.d.cts.map +1 -0
- package/dist/widget/visualOverrides.d.mts +27 -0
- package/dist/widget/visualOverrides.d.mts.map +1 -0
- package/dist/widget/visualOverrides.mjs +58 -0
- package/dist/widget/visualOverrides.mjs.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Property names mirror external contracts (TradingView `LibrarySymbolInfo`,
|
|
2
|
+
// injected `window` globals, RN indicator-color maps), so they intentionally
|
|
3
|
+
// use non-camelCase keys — matching the core convention for external API type
|
|
4
|
+
// files (see `transaction-controller/src/types.ts`).
|
|
5
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
6
|
+
// Shared types for the AdvancedChart WebView modules.
|
|
7
|
+
//
|
|
8
|
+
// These types are local to the WebView bundle. Cross-bridge payload shapes that
|
|
9
|
+
// must match the RN side live in messages/contract.ts and mirror the unions in
|
|
10
|
+
// app/components/UI/Charts/AdvancedChart/AdvancedChart.types.ts.
|
|
11
|
+
/** Chart type integers used by TradingView's setChartType / currentChartType. */
|
|
12
|
+
export var ChartType;
|
|
13
|
+
(function (ChartType) {
|
|
14
|
+
ChartType[ChartType["Candles"] = 1] = "Candles";
|
|
15
|
+
ChartType[ChartType["Line"] = 2] = "Line";
|
|
16
|
+
})(ChartType || (ChartType = {}));
|
|
17
|
+
//# sourceMappingURL=types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,qDAAqD;AACrD,yDAAyD;AACzD,sDAAsD;AACtD,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,iEAAiE;AAwTjE,iFAAiF;AACjF,MAAM,CAAN,IAAkB,SAGjB;AAHD,WAAkB,SAAS;IACzB,+CAAW,CAAA;IACX,yCAAQ,CAAA;AACV,CAAC,EAHiB,SAAS,KAAT,SAAS,QAG1B","sourcesContent":["// Property names mirror external contracts (TradingView `LibrarySymbolInfo`,\n// injected `window` globals, RN indicator-color maps), so they intentionally\n// use non-camelCase keys — matching the core convention for external API type\n// files (see `transaction-controller/src/types.ts`).\n/* eslint-disable @typescript-eslint/naming-convention */\n// Shared types for the AdvancedChart WebView modules.\n//\n// These types are local to the WebView bundle. Cross-bridge payload shapes that\n// must match the RN side live in messages/contract.ts and mirror the unions in\n// app/components/UI/Charts/AdvancedChart/AdvancedChart.types.ts.\n\n/**\n * CONFIG.theme shape as injected by AdvancedChartTemplate.createConfigScript.\n * Every key may be reassigned by SET_THEME_COLORS at runtime.\n */\nexport type ChartTheme = {\n backgroundColor: string;\n borderColor: string;\n textColor: string;\n textDefaultColor: string;\n sectionBackgroundColor: string;\n crosshairBackgroundColor: string;\n crosshairTextColor: string;\n legendTextColor: string;\n textAlternativeColor: string;\n successColor: string;\n lineColor: string;\n errorColor: string;\n primaryColor: string;\n currentPriceColor: string;\n volumeSuccessColor?: string;\n volumeErrorColor?: string;\n gridLineColor?: string;\n};\n\n/**\n * Indicator color palette for MA / MACD / RSI / BOL.\n * Sourced from app/components/UI/Charts/AdvancedChart/indicatorColors.ts on the\n * RN side and injected as CONFIG.indicatorColors.\n */\nexport type IndicatorColors = {\n MA?: Record<string, string>;\n MACD?: Record<string, string>;\n RSI?: Record<string, string>;\n BOL?: Record<string, string>;\n};\n\nexport type ChartFeaturesConfig = {\n enableDrawingTools?: boolean;\n disabledFeatures?: string[];\n hidePaneSeparator?: boolean;\n showBuiltInLegend?: boolean;\n};\n\n/**\n * Indicator names this chart understands. Phase 3 supports the built-in\n * curated set used by Token Details — MACD, RSI, BOL, MA200, plus the\n * five MA-visibility variants (MA5/10/20/50/200). Other names fall through\n * to TradingView's generic createStudy.\n */\nexport type IndicatorName =\n | 'MACD'\n | 'RSI'\n | 'BOL'\n | 'MA200'\n | 'MA5'\n | 'MA10'\n | 'MA20'\n | 'MA50';\n\nexport type LegendPlotCfg = {\n tvTitle: string;\n label: string;\n color: string | null;\n};\n\nexport type LegendIndicatorCfg = {\n plots: LegendPlotCfg[];\n isMA?: boolean;\n useIndex?: boolean;\n combineInOnePill?: boolean;\n title?: string;\n /** When true, legend pills render in the study's own sub-pane overlay. */\n subPaneLegend?: boolean;\n};\n\n/**\n * Optional consumer-supplied legend overlay config inlined as\n * window.CONFIG.legendOverlay. When `enabled` is true the WebView builds a\n * DOM legend overlay above the chart container.\n */\nexport type LegendOverlayConfig = {\n enabled?: boolean;\n /** Per-indicator legend configuration supplied by RN. */\n config?: Record<string, LegendIndicatorCfg>;\n};\n\n/**\n * Visual overrides applied via TradingView's `applyOverrides`. Set by the\n * consumer's `visualOverrides` prop on the RN side. Empty/undefined keys\n * fall through to TradingView defaults.\n */\nexport type VisualOverridesConfigInline = {\n gridLineColor?: string;\n hidePaneSeparator?: boolean;\n currentPriceLineColor?: string;\n volumeUpColor?: string;\n volumeDownColor?: string;\n};\n\n/**\n * Shape of window.CONFIG as inlined by AdvancedChartTemplate before this IIFE\n * runs. Phase 1 reads `libraryUrl`, `theme`, `features`, `indicatorColors`.\n * Phase 2 adds `visualOverrides`. Future phases add more keys as they port\n * from the legacy chartLogic.js.\n */\nexport type ChartConfig = {\n libraryUrl: string;\n theme: ChartTheme;\n features?: ChartFeaturesConfig;\n indicatorColors?: IndicatorColors;\n useSubscriptPriceFormat?: boolean;\n priceDecimals?: number | null;\n visualOverrides?: VisualOverridesConfigInline;\n legendOverlay?: LegendOverlayConfig;\n /** Optional sub-pane height ratio in (0, 1] for RSI/MACD sub-panes. */\n subPaneHeightRatio?: number;\n};\n\n/**\n * Minimal TradingView types we touch in Phase 1. Full types ship with the\n * charting library at runtime; we stub the bits we call.\n */\nexport type TVResolution = string; // NOSONAR — intentional semantic alias for TradingView resolution strings\n\nexport type TVTimeRange = {\n type: 'time-range';\n from: number;\n to: number;\n};\n\nexport type TVWidgetEvent = 'mouse_down' | 'mouse_up' | 'panes_height_changed';\n\nexport type TVChartingLibraryWidget = {\n onChartReady(callback: () => void): void;\n activeChart(): TVActiveChart;\n applyOverrides(overrides: Record<string, unknown>): void;\n subscribe(event: TVWidgetEvent, handler: () => void): void;\n resize(): void;\n remove(): void;\n resetCache?(): void;\n};\n\nexport type TVSubscription<TArgs extends unknown[] = []> = {\n subscribe(scope: unknown, callback: (...args: TArgs) => void): void;\n unsubscribe(scope: unknown, callback: (...args: TArgs) => void): void;\n};\n\nexport type TVTimeScale = {\n setRightOffset(offset: number): void;\n barSpacingChanged(): TVSubscription;\n width?(): number;\n};\n\nexport type TVCrosshairParams = {\n price?: number;\n time?: number;\n offsetX?: number;\n offsetY?: number;\n};\n\nexport type TVMainSeries = {\n /** Re-attaches the main series to the right price scale. */\n detachToRight(): void;\n /** Directly update style properties for a specific chart type (2=line, 10=baseline, etc.). */\n setChartStyleProperties(\n chartStyle: number,\n properties: Record<string, unknown>,\n ): void;\n};\n\n/** Entity id returned by TradingView's `createShape`. */\nexport type TVShapeId = string; // NOSONAR — intentional semantic alias for TradingView shape entity IDs\n\n/**\n * Runtime handle to a drawing shape (icon, horizontal_line, etc.).\n * Only the members we call are typed.\n */\nexport type TVShape = {\n setProperties(properties: Record<string, unknown>): void;\n};\n\nexport type TVShapePoint = {\n time?: number;\n price?: number;\n};\n\nexport type TVShapeCreateOptions = {\n shape: string;\n text?: string;\n icon?: number;\n lock?: boolean;\n overrides?: Record<string, unknown>;\n disableSelection?: boolean;\n disableSave?: boolean;\n disableUndo?: boolean;\n showInObjectsTree?: boolean;\n zOrder?: 'top' | 'bottom';\n};\n\nexport type TVPriceScale = {\n getVisiblePriceRange(): { from: number; to: number } | null;\n width?(): number;\n isInverted?(): boolean;\n getMode?(): number;\n setAutoScale?(enabled: boolean): void;\n};\n\nexport type TVPane = {\n getMainSourcePriceScale(): TVPriceScale | null;\n getRightPriceScales?(): TVPriceScale[];\n getHeight(): number;\n};\n\nexport type StudyId = string; // NOSONAR — intentional semantic alias for TradingView study entity IDs\n\nexport type TVStudy = {\n onDataLoaded(): TVSubscription;\n applyOverrides?(overrides: Record<string, unknown>): void;\n paneIndex?(): number;\n};\n\nexport type TVExportSchemaField = {\n type: string;\n sourceId?: StudyId;\n plotTitle?: string;\n};\n\nexport type TVExportData = {\n schema: TVExportSchemaField[];\n data: number[][];\n displayedData?: string[][];\n};\n\nexport type TVExportDataOptions = {\n includeSeries?: boolean;\n includedStudies?: StudyId[];\n};\n\nexport type TVActiveChart = {\n setChartType(type: ChartType): void;\n setResolution(resolution: TVResolution, callback: () => void): void;\n resetData(): void;\n setVisibleRange(\n range: { from: number; to: number },\n options?: { percentRightMargin?: number },\n ): void;\n getTimeScale(): TVTimeScale;\n getSeries(): TVMainSeries;\n onDataLoaded(): TVSubscription;\n onVisibleRangeChanged(): TVSubscription;\n crossHairMoved(): TVSubscription<[TVCrosshairParams]>;\n selection(): {\n onChanged(): TVSubscription;\n clear(): void;\n };\n createStudy(\n name: string,\n forceOverlay: boolean,\n lock: boolean,\n inputs: Record<string, unknown>,\n overrides: Record<string, unknown>,\n options?: { priceScale?: string },\n ): Promise<StudyId>;\n createShape(\n point: TVShapePoint,\n options: TVShapeCreateOptions,\n ): Promise<TVShapeId>;\n removeEntity(id: StudyId | TVShapeId): void;\n getStudyById(id: StudyId): TVStudy | null;\n getShapeById?(id: TVShapeId): TVShape | null;\n getAllPanesHeight(): number[];\n setAllPanesHeight(heights: number[]): void;\n exportData(options: TVExportDataOptions): Promise<TVExportData>;\n getVisibleRange?(): { from: number; to: number } | null;\n getVisibleBarsRange?(): { from: number; to: number } | null;\n getPanes?(): TVPane[];\n dataReady?(callback: () => void): void;\n};\n\nexport type TVWidgetConstructor = new (\n options: Record<string, unknown>,\n) => TVChartingLibraryWidget;\n\n/** OHLCV bar in milliseconds (matches the SetOHLCVDataPayload in RN). */\nexport type OHLCVBar = {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume?: number;\n};\n\n/** TradingView-shaped bar payload returned from datafeed.getBars / subscribeBars. */\nexport type TVBar = {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume?: number;\n};\n\nexport type OHLCVPaginationConfig = {\n nextCursor: string | null;\n hasMore: boolean;\n assetId: string | null;\n vsCurrency: string | null;\n};\n\n/** Chart type integers used by TradingView's setChartType / currentChartType. */\nexport const enum ChartType {\n Candles = 1,\n Line = 2,\n}\n\n/** Subset of TV's `LibrarySymbolInfo` we actually return from resolveSymbol. */\nexport type SymbolInfo = {\n name: string;\n ticker: string;\n description: string;\n type: string;\n session: string;\n timezone: string;\n exchange: string;\n minmov: number;\n pricescale: number;\n variable_tick_size: string;\n has_intraday: boolean;\n has_daily: boolean;\n has_weekly_and_monthly: boolean;\n supported_resolutions: string[];\n volume_precision: number;\n data_status: 'streaming' | 'endofday' | 'pulsed' | 'delayed_streaming';\n};\n\nexport type PeriodParams = {\n from: number;\n to: number;\n countBack: number;\n firstDataRequest: boolean;\n};\n\nexport type GetBarsCallback = (\n bars: TVBar[],\n meta?: { noData?: boolean; nextTime?: number },\n) => void;\n\nexport type GetBarsErrorCallback = (reason: string) => void;\n\nexport type RealtimeTickCallback = (tick: TVBar) => void;\n\nexport type TVDatafeed = {\n onReady(callback: (config: Record<string, unknown>) => void): void;\n searchSymbols(\n userInput: string,\n exchange: string,\n symbolType: string,\n onResult: (result: unknown[]) => void,\n ): void;\n resolveSymbol(\n symbolName: string,\n onResolve: (info: SymbolInfo) => void,\n onError: (reason: string) => void,\n ): void;\n getBars(\n symbolInfo: SymbolInfo,\n resolution: TVResolution,\n periodParams: PeriodParams,\n onResult: GetBarsCallback,\n onError: GetBarsErrorCallback,\n ): void;\n subscribeBars(\n symbolInfo: SymbolInfo,\n resolution: TVResolution,\n onTick: RealtimeTickCallback,\n listenerGuid: string,\n ): void;\n unsubscribeBars(listenerGuid: string): void;\n};\n\ndeclare global {\n // Global augmentation of the built-in `Window` interface requires `interface`\n // (declaration merging does not work with a `type` alias).\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n interface Window {\n CONFIG?: ChartConfig;\n TradingView?: { widget: TVWidgetConstructor };\n ReactNativeWebView?: { postMessage(message: string): void };\n }\n}\n"]}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ADD_INDICATOR / REMOVE_INDICATOR / SET_MA_VISIBILITY handlers.
|
|
3
|
+
//
|
|
4
|
+
// Ported from chartLogic.js handleAddIndicator (~line 803),
|
|
5
|
+
// handleRemoveIndicator (~line 891), handleSetMAVisibility (~line 929).
|
|
6
|
+
// Phase 3 keeps the curated indicator set used by Token Details (MACD, RSI,
|
|
7
|
+
// BOL, MA200 + MA visibility variants). Consumers needing TV's native study
|
|
8
|
+
// picker can re-enable header_widget via the disabledFeatures prop.
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.handleSetMAVisibility = exports.handleRemoveIndicator = exports.handleAddIndicator = void 0;
|
|
11
|
+
const bridge_js_1 = require("../../core/bridge.cjs");
|
|
12
|
+
const state_js_1 = require("../../core/state.cjs");
|
|
13
|
+
const legend_js_1 = require("./legend.cjs");
|
|
14
|
+
const resize_js_1 = require("./resize.cjs");
|
|
15
|
+
const studies_js_1 = require("./studies.cjs");
|
|
16
|
+
const subPane_js_1 = require("./subPane.cjs");
|
|
17
|
+
function isOwnStringKey(key) {
|
|
18
|
+
return (typeof key === 'string' &&
|
|
19
|
+
key !== '__proto__' &&
|
|
20
|
+
key !== 'constructor' &&
|
|
21
|
+
key !== 'prototype');
|
|
22
|
+
}
|
|
23
|
+
function notifyIndicatorAdded(name, studyId) {
|
|
24
|
+
// Two-frame wait so RN reads the legend overlay after layout completes.
|
|
25
|
+
requestAnimationFrame(() => {
|
|
26
|
+
requestAnimationFrame(() => {
|
|
27
|
+
(0, bridge_js_1.postToRN)('INDICATOR_ADDED', { name, id: String(studyId) });
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function handleAddIndicator(payload, config) {
|
|
32
|
+
const widget = (0, state_js_1.getWidget)();
|
|
33
|
+
if (!widget || !(0, state_js_1.isChartReady)()) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (!payload?.name) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const { name } = payload;
|
|
40
|
+
if (!isOwnStringKey(name)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if ((0, state_js_1.getActiveStudies)().has(name)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const chart = widget.activeChart();
|
|
47
|
+
const preset = (0, studies_js_1.resolveStudyPreset)(name, config.indicatorColors, payload.inputs);
|
|
48
|
+
(0, studies_js_1.createIndicatorStudy)(chart, preset)
|
|
49
|
+
.then((studyId) => {
|
|
50
|
+
(0, state_js_1.registerStudy)('active', name, studyId);
|
|
51
|
+
if ((0, studies_js_1.isSubPanePreset)(preset)) {
|
|
52
|
+
(0, subPane_js_1.applySubPaneHeightRatio)(chart);
|
|
53
|
+
}
|
|
54
|
+
(0, legend_js_1.subscribeStudyDataLoaded)(chart, studyId);
|
|
55
|
+
(0, resize_js_1.scheduleChartWidgetResize)();
|
|
56
|
+
notifyIndicatorAdded(name, studyId);
|
|
57
|
+
return undefined;
|
|
58
|
+
})
|
|
59
|
+
.catch((error) => {
|
|
60
|
+
(0, bridge_js_1.reportErrorToRN)(error instanceof Error
|
|
61
|
+
? new Error(`Failed to add indicator: ${error.message}`)
|
|
62
|
+
: error);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
exports.handleAddIndicator = handleAddIndicator;
|
|
66
|
+
function handleRemoveIndicator(payload) {
|
|
67
|
+
const widget = (0, state_js_1.getWidget)();
|
|
68
|
+
if (!widget || !(0, state_js_1.isChartReady)()) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (!payload?.name) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const { name } = payload;
|
|
75
|
+
if (!isOwnStringKey(name)) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (!(0, state_js_1.getActiveStudies)().has(name)) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const studyId = (0, state_js_1.unregisterStudy)(name);
|
|
82
|
+
if (!studyId) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const chart = widget.activeChart();
|
|
87
|
+
const study = chart.getStudyById(studyId);
|
|
88
|
+
const paneIdx = study?.paneIndex?.();
|
|
89
|
+
const wasSubPane = paneIdx !== undefined && paneIdx > 0;
|
|
90
|
+
if (wasSubPane) {
|
|
91
|
+
(0, legend_js_1.removeSubPaneOverlay)(name);
|
|
92
|
+
}
|
|
93
|
+
chart.removeEntity(studyId);
|
|
94
|
+
(0, legend_js_1.scheduleLegendRefresh)();
|
|
95
|
+
(0, bridge_js_1.postToRN)('INDICATOR_REMOVED', { name });
|
|
96
|
+
if (wasSubPane && (0, subPane_js_1.hasActiveSubPaneIndicators)()) {
|
|
97
|
+
(0, subPane_js_1.applySubPaneHeightRatio)(chart);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
(0, bridge_js_1.reportErrorToRN)(error);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.handleRemoveIndicator = handleRemoveIndicator;
|
|
105
|
+
function handleSetMAVisibility(payload, config) {
|
|
106
|
+
const widget = (0, state_js_1.getWidget)();
|
|
107
|
+
if (!widget || !(0, state_js_1.isChartReady)()) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (!payload) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const visible = payload.visible || [];
|
|
114
|
+
const chart = widget.activeChart();
|
|
115
|
+
const visibleNames = new Set();
|
|
116
|
+
for (const visibleName of visible) {
|
|
117
|
+
if (isOwnStringKey(visibleName) && studies_js_1.MA_LENGTHS[visibleName] !== undefined) {
|
|
118
|
+
visibleNames.add(visibleName);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
removeMAVariants(chart, visibleNames);
|
|
122
|
+
addMAVariants(chart, visible, config);
|
|
123
|
+
}
|
|
124
|
+
exports.handleSetMAVisibility = handleSetMAVisibility;
|
|
125
|
+
function removeMAVariants(chart, keep) {
|
|
126
|
+
const toRemove = [];
|
|
127
|
+
for (const name of (0, state_js_1.getMaStudies)().keys()) {
|
|
128
|
+
if (!keep.has(name)) {
|
|
129
|
+
toRemove.push(name);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (toRemove.length === 0) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
for (const name of toRemove) {
|
|
136
|
+
const studyId = (0, state_js_1.unregisterStudy)(name);
|
|
137
|
+
if (!studyId) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
chart.removeEntity(studyId);
|
|
142
|
+
(0, bridge_js_1.postToRN)('INDICATOR_REMOVED', { name });
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
(0, bridge_js_1.reportErrorToRN)(error);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Removing TV studies doesn't auto-clear the DOM legend pills. Refresh so
|
|
149
|
+
// the disabled MA's pill disappears alongside the underlying study.
|
|
150
|
+
(0, legend_js_1.scheduleLegendRefresh)();
|
|
151
|
+
}
|
|
152
|
+
function addMAVariants(chart, visible, config) {
|
|
153
|
+
const promises = [];
|
|
154
|
+
for (const name of visible) {
|
|
155
|
+
if (!isOwnStringKey(name) || studies_js_1.MA_LENGTHS[name] === undefined) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if ((0, state_js_1.getMaStudies)().has(name)) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const preset = (0, studies_js_1.resolveStudyPreset)(name, config.indicatorColors);
|
|
162
|
+
promises.push((0, studies_js_1.createIndicatorStudy)(chart, preset)
|
|
163
|
+
.then((studyId) => {
|
|
164
|
+
(0, state_js_1.registerStudy)('ma', name, studyId);
|
|
165
|
+
(0, legend_js_1.subscribeStudyDataLoaded)(chart, studyId);
|
|
166
|
+
notifyIndicatorAdded(name, studyId);
|
|
167
|
+
return undefined;
|
|
168
|
+
})
|
|
169
|
+
.catch((error) => {
|
|
170
|
+
(0, bridge_js_1.reportErrorToRN)(new Error(`MA creation failed: ${name} - ${String(error)}`));
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
if (promises.length > 0) {
|
|
174
|
+
Promise.all(promises)
|
|
175
|
+
.then(() => {
|
|
176
|
+
(0, legend_js_1.scheduleLegendRefresh)();
|
|
177
|
+
(0, resize_js_1.scheduleChartWidgetResize)();
|
|
178
|
+
return undefined;
|
|
179
|
+
})
|
|
180
|
+
.catch(bridge_js_1.reportErrorToRN);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../../../src/features/indicators/index.ts"],"names":[],"mappings":"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","sourcesContent":["// ADD_INDICATOR / REMOVE_INDICATOR / SET_MA_VISIBILITY handlers.\n//\n// Ported from chartLogic.js handleAddIndicator (~line 803),\n// handleRemoveIndicator (~line 891), handleSetMAVisibility (~line 929).\n// Phase 3 keeps the curated indicator set used by Token Details (MACD, RSI,\n// BOL, MA200 + MA visibility variants). Consumers needing TV's native study\n// picker can re-enable header_widget via the disabledFeatures prop.\n\nimport { postToRN, reportErrorToRN } from '../../core/bridge.js';\nimport {\n getActiveStudies,\n getMaStudies,\n getWidget,\n isChartReady,\n registerStudy,\n unregisterStudy,\n} from '../../core/state.js';\nimport type { ChartConfig, StudyId, TVActiveChart } from '../../core/types.js';\nimport type {\n AddIndicatorMessage,\n RemoveIndicatorMessage,\n SetMAVisibilityMessage,\n} from '../../messages/contract.js';\nimport {\n removeSubPaneOverlay,\n scheduleLegendRefresh,\n subscribeStudyDataLoaded,\n} from './legend.js';\nimport { scheduleChartWidgetResize } from './resize.js';\nimport {\n createIndicatorStudy,\n isSubPanePreset,\n MA_LENGTHS,\n resolveStudyPreset,\n} from './studies.js';\nimport {\n applySubPaneHeightRatio,\n hasActiveSubPaneIndicators,\n} from './subPane.js';\n\nfunction isOwnStringKey(key: unknown): key is string {\n return (\n typeof key === 'string' &&\n key !== '__proto__' &&\n key !== 'constructor' &&\n key !== 'prototype'\n );\n}\n\nfunction notifyIndicatorAdded(name: string, studyId: StudyId): void {\n // Two-frame wait so RN reads the legend overlay after layout completes.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n postToRN('INDICATOR_ADDED', { name, id: String(studyId) });\n });\n });\n}\n\nexport function handleAddIndicator(\n payload: AddIndicatorMessage['payload'],\n config: ChartConfig,\n): void {\n const widget = getWidget();\n if (!widget || !isChartReady()) {\n return;\n }\n if (!payload?.name) {\n return;\n }\n const { name } = payload;\n if (!isOwnStringKey(name)) {\n return;\n }\n if (getActiveStudies().has(name)) {\n return;\n }\n\n const chart = widget.activeChart();\n const preset = resolveStudyPreset(\n name,\n config.indicatorColors,\n payload.inputs,\n );\n\n createIndicatorStudy(chart, preset)\n .then((studyId) => {\n registerStudy('active', name, studyId);\n if (isSubPanePreset(preset)) {\n applySubPaneHeightRatio(chart);\n }\n subscribeStudyDataLoaded(chart, studyId);\n scheduleChartWidgetResize();\n notifyIndicatorAdded(name, studyId);\n return undefined;\n })\n .catch((error) => {\n reportErrorToRN(\n error instanceof Error\n ? new Error(`Failed to add indicator: ${error.message}`)\n : error,\n );\n });\n}\n\nexport function handleRemoveIndicator(\n payload: RemoveIndicatorMessage['payload'],\n): void {\n const widget = getWidget();\n if (!widget || !isChartReady()) {\n return;\n }\n if (!payload?.name) {\n return;\n }\n const { name } = payload;\n if (!isOwnStringKey(name)) {\n return;\n }\n if (!getActiveStudies().has(name)) {\n return;\n }\n\n const studyId = unregisterStudy(name);\n if (!studyId) {\n return;\n }\n\n try {\n const chart = widget.activeChart();\n const study = chart.getStudyById(studyId);\n const paneIdx = study?.paneIndex?.();\n const wasSubPane = paneIdx !== undefined && paneIdx > 0;\n\n if (wasSubPane) {\n removeSubPaneOverlay(name);\n }\n\n chart.removeEntity(studyId);\n\n scheduleLegendRefresh();\n postToRN('INDICATOR_REMOVED', { name });\n if (wasSubPane && hasActiveSubPaneIndicators()) {\n applySubPaneHeightRatio(chart);\n }\n } catch (error) {\n reportErrorToRN(error);\n }\n}\n\nexport function handleSetMAVisibility(\n payload: SetMAVisibilityMessage['payload'],\n config: ChartConfig,\n): void {\n const widget = getWidget();\n if (!widget || !isChartReady()) {\n return;\n }\n if (!payload) {\n return;\n }\n\n const visible = payload.visible || [];\n const chart = widget.activeChart();\n\n const visibleNames = new Set<string>();\n for (const visibleName of visible) {\n if (isOwnStringKey(visibleName) && MA_LENGTHS[visibleName] !== undefined) {\n visibleNames.add(visibleName);\n }\n }\n\n removeMAVariants(chart, visibleNames);\n addMAVariants(chart, visible, config);\n}\n\nfunction removeMAVariants(chart: TVActiveChart, keep: Set<string>): void {\n const toRemove: string[] = [];\n for (const name of getMaStudies().keys()) {\n if (!keep.has(name)) {\n toRemove.push(name);\n }\n }\n if (toRemove.length === 0) {\n return;\n }\n for (const name of toRemove) {\n const studyId = unregisterStudy(name);\n if (!studyId) {\n continue;\n }\n try {\n chart.removeEntity(studyId);\n postToRN('INDICATOR_REMOVED', { name });\n } catch (error) {\n reportErrorToRN(error);\n }\n }\n // Removing TV studies doesn't auto-clear the DOM legend pills. Refresh so\n // the disabled MA's pill disappears alongside the underlying study.\n scheduleLegendRefresh();\n}\n\nfunction addMAVariants(\n chart: TVActiveChart,\n visible: string[],\n config: ChartConfig,\n): void {\n const promises: Promise<unknown>[] = [];\n for (const name of visible) {\n if (!isOwnStringKey(name) || MA_LENGTHS[name] === undefined) {\n continue;\n }\n if (getMaStudies().has(name)) {\n continue;\n }\n const preset = resolveStudyPreset(name, config.indicatorColors);\n promises.push(\n createIndicatorStudy(chart, preset)\n .then((studyId) => {\n registerStudy('ma', name, studyId);\n subscribeStudyDataLoaded(chart, studyId);\n notifyIndicatorAdded(name, studyId);\n return undefined;\n })\n .catch((error) => {\n reportErrorToRN(\n new Error(`MA creation failed: ${name} - ${String(error)}`),\n );\n }),\n );\n }\n if (promises.length > 0) {\n Promise.all(promises)\n .then(() => {\n scheduleLegendRefresh();\n scheduleChartWidgetResize();\n return undefined;\n })\n .catch(reportErrorToRN);\n }\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ChartConfig } from "../../core/types.cjs";
|
|
2
|
+
import type { AddIndicatorMessage, RemoveIndicatorMessage, SetMAVisibilityMessage } from "../../messages/contract.cjs";
|
|
3
|
+
export declare function handleAddIndicator(payload: AddIndicatorMessage['payload'], config: ChartConfig): void;
|
|
4
|
+
export declare function handleRemoveIndicator(payload: RemoveIndicatorMessage['payload']): void;
|
|
5
|
+
export declare function handleSetMAVisibility(payload: SetMAVisibilityMessage['payload'], config: ChartConfig): void;
|
|
6
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../../src/features/indicators/index.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAA0B,6BAA4B;AAC/E,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACvB,oCAAmC;AAoCpC,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,EACvC,MAAM,EAAE,WAAW,GAClB,IAAI,CAyCN;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC,GACzC,IAAI,CAyCN;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC,EAC1C,MAAM,EAAE,WAAW,GAClB,IAAI,CAqBN"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ChartConfig } from "../../core/types.mjs";
|
|
2
|
+
import type { AddIndicatorMessage, RemoveIndicatorMessage, SetMAVisibilityMessage } from "../../messages/contract.mjs";
|
|
3
|
+
export declare function handleAddIndicator(payload: AddIndicatorMessage['payload'], config: ChartConfig): void;
|
|
4
|
+
export declare function handleRemoveIndicator(payload: RemoveIndicatorMessage['payload']): void;
|
|
5
|
+
export declare function handleSetMAVisibility(payload: SetMAVisibilityMessage['payload'], config: ChartConfig): void;
|
|
6
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/features/indicators/index.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAA0B,6BAA4B;AAC/E,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACvB,oCAAmC;AAoCpC,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,EACvC,MAAM,EAAE,WAAW,GAClB,IAAI,CAyCN;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC,GACzC,IAAI,CAyCN;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC,EAC1C,MAAM,EAAE,WAAW,GAClB,IAAI,CAqBN"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// ADD_INDICATOR / REMOVE_INDICATOR / SET_MA_VISIBILITY handlers.
|
|
2
|
+
//
|
|
3
|
+
// Ported from chartLogic.js handleAddIndicator (~line 803),
|
|
4
|
+
// handleRemoveIndicator (~line 891), handleSetMAVisibility (~line 929).
|
|
5
|
+
// Phase 3 keeps the curated indicator set used by Token Details (MACD, RSI,
|
|
6
|
+
// BOL, MA200 + MA visibility variants). Consumers needing TV's native study
|
|
7
|
+
// picker can re-enable header_widget via the disabledFeatures prop.
|
|
8
|
+
import { postToRN, reportErrorToRN } from "../../core/bridge.mjs";
|
|
9
|
+
import { getActiveStudies, getMaStudies, getWidget, isChartReady, registerStudy, unregisterStudy } from "../../core/state.mjs";
|
|
10
|
+
import { removeSubPaneOverlay, scheduleLegendRefresh, subscribeStudyDataLoaded } from "./legend.mjs";
|
|
11
|
+
import { scheduleChartWidgetResize } from "./resize.mjs";
|
|
12
|
+
import { createIndicatorStudy, isSubPanePreset, MA_LENGTHS, resolveStudyPreset } from "./studies.mjs";
|
|
13
|
+
import { applySubPaneHeightRatio, hasActiveSubPaneIndicators } from "./subPane.mjs";
|
|
14
|
+
function isOwnStringKey(key) {
|
|
15
|
+
return (typeof key === 'string' &&
|
|
16
|
+
key !== '__proto__' &&
|
|
17
|
+
key !== 'constructor' &&
|
|
18
|
+
key !== 'prototype');
|
|
19
|
+
}
|
|
20
|
+
function notifyIndicatorAdded(name, studyId) {
|
|
21
|
+
// Two-frame wait so RN reads the legend overlay after layout completes.
|
|
22
|
+
requestAnimationFrame(() => {
|
|
23
|
+
requestAnimationFrame(() => {
|
|
24
|
+
postToRN('INDICATOR_ADDED', { name, id: String(studyId) });
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export function handleAddIndicator(payload, config) {
|
|
29
|
+
const widget = getWidget();
|
|
30
|
+
if (!widget || !isChartReady()) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (!payload?.name) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const { name } = payload;
|
|
37
|
+
if (!isOwnStringKey(name)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (getActiveStudies().has(name)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const chart = widget.activeChart();
|
|
44
|
+
const preset = resolveStudyPreset(name, config.indicatorColors, payload.inputs);
|
|
45
|
+
createIndicatorStudy(chart, preset)
|
|
46
|
+
.then((studyId) => {
|
|
47
|
+
registerStudy('active', name, studyId);
|
|
48
|
+
if (isSubPanePreset(preset)) {
|
|
49
|
+
applySubPaneHeightRatio(chart);
|
|
50
|
+
}
|
|
51
|
+
subscribeStudyDataLoaded(chart, studyId);
|
|
52
|
+
scheduleChartWidgetResize();
|
|
53
|
+
notifyIndicatorAdded(name, studyId);
|
|
54
|
+
return undefined;
|
|
55
|
+
})
|
|
56
|
+
.catch((error) => {
|
|
57
|
+
reportErrorToRN(error instanceof Error
|
|
58
|
+
? new Error(`Failed to add indicator: ${error.message}`)
|
|
59
|
+
: error);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export function handleRemoveIndicator(payload) {
|
|
63
|
+
const widget = getWidget();
|
|
64
|
+
if (!widget || !isChartReady()) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (!payload?.name) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const { name } = payload;
|
|
71
|
+
if (!isOwnStringKey(name)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (!getActiveStudies().has(name)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const studyId = unregisterStudy(name);
|
|
78
|
+
if (!studyId) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const chart = widget.activeChart();
|
|
83
|
+
const study = chart.getStudyById(studyId);
|
|
84
|
+
const paneIdx = study?.paneIndex?.();
|
|
85
|
+
const wasSubPane = paneIdx !== undefined && paneIdx > 0;
|
|
86
|
+
if (wasSubPane) {
|
|
87
|
+
removeSubPaneOverlay(name);
|
|
88
|
+
}
|
|
89
|
+
chart.removeEntity(studyId);
|
|
90
|
+
scheduleLegendRefresh();
|
|
91
|
+
postToRN('INDICATOR_REMOVED', { name });
|
|
92
|
+
if (wasSubPane && hasActiveSubPaneIndicators()) {
|
|
93
|
+
applySubPaneHeightRatio(chart);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
reportErrorToRN(error);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export function handleSetMAVisibility(payload, config) {
|
|
101
|
+
const widget = getWidget();
|
|
102
|
+
if (!widget || !isChartReady()) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (!payload) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const visible = payload.visible || [];
|
|
109
|
+
const chart = widget.activeChart();
|
|
110
|
+
const visibleNames = new Set();
|
|
111
|
+
for (const visibleName of visible) {
|
|
112
|
+
if (isOwnStringKey(visibleName) && MA_LENGTHS[visibleName] !== undefined) {
|
|
113
|
+
visibleNames.add(visibleName);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
removeMAVariants(chart, visibleNames);
|
|
117
|
+
addMAVariants(chart, visible, config);
|
|
118
|
+
}
|
|
119
|
+
function removeMAVariants(chart, keep) {
|
|
120
|
+
const toRemove = [];
|
|
121
|
+
for (const name of getMaStudies().keys()) {
|
|
122
|
+
if (!keep.has(name)) {
|
|
123
|
+
toRemove.push(name);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (toRemove.length === 0) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
for (const name of toRemove) {
|
|
130
|
+
const studyId = unregisterStudy(name);
|
|
131
|
+
if (!studyId) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
chart.removeEntity(studyId);
|
|
136
|
+
postToRN('INDICATOR_REMOVED', { name });
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
reportErrorToRN(error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Removing TV studies doesn't auto-clear the DOM legend pills. Refresh so
|
|
143
|
+
// the disabled MA's pill disappears alongside the underlying study.
|
|
144
|
+
scheduleLegendRefresh();
|
|
145
|
+
}
|
|
146
|
+
function addMAVariants(chart, visible, config) {
|
|
147
|
+
const promises = [];
|
|
148
|
+
for (const name of visible) {
|
|
149
|
+
if (!isOwnStringKey(name) || MA_LENGTHS[name] === undefined) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (getMaStudies().has(name)) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const preset = resolveStudyPreset(name, config.indicatorColors);
|
|
156
|
+
promises.push(createIndicatorStudy(chart, preset)
|
|
157
|
+
.then((studyId) => {
|
|
158
|
+
registerStudy('ma', name, studyId);
|
|
159
|
+
subscribeStudyDataLoaded(chart, studyId);
|
|
160
|
+
notifyIndicatorAdded(name, studyId);
|
|
161
|
+
return undefined;
|
|
162
|
+
})
|
|
163
|
+
.catch((error) => {
|
|
164
|
+
reportErrorToRN(new Error(`MA creation failed: ${name} - ${String(error)}`));
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
if (promises.length > 0) {
|
|
168
|
+
Promise.all(promises)
|
|
169
|
+
.then(() => {
|
|
170
|
+
scheduleLegendRefresh();
|
|
171
|
+
scheduleChartWidgetResize();
|
|
172
|
+
return undefined;
|
|
173
|
+
})
|
|
174
|
+
.catch(reportErrorToRN);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/features/indicators/index.ts"],"names":[],"mappings":"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","sourcesContent":["// ADD_INDICATOR / REMOVE_INDICATOR / SET_MA_VISIBILITY handlers.\n//\n// Ported from chartLogic.js handleAddIndicator (~line 803),\n// handleRemoveIndicator (~line 891), handleSetMAVisibility (~line 929).\n// Phase 3 keeps the curated indicator set used by Token Details (MACD, RSI,\n// BOL, MA200 + MA visibility variants). Consumers needing TV's native study\n// picker can re-enable header_widget via the disabledFeatures prop.\n\nimport { postToRN, reportErrorToRN } from '../../core/bridge.js';\nimport {\n getActiveStudies,\n getMaStudies,\n getWidget,\n isChartReady,\n registerStudy,\n unregisterStudy,\n} from '../../core/state.js';\nimport type { ChartConfig, StudyId, TVActiveChart } from '../../core/types.js';\nimport type {\n AddIndicatorMessage,\n RemoveIndicatorMessage,\n SetMAVisibilityMessage,\n} from '../../messages/contract.js';\nimport {\n removeSubPaneOverlay,\n scheduleLegendRefresh,\n subscribeStudyDataLoaded,\n} from './legend.js';\nimport { scheduleChartWidgetResize } from './resize.js';\nimport {\n createIndicatorStudy,\n isSubPanePreset,\n MA_LENGTHS,\n resolveStudyPreset,\n} from './studies.js';\nimport {\n applySubPaneHeightRatio,\n hasActiveSubPaneIndicators,\n} from './subPane.js';\n\nfunction isOwnStringKey(key: unknown): key is string {\n return (\n typeof key === 'string' &&\n key !== '__proto__' &&\n key !== 'constructor' &&\n key !== 'prototype'\n );\n}\n\nfunction notifyIndicatorAdded(name: string, studyId: StudyId): void {\n // Two-frame wait so RN reads the legend overlay after layout completes.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n postToRN('INDICATOR_ADDED', { name, id: String(studyId) });\n });\n });\n}\n\nexport function handleAddIndicator(\n payload: AddIndicatorMessage['payload'],\n config: ChartConfig,\n): void {\n const widget = getWidget();\n if (!widget || !isChartReady()) {\n return;\n }\n if (!payload?.name) {\n return;\n }\n const { name } = payload;\n if (!isOwnStringKey(name)) {\n return;\n }\n if (getActiveStudies().has(name)) {\n return;\n }\n\n const chart = widget.activeChart();\n const preset = resolveStudyPreset(\n name,\n config.indicatorColors,\n payload.inputs,\n );\n\n createIndicatorStudy(chart, preset)\n .then((studyId) => {\n registerStudy('active', name, studyId);\n if (isSubPanePreset(preset)) {\n applySubPaneHeightRatio(chart);\n }\n subscribeStudyDataLoaded(chart, studyId);\n scheduleChartWidgetResize();\n notifyIndicatorAdded(name, studyId);\n return undefined;\n })\n .catch((error) => {\n reportErrorToRN(\n error instanceof Error\n ? new Error(`Failed to add indicator: ${error.message}`)\n : error,\n );\n });\n}\n\nexport function handleRemoveIndicator(\n payload: RemoveIndicatorMessage['payload'],\n): void {\n const widget = getWidget();\n if (!widget || !isChartReady()) {\n return;\n }\n if (!payload?.name) {\n return;\n }\n const { name } = payload;\n if (!isOwnStringKey(name)) {\n return;\n }\n if (!getActiveStudies().has(name)) {\n return;\n }\n\n const studyId = unregisterStudy(name);\n if (!studyId) {\n return;\n }\n\n try {\n const chart = widget.activeChart();\n const study = chart.getStudyById(studyId);\n const paneIdx = study?.paneIndex?.();\n const wasSubPane = paneIdx !== undefined && paneIdx > 0;\n\n if (wasSubPane) {\n removeSubPaneOverlay(name);\n }\n\n chart.removeEntity(studyId);\n\n scheduleLegendRefresh();\n postToRN('INDICATOR_REMOVED', { name });\n if (wasSubPane && hasActiveSubPaneIndicators()) {\n applySubPaneHeightRatio(chart);\n }\n } catch (error) {\n reportErrorToRN(error);\n }\n}\n\nexport function handleSetMAVisibility(\n payload: SetMAVisibilityMessage['payload'],\n config: ChartConfig,\n): void {\n const widget = getWidget();\n if (!widget || !isChartReady()) {\n return;\n }\n if (!payload) {\n return;\n }\n\n const visible = payload.visible || [];\n const chart = widget.activeChart();\n\n const visibleNames = new Set<string>();\n for (const visibleName of visible) {\n if (isOwnStringKey(visibleName) && MA_LENGTHS[visibleName] !== undefined) {\n visibleNames.add(visibleName);\n }\n }\n\n removeMAVariants(chart, visibleNames);\n addMAVariants(chart, visible, config);\n}\n\nfunction removeMAVariants(chart: TVActiveChart, keep: Set<string>): void {\n const toRemove: string[] = [];\n for (const name of getMaStudies().keys()) {\n if (!keep.has(name)) {\n toRemove.push(name);\n }\n }\n if (toRemove.length === 0) {\n return;\n }\n for (const name of toRemove) {\n const studyId = unregisterStudy(name);\n if (!studyId) {\n continue;\n }\n try {\n chart.removeEntity(studyId);\n postToRN('INDICATOR_REMOVED', { name });\n } catch (error) {\n reportErrorToRN(error);\n }\n }\n // Removing TV studies doesn't auto-clear the DOM legend pills. Refresh so\n // the disabled MA's pill disappears alongside the underlying study.\n scheduleLegendRefresh();\n}\n\nfunction addMAVariants(\n chart: TVActiveChart,\n visible: string[],\n config: ChartConfig,\n): void {\n const promises: Promise<unknown>[] = [];\n for (const name of visible) {\n if (!isOwnStringKey(name) || MA_LENGTHS[name] === undefined) {\n continue;\n }\n if (getMaStudies().has(name)) {\n continue;\n }\n const preset = resolveStudyPreset(name, config.indicatorColors);\n promises.push(\n createIndicatorStudy(chart, preset)\n .then((studyId) => {\n registerStudy('ma', name, studyId);\n subscribeStudyDataLoaded(chart, studyId);\n notifyIndicatorAdded(name, studyId);\n return undefined;\n })\n .catch((error) => {\n reportErrorToRN(\n new Error(`MA creation failed: ${name} - ${String(error)}`),\n );\n }),\n );\n }\n if (promises.length > 0) {\n Promise.all(promises)\n .then(() => {\n scheduleLegendRefresh();\n scheduleChartWidgetResize();\n return undefined;\n })\n .catch(reportErrorToRN);\n }\n}\n"]}
|