react-sprucebot
Version:
React components for your Sprucebot Skill 💪🏼
289 lines (243 loc) • 7.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
function postMessage(message) {
return window.parent.postMessage(JSON.stringify(message), '*');
}
var skill = {
height: 0,
minHeight: 0,
forceAuth: function forceAuth() {
postMessage('Skill:ForceAuth');
},
resized: function resized() {
var height = 0;
var body = document.body;
var docEl = document.documentElement;
var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
var clientTop = docEl.clientTop || body.clientTop || 0;
var top = scrollTop - clientTop;
var height = Math.max(this.minHeight, top + body.clientHeight);
if (height != this.height) {
this.height = height;
postMessage({
name: 'Skill:Resized',
height: height
});
}
},
setMinBodyHeight: function setMinBodyHeight(height) {
this.minHeight = height;
},
clearMinBodyHeight: function clearMinBodyHeight() {
this.minHeight = 0;
},
back: function back() {
if (window.top === window.self) {
window.history.back();
} else {
postMessage('Skill:Back');
}
},
ready: function ready() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { resetUrlTrail: false },
_ref$resetUrlTrail = _ref.resetUrlTrail,
resetUrlTrail = _ref$resetUrlTrail === undefined ? false : _ref$resetUrlTrail;
this.resized();
postMessage({
name: 'Skill:Loaded',
url: window.location.href,
resetUrlTrail: resetUrlTrail
});
this.resizedInterval = setInterval(this.resized.bind(this), 300);
},
scrollTo: function scrollTo(offset) {
postMessage({
name: 'Skill:ScrollTo',
offset: offset || 0
});
},
scrollBy: function scrollBy(offset) {
if (window.top === window.self) {
window.scrollBy({
top: offset,
behavior: 'smooth'
});
} else {
postMessage({ name: 'Skill:ScrollBy', offset: offset });
}
},
requestScroll: function requestScroll() {
postMessage({ name: 'Skill:RequestContainerScrollTop' });
},
showHelp: function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(_ref3) {
var _this = this;
var title = _ref3.title,
body = _ref3.body;
var promise;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(window.top === window.self)) {
_context.next = 4;
break;
}
alert('[' + title + '] ' + body);
_context.next = 7;
break;
case 4:
promise = new Promise(function (accept, reject) {
_this._showHelpAccept = accept;
});
postMessage({ name: 'Skill:ShowHelp', title: title, body: body });
return _context.abrupt('return', promise);
case 7:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function showHelp(_x2) {
return _ref2.apply(this, arguments);
}
return showHelp;
}(),
handleIframeMessage: function handleIframeMessage(e) {
if (typeof e.data === 'string') {
try {
var results = JSON.parse(e.data);
// TODO make this different?
if (results.name === 'Skill:HideHelp') {
if (this._showHelpAccept) {
this._showHelpAccept();
this._showHelpAccept = null;
}
}
if (results.name === 'Search:SelectUser') {
if (this._onSelecUserFormSearchCallback) {
this._onSelecUserFormSearchCallback(results.user);
this._onSelecUserFormSearchCallback = null;
}
} else if (results.name === 'Search:Cancel') {
if (this._onCancelSearchCallback) {
this._onCancelSearchCallback();
this._onCancelSearchCallback = null;
}
} else if (results.name === 'Skill:DidConfirm') {
if (this._confirmAccept) {
this._confirmAccept(results.pass);
this._confirmAccept = null;
}
} else if (results.name === 'Skill:DidClickStickyElement') {
if (this.handleStickElementClick) {
this.handleStickElementClick(results.key);
}
}
} catch (err) {}
}
},
//TODO move to promise?
searchForUser: function searchForUser() {
var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref4$onCancel = _ref4.onCancel,
onCancel = _ref4$onCancel === undefined ? function () {} : _ref4$onCancel,
_ref4$onSelectUser = _ref4.onSelectUser,
onSelectUser = _ref4$onSelectUser === undefined ? function () {} : _ref4$onSelectUser,
_ref4$roles = _ref4.roles,
roles = _ref4$roles === undefined ? ['guest'] : _ref4$roles,
locationId = _ref4.locationId;
postMessage({ name: 'Skill:SearchForUser', roles: roles, locationId: locationId });
this._onCancelSearchCallback = onCancel;
this._onSelecUserFormSearchCallback = onSelectUser;
},
displayMessage: function displayMessage(_ref5) {
var message = _ref5.message,
_ref5$type = _ref5.type,
type = _ref5$type === undefined ? 'error' : _ref5$type;
if (window.top === window.self) {
alert(message);
} else {
postMessage({ name: 'Skill:DisplayMessage', message: message, type: type });
}
},
confirm: function () {
var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(_ref7) {
var _this2 = this;
var message = _ref7.message;
var promise;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!(window.top === window.self)) {
_context2.next = 4;
break;
}
return _context2.abrupt('return', window.confirm(message));
case 4:
promise = new Promise(function (accept, reject) {
_this2._confirmAccept = accept;
});
postMessage({ name: 'Skill:PleaseConfirm', message: message });
return _context2.abrupt('return', promise);
case 7:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
function confirm(_x4) {
return _ref6.apply(this, arguments);
}
return confirm;
}(),
/**
* position: 'top' | 'bottom'
* elements: [
* {
* key: 'first-button', (key is passed back to onClick)
* type: 'button'|'leftTitle'|'rightTitle'|'title',
* value: 'Hey There' //value MUST be a string, will be value of button or innerHTML of everything else
* }
* ]
*/
setStickyElement: function setStickyElement(_ref8) {
var elements = _ref8.elements,
_ref8$position = _ref8.position,
position = _ref8$position === undefined ? 'top' : _ref8$position,
_ref8$onClick = _ref8.onClick,
onClick = _ref8$onClick === undefined ? function () {} : _ref8$onClick;
this.handleStickElementClick = onClick;
postMessage({
name: 'Skill:SetStickyElement',
elements: elements,
position: position
});
},
updateStickyBoundingRect: function updateStickyBoundingRect(rect) {
if (this._lastRect && this._lastRect.top === rect.top && this._lastRect.bottom == rect.bottom) {
return;
}
this._lastRect = rect;
postMessage({
name: 'Skill:SetStickyBoundingRect',
boundingRect: rect
});
},
clearStickyElements: function clearStickyElements() {
postMessage({ name: 'Skill:ClearStickyElements' });
},
notifyOfRouteChangeStart: function notifyOfRouteChangeStart() {
postMessage({ name: 'Skill:RouteChangeStart' });
}
};
if (typeof window !== 'undefined') {
window.addEventListener('message', skill.handleIframeMessage.bind(skill));
}
exports.default = skill;