reactjsmaterial-uionclickfocusonkeypress

Not possible to set focus on content of Tooltip component from Material UI on firing onClick event but possible on firing onKeyPress event


I am using Tooltip component from MUI in my customized TooltipComponent. TooltipComponent works similar to Dialog: user can see some content pop up after clicking (not hovering) on element (div with a text "CLICK" in my case). This content pop up consists of some text and an "x" icon, by clicking "x" icon it's possible to close tooltip. I added two events: onClick and onKeyPress, they both do the same thing - open popup content. For accessibility needs, when pop up content is open I have a requirement to set a focus on "x" icon. I'm doing it in React by using ref. I succeded to do it with onKeyPress event, and I expected that the same code works fine for onClick event, but it's not works. Not only I cannot set a focus after firing onClick, but for some reason the pop-up window opens and closes immediately without my intervention (according to the logic of the code, the pop-up window can be closed only after pressing “x”)

Why the same code works perfect for onKeyPress and not works for onClick? And how resolve this problem for onClick?
I appreciate any help.

Here's the code of my custom TooltipComponent:

import React, { useEffect, useRef, useState } from 'react';
import {Tooltip, ClickAwayListener} from '@mui/material';

function TooltipComponent() {  
 const [open, setOpen] = useState(false);   
 const toggleTooltip = () => setOpen(!open); 
 const closeTooltip = () => setOpen(false);  
 const myDivRef = useRef(null);

  useEffect(() => {
    if (myDivRef.current) {
      if(open){
        myDivRef.current.focus();
      }
    }}, [open]);

  const BodyWrapper = (
    <ClickAwayListener onClickAway={closeTooltip}>
      <div style={{ position: 'relative' }}>
        <div
          tabIndex={0}
          ref={myDivRef}
          onClick={closeTooltip}
          onKeyPress={closeTooltip}
          aria-description="close icon"
          style={{
            position: 'absolute',
            left: '-3px',
            top: '-3px',
            fontSize: '36px',
            fontWeight: 'light',
            cursor: 'pointer',
          }}
        >
          x
        </div>
        <div aria-description="tooltip content">
          <div style={{ padding: '24px', color: 'black' }}>
            Top - Start -{' '}
            <div>
              <a href="#">I am a link</a>
            </div>
          </div>
        </div>
      </div>
    </ClickAwayListener>   );

  return (
    <Tooltip
      title={BodyWrapper}
      arrow
      disableHoverListener={true}
      tabIndex={0}
      open={open}
      placement="bottom"
      onClose={closeTooltip}
      PopperProps={{
        disablePortal: true,
        role: 'dialog',
        'aria-live': 'polite',
      }}
    >
      <div
        onClick={toggleTooltip}
        onKeyPress={toggleTooltip}
        style={{
          display: 'inline-block',
          textAlign: 'center',
          cursor: 'pointer',
        }}
      >
        <div style={{ margin: '6px', color: 'black' }}>
          CLICK
        </div>
      </div>
    </Tooltip>   ); }

export default TooltipComponent;
  

Solution

  • Try to use Tooltop with a button element, not with a Div element with onClick property. Can also use can you ref property check whether button key events.

    return (
        <div>
          <Tooltip
            PopperProps={{
              disablePortal: true,
            }}
            onClose={handleTooltipClose}
            open={open}
            disableFocusListener
            disableHoverListener
            disableTouchListener
            title="Tooltip content"
          >
            <Button
              ref={buttonRef}
              onClick={toggleTooltip}
              onKeyPress={toggleTooltip}
            >
              Click or press Enter
            </Button>
          </Tooltip>
        </div>
      );