StickyNoteTools.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 | TouchEvent): 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 + 20,
  33. right: coordinate.x + 20,
  34. },
  35. content: '',
  36. },
  37. };
  38. const stickyNote = parseAnnotationObject(annotData, viewport.height, scale);
  39. addAnnots([stickyNote], true);
  40. };
  41. const handleMouseDown = useCallback((event: MouseEvent | TouchEvent): 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('touchstart', handleMouseDown);
  52. window.addEventListener('mousedown', handleMouseDown);
  53. }
  54. return (): void => {
  55. if (pdfViewer) {
  56. window.removeEventListener('touchstart', handleMouseDown);
  57. window.removeEventListener('mousedown', handleMouseDown);
  58. }
  59. };
  60. }, [isActive, handleMouseDown]);
  61. return (
  62. <BtnWrapper>
  63. <Button shouldFitContainer align="left" onClick={onClick} isActive={isActive}>
  64. <Icon glyph="sticky-note" style={{ marginRight: '10px' }} />
  65. {title}
  66. </Button>
  67. </BtnWrapper>
  68. );
  69. };
  70. export default StickyNoteTools;