@krowdy/kds-auth
Version:
React components that implement Google's Material Design.
647 lines (558 loc) • 23.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _clsx = _interopRequireDefault(require("clsx"));
var _kdsCore = require("@krowdy/kds-core");
var _icons = require("@material-ui/icons");
var _GoogleButton = _interopRequireDefault(require("./GoogleButton"));
var _MicrosoftButton = _interopRequireDefault(require("./MicrosoftButton"));
var _utils = require("../utils");
var _utils2 = require("../AuthContext/utils");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
var inputLabels = {
login: 'Correo o celular',
newPassword: 'Nueva contraseña',
'only-email': 'Correo electrónico',
'only-phone': 'Número de celular',
password: 'Contraseña',
'phone-and-email': 'Correo o celular',
verify: 'Código de verificación'
};
var errorMessages = {
login: 'Error al verificar cuenta, comunícate con soporte.',
newCode: 'Código caducado. Enviamos un nuevo código a tu correo.',
newPassword: 'Debe tener mínimo 8 caracteres.',
password: 'Contraseña incorrecta. Vuelve a intentarlo o haz click en “¿Olvidaste tu contraseña?”',
verify: 'Código de verificación erróneo.'
};
var _ref6 = /*#__PURE__*/_react["default"].createElement(_icons.Visibility, {
color: "inherit",
fontSize: "inherit"
});
var _ref7 = /*#__PURE__*/_react["default"].createElement(_icons.VisibilityOff, {
color: "inherit",
fontSize: "inherit"
});
var _ref8 = /*#__PURE__*/_react["default"].createElement(_GoogleButton["default"], null);
var _ref9 = /*#__PURE__*/_react["default"].createElement(_MicrosoftButton["default"], null);
var _ref10 = /*#__PURE__*/_react["default"].createElement(_kdsCore.CircularProgress, {
disableShrink: true,
size: 18
});
var KrowdyOneTap = (0, _react.forwardRef)(function (_ref, ref) {
var _ref$onChangeUserLogi = _ref.onChangeUserLogin,
onChangeUserLogin = _ref$onChangeUserLogi === void 0 ? function () {} : _ref$onChangeUserLogi,
typeView = _ref.typeView,
currentUser = _ref.currentUser;
var _useAuth = (0, _utils.useAuth)(),
verifyAccount = _useAuth.verifyAccount,
loginByPassword = _useAuth.loginByPassword,
loginByCode = _useAuth.loginByCode,
typeCode = _useAuth.typeCode,
onSuccessLogin = _useAuth.onSuccessLogin,
updateAccount = _useAuth.updateAccount,
loading = _useAuth.loading,
loginWith = _useAuth.loginWith,
onUpdatePassword = _useAuth.onUpdatePassword,
onUpdateState = _useAuth.onUpdateState,
onChangeView = _useAuth.onChangeView,
onError = _useAuth.onError,
logout = _useAuth.logout;
var classes = useStyles();
var _useState = (0, _react.useState)(null),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
loginkey = _useState2[0],
setLoginKey = _useState2[1];
var _useState3 = (0, _react.useState)(typeView === _utils2.ViewType.Login ? currentUser : ''),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
valueInput = _useState4[0],
setValueInput = _useState4[1];
var _useState5 = (0, _react.useState)(''),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
passwordValue = _useState6[0],
setPasswordValue = _useState6[1];
var _useState7 = (0, _react.useState)(false),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
isErrorLogin = _useState8[0],
setErrorLogin = _useState8[1];
var _useState9 = (0, _react.useState)(false),
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
isCodeValidationExpired = _useState10[0],
setIsCodeValidationExpired = _useState10[1];
var _useState11 = (0, _react.useState)(false),
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
showPassword = _useState12[0],
setShowPassword = _useState12[1];
var _useState13 = (0, _react.useState)(true),
_useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
keepSession = _useState14[0],
setKeepSession = _useState14[1];
var _useState15 = (0, _react.useState)({}),
_useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
register = _useState16[0],
setRegister = _useState16[1];
var isNextDisabled = (0, _react.useMemo)(function () {
switch (typeView) {
case _utils2.ViewType.NewPassword:
return passwordValue.length < 8;
case _utils2.ViewType.Register:
{
var firstName = register.firstName,
lastName = register.lastName;
return !(firstName && lastName);
}
case _utils2.ViewType.Login:
if (loginWith === 'only-email') {
var emailRegex = /^[-\w.%+]{1,64}@(?:[A-Z0-9-]{1,63}\.){1,125}[A-Z]{2,63}$/i;
return !valueInput || !emailRegex.test(valueInput);
} else {
return !valueInput;
}
case _utils2.ViewType.Password:
case _utils2.ViewType.Recovery:
return !passwordValue;
default:
return false;
}
}, [typeView, valueInput, register, loginWith, passwordValue]);
var _handleChangeInput = (0, _react.useCallback)(function (_ref2) {
var _ref2$target = _ref2.target,
value = _ref2$target.value,
name = _ref2$target.name;
setValueInput(value);
if (name === 'login' && value) {
var res = value.split(new RegExp('[ @ | . ]'));
var domain = res ? res[res.length - 2] : null;
if (domain && 'gmail'.indexOf(domain) !== -1) setLoginKey('google');else if (domain && ('outlook'.indexOf(domain) !== -1 || 'hotmail'.indexOf(domain) !== -1)) setLoginKey('microsoft');else setLoginKey(null);
}
}, []);
var _handleChangePassword = (0, _react.useCallback)(function (_ref3) {
var value = _ref3.target.value;
setPasswordValue(value);
}, []);
var _handleChangeRegister = (0, _react.useCallback)(function (_ref4) {
var _ref4$target = _ref4.target,
value = _ref4$target.value,
name = _ref4$target.name;
setRegister(function (prev) {
return (0, _extends3["default"])({}, prev, (0, _defineProperty2["default"])({}, name, value));
});
}, []);
var _handleSubmitSetEmail = (0, _react.useCallback)(function _callee(valueInput, nextView) {
var _await$verifyAccount, hasPassword, success, value, type;
return _regenerator["default"].async(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(nextView && ![_utils2.ViewType.Password, _utils2.ViewType.Verify].includes(nextView))) {
_context.next = 2;
break;
}
throw new Error('nextView is no valid');
case 2:
_context.next = 4;
return _regenerator["default"].awrap(verifyAccount(valueInput, Boolean(nextView)));
case 4:
_await$verifyAccount = _context.sent;
hasPassword = _await$verifyAccount.hasPassword;
success = _await$verifyAccount.success;
value = _await$verifyAccount.value;
type = _await$verifyAccount.type;
setErrorLogin(!success);
if (success) {
onChangeUserLogin(type === 'phone' ? value : valueInput);
onChangeView(nextView !== null && nextView !== void 0 ? nextView : hasPassword ? _utils2.ViewType.Password : _utils2.ViewType.Verify);
setLoginKey(null);
}
case 11:
case "end":
return _context.stop();
}
}
}, null, null, null, Promise);
}, [onChangeUserLogin, onChangeView, verifyAccount]);
var _handleNext = (0, _react.useCallback)(function _callee2(e) {
var _await$loginByPasswor, isPasswordValid, _await$loginByCode, isCodeValid, isFirstTime, error, _ref5, successRegister, _await$onUpdatePasswo, successPasswword, _await$loginByCode2, isRecoveryValid;
return _regenerator["default"].async(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!(e.charCode && e.charCode !== 13 || isNextDisabled || loading)) {
_context2.next = 2;
break;
}
return _context2.abrupt("return");
case 2:
setIsCodeValidationExpired(false);
_context2.prev = 3;
_context2.t0 = typeView;
_context2.next = _context2.t0 === _utils2.ViewType.Login ? 7 : _context2.t0 === _utils2.ViewType.Password ? 9 : _context2.t0 === _utils2.ViewType.Verify ? 15 : _context2.t0 === _utils2.ViewType.Register ? 25 : _context2.t0 === _utils2.ViewType.NewPassword ? 34 : _context2.t0 === _utils2.ViewType.Recovery ? 40 : 47;
break;
case 7:
_handleSubmitSetEmail(valueInput);
return _context2.abrupt("break", 48);
case 9:
_context2.next = 11;
return _regenerator["default"].awrap(loginByPassword({
email: currentUser,
keepSession: keepSession,
password: passwordValue
}));
case 11:
_await$loginByPasswor = _context2.sent;
isPasswordValid = _await$loginByPasswor.success;
setErrorLogin(!isPasswordValid);
return _context2.abrupt("break", 48);
case 15:
_context2.next = 17;
return _regenerator["default"].awrap(loginByCode({
code: passwordValue,
keepSession: keepSession,
type: typeCode,
value: currentUser
}));
case 17:
_await$loginByCode = _context2.sent;
isCodeValid = _await$loginByCode.success;
isFirstTime = _await$loginByCode.isNew;
error = _await$loginByCode.error;
setErrorLogin(!isCodeValid);
if (error === 'Validation code expired') setIsCodeValidationExpired(!isCodeValid);
if (isCodeValid) if (isFirstTime) onChangeView(_utils2.ViewType.Register);else onSuccessLogin(true);
return _context2.abrupt("break", 48);
case 25:
_context2.next = 27;
return _regenerator["default"].awrap(updateAccount(register));
case 27:
_context2.t1 = _context2.sent;
if (_context2.t1) {
_context2.next = 30;
break;
}
_context2.t1 = {};
case 30:
_ref5 = _context2.t1;
successRegister = _ref5.success;
if (successRegister) {
setValueInput('');
setPasswordValue('');
}
return _context2.abrupt("break", 48);
case 34:
_context2.next = 36;
return _regenerator["default"].awrap(onUpdatePassword(passwordValue));
case 36:
_await$onUpdatePasswo = _context2.sent;
successPasswword = _await$onUpdatePasswo.success;
if (!successPasswword) setErrorLogin(true);
return _context2.abrupt("break", 48);
case 40:
_context2.next = 42;
return _regenerator["default"].awrap(loginByCode({
code: passwordValue,
keepSession: keepSession,
type: typeCode,
value: currentUser
}));
case 42:
_await$loginByCode2 = _context2.sent;
isRecoveryValid = _await$loginByCode2.success;
setErrorLogin(!isRecoveryValid);
if (isRecoveryValid) {
setPasswordValue('');
onChangeView(_utils2.ViewType.NewPassword);
}
return _context2.abrupt("break", 48);
case 47:
return _context2.abrupt("break", 48);
case 48:
_context2.next = 53;
break;
case 50:
_context2.prev = 50;
_context2.t2 = _context2["catch"](3);
onError(_context2.t2, typeView);
case 53:
case "end":
return _context2.stop();
}
}
}, null, null, [[3, 50]], Promise);
}, [isNextDisabled, loading, typeView, _handleSubmitSetEmail, valueInput, loginByPassword, currentUser, keepSession, passwordValue, loginByCode, typeCode, onChangeView, onSuccessLogin, updateAccount, register, onUpdatePassword, onError]);
var _handleClickShowPassword = (0, _react.useCallback)(function () {
setShowPassword(function (prev) {
return !prev;
});
}, []);
var _handleKeepSession = (0, _react.useCallback)(function () {
setKeepSession(function (prev) {
onUpdateState({
keepSession: !prev
});
return !prev;
});
}, [onUpdateState]);
var _handleResendPassword = (0, _react.useCallback)(function _callee3() {
var _await$verifyAccount2, success;
return _regenerator["default"].async(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return _regenerator["default"].awrap(verifyAccount(currentUser, true));
case 2:
_await$verifyAccount2 = _context3.sent;
success = _await$verifyAccount2.success;
if (success) setErrorLogin(false);
case 5:
case "end":
return _context3.stop();
}
}
}, null, null, null, Promise);
}, [currentUser, verifyAccount]);
var _handleForgotPassword = (0, _react.useCallback)(function () {
setPasswordValue('');
onChangeView(_utils2.ViewType.Recovery);
verifyAccount(valueInput, true); // eslint-disable-next-line react-hooks/exhaustive-deps
}, [verifyAccount, valueInput]);
(0, _react.useImperativeHandle)(ref, function () {
return {
submitEmail: function submitEmail(email, nextView) {
logout();
_handleChangeInput({
target: {
name: 'email',
value: email
}
});
_handleSubmitSetEmail(email, nextView);
}
};
});
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, [_utils2.ViewType.Password, _utils2.ViewType.Verify, _utils2.ViewType.Recovery, _utils2.ViewType.NewPassword].includes(typeView) && /*#__PURE__*/_react["default"].createElement(_kdsCore.TextField, {
autoFocus: true,
className: (0, _clsx["default"])(classes.labelOutlined),
error: isErrorLogin || isCodeValidationExpired,
FormHelperTextProps: {
classes: {
contained: classes.helperText
}
},
fullWidth: true,
helperText: isCodeValidationExpired ? errorMessages.newCode : (isErrorLogin || [_utils2.ViewType.Recovery, _utils2.ViewType.NewPassword].includes(typeView)) && errorMessages[typeView],
InputProps: {
className: classes.inputStyle,
classes: {
input: classes.emailInput,
root: (0, _clsx["default"])(isErrorLogin && classes.colorError)
},
endAdornment: [_utils2.ViewType.Password, _utils2.ViewType.NewPassword].includes(typeView) && /*#__PURE__*/_react["default"].createElement(_kdsCore.IconButton, {
className: classes.iconShowPassword,
onClick: _handleClickShowPassword,
size: "small"
}, showPassword ? _ref6 : _ref7)
},
label: [_utils2.ViewType.Verify, _utils2.ViewType.Recovery].includes(typeView) ? 'Código de verificación' : inputLabels[typeView],
onChange: _handleChangePassword,
onKeyPress: _handleNext,
required: true,
type: showPassword || [_utils2.ViewType.Verify, _utils2.ViewType.Recovery].includes(typeView) ? 'text' : 'password',
value: passwordValue,
variant: "outlined"
}), typeView === _utils2.ViewType.Login && /*#__PURE__*/_react["default"].createElement(_kdsCore.TextField, {
autoFocus: true,
className: (0, _clsx["default"])(classes.fieldEmail, classes.labelOutlined),
error: isErrorLogin,
fullWidth: true,
helperText: isErrorLogin && errorMessages[typeView],
InputProps: {
classes: {
input: classes.emailInput,
root: classes.textfield
}
},
label: inputLabels[loginWith],
name: "login",
onChange: _handleChangeInput,
onKeyPress: _handleNext,
type: "email",
value: valueInput,
variant: "outlined"
}), typeView === _utils2.ViewType.Register && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_kdsCore.TextField, {
autoFocus: true,
className: (0, _clsx["default"])(classes.labelOutlined),
fullWidth: true // InputLabelProps={{
// classes: {
// root: classes.labelOutlined
// }
// }}
,
InputProps: {
classes: {
input: classes.emailInput,
root: classes.textfield
}
},
label: "Nombres",
name: "firstName",
onChange: _handleChangeRegister,
required: true,
value: register.firstName || '',
variant: "outlined"
}), /*#__PURE__*/_react["default"].createElement(_kdsCore.TextField, {
className: (0, _clsx["default"])(classes.fieldEmail, classes.labelOutlined),
fullWidth: true // InputLabelProps={{
// classes: {
// root: classes.labelOutlined
// }
// }}
,
InputProps: {
classes: {
input: classes.emailInput,
root: classes.textfield
}
},
label: "Apellidos",
name: "lastName",
onChange: _handleChangeRegister,
required: true,
value: register.lastName || '',
variant: "outlined"
}), /*#__PURE__*/_react["default"].createElement(_kdsCore.TextField, {
className: (0, _clsx["default"])(classes.fieldEmail, classes.labelOutlined),
fullWidth: true // InputLabelProps={{
// classes: {
// root: classes.labelOutlined
// }
// }}
,
InputProps: {
classes: {
input: classes.emailInput,
root: classes.textfield
}
},
label: currentUser.indexOf('@') !== -1 ? 'Celular (opcional)' : 'Correo electrónico (opcional)',
name: currentUser.indexOf('@') !== -1 ? 'phone' : 'email',
onChange: _handleChangeRegister,
value: register[currentUser.indexOf('@') !== -1 ? 'phone' : 'email'] || '',
variant: "outlined"
})), loginkey && /*#__PURE__*/_react["default"].createElement("div", {
className: classes.margintop
}, loginkey === 'google' && _ref8, loginkey === 'microsoft' && _ref9), [_utils2.ViewType.Password, _utils2.ViewType.Verify, _utils2.ViewType.NewPassword].includes(typeView) && /*#__PURE__*/_react["default"].createElement(_kdsCore.FormControlLabel, {
className: classes.labelCheckbox,
control: /*#__PURE__*/_react["default"].createElement(_kdsCore.Checkbox, {
checked: keepSession,
color: "primary",
onChange: _handleKeepSession
}),
label: "Mantener mi sesi\xF3n abierta"
}), typeView === _utils2.ViewType.NewPassword && /*#__PURE__*/_react["default"].createElement(_kdsCore.Typography, {
align: "center",
className: (0, _clsx["default"])(classes.textfield, classes.textEnd, classes.nextButton2),
color: "disabled"
}, "No olvides revisar tu contrase\xF1a antes de establecerla para evitar cualquier inconveniente m\xE1s adelante."), /*#__PURE__*/_react["default"].createElement(_kdsCore.Button, {
className: (0, _clsx["default"])(classes.nextButton, loginkey && classes.nextButton2),
color: "primary",
disabled: isNextDisabled || loading,
fullWidth: true,
onClick: _handleNext,
startIcon: loading && _ref10,
variant: "contained"
}, "Continuar"), [_utils2.ViewType.Password, _utils2.ViewType.Verify, _utils2.ViewType.Recovery].includes(typeView) && /*#__PURE__*/_react["default"].createElement("div", {
className: classes.endContent
}, typeView === _utils2.ViewType.Password ? /*#__PURE__*/_react["default"].createElement(_kdsCore.Button, {
color: "primary",
onClick: _handleForgotPassword,
size: "small"
}, "\xBFOlvidaste tu contrase\xF1a?") : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_kdsCore.Typography, {
className: (0, _clsx["default"])(classes.textfield, classes.textEnd),
color: "disabled"
}, "\xBFNo lo encuentras?"), /*#__PURE__*/_react["default"].createElement(_kdsCore.Button, {
className: classes.capitalizeText,
color: "primary",
onClick: _handleResendPassword,
size: "small"
}, "Reenviar"))));
});
var useStyles = (0, _kdsCore.makeStyles)(function (_ref11) {
var spacing = _ref11.spacing,
palette = _ref11.palette;
return {
capitalizeText: {
textTransform: 'capitalize'
},
colorError: {
color: palette.error.main
},
emailInput: {
color: palette.common.black,
// fontSize: 14,
padding: spacing(1.5)
},
endContent: {
alignItems: 'center',
display: 'flex',
justifyContent: 'center',
marginTop: spacing(3)
},
fieldEmail: {
marginTop: spacing(1.5)
},
helperText: {
marginLeft: 0
},
inputStyle: {
fontSize: 14
},
labelCheckbox: {
'& > span': {
fontSize: 14,
padding: spacing(1, 1, 1, 0)
},
margin: spacing(2, 0, 0, 0)
},
labelOutlined: {
'& .MuiInputLabel-outlined': {
transform: 'translate(8px, 13px) scale(1)'
},
'& .MuiInputLabel-outlined.MuiInputLabel-shrink': {
transform: 'translate(8px, -5px) scale(0.9)'
}
},
margintop: {
marginTop: spacing(4)
},
nextButton: {
marginTop: spacing(4)
},
nextButton2: {
marginTop: spacing(2)
},
outlinedLabel: {
top: -8
},
textEnd: {
color: palette.grey[600]
},
textfield: {
fontSize: 14
}
};
}, {
name: 'KrowdyOneTap'
});
var _default = _react["default"].memo(KrowdyOneTap);
exports["default"] = _default;