import React from "react";
import styled from "@emotion/styled";
import GatsbyImg from "gatsby-image";
import { IImg } from "@types";
/**
* To soften the blur-up we get from the default configuration of gatbsy image
* we're adding a CSS blur to the image. This makes it smoother!
*/
const StyledGatsbyImag = styled(GatsbyImg)`
& > img {
filter: blur(8px);
}
`;
/**
* src can be one of 3 formats:
* * Gatsby fixed image props
* * Gatsby fluid image props
* * String
* The component works out the best element to render. You can tell the difference
* between fluid and fixed Gatsby imagaes by checking to see if a width and height property exist.
*
* @example
*
*
*
*
* todo : lazyload the default img tag
*/
const Image: React.FC = ({ src, alt, ...props }) => {
// We're going to build our final component's props dynamically.
// So create a nice default set of props that are relevant to Gatsby and non Gatsby images
const imgProps = {
alt,
...props,
};
// TODO : Find where you have src null returns
if (!src) return null;
// Create a bool to tell us if the src is a string (vanilla img) or object (Gatsby)
const isGatsby = typeof src !== "string";
// Now we need to calculate the prop that will set the src of the image.
// This will either be src (for strings), fixed or fluid. Defaults to src
const keyForSrc =
// If src is an object with a width and height then we want fixed={src}
(isGatsby && src.width && src.height && "fixed") ||
// The only other Gatsby option would be fluid
(isGatsby && "fluid") ||
// Otherwise src is a string so set a vanilla src prop
"src";
// todo : throw an exception if it is neither src nor fixed nor fluid
// Now set either src, fixed or fluid to the src prop
imgProps[keyForSrc] = src;
// We don't want to CSS blur tracedSVG images! Only regular blur-ups.
const Component = src.tracedSVG ? GatsbyImg : StyledGatsbyImag;
// Retrun either the GatsbyImg component or a regular img tag with the spread props
return isGatsby ? :
;
};
export default Image;