calcite-react
Version:
Calcite components for React
716 lines (609 loc) • 25.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _accountManagerUtils = require("./accountManagerUtils");
var _accountManagerStorageUtils = require("./accountManagerStorageUtils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var useAccountManager = function useAccountManager() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
clientId: null,
redirectUri: null,
portalUrl: 'https://www.arcgis.com/sharing',
popup: false,
params: {
force_login: false
}
};
var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'arcgis-account-manager';
var _useState = (0, _react.useState)(name),
_useState2 = _slicedToArray(_useState, 1),
managerName = _useState2[0];
var _useState3 = (0, _react.useState)(options),
_useState4 = _slicedToArray(_useState3, 1),
managerOptions = _useState4[0];
var _getAccountManagerSto = (0, _accountManagerStorageUtils.getAccountManagerStorage)(managerName),
accounts = _getAccountManagerSto.accounts,
status = _getAccountManagerSto.status,
active = _getAccountManagerSto.active,
order = _getAccountManagerSto.order;
var _useState5 = (0, _react.useState)({
active: active,
accounts: accounts,
status: status,
order: order
}),
_useState6 = _slicedToArray(_useState5, 2),
accountManagerState = _useState6[0],
setAccountManagerState = _useState6[1];
/** Complete Login */
(0, _react.useEffect)(function () {
var _ref = status || {},
loading = _ref.loading,
authProps = _ref.authProps;
if (loading) {
var completeAddAccount =
/*#__PURE__*/
function () {
var _ref2 = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee() {
var account, accountManager;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return (0, _accountManagerUtils.completeLogin)(authProps);
case 2:
account = _context.sent;
if (account && account.key) {
(0, _accountManagerStorageUtils.addAccountStorage)(managerName, account);
} //Update localStorage/ state
(0, _accountManagerStorageUtils.completeStatusStorage)(managerName);
accountManager = (0, _accountManagerStorageUtils.getAccountManagerStorage)(managerName);
setAccountManagerState(accountManager);
case 7:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
return function completeAddAccount() {
return _ref2.apply(this, arguments);
};
}();
completeAddAccount();
}
}, [managerName, status]);
/** Add Account */
var addAccount = (0, _react.useCallback)(function () {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var setActive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'OAuth2';
// saving window.location.href (query params, etc) as originRoute
var originRoute = window.location.href;
var _ref3 = options ? options || {} : managerOptions || {},
clientId = _ref3.clientId,
redirectUri = _ref3.redirectUri,
portalUrl = _ref3.portalUrl,
popup = _ref3.popup,
params = _ref3.params; //set localstorage status
(0, _accountManagerStorageUtils.beginStatusStorage)(managerName, {
clientId: clientId,
redirectUri: redirectUri,
portalUrl: portalUrl,
popup: popup
}, originRoute, setActive); //begin login
(0, _accountManagerUtils.beginLogin)(managerName, {
clientId: clientId,
redirectUri: redirectUri,
portalUrl: portalUrl,
popup: popup,
params: params
}, setAccountManagerState, type);
}, [managerOptions, managerName]);
/** Logout Account: Remove token and session from user auth object and attempt revoke token*/
var logoutAccount = (0, _react.useCallback)(
/*#__PURE__*/
_asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee2() {
var account,
_ref5,
session,
token,
key,
valid,
response,
_status,
accountManager,
_args2 = arguments;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
account = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : null;
_ref5 = account || {}, session = _ref5.session, token = _ref5.token, key = _ref5.key;
valid = validAccount(account);
if (!(session && token && valid)) {
_context2.next = 14;
break;
}
_context2.next = 6;
return (0, _accountManagerUtils.logout)(account);
case 6:
response = _context2.sent;
_status = JSON.stringify(response);
console.log("Revoke token status: ".concat(_status)); //Update localStorage/ state
(0, _accountManagerStorageUtils.logoutAccountStorage)(managerName, account);
accountManager = (0, _accountManagerStorageUtils.getAccountManagerStorage)(managerName);
setAccountManagerState(accountManager);
_context2.next = 15;
break;
case 14:
console.error("Invalid account object given to logoutAccount. Required fields: session/token/key. Fields received: {session: ".concat(session, ", token: ").concat(token, ", key: ").concat(key, "}"));
case 15:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
})), [accountManagerState, managerName]);
/** Remove Account: Remove account from local storage and attempt revoke token*/
var removeAccount = (0, _react.useCallback)(
/*#__PURE__*/
_asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee3() {
var account,
valid,
_ref7,
session,
token,
key,
response,
_status2,
accountManager,
_args3 = arguments;
return regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
account = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : null;
valid = validAccount(account);
_ref7 = account || {}, session = _ref7.session, token = _ref7.token, key = _ref7.key;
if (!valid) {
_context3.next = 15;
break;
}
if (!token) {
_context3.next = 10;
break;
}
_context3.next = 7;
return (0, _accountManagerUtils.logout)(account);
case 7:
response = _context3.sent;
_status2 = JSON.stringify(response);
console.log("Revoke token status: ".concat(_status2));
case 10:
//Update localStorage/ state
(0, _accountManagerStorageUtils.removeAccountStorage)(managerName, account);
accountManager = (0, _accountManagerStorageUtils.getAccountManagerStorage)(managerName);
setAccountManagerState(accountManager);
_context3.next = 16;
break;
case 15:
console.error("Invalid account object given to removeAccount. Required fields: session/key. Fields received: {session: ".concat(session, ", key: ").concat(key, "}"));
case 16:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
})), [accountManagerState, managerName]);
/** Restore Account: Log in to an existing account that is logged out */
var restoreAccount =
/*#__PURE__*/
function () {
var _ref8 = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee4() {
var account,
_ref9,
portal,
_ref10,
appInfo,
portalHostname,
user,
_ref11,
appId,
_ref12,
username,
portalUrl,
clientId,
_ref13,
authProps,
_ref14,
redirectUri,
popup,
originRoute,
_args4 = arguments;
return regeneratorRuntime.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
account = _args4.length > 0 && _args4[0] !== undefined ? _args4[0] : null;
// Get type from account
_ref9 = account || {}, portal = _ref9.portal;
_ref10 = portal || {}, appInfo = _ref10.appInfo, portalHostname = _ref10.portalHostname, user = _ref10.user;
_ref11 = appInfo || {}, appId = _ref11.appId;
_ref12 = user || {}, username = _ref12.username;
if (appId && portalHostname) {
portalUrl = "https://".concat(portalHostname, "/sharing");
clientId = appId;
_ref13 = accountManagerState.status || {}, authProps = _ref13.authProps;
_ref14 = authProps || {
popup: false
}, redirectUri = _ref14.redirectUri, popup = _ref14.popup;
originRoute = window.location.href;
if (redirectUri) {
//set localstorage status
(0, _accountManagerStorageUtils.beginStatusStorage)(managerName, {
clientId: clientId,
redirectUri: redirectUri,
portalUrl: portalUrl,
popup: popup
}, originRoute); //begin login
(0, _accountManagerUtils.beginLogin)(managerName, {
clientId: clientId,
redirectUri: redirectUri,
portalUrl: portalUrl,
popup: popup,
params: {
force_login: true,
username: username
}
}, setAccountManagerState);
} else {
console.error("Cannot restore account. Missing redirectUri and popup in accountManagerState.status: ".concat(accountManagerState.status));
}
} else {
console.error("Cannot restore account. Missing clientId and portalUrl in account portal: ".concat(portal));
}
case 6:
case "end":
return _context4.stop();
}
}
}, _callee4, this);
}));
return function restoreAccount() {
return _ref8.apply(this, arguments);
};
}();
/** Refresh Account */
var refreshAccount =
/*#__PURE__*/
function () {
var _ref15 = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee5() {
var account,
_ref16,
portal,
response,
_ref17,
appInfo,
portalHostname,
user,
_ref18,
appId,
_ref19,
username,
portalUrl,
clientId,
_ref20,
authProps,
_ref21,
redirectUri,
popup,
originRoute,
_args5 = arguments;
return regeneratorRuntime.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
account = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : null;
_ref16 = account || {}, portal = _ref16.portal;
response = (0, _accountManagerUtils.refresh)(account);
if (response.success && response.session) {
(0, _accountManagerStorageUtils.refreshAccountStorage)(managerName, {
key: account.key,
session: response.session
});
} else {
if (portal) {
_ref17 = portal || {}, appInfo = _ref17.appInfo, portalHostname = _ref17.portalHostname, user = _ref17.user;
_ref18 = appInfo || {}, appId = _ref18.appId;
_ref19 = user || {}, username = _ref19.username;
if (appId && portalHostname) {
portalUrl = "https://".concat(portalHostname, "/sharing");
clientId = appId;
_ref20 = accountManagerState.status || {}, authProps = _ref20.authProps;
_ref21 = authProps || {
popup: false
}, redirectUri = _ref21.redirectUri, popup = _ref21.popup;
originRoute = window.location.href;
if (redirectUri) {
//set localstorage status
(0, _accountManagerStorageUtils.beginStatusStorage)(managerName, {
clientId: clientId,
redirectUri: redirectUri,
portalUrl: portalUrl,
popup: popup
}, originRoute); //begin login
(0, _accountManagerUtils.beginLogin)(managerName, {
clientId: clientId,
redirectUri: redirectUri,
portalUrl: portalUrl,
popup: popup,
params: {
force_login: true,
username: username
}
}, setAccountManagerState);
}
}
}
console.error("Cannot refresh session for account. Refresh operation failed: ".concat(response.error, ". Attempt to re-authenticate failed due to missing properties in account portal item."));
}
case 4:
case "end":
return _context5.stop();
}
}
}, _callee5, this);
}));
return function refreshAccount() {
return _ref15.apply(this, arguments);
};
}();
/** Set the active account */
var switchActiveAccount = (0, _react.useCallback)(function () {
var account = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
if (validAccount(account)) {
(0, _accountManagerStorageUtils.switchActiveStorage)(managerName, account);
var accountManager = (0, _accountManagerStorageUtils.getAccountManagerStorage)(managerName);
setAccountManagerState(accountManager);
}
}, [accountManagerState, managerName]);
/** Check token status */
var verifyToken = (0, _react.useCallback)(
/*#__PURE__*/
function () {
var _ref23 = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee6(_ref22) {
var session, token, _ref24, portal, result;
return regeneratorRuntime.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
session = _ref22.session, token = _ref22.token;
if (!(session && token)) {
_context6.next = 16;
break;
}
_context6.prev = 2;
_ref24 = session || {}, portal = _ref24.portal;
result = session.getToken(portal);
if (!result) {
_context6.next = 7;
break;
}
return _context6.abrupt("return", true);
case 7:
return _context6.abrupt("return", false);
case 10:
_context6.prev = 10;
_context6.t0 = _context6["catch"](2);
console.error("Token status verification failed with error. ".concat(_context6.t0));
return _context6.abrupt("return", false);
case 14:
_context6.next = 17;
break;
case 16:
return _context6.abrupt("return", false);
case 17:
case "end":
return _context6.stop();
}
}
}, _callee6, this, [[2, 10]]);
}));
return function (_x) {
return _ref23.apply(this, arguments);
};
}(), []);
/** Logout all accounts */
var logoutAllAccounts = (0, _react.useCallback)(
/*#__PURE__*/
_asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee8() {
var accountManager;
return regeneratorRuntime.wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
Object.entries(accountManagerState.accounts).map(
/*#__PURE__*/
function () {
var _ref27 = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee7(_ref26) {
var _ref28, key, account, _ref29, session, token, message, _status3;
return regeneratorRuntime.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
_ref28 = _slicedToArray(_ref26, 2), key = _ref28[0], account = _ref28[1];
_ref29 = account || {}, session = _ref29.session, token = _ref29.token;
if (!(session && token)) {
_context7.next = 9;
break;
}
_context7.next = 5;
return (0, _accountManagerUtils.logout)(account);
case 5:
message = _context7.sent;
_status3 = JSON.stringify(message);
console.log("Revoke token status for account ".concat(key, ": ").concat(_status3)); //Update localStorage/ state
(0, _accountManagerStorageUtils.logoutAccountStorage)(managerName, account);
case 9:
return _context7.abrupt("return", account);
case 10:
case "end":
return _context7.stop();
}
}
}, _callee7, this);
}));
return function (_x2) {
return _ref27.apply(this, arguments);
};
}());
accountManager = (0, _accountManagerStorageUtils.getAccountManagerStorage)(managerName);
setAccountManagerState(accountManager);
case 3:
case "end":
return _context8.stop();
}
}
}, _callee8, this);
})), [accountManagerState]);
/** Remove all accounts */
var removeAllAccounts = (0, _react.useCallback)(
/*#__PURE__*/
_asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee10() {
var accountManager;
return regeneratorRuntime.wrap(function _callee10$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
Object.entries(accountManagerState.accounts).map(
/*#__PURE__*/
function () {
var _ref32 = _asyncToGenerator(
/*#__PURE__*/
regeneratorRuntime.mark(function _callee9(_ref31) {
var _ref33, key, account, _ref34, session, token, message, _status4;
return regeneratorRuntime.wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
_ref33 = _slicedToArray(_ref31, 2), key = _ref33[0], account = _ref33[1];
_ref34 = account || {}, session = _ref34.session, token = _ref34.token; //Revoke token
if (!(session && token)) {
_context9.next = 8;
break;
}
_context9.next = 5;
return (0, _accountManagerUtils.logout)(account);
case 5:
message = _context9.sent;
_status4 = JSON.stringify(message);
console.log("Revoke token status for account ".concat(key, ": ").concat(_status4));
case 8:
//Update localStorage/ state
(0, _accountManagerStorageUtils.removeAccountStorage)(managerName, account);
return _context9.abrupt("return", {});
case 10:
case "end":
return _context9.stop();
}
}
}, _callee9, this);
}));
return function (_x3) {
return _ref32.apply(this, arguments);
};
}());
accountManager = (0, _accountManagerStorageUtils.getAccountManagerStorage)(managerName);
setAccountManagerState(accountManager);
case 3:
case "end":
return _context10.stop();
}
}
}, _callee10, this);
})), [accountManagerState]); // Helper Functions
var validAccount = (0, _react.useCallback)(function () {
var account = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var _ref35 = account || {},
key = _ref35.key;
if (key) {
var valid = accountManagerState ? accountManagerState.accounts[key] ? true : false : false;
return valid;
}
var invalid = {
warning: 'Invalid account',
account: account,
accountManagerState: accountManagerState
};
console.warn(invalid);
return false;
}, [accountManagerState]);
return {
accountManagerState: accountManagerState,
addAccount: addAccount,
logoutAccount: logoutAccount,
logoutAllAccounts: logoutAllAccounts,
removeAccount: removeAccount,
removeAllAccounts: removeAllAccounts,
restoreAccount: restoreAccount,
refreshAccount: refreshAccount,
switchActiveAccount: switchActiveAccount,
verifyToken: verifyToken,
getUserThumbnail: _accountManagerUtils.getUserThumbnail,
getOrgThumbnail: _accountManagerUtils.getOrgThumbnail
};
};
/**
* Docs
*/
useAccountManager.propTypes = {
/** Text object name for accountManager in local storage. */
accountManagerName: _propTypes.default.string,
/** Options for starting OAuth to include { clientId, redirectUri, portalUrl, popup, params }. Can also be set in addAccount function. */
options: _propTypes.default.object
};
useAccountManager.defaultProps = {
accountManagerName: 'arcgis-account-manager',
options: {
clientId: null,
redirectUri: null,
portalUrl: 'https://www.arcgis.com/sharing',
popup: false,
params: {
force_login: false
}
}
};
useAccountManager.displayName = 'useAccountManager';
var _default = useAccountManager;
exports.default = _default;