import type { RangeSliderProps } from '@blueprintjs/core'; import { RangeSlider } from '@blueprintjs/core'; import styled from '@emotion/styled'; import type { Spectrum2D } from '@zakodium/nmrium-core'; import debounce from 'lodash/debounce.js'; import type { CSSProperties } from 'react'; import { useMemo } from 'react'; import { Controller, FormProvider, useForm, useFormContext, useWatch, } from 'react-hook-form'; import { ColorPicker } from 'react-science/ui'; import { COLORS } from '../../../../../data/utilities/generateColor.js'; import { useChartData } from '../../../../context/ChartContext.tsx'; import { NumberInput2 } from '../../../../elements/NumberInput2.js'; import { useFormValidateField } from '../../../../elements/useFormValidateField.js'; import { colorToHexWithAlpha } from '../../../../utility/colorToHexWithAlpha.js'; import Spectrum2DHistogram from './Spectrum2DHistogram.js'; const StyledRangeSlider = styled(RangeSlider)<{ progressColor: CSSProperties['backgroundColor']; }>` width: 90%; [class*='slider-progress']:nth-child(2) { background-color: ${(props) => props.progressColor}; } `; type ContoursRangeSliderProps = RangeSliderProps & { progressColor: React.CSSProperties['backgroundColor']; name?: string; }; function ContoursRangeSlider(props: ContoursRangeSliderProps) { return ; } interface Spectrum2DSettingProps { data: Spectrum2D; onSubmit: (values: any) => void; } const Container = styled.div<{ color: CSSProperties['backgroundColor'] }>` display: inline-block; .track-1 { background-color: ${(props) => props.color} !important; } `; export function Spectrum2DSetting({ data: SpectrumData, onSubmit, }: Spectrum2DSettingProps) { const { id, display } = SpectrumData; const { view: { spectraContourLevels }, } = useChartData(); const methods = useForm({ defaultValues: { contourOptions: spectraContourLevels[id], display }, }); const { positiveColor, negativeColor } = display; return (
Positive Negative
); } interface SettingsProps { sign: 'positive' | 'negative'; onSubmit: (values: any) => void; } function Settings(props: SettingsProps) { const { sign, onSubmit } = props; const { control, handleSubmit } = useFormContext(); const isValid = useFormValidateField(); const progressColor = useWatch({ name: `${sign}Color` }); const debounceOnSubmit = useMemo( () => debounce((onSubmit: any) => { void handleSubmit(onSubmit)(); }, 250), [handleSubmit], ); return ( <> { const { value, onChange } = field; return ( { onChange(colorToHexWithAlpha(color)); void handleSubmit(onSubmit)(); }} color={{ hex: value || '#000' }} presetColors={COLORS} style={{ boxShadow: 'none' }} /> ); }} />
contour Levels [ min - max ] { const { value, onChange } = field; return ( { onChange(e); debounceOnSubmit(onSubmit); }} value={value} showTrackFill progressColor={progressColor} /> ); }} /> number of Layers { return ( { field.onChange(valueAsNumber); void handleSubmit(onSubmit)(); }} intent={!isValid(field.name) ? 'danger' : 'none'} style={{ width: 60 }} min={0} debounceTime={250} /> ); }} />
); }