Skip to content

Commit 3002d87

Browse files
82: series primitive component
1 parent 73864e0 commit 3002d87

File tree

5 files changed

+75
-0
lines changed

5 files changed

+75
-0
lines changed

src/package/components/internal/utils.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import type {PriceLineActionResult, PriceLineParams} from '../../internal/lines'
33
import type {Reference} from '../../internal/utils.js';
44
import type {PriceScaleActionResult, PriceScaleParams} from '../../internal/price-scale';
55
import type {TimeScaleActionResult, TimeScaleParams} from '../../internal/time-scale';
6+
import type {SeriesPrimitiveActionResult, SeriesPrimitiveParams} from '../../internal/series-primitive';
67

78
import {afterUpdate, getContext, onMount, setContext} from 'svelte';
89
import {series, SeriesActionResult, SeriesParams} from '../../internal/series.js';
910
import {line} from '../../internal/lines.js';
1011
import {timeScale} from '../../internal/time-scale.js';
1112
import {priceScale} from '../../internal/price-scale.js';
13+
import {seriesPrimitive} from '../../internal/series-primitive.js';
1214

1315
export type Context = IChartApi | ISeriesApi<SeriesType>;
1416

@@ -109,3 +111,24 @@ export function usePriceScaleEffect(callback: () => [params: PriceScaleParams, r
109111
subject?.updateReference(ref);
110112
});
111113
}
114+
115+
export function useSeriesPrimitiveEffect<S extends SeriesType, T = Time>(callback: () => [params: SeriesPrimitiveParams<T>]): void {
116+
let subject: SeriesPrimitiveActionResult<T> | null = null;
117+
118+
const api = context<ISeriesApi<S>>();
119+
120+
onMount(() => {
121+
const [params] = callback();
122+
subject = seriesPrimitive<S, T>(api as unknown as ISeriesApi<S, T>, params);
123+
124+
return () => {
125+
subject?.destroy();
126+
subject = null;
127+
}
128+
});
129+
130+
afterUpdate(() => {
131+
const [params] = callback();
132+
subject?.update(params);
133+
});
134+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type {Time, ISeriesPrimitive} from 'lightweight-charts';
2+
3+
export interface $$PROPS<T = Time> {
4+
view: ISeriesPrimitive<T>;
5+
}
6+
7+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
8+
export interface $$EVENTS {
9+
10+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<svelte:options immutable={true}/>
2+
3+
<script lang="ts">
4+
import type {$$PROPS} from './series-primitive.interface.js';
5+
6+
import {useSeriesPrimitiveEffect} from './internal/utils.js';
7+
8+
export let view: $$PROPS['view'];
9+
10+
useSeriesPrimitiveEffect(() => [{ view }]);
11+
</script>

src/package/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export {default as CustomSeries} from './components/custom-series.svelte';
99
export {default as PriceLine} from './components/price-line.svelte';
1010
export {default as PriceScale} from './components/price-scale.svelte';
1111
export {default as TimeScale} from './components/time-scale.svelte';
12+
export {default as SeriesPrimitiv} from './components/series-primitive.svelte';
1213

1314
export type {$$PROPS as ChartProps, $$EVENTS as ChartEventArgs, $$EVENTS_DETAIL as ChartEventDetails} from './components/chart.interface.js';
1415
export type {$$PROPS as AreaSeriesProps} from './components/area-series.interface.js';
@@ -21,4 +22,5 @@ export type {$$PROPS as CustomSeriesProps} from './components/custom-series.inte
2122
export type {$$PROPS as PriceLineProps} from './components/price-line.interface.js';
2223
export type {$$PROPS as PriceScaleProps} from './components/price-scale.interface.js';
2324
export type {$$PROPS as TimeScaleProps, $$EVENTS as TimeScaleEventArgs, $$EVENTS_DETAIL as TimeScaleEventDetails} from './components/time-scale.interface.js';
25+
export type {$$PROPS as SeriesPrimitiveProps} from './components/series-primitive.interface.js';
2426
export type {Reference} from './internal/utils.js';
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type {ISeriesApi, ISeriesPrimitive, SeriesType, Time} from 'lightweight-charts';
2+
import type {ActionResult} from './utils.js';
3+
4+
export interface SeriesPrimitiveParams<T = Time> {
5+
view: ISeriesPrimitive<T>;
6+
}
7+
8+
export type SeriesPrimitiveActionResult<T = Time> = ActionResult<SeriesPrimitiveParams<T>>;
9+
10+
export function seriesPrimitive<S extends SeriesType, T = Time>(
11+
target: ISeriesApi<S, T>,
12+
params: SeriesPrimitiveParams<T>
13+
): SeriesPrimitiveActionResult<T> {
14+
let { view } = params;
15+
target.attachPrimitive(view);
16+
17+
return {
18+
update(nextParams: SeriesPrimitiveParams<T>): void {
19+
if (nextParams.view !== view) {
20+
target.detachPrimitive(view);
21+
view = nextParams.view;
22+
target.attachPrimitive(view);
23+
}
24+
},
25+
destroy(): void {
26+
target.detachPrimitive(view);
27+
}
28+
};
29+
}

0 commit comments

Comments
 (0)