import { useMemo } from 'react'; import type { ReactNode } from 'react'; import type { OverlayLayer } from './ChartPanel.types'; import { IconEye, IconLock, IconTrash } from './ChartIcons'; type Props = { open: boolean; layers: OverlayLayer[]; onRequestClose: () => void; onToggleLayerVisible: (layerId: string) => void; onToggleLayerLocked: (layerId: string) => void; onSetLayerOpacity: (layerId: string, opacity: number) => void; fibPresent: boolean; fibSelected: boolean; fibVisible: boolean; fibLocked: boolean; fibOpacity: number; onSelectFib: () => void; onToggleFibVisible: () => void; onToggleFibLocked: () => void; onSetFibOpacity: (opacity: number) => void; onDeleteFib: () => void; }; function clamp01(v: number): number { if (!Number.isFinite(v)) return 1; return Math.max(0, Math.min(1, v)); } function opacityToPct(opacity: number): number { return Math.round(clamp01(opacity) * 100); } function pctToOpacity(pct: number): number { if (!Number.isFinite(pct)) return 1; return clamp01(pct / 100); } function IconButton({ title, active, disabled, onClick, children, }: { title: string; active?: boolean; disabled?: boolean; onClick: () => void; children: ReactNode; }) { return ( ); } function OpacitySlider({ value, disabled, onChange, }: { value: number; disabled?: boolean; onChange: (next: number) => void; }) { const pct = opacityToPct(value); return (
onChange(pctToOpacity(Number(e.target.value)))} disabled={disabled} />
{pct}%
); } export default function ChartLayersPanel({ open, layers, onRequestClose, onToggleLayerVisible, onToggleLayerLocked, onSetLayerOpacity, fibPresent, fibSelected, fibVisible, fibLocked, fibOpacity, onSelectFib, onToggleFibVisible, onToggleFibLocked, onSetFibOpacity, onDeleteFib, }: Props) { const drawingsLayer = useMemo(() => layers.find((l) => l.id === 'drawings'), [layers]); return ( <>
Layers
Name
Opacity
Actions
{layers.map((layer) => (
onToggleLayerVisible(layer.id)}>
onToggleLayerLocked(layer.id)}>
{layer.name} {layer.id === 'drawings' ? {fibPresent ? ' (1)' : ' (0)'} : null}
onSetLayerOpacity(layer.id, next)} />
))} {drawingsLayer && fibPresent ? (
Fib Retracement
) : null}
); }