react-giphy-searchbox-stickers
Version:
React Giphy Searchbox
212 lines (166 loc) • 7.16 kB
JavaScript
'use strict';
exports.__esModule = true;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactInfiniteScroller = require('react-infinite-scroller');
var _reactInfiniteScroller2 = _interopRequireDefault(_reactInfiniteScroller);
var _indexModule = require('./index.module.css');
var _indexModule2 = _interopRequireDefault(_indexModule);
var _SearchForm = require('./components/SearchForm/SearchForm');
var _SearchForm2 = _interopRequireDefault(_SearchForm);
var _ImageItem = require('./components/ImageItem/ImageItem');
var _ImageItem2 = _interopRequireDefault(_ImageItem);
var _PoweredByGiphy = require('./components/PoweredByGiphy/PoweredByGiphy');
var _PoweredByGiphy2 = _interopRequireDefault(_PoweredByGiphy);
var _MasonryLayout = require('./components/MasonryLayout/MasonryLayout');
var _MasonryLayout2 = _interopRequireDefault(_MasonryLayout);
var _Alert = require('./components/Alert/Alert');
var _Alert2 = _interopRequireDefault(_Alert);
var _Spinner = require('./components/Spinner/Spinner');
var _Spinner2 = _interopRequireDefault(_Spinner);
var _useSearchForm2 = require('./hooks/useSearchForm');
var _useSearchForm3 = _interopRequireDefault(_useSearchForm2);
var _useDebounce = require('./hooks/useDebounce');
var _useDebounce2 = _interopRequireDefault(_useDebounce);
var _useMedia = require('./hooks/useMedia');
var _useMedia2 = _interopRequireDefault(_useMedia);
var _useApi2 = require('./hooks/useApi');
var _useApi3 = _interopRequireDefault(_useApi2);
var _spinner = require('./assets/spinner.svg');
var _spinner2 = _interopRequireDefault(_spinner);
var _poweredByGiphy = require('./assets/poweredByGiphy.png');
var _poweredByGiphy2 = _interopRequireDefault(_poweredByGiphy);
var _masonry = require('./utils/masonry');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ReactGiphySearchBox = function ReactGiphySearchBox(_ref) {
var apiKey = _ref.apiKey,
gifListHeight = _ref.gifListHeight,
gifPerPage = _ref.gifPerPage,
listItemClassName = _ref.listItemClassName,
listWrapperClassName = _ref.listWrapperClassName,
loadingImage = _ref.loadingImage,
masonryConfig = _ref.masonryConfig,
messageError = _ref.messageError,
messageLoading = _ref.messageLoading,
messageNoMatches = _ref.messageNoMatches,
onSelect = _ref.onSelect,
poweredByGiphy = _ref.poweredByGiphy,
poweredByGiphyImage = _ref.poweredByGiphyImage,
rating = _ref.rating,
searchFormClassName = _ref.searchFormClassName,
searchPlaceholder = _ref.searchPlaceholder,
urlKind = _ref.urlKind,
wrapperClassName = _ref.wrapperClassName;
var _useSearchForm = (0, _useSearchForm3.default)(),
query = _useSearchForm.query,
handleInputChange = _useSearchForm.handleInputChange,
handleSubmit = _useSearchForm.handleSubmit;
var debouncedQuery = (0, _useDebounce2.default)(query, 500);
var apiEndpoint = query ? 'search' : 'trending';
var apiUrl = function apiUrl(offset) {
return 'https://api.giphy.com/v1/' + urlKind + '/' + apiEndpoint + '?api_key=' + apiKey + '&limit=' + gifPerPage + '&rating=' + rating + '&offset=' + offset + '&q=' + query;
};
var _useApi = (0, _useApi3.default)(),
_useApi$ = _useApi[0],
data = _useApi$.data,
loading = _useApi$.loading,
error = _useApi$.error,
lastPage = _useApi$.lastPage,
fetch = _useApi[1];
var masonryConfigMatchMedia = (0, _useMedia2.default)((0, _masonry.getMediaBreakpoints)(masonryConfig), (0, _masonry.getMasonryConfigExceptLast)(masonryConfig), (0, _masonry.getDefaultMasonryConfig)(masonryConfig));
// Fetch Giphy Api on component mount and on search query change
var _useState = (0, _react.useState)(true),
firstRun = _useState[0],
setFirstRun = _useState[1];
var isFirstRun = (0, _react.useRef)(true);
(0, _react.useEffect)(function () {
fetch(apiUrl(0));
if (isFirstRun.current) {
isFirstRun.current = false;
setFirstRun(false);
}
}, [debouncedQuery]);
return _react2.default.createElement(
'div',
{
className: '' + _indexModule2.default.componentWrapper + (wrapperClassName ? ' ' + wrapperClassName : ''),
style: { width: (0, _masonry.getComponentWrapperWidth)(masonryConfigMatchMedia) }
},
_react2.default.createElement(_SearchForm2.default, {
value: query,
setValue: handleInputChange,
onSubmit: handleSubmit,
loadingData: loading,
searchFormClassName: searchFormClassName,
placeholder: searchPlaceholder
}),
_react2.default.createElement(
'div',
{
className: '' + _indexModule2.default.listWrapper + (listWrapperClassName ? ' ' + listWrapperClassName : ''),
style: { height: gifListHeight }
},
_react2.default.createElement(_Alert2.default, {
show: data.length === 0 && !loading && !error && !firstRun,
message: messageNoMatches
}),
_react2.default.createElement(_Alert2.default, { show: error, message: messageError }),
_react2.default.createElement(_Spinner2.default, { show: loading, message: messageLoading, image: loadingImage }),
_react2.default.createElement(
_reactInfiniteScroller2.default,
{
pageStart: 0,
loadMore: function loadMore(page) {
return fetch(apiUrl(page * gifPerPage), true);
},
hasMore: !loading && !lastPage,
useWindow: false,
initialLoad: false,
loader: !firstRun && _react2.default.createElement(
'div',
{ key: 'loading' },
_react2.default.createElement(_Spinner2.default, {
show: loading,
message: messageLoading,
image: loadingImage
})
)
},
data.length > 0 && _react2.default.createElement(
_MasonryLayout2.default,
{ sizes: masonryConfig },
data.map(function (item) {
return _react2.default.createElement(_ImageItem2.default, {
item: item,
size: masonryConfigMatchMedia.imageWidth,
key: item.id,
listItemClassName: listItemClassName,
onSelect: onSelect
});
})
)
)
),
poweredByGiphy && _react2.default.createElement(_PoweredByGiphy2.default, { image: poweredByGiphyImage })
);
};
ReactGiphySearchBox.defaultProps = {
gifListHeight: '300px',
gifPerPage: 20,
listItemClassName: '',
listWrapperClassName: '',
loadingImage: _spinner2.default,
masonryConfig: [{ columns: 2, imageWidth: 120, gutter: 5 }],
messageError: 'Oops! Something went wrong. Please, try again.',
messageLoading: 'Loading...',
messageNoMatches: 'No matches found.',
poweredByGiphy: true,
poweredByGiphyImage: _poweredByGiphy2.default,
rating: 'g',
searchFormClassName: '',
wrapperClassName: '',
urlKind: 'gifs',
searchPlaceholder: 'Search for GIFs'
};
exports.default = ReactGiphySearchBox;
module.exports = exports['default'];