import React, { useContext } from 'react';
import classNames from 'classnames';
import { useDispatch, ReactReduxContext } from 'react-redux';
/* !- React Actions */
import { tooltip, close } from '../layer/actions';
/* !- React Elements */
import IconPlus from '../icon/mui/content/add';
/* !- Constants */
/**
* Predefined Markers Aligns
*/
export const MARKER_ALIGNS = {
heading: [0, -100],
tooltip: [-50, -50],
};
/**
* InfoBox Marker
* @example
*
* Hello
*
*/
export const MarkerInfoBox = ({ children }) =>
{
const { store } = useContext(ReactReduxContext);
const dispatch = useDispatch();
const onMouseHandler = (event) =>
{
dispatch(tooltip(children, event));
};
const onClickHandler = (event) =>
{
event.preventDefault();
event.stopPropagation();
const layer = store.getState().layer;
if (
layer.active === true
&& children.props.id !== undefined
&& children.props.id === ((layer.element || {}).props || {}).id
)
{
dispatch(close());
}
else
{
dispatch(tooltip(children, event));
}
};
return (
);
};
/**
* Predefined Markers: Heading, Tooltip
*/
export const MARKER_ELEMENTS = {
heading: settings => (
{settings}
),
tooltip: settings => (
{settings}
),
};
/**
* Extend create marker elements
* @param {object} elements Ex. MARKER_ELEMENTS
* @param {object} aligns Ex. MARKER_ALIGNS
* @return {function} createMarkers
*/
export const createMarkersHelper = ({ elements, aligns }) => markers =>
markers
.filter(({ category }) => elements[category])
.map(({ position, category, settings, draggable }, n) => (
{elements[category](settings)}
));
/**
* Create Predefined markers [MARKER_ELEMENTS] from JSON
* @param {Array} markers [{ position, category, settings }]
*/
export const createMarkers = createMarkersHelper({ elements: MARKER_ELEMENTS, aligns: MARKER_ALIGNS });
/**
* Wrapper to align and position to markers
* @example
*
* Hello
*
*/
export const Marker = ({
index,
children,
position,
align,
onClick,
draggable,
}) =>
{
const classes = classNames({
absolute: true,
pointer: typeof onClick === 'function',
});
return (
{children}
);
};
export default Marker;