Skip to content

Commit 98ef572

Browse files
committed
update build files
1 parent 3d48f47 commit 98ef572

8 files changed

+693
-166
lines changed

.github/HISTORY.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
# React-Images
22

3+
### v0.5.15 / 2018-01-25
4+
- spinner functionality pull request #187 thanks to [mkalygin] (https://github.com/(https://github.com/mkalygin)
5+
36
### v0.5.13 / 2017-11-29
47
- change srcset to srcSet to fix intermittent warning: Invalid DOM property `srcset`. Did you mean `srcSet`?
58

69
### v0.5.12 / 2017-11-29
7-
- Fix React warning issue #171 thanks to [kachkaev] (https://github.com/(https://github.com/smeijer)
10+
- Fix React warning issue #171 thanks to [kachkaev] (https://github.com/(https://github.com/kachkaev)
811

912
### v0.5.10 / 2017-10-18
1013
- New build

dist/react-images.es.js

+160-47
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
22
import React, { Children, Component } from 'react';
33
import { StyleSheet, css } from 'aphrodite';
44
import ScrollLock from 'react-scrolllock';
5+
import { BounceLoader } from 'react-spinners';
56
import { StyleSheet as StyleSheet$1, css as css$1 } from 'aphrodite/no-important';
67
import { CSSTransitionGroup } from 'react-transition-group';
78
import { render } from 'react-dom';
@@ -948,7 +949,9 @@ var Lightbox = function (_Component) {
948949

949950
_this.theme = deepMerge(theme, props.theme);
950951
_this.classes = StyleSheet.create(deepMerge(defaultStyles, _this.theme));
951-
bindFunctions.call(_this, ['gotoNext', 'gotoPrev', 'closeBackdrop', 'handleKeyboardInput']);
952+
_this.state = { imageLoaded: false };
953+
954+
bindFunctions.call(_this, ['gotoNext', 'gotoPrev', 'closeBackdrop', 'handleKeyboardInput', 'handleImageLoaded']);
952955
return _this;
953956
}
954957

@@ -994,6 +997,12 @@ var Lightbox = function (_Component) {
994997
}
995998
}
996999

1000+
// preload current image
1001+
if (this.props.currentImage !== nextProps.currentImage || !this.props.isOpen && nextProps.isOpen) {
1002+
var img = this.preloadImage(nextProps.currentImage, this.handleImageLoaded);
1003+
this.setState({ imageLoaded: img.complete });
1004+
}
1005+
9971006
// add/remove event listeners
9981007
if (!this.props.isOpen && nextProps.isOpen && nextProps.enableKeyboardInput) {
9991008
window.addEventListener('keydown', this.handleKeyboardInput);
@@ -1016,33 +1025,54 @@ var Lightbox = function (_Component) {
10161025

10171026
}, {
10181027
key: 'preloadImage',
1019-
value: function preloadImage(idx) {
1028+
value: function preloadImage(idx, onload) {
10201029
var image = this.props.images[idx];
10211030
if (!image) return;
10221031

10231032
var img = new Image();
10241033

1034+
// TODO: add error handling for missing images
1035+
img.onerror = onload;
1036+
img.onload = onload;
10251037
img.src = image.src;
10261038
img.srcSet = image.srcSet || image.srcset;
1039+
1040+
if (img.srcSet) img.setAttribute('srcset', img.srcSet);
1041+
1042+
return img;
10271043
}
10281044
}, {
10291045
key: 'gotoNext',
10301046
value: function gotoNext(event) {
1031-
if (this.props.currentImage === this.props.images.length - 1) return;
1047+
var _props = this.props,
1048+
currentImage = _props.currentImage,
1049+
images = _props.images;
1050+
var imageLoaded = this.state.imageLoaded;
1051+
1052+
1053+
if (!imageLoaded || currentImage === images.length - 1) return;
1054+
10321055
if (event) {
10331056
event.preventDefault();
10341057
event.stopPropagation();
10351058
}
1059+
10361060
this.props.onClickNext();
10371061
}
10381062
}, {
10391063
key: 'gotoPrev',
10401064
value: function gotoPrev(event) {
1041-
if (this.props.currentImage === 0) return;
1065+
var currentImage = this.props.currentImage;
1066+
var imageLoaded = this.state.imageLoaded;
1067+
1068+
1069+
if (!imageLoaded || currentImage === 0) return;
1070+
10421071
if (event) {
10431072
event.preventDefault();
10441073
event.stopPropagation();
10451074
}
1075+
10461076
this.props.onClickPrev();
10471077
}
10481078
}, {
@@ -1072,6 +1102,11 @@ var Lightbox = function (_Component) {
10721102
}
10731103
return false;
10741104
}
1105+
}, {
1106+
key: 'handleImageLoaded',
1107+
value: function handleImageLoaded() {
1108+
this.setState({ imageLoaded: true });
1109+
}
10751110

10761111
// ==============================
10771112
// RENDERERS
@@ -1106,14 +1141,12 @@ var Lightbox = function (_Component) {
11061141
}, {
11071142
key: 'renderDialog',
11081143
value: function renderDialog() {
1109-
var _props = this.props,
1110-
backdropClosesModal = _props.backdropClosesModal,
1111-
customControls = _props.customControls,
1112-
isOpen = _props.isOpen,
1113-
onClose = _props.onClose,
1114-
showCloseButton = _props.showCloseButton,
1115-
showThumbnails = _props.showThumbnails,
1116-
width = _props.width;
1144+
var _props2 = this.props,
1145+
backdropClosesModal = _props2.backdropClosesModal,
1146+
isOpen = _props2.isOpen,
1147+
showThumbnails = _props2.showThumbnails,
1148+
width = _props2.width;
1149+
var imageLoaded = this.state.imageLoaded;
11171150

11181151

11191152
if (!isOpen) return React.createElement('span', { key: 'closed' });
@@ -1132,31 +1165,31 @@ var Lightbox = function (_Component) {
11321165
},
11331166
React.createElement(
11341167
'div',
1135-
{ className: css(this.classes.content), style: { marginBottom: offsetThumbnails, maxWidth: width } },
1136-
React.createElement(Header, {
1137-
customControls: customControls,
1138-
onClose: onClose,
1139-
showCloseButton: showCloseButton,
1140-
closeButtonTitle: this.props.closeButtonTitle
1141-
}),
1142-
this.renderImages()
1143-
),
1144-
this.renderThumbnails(),
1145-
this.renderArrowPrev(),
1146-
this.renderArrowNext(),
1147-
React.createElement(ScrollLock, null)
1168+
null,
1169+
React.createElement(
1170+
'div',
1171+
{ className: css(this.classes.content), style: { marginBottom: offsetThumbnails, maxWidth: width } },
1172+
imageLoaded && this.renderHeader(),
1173+
this.renderImages(),
1174+
this.renderSpinner(),
1175+
imageLoaded && this.renderFooter()
1176+
),
1177+
imageLoaded && this.renderThumbnails(),
1178+
imageLoaded && this.renderArrowPrev(),
1179+
imageLoaded && this.renderArrowNext(),
1180+
React.createElement(ScrollLock, null)
1181+
)
11481182
);
11491183
}
11501184
}, {
11511185
key: 'renderImages',
11521186
value: function renderImages() {
1153-
var _props2 = this.props,
1154-
currentImage = _props2.currentImage,
1155-
images = _props2.images,
1156-
imageCountSeparator = _props2.imageCountSeparator,
1157-
onClickImage = _props2.onClickImage,
1158-
showImageCount = _props2.showImageCount,
1159-
showThumbnails = _props2.showThumbnails;
1187+
var _props3 = this.props,
1188+
currentImage = _props3.currentImage,
1189+
images = _props3.images,
1190+
onClickImage = _props3.onClickImage,
1191+
showThumbnails = _props3.showThumbnails;
1192+
var imageLoaded = this.state.imageLoaded;
11601193

11611194

11621195
if (!images || !images.length) return null;
@@ -1179,7 +1212,7 @@ var Lightbox = function (_Component) {
11791212
'figure',
11801213
{ className: css(this.classes.figure) },
11811214
React.createElement('img', {
1182-
className: css(this.classes.image),
1215+
className: css(this.classes.image, imageLoaded && this.classes.imageLoaded),
11831216
onClick: onClickImage,
11841217
sizes: sizes,
11851218
alt: image.alt,
@@ -1189,25 +1222,18 @@ var Lightbox = function (_Component) {
11891222
cursor: onClickImage ? 'pointer' : 'auto',
11901223
maxHeight: 'calc(100vh - ' + heightOffset + ')'
11911224
}
1192-
}),
1193-
React.createElement(Footer, {
1194-
caption: images[currentImage].caption,
1195-
countCurrent: currentImage + 1,
1196-
countSeparator: imageCountSeparator,
1197-
countTotal: images.length,
1198-
showCount: showImageCount
11991225
})
12001226
);
12011227
}
12021228
}, {
12031229
key: 'renderThumbnails',
12041230
value: function renderThumbnails() {
1205-
var _props3 = this.props,
1206-
images = _props3.images,
1207-
currentImage = _props3.currentImage,
1208-
onClickThumbnail = _props3.onClickThumbnail,
1209-
showThumbnails = _props3.showThumbnails,
1210-
thumbnailOffset = _props3.thumbnailOffset;
1231+
var _props4 = this.props,
1232+
images = _props4.images,
1233+
currentImage = _props4.currentImage,
1234+
onClickThumbnail = _props4.onClickThumbnail,
1235+
showThumbnails = _props4.showThumbnails,
1236+
thumbnailOffset = _props4.thumbnailOffset;
12111237

12121238

12131239
if (!showThumbnails) return;
@@ -1219,6 +1245,63 @@ var Lightbox = function (_Component) {
12191245
onClickThumbnail: onClickThumbnail
12201246
});
12211247
}
1248+
}, {
1249+
key: 'renderHeader',
1250+
value: function renderHeader() {
1251+
var _props5 = this.props,
1252+
closeButtonTitle = _props5.closeButtonTitle,
1253+
customControls = _props5.customControls,
1254+
onClose = _props5.onClose,
1255+
showCloseButton = _props5.showCloseButton;
1256+
1257+
1258+
return React.createElement(Header, {
1259+
customControls: customControls,
1260+
onClose: onClose,
1261+
showCloseButton: showCloseButton,
1262+
closeButtonTitle: closeButtonTitle
1263+
});
1264+
}
1265+
}, {
1266+
key: 'renderFooter',
1267+
value: function renderFooter() {
1268+
var _props6 = this.props,
1269+
currentImage = _props6.currentImage,
1270+
images = _props6.images,
1271+
imageCountSeparator = _props6.imageCountSeparator,
1272+
showImageCount = _props6.showImageCount;
1273+
1274+
1275+
if (!images || !images.length) return null;
1276+
1277+
return React.createElement(Footer, {
1278+
caption: images[currentImage].caption,
1279+
countCurrent: currentImage + 1,
1280+
countSeparator: imageCountSeparator,
1281+
countTotal: images.length,
1282+
showCount: showImageCount
1283+
});
1284+
}
1285+
}, {
1286+
key: 'renderSpinner',
1287+
value: function renderSpinner() {
1288+
var _props7 = this.props,
1289+
spinner = _props7.spinner,
1290+
spinnerColor = _props7.spinnerColor,
1291+
spinnerSize = _props7.spinnerSize;
1292+
var imageLoaded = this.state.imageLoaded;
1293+
1294+
var Spinner = spinner;
1295+
1296+
return React.createElement(
1297+
'div',
1298+
{ className: css(this.classes.spinner, !imageLoaded && this.classes.spinnerActive) },
1299+
React.createElement(Spinner, {
1300+
color: spinnerColor,
1301+
size: spinnerSize
1302+
})
1303+
);
1304+
}
12221305
}, {
12231306
key: 'render',
12241307
value: function render$$1() {
@@ -1232,6 +1315,10 @@ var Lightbox = function (_Component) {
12321315
return Lightbox;
12331316
}(Component);
12341317

1318+
var DefaultSpinner = function DefaultSpinner(props) {
1319+
return React.createElement(BounceLoader, props);
1320+
};
1321+
12351322
Lightbox.propTypes = {
12361323
backdropClosesModal: PropTypes.bool,
12371324
closeButtonTitle: PropTypes.string,
@@ -1256,6 +1343,9 @@ Lightbox.propTypes = {
12561343
showCloseButton: PropTypes.bool,
12571344
showImageCount: PropTypes.bool,
12581345
showThumbnails: PropTypes.bool,
1346+
spinner: PropTypes.func,
1347+
spinnerColor: PropTypes.string,
1348+
spinnerSize: PropTypes.number,
12591349
theme: PropTypes.object,
12601350
thumbnailOffset: PropTypes.number,
12611351
width: PropTypes.number
@@ -1271,6 +1361,9 @@ Lightbox.defaultProps = {
12711361
rightArrowTitle: 'Next (Right arrow key)',
12721362
showCloseButton: true,
12731363
showImageCount: true,
1364+
spinner: DefaultSpinner,
1365+
spinnerColor: 'white',
1366+
spinnerSize: 100,
12741367
theme: {},
12751368
thumbnailOffset: 2,
12761369
width: 1024
@@ -1294,7 +1387,27 @@ var defaultStyles = {
12941387

12951388
// disable user select
12961389
WebkitTouchCallout: 'none',
1297-
userSelect: 'none'
1390+
userSelect: 'none',
1391+
1392+
// opacity animation on image load
1393+
opacity: 0,
1394+
transition: 'opacity 0.3s'
1395+
},
1396+
imageLoaded: {
1397+
opacity: 1
1398+
},
1399+
spinner: {
1400+
position: 'absolute',
1401+
top: '50%',
1402+
left: '50%',
1403+
transform: 'translate(-50%, -50%)',
1404+
1405+
// opacity animation to make spinner appear with delay
1406+
opacity: 0,
1407+
transition: 'opacity 0.3s'
1408+
},
1409+
spinnerActive: {
1410+
opacity: 1
12981411
}
12991412
};
13001413

0 commit comments

Comments
 (0)