import * as React from 'react';
import { TableSelectionStyle, useElements } from './periodic-table-state/table-store';
import { Table, TableLayout } from './periodic-table-component/periodic-table.component';
import { useEffect } from 'react';
export interface SelectableTableProps {
className?: string;
/** array of enabled elements, e.g : ['H', 'O'] */
enabledElements?: string[];
/** array of disabled elements, e.g : ['H', 'O'] */
disabledElements?: string[];
/** array of hidden elements, e.g : ['H', 'O'] */
hiddenElements?: string[];
/** prevent user to select more than N elements */
maxElementSelectable: number;
/** callback called with an array of selected elements */
onStateChange?: (selected: string[]) => void;
/** whether to force a particular layout */
forceTableLayout?: TableLayout;
/** whether to forward non-managed changes */
forwardOuterChange?: boolean;
/** component to be plugged into the top spacer */
plugin?: JSX.Element;
children?;
/** toggle disabling all table components */
disabled?: boolean;
}
export function SelectableTable(props: SelectableTableProps) {
const { tableStateStore, disabledEls, hiddenEls, enabledEls } = useElementsWithState(props);
return (
tableStateStore.selectionStyle === TableSelectionStyle.SELECT ||
tableStateStore.selectionStyle === TableSelectionStyle.MULTI_INPUTS_SELECT
? tableStateStore.toggleEnabledElement(element.symbol)
: tableStateStore.toggleDisabledElement(element.symbol)
}
onElementMouseOver={(element) => tableStateStore.setDetailedElement(element.symbol)}
onElementMouseLeave={(element) => tableStateStore.setDetailedElement(null)}
forceTableLayout={props.forceTableLayout}
disabledElement={disabledEls}
hiddenElement={hiddenEls}
enabledElement={enabledEls}
showSwitcher
{...props}
/>
);
}
export const useElementsWithState = (props: SelectableTableProps) => {
// could be memoized
const {
enabledElements: enabledEls,
disabledElements: disabledEls,
hiddenElements: hiddenEls,
actions: tableStateStore
} = useElements(props.maxElementSelectable, props.onStateChange);
useEffect(() => {
tableStateStore.setForwardChange(props.forwardOuterChange);
}, [props.forwardOuterChange]);
useEffect(() => {
//TODO(chab) let's suppose this change on the fly, we might need to deselect all the extraneous element
tableStateStore.setMaxSelectionLimit(props.maxElementSelectable);
}, [props.maxElementSelectable]);
return {
tableStateStore,
enabledEls,
disabledEls,
hiddenEls
};
};