JSFiddle - React, Tailwind, and code Playground

by Maxim_Wolf

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/7.2.6/react-redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.1.2/redux.min.js"></script>
<div id="root">

</div>

CSS

.container{
  display: grid;
  grid-template-columns: 1fr 1fr;
}

React

const MOUSE_CLICK = "MOUSE_CLICK";
function createMouseClickAction(evt){
  return {
    type: MOUSE_CLICK,
    payload:{
      time: new Date().toISOString(),
      clientX: evt.clientX,
      clientY: evt.clientY,
    },
  };
}
function reducer (state=[], action=undefined){
  if(typeof action ==="object" && action.type === MOUSE_CLICK){
    const newState = [...state];
    newState.push(action.payload);
    return newState;
  }
  return state;
}

const itemToString = (item)=>`time:${item.time}, x: ${item.clientX}, y: ${item.clientY}`;
const selector = (state, {offsetLeft:l, clientWidth:w })=> state.filter((row)=>(l<row.clientX && row.clientX<=l+w));
const View=({label})=>{
  const ref = React.useRef({offsetLeft:0, clientWidth:0});  
  const state = ReactRedux.useSelector((state)=>selector(state,ref.current));
  return (<ul ref={ref}>
  {state.length<=0?(<li>{label}</li>):state.map((item)=>(<li key={item.time}>{itemToString(item)}</li>))}
  </ul>)
}

const App = ()=>{
  const dispatch = ReactRedux.useDispatch();
  React.useEffect(()=>{
    const handleClick = (evt)=>{
      dispatch(createMouseClickAction(evt));
    }    
    document.addEventListener('click', handleClick);
    return ()=>{
      document.removeEventListener('click', handleClick);
    };
  });
  return (<div className="container">
    <View label="left"/>
    <View label="right"/>
  </div>);
}
const store = Redux.createStore(reducer);
ReactDOM.render(
  (<ReactRedux.Provider store={store}>
    <App />
  </ReactRedux.Provider>),
  document.querySelector("#root"),
)