StickyNoteTools.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import React, { useEffect, useCallback } from 'react';
  2. import { ANNOTATION_TYPE } from '../constants';
  3. import Button from '../components/Button';
  4. import Icon from '../components/Icon';
  5. import { getAbsoluteCoordinate } from '../helpers/position';
  6. import { parseAnnotationObject } from '../helpers/annotation';
  7. import { BtnWrapper } from '../global/toolStyled';
  8. import useActions from '../actions';
  9. import useStore from '../store';
  10. type Props = {
  11. title: string;
  12. isActive: boolean;
  13. onClick: () => void;
  14. };
  15. const StickyNoteTools: React.FC<Props> = ({
  16. title,
  17. isActive,
  18. onClick,
  19. }: Props) => {
  20. const [{ viewport, scale }, dispatch] = useStore();
  21. const { addAnnots } = useActions(dispatch);
  22. const addStickyNote = (pageEle: HTMLElement, event: MouseEvent): void => {
  23. const pageNum = pageEle.getAttribute('data-page-num') || 0;
  24. const coordinate = getAbsoluteCoordinate(pageEle, event);
  25. const annotData = {
  26. obj_type: ANNOTATION_TYPE.text,
  27. obj_attr: {
  28. page: pageNum as number,
  29. position: {
  30. top: coordinate.y,
  31. left: coordinate.x,
  32. bottom: coordinate.y,
  33. right: coordinate.x,
  34. },
  35. content: '',
  36. },
  37. };
  38. const stickyNote = parseAnnotationObject(annotData, viewport.height, scale);
  39. addAnnots([stickyNote], true);
  40. };
  41. const handleMouseDown = useCallback((event: MouseEvent): void => {
  42. event.preventDefault();
  43. const pageEle = (event.target as HTMLElement).parentNode as HTMLElement;
  44. if (pageEle.hasAttribute('data-page-num')) {
  45. addStickyNote(pageEle, event);
  46. }
  47. }, [viewport, scale]);
  48. useEffect(() => {
  49. const pdfViewer = document.getElementById('pdf_viewer') as HTMLDivElement;
  50. if (isActive && pdfViewer) {
  51. window.addEventListener('mousedown', handleMouseDown);
  52. }
  53. return (): void => {
  54. if (pdfViewer) {
  55. window.removeEventListener('mousedown', handleMouseDown);
  56. }
  57. };
  58. }, [isActive, handleMouseDown]);
  59. return (
  60. <BtnWrapper>
  61. <Button shouldFitContainer align="left" onClick={onClick} isActive={isActive}>
  62. <Icon glyph="sticky-note" style={{ marginRight: '10px' }} />
  63. {title}
  64. </Button>
  65. </BtnWrapper>
  66. );
  67. };
  68. export default StickyNoteTools;