File size: 4,223 Bytes
8a37e0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import { Box, Flex, Image } from '@invoke-ai/ui-library';
import { useAppSelector } from 'app/store/storeHooks';
import { useBoolean } from 'common/hooks/useBoolean';
import { preventDefault } from 'common/util/stopPropagation';
import { TRANSPARENCY_CHECKERBOARD_PATTERN_DARK_DATAURL } from 'features/controlLayers/konva/patterns/transparency-checkerboard-pattern';
import type { Dimensions } from 'features/controlLayers/store/types';
import { ImageComparisonLabel } from 'features/gallery/components/ImageViewer/ImageComparisonLabel';
import { selectComparisonFit } from 'features/gallery/store/gallerySelectors';
import { memo, useMemo, useRef } from 'react';

import type { ComparisonProps } from './common';
import { fitDimsToContainer, getSecondImageDims } from './common';

export const ImageComparisonHover = memo(({ firstImage, secondImage, containerDims }: ComparisonProps) => {
  const comparisonFit = useAppSelector(selectComparisonFit);
  const imageContainerRef = useRef<HTMLDivElement>(null);
  const mouseOver = useBoolean(false);
  const fittedDims = useMemo<Dimensions>(
    () => fitDimsToContainer(containerDims, firstImage),
    [containerDims, firstImage]
  );
  const compareImageDims = useMemo<Dimensions>(
    () => getSecondImageDims(comparisonFit, fittedDims, firstImage, secondImage),
    [comparisonFit, fittedDims, firstImage, secondImage]
  );
  return (
    <Flex w="full" h="full" maxW="full" maxH="full" position="relative" alignItems="center" justifyContent="center">
      <Flex
        id="image-comparison-wrapper"
        w="full"
        h="full"
        maxW="full"
        maxH="full"
        position="absolute"
        alignItems="center"
        justifyContent="center"
      >
        <Box
          ref={imageContainerRef}
          position="relative"
          id="image-comparison-hover-image-container"
          w={fittedDims.width}
          h={fittedDims.height}
          maxW="full"
          maxH="full"
          userSelect="none"
          overflow="hidden"
          borderRadius="base"
        >
          <Image
            id="image-comparison-hover-first-image"
            src={firstImage.image_url}
            fallbackSrc={firstImage.thumbnail_url}
            w={fittedDims.width}
            h={fittedDims.height}
            maxW="full"
            maxH="full"
            objectFit="cover"
            objectPosition="top left"
          />
          <ImageComparisonLabel type="first" opacity={mouseOver.isTrue ? 0 : 1} />

          <Box
            id="image-comparison-hover-second-image-container"
            position="absolute"
            top={0}
            left={0}
            right={0}
            bottom={0}
            overflow="hidden"
            opacity={mouseOver.isTrue ? 1 : 0}
            transitionDuration="0.2s"
            transitionProperty="common"
          >
            <Box
              id="image-comparison-hover-bg"
              position="absolute"
              top={0}
              left={0}
              right={0}
              bottom={0}
              backgroundImage={TRANSPARENCY_CHECKERBOARD_PATTERN_DARK_DATAURL}
              backgroundRepeat="repeat"
            />
            <Image
              position="relative"
              id="image-comparison-hover-second-image"
              src={secondImage.image_url}
              fallbackSrc={secondImage.thumbnail_url}
              w={compareImageDims.width}
              h={compareImageDims.height}
              maxW={fittedDims.width}
              maxH={fittedDims.height}
              objectFit={comparisonFit}
              objectPosition="top left"
            />
            <ImageComparisonLabel type="second" opacity={mouseOver.isTrue ? 1 : 0} />
          </Box>
          <Box
            id="image-comparison-hover-interaction-overlay"
            position="absolute"
            top={0}
            right={0}
            bottom={0}
            left={0}
            onMouseOver={mouseOver.setTrue}
            onMouseOut={mouseOver.setFalse}
            onContextMenu={preventDefault}
            userSelect="none"
          />
        </Box>
      </Flex>
    </Flex>
  );
});

ImageComparisonHover.displayName = 'ImageComparisonHover';