@transferwise/components 0.0.0-experimental-afb5fc3 → 0.0.0-experimental-11ac03b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,6 @@ var useHasIntersected = require('../common/hooks/useHasIntersected/useHasInterse
10
10
  require('../common/propsValues/breakpoint.js');
11
11
  var jsxRuntime = require('react/jsx-runtime');
12
12
 
13
- const EmptyTransparentImage = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
14
13
  const Image = ({
15
14
  id,
16
15
  src,
@@ -28,27 +27,27 @@ const Image = ({
28
27
  elRef: elementReference,
29
28
  loading
30
29
  });
31
- let imageSource = src;
32
- let imageOnLoad = onLoad;
33
- if (loading === 'lazy' && !hasIntersected) {
34
- imageSource = EmptyTransparentImage;
35
- imageOnLoad = undefined;
36
- }
30
+ // Internal onLoad handler that calls user onLoad only if hasIntersected is true
31
+ const handleLoad = React.useCallback(() => {
32
+ if (hasIntersected && onLoad) {
33
+ onLoad();
34
+ }
35
+ }, [hasIntersected, onLoad]);
37
36
  return /*#__PURE__*/jsxRuntime.jsx("img", {
38
37
  ref: elementReference,
39
38
  id: id,
40
39
  alt: alt,
41
- src: imageSource,
40
+ src: src,
41
+ loading: loading,
42
42
  className: clsx.clsx(['tw-image', {
43
43
  'tw-image__stretch': stretch,
44
44
  'tw-image__shrink': shrink
45
45
  }, className]),
46
46
  role: role,
47
- onLoad: imageOnLoad,
47
+ onLoad: handleLoad,
48
48
  onError: onError
49
49
  });
50
50
  };
51
51
 
52
- exports.EmptyTransparentImage = EmptyTransparentImage;
53
52
  exports.default = Image;
54
53
  //# sourceMappingURL=Image.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Image.js","sources":["../../src/image/Image.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useRef } from 'react';\n\nimport { useHasIntersected } from '../common/hooks';\n\nexport interface ImageProps {\n alt: string;\n src: string;\n id?: string;\n onLoad?: () => void;\n onError?: () => void;\n className?: string;\n loading?: 'lazy' | 'eager';\n stretch?: boolean;\n role?: string;\n shrink?: boolean;\n}\n\nexport const EmptyTransparentImage =\n 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\nconst Image = ({\n id,\n src,\n alt,\n onLoad,\n onError,\n className,\n loading,\n stretch = true,\n role,\n shrink = true,\n}: ImageProps) => {\n const elementReference = useRef<HTMLImageElement>(null);\n const [hasIntersected] = useHasIntersected({ elRef: elementReference, loading });\n let imageSource = src;\n let imageOnLoad = onLoad;\n\n if (loading === 'lazy' && !hasIntersected) {\n imageSource = EmptyTransparentImage;\n imageOnLoad = undefined;\n }\n\n return (\n <img\n ref={elementReference}\n id={id}\n alt={alt}\n src={imageSource}\n className={clsx([\n 'tw-image',\n {\n 'tw-image__stretch': stretch,\n 'tw-image__shrink': shrink,\n },\n className,\n ])}\n role={role}\n onLoad={imageOnLoad}\n onError={onError}\n />\n );\n};\n\nexport default Image;\n"],"names":["EmptyTransparentImage","Image","id","src","alt","onLoad","onError","className","loading","stretch","role","shrink","elementReference","useRef","hasIntersected","useHasIntersected","elRef","imageSource","imageOnLoad","undefined","_jsx","ref","clsx"],"mappings":";;;;;;;;;;;;AAkBO,MAAMA,qBAAqB,GAChC;AAEIC,MAAAA,KAAK,GAAGA,CAAC;EACbC,EAAE;EACFC,GAAG;EACHC,GAAG;EACHC,MAAM;EACNC,OAAO;EACPC,SAAS;EACTC,OAAO;AACPC,EAAAA,OAAO,GAAG,IAAI;EACdC,IAAI;AACJC,EAAAA,MAAM,GAAG;AAAI,CACF,KAAI;AACf,EAAA,MAAMC,gBAAgB,GAAGC,YAAM,CAAmB,IAAI,CAAC;AACvD,EAAA,MAAM,CAACC,cAAc,CAAC,GAAGC,mCAAiB,CAAC;AAAEC,IAAAA,KAAK,EAAEJ,gBAAgB;AAAEJ,IAAAA;AAAO,GAAE,CAAC;EAChF,IAAIS,WAAW,GAAGd,GAAG;EACrB,IAAIe,WAAW,GAAGb,MAAM;AAExB,EAAA,IAAIG,OAAO,KAAK,MAAM,IAAI,CAACM,cAAc,EAAE;AACzCG,IAAAA,WAAW,GAAGjB,qBAAqB;AACnCkB,IAAAA,WAAW,GAAGC,SAAS;AACzB;AAEA,EAAA,oBACEC,cAAA,CAAA,KAAA,EAAA;AACEC,IAAAA,GAAG,EAAET,gBAAiB;AACtBV,IAAAA,EAAE,EAAEA,EAAG;AACPE,IAAAA,GAAG,EAAEA,GAAI;AACTD,IAAAA,GAAG,EAAEc,WAAY;AACjBV,IAAAA,SAAS,EAAEe,SAAI,CAAC,CACd,UAAU,EACV;AACE,MAAA,mBAAmB,EAAEb,OAAO;AAC5B,MAAA,kBAAkB,EAAEE;KACrB,EACDJ,SAAS,CACV,CAAE;AACHG,IAAAA,IAAI,EAAEA,IAAK;AACXL,IAAAA,MAAM,EAAEa,WAAY;AACpBZ,IAAAA,OAAO,EAAEA;AAAQ,GACjB,CAAA;AAEN;;;;;"}
1
+ {"version":3,"file":"Image.js","sources":["../../src/image/Image.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useRef, useCallback } from 'react';\n\nimport { useHasIntersected } from '../common/hooks';\n\nexport interface ImageProps {\n alt: string;\n src: string;\n id?: string;\n onLoad?: () => void;\n onError?: () => void;\n className?: string;\n loading?: 'lazy' | 'eager';\n stretch?: boolean;\n role?: string;\n shrink?: boolean;\n}\n\nconst Image = ({\n id,\n src,\n alt,\n onLoad,\n onError,\n className,\n loading,\n stretch = true,\n role,\n shrink = true,\n}: ImageProps) => {\n const elementReference = useRef<HTMLImageElement>(null);\n const [hasIntersected] = useHasIntersected({ elRef: elementReference, loading });\n\n // Internal onLoad handler that calls user onLoad only if hasIntersected is true\n const handleLoad = useCallback(() => {\n if (hasIntersected && onLoad) {\n onLoad();\n }\n }, [hasIntersected, onLoad]);\n\n return (\n <img\n ref={elementReference}\n id={id}\n alt={alt}\n src={src}\n loading={loading}\n className={clsx([\n 'tw-image',\n {\n 'tw-image__stretch': stretch,\n 'tw-image__shrink': shrink,\n },\n className,\n ])}\n role={role}\n onLoad={handleLoad}\n onError={onError}\n />\n );\n};\n\nexport default Image;\n"],"names":["Image","id","src","alt","onLoad","onError","className","loading","stretch","role","shrink","elementReference","useRef","hasIntersected","useHasIntersected","elRef","handleLoad","useCallback","_jsx","ref","clsx"],"mappings":";;;;;;;;;;;;AAkBMA,MAAAA,KAAK,GAAGA,CAAC;EACbC,EAAE;EACFC,GAAG;EACHC,GAAG;EACHC,MAAM;EACNC,OAAO;EACPC,SAAS;EACTC,OAAO;AACPC,EAAAA,OAAO,GAAG,IAAI;EACdC,IAAI;AACJC,EAAAA,MAAM,GAAG;AAAI,CACF,KAAI;AACf,EAAA,MAAMC,gBAAgB,GAAGC,YAAM,CAAmB,IAAI,CAAC;AACvD,EAAA,MAAM,CAACC,cAAc,CAAC,GAAGC,mCAAiB,CAAC;AAAEC,IAAAA,KAAK,EAAEJ,gBAAgB;AAAEJ,IAAAA;AAAO,GAAE,CAAC;AAEhF;AACA,EAAA,MAAMS,UAAU,GAAGC,iBAAW,CAAC,MAAK;IAClC,IAAIJ,cAAc,IAAIT,MAAM,EAAE;AAC5BA,MAAAA,MAAM,EAAE;AACV;AACF,GAAC,EAAE,CAACS,cAAc,EAAET,MAAM,CAAC,CAAC;AAE5B,EAAA,oBACEc,cAAA,CAAA,KAAA,EAAA;AACEC,IAAAA,GAAG,EAAER,gBAAiB;AACtBV,IAAAA,EAAE,EAAEA,EAAG;AACPE,IAAAA,GAAG,EAAEA,GAAI;AACTD,IAAAA,GAAG,EAAEA,GAAI;AACTK,IAAAA,OAAO,EAAEA,OAAQ;AACjBD,IAAAA,SAAS,EAAEc,SAAI,CAAC,CACd,UAAU,EACV;AACE,MAAA,mBAAmB,EAAEZ,OAAO;AAC5B,MAAA,kBAAkB,EAAEE;KACrB,EACDJ,SAAS,CACV,CAAE;AACHG,IAAAA,IAAI,EAAEA,IAAK;AACXL,IAAAA,MAAM,EAAEY,UAAW;AACnBX,IAAAA,OAAO,EAAEA;AAAQ,GACjB,CAAA;AAEN;;;;"}
@@ -1,12 +1,11 @@
1
1
  import { clsx } from 'clsx';
2
- import { useRef } from 'react';
2
+ import { useRef, useCallback } from 'react';
3
3
  import '@transferwise/neptune-validation';
4
4
  import '../provider/direction/DirectionProvider.mjs';
5
5
  import { useHasIntersected } from '../common/hooks/useHasIntersected/useHasIntersected.mjs';
6
6
  import '../common/propsValues/breakpoint.mjs';
7
7
  import { jsx } from 'react/jsx-runtime';
8
8
 
9
- const EmptyTransparentImage = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
10
9
  const Image = ({
11
10
  id,
12
11
  src,
@@ -24,26 +23,27 @@ const Image = ({
24
23
  elRef: elementReference,
25
24
  loading
26
25
  });
27
- let imageSource = src;
28
- let imageOnLoad = onLoad;
29
- if (loading === 'lazy' && !hasIntersected) {
30
- imageSource = EmptyTransparentImage;
31
- imageOnLoad = undefined;
32
- }
26
+ // Internal onLoad handler that calls user onLoad only if hasIntersected is true
27
+ const handleLoad = useCallback(() => {
28
+ if (hasIntersected && onLoad) {
29
+ onLoad();
30
+ }
31
+ }, [hasIntersected, onLoad]);
33
32
  return /*#__PURE__*/jsx("img", {
34
33
  ref: elementReference,
35
34
  id: id,
36
35
  alt: alt,
37
- src: imageSource,
36
+ src: src,
37
+ loading: loading,
38
38
  className: clsx(['tw-image', {
39
39
  'tw-image__stretch': stretch,
40
40
  'tw-image__shrink': shrink
41
41
  }, className]),
42
42
  role: role,
43
- onLoad: imageOnLoad,
43
+ onLoad: handleLoad,
44
44
  onError: onError
45
45
  });
46
46
  };
47
47
 
48
- export { EmptyTransparentImage, Image as default };
48
+ export { Image as default };
49
49
  //# sourceMappingURL=Image.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Image.mjs","sources":["../../src/image/Image.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useRef } from 'react';\n\nimport { useHasIntersected } from '../common/hooks';\n\nexport interface ImageProps {\n alt: string;\n src: string;\n id?: string;\n onLoad?: () => void;\n onError?: () => void;\n className?: string;\n loading?: 'lazy' | 'eager';\n stretch?: boolean;\n role?: string;\n shrink?: boolean;\n}\n\nexport const EmptyTransparentImage =\n 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n\nconst Image = ({\n id,\n src,\n alt,\n onLoad,\n onError,\n className,\n loading,\n stretch = true,\n role,\n shrink = true,\n}: ImageProps) => {\n const elementReference = useRef<HTMLImageElement>(null);\n const [hasIntersected] = useHasIntersected({ elRef: elementReference, loading });\n let imageSource = src;\n let imageOnLoad = onLoad;\n\n if (loading === 'lazy' && !hasIntersected) {\n imageSource = EmptyTransparentImage;\n imageOnLoad = undefined;\n }\n\n return (\n <img\n ref={elementReference}\n id={id}\n alt={alt}\n src={imageSource}\n className={clsx([\n 'tw-image',\n {\n 'tw-image__stretch': stretch,\n 'tw-image__shrink': shrink,\n },\n className,\n ])}\n role={role}\n onLoad={imageOnLoad}\n onError={onError}\n />\n );\n};\n\nexport default Image;\n"],"names":["EmptyTransparentImage","Image","id","src","alt","onLoad","onError","className","loading","stretch","role","shrink","elementReference","useRef","hasIntersected","useHasIntersected","elRef","imageSource","imageOnLoad","undefined","_jsx","ref","clsx"],"mappings":";;;;;;;;AAkBO,MAAMA,qBAAqB,GAChC;AAEIC,MAAAA,KAAK,GAAGA,CAAC;EACbC,EAAE;EACFC,GAAG;EACHC,GAAG;EACHC,MAAM;EACNC,OAAO;EACPC,SAAS;EACTC,OAAO;AACPC,EAAAA,OAAO,GAAG,IAAI;EACdC,IAAI;AACJC,EAAAA,MAAM,GAAG;AAAI,CACF,KAAI;AACf,EAAA,MAAMC,gBAAgB,GAAGC,MAAM,CAAmB,IAAI,CAAC;AACvD,EAAA,MAAM,CAACC,cAAc,CAAC,GAAGC,iBAAiB,CAAC;AAAEC,IAAAA,KAAK,EAAEJ,gBAAgB;AAAEJ,IAAAA;AAAO,GAAE,CAAC;EAChF,IAAIS,WAAW,GAAGd,GAAG;EACrB,IAAIe,WAAW,GAAGb,MAAM;AAExB,EAAA,IAAIG,OAAO,KAAK,MAAM,IAAI,CAACM,cAAc,EAAE;AACzCG,IAAAA,WAAW,GAAGjB,qBAAqB;AACnCkB,IAAAA,WAAW,GAAGC,SAAS;AACzB;AAEA,EAAA,oBACEC,GAAA,CAAA,KAAA,EAAA;AACEC,IAAAA,GAAG,EAAET,gBAAiB;AACtBV,IAAAA,EAAE,EAAEA,EAAG;AACPE,IAAAA,GAAG,EAAEA,GAAI;AACTD,IAAAA,GAAG,EAAEc,WAAY;AACjBV,IAAAA,SAAS,EAAEe,IAAI,CAAC,CACd,UAAU,EACV;AACE,MAAA,mBAAmB,EAAEb,OAAO;AAC5B,MAAA,kBAAkB,EAAEE;KACrB,EACDJ,SAAS,CACV,CAAE;AACHG,IAAAA,IAAI,EAAEA,IAAK;AACXL,IAAAA,MAAM,EAAEa,WAAY;AACpBZ,IAAAA,OAAO,EAAEA;AAAQ,GACjB,CAAA;AAEN;;;;"}
1
+ {"version":3,"file":"Image.mjs","sources":["../../src/image/Image.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { useRef, useCallback } from 'react';\n\nimport { useHasIntersected } from '../common/hooks';\n\nexport interface ImageProps {\n alt: string;\n src: string;\n id?: string;\n onLoad?: () => void;\n onError?: () => void;\n className?: string;\n loading?: 'lazy' | 'eager';\n stretch?: boolean;\n role?: string;\n shrink?: boolean;\n}\n\nconst Image = ({\n id,\n src,\n alt,\n onLoad,\n onError,\n className,\n loading,\n stretch = true,\n role,\n shrink = true,\n}: ImageProps) => {\n const elementReference = useRef<HTMLImageElement>(null);\n const [hasIntersected] = useHasIntersected({ elRef: elementReference, loading });\n\n // Internal onLoad handler that calls user onLoad only if hasIntersected is true\n const handleLoad = useCallback(() => {\n if (hasIntersected && onLoad) {\n onLoad();\n }\n }, [hasIntersected, onLoad]);\n\n return (\n <img\n ref={elementReference}\n id={id}\n alt={alt}\n src={src}\n loading={loading}\n className={clsx([\n 'tw-image',\n {\n 'tw-image__stretch': stretch,\n 'tw-image__shrink': shrink,\n },\n className,\n ])}\n role={role}\n onLoad={handleLoad}\n onError={onError}\n />\n );\n};\n\nexport default Image;\n"],"names":["Image","id","src","alt","onLoad","onError","className","loading","stretch","role","shrink","elementReference","useRef","hasIntersected","useHasIntersected","elRef","handleLoad","useCallback","_jsx","ref","clsx"],"mappings":";;;;;;;;AAkBMA,MAAAA,KAAK,GAAGA,CAAC;EACbC,EAAE;EACFC,GAAG;EACHC,GAAG;EACHC,MAAM;EACNC,OAAO;EACPC,SAAS;EACTC,OAAO;AACPC,EAAAA,OAAO,GAAG,IAAI;EACdC,IAAI;AACJC,EAAAA,MAAM,GAAG;AAAI,CACF,KAAI;AACf,EAAA,MAAMC,gBAAgB,GAAGC,MAAM,CAAmB,IAAI,CAAC;AACvD,EAAA,MAAM,CAACC,cAAc,CAAC,GAAGC,iBAAiB,CAAC;AAAEC,IAAAA,KAAK,EAAEJ,gBAAgB;AAAEJ,IAAAA;AAAO,GAAE,CAAC;AAEhF;AACA,EAAA,MAAMS,UAAU,GAAGC,WAAW,CAAC,MAAK;IAClC,IAAIJ,cAAc,IAAIT,MAAM,EAAE;AAC5BA,MAAAA,MAAM,EAAE;AACV;AACF,GAAC,EAAE,CAACS,cAAc,EAAET,MAAM,CAAC,CAAC;AAE5B,EAAA,oBACEc,GAAA,CAAA,KAAA,EAAA;AACEC,IAAAA,GAAG,EAAER,gBAAiB;AACtBV,IAAAA,EAAE,EAAEA,EAAG;AACPE,IAAAA,GAAG,EAAEA,GAAI;AACTD,IAAAA,GAAG,EAAEA,GAAI;AACTK,IAAAA,OAAO,EAAEA,OAAQ;AACjBD,IAAAA,SAAS,EAAEc,IAAI,CAAC,CACd,UAAU,EACV;AACE,MAAA,mBAAmB,EAAEZ,OAAO;AAC5B,MAAA,kBAAkB,EAAEE;KACrB,EACDJ,SAAS,CACV,CAAE;AACHG,IAAAA,IAAI,EAAEA,IAAK;AACXL,IAAAA,MAAM,EAAEY,UAAW;AACnBX,IAAAA,OAAO,EAAEA;AAAQ,GACjB,CAAA;AAEN;;;;"}
@@ -10,7 +10,6 @@ export interface ImageProps {
10
10
  role?: string;
11
11
  shrink?: boolean;
12
12
  }
13
- export declare const EmptyTransparentImage = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
14
13
  declare const Image: ({ id, src, alt, onLoad, onError, className, loading, stretch, role, shrink, }: ImageProps) => import("react").JSX.Element;
15
14
  export default Image;
16
15
  //# sourceMappingURL=Image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../../src/image/Image.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,qBAAqB,+EAC4C,CAAC;AAE/E,QAAA,MAAM,KAAK,GAAI,+EAWZ,UAAU,gCA8BZ,CAAC;AAEF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../../src/image/Image.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,QAAA,MAAM,KAAK,GAAI,+EAWZ,UAAU,gCA+BZ,CAAC;AAEF,eAAe,KAAK,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-afb5fc3",
3
+ "version": "0.0.0-experimental-11ac03b",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -91,8 +91,8 @@
91
91
  "rollup": "^4.41.1",
92
92
  "rollup-preserve-directives": "^1.1.3",
93
93
  "storybook": "^8.6.14",
94
- "@transferwise/less-config": "3.1.2",
95
94
  "@transferwise/neptune-css": "14.24.4",
95
+ "@transferwise/less-config": "3.1.2",
96
96
  "@wise/components-theming": "1.6.3",
97
97
  "@wise/wds-configs": "0.0.0"
98
98
  },
@@ -1,7 +1,7 @@
1
1
  import * as useHasIntersectedUtils from '../common/hooks/useHasIntersected/useHasIntersected';
2
2
  import { render, fireEvent, screen } from '../test-utils';
3
3
 
4
- import { EmptyTransparentImage, ImageProps } from './Image';
4
+ import { ImageProps } from './Image';
5
5
 
6
6
  import Image from '.';
7
7
 
@@ -32,14 +32,14 @@ describe('Image', () => {
32
32
  });
33
33
 
34
34
  describe('when lazy loading is enabled', () => {
35
- it('renders the image with EmptyTransparentImage if element is not visible', () => {
35
+ it('renders the image with actual src even if element is not visible', () => {
36
36
  jest.spyOn(useHasIntersectedUtils, 'useHasIntersected').mockReturnValue([false]);
37
37
  render(<Image {...props} />);
38
38
 
39
39
  const image: HTMLImageElement = screen.getByRole('img');
40
40
 
41
41
  expect(image).toBeInTheDocument();
42
- expect(image.src).toStrictEqual(EmptyTransparentImage);
42
+ expect(image.src).toStrictEqual(props.src);
43
43
  });
44
44
 
45
45
  it('renders the image with src if element is visible', () => {
@@ -1,5 +1,5 @@
1
1
  import { clsx } from 'clsx';
2
- import { useRef } from 'react';
2
+ import { useRef, useCallback } from 'react';
3
3
 
4
4
  import { useHasIntersected } from '../common/hooks';
5
5
 
@@ -16,9 +16,6 @@ export interface ImageProps {
16
16
  shrink?: boolean;
17
17
  }
18
18
 
19
- export const EmptyTransparentImage =
20
- 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
21
-
22
19
  const Image = ({
23
20
  id,
24
21
  src,
@@ -33,20 +30,21 @@ const Image = ({
33
30
  }: ImageProps) => {
34
31
  const elementReference = useRef<HTMLImageElement>(null);
35
32
  const [hasIntersected] = useHasIntersected({ elRef: elementReference, loading });
36
- let imageSource = src;
37
- let imageOnLoad = onLoad;
38
33
 
39
- if (loading === 'lazy' && !hasIntersected) {
40
- imageSource = EmptyTransparentImage;
41
- imageOnLoad = undefined;
42
- }
34
+ // Internal onLoad handler that calls user onLoad only if hasIntersected is true
35
+ const handleLoad = useCallback(() => {
36
+ if (hasIntersected && onLoad) {
37
+ onLoad();
38
+ }
39
+ }, [hasIntersected, onLoad]);
43
40
 
44
41
  return (
45
42
  <img
46
43
  ref={elementReference}
47
44
  id={id}
48
45
  alt={alt}
49
- src={imageSource}
46
+ src={src}
47
+ loading={loading}
50
48
  className={clsx([
51
49
  'tw-image',
52
50
  {
@@ -56,7 +54,7 @@ const Image = ({
56
54
  className,
57
55
  ])}
58
56
  role={role}
59
- onLoad={imageOnLoad}
57
+ onLoad={handleLoad}
60
58
  onError={onError}
61
59
  />
62
60
  );
@@ -23,6 +23,7 @@ exports[`PromoCard matches snapshot 1`] = `
23
23
  <img
24
24
  alt="Test Image"
25
25
  class="tw-image tw-image__stretch tw-image__shrink"
26
+ loading="lazy"
26
27
  src="test.jpg"
27
28
  />
28
29
  </div>
@@ -33,6 +33,7 @@ exports[`PromoCardGroup matches snapshot 1`] = `
33
33
  <img
34
34
  alt=""
35
35
  class="tw-image tw-image__stretch tw-image__shrink"
36
+ loading="lazy"
36
37
  src="https://via.placeholder.com/150"
37
38
  />
38
39
  </div>
@@ -67,6 +68,7 @@ exports[`PromoCardGroup matches snapshot 1`] = `
67
68
  <img
68
69
  alt=""
69
70
  class="tw-image tw-image__stretch tw-image__shrink"
71
+ loading="lazy"
70
72
  src="https://via.placeholder.com/150"
71
73
  />
72
74
  </div>