@automattic/social-previews
Version:
A suite of components to generate previews for a post for both social and search engines.
42 lines (36 loc) • 1.19 kB
text/typescript
import { __ } from '@wordpress/i18n';
import { useCallback, useState } from 'react';
import { LANDSCAPE_MODE, PORTRAIT_MODE } from '../../constants';
import type { ImageMode } from '../types';
type ImageEventHandler = ( event: React.SyntheticEvent< HTMLImageElement > ) => void;
type ImgProps = {
alt: string;
onLoad: ImageEventHandler;
onError: ImageEventHandler;
};
type UseImage = ( arg0: { mode?: ImageMode } ) => [ ImageMode | undefined, boolean, ImgProps ];
const useImage: UseImage = ( { mode: initialMode } ) => {
const [ mode, setMode ] = useState< ImageMode | undefined >( initialMode );
const [ isLoadingImage, setLoadingImage ] = useState< boolean >( true );
const onLoad = useCallback< ImageEventHandler >(
( { target } ) => {
if ( ! mode ) {
const image = target as HTMLImageElement;
setMode( image.naturalWidth > image.naturalHeight ? LANDSCAPE_MODE : PORTRAIT_MODE );
}
setLoadingImage( false );
},
[ mode ]
);
const onError = useCallback( () => setLoadingImage( false ), [] );
return [
mode,
isLoadingImage,
{
alt: __( 'Facebook Preview Thumbnail', 'social-previews' ),
onLoad,
onError,
},
];
};
export default useImage;