index.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import React, { useCallback } from 'react';
  2. import { BlockType, NestedBlock } from '$app/interfaces/document';
  3. import { useImageBlock } from './useImageBlock';
  4. import EditImage from '$app/components/document/ImageBlock/EditImage';
  5. import { useBlockPopover } from '$app/components/document/_shared/BlockPopover/BlockPopover.hooks';
  6. import ImagePlaceholder from '$app/components/document/ImageBlock/ImagePlaceholder';
  7. import ImageRender from '$app/components/document/ImageBlock/ImageRender';
  8. function ImageBlock({ node }: { node: NestedBlock<BlockType.ImageBlock> }) {
  9. const { url } = node.data;
  10. const { displaySize, onResizeStart, src, alignSelf, loading, error } = useImageBlock(node);
  11. const renderPopoverContent = useCallback(
  12. ({ onClose }: { onClose: () => void }) => {
  13. return <EditImage onClose={onClose} id={node.id} url={url} />;
  14. },
  15. [node.id, url]
  16. );
  17. const { anchorElRef, contextHolder, openPopover } = useBlockPopover({
  18. id: node.id,
  19. renderContent: renderPopoverContent,
  20. });
  21. const { width, height } = displaySize;
  22. return (
  23. <>
  24. <div
  25. ref={anchorElRef}
  26. className={'my-1 flex min-h-[59px] cursor-pointer flex-col justify-center overflow-hidden rounded'}
  27. >
  28. <ImageRender
  29. node={node}
  30. width={width}
  31. height={height}
  32. alignSelf={alignSelf}
  33. src={src}
  34. onResizeStart={onResizeStart}
  35. />
  36. <ImagePlaceholder
  37. isEmpty={!src}
  38. alignSelf={alignSelf}
  39. width={width}
  40. height={height}
  41. loading={loading}
  42. error={error}
  43. openPopover={openPopover}
  44. />
  45. </div>
  46. {contextHolder}
  47. </>
  48. );
  49. }
  50. export default ImageBlock;