UNPKG

use-background-image

Version:

useBackgroundImage: for loading background images with just one tiny hook!

101 lines (79 loc) 2.13 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var reducer = function reducer(state, action) { switch (action.type) { case 'isLoading': return _extends({}, state, { src: action.src, isLoading: true, hasError: false }); case 'ERROR': return _extends({}, state, { src: action.src, isLoading: false, hasError: true }); default: return state; } }; var spacer = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='; var initialState = function initialState(placeholder) { return { isLoading: false, hasError: false, src: placeholder }; }; function useBackgroundImage(_ref) { var src = _ref.src, _ref$placeholder = _ref.placeholder, placeholder = _ref$placeholder === void 0 ? spacer : _ref$placeholder; var _React$useReducer = React.useReducer(reducer, initialState(placeholder)), state = _React$useReducer[0], dispatch = _React$useReducer[1]; React.useEffect(function () { var image = new Image(); image.onload = function () { return dispatch({ type: 'isLoading', src: src }); }; image.onerror = function () { return dispatch({ type: 'ERROR', src: placeholder }); }; image.src = src; return function () { image.onerror = function () { return null; }; image.onload = function () { return null; }; // @ts-ignore image = null; }; }, [src]); return state; } exports.useBackgroundImage = useBackgroundImage; //# sourceMappingURL=use-background-image.cjs.development.js.map