69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
import type { Tooltip } from 'layerchart';
|
|
import { getContext, setContext, type Component, type Snippet } from 'svelte';
|
|
|
|
export const THEMES = { light: '', dark: '.dark' } as const;
|
|
|
|
export type ChartConfig = {
|
|
[k in string]: {
|
|
label?: string;
|
|
icon?: Component;
|
|
} & (
|
|
| { color?: string; theme?: never }
|
|
| { color?: never; theme: Record<keyof typeof THEMES, string> }
|
|
);
|
|
};
|
|
|
|
export type ExtractSnippetParams<T> = T extends Snippet<[infer P]> ? P : never;
|
|
|
|
export type TooltipPayload = Tooltip.TooltipSeries;
|
|
|
|
// Helper to extract item config from a payload.
|
|
export function getPayloadConfigFromPayload(
|
|
config: ChartConfig,
|
|
payload: TooltipPayload,
|
|
key: string,
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
data?: Record<string, any> | null
|
|
) {
|
|
if (typeof payload !== 'object' || payload === null) return undefined;
|
|
|
|
const payloadConfig =
|
|
'config' in payload && typeof payload.config === 'object' && payload.config !== null
|
|
? payload.config
|
|
: undefined;
|
|
|
|
let configLabelKey: string = key;
|
|
|
|
if (payload.key === key) {
|
|
configLabelKey = payload.key;
|
|
} else if (payload.label === key) {
|
|
configLabelKey = payload.label;
|
|
} else if (key in payload && typeof payload[key as keyof typeof payload] === 'string') {
|
|
configLabelKey = payload[key as keyof typeof payload] as string;
|
|
} else if (
|
|
payloadConfig !== undefined &&
|
|
key in payloadConfig &&
|
|
typeof payloadConfig[key as keyof typeof payloadConfig] === 'string'
|
|
) {
|
|
configLabelKey = payloadConfig[key as keyof typeof payloadConfig] as string;
|
|
} else if (data != null && key in data && typeof data[key] === 'string') {
|
|
configLabelKey = data[key] as string;
|
|
}
|
|
|
|
return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config];
|
|
}
|
|
|
|
type ChartContextValue = {
|
|
config: ChartConfig;
|
|
};
|
|
|
|
const chartContextKey = Symbol('chart-context');
|
|
|
|
export function setChartContext(value: ChartContextValue) {
|
|
return setContext(chartContextKey, value);
|
|
}
|
|
|
|
export function useChart() {
|
|
return getContext<ChartContextValue>(chartContextKey);
|
|
}
|