From c5cacacfadf12c9321e932ce2fc3fa669b4c8807 Mon Sep 17 00:00:00 2001 From: eug-vs Date: Fri, 14 Aug 2020 16:16:01 +0300 Subject: feat: handle loading and error states in Image --- src/components/Image/Image.tsx | 55 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) (limited to 'src/components') diff --git a/src/components/Image/Image.tsx b/src/components/Image/Image.tsx index de67c6a..7736e8a 100644 --- a/src/components/Image/Image.tsx +++ b/src/components/Image/Image.tsx @@ -1,4 +1,7 @@ -import React from 'react'; +import React, { useState, useCallback } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import ErrorIcon from '@material-ui/icons/BrokenImage'; interface PropTypes { src?: string; @@ -6,8 +9,56 @@ interface PropTypes { className?: string; } +const useStyles = makeStyles(theme => ({ + container: { + width: '100%', + height: '100%', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + } +})); + +type Status = 'success' |'loading' | 'error'; + const Image: React.FC = ({ src, alt, className }) => { - return {alt}; + const classes = useStyles(); + const [status, setStatus] = useState('loading'); + + const handleLoad = useCallback((): void => { + setStatus('success'); + }, [setStatus]); + + const handleError = useCallback((): void => { + setStatus('error'); + }, [setStatus]); + + const image = ( + {alt} + ); + + return ( + <> + {src && image} + { + status !== 'success' && ( +
+ { + (status === 'error' || !src) + ? + : + } +
+ )} + + ); }; export default Image; -- cgit v1.2.3