@liberfi.io/ui-tradingview 0.1.18 → 0.1.20
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/index.d.mts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -787,6 +787,7 @@ declare class ChartDataFeed {
|
|
|
787
787
|
private bridge;
|
|
788
788
|
private abortController;
|
|
789
789
|
constructor(settings: ChartSettings, chartManager: ChartManager, bridge: ChartWidgetBridge);
|
|
790
|
+
toJSON(): null;
|
|
790
791
|
onReady(callback: (data: any) => void): Promise<void>;
|
|
791
792
|
destroy(): void;
|
|
792
793
|
resolveSymbol(symbolName: string, onResolve: ResolveCallback, onError: ErrorCallback, extension?: SymbolResolveExtension): Promise<void>;
|
|
@@ -794,6 +795,23 @@ declare class ChartDataFeed {
|
|
|
794
795
|
subscribeBars(symbolInfo: LibrarySymbolInfo, resolution: ResolutionString, onTick: SubscribeBarsCallback, listenerGuid: string, onResetCacheNeededCallback: () => void): void;
|
|
795
796
|
unsubscribeBars(listenerGuid: string): void;
|
|
796
797
|
getMarks(symbolInfo: LibrarySymbolInfo, from: number, to: number, onDataCallback: GetMarksCallback<Mark>, resolution: ResolutionString): Promise<void>;
|
|
798
|
+
/**
|
|
799
|
+
* TradingView calls getQuotes to populate the current-price display in the
|
|
800
|
+
* chart header. Without this method, TradingView's internal quote session
|
|
801
|
+
* (qs_*) is created but never resolved, triggering "Cannot read properties
|
|
802
|
+
* of undefined" errors. Returning an "ok" status with empty values tells
|
|
803
|
+
* TradingView that the datafeed supports the quotes API but has no quote data
|
|
804
|
+
* beyond what is already on the chart, which suppresses the internal errors.
|
|
805
|
+
*/
|
|
806
|
+
getQuotes(symbols: string[], onDataCallback: (data: any[]) => void, _onErrorCallback: (reason: string) => void): void;
|
|
807
|
+
/**
|
|
808
|
+
* TradingView calls subscribeQuotes to receive real-time price ticks for the
|
|
809
|
+
* header display. We return a no-op here because the chart already receives
|
|
810
|
+
* real-time data via subscribeBars. Implementing this stub prevents the
|
|
811
|
+
* internal qs_* session from remaining in a pending/broken state.
|
|
812
|
+
*/
|
|
813
|
+
subscribeQuotes(_symbols: string[], _fastSymbols: string[], _onRealtimeCallback: (data: any[]) => void, _listenerGuid: string): void;
|
|
814
|
+
unsubscribeQuotes(_listenerGuid: string): void;
|
|
797
815
|
}
|
|
798
816
|
|
|
799
817
|
/**
|
|
@@ -822,6 +840,7 @@ declare class ChartSaveLoadAdapter {
|
|
|
822
840
|
constructor(settings: ChartSettings, chartManager: ChartManager, bridge: ChartWidgetBridge);
|
|
823
841
|
get layoutId(): string;
|
|
824
842
|
get shouldResetColorPalette(): boolean;
|
|
843
|
+
toJSON(): null;
|
|
825
844
|
getAllCharts(): Promise<any[]>;
|
|
826
845
|
removeChart(_index: number): void;
|
|
827
846
|
saveChart(chart: any): Promise<string>;
|
package/dist/index.d.ts
CHANGED
|
@@ -787,6 +787,7 @@ declare class ChartDataFeed {
|
|
|
787
787
|
private bridge;
|
|
788
788
|
private abortController;
|
|
789
789
|
constructor(settings: ChartSettings, chartManager: ChartManager, bridge: ChartWidgetBridge);
|
|
790
|
+
toJSON(): null;
|
|
790
791
|
onReady(callback: (data: any) => void): Promise<void>;
|
|
791
792
|
destroy(): void;
|
|
792
793
|
resolveSymbol(symbolName: string, onResolve: ResolveCallback, onError: ErrorCallback, extension?: SymbolResolveExtension): Promise<void>;
|
|
@@ -794,6 +795,23 @@ declare class ChartDataFeed {
|
|
|
794
795
|
subscribeBars(symbolInfo: LibrarySymbolInfo, resolution: ResolutionString, onTick: SubscribeBarsCallback, listenerGuid: string, onResetCacheNeededCallback: () => void): void;
|
|
795
796
|
unsubscribeBars(listenerGuid: string): void;
|
|
796
797
|
getMarks(symbolInfo: LibrarySymbolInfo, from: number, to: number, onDataCallback: GetMarksCallback<Mark>, resolution: ResolutionString): Promise<void>;
|
|
798
|
+
/**
|
|
799
|
+
* TradingView calls getQuotes to populate the current-price display in the
|
|
800
|
+
* chart header. Without this method, TradingView's internal quote session
|
|
801
|
+
* (qs_*) is created but never resolved, triggering "Cannot read properties
|
|
802
|
+
* of undefined" errors. Returning an "ok" status with empty values tells
|
|
803
|
+
* TradingView that the datafeed supports the quotes API but has no quote data
|
|
804
|
+
* beyond what is already on the chart, which suppresses the internal errors.
|
|
805
|
+
*/
|
|
806
|
+
getQuotes(symbols: string[], onDataCallback: (data: any[]) => void, _onErrorCallback: (reason: string) => void): void;
|
|
807
|
+
/**
|
|
808
|
+
* TradingView calls subscribeQuotes to receive real-time price ticks for the
|
|
809
|
+
* header display. We return a no-op here because the chart already receives
|
|
810
|
+
* real-time data via subscribeBars. Implementing this stub prevents the
|
|
811
|
+
* internal qs_* session from remaining in a pending/broken state.
|
|
812
|
+
*/
|
|
813
|
+
subscribeQuotes(_symbols: string[], _fastSymbols: string[], _onRealtimeCallback: (data: any[]) => void, _listenerGuid: string): void;
|
|
814
|
+
unsubscribeQuotes(_listenerGuid: string): void;
|
|
797
815
|
}
|
|
798
816
|
|
|
799
817
|
/**
|
|
@@ -822,6 +840,7 @@ declare class ChartSaveLoadAdapter {
|
|
|
822
840
|
constructor(settings: ChartSettings, chartManager: ChartManager, bridge: ChartWidgetBridge);
|
|
823
841
|
get layoutId(): string;
|
|
824
842
|
get shouldResetColorPalette(): boolean;
|
|
843
|
+
toJSON(): null;
|
|
825
844
|
getAllCharts(): Promise<any[]>;
|
|
826
845
|
removeChart(_index: number): void;
|
|
827
846
|
saveChart(chart: any): Promise<string>;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var react=require('react'),jotai=require('jotai'),utils=require('jotai/utils'),lodashEs=require('lodash-es'),jsxRuntime=require('react/jsx-runtime');var j=(e=>(e.TradingView="TradingView",e.Original="Original",e))(j||{}),Dt=(e=>(e.Price="price",e.MarketCap="market_cap",e))(Dt||{}),Wt=(o=>(o.USD="USD",o.SOL="SOL",o.ETH="ETH",o.TRX="TRX",o.BNB="BNB",o))(Wt||{}),tt=(d=>(d[d.Bars=0]="Bars",d[d.Candles=1]="Candles",d[d.Line=2]="Line",d[d.Area=3]="Area",d[d.HeikenAshi=8]="HeikenAshi",d[d.HollowCandles=9]="HollowCandles",d[d.Baseline=10]="Baseline",d[d.HiLo=12]="HiLo",d[d.Column=13]="Column",d[d.LineWithMarkers=14]="LineWithMarkers",d[d.Stepline=15]="Stepline",d[d.HLCArea=16]="HLCArea",d[d.VolCandle=19]="VolCandle",d[d.Renko=4]="Renko",d[d.Kagi=5]="Kagi",d[d.PointAndFigure=6]="PointAndFigure",d[d.LineBreak=7]="LineBreak",d))(tt||{}),Bt=(e=>(e.Light="light",e.Dark="dark",e))(Bt||{}),et=(y=>(y.HeaderWidget="header_widget",y.HeaderCandleStyleMenu="header_candle_style_menu",y.HeaderFullscreenButton="header_fullscreen_button",y.MultiCharts="multi_charts",y.CreateVolumeIndicatorByDefault="create_volume_indicator_by_default",y.VolumeForceOverlay="volume_force_overlay",y.HideDrawingToolsByDefault="hide_drawing_tools_by_default",y.LegendSeriesTitle="legend_series_title",y.LegendVolume="legend_volume",y.TimeframesToolbar="timeframes_toolbar",y.SaveDrawingToServer="save_drawing_to_server",y))(et||{}),R=(g=>(g.Layout1A="1A",g.Layout2A="2A",g.Layout2B="2B",g.Layout3A="3A",g.Layout3B="3B",g.Layout3C="3C",g.Layout3D="3D",g.Layout3E="3E",g.Layout3F="3F",g.Layout4A="4A",g.Layout4B="4B",g.Layout4C="4C",g.Layout4D="4D",g.Layout4E="4E",g.Layout4F="4F",g.Layout5A="5A",g.Layout5B="5B",g.Layout5C="5C",g.Layout5D="5D",g.Layout6A="6A",g.Layout6B="6B",g.Layout6C="6C",g.Layout7A="7A",g.Layout8A="8A",g.Layout8B="8B",g.Layout8C="8C",g))(R||{}),Ot=(r=>(r[r.None=0]="None",r[r.ResetData=1]="ResetData",r[r.ResetChart=2]="ResetChart",r))(Ot||{});var ct=["header_widget","header_candle_style_menu","header_fullscreen_button","multi_charts","volume_force_overlay","legend_series_title","timeframes_toolbar","save_drawing_to_server"],S=["1s","30s","1m","1h","4h","1d"],T=["1s","15s","30s","1m","5m","15m","1h","4h","12h","1d"],ut=["1A","2A","2B","3A","3B","3C","3D","3E","3F","4A","4B","4C","4D","4E","4F","5A","5B","5C","5D","6A","6B","6C","7A","8A","8B","8C"],Nt=["click","keydown","mousedown","mouseup","contextmenu"],C={decrease:"#F04866",increase:"#1DB954",chartBg:"#1A1A1A",card:"#242424"},Ht={card:"#242424"};var _=utils.atomFamily(a=>jotai.atom(true)),I=utils.atomFamily(a=>jotai.atom(false)),f=utils.atomFamily(a=>jotai.atom(0)),x=utils.atomFamily(a=>jotai.atom([...S])),c=utils.atomFamily(a=>jotai.atom([])),w=utils.atomFamily(a=>jotai.atom(false)),M=utils.atomFamily(a=>jotai.atom("1A")),A=utils.atomFamily(a=>jotai.atom("TradingView")),D=utils.atomFamily(a=>jotai.atom("dark")),rt=utils.atomFamily(a=>jotai.atom("en")),at=utils.atomFamily(a=>jotai.atom("Etc/UTC")),it=utils.atomFamily(a=>jotai.atom("")),W=utils.atomFamily(a=>jotai.atom("kline")),ot=utils.atomFamily(a=>jotai.atom(false)),st=utils.atomFamily(a=>jotai.atom(null)),P=utils.atomFamily(a=>jotai.atom([])),F=utils.atomFamily(a=>jotai.atom([])),B=utils.atomFamily(a=>jotai.atom(false)),O=utils.atomFamily(a=>jotai.atom(t=>{let e=t(M(a)),r=t(A(a)),i=t(f(a)),o=t(x(a)),s=t(w(a)),n=t(c(a));return {layout:e,chartType:r,selectedIndex:i,pinnedResolutions:o,showDrawingToolbar:s,areaContents:n}}),lodashEs.isEqual);var V=class{settings;chartManager;chartIndex;store;prefix;pendingTickerSymbol=null;pendingResolution=null;constructor(t,e,r,i,o,s){this.settings=t,this.chartManager=e,this.chartIndex=r,this.store=i,this.prefix=o;let l={...{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false},...s};this.patchArea(l);}get state(){return this.store.get(c(this.prefix))[this.chartIndex]??{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false}}patchArea(t){let e=[...this.store.get(c(this.prefix))],r=e[this.chartIndex]??{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false};e[this.chartIndex]={...r,...t},this.store.set(c(this.prefix),e);}setState(t,e){e!=null&&this.patchArea({[t]:e});}get tickerSymbol(){return this.state.tickerSymbol}get symbol(){return this.state.symbol}get resolution(){return this.state.resolution}get chartStyle(){return this.state.chartStyle}get rightOffset(){return this.state.rightOffset}get barSpacing(){return this.state.barSpacing}get dataReady(){return this.state.dataReady}get internalChartWidget(){return this.chartManager.internalWidget?.chartByIndex(this.chartIndex)}setChartStyle(t){this.setState("chartStyle",t),this.internalChartWidget?.setChartStyle(t);}async setSymbol(t){if(this.state.tickerSymbol!==t){this.setState("tickerSymbol",t),this.setState("dataReady",false),this.pendingTickerSymbol=t;try{let e=[this.internalChartWidget?.handleSymbolChange(t,this.tickerSymbol),this.chartManager.symbolResolver?.resolveSymbolInfo(t).then(r=>{r&&this.setState("symbol",r.name);})];for(let r of await Promise.allSettled(e))if(r.status==="rejected")throw r.reason}catch(e){console.error(e);}finally{this.pendingTickerSymbol===t&&(this.pendingTickerSymbol=null);}this.tickerSymbol===t&&this.setState("dataReady",true);}}async setResolution(t){if(this.resolution!==t){this.setState("resolution",t),this.setState("dataReady",false),this.pendingResolution=t;try{await this.internalChartWidget?.handleResolutionChange(t,this.resolution);}finally{this.pendingResolution===t&&(this.pendingResolution=null);}}}toJSON(){return {...this.state}}widgetReady(){this.internalChartWidget?.dataReady()?.then(()=>this.handleChartReady())?.catch(()=>{});}get active(){return this.chartIndex<this.chartManager.chartCount}get selected(){return this.chartManager.selectedIndex===this.chartIndex}get symbolInfo(){return this.chartManager.symbolResolver?.getSymbolInfo(this.tickerSymbol)??null}destroy(){}async handleChartReady(){this.internalChartWidget&&(this.setState("dataReady",true),this.selected&&this.internalChartWidget.setBarSpacing(this.barSpacing));}};var N=class{prefix;settings;store;initialized=false;focused=false;reloadId=0;internalWidget=null;datafeed=null;symbolResolver=null;unsubAutoSave=null;constructor(t,e,r){this.prefix=t,this.store=e,this.settings=r;}get loading(){return this.store.get(_(this.prefix))}get fullscreen(){return this.store.get(I(this.prefix))}set fullscreen(t){this.store.set(I(this.prefix),t),t?document.body.classList.add("fullScreen"):document.body.classList.remove("fullScreen");}get selectedIndex(){return this.store.get(f(this.prefix))}set selectedIndex(t){this.store.set(f(this.prefix),t);}get pinnedResolutions(){return this.store.get(x(this.prefix))}set pinnedResolutions(t){this.store.set(x(this.prefix),t);}get showDrawingToolbar(){return this.store.get(w(this.prefix))}get chartCount(){return parseInt(this.settings.layout,10)||1}get areas(){let t=this.store.get(c(this.prefix));return this._areaManagers.slice(0,t.length)}_areaManagers=[];areaByIndex(t){return this.initialized&&this.updateChartContents(),this._areaManagers[t]??null}get activeArea(){return this.areaByIndex(this.selectedIndex)}async init(){if(this.initialized)return;let t=this.settings.saveLoadAdapter.getSettings();if(t?.selectedIndex!=null&&(this.selectedIndex=t.selectedIndex),t?.pinnedResolutions){let r=t.pinnedResolutions;r.length===S.length&&r.every(i=>S.includes(i))?this.pinnedResolutions=[...S]:this.pinnedResolutions=r;}if(t?.areaContents&&t.areaContents.forEach((r,i)=>{let o=new V(this.settings,this,i,this.store,this.prefix,r);this._areaManagers[i]=o;}),t?.showDrawingToolbar!=null&&this.store.set(w(this.prefix),t.showDrawingToolbar),this.settings.updateValue("layout",t?.layout),this.settings.updateValue("chartType",t?.chartType),this.settings.enableMultiCharts||this.settings.updateValue("layout","1A"),this.settings.enableHideDrawingToolsByDefault&&this.store.set(w(this.prefix),false),this.updateChartContents(),this.settings.tickerSymbol&&this.activeArea)try{await this.activeArea.setSymbol(this.settings.tickerSymbol);}catch(r){console.warn("ChartManager init failed to set symbol",r);}this.initialized=true;let e=lodashEs.debounce(()=>{let r=this.store.get(O(this.prefix));this.settings.saveLoadAdapter.saveSettings(r).catch(console.error);},1e3);this.unsubAutoSave=this.store.sub(O(this.prefix),e);}destroy(){this.unsubAutoSave?.(),this._areaManagers.forEach(t=>t.destroy()),this._areaManagers=[];}setLoading(t){this.store.set(_(this.prefix),t);}setLocale(t){this.settings.updateValue("locale",t);}setTimezone(t){this.settings.updateValue("timezone",t);}setFocused(t){this.focused=t;}setShowDrawingToolbar(t){this.store.set(w(this.prefix),t);}setInternalWidget(t){this.internalWidget=t,this.store.set(B(this.prefix),false);}onInternalWidgetReady(){this.store.set(B(this.prefix),true),this.areas.forEach((t,e)=>{e<this.chartCount&&t.widgetReady();});}setChartType(t){this.settings.updateValue("chartType",t);}setTheme(t){this.settings.theme!==t&&(this.settings.updateValue("theme",t),this.internalWidget?.onThemeChange?.(t,this.settings.reverseColor));}setReverseColor(t){this.settings.reverseColor!==t&&(this.settings.updateValue("reverseColor",t),this.internalWidget?.onThemeChange?.(this.settings.theme,t));}setLayout(t){let e=this.settings.enableMultiCharts?t:"1A";if(this.settings.layout!==e){this.settings.updateValue("layout",e),this.updateChartContents(),this.internalWidget?.onLayoutChange?.(e);let r=this.chartCount;setTimeout(()=>{if(this.store.get(B(this.prefix)))for(let i=r;i<this.chartCount;i++)this.areaByIndex(i)?.widgetReady();});}}reloadChart(){this.reloadId+=1;}updateChartContents(){if(this.chartCount>this._areaManagers.length)for(let t=this._areaManagers.length;t<this.chartCount;t++){let e=this._areaManagers[this.selectedIndex],r=e?.toJSON(),i=new V(this.settings,this,t,this.store,this.prefix,r);this._areaManagers[t]=i,this.selectedIndex!==t&&!e&&i.setSymbol(this.settings.tickerSymbol).catch(()=>{});}this.selectedIndex>=this.chartCount&&(this.selectedIndex=this.chartCount-1);}get settingsData(){return this.store.get(O(this.prefix))}getAllCharts(){return this.updateChartContents(),this._areaManagers.slice(0,this.chartCount)}};var H=class{storageId;constructor(t){this.storageId=t;}get settingsKey(){return `${this.storageId}.TvChart.Settings`}get shapesKey(){return `${this.storageId}.TvChart.Shapes`}getSettings(){let t=this.getLocalSettingsData(),e=this.getChartStoreData();return {layout:e?.layout,selectedIndex:e?.currentAreaIndex,chartType:e?.chartType,pinnedResolutions:e?.pinnedResolutions,areaContents:e?.areas?.map(i=>({resolution:i.resolution||i.period||"1m",chartStyle:i.chartStyle,symbol:i.symbol,tickerSymbol:i.tickerSymbol,rightOffset:i.rightOffset,barSpacing:i.barSpacing})),showDrawingToolbar:e?.drawing?.toolbarSwitch,drawing:t?.drawing?{...t.drawing,defaultStates:lodashEs.omit(t,["drawing","DrawingToolGroupLastUsedTool","riskRewardAvailableChanged","riskRewardRiskSizeChanged","drawingShapeTemplate"]),lastUsedTools:t.DrawingToolGroupLastUsedTool,riskRewardAvailableChanged:t.riskRewardAvailableChanged,riskRewardRiskSizeChanged:t.riskRewardRiskSizeChanged,drawingShapeTemplate:t.drawingShapeTemplate}:void 0}}getChartStoreData(){return this.getLocalData(this.storageId)}setChartStoreData(t){this.setLocalData(this.storageId,t);}async saveSettings(t){let e=this.getChartStoreData(),r={...e,layout:t.layout,currentAreaIndex:t.selectedIndex,chartType:t.chartType,pinnedResolutions:t.pinnedResolutions,areas:t.areaContents?.map((i,o)=>({...e?.areas?.[o],...i})),drawing:{...e?.drawing,toolbarSwitch:t.showDrawingToolbar}};this.setChartStoreData(r);}async getShapes(t){let e=this.getLocalShapesData();return !e||!e[t]?[]:Object.values(e[t])}async saveShapes(t,e){let r=this.getLocalShapesData()||{};r[t]={...r[t],...e},Object.keys(r[t]).forEach(i=>{r[t][i]||delete r[t][i];}),this.setLocalShapesData(r);}getLocalData(t){try{let e=localStorage.getItem(t);return e?JSON.parse(e):null}catch{return null}}setLocalData(t,e){localStorage.setItem(t,JSON.stringify(e));}getLocalSettingsData(){return this.getLocalData(this.settingsKey)}getLocalShapesData(){return this.getLocalData(this.shapesKey)}setLocalShapesData(t){this.setLocalData(this.shapesKey,t);}};function nt(a){let[t,e,r,i]=a.split("/");return {address:e,chain:t,quote:r,priceType:i}}function ue(a){return !a.quote||!a.priceType?`${a.chain}/${a.address}`:`${a.chain}/${a.address}/${a.quote}/${a.priceType}`}function lt(a){return `${a.chain}/${a.address}`}var me={dark:"Dark",light:"Light"};function E(a){return me[a.toLowerCase()]??"Dark"}var Ut={"1s":"1S","5s":"5S","15s":"15S","30s":"30S","1m":"1","5m":"5","15m":"15","30m":"30","1h":"60","4h":"240","12h":"720","1d":"1D"};function v(a="1m"){return Ut[a]??Ut["1m"]}var pe={"1S":"1s","5S":"5s","15S":"15s","30S":"30s",1:"1m",5:"5m",15:"15m",30:"30m",60:"1h",240:"4h",720:"12h","1D":"1d"};function mt(a){return pe[a]??"1s"}var ye={en:"en","zh-CN":"zh","zh-TW":"zh"};function fe(a){return ye[a]??a}var zt={"1A":"s","2A":"2h","2B":"2v","3A":"3s","3B":"3h","3C":"3v","3D":"2-1","3E":"1-2","3F":"3r","4A":"4","4B":"4h","4C":"4v","4D":"4s","4E":"1-3","4F":"2-2","5A":"1-4","5B":"5s","5C":"2-3","5D":"5h","6A":"6","6B":"6c","6C":"6h","7A":"7h","8A":"8","8B":"8c","8C":"8h"};function U(a){return zt[a]??"s"}var Ce=Object.fromEntries(Object.entries(zt).map(([a,t])=>[t,a]));function pt(a){return Ce[a]??"1A"}var be={"1s":1e3,"5s":5e3,"15s":15e3,"30s":3e4,"1m":6e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"4h":144e5,"12h":432e5,"1d":864e5};function ve(a){let t=be[a];if(!t)throw new Error(`Invalid interval: ${a}`);return t}function Se(a,t){let e=a.toString().length>10?a:1e3*a;return Math.floor(e/t)*t}var z=class{prefix;store;supportedResolutions=T.map(v);supportedLayouts=ut;supportedChartTypes=["TradingView"];chartNames={};priceFormatterFactory=null;saveLoadAdapter;constructor(t,e){this.prefix=t,this.store=e,this.saveLoadAdapter=new H(t),this.store.set(W(t),t);}get layout(){return this.store.get(M(this.prefix))}get chartType(){return this.store.get(A(this.prefix))}get theme(){return this.store.get(D(this.prefix))}get reverseColor(){return this.store.get(ot(this.prefix))}get locale(){return this.store.get(rt(this.prefix))}get timezone(){return this.store.get(at(this.prefix))}get tickerSymbol(){return this.store.get(it(this.prefix))}get storageId(){return this.store.get(W(this.prefix))}get backgroundColor(){return this.store.get(st(this.prefix))}get enabledFeatures(){return this.store.get(P(this.prefix))}get disabledFeatures(){return this.store.get(F(this.prefix))}updateValue(t,e){if(e==null)return;let i={layout:()=>this.store.set(M(this.prefix),e),chartType:()=>this.store.set(A(this.prefix),e),theme:()=>this.store.set(D(this.prefix),e),reverseColor:()=>this.store.set(ot(this.prefix),e),locale:()=>this.store.set(rt(this.prefix),e),timezone:()=>this.store.set(at(this.prefix),e),tickerSymbol:()=>this.store.set(it(this.prefix),e),storageId:()=>this.store.set(W(this.prefix),e),backgroundColor:()=>this.store.set(st(this.prefix),e),enabledFeatures:()=>this.store.set(P(this.prefix),e),disabledFeatures:()=>this.store.set(F(this.prefix),e)}[t];i&&i();}isFeatureEnabled(t){return !this.disabledFeatures.includes(t)&&this.enabledFeatures.includes(t)||ct.includes(t)}setFeature(t,e){this.resetFeature(t),e?this.store.set(P(this.prefix),[...this.enabledFeatures,t]):this.store.set(F(this.prefix),[...this.disabledFeatures,t]);}resetFeature(t){this.store.set(P(this.prefix),this.enabledFeatures.filter(e=>e!==t)),this.store.set(F(this.prefix),this.disabledFeatures.filter(e=>e!==t));}get enableMultiCharts(){return this.isFeatureEnabled("multi_charts")}get enableCreateVolumeIndicatorByDefault(){return this.isFeatureEnabled("create_volume_indicator_by_default")}get enableHideDrawingToolsByDefault(){return this.isFeatureEnabled("hide_drawing_tools_by_default")}get enableLegendSeriesTitle(){return this.isFeatureEnabled("legend_series_title")}get enableLegendVolume(){return this.isFeatureEnabled("legend_volume")}get enableTimeframesToolbar(){return this.isFeatureEnabled("timeframes_toolbar")}get enableVolumeForceOverlay(){return this.isFeatureEnabled("volume_force_overlay")}sub(t,e){let i={layout:M(this.prefix),chartType:A(this.prefix),theme:D(this.prefix)}[t];return i?this.store.sub(i,e):()=>{}}};var $=class{datafeed;cache=new Map;pendingRequests=new Map;constructor(t){this.datafeed=t;}async resolveSymbolInfo(t){return this.datafeed.resolveSymbol(t)}async resolveSymbolInfos(t){return t.filter(r=>!this.cache.has(r)&&!this.pendingRequests.has(r)).forEach(r=>{let i=this.resolveSymbolInfo(r);i.then(o=>{o&&this.cache.set(r,o);}).finally(()=>this.pendingRequests.delete(r)),this.pendingRequests.set(r,i);}),await Promise.all(t.filter(r=>this.pendingRequests.has(r)).map(r=>this.pendingRequests.get(r))),t.map(r=>this.cache.get(r)??null).filter(r=>r!==null)}getSymbolInfo(t){return this.resolveSymbolInfo(t).catch(e=>{console.error("ChartSymbolResolver.getSymbolInfo",e);}),this.cache.get(t)??null}};var yt=({initConfig:a,children:t})=>{let{chartManager:e,chartSettings:r}=h(),[i,o]=react.useState(false);return react.useEffect(()=>{e.initialized||(r.updateValue("tickerSymbol",a.tickerSymbol),r.updateValue("theme",a.theme),r.updateValue("reverseColor",a.reverseColor),r.updateValue("layout",a.layout),r.updateValue("chartType",a.chartType),r.updateValue("timezone",a.timezone),r.updateValue("locale",a.locale),r.updateValue("backgroundColor",a.backgroundColor),r.updateValue("storageId",a.storageId),r.updateValue("enabledFeatures",a.enabledFeatures),r.updateValue("disabledFeatures",a.disabledFeatures),a.chartNames&&(r.chartNames=a.chartNames),a.priceFormatterFactory&&(r.priceFormatterFactory=a.priceFormatterFactory),a.supportedResolutions&&(r.supportedResolutions=a.supportedResolutions),a.supportedLayouts&&(r.supportedLayouts=a.supportedLayouts),a.supportedChartTypes&&(r.supportedChartTypes=a.supportedChartTypes),e.datafeed=a.datafeed,e.symbolResolver=new $(a.datafeed));},[e,r,a]),react.useEffect(()=>(e.init().then(()=>o(true)).catch(s=>{console.error("TradingViewConfig chartManager init error",s);}),()=>{e.destroy();}),[e]),e.initialized?jsxRuntime.jsx(jsxRuntime.Fragment,{children:t}):null};var qt=react.createContext(null);function h(){let a=react.useContext(qt);if(!a)throw new Error("useTvChartContext must be used within TradingViewProvider");return a}function Ae(){return h().chartManager}function Pe(){return h().prefix}var ht=class{setting;chartManager;constructor(t,e){this.setting=t,this.chartManager=e;}get internalWidget(){return this.chartManager.internalWidget}chartCount(){return this.chartManager.chartCount}setActiveChart(t){t<this.chartCount()&&(this.chartManager.selectedIndex=t);}layout(){return this.setting.layout}setLayout(t){this.chartManager.setLayout(t);}theme(){return this.setting.theme}setTheme(t){this.chartManager.setTheme(t);}setChartType(t){this.chartManager.setChartType(t);}getSetting(){return this.setting}getChartManager(){return this.chartManager}},ft=react.forwardRef(({children:a,initConfig:t,widgetConstructor:e,libraryPath:r,customCssUrl:i},o)=>{let s=jotai.useStore(),n=t.storageId,l=react.useMemo(()=>new z(n,s),[n,s]),u=react.useMemo(()=>new N(n,s,l),[n,s,l]),b=react.useMemo(()=>new ht(l,u),[l,u]);react.useImperativeHandle(o,()=>b,[b]);let y=react.useMemo(()=>({prefix:n,chartSettings:l,chartManager:u,widgetConstructor:e,libraryPath:r,customCssUrl:i}),[n,l,u,e,r,i]);return jsxRuntime.jsx(qt.Provider,{value:y,children:jsxRuntime.jsx(yt,{initConfig:t,children:a})})});var Ct=react.memo(()=>{let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(I(a)),r=react.useCallback(()=>{t.fullscreen=!t.fullscreen;},[t]);return jsxRuntime.jsx("button",{type:"button",onClick:r,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:e?"Exit fullscreen":"Fullscreen",children:e?"Exit":"Fullscreen"})});var Yt=react.createContext(null);function J(){let a=react.useContext(Yt);if(!a)throw new Error("useTvChartToolbarContext must be used within TradingViewToolbarProvider");return a}var vt=({children:a})=>{let{prefix:t,chartManager:e}=h(),r=jotai.useAtomValue(f(t)),i=jotai.useAtomValue(c(t)),o=react.useMemo(()=>i.length?e.areaByIndex(r):null,[e,r,i]),s=react.useMemo(()=>o?.symbolInfo??null,[o]),n=react.useMemo(()=>({activeAreaManager:o,symbolInfo:s}),[o,s]);return jsxRuntime.jsx(Yt.Provider,{value:n,children:a})};var Xt={0:"Bars",1:"Candles",2:"Line",3:"Area",8:"Heiken Ashi",9:"Hollow",10:"Baseline"},He=[1,0,2,3,9,8,10],St=react.memo(()=>{let {prefix:a}=h(),{activeAreaManager:t}=J(),e=jotai.useAtomValue(c(a)),r=jotai.useAtomValue(f(a)),i=e[r]?.chartStyle??1,s=react.useCallback(n=>{let l=parseInt(n.target.value,10);t?.setChartStyle(l);},[t]);return jsxRuntime.jsx("select",{value:i,onChange:s,className:"text-xs bg-transparent text-muted-foreground hover:text-foreground cursor-pointer border-none outline-none px-1 py-0.5",title:"K-line style",children:He.map(n=>jsxRuntime.jsx("option",{value:n,children:Xt[n]??n},n))})});var Tt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(()=>{a.internalWidget?.openIndicatorSettingsDialog();},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Indicators",children:"Indicators"})});var xt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(()=>{a.internalWidget?.openSettingsDialog();},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Chart settings",children:"Settings"})});var Lt=react.memo(()=>{let{prefix:a,chartManager:t}=h(),{activeAreaManager:e}=J(),r=jotai.useAtomValue(x(a)),i=jotai.useAtomValue(c(a)),o=jotai.useAtomValue(f(a)),s=i[o]?.resolution,n=react.useCallback(l=>{e?.setResolution(l);},[e]);return jsxRuntime.jsx("div",{className:"flex items-center gap-0.5",children:r.map(l=>jsxRuntime.jsx("button",{type:"button",onClick:()=>n(l),className:`px-2 py-0.5 text-xs rounded cursor-pointer transition-colors ${s===l?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted"}`,children:l},l))})});var Rt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(async()=>{try{let e=await a.internalWidget?.takeClientScreenshot();if(!e)return;let r=document.createElement("a");r.download=`chart-${Date.now()}.png`,r.href=e.toDataURL("image/png"),r.click();}catch(e){console.error("TradingViewSnapshot",e);}},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Take snapshot",children:"Snapshot"})});var It=react.memo(({children:a,prefix:t,suffix:e,showResolutions:r=true,showKlineStyleSelect:i=true,showOpenIndicator:o=true,showOpenSettings:s=true,showFullscreen:n=true,showSnapshot:l=true})=>jsxRuntime.jsx(vt,{children:jsxRuntime.jsxs("div",{className:"flex items-center gap-1 px-2 py-1 border-b border-border min-h-[36px] flex-shrink-0",children:[t,a??jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[r&&jsxRuntime.jsx(Lt,{}),jsxRuntime.jsxs("div",{className:"flex items-center gap-0.5 ml-auto",children:[i&&jsxRuntime.jsx(St,{}),o&&jsxRuntime.jsx(Tt,{}),s&&jsxRuntime.jsx(xt,{}),l&&jsxRuntime.jsx(Rt,{}),n&&jsxRuntime.jsx(Ct,{})]})]}),e]})}));var q=class{settings;chartManager;bridge;chartIndex;constructor(t,e,r,i){this.settings=t,this.chartManager=e,this.bridge=r,this.chartIndex=i;}get chartAreaManager(){return this.chartManager.areaByIndex(this.chartIndex)}get widget(){return this.bridge.getWidget()}get chartWidget(){return this.widget?.chart(this.chartIndex)??null}setChartStyle(t){this.chartWidget?.setChartType(t);}getChartStyle(){return this.chartWidget?.chartType()??1}handleSymbolChange(t,e){return this.bridge.asyncWidgetMethodContext((r,i)=>{r.chart(this.chartIndex).setSymbol(t,{dataReady:()=>i(),doNotActivateChart:false});})}handleResolutionChange(t,e){return this.bridge.asyncWidgetMethodContext((r,i)=>{let o=r.chart(this.chartIndex);o.dataReady(()=>{o.setResolution(v(t),{dataReady:i,doNotActivateChart:true}).catch(()=>{});});})}setPrecision(t){this.widget?.applyOverrides({"mainSeriesProperties.minTick":t===null?"default":`${Math.pow(10,t)},1,false`});}async dataReady(){if(await this.bridge.onReady(),!this.chartWidget)throw Error("ChartWidget: chartWidget is null");return new Promise(t=>{this.chartWidget?.dataReady(()=>setTimeout(t));})}timeScaleWidth(){return this.chartWidget?.getTimeScale()?.width()??NaN}rightOffset(){return this.chartWidget?.getTimeScale()?.rightOffset()??NaN}setRightOffset(t){this.chartWidget?.getTimeScale()?.setRightOffset(t);}barSpacing(){return this.chartWidget?.getTimeScale()?.barSpacing()??NaN}setBarSpacing(t){this.chartWidget?.getTimeScale()?.setBarSpacing(t);}};var G=class{settings;chartManager;bridge;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r;}get widget(){return this.bridge.getWidget()}chartByIndex(t){return new q(this.settings,this.chartManager,this.bridge,t)}activeChart(){let t=this.widget?.activeChartIndex();return t===void 0?void 0:this.chartByIndex(t)}openIndicatorSettingsDialog(){this.widget?.activeChart().executeActionById("insertIndicator");}openSettingsDialog(){this.widget?.activeChart().executeActionById("chartProperties");}takeClientScreenshot(){return this.widget?.takeClientScreenshot()}onLayoutChange(t){this.widget?.setLayout(U(t));}async onThemeChange(t,e){let r=E(t);await this.widget?.changeTheme(r,{disableUndo:true}),this.bridge.applyColorPaletteOverrides();}};var Y=class{listeners=new Map;on(t,e){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e),()=>{this.listeners.get(t)?.delete(e);}}emit(t,e){this.listeners.get(t)?.forEach(r=>r(e));}off(t,e){this.listeners.get(t)?.delete(e);}clear(){this.listeners.clear();}};var K=class{settings;chartManager;bridge;abortController=new AbortController;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r;}async onReady(t){setTimeout(()=>{t({supported_resolutions:T.map(v),supports_marks:true,exchanges:[]});}),await this.chartManager.datafeed?.onReady({setting:this.settings,chartManager:this.chartManager,instance:this.bridge});}destroy(){this.abortController.abort();}async resolveSymbol(t,e,r,i){try{let o=await this.chartManager.datafeed?.resolveSymbol(t,i);o&&e(o);}catch(o){console.error("ChartDataFeed.resolveSymbol",o),r(o);}}async getBars(t,e,r,i,o){try{let s=await this.chartManager.datafeed?.getBars(t,e,r);s&&i(s,{noData:s.length===0});}catch(s){console.error("ChartDataFeed.getBars",s),o(s);}}subscribeBars(t,e,r,i,o){this.chartManager.datafeed?.subscribeBars(t,e,r,i,o);}unsubscribeBars(t){this.chartManager.datafeed?.unsubscribeBars(t);}async getMarks(t,e,r,i,o){this.chartManager.datafeed?.getMarks?.(t,e,r,i,o);}};var X=class{settings;chartManager;bridge;data;drawings;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r,this.data=null,this.drawings=null,this.loadDataFromLocalStorage();}get layoutId(){return this.settings.storageId}get shouldResetColorPalette(){let t=this.data?.theme,e=this.data?.reverseColor;return t!==this.settings.theme||e!==this.settings.reverseColor}getAllCharts(){return new Promise(t=>{let e=[];this.data&&e.push({id:this.data.id,name:this.data.name,symbol:this.data.symbol,resolution:this.data.resolution,timestamp:this.data.timestamp}),t(e);})}removeChart(t){throw Error("Method not implemented.")}async saveChart(t){return this.data={...t,theme:this.settings.theme,reverseColor:this.settings.reverseColor,id:this.layoutId,timestamp:0},this.saveDataToLocalStorage(),this.data.id}getChartContent(t){return new Promise(e=>{let r=JSON.parse(this.data.content),i=JSON.parse(r.charts_symbols),o=JSON.parse(r.content);e(JSON.stringify({...r,chart_symbols:JSON.stringify(i),content:JSON.stringify(o)}));})}async saveLineToolsAndGroups(t,e,r){this.drawings=this.drawings||{data:{},timestamp:0},this.drawings.data=this.drawings.data||{},this.drawings.data[e]=this.drawings.data[e]||{};try{if(!r.sources)return;for(let[i,o]of r.sources)if(!o||!o.symbol||!o.state||Object.keys(o.state).length===0||i.includes("/"))o===null&&delete this.drawings.data[e][i];else {let{address:s,chain:n}=nt(o.symbol),l=lt({address:s,chain:n}),u={...o,symbol:l,id:o.id.indexOf("/")>0?o.id.split("/")[0]:o.id};this.drawings.data[e][i]=u;}this.saveDataToLocalStorage();}catch(i){console.error("saveLineToolsAndGroups",i);}}async loadLineToolsAndGroups(t,e,r,i){if(!i?.symbol||!this.drawings?.data?.[e])return null;let o=i.symbol,{address:s,chain:n}=nt(o),l=lt({address:s,chain:n}),u=lodashEs.uniqBy(Object.values(lodashEs.cloneDeep(this.drawings.data[e])).filter(b=>b.symbol===l),"id");try{return {sources:new Map(u.map(b=>{let y=lodashEs.cloneDeep({...b,symbol:o});return [y.id,y]}))}}catch(b){return console.error("ChartSaveLoadAdapter.loadLineToolsAndGroups",b),null}}getLayoutKey(t){return `charts.tradingview.data.${t}`}getDrawingKey(t){return `charts.tradingview.drawing.${t}`}loadDataFromLocalStorage(){let t=this.getLayoutKey(this.layoutId),e=this.getDrawingKey(this.layoutId),r=localStorage.getItem(t),i=localStorage.getItem(e);if(r)try{let o=JSON.parse(r),s=JSON.parse(o.content);o.content=JSON.stringify(s),this.data=o;}catch(o){console.error("ChartSaveLoadAdapter loadDataFromLocalStorage parse layout error",o);}if(i)try{this.drawings=JSON.parse(i);}catch(o){console.error("ChartSaveLoadAdapter loadDataFromLocalStorage parse drawing error",o);}}saveDataToLocalStorage(){let t=this.getLayoutKey(this.layoutId),e=this.getDrawingKey(this.layoutId),r=Math.round(Date.now()/1e3);this.data&&(this.data.timestamp=r,localStorage.setItem(t,JSON.stringify(this.data))),this.drawings&&(this.drawings.timestamp=r,localStorage.setItem(e,JSON.stringify(this.drawings)));}};var Mt="trading.chart.proterty",Z=class{storagePrefix;initialSettings;constructor(t,e,r){this.storagePrefix=`tradingview.${t.storageId}.`,this.initialSettings={};for(let o=0;o<localStorage.length;o++){let s=localStorage.key(o);if(s&&s.startsWith(this.storagePrefix)){let n=s.slice(this.storagePrefix.length);this.initialSettings[n]=localStorage.getItem(s);}}let i={noConfirmEnabled:1};if(this.initialSettings[Mt])try{let o=JSON.parse(this.initialSettings[Mt]);Object.assign(i,o),Object.assign(i,{noConfirmEnabled:!0});}catch(o){console.error("ChartSettingsAdapter: failed to parse chart settings",o);}this.initialSettings[Mt]=JSON.stringify(i);}toJSON(){return null}removeValue(t){delete this.initialSettings[t],localStorage.removeItem(`${this.storagePrefix}${t}`);}setValue(t,e){this.initialSettings[t]=e,localStorage.setItem(`${this.storagePrefix}${t}`,e);}};var Q=class{settings;chartManager;WidgetCtor;moduleInstances=new Map;symbolIntervalSubs=new Map;abortController=new AbortController;widgetReadyPromise=null;readyPromise=null;widget=null;container=null;ready=false;layoutReady=true;events=new Y;libraryPath;customCssUrl;constructor(t,e,r,i){this.settings=t,this.chartManager=e,this.WidgetCtor=r,this.libraryPath=i?.libraryPath??"/static/charting_library/",this.customCssUrl=i?.customCssUrl??"/static/charting_library/custom-styles.css",this.initModules();}getWidget(){return this.widget}async init(t){if(this.widgetReadyPromise)throw new Error("ChartWidgetBridge already initialized.");let e=this.getWidgetOptions();this.container=t,this.widget=new this.WidgetCtor({...e,container:t});let r=new Promise(i=>{this.widget?.onChartReady(()=>i());});this.widgetReadyPromise=r,this.readyPromise=r.then(()=>{this.ready=true,this.handleChartReady();}),this.moduleInstances.forEach((i,o)=>{try{i.init?.call(i);}catch(s){console.warn(`ChartWidgetBridge init module ${o}`,s);}}),await Promise.race([this.readyPromise,new Promise((i,o)=>setTimeout(o,6e4,new Error("ChartWidgetBridge init timeout")))]);}async destroy(){this.moduleInstances.forEach(t=>t.destroy?.call(t)),this.symbolIntervalSubs.forEach(t=>t()),this.symbolIntervalSubs.clear(),this.events.clear(),this.abortController.abort(),this.ready=false,this.widgetReadyPromise=null,this.readyPromise=null,this.widget?.remove(),this.widget=null;}async onReady(){return new Promise((t,e)=>{this.widget?this.widget.onChartReady(()=>this.readyPromise?.then(t).catch(e)):e(Error("cannot call `onReady` before `init`"));})}async asyncWidgetMethodContext(t){return new Promise((e,r)=>{if(!this.widgetReadyPromise){r(new Error("ChartWidgetBridge: widget not ready"));return}let i=this.widgetReadyPromise.then(()=>this.waitForLayout()),o=this.abortController.signal,s=()=>r(o.reason);o.addEventListener("abort",s),i.then(()=>t(this.widget,e)).catch(r).finally(()=>o.removeEventListener("abort",s));})}getModule(t){return this.moduleInstances.get(t)}applyColorPaletteOverrides(){this.widget?.applyOverrides(this.getColorPaletteOverrides()),this.widget?.applyStudiesOverrides(this.getColorPaletteStudiesOverrides());}getWidgetOptions(){let t=["header_widget","legend_inplace_edit","display_market_status","save_shortcut","show_interval_dialog_on_key_press","symbol_info","symbol_search_hot_key","uppercase_instrument_names","show_symbol_logo_in_legend","show_symbol_logo_for_compare_studies","drawing_templates"],e=["determine_first_data_request_size_using_visible_range","request_only_visible_range_on_reset","show_exchange_logos","show_symbol_logos","dont_show_boolean_study_arguments","hide_last_na_study_output","hide_right_toolbar","seconds_resolution","saveload_separate_drawings_storage","volume_force_overlay","create_volume_indicator_by_default","two_character_bar_marks_labels"];return this.settings.enableHideDrawingToolsByDefault&&e.push("hide_left_toolbar_by_default"),this.settings.enableTimeframesToolbar||t.push("timeframes_toolbar"),this.settings.enableCreateVolumeIndicatorByDefault||t.push("create_volume_indicator_by_default"),this.settings.enableVolumeForceOverlay||t.push("volume_force_overlay"),{container:"",autosize:true,debug:false,load_last_chart:true,auto_save_delay:1,timezone:this.localTimezone,library_path:this.libraryPath,custom_css_url:this.customCssUrl,theme:E(this.settings.theme),custom_font_family:window.getComputedStyle(document.body).fontFamily,symbol:this.chartManager.activeArea?.tickerSymbol,interval:v(this.chartManager.activeArea?.resolution),locale:this.settings.locale,datafeed:this.getModule("datafeed"),save_load_adapter:this.getModule("saveLoadAdapter"),settings_adapter:this.getModule("settingsAdapter"),custom_formatters:{priceFormatterFactory:this.settings.priceFormatterFactory?(r,i)=>this.settings.priceFormatterFactory(r,i):()=>({})},overrides:{...this.getSettingsOverrides(),...this.getColorPaletteOverrides()},studies_overrides:this.getColorPaletteStudiesOverrides(),disabled_features:t,enabled_features:e,supported_resolutions:T.map(v)}}async handleChartReady(){let t=U(this.settings.layout);t!==this.widget?.layout()&&await this.waitForLayout(t),this.widget?.setActiveChart(this.chartManager.selectedIndex),this.getModule("saveLoadAdapter")?.shouldResetColorPalette&&(await this.widget?.changeTheme(E(this.settings.theme),{disableUndo:true}),this.applyColorPaletteOverrides()),this.widget?.subscribe("onAutoSaveNeeded",this.onAutoSaveNeeded.bind(this)),this.widget?.subscribe("activeChartChanged",this.activeChartChanged.bind(this)),this.widget?.subscribe("layout_about_to_be_changed",this.layoutWillChange.bind(this)),this.widget?.subscribe("layout_changed",this.layoutChanged.bind(this)),this.syncChartsChanges(),this.subscribeChartsChanges(),this.installEventHooks(),this.resetTimezone();}onAutoSaveNeeded(){try{this.widget?.saveChartToServer(void 0,void 0,{defaultChartName:"DEFAULT"});}catch(t){console.warn("ChartWidgetBridge.onAutoSaveNeeded",t);}}activeChartChanged(t){this.chartManager.selectedIndex=t,this.chartManager.settings.saveLoadAdapter.saveSettings(this.chartManager.settingsData);}layoutWillChange(t){this.layoutReady=false,this.chartManager.setLayout(pt(t));}layoutChanged(){this.layoutReady=true,this.syncChartsChanges(),this.subscribeChartsChanges(),this.widget?.unloadUnusedCharts(),this.widget?.saveChartToServer();}syncChartsChanges(){this.widget?.symbolSync()?.setValue(false),this.widget?.intervalSync()?.setValue(false);let t=this.widget?.chartsCount()??0;for(let e=0;e<t;e++){let r=this.chartManager.areaByIndex(e),i=this.widget.chart(e);i.setSymbol(r?.tickerSymbol??"",{doNotActivateChart:true}),i.setResolution(v(r?.resolution),{doNotActivateChart:true});}}subscribeChartsChanges(){let t=this.widget?.chartsCount()??0;this.symbolIntervalSubs.forEach((e,r)=>{parseInt(r)>=t&&(e(),this.symbolIntervalSubs.delete(r));});for(let e=0;e<t;e++){if(this.symbolIntervalSubs.has(`${e}`))continue;let r=this.chartManager.areaByIndex(e),i=this.widget.chart(e);i.getPanes().forEach(u=>u.getMainSourcePriceScale()?.setAutoScale(true));let o=i.onSymbolChanged(),s=i.onIntervalChanged(),n=()=>{this.events.emit("symbolChanged",[e,i.symbol()]),r?.setSymbol(i.symbol()).catch(()=>{}),this.onAutoSaveNeeded();},l=u=>{let b=mt(u);this.events.emit("resolutionChanged",[e,b]),r?.setResolution(b).catch(()=>{});};o.subscribe(r,n),s.subscribe(r,l),this.symbolIntervalSubs.set(`${e}`,()=>{o.unsubscribe(r,n),s.unsubscribe(r,l);});}}installEventHooks(){let t=this.container?.lastElementChild,e=t?.contentWindow?.document;if(e&&(e.addEventListener("click",()=>t?.click()),e.defaultView?.MutationObserver)){let r=new WeakSet,i=e.querySelector(".layout__area--center");if(i){let o=()=>{i.querySelectorAll(".chart-container").forEach((s,n)=>{r.has(s)||(r.add(s),Nt.forEach(l=>{s.addEventListener(l,u=>this.events.emit("domEvent",[n,l,u]),{passive:true});}));});};new e.defaultView.MutationObserver(o).observe(i,{childList:true}),o();}}}resetTimezone(){try{let t=this.widget?.chartsCount()??0;for(let e=0;e<t;e++)this.widget?.chart(e)?.getTimezoneApi()?.setTimezone(this.localTimezone);}catch(t){console.error("ChartWidgetBridge: Reset timezone",t);}}get localTimezone(){return Intl.DateTimeFormat().resolvedOptions().timeZone}async waitForLayout(t){if(!this.widget||this.layoutReady&&!t)return;let e;return new Promise(i=>{e=i,this.widget.subscribe("layout_changed",i),t&&this.widget.setLayout(t);}).finally(()=>{this.widget.unsubscribe("layout_changed",e);})}getSettingsOverrides(){return {"mainSeriesProperties.minTick":"default","paneProperties.legendProperties.showSeriesTitle":this.settings.enableLegendSeriesTitle}}getColorPaletteOverrides(){let t=this.settings.theme==="dark"?C.card:Ht.card;return {"paneProperties.background":C.chartBg,"paneProperties.backgroundType":"solid",volumePaneSize:"medium","mainSeriesProperties.candleStyle.upColor":C.increase,"mainSeriesProperties.barStyle.upColor":C.increase,"mainSeriesProperties.columnStyle.upColor":C.increase,"mainSeriesProperties.candleStyle.downColor":C.decrease,"mainSeriesProperties.barStyle.downColor":C.decrease,"mainSeriesProperties.columnStyle.downColor":C.decrease,"mainSeriesProperties.candleStyle.borderUpColor":C.increase,"mainSeriesProperties.candleStyle.borderDownColor":C.decrease,"mainSeriesProperties.candleStyle.wickUpColor":C.increase,"mainSeriesProperties.candleStyle.wickDownColor":C.decrease,"linetoolorder.bodyBackgroundColor":t,"linetoolorder.bodyBackgroundTransparency":0}}getColorPaletteStudiesOverrides(){return {"volume.volume.color.0":C.decrease,"volume.volume.color.1":C.increase,"volume.volume.transparency":80}}initModules(){Object.entries({datafeed:K,saveLoadAdapter:X,settingsAdapter:Z}).forEach(([e,r])=>{this.moduleInstances.set(e,new r(this.settings,this.chartManager,this));});}};var At=react.memo(()=>null);var Ft=react.forwardRef(({onReady:a},t)=>{let{chartManager:e,chartSettings:r,widgetConstructor:i,libraryPath:o,customCssUrl:s}=h(),n=react.useRef(a),[l,u]=react.useState(),[b,y]=react.useState(null),[Et,kt]=react.useState(false);return react.useEffect(()=>{Et&&n.current&&setTimeout(n.current);},[Et]),react.useImperativeHandle(t,()=>l,[l]),react.useEffect(()=>{if(!b)return;let gt=new Q(r,e,i,{libraryPath:o,customCssUrl:s}),le=new G(r,e,gt);return u(le),gt.init(b).then(()=>kt(true)).catch(de=>{console.error("TradingViewWidgetContainer: failed to init bridge",de);}),()=>{gt.destroy().then(()=>{u(void 0),kt(false);}).catch(()=>{console.error("TradingViewWidgetContainer: failed to destroy bridge");});}},[b,r,e,i,o,s]),jsxRuntime.jsxs("div",{className:"w-full h-full",children:[jsxRuntime.jsx(At,{}),jsxRuntime.jsx("div",{id:"tv_chart_container",className:"w-full h-full",ref:y})]})});var Vt=react.memo(({onReady:a})=>{let{chartManager:t,chartSettings:e}=h(),r=react.useMemo(()=>`${e.timezone}_${t.reloadId}`,[e.timezone,t.reloadId]);react.useLayoutEffect(()=>{t.setLoading(true);},[t,e.chartType,r]);let i=react.useCallback(()=>{a?.(),t.onInternalWidgetReady(),t.setLoading(false);},[t,a]);return jsxRuntime.jsx("div",{className:"flex-1 w-full overflow-hidden",children:jsxRuntime.jsx(Ft,{onReady:i,ref:o=>t.setInternalWidget(o??null)})})});var mr=react.memo(({toolbar:a,loadingOverlay:t,onReady:e,children:r})=>{let{prefix:i}=h(),o=jotai.useAtomValue(_(i));return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[a!==false&&jsxRuntime.jsx(It,{...a||{}}),jsxRuntime.jsxs("div",{className:"relative flex-1 w-full overflow-hidden",children:[o&&t&&jsxRuntime.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center bg-background/80",children:t}),jsxRuntime.jsx(Vt,{onReady:e})]}),r]})}),pr=react.forwardRef(({initConfig:a,widgetConstructor:t,libraryPath:e,customCssUrl:r,toolbar:i,loadingOverlay:o,onReady:s,children:n,className:l},u)=>jsxRuntime.jsx("div",{className:`flex flex-col w-full h-full ${l??""}`,children:jsxRuntime.jsx(ft,{ref:u,initConfig:a,widgetConstructor:t,libraryPath:e,customCssUrl:r,children:jsxRuntime.jsx(mr,{toolbar:i,loadingOverlay:o,onReady:s,children:n})})}));var Cr=react.memo(({index:a})=>{let{prefix:t}=h(),e=jotai.useAtomValue(c(t)),r=jotai.useAtomValue(f(t)),o=e[a??r];return o?jsxRuntime.jsxs("div",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[jsxRuntime.jsx("span",{className:"font-medium text-foreground",children:o.tickerSymbol||o.symbol}),jsxRuntime.jsx("span",{children:o.resolution})]}):null});function vr(){return h().chartManager}function Tr(){let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(f(a)),r=jotai.useAtomValue(c(a));return react.useMemo(()=>r.length?t.areaByIndex(e):null,[t,e,r])}function wr(){let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(f(a)),i=jotai.useAtomValue(c(a))[e];return react.useMemo(()=>i?.tickerSymbol?t.symbolResolver?.getSymbolInfo(i.tickerSymbol)??null:null,[t,i?.tickerSymbol])}exports.ALL_TV_CHART_RESOLUTIONS=T;exports.ChartAreaManager=V;exports.ChartDataFeed=K;exports.ChartLibraryWidget=G;exports.ChartManager=N;exports.ChartSaveLoadAdapter=X;exports.ChartSettings=z;exports.ChartSettingsAdapter=Z;exports.ChartSettingsStore=H;exports.ChartSymbolResolver=$;exports.ChartWidget=q;exports.ChartWidgetBridge=Q;exports.DEFAULT_TV_CHART_RESOLUTIONS=S;exports.ENABLED_TV_CHART_FEATURES=ct;exports.EventEmitter=Y;exports.SUPPORTED_TV_CHART_LAYOUTS=ut;exports.TV_CHART_THEME_COLORS=C;exports.TradingView=pr;exports.TradingViewAreaTitle=Cr;exports.TradingViewConfig=yt;exports.TradingViewFullscreen=Ct;exports.TradingViewKlineStyleSelect=St;exports.TradingViewLayout=At;exports.TradingViewOpenIndicator=Tt;exports.TradingViewOpenSettings=xt;exports.TradingViewProvider=ft;exports.TradingViewResolutions=Lt;exports.TradingViewSnapshot=Rt;exports.TradingViewToolbar=It;exports.TradingViewToolbarProvider=vt;exports.TradingViewWidgetContainer=Ft;exports.TradingViewWidgetProvider=Vt;exports.TvChartErrorResetType=Ot;exports.TvChartFeature=et;exports.TvChartHandle=ht;exports.TvChartKlineStyle=tt;exports.TvChartLayout=R;exports.TvChartPriceType=Dt;exports.TvChartQuoteType=Wt;exports.TvChartTheme=Bt;exports.TvChartType=j;exports.chartAreasFamily=c;exports.chartFullscreenFamily=I;exports.chartLoadingFamily=_;exports.chartPinnedResolutionsFamily=x;exports.chartSelectedIndexFamily=f;exports.chartShowDrawingToolbarFamily=w;exports.getTvChartLayoutReverse=pt;exports.getTvChartLibraryLayout=U;exports.getTvChartLibraryLocale=fe;exports.getTvChartLibraryResolution=v;exports.getTvChartLibraryTheme=E;exports.getTvChartResolutionFrame=ve;exports.getTvChartResolutionReverse=mt;exports.getTvChartTickTimestamp=Se;exports.parseSymbol=nt;exports.settingsBackgroundColorFamily=st;exports.settingsChartTypeFamily=A;exports.settingsDataFamily=O;exports.settingsDisabledFeaturesFamily=F;exports.settingsEnabledFeaturesFamily=P;exports.settingsLayoutFamily=M;exports.settingsLocaleFamily=rt;exports.settingsReverseColorFamily=ot;exports.settingsStorageIdFamily=W;exports.settingsThemeFamily=D;exports.settingsTickerSymbolFamily=it;exports.settingsTimezoneFamily=at;exports.stringifySymbol=ue;exports.stringifySymbolShort=lt;exports.useActiveAreaManager=Tr;exports.useChartManager=vr;exports.useSymbolInfo=wr;exports.useTvChartContext=h;exports.useTvChartManager=Ae;exports.useTvChartPrefix=Pe;exports.useTvChartToolbarContext=J;exports.widgetReadyFamily=B;//# sourceMappingURL=index.js.map
|
|
1
|
+
'use strict';var react=require('react'),jotai=require('jotai'),utils=require('jotai/utils'),lodashEs=require('lodash-es'),jsxRuntime=require('react/jsx-runtime');var j=(e=>(e.TradingView="TradingView",e.Original="Original",e))(j||{}),Dt=(e=>(e.Price="price",e.MarketCap="market_cap",e))(Dt||{}),Wt=(o=>(o.USD="USD",o.SOL="SOL",o.ETH="ETH",o.TRX="TRX",o.BNB="BNB",o))(Wt||{}),tt=(d=>(d[d.Bars=0]="Bars",d[d.Candles=1]="Candles",d[d.Line=2]="Line",d[d.Area=3]="Area",d[d.HeikenAshi=8]="HeikenAshi",d[d.HollowCandles=9]="HollowCandles",d[d.Baseline=10]="Baseline",d[d.HiLo=12]="HiLo",d[d.Column=13]="Column",d[d.LineWithMarkers=14]="LineWithMarkers",d[d.Stepline=15]="Stepline",d[d.HLCArea=16]="HLCArea",d[d.VolCandle=19]="VolCandle",d[d.Renko=4]="Renko",d[d.Kagi=5]="Kagi",d[d.PointAndFigure=6]="PointAndFigure",d[d.LineBreak=7]="LineBreak",d))(tt||{}),Ot=(e=>(e.Light="light",e.Dark="dark",e))(Ot||{}),et=(y=>(y.HeaderWidget="header_widget",y.HeaderCandleStyleMenu="header_candle_style_menu",y.HeaderFullscreenButton="header_fullscreen_button",y.MultiCharts="multi_charts",y.CreateVolumeIndicatorByDefault="create_volume_indicator_by_default",y.VolumeForceOverlay="volume_force_overlay",y.HideDrawingToolsByDefault="hide_drawing_tools_by_default",y.LegendSeriesTitle="legend_series_title",y.LegendVolume="legend_volume",y.TimeframesToolbar="timeframes_toolbar",y.SaveDrawingToServer="save_drawing_to_server",y))(et||{}),R=(g=>(g.Layout1A="1A",g.Layout2A="2A",g.Layout2B="2B",g.Layout3A="3A",g.Layout3B="3B",g.Layout3C="3C",g.Layout3D="3D",g.Layout3E="3E",g.Layout3F="3F",g.Layout4A="4A",g.Layout4B="4B",g.Layout4C="4C",g.Layout4D="4D",g.Layout4E="4E",g.Layout4F="4F",g.Layout5A="5A",g.Layout5B="5B",g.Layout5C="5C",g.Layout5D="5D",g.Layout6A="6A",g.Layout6B="6B",g.Layout6C="6C",g.Layout7A="7A",g.Layout8A="8A",g.Layout8B="8B",g.Layout8C="8C",g))(R||{}),Bt=(r=>(r[r.None=0]="None",r[r.ResetData=1]="ResetData",r[r.ResetChart=2]="ResetChart",r))(Bt||{});var ut=["header_widget","header_candle_style_menu","header_fullscreen_button","multi_charts","volume_force_overlay","legend_series_title","timeframes_toolbar","save_drawing_to_server"],S=["1s","30s","1m","1h","4h","1d"],T=["1s","15s","30s","1m","5m","15m","1h","4h","12h","1d"],ct=["1A","2A","2B","3A","3B","3C","3D","3E","3F","4A","4B","4C","4D","4E","4F","5A","5B","5C","5D","6A","6B","6C","7A","8A","8B","8C"],Nt=["click","keydown","mousedown","mouseup","contextmenu"],C={decrease:"#F04866",increase:"#1DB954",chartBg:"#1A1A1A",card:"#242424"},Ht={card:"#242424"};var _=utils.atomFamily(a=>jotai.atom(true)),I=utils.atomFamily(a=>jotai.atom(false)),f=utils.atomFamily(a=>jotai.atom(0)),x=utils.atomFamily(a=>jotai.atom([...S])),u=utils.atomFamily(a=>jotai.atom([])),w=utils.atomFamily(a=>jotai.atom(false)),M=utils.atomFamily(a=>jotai.atom("1A")),A=utils.atomFamily(a=>jotai.atom("TradingView")),D=utils.atomFamily(a=>jotai.atom("dark")),rt=utils.atomFamily(a=>jotai.atom("en")),at=utils.atomFamily(a=>jotai.atom("Etc/UTC")),it=utils.atomFamily(a=>jotai.atom("")),W=utils.atomFamily(a=>jotai.atom("kline")),ot=utils.atomFamily(a=>jotai.atom(false)),st=utils.atomFamily(a=>jotai.atom(null)),P=utils.atomFamily(a=>jotai.atom([])),F=utils.atomFamily(a=>jotai.atom([])),O=utils.atomFamily(a=>jotai.atom(false)),B=utils.atomFamily(a=>jotai.atom(t=>{let e=t(M(a)),r=t(A(a)),i=t(f(a)),o=t(x(a)),s=t(w(a)),n=t(u(a));return {layout:e,chartType:r,selectedIndex:i,pinnedResolutions:o,showDrawingToolbar:s,areaContents:n}}),lodashEs.isEqual);var V=class{settings;chartManager;chartIndex;store;prefix;pendingTickerSymbol=null;pendingResolution=null;constructor(t,e,r,i,o,s){this.settings=t,this.chartManager=e,this.chartIndex=r,this.store=i,this.prefix=o;let l={...{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false},...s};this.patchArea(l);}get state(){return this.store.get(u(this.prefix))[this.chartIndex]??{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false}}patchArea(t){let e=[...this.store.get(u(this.prefix))],r=e[this.chartIndex]??{resolution:"1m",chartStyle:1,symbol:"",tickerSymbol:"",rightOffset:10,barSpacing:6,dataReady:false};e[this.chartIndex]={...r,...t},this.store.set(u(this.prefix),e);}setState(t,e){e!=null&&this.patchArea({[t]:e});}get tickerSymbol(){return this.state.tickerSymbol}get symbol(){return this.state.symbol}get resolution(){return this.state.resolution}get chartStyle(){return this.state.chartStyle}get rightOffset(){return this.state.rightOffset}get barSpacing(){return this.state.barSpacing}get dataReady(){return this.state.dataReady}get internalChartWidget(){return this.chartManager.internalWidget?.chartByIndex(this.chartIndex)}setChartStyle(t){this.setState("chartStyle",t),this.internalChartWidget?.setChartStyle(t);}async setSymbol(t){if(this.state.tickerSymbol!==t){this.setState("tickerSymbol",t),this.setState("dataReady",false),this.pendingTickerSymbol=t;try{let e=[this.internalChartWidget?.handleSymbolChange(t,this.tickerSymbol),this.chartManager.symbolResolver?.resolveSymbolInfo(t).then(r=>{r&&this.setState("symbol",r.name);})];for(let r of await Promise.allSettled(e))if(r.status==="rejected")throw r.reason}catch(e){console.error(e);}finally{this.pendingTickerSymbol===t&&(this.pendingTickerSymbol=null);}this.tickerSymbol===t&&this.setState("dataReady",true);}}async setResolution(t){if(this.resolution!==t){this.setState("resolution",t),this.setState("dataReady",false),this.pendingResolution=t;try{await this.internalChartWidget?.handleResolutionChange(t,this.resolution);}finally{this.pendingResolution===t&&(this.pendingResolution=null);}}}toJSON(){return {...this.state}}widgetReady(){this.internalChartWidget?.dataReady()?.then(()=>this.handleChartReady())?.catch(()=>{});}get active(){return this.chartIndex<this.chartManager.chartCount}get selected(){return this.chartManager.selectedIndex===this.chartIndex}get symbolInfo(){return this.chartManager.symbolResolver?.getSymbolInfo(this.tickerSymbol)??null}destroy(){}async handleChartReady(){this.internalChartWidget&&(this.setState("dataReady",true),this.selected&&this.internalChartWidget.setBarSpacing(this.barSpacing));}};var N=class{prefix;settings;store;initialized=false;focused=false;reloadId=0;internalWidget=null;datafeed=null;symbolResolver=null;unsubAutoSave=null;constructor(t,e,r){this.prefix=t,this.store=e,this.settings=r;}get loading(){return this.store.get(_(this.prefix))}get fullscreen(){return this.store.get(I(this.prefix))}set fullscreen(t){this.store.set(I(this.prefix),t),t?document.body.classList.add("fullScreen"):document.body.classList.remove("fullScreen");}get selectedIndex(){return this.store.get(f(this.prefix))}set selectedIndex(t){this.store.set(f(this.prefix),t);}get pinnedResolutions(){return this.store.get(x(this.prefix))}set pinnedResolutions(t){this.store.set(x(this.prefix),t);}get showDrawingToolbar(){return this.store.get(w(this.prefix))}get chartCount(){return parseInt(this.settings.layout,10)||1}get areas(){let t=this.store.get(u(this.prefix));return this._areaManagers.slice(0,t.length)}_areaManagers=[];areaByIndex(t){return this.initialized&&this.updateChartContents(),this._areaManagers[t]??null}get activeArea(){return this.areaByIndex(this.selectedIndex)}async init(){if(this.initialized)return;let t=this.settings.saveLoadAdapter.getSettings();if(t?.selectedIndex!=null&&(this.selectedIndex=t.selectedIndex),t?.pinnedResolutions){let r=t.pinnedResolutions;r.length===S.length&&r.every(i=>S.includes(i))?this.pinnedResolutions=[...S]:this.pinnedResolutions=r;}if(t?.areaContents&&t.areaContents.forEach((r,i)=>{let o=new V(this.settings,this,i,this.store,this.prefix,r);this._areaManagers[i]=o;}),t?.showDrawingToolbar!=null&&this.store.set(w(this.prefix),t.showDrawingToolbar),this.settings.updateValue("layout",t?.layout),this.settings.updateValue("chartType",t?.chartType),this.settings.enableMultiCharts||this.settings.updateValue("layout","1A"),this.settings.enableHideDrawingToolsByDefault&&this.store.set(w(this.prefix),false),this.updateChartContents(),this.settings.tickerSymbol&&this.activeArea)try{await this.activeArea.setSymbol(this.settings.tickerSymbol);}catch(r){console.warn("ChartManager init failed to set symbol",r);}this.initialized=true;let e=lodashEs.debounce(()=>{let r=this.store.get(B(this.prefix));this.settings.saveLoadAdapter.saveSettings(r).catch(console.error);},1e3);this.unsubAutoSave=this.store.sub(B(this.prefix),e);}destroy(){this.unsubAutoSave?.(),this._areaManagers.forEach(t=>t.destroy()),this._areaManagers=[];}setLoading(t){this.store.set(_(this.prefix),t);}setLocale(t){this.settings.updateValue("locale",t);}setTimezone(t){this.settings.updateValue("timezone",t);}setFocused(t){this.focused=t;}setShowDrawingToolbar(t){this.store.set(w(this.prefix),t);}setInternalWidget(t){this.internalWidget=t,this.store.set(O(this.prefix),false);}onInternalWidgetReady(){this.store.set(O(this.prefix),true),this.areas.forEach((t,e)=>{e<this.chartCount&&t.widgetReady();});}setChartType(t){this.settings.updateValue("chartType",t);}setTheme(t){this.settings.theme!==t&&(this.settings.updateValue("theme",t),this.internalWidget?.onThemeChange?.(t,this.settings.reverseColor));}setReverseColor(t){this.settings.reverseColor!==t&&(this.settings.updateValue("reverseColor",t),this.internalWidget?.onThemeChange?.(this.settings.theme,t));}setLayout(t){let e=this.settings.enableMultiCharts?t:"1A";if(this.settings.layout!==e){this.settings.updateValue("layout",e),this.updateChartContents(),this.internalWidget?.onLayoutChange?.(e);let r=this.chartCount;setTimeout(()=>{if(this.store.get(O(this.prefix)))for(let i=r;i<this.chartCount;i++)this.areaByIndex(i)?.widgetReady();});}}reloadChart(){this.reloadId+=1;}updateChartContents(){if(this.chartCount>this._areaManagers.length)for(let t=this._areaManagers.length;t<this.chartCount;t++){let e=this._areaManagers[this.selectedIndex],r=e?.toJSON(),i=new V(this.settings,this,t,this.store,this.prefix,r);this._areaManagers[t]=i,this.selectedIndex!==t&&!e&&i.setSymbol(this.settings.tickerSymbol).catch(()=>{});}this.selectedIndex>=this.chartCount&&(this.selectedIndex=this.chartCount-1);}get settingsData(){return this.store.get(B(this.prefix))}getAllCharts(){return this.updateChartContents(),this._areaManagers.slice(0,this.chartCount)}};var H=class{storageId;constructor(t){this.storageId=t;}get settingsKey(){return `${this.storageId}.TvChart.Settings`}get shapesKey(){return `${this.storageId}.TvChart.Shapes`}getSettings(){let t=this.getLocalSettingsData(),e=this.getChartStoreData();return {layout:e?.layout,selectedIndex:e?.currentAreaIndex,chartType:e?.chartType,pinnedResolutions:e?.pinnedResolutions,areaContents:e?.areas?.map(i=>({resolution:i.resolution||i.period||"1m",chartStyle:i.chartStyle,symbol:i.symbol,tickerSymbol:i.tickerSymbol,rightOffset:i.rightOffset,barSpacing:i.barSpacing})),showDrawingToolbar:e?.drawing?.toolbarSwitch,drawing:t?.drawing?{...t.drawing,defaultStates:lodashEs.omit(t,["drawing","DrawingToolGroupLastUsedTool","riskRewardAvailableChanged","riskRewardRiskSizeChanged","drawingShapeTemplate"]),lastUsedTools:t.DrawingToolGroupLastUsedTool,riskRewardAvailableChanged:t.riskRewardAvailableChanged,riskRewardRiskSizeChanged:t.riskRewardRiskSizeChanged,drawingShapeTemplate:t.drawingShapeTemplate}:void 0}}getChartStoreData(){return this.getLocalData(this.storageId)}setChartStoreData(t){this.setLocalData(this.storageId,t);}async saveSettings(t){let e=this.getChartStoreData(),r={...e,layout:t.layout,currentAreaIndex:t.selectedIndex,chartType:t.chartType,pinnedResolutions:t.pinnedResolutions,areas:t.areaContents?.map((i,o)=>({...e?.areas?.[o],...i})),drawing:{...e?.drawing,toolbarSwitch:t.showDrawingToolbar}};this.setChartStoreData(r);}async getShapes(t){let e=this.getLocalShapesData();return !e||!e[t]?[]:Object.values(e[t])}async saveShapes(t,e){let r=this.getLocalShapesData()||{};r[t]={...r[t],...e},Object.keys(r[t]).forEach(i=>{r[t][i]||delete r[t][i];}),this.setLocalShapesData(r);}getLocalData(t){try{let e=localStorage.getItem(t);return e?JSON.parse(e):null}catch{return null}}setLocalData(t,e){localStorage.setItem(t,JSON.stringify(e));}getLocalSettingsData(){return this.getLocalData(this.settingsKey)}getLocalShapesData(){return this.getLocalData(this.shapesKey)}setLocalShapesData(t){this.setLocalData(this.shapesKey,t);}};function nt(a){let[t,e,r,i]=a.split("/");return {address:e,chain:t,quote:r,priceType:i}}function ce(a){return !a.quote||!a.priceType?`${a.chain}/${a.address}`:`${a.chain}/${a.address}/${a.quote}/${a.priceType}`}function lt(a){return `${a.chain}/${a.address}`}var me={dark:"Dark",light:"Light"};function E(a){return me[a.toLowerCase()]??"Dark"}var Ut={"1s":"1S","5s":"5S","15s":"15S","30s":"30S","1m":"1","5m":"5","15m":"15","30m":"30","1h":"60","4h":"240","12h":"720","1d":"1D"};function v(a="1m"){return Ut[a]??Ut["1m"]}var pe={"1S":"1s","5S":"5s","15S":"15s","30S":"30s",1:"1m",5:"5m",15:"15m",30:"30m",60:"1h",240:"4h",720:"12h","1D":"1d"};function mt(a){return pe[a]??"1s"}var ye={en:"en","zh-CN":"zh","zh-TW":"zh"};function fe(a){return ye[a]??a}var zt={"1A":"s","2A":"2h","2B":"2v","3A":"3s","3B":"3h","3C":"3v","3D":"2-1","3E":"1-2","3F":"3r","4A":"4","4B":"4h","4C":"4v","4D":"4s","4E":"1-3","4F":"2-2","5A":"1-4","5B":"5s","5C":"2-3","5D":"5h","6A":"6","6B":"6c","6C":"6h","7A":"7h","8A":"8","8B":"8c","8C":"8h"};function U(a){return zt[a]??"s"}var Ce=Object.fromEntries(Object.entries(zt).map(([a,t])=>[t,a]));function pt(a){return Ce[a]??"1A"}var be={"1s":1e3,"5s":5e3,"15s":15e3,"30s":3e4,"1m":6e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"4h":144e5,"12h":432e5,"1d":864e5};function ve(a){let t=be[a];if(!t)throw new Error(`Invalid interval: ${a}`);return t}function Se(a,t){let e=a.toString().length>10?a:1e3*a;return Math.floor(e/t)*t}var z=class{prefix;store;supportedResolutions=T.map(v);supportedLayouts=ct;supportedChartTypes=["TradingView"];chartNames={};priceFormatterFactory=null;saveLoadAdapter;constructor(t,e){this.prefix=t,this.store=e,this.saveLoadAdapter=new H(t),this.store.set(W(t),t);}get layout(){return this.store.get(M(this.prefix))}get chartType(){return this.store.get(A(this.prefix))}get theme(){return this.store.get(D(this.prefix))}get reverseColor(){return this.store.get(ot(this.prefix))}get locale(){return this.store.get(rt(this.prefix))}get timezone(){return this.store.get(at(this.prefix))}get tickerSymbol(){return this.store.get(it(this.prefix))}get storageId(){return this.store.get(W(this.prefix))}get backgroundColor(){return this.store.get(st(this.prefix))}get enabledFeatures(){return this.store.get(P(this.prefix))}get disabledFeatures(){return this.store.get(F(this.prefix))}updateValue(t,e){if(e==null)return;let i={layout:()=>this.store.set(M(this.prefix),e),chartType:()=>this.store.set(A(this.prefix),e),theme:()=>this.store.set(D(this.prefix),e),reverseColor:()=>this.store.set(ot(this.prefix),e),locale:()=>this.store.set(rt(this.prefix),e),timezone:()=>this.store.set(at(this.prefix),e),tickerSymbol:()=>this.store.set(it(this.prefix),e),storageId:()=>this.store.set(W(this.prefix),e),backgroundColor:()=>this.store.set(st(this.prefix),e),enabledFeatures:()=>this.store.set(P(this.prefix),e),disabledFeatures:()=>this.store.set(F(this.prefix),e)}[t];i&&i();}isFeatureEnabled(t){return !this.disabledFeatures.includes(t)&&this.enabledFeatures.includes(t)||ut.includes(t)}setFeature(t,e){this.resetFeature(t),e?this.store.set(P(this.prefix),[...this.enabledFeatures,t]):this.store.set(F(this.prefix),[...this.disabledFeatures,t]);}resetFeature(t){this.store.set(P(this.prefix),this.enabledFeatures.filter(e=>e!==t)),this.store.set(F(this.prefix),this.disabledFeatures.filter(e=>e!==t));}get enableMultiCharts(){return this.isFeatureEnabled("multi_charts")}get enableCreateVolumeIndicatorByDefault(){return this.isFeatureEnabled("create_volume_indicator_by_default")}get enableHideDrawingToolsByDefault(){return this.isFeatureEnabled("hide_drawing_tools_by_default")}get enableLegendSeriesTitle(){return this.isFeatureEnabled("legend_series_title")}get enableLegendVolume(){return this.isFeatureEnabled("legend_volume")}get enableTimeframesToolbar(){return this.isFeatureEnabled("timeframes_toolbar")}get enableVolumeForceOverlay(){return this.isFeatureEnabled("volume_force_overlay")}sub(t,e){let i={layout:M(this.prefix),chartType:A(this.prefix),theme:D(this.prefix)}[t];return i?this.store.sub(i,e):()=>{}}};var $=class{datafeed;cache=new Map;pendingRequests=new Map;constructor(t){this.datafeed=t;}async resolveSymbolInfo(t){return this.datafeed.resolveSymbol(t)}async resolveSymbolInfos(t){return t.filter(r=>!this.cache.has(r)&&!this.pendingRequests.has(r)).forEach(r=>{let i=this.resolveSymbolInfo(r);i.then(o=>{o&&this.cache.set(r,o);}).finally(()=>this.pendingRequests.delete(r)),this.pendingRequests.set(r,i);}),await Promise.all(t.filter(r=>this.pendingRequests.has(r)).map(r=>this.pendingRequests.get(r))),t.map(r=>this.cache.get(r)??null).filter(r=>r!==null)}getSymbolInfo(t){return this.resolveSymbolInfo(t).catch(e=>{console.error("ChartSymbolResolver.getSymbolInfo",e);}),this.cache.get(t)??null}};var yt=({initConfig:a,children:t})=>{let{chartManager:e,chartSettings:r}=h(),[i,o]=react.useState(false);return react.useEffect(()=>{e.initialized||(r.updateValue("tickerSymbol",a.tickerSymbol),r.updateValue("theme",a.theme),r.updateValue("reverseColor",a.reverseColor),r.updateValue("layout",a.layout),r.updateValue("chartType",a.chartType),r.updateValue("timezone",a.timezone),r.updateValue("locale",a.locale),r.updateValue("backgroundColor",a.backgroundColor),r.updateValue("storageId",a.storageId),r.updateValue("enabledFeatures",a.enabledFeatures),r.updateValue("disabledFeatures",a.disabledFeatures),a.chartNames&&(r.chartNames=a.chartNames),a.priceFormatterFactory&&(r.priceFormatterFactory=a.priceFormatterFactory),a.supportedResolutions&&(r.supportedResolutions=a.supportedResolutions),a.supportedLayouts&&(r.supportedLayouts=a.supportedLayouts),a.supportedChartTypes&&(r.supportedChartTypes=a.supportedChartTypes),e.datafeed=a.datafeed,e.symbolResolver=new $(a.datafeed));},[e,r,a]),react.useEffect(()=>(e.init().then(()=>o(true)).catch(s=>{console.error("TradingViewConfig chartManager init error",s);}),()=>{e.destroy();}),[e]),e.initialized?jsxRuntime.jsx(jsxRuntime.Fragment,{children:t}):null};var qt=react.createContext(null);function h(){let a=react.useContext(qt);if(!a)throw new Error("useTvChartContext must be used within TradingViewProvider");return a}function Ae(){return h().chartManager}function Pe(){return h().prefix}var ht=class{setting;chartManager;constructor(t,e){this.setting=t,this.chartManager=e;}get internalWidget(){return this.chartManager.internalWidget}chartCount(){return this.chartManager.chartCount}setActiveChart(t){t<this.chartCount()&&(this.chartManager.selectedIndex=t);}layout(){return this.setting.layout}setLayout(t){this.chartManager.setLayout(t);}theme(){return this.setting.theme}setTheme(t){this.chartManager.setTheme(t);}setChartType(t){this.chartManager.setChartType(t);}getSetting(){return this.setting}getChartManager(){return this.chartManager}},ft=react.forwardRef(({children:a,initConfig:t,widgetConstructor:e,libraryPath:r,customCssUrl:i},o)=>{let s=jotai.useStore(),n=t.storageId,l=react.useMemo(()=>new z(n,s),[n,s]),c=react.useMemo(()=>new N(n,s,l),[n,s,l]),b=react.useMemo(()=>new ht(l,c),[l,c]);react.useImperativeHandle(o,()=>b,[b]);let y=react.useMemo(()=>({prefix:n,chartSettings:l,chartManager:c,widgetConstructor:e,libraryPath:r,customCssUrl:i}),[n,l,c,e,r,i]);return jsxRuntime.jsx(qt.Provider,{value:y,children:jsxRuntime.jsx(yt,{initConfig:t,children:a})})});var Ct=react.memo(()=>{let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(I(a)),r=react.useCallback(()=>{t.fullscreen=!t.fullscreen;},[t]);return jsxRuntime.jsx("button",{type:"button",onClick:r,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:e?"Exit fullscreen":"Fullscreen",children:e?"Exit":"Fullscreen"})});var Yt=react.createContext(null);function J(){let a=react.useContext(Yt);if(!a)throw new Error("useTvChartToolbarContext must be used within TradingViewToolbarProvider");return a}var vt=({children:a})=>{let{prefix:t,chartManager:e}=h(),r=jotai.useAtomValue(f(t)),i=jotai.useAtomValue(u(t)),o=react.useMemo(()=>i.length?e.areaByIndex(r):null,[e,r,i]),s=react.useMemo(()=>o?.symbolInfo??null,[o]),n=react.useMemo(()=>({activeAreaManager:o,symbolInfo:s}),[o,s]);return jsxRuntime.jsx(Yt.Provider,{value:n,children:a})};var Qt={0:"Bars",1:"Candles",2:"Line",3:"Area",8:"Heiken Ashi",9:"Hollow",10:"Baseline"},He=[1,0,2,3,9,8,10],St=react.memo(()=>{let {prefix:a}=h(),{activeAreaManager:t}=J(),e=jotai.useAtomValue(u(a)),r=jotai.useAtomValue(f(a)),i=e[r]?.chartStyle??1,s=react.useCallback(n=>{let l=parseInt(n.target.value,10);t?.setChartStyle(l);},[t]);return jsxRuntime.jsx("select",{value:i,onChange:s,className:"text-xs bg-transparent text-muted-foreground hover:text-foreground cursor-pointer border-none outline-none px-1 py-0.5",title:"K-line style",children:He.map(n=>jsxRuntime.jsx("option",{value:n,children:Qt[n]??n},n))})});var Tt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(()=>{a.internalWidget?.openIndicatorSettingsDialog();},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Indicators",children:"Indicators"})});var xt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(()=>{a.internalWidget?.openSettingsDialog();},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Chart settings",children:"Settings"})});var Lt=react.memo(()=>{let{prefix:a,chartManager:t}=h(),{activeAreaManager:e}=J(),r=jotai.useAtomValue(x(a)),i=jotai.useAtomValue(u(a)),o=jotai.useAtomValue(f(a)),s=i[o]?.resolution,n=react.useCallback(l=>{e?.setResolution(l);},[e]);return jsxRuntime.jsx("div",{className:"flex items-center gap-0.5",children:r.map(l=>jsxRuntime.jsx("button",{type:"button",onClick:()=>n(l),className:`px-2 py-0.5 text-xs rounded cursor-pointer transition-colors ${s===l?"bg-primary text-primary-foreground":"text-muted-foreground hover:text-foreground hover:bg-muted"}`,children:l},l))})});var Rt=react.memo(()=>{let{chartManager:a}=h(),t=react.useCallback(async()=>{try{let e=await a.internalWidget?.takeClientScreenshot();if(!e)return;let r=document.createElement("a");r.download=`chart-${Date.now()}.png`,r.href=e.toDataURL("image/png"),r.click();}catch(e){console.error("TradingViewSnapshot",e);}},[a]);return jsxRuntime.jsx("button",{type:"button",onClick:t,className:"text-xs text-muted-foreground hover:text-foreground px-1.5 py-0.5 rounded hover:bg-muted cursor-pointer transition-colors",title:"Take snapshot",children:"Snapshot"})});var It=react.memo(({children:a,prefix:t,suffix:e,showResolutions:r=true,showKlineStyleSelect:i=true,showOpenIndicator:o=true,showOpenSettings:s=true,showFullscreen:n=true,showSnapshot:l=true})=>jsxRuntime.jsx(vt,{children:jsxRuntime.jsxs("div",{className:"flex items-center gap-1 px-2 py-1 border-b border-border min-h-[36px] flex-shrink-0",children:[t,a??jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[r&&jsxRuntime.jsx(Lt,{}),jsxRuntime.jsxs("div",{className:"flex items-center gap-0.5 ml-auto",children:[i&&jsxRuntime.jsx(St,{}),o&&jsxRuntime.jsx(Tt,{}),s&&jsxRuntime.jsx(xt,{}),l&&jsxRuntime.jsx(Rt,{}),n&&jsxRuntime.jsx(Ct,{})]})]}),e]})}));var q=class{settings;chartManager;bridge;chartIndex;constructor(t,e,r,i){this.settings=t,this.chartManager=e,this.bridge=r,this.chartIndex=i;}get chartAreaManager(){return this.chartManager.areaByIndex(this.chartIndex)}get widget(){return this.bridge.getWidget()}get chartWidget(){return this.widget?.chart(this.chartIndex)??null}setChartStyle(t){this.chartWidget?.setChartType(t);}getChartStyle(){return this.chartWidget?.chartType()??1}handleSymbolChange(t,e){return this.bridge.asyncWidgetMethodContext((r,i)=>{r.chart(this.chartIndex).setSymbol(t,{dataReady:()=>i(),doNotActivateChart:false});})}handleResolutionChange(t,e){return this.bridge.asyncWidgetMethodContext((r,i)=>{let o=r.chart(this.chartIndex);o.dataReady(()=>{o.setResolution(v(t),{dataReady:i,doNotActivateChart:true}).catch(()=>{});});})}setPrecision(t){this.widget?.applyOverrides({"mainSeriesProperties.minTick":t===null?"default":`${Math.pow(10,t)},1,false`});}async dataReady(){if(await this.bridge.onReady(),!this.chartWidget)throw Error("ChartWidget: chartWidget is null");return new Promise(t=>{this.chartWidget?.dataReady(()=>setTimeout(t));})}timeScaleWidth(){return this.chartWidget?.getTimeScale()?.width()??NaN}rightOffset(){return this.chartWidget?.getTimeScale()?.rightOffset()??NaN}setRightOffset(t){this.chartWidget?.getTimeScale()?.setRightOffset(t);}barSpacing(){return this.chartWidget?.getTimeScale()?.barSpacing()??NaN}setBarSpacing(t){this.chartWidget?.getTimeScale()?.setBarSpacing(t);}};var G=class{settings;chartManager;bridge;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r;}get widget(){return this.bridge.getWidget()}chartByIndex(t){return new q(this.settings,this.chartManager,this.bridge,t)}activeChart(){let t=this.widget?.activeChartIndex();return t===void 0?void 0:this.chartByIndex(t)}openIndicatorSettingsDialog(){this.widget?.activeChart().executeActionById("insertIndicator");}openSettingsDialog(){this.widget?.activeChart().executeActionById("chartProperties");}takeClientScreenshot(){return this.widget?.takeClientScreenshot()}onLayoutChange(t){this.widget?.setLayout(U(t));}async onThemeChange(t,e){let r=E(t);await this.widget?.changeTheme(r,{disableUndo:true}),this.bridge.applyColorPaletteOverrides();}};var Y=class{listeners=new Map;on(t,e){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e),()=>{this.listeners.get(t)?.delete(e);}}emit(t,e){this.listeners.get(t)?.forEach(r=>r(e));}off(t,e){this.listeners.get(t)?.delete(e);}clear(){this.listeners.clear();}};var K=class{settings;chartManager;bridge;abortController=new AbortController;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r;}toJSON(){return null}async onReady(t){setTimeout(()=>{t({supported_resolutions:T.map(v),supports_marks:true,exchanges:[]});}),await this.chartManager.datafeed?.onReady({setting:this.settings,chartManager:this.chartManager,instance:this.bridge});}destroy(){this.abortController.abort();}async resolveSymbol(t,e,r,i){try{let o=await this.chartManager.datafeed?.resolveSymbol(t,i);o&&e(o);}catch(o){console.error("ChartDataFeed.resolveSymbol",o),r(o);}}async getBars(t,e,r,i,o){try{let s=await this.chartManager.datafeed?.getBars(t,e,r);s&&i(s,{noData:s.length===0});}catch(s){console.error("ChartDataFeed.getBars",s),o(s);}}subscribeBars(t,e,r,i,o){this.chartManager.datafeed?.subscribeBars(t,e,r,i,o);}unsubscribeBars(t){this.chartManager.datafeed?.unsubscribeBars(t);}async getMarks(t,e,r,i,o){this.chartManager.datafeed?.getMarks?.(t,e,r,i,o);}getQuotes(t,e,r){e(t.map(i=>({s:"ok",n:i,v:{}})));}subscribeQuotes(t,e,r,i){}unsubscribeQuotes(t){}};var Q=class{settings;chartManager;bridge;data;drawings;constructor(t,e,r){this.settings=t,this.chartManager=e,this.bridge=r,this.data=null,this.drawings=null,this.loadDataFromLocalStorage();}get layoutId(){return this.settings.storageId}get shouldResetColorPalette(){let t=this.data?.theme,e=this.data?.reverseColor;return t!==this.settings.theme||e!==this.settings.reverseColor}toJSON(){return null}getAllCharts(){return new Promise(t=>{let e=[];this.data&&e.push({id:this.data.id,name:this.data.name,symbol:this.data.symbol,resolution:this.data.resolution,timestamp:this.data.timestamp}),t(e);})}removeChart(t){throw Error("Method not implemented.")}async saveChart(t){return this.data={...t,theme:this.settings.theme,reverseColor:this.settings.reverseColor,id:this.layoutId,timestamp:0},this.saveDataToLocalStorage(),this.data.id}getChartContent(t){return new Promise(e=>{let r=JSON.parse(this.data.content),i=JSON.parse(r.charts_symbols),o=JSON.parse(r.content);e(JSON.stringify({...r,chart_symbols:JSON.stringify(i),content:JSON.stringify(o)}));})}async saveLineToolsAndGroups(t,e,r){this.drawings=this.drawings||{data:{},timestamp:0},this.drawings.data=this.drawings.data||{},this.drawings.data[e]=this.drawings.data[e]||{};try{if(!r.sources)return;for(let[i,o]of r.sources)if(!o||!o.symbol||!o.state||Object.keys(o.state).length===0||i.includes("/"))o===null&&delete this.drawings.data[e][i];else {let{address:s,chain:n}=nt(o.symbol),l=lt({address:s,chain:n}),c={...o,symbol:l,id:o.id.indexOf("/")>0?o.id.split("/")[0]:o.id};this.drawings.data[e][i]=c;}this.saveDataToLocalStorage();}catch(i){console.error("saveLineToolsAndGroups",i);}}async loadLineToolsAndGroups(t,e,r,i){if(!i?.symbol||!this.drawings?.data?.[e])return null;let o=i.symbol,{address:s,chain:n}=nt(o),l=lt({address:s,chain:n}),c=lodashEs.uniqBy(Object.values(lodashEs.cloneDeep(this.drawings.data[e])).filter(b=>b.symbol===l),"id");try{return {sources:new Map(c.map(b=>{let y=lodashEs.cloneDeep({...b,symbol:o});return [y.id,y]}))}}catch(b){return console.error("ChartSaveLoadAdapter.loadLineToolsAndGroups",b),null}}getLayoutKey(t){return `charts.tradingview.data.${t}`}getDrawingKey(t){return `charts.tradingview.drawing.${t}`}loadDataFromLocalStorage(){let t=this.getLayoutKey(this.layoutId),e=this.getDrawingKey(this.layoutId),r=localStorage.getItem(t),i=localStorage.getItem(e);if(r)try{let o=JSON.parse(r),s=JSON.parse(o.content);o.content=JSON.stringify(s),this.data=o;}catch(o){console.error("ChartSaveLoadAdapter loadDataFromLocalStorage parse layout error",o);}if(i)try{this.drawings=JSON.parse(i);}catch(o){console.error("ChartSaveLoadAdapter loadDataFromLocalStorage parse drawing error",o);}}saveDataToLocalStorage(){let t=this.getLayoutKey(this.layoutId),e=this.getDrawingKey(this.layoutId),r=Math.round(Date.now()/1e3);this.data&&(this.data.timestamp=r,localStorage.setItem(t,JSON.stringify(this.data))),this.drawings&&(this.drawings.timestamp=r,localStorage.setItem(e,JSON.stringify(this.drawings)));}};var Mt="trading.chart.proterty",X=class{storagePrefix;initialSettings;constructor(t,e,r){this.storagePrefix=`tradingview.${t.storageId}.`,this.initialSettings={};for(let o=0;o<localStorage.length;o++){let s=localStorage.key(o);if(s&&s.startsWith(this.storagePrefix)){let n=s.slice(this.storagePrefix.length);this.initialSettings[n]=localStorage.getItem(s);}}let i={noConfirmEnabled:1};if(this.initialSettings[Mt])try{let o=JSON.parse(this.initialSettings[Mt]);Object.assign(i,o),Object.assign(i,{noConfirmEnabled:!0});}catch(o){console.error("ChartSettingsAdapter: failed to parse chart settings",o);}this.initialSettings[Mt]=JSON.stringify(i);}toJSON(){return null}removeValue(t){delete this.initialSettings[t],localStorage.removeItem(`${this.storagePrefix}${t}`);}setValue(t,e){this.initialSettings[t]=e,localStorage.setItem(`${this.storagePrefix}${t}`,e);}};var Z=class{settings;chartManager;WidgetCtor;moduleInstances=new Map;symbolIntervalSubs=new Map;abortController=new AbortController;widgetReadyPromise=null;readyPromise=null;widget=null;container=null;ready=false;layoutReady=true;events=new Y;libraryPath;customCssUrl;constructor(t,e,r,i){this.settings=t,this.chartManager=e,this.WidgetCtor=r,this.libraryPath=i?.libraryPath??"static/charting_library/",this.customCssUrl=i?.customCssUrl??"custom-styles.css",this.initModules();}getWidget(){return this.widget}async init(t){if(this.widgetReadyPromise)throw new Error("ChartWidgetBridge already initialized.");let e=this.getWidgetOptions();this.container=t,this.widget=new this.WidgetCtor({...e,container:t});let r=new Promise(i=>{this.widget?.onChartReady(()=>i());});this.widgetReadyPromise=r,this.readyPromise=r.then(()=>{this.ready=true,this.handleChartReady();}),this.moduleInstances.forEach((i,o)=>{try{i.init?.call(i);}catch(s){console.warn(`ChartWidgetBridge init module ${o}`,s);}}),await Promise.race([this.readyPromise,new Promise((i,o)=>setTimeout(o,6e4,new Error("ChartWidgetBridge init timeout")))]);}async destroy(){this.moduleInstances.forEach(t=>t.destroy?.call(t)),this.symbolIntervalSubs.forEach(t=>t()),this.symbolIntervalSubs.clear(),this.events.clear(),this.abortController.abort(),this.ready=false,this.widgetReadyPromise=null,this.readyPromise=null,this.widget?.remove(),this.widget=null;}async onReady(){return new Promise((t,e)=>{this.widget?this.widget.onChartReady(()=>this.readyPromise?.then(t).catch(e)):e(Error("cannot call `onReady` before `init`"));})}async asyncWidgetMethodContext(t){return new Promise((e,r)=>{if(!this.widgetReadyPromise){r(new Error("ChartWidgetBridge: widget not ready"));return}let i=this.widgetReadyPromise.then(()=>this.waitForLayout()),o=this.abortController.signal,s=()=>r(o.reason);o.addEventListener("abort",s),i.then(()=>t(this.widget,e)).catch(r).finally(()=>o.removeEventListener("abort",s));})}getModule(t){return this.moduleInstances.get(t)}applyColorPaletteOverrides(){this.widget?.applyOverrides(this.getColorPaletteOverrides()),this.widget?.applyStudiesOverrides(this.getColorPaletteStudiesOverrides());}getWidgetOptions(){let t=["header_widget","legend_inplace_edit","display_market_status","save_shortcut","show_interval_dialog_on_key_press","symbol_info","symbol_search_hot_key","uppercase_instrument_names","show_symbol_logo_in_legend","show_symbol_logo_for_compare_studies","drawing_templates"],e=["determine_first_data_request_size_using_visible_range","request_only_visible_range_on_reset","show_exchange_logos","show_symbol_logos","dont_show_boolean_study_arguments","hide_last_na_study_output","hide_right_toolbar","seconds_resolution","saveload_separate_drawings_storage","volume_force_overlay","create_volume_indicator_by_default","two_character_bar_marks_labels"];return this.settings.enableHideDrawingToolsByDefault&&e.push("hide_left_toolbar_by_default"),this.settings.enableTimeframesToolbar||t.push("timeframes_toolbar"),this.settings.enableCreateVolumeIndicatorByDefault||t.push("create_volume_indicator_by_default"),this.settings.enableVolumeForceOverlay||t.push("volume_force_overlay"),{container:"",autosize:true,debug:false,load_last_chart:true,auto_save_delay:1,timezone:this.localTimezone,library_path:this.libraryPath,custom_css_url:this.customCssUrl,theme:E(this.settings.theme),custom_font_family:window.getComputedStyle(document.body).fontFamily,symbol:this.chartManager.activeArea?.tickerSymbol,interval:v(this.chartManager.activeArea?.resolution),locale:this.settings.locale,datafeed:this.getModule("datafeed"),save_load_adapter:this.getModule("saveLoadAdapter"),settings_adapter:this.getModule("settingsAdapter"),custom_formatters:{priceFormatterFactory:this.settings.priceFormatterFactory?(r,i)=>this.settings.priceFormatterFactory(r,i):()=>null},overrides:{...this.getSettingsOverrides(),...this.getColorPaletteOverrides()},studies_overrides:this.getColorPaletteStudiesOverrides(),disabled_features:t,enabled_features:e,supported_resolutions:T.map(v)}}async handleChartReady(){let t=U(this.settings.layout);t!==this.widget?.layout()&&await this.waitForLayout(t),this.widget?.setActiveChart(this.chartManager.selectedIndex),this.getModule("saveLoadAdapter")?.shouldResetColorPalette&&(await this.widget?.changeTheme(E(this.settings.theme),{disableUndo:true}),this.applyColorPaletteOverrides()),this.widget?.subscribe("onAutoSaveNeeded",this.onAutoSaveNeeded.bind(this)),this.widget?.subscribe("activeChartChanged",this.activeChartChanged.bind(this)),this.widget?.subscribe("layout_about_to_be_changed",this.layoutWillChange.bind(this)),this.widget?.subscribe("layout_changed",this.layoutChanged.bind(this)),this.syncChartsChanges(),this.subscribeChartsChanges(),this.installEventHooks(),this.resetTimezone();}onAutoSaveNeeded(){try{this.widget?.saveChartToServer(void 0,void 0,{defaultChartName:"DEFAULT"});}catch(t){console.warn("ChartWidgetBridge.onAutoSaveNeeded",t);}}activeChartChanged(t){this.chartManager.selectedIndex=t,this.chartManager.settings.saveLoadAdapter.saveSettings(this.chartManager.settingsData);}layoutWillChange(t){this.layoutReady=false,this.chartManager.setLayout(pt(t));}layoutChanged(){this.layoutReady=true,this.syncChartsChanges(),this.subscribeChartsChanges(),this.widget?.unloadUnusedCharts(),this.widget?.saveChartToServer();}syncChartsChanges(){this.widget?.symbolSync()?.setValue(false),this.widget?.intervalSync()?.setValue(false);let t=this.widget?.chartsCount()??0;for(let e=0;e<t;e++){let r=this.chartManager.areaByIndex(e),i=this.widget.chart(e);i.setSymbol(r?.tickerSymbol??"",{doNotActivateChart:true}),i.setResolution(v(r?.resolution),{doNotActivateChart:true});}}subscribeChartsChanges(){let t=this.widget?.chartsCount()??0;this.symbolIntervalSubs.forEach((e,r)=>{parseInt(r)>=t&&(e(),this.symbolIntervalSubs.delete(r));});for(let e=0;e<t;e++){if(this.symbolIntervalSubs.has(`${e}`))continue;let r=this.chartManager.areaByIndex(e),i=this.widget.chart(e);i.getPanes().forEach(c=>c.getMainSourcePriceScale()?.setAutoScale(true));let o=i.onSymbolChanged(),s=i.onIntervalChanged(),n=()=>{this.events.emit("symbolChanged",[e,i.symbol()]),r?.setSymbol(i.symbol()).catch(()=>{}),this.onAutoSaveNeeded();},l=c=>{let b=mt(c);this.events.emit("resolutionChanged",[e,b]),r?.setResolution(b).catch(()=>{});};o.subscribe(r,n),s.subscribe(r,l),this.symbolIntervalSubs.set(`${e}`,()=>{o.unsubscribe(r,n),s.unsubscribe(r,l);});}}installEventHooks(){let t=this.container?.lastElementChild,e=t?.contentWindow?.document;if(e&&(e.addEventListener("click",()=>t?.click()),e.defaultView?.MutationObserver)){let r=new WeakSet,i=e.querySelector(".layout__area--center");if(i){let o=()=>{i.querySelectorAll(".chart-container").forEach((s,n)=>{r.has(s)||(r.add(s),Nt.forEach(l=>{s.addEventListener(l,c=>this.events.emit("domEvent",[n,l,c]),{passive:true});}));});};new e.defaultView.MutationObserver(o).observe(i,{childList:true}),o();}}}resetTimezone(){try{let t=this.widget?.chartsCount()??0;for(let e=0;e<t;e++)this.widget?.chart(e)?.getTimezoneApi()?.setTimezone(this.localTimezone);}catch(t){console.error("ChartWidgetBridge: Reset timezone",t);}}get localTimezone(){return Intl.DateTimeFormat().resolvedOptions().timeZone}async waitForLayout(t){if(!this.widget||this.layoutReady&&!t)return;let e;return new Promise(i=>{e=i,this.widget.subscribe("layout_changed",i),t&&this.widget.setLayout(t);}).finally(()=>{this.widget.unsubscribe("layout_changed",e);})}getSettingsOverrides(){return {"mainSeriesProperties.minTick":"default","paneProperties.legendProperties.showSeriesTitle":this.settings.enableLegendSeriesTitle}}getColorPaletteOverrides(){let t=this.settings.theme==="dark"?C.card:Ht.card;return {"paneProperties.background":C.chartBg,"paneProperties.backgroundType":"solid",volumePaneSize:"medium","mainSeriesProperties.candleStyle.upColor":C.increase,"mainSeriesProperties.barStyle.upColor":C.increase,"mainSeriesProperties.columnStyle.upColor":C.increase,"mainSeriesProperties.candleStyle.downColor":C.decrease,"mainSeriesProperties.barStyle.downColor":C.decrease,"mainSeriesProperties.columnStyle.downColor":C.decrease,"mainSeriesProperties.candleStyle.borderUpColor":C.increase,"mainSeriesProperties.candleStyle.borderDownColor":C.decrease,"mainSeriesProperties.candleStyle.wickUpColor":C.increase,"mainSeriesProperties.candleStyle.wickDownColor":C.decrease,"linetoolorder.bodyBackgroundColor":t,"linetoolorder.bodyBackgroundTransparency":0}}getColorPaletteStudiesOverrides(){return {"volume.volume.color.0":C.decrease,"volume.volume.color.1":C.increase,"volume.volume.transparency":80}}initModules(){Object.entries({datafeed:K,saveLoadAdapter:Q,settingsAdapter:X}).forEach(([e,r])=>{this.moduleInstances.set(e,new r(this.settings,this.chartManager,this));});}};var At=react.memo(()=>null);var Ft=react.forwardRef(({onReady:a},t)=>{let{chartManager:e,chartSettings:r,widgetConstructor:i,libraryPath:o,customCssUrl:s}=h(),n=react.useRef(a),[l,c]=react.useState(),[b,y]=react.useState(null),[Et,kt]=react.useState(false);return react.useEffect(()=>{Et&&n.current&&setTimeout(n.current);},[Et]),react.useImperativeHandle(t,()=>l,[l]),react.useEffect(()=>{if(!b)return;let gt=new Z(r,e,i,{libraryPath:o,customCssUrl:s}),le=new G(r,e,gt);return c(le),gt.init(b).then(()=>kt(true)).catch(de=>{console.error("TradingViewWidgetContainer: failed to init bridge",de);}),()=>{gt.destroy().then(()=>{c(void 0),kt(false);}).catch(()=>{console.error("TradingViewWidgetContainer: failed to destroy bridge");});}},[b,r,e,i,o,s]),jsxRuntime.jsxs("div",{className:"w-full h-full",children:[jsxRuntime.jsx(At,{}),jsxRuntime.jsx("div",{id:"tv_chart_container",className:"w-full h-full",ref:y})]})});var Vt=react.memo(({onReady:a})=>{let{chartManager:t,chartSettings:e}=h(),r=react.useMemo(()=>`${e.timezone}_${t.reloadId}`,[e.timezone,t.reloadId]);react.useLayoutEffect(()=>{t.setLoading(true);},[t,e.chartType,r]);let i=react.useCallback(()=>{a?.(),t.onInternalWidgetReady(),t.setLoading(false);},[t,a]);return jsxRuntime.jsx("div",{className:"flex-1 w-full overflow-hidden",children:jsxRuntime.jsx(Ft,{onReady:i,ref:o=>t.setInternalWidget(o??null)})})});var mr=react.memo(({toolbar:a,loadingOverlay:t,onReady:e,children:r})=>{let{prefix:i}=h(),o=jotai.useAtomValue(_(i));return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[a!==false&&jsxRuntime.jsx(It,{...a||{}}),jsxRuntime.jsxs("div",{className:"relative flex-1 w-full overflow-hidden",children:[o&&t&&jsxRuntime.jsx("div",{className:"absolute inset-0 z-10 flex items-center justify-center bg-background/80",children:t}),jsxRuntime.jsx(Vt,{onReady:e})]}),r]})}),pr=react.forwardRef(({initConfig:a,widgetConstructor:t,libraryPath:e,customCssUrl:r,toolbar:i,loadingOverlay:o,onReady:s,children:n,className:l},c)=>jsxRuntime.jsx("div",{className:`flex flex-col w-full h-full ${l??""}`,children:jsxRuntime.jsx(ft,{ref:c,initConfig:a,widgetConstructor:t,libraryPath:e,customCssUrl:r,children:jsxRuntime.jsx(mr,{toolbar:i,loadingOverlay:o,onReady:s,children:n})})}));var Cr=react.memo(({index:a})=>{let{prefix:t}=h(),e=jotai.useAtomValue(u(t)),r=jotai.useAtomValue(f(t)),o=e[a??r];return o?jsxRuntime.jsxs("div",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[jsxRuntime.jsx("span",{className:"font-medium text-foreground",children:o.tickerSymbol||o.symbol}),jsxRuntime.jsx("span",{children:o.resolution})]}):null});function vr(){return h().chartManager}function Tr(){let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(f(a)),r=jotai.useAtomValue(u(a));return react.useMemo(()=>r.length?t.areaByIndex(e):null,[t,e,r])}function wr(){let{prefix:a,chartManager:t}=h(),e=jotai.useAtomValue(f(a)),i=jotai.useAtomValue(u(a))[e];return react.useMemo(()=>i?.tickerSymbol?t.symbolResolver?.getSymbolInfo(i.tickerSymbol)??null:null,[t,i?.tickerSymbol])}exports.ALL_TV_CHART_RESOLUTIONS=T;exports.ChartAreaManager=V;exports.ChartDataFeed=K;exports.ChartLibraryWidget=G;exports.ChartManager=N;exports.ChartSaveLoadAdapter=Q;exports.ChartSettings=z;exports.ChartSettingsAdapter=X;exports.ChartSettingsStore=H;exports.ChartSymbolResolver=$;exports.ChartWidget=q;exports.ChartWidgetBridge=Z;exports.DEFAULT_TV_CHART_RESOLUTIONS=S;exports.ENABLED_TV_CHART_FEATURES=ut;exports.EventEmitter=Y;exports.SUPPORTED_TV_CHART_LAYOUTS=ct;exports.TV_CHART_THEME_COLORS=C;exports.TradingView=pr;exports.TradingViewAreaTitle=Cr;exports.TradingViewConfig=yt;exports.TradingViewFullscreen=Ct;exports.TradingViewKlineStyleSelect=St;exports.TradingViewLayout=At;exports.TradingViewOpenIndicator=Tt;exports.TradingViewOpenSettings=xt;exports.TradingViewProvider=ft;exports.TradingViewResolutions=Lt;exports.TradingViewSnapshot=Rt;exports.TradingViewToolbar=It;exports.TradingViewToolbarProvider=vt;exports.TradingViewWidgetContainer=Ft;exports.TradingViewWidgetProvider=Vt;exports.TvChartErrorResetType=Bt;exports.TvChartFeature=et;exports.TvChartHandle=ht;exports.TvChartKlineStyle=tt;exports.TvChartLayout=R;exports.TvChartPriceType=Dt;exports.TvChartQuoteType=Wt;exports.TvChartTheme=Ot;exports.TvChartType=j;exports.chartAreasFamily=u;exports.chartFullscreenFamily=I;exports.chartLoadingFamily=_;exports.chartPinnedResolutionsFamily=x;exports.chartSelectedIndexFamily=f;exports.chartShowDrawingToolbarFamily=w;exports.getTvChartLayoutReverse=pt;exports.getTvChartLibraryLayout=U;exports.getTvChartLibraryLocale=fe;exports.getTvChartLibraryResolution=v;exports.getTvChartLibraryTheme=E;exports.getTvChartResolutionFrame=ve;exports.getTvChartResolutionReverse=mt;exports.getTvChartTickTimestamp=Se;exports.parseSymbol=nt;exports.settingsBackgroundColorFamily=st;exports.settingsChartTypeFamily=A;exports.settingsDataFamily=B;exports.settingsDisabledFeaturesFamily=F;exports.settingsEnabledFeaturesFamily=P;exports.settingsLayoutFamily=M;exports.settingsLocaleFamily=rt;exports.settingsReverseColorFamily=ot;exports.settingsStorageIdFamily=W;exports.settingsThemeFamily=D;exports.settingsTickerSymbolFamily=it;exports.settingsTimezoneFamily=at;exports.stringifySymbol=ce;exports.stringifySymbolShort=lt;exports.useActiveAreaManager=Tr;exports.useChartManager=vr;exports.useSymbolInfo=wr;exports.useTvChartContext=h;exports.useTvChartManager=Ae;exports.useTvChartPrefix=Pe;exports.useTvChartToolbarContext=J;exports.widgetReadyFamily=O;//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|