import type {
ActiveSpectrum,
Spectrum2D,
Spectrum,
} from '@zakodium/nmrium-core';
import { SvgNmrResetScale, SvgNmrSameTop } from 'cheminfo-font';
import { memo, useCallback } from 'react';
import { FaCreativeCommonsSamplingPlus } from 'react-icons/fa';
import { IoColorPaletteOutline } from 'react-icons/io5';
import { MdFormatColorFill } from 'react-icons/md';
import { useChartData } from '../../context/ChartContext.js';
import { useDispatch } from '../../context/DispatchContext.js';
import { usePreferences } from '../../context/PreferencesContext.js';
import { useToaster } from '../../context/ToasterContext.js';
import { useAlert } from '../../elements/Alert.js';
import { useActiveSpectra } from '../../hooks/useActiveSpectra.js';
import useSpectrum from '../../hooks/useSpectrum.js';
import { useToggleSpectraVisibility } from '../../hooks/useToggleSpectraVisibility.js';
import type { DisplayerMode } from '../../reducer/Reducer.js';
import { getSpectraByNucleus } from '../../utility/getSpectraByNucleus.js';
import type { ToolbarItemProps } from '../header/DefaultPanelHeader.js';
import DefaultPanelHeader from '../header/DefaultPanelHeader.js';
import { SpectraAutomaticPickingButton } from '../header/SpectraAutomaticPickingButton.js';
function getMissingProjection(spectraData: any, activeTab: any) {
let nucleus = activeTab.split(',');
nucleus = nucleus[0] === nucleus[1] ? [nucleus[0]] : nucleus;
const missingNucleus: string[] = [];
for (const n of nucleus) {
const hasSpectra = spectraData.some((d: any) => d.info.nucleus === n);
if (!hasSpectra) {
missingNucleus.push(n);
}
}
return missingNucleus;
}
interface SpectraPanelHeaderProps {
onSettingClick: () => void;
}
interface SpectraPanelHeaderInnerProps extends SpectraPanelHeaderProps {
data: Spectrum[];
activeTab: string;
activeSpectrum: Spectrum2D | null;
activeSpectra: ActiveSpectrum[] | null;
displayerMode: DisplayerMode;
}
function SpectraPanelHeaderInner({
data,
activeSpectrum,
activeSpectra,
activeTab,
displayerMode,
onSettingClick,
}: SpectraPanelHeaderInnerProps) {
const alert = useAlert();
const toaster = useToaster();
const dispatch = useDispatch();
const {
current: { spectraColors },
} = usePreferences();
const handleDelete = useCallback(() => {
alert.showAlert({
message: (
You are about to delete
{activeSpectra?.length}
spectra, Are you sure?
),
buttons: [
{
text: 'Yes',
onClick: () => {
dispatch({ type: 'DELETE_SPECTRA', payload: {} });
},
intent: 'danger',
},
{ text: 'No' },
],
});
}, [activeSpectra?.length, alert, dispatch]);
function addMissingProjectionHandler() {
const missingNucleus = getMissingProjection(data, activeTab);
if (missingNucleus.length > 0) {
dispatch({
type: 'ADD_MISSING_PROJECTION',
payload: { nucleus: missingNucleus },
});
} else {
toaster.show({ message: 'Nothing to calculate', intent: 'danger' });
}
}
function setSameTopHandler() {
dispatch({ type: 'SET_SPECTRA_SAME_TOP' });
}
function resetScaleHandler() {
dispatch({ type: 'RESET_SPECTRA_SCALE' });
}
function defaultReColorSpectraHandler() {
dispatch({
type: 'RECOLOR_SPECTRA_COLOR',
payload: { customColors: spectraColors },
});
}
function distinctReColorSpectraHandler() {
dispatch({
type: 'RECOLOR_SPECTRA_COLOR',
payload: {},
});
}
const hasActiveSpectra = activeSpectra && activeSpectra?.length > 0;
const spectraLengthPerTab = getSpectraByNucleus(activeTab, data)?.length;
const { getToggleVisibilityButtons } = useToggleSpectraVisibility(
spectraLengthPerTab < 3
? {
enableHideSelected: false,
enableShowSelected: false,
enableShowSelectedOnly: false,
}
: {},
);
let leftButtons: ToolbarItemProps[] =
getToggleVisibilityButtons(!hasActiveSpectra);
if (displayerMode === '2D' && activeSpectrum?.info.isFt) {
leftButtons.push({
icon: ,
tooltip: 'Add missing projection',
onClick: addMissingProjectionHandler,
});
}
if (displayerMode === '1D' && spectraLengthPerTab > 1) {
leftButtons.push(
{
icon: ,
tooltip: 'Reset scale',
onClick: resetScaleHandler,
},
{
icon: ,
tooltip: 'Same top',
onClick: setSameTopHandler,
},
);
}
leftButtons = leftButtons.concat([
{
component: ,
},
{
icon: ,
tooltip: 'Default spectra recoloring',
onClick: defaultReColorSpectraHandler,
},
{
icon: ,
tooltip: 'Distinct spectra recoloring',
onClick: distinctReColorSpectraHandler,
},
]);
return (
);
}
const MemoizedSpectraPanelHeader = memo(SpectraPanelHeaderInner);
export default function SpectraTabs({
onSettingClick,
}: SpectraPanelHeaderProps) {
const {
data,
view: {
spectra: { activeTab },
},
displayerMode,
} = useChartData();
const spectrum = useSpectrum() as Spectrum2D;
const activeSpectra = useActiveSpectra();
return (
);
}