68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { useState, useCallback, useRef } from 'react';
 | 
						|
 | 
						|
import { FormattedMessage } from 'react-intl';
 | 
						|
 | 
						|
import Overlay from 'react-overlays/Overlay';
 | 
						|
import type {
 | 
						|
  OffsetValue,
 | 
						|
  UsePopperOptions,
 | 
						|
} from 'react-overlays/esm/usePopper';
 | 
						|
 | 
						|
const offset = [0, 4] as OffsetValue;
 | 
						|
const popperConfig = { strategy: 'fixed' } as UsePopperOptions;
 | 
						|
 | 
						|
export const AltTextBadge: React.FC<{
 | 
						|
  description: string;
 | 
						|
}> = ({ description }) => {
 | 
						|
  const anchorRef = useRef<HTMLButtonElement>(null);
 | 
						|
  const [open, setOpen] = useState(false);
 | 
						|
 | 
						|
  const handleClick = useCallback(() => {
 | 
						|
    setOpen((v) => !v);
 | 
						|
  }, [setOpen]);
 | 
						|
 | 
						|
  const handleClose = useCallback(() => {
 | 
						|
    setOpen(false);
 | 
						|
  }, [setOpen]);
 | 
						|
 | 
						|
  return (
 | 
						|
    <>
 | 
						|
      <button
 | 
						|
        ref={anchorRef}
 | 
						|
        className='media-gallery__alt__label'
 | 
						|
        onClick={handleClick}
 | 
						|
      >
 | 
						|
        ALT
 | 
						|
      </button>
 | 
						|
 | 
						|
      <Overlay
 | 
						|
        rootClose
 | 
						|
        onHide={handleClose}
 | 
						|
        show={open}
 | 
						|
        target={anchorRef.current}
 | 
						|
        placement='top-end'
 | 
						|
        flip
 | 
						|
        offset={offset}
 | 
						|
        popperConfig={popperConfig}
 | 
						|
      >
 | 
						|
        {({ props }) => (
 | 
						|
          <div {...props} className='hover-card-controller'>
 | 
						|
            <div
 | 
						|
              className='media-gallery__alt__popover dropdown-animation'
 | 
						|
              role='tooltip'
 | 
						|
            >
 | 
						|
              <h4>
 | 
						|
                <FormattedMessage
 | 
						|
                  id='alt_text_badge.title'
 | 
						|
                  defaultMessage='Alt text'
 | 
						|
                />
 | 
						|
              </h4>
 | 
						|
              <p>{description}</p>
 | 
						|
            </div>
 | 
						|
          </div>
 | 
						|
        )}
 | 
						|
      </Overlay>
 | 
						|
    </>
 | 
						|
  );
 | 
						|
};
 |