react-tridi
Version:
360-degree product viewer
1,156 lines (1,031 loc) • 41.9 kB
JavaScript
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = require('react');
var React__default = _interopDefault(React);
var PropTypes = _interopDefault(require('prop-types'));
var Animated = _interopDefault(require('animated/lib/targets/react-dom'));
var Hammer = _interopDefault(require('hammerjs'));
var styles = {"tridi-viewer":"_lqEjs","tridi-draggable-true":"_2kfM8","tridi-recording-true":"_f-Ry5","tridi-viewer-image":"_2VqNg","tridi-viewer-image-shown":"_3zqPm","tridi-viewer-image-hidden":"_1WW7u","tridi-hint-overlay":"_3Ohj5","tridi-hint":"_1Wsta","tridi-hint-text":"_14UgB","tridi-loading":"_JdKYk","load8":"_IpOvS","fadeIn":"_3uImN"};
function useInterval(callback, delay) {
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
args[_key - 2] = arguments[_key];
}
var savedCallback = React.useRef();
React.useEffect(function () {
savedCallback.current = callback;
}, [callback]);
React.useEffect(function () {
function tick() {
savedCallback.current.apply(savedCallback, args);
}
if (delay !== null && delay !== undefined) {
var id = setInterval(tick, delay);
return function () {
return clearInterval(id);
};
}
}, [delay]);
}
function useTridiKeyPressHandler(_ref) {
var nextMove = _ref.nextMove,
prevMove = _ref.prevMove;
var refPrevMove = React.useRef();
var refNextMove = React.useRef();
React.useEffect(function () {
refPrevMove.current = prevMove;
refNextMove.current = nextMove;
}, [nextMove, prevMove]);
function downHandler(_ref2) {
}
var upHandler = function upHandler(_ref3) {
var key = _ref3.key;
var keyEventConfig = {
ArrowLeft: refPrevMove,
ArrowRight: refNextMove
};
var keyEventHandler = keyEventConfig[key];
if (keyEventHandler) {
keyEventHandler.current();
}
};
React.useEffect(function () {
window.addEventListener('keydown', downHandler);
window.addEventListener('keyup', upHandler);
return function () {
window.removeEventListener('keydown', downHandler);
window.removeEventListener('keyup', upHandler);
};
}, []);
}
var styles$1 = {"tridi-control-bar":"_3jUN-","tridi-control-button":"_gReMg"};
var TargetIcon = function TargetIcon(props) {
return /*#__PURE__*/React__default.createElement("svg", props, /*#__PURE__*/React__default.createElement("path", {
d: "M21.526 13.2a9.605 9.605 0 0 1-8.326 8.326V24h-2.4v-2.474A9.605 9.605 0 0 1 2.474 13.2H0v-2.4h2.474A9.605 9.605 0 0 1 10.8 2.474V0h2.4v2.474a9.605 9.605 0 0 1 8.326 8.326H24v2.4h-2.474ZM12 19.2a7.2 7.2 0 1 0 0-14.4 7.2 7.2 0 0 0 0 14.4Z",
fill: "#212121"
}), /*#__PURE__*/React__default.createElement("circle", {
cx: "12",
cy: "12",
r: "4",
stroke: "#212121",
strokeWidth: "2"
}));
};
TargetIcon.defaultProps = {
width: "24",
height: "24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
var StopIcon = function StopIcon(props) {
return /*#__PURE__*/React__default.createElement("svg", props, /*#__PURE__*/React__default.createElement("path", {
d: "M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0Zm0 21.964c-5.502 0-9.964-4.462-9.964-9.964 0-5.502 4.462-9.964 9.964-9.964 5.502 0 9.964 4.462 9.964 9.964 0 5.502-4.462 9.964-9.964 9.964Z",
fill: "#212121"
}), /*#__PURE__*/React__default.createElement("path", {
d: "M15.556 8.73v6.826H8.73V8.73h6.827Zm.015-1.745H8.714a1.73 1.73 0 0 0-1.729 1.73v6.856a1.73 1.73 0 0 0 1.73 1.73h6.856a1.73 1.73 0 0 0 1.73-1.73V8.714a1.73 1.73 0 0 0-1.73-1.729Z",
fill: "#212121",
stroke: "#212121",
strokeWidth: ".03"
}));
};
StopIcon.defaultProps = {
width: "24",
height: "24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
var NextIcon = function NextIcon(props) {
return /*#__PURE__*/React__default.createElement("svg", props, /*#__PURE__*/React__default.createElement("path", {
d: "m16.144 11.826-6.59-4.768a.214.214 0 0 0-.34.174v1.256c0 .274.132.533.354.694L13.463 12l-3.895 2.818a.854.854 0 0 0-.354.694v1.256c0 .174.198.276.34.174l6.59-4.768a.216.216 0 0 0 0-.348Z",
fill: "#212121"
}), /*#__PURE__*/React__default.createElement("path", {
d: "M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0Zm0 21.964c-5.502 0-9.964-4.462-9.964-9.964 0-5.502 4.462-9.964 9.964-9.964 5.502 0 9.964 4.462 9.964 9.964 0 5.502-4.462 9.964-9.964 9.964Z",
fill: "#212121"
}));
};
NextIcon.defaultProps = {
width: "24",
height: "24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
var PauseIcon = function PauseIcon(props) {
return /*#__PURE__*/React__default.createElement("svg", props, /*#__PURE__*/React__default.createElement("path", {
d: "M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0Zm0 21.964c-5.502 0-9.964-4.462-9.964-9.964 0-5.502 4.462-9.964 9.964-9.964 5.502 0 9.964 4.462 9.964 9.964 0 5.502-4.462 9.964-9.964 9.964ZM9.643 7.714H8.357a.215.215 0 0 0-.214.215v8.142c0 .118.096.215.214.215h1.286a.215.215 0 0 0 .214-.215V7.93a.215.215 0 0 0-.214-.215Zm6 0h-1.286a.215.215 0 0 0-.214.215v8.142c0 .118.096.215.214.215h1.286a.215.215 0 0 0 .214-.215V7.93a.215.215 0 0 0-.214-.215Z",
fill: "#212121"
}));
};
PauseIcon.defaultProps = {
width: "24",
height: "24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
var PlayIcon = function PlayIcon(props) {
return /*#__PURE__*/React__default.createElement("svg", props, /*#__PURE__*/React__default.createElement("path", {
d: "M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0Zm0 21.964c-5.502 0-9.964-4.462-9.964-9.964 0-5.502 4.462-9.964 9.964-9.964 5.502 0 9.964 4.462 9.964 9.964 0 5.502-4.462 9.964-9.964 9.964Z",
fill: "#212121"
}), /*#__PURE__*/React__default.createElement("path", {
d: "m17.555 11.655-7.93-5.76a.426.426 0 0 0-.679.346V17.76c0 .35.397.55.678.346l7.931-5.76a.426.426 0 0 0 0-.69Zm-6.9 3.589V8.756L15.121 12l-4.466 3.244Z",
fill: "#212121"
}));
};
PlayIcon.defaultProps = {
width: "24",
height: "24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
var ZoomInIcon = function ZoomInIcon(props) {
return /*#__PURE__*/React__default.createElement("svg", props, /*#__PURE__*/React__default.createElement("path", {
d: "M15.649 9.985h-3.445V6.074a.234.234 0 0 0-.234-.234H10.22a.234.234 0 0 0-.234.234v3.911H6.541a.234.234 0 0 0-.234.234v1.751c0 .129.105.234.234.234h3.444v3.912c0 .128.106.233.234.233h1.751a.234.234 0 0 0 .234-.233v-3.912h3.444a.234.234 0 0 0 .234-.234V10.22a.234.234 0 0 0-.233-.234Zm8.29 12.377-4.262-4.261c3.564-4.347 3.316-10.787-.76-14.859-4.32-4.323-11.337-4.323-15.675 0-4.323 4.338-4.323 11.356 0 15.676 4.072 4.075 10.512 4.323 14.858.759l4.262 4.262c.094.081.243.081.322 0l1.255-1.256c.081-.078.081-.227 0-.32Zm-6.568-4.991a8.878 8.878 0 0 1-12.552 0 8.878 8.878 0 0 1 0-12.552 8.878 8.878 0 0 1 12.552 0 8.878 8.878 0 0 1 0 12.552Z",
fill: "#212121"
}));
};
ZoomInIcon.defaultProps = {
width: "24",
height: "24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
var ZoomOutIcon = function ZoomOutIcon(props) {
return /*#__PURE__*/React__default.createElement("svg", props, /*#__PURE__*/React__default.createElement("path", {
d: "M15.649 9.985H6.54a.234.234 0 0 0-.234.234v1.751c0 .129.105.234.234.234h9.107a.234.234 0 0 0 .234-.234V10.22a.234.234 0 0 0-.233-.234Zm8.29 12.377-4.262-4.261c3.564-4.347 3.316-10.787-.76-14.859-4.32-4.323-11.337-4.323-15.675 0-4.323 4.338-4.323 11.356 0 15.676 4.072 4.075 10.512 4.323 14.858.759l4.262 4.262c.094.081.243.081.322 0l1.255-1.256c.081-.078.081-.227 0-.32Zm-6.568-4.991a8.878 8.878 0 0 1-12.552 0 8.878 8.878 0 0 1 0-12.552 8.878 8.878 0 0 1 12.552 0 8.878 8.878 0 0 1 0 12.552Z",
fill: "#212121"
}));
};
ZoomOutIcon.defaultProps = {
width: "24",
height: "24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
var MoveIcon = function MoveIcon(props) {
return /*#__PURE__*/React__default.createElement("svg", props, /*#__PURE__*/React__default.createElement("path", {
d: "m23.92 11.83-3.828-3.02a.217.217 0 0 0-.351.17v1.942h-6.66v-6.66h1.944c.18 0 .282-.21.171-.351L12.172.083a.215.215 0 0 0-.339 0L8.81 3.911a.217.217 0 0 0 .17.351h1.941v6.66h-6.66V8.978c0-.18-.21-.282-.35-.171L.083 11.83a.214.214 0 0 0 0 .338l3.825 3.024a.217.217 0 0 0 .35-.17V13.08h6.66v6.66H8.975c-.18 0-.282.21-.171.351l3.023 3.825c.087.11.255.11.34 0l3.023-3.825a.217.217 0 0 0-.171-.351h-1.938v-6.66h6.66v1.944c0 .18.21.282.35.171l3.825-3.024a.22.22 0 0 0 .003-.341Z",
fill: "#212121"
}));
};
MoveIcon.defaultProps = {
width: "24",
height: "24",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
var ControlBar = function ControlBar(_ref) {
var isPlaying = _ref.isPlaying,
isRecording = _ref.isRecording,
isMoveing = _ref.isMoveing,
setIsPlaying = _ref.setIsPlaying,
setIsRecording = _ref.setIsRecording,
onPlay = _ref.onPlay,
onPause = _ref.onPause,
onNext = _ref.onNext,
onPrev = _ref.onPrev,
onRecordStart = _ref.onRecordStart,
onRecordStop = _ref.onRecordStop,
onZoomout = _ref.onZoomout,
onZoomin = _ref.onZoomin,
onStartMoveing = _ref.onStartMoveing,
onStopMoveing = _ref.onStopMoveing,
hideRecord = _ref.hideRecord;
var playHandler = function playHandler() {
setIsPlaying(true);
onPlay();
};
var pauseHandler = function pauseHandler() {
setIsPlaying(false);
onPause();
};
var recordStartHandler = function recordStartHandler() {
setIsRecording(true);
onRecordStart();
};
var recordStopHandler = function recordStopHandler() {
setIsRecording(false);
onRecordStop();
};
var moveStartHandler = function moveStartHandler() {
onStartMoveing();
};
var moveStopHandler = function moveStopHandler() {
onStopMoveing();
};
return /*#__PURE__*/React__default.createElement("div", {
className: "tridi-control-bar " + styles$1['tridi-control-bar'],
onClick: function onClick(e) {
return e.stopPropagation();
}
}, !hideRecord && !isRecording && /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
onClick: recordStartHandler
}, /*#__PURE__*/React__default.createElement(TargetIcon, null)), !hideRecord && isRecording && /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
onClick: recordStopHandler
}, /*#__PURE__*/React__default.createElement(StopIcon, null)), !isPlaying && /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
onClick: playHandler
}, /*#__PURE__*/React__default.createElement(PlayIcon, null)), isPlaying && /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
onClick: pauseHandler
}, /*#__PURE__*/React__default.createElement(PauseIcon, null)), /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
style: {
transform: 'rotate(180deg)'
},
onClick: onPrev
}, /*#__PURE__*/React__default.createElement(NextIcon, null)), /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
onClick: onNext
}, /*#__PURE__*/React__default.createElement(NextIcon, null)), /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
onClick: onZoomout
}, /*#__PURE__*/React__default.createElement(ZoomOutIcon, null)), /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
onClick: onZoomin
}, /*#__PURE__*/React__default.createElement(ZoomInIcon, null)), !isMoveing && /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
onClick: moveStartHandler
}, /*#__PURE__*/React__default.createElement(MoveIcon, null)), isMoveing && /*#__PURE__*/React__default.createElement("a", {
className: "" + styles$1['tridi-control-button'],
onClick: moveStopHandler
}, /*#__PURE__*/React__default.createElement(StopIcon, null)));
};
var styles$2 = {"tridi-dot":"_1TrFD","tridi-pin":"_1QXU8"};
var Pins = function Pins(_ref) {
var pins = _ref.pins,
viewerWidth = _ref.viewerWidth,
viewerHeight = _ref.viewerHeight,
currentFrameId = _ref.currentFrameId,
pinWidth = _ref.pinWidth,
pinHeight = _ref.pinHeight,
renderPin = _ref.renderPin,
onPinDoubleClick = _ref.onPinDoubleClick,
onPinClick = _ref.onPinClick;
var getPosition = function getPosition(pin) {
if (viewerWidth >= 0 && viewerHeight >= 0) {
return {
left: (pin.x * 100).toFixed(3) + '%',
marginTop: "-" + pinHeight / 2 + "px",
marginLeft: "-" + pinWidth / 2 + "px",
top: (pin.y * 100).toFixed(3) + '%'
};
}
return {
display: 'none'
};
};
return /*#__PURE__*/React__default.createElement("div", {
className: "tridi-dots-wrapper"
}, (pins === null || pins === void 0 ? void 0 : pins.length) > 0 && pins.filter(function (pin) {
return pin.frameId === currentFrameId;
}).map(function (pin, index) {
return renderPin ? /*#__PURE__*/React__default.createElement("div", {
key: index,
className: "tridi-pin " + styles$2['tridi-pin'],
style: getPosition(pin),
onDoubleClick: function onDoubleClick(e) {
e.stopPropagation();
onPinDoubleClick(pin);
},
onClick: function onClick(e) {
e.stopPropagation();
onPinClick(pin);
}
}, renderPin(pin)) : /*#__PURE__*/React__default.createElement("div", {
key: index,
className: "tridi-dot " + styles$2['tridi-dot'],
style: getPosition(pin),
onDoubleClick: function onDoubleClick(e) {
e.stopPropagation();
onPinDoubleClick(pin);
},
onClick: function onClick(e) {
e.stopPropagation();
onPinClick(pin);
}
});
}));
};
Pins.defaultProps = {
pins: [],
pinWidth: 10,
pinHeight: 10,
onDoubleClick: function onDoubleClick() {},
onPinClick: function onPinClick() {}
};
var styles$3 = {"tridi-status-bar":"_2_pZm"};
var StatusBar = function StatusBar(_ref) {
var isRecording = _ref.isRecording,
currentImageIndex = _ref.currentImageIndex;
return /*#__PURE__*/React__default.createElement("div", {
className: "tridi-status-bar " + styles$3['tridi-status-bar']
}, /*#__PURE__*/React__default.createElement("div", {
className: "status-info"
}, /*#__PURE__*/React__default.createElement("span", {
className: "info-label"
}, "Frame Id: "), /*#__PURE__*/React__default.createElement("span", {
className: "info-value"
}, currentImageIndex)), isRecording && /*#__PURE__*/React__default.createElement("div", {
className: "status-info"
}, /*#__PURE__*/React__default.createElement("span", {
className: "info-label"
}, "Recording...")));
};
var DragIcon = function DragIcon(props) {
return /*#__PURE__*/React__default.createElement("svg", props, /*#__PURE__*/React__default.createElement("path", {
d: "M31.37 3.216h-9.652a.805.805 0 0 0 0 1.61h9.653a.805.805 0 0 0 0-1.61Z",
fill: "#212121"
}), /*#__PURE__*/React__default.createElement("path", {
d: "M31.94 3.453 28.724.235a.805.805 0 0 0-1.137 1.138l2.648 2.648-2.65 2.65a.805.805 0 0 0 1.139 1.137L31.94 4.59a.805.805 0 0 0 0-1.137ZM10.457 3.216H.805a.805.805 0 0 0 0 1.61h9.652a.805.805 0 0 0 0-1.61Z",
fill: "#212121"
}), /*#__PURE__*/React__default.createElement("path", {
d: "M1.942 4.02 4.59 1.374A.805.805 0 0 0 3.453.235L.235 3.453a.805.805 0 0 0 0 1.137l3.218 3.218a.808.808 0 0 0 1.137-.002.805.805 0 0 0 0-1.137L1.942 4.02Z",
fill: "#212121"
}), /*#__PURE__*/React__default.createElement("path", {
d: "M1.942 4.02 4.59 1.374A.805.805 0 0 0 3.453.235L.235 3.453a.805.805 0 0 0 0 1.137l3.218 3.218a.808.808 0 0 0 1.137-.002.805.805 0 0 0 0-1.137L1.942 4.02ZM27.419 10.056c-.491.099-.92.34-1.248.67a2.443 2.443 0 0 0-2.576-1.147c-.491.098-.919.34-1.248.67a2.443 2.443 0 0 0-2.576-1.147c-.435.087-.82.286-1.13.56l-.782-3.906a2.44 2.44 0 0 0-2.869-1.911 2.44 2.44 0 0 0-1.911 2.868l2.033 10.157-2.388-1.141a3.195 3.195 0 0 0-4.016 1.104 1.83 1.83 0 0 0 .508 2.535l10.212 6.806a5.45 5.45 0 0 0 4.119.814l2.8-.561a6.71 6.71 0 0 0 5.256-7.888l-1.316-6.572a2.44 2.44 0 0 0-2.868-1.91Zm2.989 8.723a5.49 5.49 0 0 1-4.3 6.453l-2.8.56a4.238 4.238 0 0 1-3.204-.632L9.891 18.354a.61.61 0 0 1-.169-.845 1.966 1.966 0 0 1 1.25-.832c.405-.08.836-.037 1.228.15l3.486 1.668a.611.611 0 0 0 .86-.67L14.275 6.474a1.22 1.22 0 0 1 2.39-.478l1.794 8.961a.61.61 0 0 0 1.195-.239l-.598-2.987a1.22 1.22 0 0 1 2.39-.479l.597 2.987A.61.61 0 0 0 23.237 14l-.358-1.792a1.22 1.22 0 0 1 2.39-.479l.358 1.793a.61.61 0 0 0 1.195-.24l-.12-.597a1.22 1.22 0 0 1 .956-1.434 1.22 1.22 0 0 1 1.434.956l1.316 6.572Z",
fill: "#212121"
}));
};
DragIcon.defaultProps = {
width: "33",
height: "30",
fill: "none",
xmlns: "http://www.w3.org/2000/svg"
};
var AnimatedDiv = Animated.div;
var TridiUtils = function TridiUtils() {};
TridiUtils.isValidProps = function (_ref2) {
var images = _ref2.images,
format = _ref2.format,
location = _ref2.location;
var isValid = true;
if (!images && !format) {
console.error("'format' property is missing or invalid. Image format must be provided for 'numbered' property.");
isValid = false;
}
if (images === 'numbered' && !location) {
console.error("'location' property is missing or invalid. Image location must be provided for 'numbered' property.");
isValid = false;
}
return isValid;
};
TridiUtils.normalizedImages = function (images, format, location, count) {
if (images === 'numbered') {
return Array.apply(null, {
length: count
}).map(function (_a, index) {
return location + "/" + (index + 1) + "." + format.toLowerCase();
});
}
return images;
};
TridiUtils.uid = function () {
return Date.now().toString(36) + Math.random().toString(36).substr(2);
};
var Tridi = React.forwardRef(function (_ref, ref) {
var className = _ref.className,
images = _ref.images,
pins = _ref.pins,
pinWidth = _ref.pinWidth,
pinHeight = _ref.pinHeight,
setPins = _ref.setPins,
format = _ref.format,
location = _ref.location,
count = _ref.count,
draggable = _ref.draggable,
hintOnStartup = _ref.hintOnStartup,
hintText = _ref.hintText,
autoplay = _ref.autoplay,
autoplaySpeed = _ref.autoplaySpeed,
stopAutoplayOnClick = _ref.stopAutoplayOnClick,
stopAutoplayOnMouseEnter = _ref.stopAutoplayOnMouseEnter,
resumeAutoplayOnMouseLeave = _ref.resumeAutoplayOnMouseLeave,
touch = _ref.touch,
mousewheel = _ref.mousewheel,
inverse = _ref.inverse,
dragInterval = _ref.dragInterval,
touchDragInterval = _ref.touchDragInterval,
mouseleaveDetect = _ref.mouseleaveDetect,
showControlBar = _ref.showControlBar,
showStatusBar = _ref.showStatusBar,
renderPin = _ref.renderPin,
renderHint = _ref.renderHint,
zoom = _ref.zoom,
onHintHide = _ref.onHintHide,
onAutoplayStart = _ref.onAutoplayStart,
onAutoplayStop = _ref.onAutoplayStop,
onNextMove = _ref.onNextMove,
onPrevMove = _ref.onPrevMove,
onNextFrame = _ref.onNextFrame,
onPrevFrame = _ref.onPrevFrame,
onDragStart = _ref.onDragStart,
onDragEnd = _ref.onDragEnd,
onFrameChange = _ref.onFrameChange,
onRecordStart = _ref.onRecordStart,
onRecordStop = _ref.onRecordStop,
onPinClick = _ref.onPinClick,
onZoom = _ref.onZoom,
maxZoom = _ref.maxZoom,
minZoom = _ref.minZoom,
hideRecord = _ref.hideRecord,
onLoadChange = _ref.onLoadChange;
var _useState = React.useState([]),
moveBuffer = _useState[0],
setMoveBuffer = _useState[1];
var _useState2 = React.useState(hintOnStartup),
hintVisible = _useState2[0],
setHintVisible = _useState2[1];
var _useState3 = React.useState(0),
currentImageIndex = _useState3[0],
setCurrentImageIndex = _useState3[1];
var _useState4 = React.useState(false),
isDragging = _useState4[0],
setIsDragging = _useState4[1];
var _useState5 = React.useState(false),
isAutoPlayRunning = _useState5[0],
setIsAutoPlayRunning = _useState5[1];
var _useState6 = React.useState(false),
isRecording = _useState6[0],
setIsRecording = _useState6[1];
var _useState7 = React.useState(null),
recordingSessionId = _useState7[0],
setRecordingSessionId = _useState7[1];
var _useState8 = React.useState(false),
isPlaying = _useState8[0],
setIsPlaying = _useState8[1];
var _useState9 = React.useState(false),
isMoveing = _useState9[0],
setIsMoveing = _useState9[1];
var AnimatedValues = React.useRef({
x: new Animated.Value(0),
y: new Animated.Value(0),
zoom: new Animated.Value(zoom),
originZoom: 1,
originOffset: null,
isZooming: false
});
var _useState10 = React.useState(null),
viewerSize = _useState10[0],
setViewerSize = _useState10[1];
var _count = Array.isArray(images) ? images.length : Number(count);
var _images = TridiUtils.normalizedImages(images, format, location, _count);
var _viewerImageRef = React.useRef(null);
var _viewerZoomRef = React.useRef(null);
var _draggable = !isRecording && draggable;
var _useState11 = React.useState(0),
loadedImagesCount = _useState11[0],
setLoadedImagesCount = _useState11[1];
var hideHint = function hideHint() {
setHintVisible(false);
onHintHide();
};
var nextFrame = React.useCallback(function () {
var newIndex = currentImageIndex >= _count - 1 ? 0 : currentImageIndex + 1;
setCurrentImageIndex(newIndex);
onNextFrame();
onFrameChange(newIndex);
}, [_count, currentImageIndex, onFrameChange, onNextFrame]);
var prevFrame = React.useCallback(function () {
var newIndex = currentImageIndex <= 0 ? _count - 1 : currentImageIndex - 1;
setCurrentImageIndex(newIndex);
onPrevFrame();
onFrameChange(newIndex);
}, [_count, currentImageIndex, onFrameChange, onPrevFrame]);
var nextMove = React.useCallback(function () {
onNextMove();
return inverse ? prevFrame() : nextFrame();
}, [inverse, nextFrame, onNextMove, prevFrame]);
var prevMove = React.useCallback(function () {
onPrevMove();
return inverse ? nextFrame() : prevFrame();
}, [inverse, nextFrame, onPrevMove, prevFrame]);
var rotateViewerImage = React.useCallback(function (e) {
var interval = e.touches ? touchDragInterval : dragInterval;
var eventX = e.touches ? Math.round(e.touches[0].clientX) : e.clientX;
var coord = eventX - _viewerImageRef.current.offsetLeft;
var newMoveBufffer = moveBuffer;
if (moveBuffer.length < 2) {
newMoveBufffer = moveBuffer.concat(coord);
} else {
newMoveBufffer = [moveBuffer[1], coord];
}
setMoveBuffer(newMoveBufffer);
var threshold = !(coord % interval);
var oldMove = newMoveBufffer[0];
var newMove = newMoveBufffer[1];
if (threshold && newMove < oldMove) {
nextMove();
} else if (threshold && newMove > oldMove) {
prevMove();
}
}, [dragInterval, moveBuffer, nextMove, prevMove, touchDragInterval]);
var resetMoveBuffer = function resetMoveBuffer() {
return setMoveBuffer([]);
};
var startDragging = React.useCallback(function () {
setIsDragging(true);
onDragStart();
}, [onDragStart]);
var stopDragging = React.useCallback(function () {
setIsDragging(false);
onDragEnd();
}, [onDragEnd]);
var _toggleAutoplay = React.useCallback(function (state) {
setIsAutoPlayRunning(state);
return state ? onAutoplayStart() : onAutoplayStop();
}, [onAutoplayStart, onAutoplayStop]);
var _toggleRecording = React.useCallback(function (state, existingSessionId) {
setIsRecording(state);
var sessionId = recordingSessionId || existingSessionId || TridiUtils.uid();
if (state) {
if (!recordingSessionId) {
setRecordingSessionId(sessionId);
}
onRecordStart(sessionId);
} else {
setRecordingSessionId(null);
onRecordStop(sessionId);
}
}, [onRecordStart, onRecordStop, recordingSessionId]);
var resetPosition = React.useCallback(function () {
console.log('resetPosition');
AnimatedValues.current.x.setValue(0);
AnimatedValues.current.y.setValue(0);
AnimatedValues.current.zoom.setValue(zoom);
}, []);
var _toggleMoving = React.useCallback(function (isMoving) {
if (isMoving) {
_toggleRecording(false);
setIsMoveing(true);
} else {
resetPosition();
setIsMoveing(false);
}
}, [resetPosition, _toggleRecording]);
var setZoom = function setZoom(zoom) {
var newZoom = Math.max(minZoom, zoom);
newZoom = Math.min(maxZoom, newZoom);
AnimatedValues.current.zoom.setValue(newZoom);
onZoom(newZoom);
};
var imageViewerMouseDownHandler = function imageViewerMouseDownHandler(e) {
if (_draggable) {
if (e.preventDefault) e.preventDefault();
startDragging();
rotateViewerImage(e);
}
if (isMoveing) {
var clientX = e.clientX;
var clientY = e.clientY;
AnimatedValues.current.originOffset = {
x: clientX - AnimatedValues.current.x._value,
y: clientY - AnimatedValues.current.y._value
};
}
if (isAutoPlayRunning && stopAutoplayOnClick) {
_toggleAutoplay(false);
}
};
var imageViewerMouseUpHandler = function imageViewerMouseUpHandler(e) {
if (_draggable) {
if (e.preventDefault) e.preventDefault();
stopDragging();
resetMoveBuffer();
}
AnimatedValues.current.originOffset = null;
};
var imageViewerMouseMoveHandler = function imageViewerMouseMoveHandler(e) {
if (isDragging && isMoveing && AnimatedValues.current.originOffset) {
var clientX = e.clientX;
var clientY = e.clientY;
AnimatedValues.current.x.setValue(clientX - AnimatedValues.current.originOffset.x);
AnimatedValues.current.y.setValue(clientY - AnimatedValues.current.originOffset.y);
return;
}
if (_draggable && isDragging) {
rotateViewerImage(e);
}
};
var imageViewerMouseLeaveHandler = function imageViewerMouseLeaveHandler() {
if (_draggable) resetMoveBuffer();
if (!isAutoPlayRunning && resumeAutoplayOnMouseLeave) {
_toggleAutoplay(true);
}
if (mouseleaveDetect) {
stopDragging();
resetMoveBuffer();
}
};
var imageViewerMouseEnterHandler = function imageViewerMouseEnterHandler() {
if (isAutoPlayRunning && stopAutoplayOnMouseEnter) {
_toggleAutoplay(false);
}
};
var imageViewerWheelHandler = React.useCallback(function (e) {
if (mousewheel) {
if (e.preventDefault) e.preventDefault();
e.deltaY / 120 > 0 ? nextMove() : prevMove();
}
}, [mousewheel, nextMove, prevMove]);
var imageViewerTouchStartHandler = React.useCallback(function (e) {
if (isMoveing) {
var clientX = e.touches[0].clientX;
var clientY = e.touches[0].clientY;
AnimatedValues.current.originOffset = {
x: clientX - AnimatedValues.current.x._value,
y: clientY - AnimatedValues.current.y._value
};
return;
}
if (touch) {
startDragging();
rotateViewerImage(e);
}
if (isAutoPlayRunning && stopAutoplayOnClick) {
_toggleAutoplay(false);
}
}, [isAutoPlayRunning, rotateViewerImage, startDragging, stopAutoplayOnClick, _toggleAutoplay, touch, isMoveing]);
var imageViewerTouchMoveHandler = React.useCallback(function (e) {
if (AnimatedValues.current.isZooming) {
return;
}
if (isMoveing && AnimatedValues.current.originOffset) {
var clientX = e.touches[0].clientX;
var clientY = e.touches[0].clientY;
AnimatedValues.current.x.setValue(clientX - AnimatedValues.current.originOffset.x);
AnimatedValues.current.y.setValue(clientY - AnimatedValues.current.originOffset.y);
return;
}
if (touch) {
rotateViewerImage(e);
}
}, [rotateViewerImage, touch, isMoveing]);
var imageViewerTouchEndHandler = React.useCallback(function (e) {
AnimatedValues.current.originOffset = null;
if (touch) {
stopDragging();
resetMoveBuffer();
}
if (!isAutoPlayRunning && resumeAutoplayOnMouseLeave) {
_toggleAutoplay(true);
}
}, [isAutoPlayRunning, resumeAutoplayOnMouseLeave, stopDragging, _toggleAutoplay, touch]);
var imageViewerClickHandler = function imageViewerClickHandler(e) {
if (isRecording) {
var viewerWidth = _viewerImageRef.current.clientWidth;
var viewerHeight = _viewerImageRef.current.clientHeight;
var clientX = (e.clientX - AnimatedValues.current.x._value - (viewerWidth - viewerWidth * AnimatedValues.current.zoom._value) / 2) / AnimatedValues.current.zoom._value;
var clientY = (e.clientY - AnimatedValues.current.y._value - (viewerHeight - viewerHeight * AnimatedValues.current.zoom._value) / 2) / AnimatedValues.current.zoom._value;
var viewerOffsetLeft = _viewerImageRef.current.getBoundingClientRect().left;
var viewerOffsetTop = _viewerImageRef.current.getBoundingClientRect().top;
var x = ((clientX - viewerOffsetLeft) / viewerWidth).toFixed(6);
var y = ((clientY - viewerOffsetTop) / viewerHeight).toFixed(6);
var pin = {
id: TridiUtils.uid(),
frameId: currentImageIndex,
x: x,
y: y,
recordingSessionId: recordingSessionId
};
var newPins = pins.concat(pin);
setPins(newPins);
}
};
var pinDoubleClickHandler = function pinDoubleClickHandler(pin) {
if (isRecording) {
var newPins = pins.filter(function (item) {
return item.id !== pin.id;
});
setPins(newPins);
}
};
var pinClickHandler = function pinClickHandler(pin) {
if (!isRecording) {
onPinClick(pin);
}
};
React.useEffect(function () {
var viewerRef = _viewerImageRef.current;
viewerRef.addEventListener('touchstart', imageViewerTouchStartHandler, {
passive: false
});
viewerRef.addEventListener('touchmove', imageViewerTouchMoveHandler, {
passive: false
});
viewerRef.addEventListener('touchend', imageViewerTouchEndHandler, {
passive: false
});
viewerRef.addEventListener('wheel', imageViewerWheelHandler, {
passive: false
});
return function () {
viewerRef.removeEventListener('touchstart', imageViewerTouchStartHandler);
viewerRef.removeEventListener('touchmove', imageViewerTouchMoveHandler);
viewerRef.removeEventListener('touchend', imageViewerTouchEndHandler);
viewerRef.removeEventListener('wheel', imageViewerWheelHandler);
};
}, [imageViewerTouchEndHandler, imageViewerTouchMoveHandler, imageViewerTouchStartHandler, imageViewerWheelHandler]);
React.useEffect(function () {
if (autoplay) {
_toggleAutoplay(autoplay);
}
}, [autoplay, _toggleAutoplay]);
useInterval(function () {
nextMove();
}, isAutoPlayRunning ? autoplaySpeed : null);
React.useEffect(function () {
if (zoom !== undefined && zoom !== AnimatedValues.current.zoom._value) {
var newZoom = Math.max(minZoom, zoom);
newZoom = Math.min(maxZoom, newZoom);
AnimatedValues.current.zoom.setValue(newZoom);
onZoom(newZoom);
}
}, [zoom, onZoom]);
React.useImperativeHandle(ref, function () {
return {
setZoom: setZoom,
toggleRecording: function toggleRecording(state, recordingSessionId) {
return _toggleRecording(state, recordingSessionId);
},
toggleAutoplay: function toggleAutoplay(state) {
return _toggleAutoplay(state);
},
toggleMoving: function toggleMoving(isMoving) {
return _toggleMoving(isMoving);
},
next: function next() {
return nextMove();
},
prev: function prev() {
return prevMove();
}
};
});
var loadImage = function loadImage() {
setLoadedImagesCount(loadedImagesCount + 1);
onImageLoaded();
if (!viewerSize) {
var _viewerImageRef$curre, _viewerImageRef$curre2;
setViewerSize({
width: _viewerImageRef === null || _viewerImageRef === void 0 ? void 0 : (_viewerImageRef$curre = _viewerImageRef.current) === null || _viewerImageRef$curre === void 0 ? void 0 : _viewerImageRef$curre.clientWidth,
height: _viewerImageRef === null || _viewerImageRef === void 0 ? void 0 : (_viewerImageRef$curre2 = _viewerImageRef.current) === null || _viewerImageRef$curre2 === void 0 ? void 0 : _viewerImageRef$curre2.clientHeight
});
}
};
var onImageLoaded = React.useCallback(function () {
onLoadChange(loadedImagesCount + 1 === _count, Math.round((loadedImagesCount + 1) / _count * 100));
}, [_count, loadedImagesCount, onLoadChange]);
useTridiKeyPressHandler({
nextMove: nextMove,
prevMove: prevMove
});
var renderImages = function renderImages() {
return _images.map(function (src, index) {
return /*#__PURE__*/React__default.createElement("img", {
key: index,
src: src,
onLoad: loadImage,
className: styles['tridi-viewer-image'] + " " + (currentImageIndex === index ? styles['tridi-viewer-image-shown'] : styles['tridi-viewer-image-hidden']),
alt: ""
});
});
};
var renderHintOverlay = function renderHintOverlay() {
return /*#__PURE__*/React__default.createElement("div", {
className: "" + styles['tridi-hint-overlay'],
onClick: hideHint,
onTouchStart: hideHint
}, !renderHint && /*#__PURE__*/React__default.createElement(React.Fragment, null, /*#__PURE__*/React__default.createElement(DragIcon, null), hintText && /*#__PURE__*/React__default.createElement("span", {
className: "" + styles['tridi-hint-text']
}, hintText)), renderHint && renderHint());
};
var generateViewerClassName = function generateViewerClassName() {
var classNameStr = styles['tridi-viewer'];
if (_draggable) classNameStr += ' ' + styles['tridi-draggable-true'];
if (isRecording) classNameStr += ' ' + styles['tridi-recording-true'];
if (touch) classNameStr += ' ' + styles['tridi-touch-true'];
if (mousewheel) classNameStr += ' ' + styles['tridi-mousewheel-true'];
if (hintOnStartup) classNameStr += ' ' + styles['tridi-hintOnStartup-true'];
if (className) classNameStr += ' ' + className;
return classNameStr;
};
var initHammer = React.useCallback(function () {
var element = document.getElementById('viewerImage');
var mc = new Hammer.Manager(element);
var pinch = new Hammer.Pinch();
mc.add([pinch]);
mc.on('pinchstart', function (ev) {
AnimatedValues.current.originOffset = {
x: ev.center.x - AnimatedValues.current.x._value,
y: ev.center.y - AnimatedValues.current.y._value
};
AnimatedValues.current.originZoom = AnimatedValues.current.zoom._value;
AnimatedValues.current.isZooming = true;
});
mc.on('pinchend', function (ev) {
AnimatedValues.current.isZooming = false;
AnimatedValues.current.originOffset = null;
});
mc.on('pinchcancel', function (ev) {
AnimatedValues.current.isZooming = false;
AnimatedValues.current.originOffset = null;
});
mc.on('pinch', function (ev) {
var scale = AnimatedValues.current.originZoom - 1 + ev.scale;
scale = Math.max(minZoom, scale);
scale = Math.min(maxZoom, scale);
if (scale !== AnimatedValues.current.zoom._value) {
AnimatedValues.current.zoom.setValue(scale);
onZoom(scale);
}
});
}, [minZoom, maxZoom]);
React.useEffect(function () {
initHammer();
}, []);
if (!TridiUtils.isValidProps({
images: images,
format: format,
location: location
})) {
console.log('Invalid Settings');
return null;
}
return /*#__PURE__*/React__default.createElement("div", {
className: generateViewerClassName()
}, hintVisible && renderHintOverlay(), /*#__PURE__*/React__default.createElement("div", {
id: "viewerImage",
ref: _viewerImageRef,
onMouseDown: imageViewerMouseDownHandler,
onMouseUp: imageViewerMouseUpHandler,
onMouseMove: imageViewerMouseMoveHandler,
onMouseLeave: imageViewerMouseLeaveHandler,
onMouseEnter: imageViewerMouseEnterHandler,
onClick: imageViewerClickHandler,
style: {
width: '100%'
}
}, /*#__PURE__*/React__default.createElement(AnimatedDiv, {
ref: _viewerZoomRef,
style: {
width: '100%',
transform: [{
scale: AnimatedValues.current.zoom
}, {
translateY: AnimatedValues.current.y
}, {
translateX: AnimatedValues.current.x
}]
}
}, (_images === null || _images === void 0 ? void 0 : _images.length) > 0 && renderImages(), viewerSize ? /*#__PURE__*/React__default.createElement(Pins, {
pins: pins,
viewerWidth: viewerSize.width,
viewerHeight: viewerSize.height,
currentFrameId: currentImageIndex,
pinWidth: pinWidth,
pinHeight: pinHeight,
onPinDoubleClick: pinDoubleClickHandler,
onPinClick: pinClickHandler,
renderPin: renderPin
}) : null)), showStatusBar && /*#__PURE__*/React__default.createElement(StatusBar, {
isRecording: isRecording,
currentImageIndex: currentImageIndex
}), showControlBar && /*#__PURE__*/React__default.createElement(ControlBar, {
hideRecord: hideRecord,
isPlaying: isPlaying,
isRecording: isRecording,
isMoveing: isMoveing,
setIsPlaying: setIsPlaying,
setIsRecording: setIsRecording,
setIsMoveing: setIsMoveing,
onStartMoveing: function onStartMoveing() {
return _toggleMoving(true);
},
onStopMoveing: function onStopMoveing() {
return _toggleMoving(false);
},
onPlay: function onPlay() {
return _toggleAutoplay(true);
},
onPause: function onPause() {
return _toggleAutoplay(false);
},
onNext: function onNext() {
return nextMove();
},
onPrev: function onPrev() {
return prevMove();
},
onRecordStart: function onRecordStart() {
_toggleRecording(true);
setIsMoveing(false);
},
onRecordStop: function onRecordStop() {
return _toggleRecording(false);
},
onZoomout: function onZoomout() {
setZoom(AnimatedValues.current.zoom._value - 0.1);
},
onZoomin: function onZoomin() {
setZoom(AnimatedValues.current.zoom._value + 0.1);
}
}));
});
Tridi.propTypes = {
className: PropTypes.string,
style: PropTypes.object,
images: PropTypes.oneOfType([PropTypes.array, PropTypes.string]),
pins: PropTypes.array,
pinWidth: PropTypes.number,
pinHeight: PropTypes.number,
format: PropTypes.string,
location: PropTypes.string,
count: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
draggable: PropTypes.bool,
hintOnStartup: PropTypes.bool,
hintText: PropTypes.string,
autoplay: PropTypes.bool,
autoplaySpeed: PropTypes.number,
stopAutoplayOnClick: PropTypes.bool,
stopAutoplayOnMouseEnter: PropTypes.bool,
resumeAutoplayOnMouseLeave: PropTypes.bool,
touch: PropTypes.bool,
mousewheel: PropTypes.bool,
inverse: PropTypes.bool,
dragInterval: PropTypes.number,
touchDragInterval: PropTypes.number,
mouseleaveDetect: PropTypes.bool,
showControlBar: PropTypes.bool,
showStatusBar: PropTypes.bool,
hideRecord: PropTypes.bool,
renderPin: PropTypes.func,
setPins: PropTypes.func,
renderHint: PropTypes.func,
zoom: PropTypes.number,
maxZoom: PropTypes.number,
minZoom: PropTypes.number,
onHintHide: PropTypes.func,
onAutoplayStart: PropTypes.func,
onAutoplayStop: PropTypes.func,
onNextMove: PropTypes.func,
onPrevMove: PropTypes.func,
onNextFrame: PropTypes.func,
onPrevFrame: PropTypes.func,
onDragStart: PropTypes.func,
onDragEnd: PropTypes.func,
onFrameChange: PropTypes.func,
onRecordStart: PropTypes.func,
onRecordStop: PropTypes.func,
onPinClick: PropTypes.func,
onLoadChange: PropTypes.func
};
Tridi.defaultProps = {
className: undefined,
style: undefined,
images: 'numbered',
pin: undefined,
pinWidth: 10,
pinHeight: 10,
format: undefined,
location: './images',
count: undefined,
draggable: true,
hintOnStartup: false,
hintText: null,
autoplay: false,
autoplaySpeed: 50,
stopAutoplayOnClick: false,
stopAutoplayOnMouseEnter: false,
resumeAutoplayOnMouseLeave: false,
touch: true,
mousewheel: false,
inverse: false,
dragInterval: 1,
touchDragInterval: 2,
mouseleaveDetect: false,
showControlBar: false,
showStatusBar: false,
hideRecord: false,
renderPin: undefined,
setPins: function setPins() {},
renderHint: undefined,
zoom: 1,
maxZoom: 3,
minZoom: 1,
onHintHide: function onHintHide() {},
onAutoplayStart: function onAutoplayStart() {},
onAutoplayStop: function onAutoplayStop() {},
onNextMove: function onNextMove() {},
onPrevMove: function onPrevMove() {},
onNextFrame: function onNextFrame() {},
onPrevFrame: function onPrevFrame() {},
onDragStart: function onDragStart() {},
onDragEnd: function onDragEnd() {},
onFrameChange: function onFrameChange() {},
onRecordStart: function onRecordStart() {},
onRecordStop: function onRecordStop() {},
onPinClick: function onPinClick() {},
onZoom: function onZoom() {},
onLoadChange: function onLoadChange() {}
};
module.exports = Tridi;
//# sourceMappingURL=index.js.map