lightweight-charts-react-components
Version:
React components for Lightweight Charts
16 lines (12 loc) • 14.6 kB
JavaScript
/**!
* lightweight-charts-react-components v1.3.0
*
* This source code is licensed under the MIT license found in the
* LICENSE.md file in the root directory of this source tree.
*
* @license MIT
*/
import*as e from"react";import*as t from"lightweight-charts";let i=(0,e.createContext)(null);i.displayName="ChartContext";let r={addDefaultPane:!1},a=({container:i,onClick:a,onCrosshairMove:l,onInit:n,options:s={},onDblClick:u})=>{let[c,f]=(0,e.useState)(!1),o=(0,e.useRef)({_chart:null,api(){return this._chart},init(){if(null===this._chart){let e=(0,t.createChart)(i,{...r,...s});this._chart=e,n&&n(this._chart)}return c||f(!0),this._chart},clear(){null!==this._chart&&(f(!1),this._chart.remove(),this._chart=null)}});return(0,e.useLayoutEffect)(()=>(o.current.init(),()=>{o.current.clear()}),[]),(0,e.useLayoutEffect)(()=>{if(i){if(a){var e;null===(e=o.current.api())||void 0===e||e.subscribeClick(a)}return()=>{if(a){var e;null===(e=o.current.api())||void 0===e||e.unsubscribeClick(a)}}}},[a]),(0,e.useLayoutEffect)(()=>{if(i){if(l){var e;null===(e=o.current.api())||void 0===e||e.subscribeCrosshairMove(l)}return()=>{if(l){var e;null===(e=o.current.api())||void 0===e||e.unsubscribeCrosshairMove(l)}}}},[l]),(0,e.useLayoutEffect)(()=>{if(i){if(u){var e;null===(e=o.current.api())||void 0===e||e.subscribeDblClick(u)}return()=>{if(u){var e;null===(e=o.current.api())||void 0===e||e.unsubscribeDblClick(u)}}}},[u]),(0,e.useLayoutEffect)(()=>{var e;i&&(null===(e=o.current.api())||void 0===e||e.applyOptions({...r,...s}))},[s]),{chartApiRef:o,isReady:c}},l=({children:t,container:r,onClick:l,onCrosshairMove:n,onInit:s,options:u})=>{let{chartApiRef:{current:c},isReady:f}=a({container:r,onClick:l,onCrosshairMove:n,onInit:s,options:u});return e.default.createElement(i.Provider,{value:{chartApiRef:c,isReady:f}},t)},n=(0,e.forwardRef)(({children:t,containerProps:i,...r},a)=>{let[n,s]=(0,e.useState)(),u=(0,e.useCallback)(e=>{s(e),a&&("function"==typeof a?u(e):a.current=e)},[a]);return e.default.createElement("div",{ref:u,...i},!!n&&e.default.createElement(l,{container:n,...r},t))});n.displayName="ChartWrapper";let s=(0,e.createContext)(null);s.displayName="TimeScaleContext";let u="1.3.0";function c(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class f extends Error{constructor(e,{isOperational:t=!0,cause:i,docsPath:r}={}){super(e),c(this,"isOperational",void 0),c(this,"cause",void 0),this.name=this.constructor.name??"InternalError",this.isOperational=t,this.cause=i,this.message=`${e??"An error occurred"}`,r&&(this.message=`${this.message}
Docs: see ${"https://ukorvl.github.io/lightweight-charts-react-components/docs/"+r}`),u&&(this.message=`${this.message}
Version: lightweight-charts-react-components@${u}`),Object.setPrototypeOf(this,f.prototype)}}let o=(t,i)=>{let r=(0,e.useContext)(t);if(!r){let e=t.name??t.displayName??"Context";throw new f(i??`${e} not found.`,{isOperational:!0})}return r},p=({onVisibleTimeRangeChange:t,onVisibleLogicalRangeChange:r,onSizeChange:a,visibleRange:l,visibleLogicalRange:n,options:s={}})=>{let{isReady:u,chartApiRef:c}=o(i),[f,p]=(0,e.useState)(!1),d=(0,e.useRef)({_timeScale:null,api(){return this._timeScale},init(){if(this._timeScale)return this._timeScale;let e=null==c?void 0:c.api();return e?(this._timeScale=e.timeScale(),this._timeScale.applyOptions(s),l&&this._timeScale.setVisibleRange(l),n&&this._timeScale.setVisibleLogicalRange(n),t&&this._timeScale.subscribeVisibleTimeRangeChange(t),r&&this._timeScale.subscribeVisibleLogicalRangeChange(r),a&&this._timeScale.subscribeSizeChange(a),p(!0),this._timeScale):null},clear(){this._timeScale=null,p(!1)}});return(0,e.useLayoutEffect)(()=>{u&&d.current.init()},[u]),(0,e.useLayoutEffect)(()=>()=>{d.current.clear()},[]),(0,e.useLayoutEffect)(()=>{if(c&&s){var e,t;null===(t=d.current)||void 0===t||null===(e=t.api())||void 0===e||e.applyOptions(s)}},[s]),(0,e.useLayoutEffect)(()=>{if(c){if(a){var e,t;null===(t=d.current)||void 0===t||null===(e=t.api())||void 0===e||e.subscribeSizeChange(a)}return()=>{if(a){var e,t;null===(t=d.current)||void 0===t||null===(e=t.api())||void 0===e||e.unsubscribeSizeChange(a)}}}},[a]),(0,e.useLayoutEffect)(()=>{if(c){if(r){var e,t;null===(t=d.current)||void 0===t||null===(e=t.api())||void 0===e||e.subscribeVisibleLogicalRangeChange(r)}return()=>{if(r){var e,t;null===(t=d.current)||void 0===t||null===(e=t.api())||void 0===e||e.unsubscribeVisibleLogicalRangeChange(r)}}}},[r]),(0,e.useLayoutEffect)(()=>{if(c){if(t){var e,i;null===(i=d.current)||void 0===i||null===(e=i.api())||void 0===e||e.subscribeVisibleTimeRangeChange(t)}return()=>{if(t){var e,i;null===(i=d.current)||void 0===i||null===(e=i.api())||void 0===e||e.unsubscribeVisibleTimeRangeChange(t)}}}},[t]),(0,e.useLayoutEffect)(()=>{if(c&&l){var e,t;null===(t=d.current)||void 0===t||null===(e=t.api())||void 0===e||e.setVisibleRange(l)}},[l]),(0,e.useLayoutEffect)(()=>{if(c&&n){var e,t;null===(t=d.current)||void 0===t||null===(e=t.api())||void 0===e||e.setVisibleLogicalRange(n)}},[n]),{timeScaleApiRef:d,isReady:f}},d=(0,e.forwardRef)(({children:t,...i},r)=>{let{timeScaleApiRef:{current:a},isReady:l}=p(i);return(0,e.useImperativeHandle)(r,()=>a,[a]),e.default.createElement(s.Provider,{value:{timeScaleApiRef:a,isReady:l}},t)});d.displayName="TimeScale";let h=(0,e.createContext)(null);h.displayName="PaneContext";let m=()=>{let t=(0,e.useContext)(h),i=!!t;return{isInsidePane:i,isPaneReady:!!(null==t?void 0:t.isReady),paneApiRef:null==t?void 0:t.paneApiRef}},v=({options:t={},id:r})=>{let{isReady:a,chartApiRef:l}=o(i),{isInsidePane:n,isPaneReady:s}=m(),u=(0,e.useRef)({_priceScale:null,api(){return this._priceScale},init(){if(!this._priceScale){let e=null==l?void 0:l.api();if(!e)return null;this._priceScale=e.priceScale(r),this._priceScale.applyOptions(t)}return this._priceScale},setId(e){null!==this._priceScale&&null!==l&&(this._priceScale=l.api().priceScale(e),this._priceScale.applyOptions(t))},clear(){this._priceScale=null}});return(0,e.useLayoutEffect)(()=>{if(a){if(!n)throw new f("PriceScale must be used inside a pane. Please ensure that the component is wrapped in a pane component.",{isOperational:!0,docsPath:""});s&&u.current.init()}},[a,n,s]),(0,e.useLayoutEffect)(()=>()=>{u.current.clear()},[]),(0,e.useLayoutEffect)(()=>{var e;l&&(null===(e=u.current)||void 0===e||e.setId(r))},[r]),(0,e.useLayoutEffect)(()=>{if(l&&t){var e,i;null===(i=u.current)||void 0===i||null===(e=i.api())||void 0===e||e.applyOptions(t)}},[t]),u},y=(0,e.forwardRef)((t,i)=>{let r=v(t);return(0,e.useImperativeHandle)(i,()=>r.current,[r]),null});y.displayName="PriceScale";let _=({deps:t})=>{let{timeScaleApiRef:i,isReady:r}=o(s);(0,e.useLayoutEffect)(()=>{if(!r||!i)return;let e=i.api();queueMicrotask(()=>{e&&e.fitContent()})},[...t,r])},S=({deps:e})=>(_({deps:e}),null),R=(0,e.createContext)({seriesApiRef:null,isReady:!1});R.displayName="SeriesContext";let L=({type:t,data:r,options:a={},reactive:l=!0,seriesOrder:n,alwaysReplaceData:s=!1,...u})=>{let{isReady:c,chartApiRef:p}=o(i),{isPaneReady:d,isInsidePane:h,paneApiRef:v}=m(),[y,_]=(0,e.useState)(!1),S=(0,e.useRef)({_series:null,api(){return this._series},init(){if(!this._series){var e,i,l;let s=null==p?void 0:p.api();if(!s)return null;let c=h?null==v||null===(e=v.api())||void 0===e?void 0:e.paneIndex():void 0;if("Custom"===t){let e=u.plugin;if(!e)throw new f("Custom series requires a plugin to be defined");this._series=s.addCustomSeries(e,a,c)}else this._series=s.addSeries(g[t],a,c);null===(i=this._series)||void 0===i||i.setData(r),void 0!==n&&(null===(l=this._series)||void 0===l||l.setSeriesOrder(n)),_(!0)}return this._series},clear(){if(null!==this._series){var e;null==p||null===(e=p.api())||void 0===e||e.removeSeries(this._series),this._series=null,_(!1)}}});return(0,e.useLayoutEffect)(()=>{c&&(!h||d)&&S.current.init()},[c,h,d]),(0,e.useLayoutEffect)(()=>()=>{S.current.clear()},[]),(0,e.useLayoutEffect)(()=>{if(p&&r&&l){let e=S.current.api();if(!e)return;let t=e.data(),i=r.length-t.length;if(s||0===t.length||0===r.length||i<0||i>1){e.setData(r);return}let a={...r[r.length-1]};e.update(a)}},[r,l,s]),(0,e.useLayoutEffect)(()=>{if(p&&a){var e;null===(e=S.current.api())||void 0===e||e.applyOptions(a)}},[a]),(0,e.useLayoutEffect)(()=>{if(p&&void 0!==n){var e;null===(e=S.current.api())||void 0===e||e.setSeriesOrder(n)}},[n]),{isReady:y,seriesApiRef:S}},g={Line:t.LineSeries,Candlestick:t.CandlestickSeries,Histogram:t.HistogramSeries,Area:t.AreaSeries,Baseline:t.BaselineSeries,Bar:t.BarSeries},E=(0,e.forwardRef)(({children:t,...i},r)=>{let{seriesApiRef:{current:a},isReady:l}=L(i);return(0,e.useImperativeHandle)(r,()=>a,[a]),e.default.createElement(R.Provider,{value:{seriesApiRef:a,isReady:l}},t)});E.displayName="SeriesTemplate";let b=(0,e.forwardRef)(({children:t,...i},r)=>e.default.createElement(E,{type:"Line",ref:r,...i},t));b.displayName="LineSeries";let C=(0,e.forwardRef)(({children:t,...i},r)=>e.default.createElement(E,{type:"Histogram",ref:r,...i},t));C.displayName="HistogramSeries";let k=(0,e.forwardRef)(({children:t,...i},r)=>e.default.createElement(E,{type:"Candlestick",ref:r,...i},t));k.displayName="CandlestickSeries";let w=(0,e.forwardRef)(({children:t,...i},r)=>e.default.createElement(E,{type:"Area",ref:r,...i},t));w.displayName="AreaSeries";let P=(0,e.forwardRef)(({children:t,...i},r)=>e.default.createElement(E,{type:"Baseline",ref:r,...i},t));P.displayName="BaselineSeries";let A=(0,e.forwardRef)(({children:t,...i},r)=>e.default.createElement(E,{type:"Bar",ref:r,...i},t));A.displayName="BarSeries";let N=(0,e.forwardRef)(({children:t,...i},r)=>e.default.createElement(E,{type:"Custom",ref:r,...i},t));N.displayName="CustomSeries";let x=({options:t,price:i})=>{let{isReady:r,seriesApiRef:a}=o(R),l=(0,e.useRef)({_priceLine:null,api(){return this._priceLine},init(){if(!this._priceLine){let e=null==a?void 0:a.api();if(!e)return null;this._priceLine=e.createPriceLine({price:i,...t})}return this._priceLine},clear(){if(null!==this._priceLine){var e;null==a||null===(e=a.api())||void 0===e||e.removePriceLine(this._priceLine),this._priceLine=null}}});return(0,e.useLayoutEffect)(()=>{r&&l.current.init()},[r]),(0,e.useLayoutEffect)(()=>()=>{l.current.clear()},[]),(0,e.useLayoutEffect)(()=>{if(a&&t){var e;null===(e=l.current.api())||void 0===e||e.applyOptions(t)}},[t]),(0,e.useLayoutEffect)(()=>{if(a&&i){var e;null===(e=l.current.api())||void 0===e||e.applyOptions({price:i})}},[i]),l},O=(0,e.forwardRef)((t,i)=>{let r=x(t);return(0,e.useImperativeHandle)(i,()=>r.current,[r]),null});O.displayName="PriceLine";let I=({reactive:i=!0,markers:r})=>{let{isReady:a,seriesApiRef:l}=o(R),n=(0,e.useRef)({_markers:null,api(){return this._markers},init(){if(null===this._markers){let e=null==l?void 0:l.api();if(!e)return null;this._markers=(0,t.createSeriesMarkers)(e,r)}return this._markers},clear(){null!==this._markers&&(this._markers.detach(),this._markers=null)}});return(0,e.useLayoutEffect)(()=>{a&&n.current.init()},[a]),(0,e.useLayoutEffect)(()=>()=>{n.current.clear()},[]),(0,e.useLayoutEffect)(()=>{if(l&&r&&i){var e;null===(e=n.current.api())||void 0===e||e.setMarkers(r)}},[r,i]),n},H=(0,e.forwardRef)(({...t},i)=>{let r=I(t);return(0,e.useImperativeHandle)(i,()=>r.current,[r]),null});H.displayName="Markers";let T=r=>{let{isReady:a,chartApiRef:l}=o(i),{isPaneReady:n,isInsidePane:s,paneApiRef:u}=m(),c=(0,e.useRef)({_watermark:null,api(){return this._watermark},init(){if(null===this._watermark){let e=null==l?void 0:l.api(),i=null==u?void 0:u.api();if(!e||!i)return null;if(V(r)){let{type:e,...a}=r;this._watermark=(0,t.createTextWatermark)(i,a)}else{let{type:e,src:a,...l}=r;this._watermark=(0,t.createImageWatermark)(i,a,l)}}return this._watermark},clear(){null!==this._watermark&&(this._watermark.detach(),this._watermark=null)}});return(0,e.useLayoutEffect)(()=>{if(a){if(!s)throw new f("Watermark must be used inside a pane. Please ensure that the component is wrapped in a pane component.",{isOperational:!0,docsPath:""});n&&c.current.init()}},[a,n,s]),(0,e.useLayoutEffect)(()=>()=>{c.current.clear()},[]),(0,e.useLayoutEffect)(()=>{var e;if(!l||!r)return;let{type:t,...i}=r;null===(e=c.current.api())||void 0===e||e.applyOptions(i)},[r]),c},V=e=>"text"===e.type,B=(t,i)=>{let r=T(t);return(0,e.useImperativeHandle)(i,()=>r.current,[r]),null},W=(0,e.forwardRef)((e,t)=>B({...e,type:"text"},t)),M=(0,e.forwardRef)((e,t)=>B({...e,type:"image"},t));W.displayName="WatermarkText",M.displayName="WatermarkImage";let D=({render:t,plugin:r})=>{let{isReady:a,chartApiRef:l}=o(i),{isReady:n,seriesApiRef:s}=o(R),u=(0,e.useRef)({_primitive:null,api(){return this._primitive},init(){if(!this._primitive){let e=null==s?void 0:s.api(),i=null==l?void 0:l.api();if(!i||!e)return null;let a=r||t({chart:i,series:e});e.attachPrimitive(a),this._primitive=a}return this._primitive},clear(){if(null!==this._primitive){var e;null==s||null===(e=s.api())||void 0===e||e.detachPrimitive(this._primitive),this._primitive=null}}});return(0,e.useLayoutEffect)(()=>{a&&n&&u.current.init()},[n,a]),(0,e.useLayoutEffect)(()=>()=>{u.current.clear()},[]),u},$=(0,e.forwardRef)((t,i)=>{let r=D(t);return(0,e.useImperativeHandle)(i,()=>r.current,[r]),null});$.displayName="SeriesPrimitive";let z=({stretchFactor:t}={})=>{let{chartApiRef:r,isReady:a}=o(i),[l,n]=(0,e.useState)(!1),s=(0,e.useRef)({_pane:null,api(){return this._pane},init(){let e=null==r?void 0:r.api();if(!e)return null;let i=e.addPane(!0);return this._pane=i,n(!0),void 0!==t&&this._pane.setStretchFactor(t),this._pane},clear(){if(null!==this._pane){var e;null==r||null===(e=r.api())||void 0===e||e.removePane(this._pane.paneIndex()),n(!1),this._pane=null}}});return(0,e.useLayoutEffect)(()=>{a&&s.current.init()},[a]),(0,e.useLayoutEffect)(()=>()=>{s.current.clear()},[]),(0,e.useLayoutEffect)(()=>{if(void 0===t)return;let e=s.current.api();e&&e.setStretchFactor(t)},[t]),{paneApiRef:s,isReady:l}},F=(0,e.forwardRef)(({children:t,stretchFactor:i},r)=>{let{paneApiRef:{current:a},isReady:l}=z({stretchFactor:i});return(0,e.useImperativeHandle)(r,()=>a,[a]),e.default.createElement(h.Provider,{value:{paneApiRef:a,isReady:l}},t)});F.displayName="Pane";export{w as AreaSeries,A as BarSeries,P as BaselineSeries,k as CandlestickSeries,n as Chart,N as CustomSeries,C as HistogramSeries,b as LineSeries,H as Markers,F as Pane,O as PriceLine,y as PriceScale,$ as SeriesPrimitive,d as TimeScale,S as TimeScaleFitContentTrigger,M as WatermarkImage,W as WatermarkText};
//# sourceMappingURL=lightweight-charts-react-components.mjs.map