@nibssplc/cams-sdk-react 1.0.0-rc.84 → 1.0.0-rc.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,11 @@
1
1
  import { MFAEndpoints } from "./MFAGate";
2
- interface LoginPageProps {
2
+ export interface LoginPageProps {
3
3
  usePassKey?: boolean;
4
4
  CredentialsAuthEndpoint?: string;
5
5
  useADLogin?: boolean;
6
6
  MFAEndpoints: MFAEndpoints;
7
7
  PassKeysRegisterProps?: Record<string, unknown>;
8
+ onADLoginSuccess?: () => void;
8
9
  }
9
- declare const DefaultLoginPage: ({ usePassKey, useADLogin, MFAEndpoints, CredentialsAuthEndpoint, PassKeysRegisterProps, }: LoginPageProps) => import("react/jsx-runtime").JSX.Element;
10
+ declare const DefaultLoginPage: ({ usePassKey, useADLogin, MFAEndpoints, CredentialsAuthEndpoint, PassKeysRegisterProps, onADLoginSuccess, }: LoginPageProps) => import("react/jsx-runtime").JSX.Element;
10
11
  export default DefaultLoginPage;
package/dist/index.cjs.js CHANGED
@@ -1556,29 +1556,22 @@ var useCredentialsHandler = function (onAuthComplete) {
1556
1556
  };
1557
1557
 
1558
1558
  var MFAOptions = function (_a) {
1559
- var _b, _c, _d, _e, _f;
1559
+ var _b, _c;
1560
1560
  var onComplete = _a.onComplete, onAuthFailed = _a.onAuthFailed, MFAEndpoints = _a.MFAEndpoints, usePassKey = _a.usePassKey;
1561
- var _g = React.useState(""), value = _g[0], setValue = _g[1];
1562
- var _h = React.useState(false), otpVisible = _h[0], setOtpVisible = _h[1];
1563
- var _j = React.useState(false), showSuccessAnimation = _j[0], setShowSuccessAnimation = _j[1];
1564
- var _k = React.useState(null), authType = _k[0], setAuthType = _k[1];
1561
+ var _d = React.useState(""), value = _d[0], setValue = _d[1];
1562
+ var _e = React.useState(false), otpVisible = _e[0], setOtpVisible = _e[1];
1563
+ var _f = React.useState(false), showSuccessAnimation = _f[0], setShowSuccessAnimation = _f[1];
1564
+ var _g = React.useState(null), authType = _g[0], setAuthType = _g[1];
1565
1565
  var context = useCAMSContext();
1566
- var _l = context.authMode === "MSAL" && "sendEmailOTP" in context
1566
+ var _h = context.authMode === "MSAL" && "AuthenticatorCode" in context
1567
1567
  ? context
1568
1568
  : { completeMFA: null, logout: function () { return __awaiter$1(void 0, void 0, void 0, function () { return __generator$1(this, function (_a) {
1569
1569
  return [2 /*return*/];
1570
- }); }); } }, completeMFA = _l.completeMFA, logout = _l.logout;
1571
- context.authMode === "MSAL" ? context.accessToken : "";
1572
- context.authMode === "MSAL" ? context.idToken : "";
1570
+ }); }); } }, completeMFA = _h.completeMFA, logout = _h.logout;
1573
1571
  var authenticate = useWebAuthn().authenticate;
1574
1572
  var authenticator = new camsSdk.CAMSMFAAuthenticator();
1575
- camsSdk.Logger.debug("User context:", {
1576
- user: context.user,
1577
- profile: (_b = context.user) === null || _b === void 0 ? void 0 : _b.profile,
1578
- email: (_d = (_c = context.user) === null || _c === void 0 ? void 0 : _c.profile) === null || _d === void 0 ? void 0 : _d.email,
1579
- });
1580
- var _m = useOTPHandler({
1581
- email: ((_f = (_e = context.user) === null || _e === void 0 ? void 0 : _e.profile) === null || _f === void 0 ? void 0 : _f.email) || context.email,
1573
+ var _j = useOTPHandler({
1574
+ email: ((_c = (_b = context.user) === null || _b === void 0 ? void 0 : _b.profile) === null || _c === void 0 ? void 0 : _c.email) || context.email,
1582
1575
  appCode: context.appCode || "",
1583
1576
  MFAEndpoint: MFAEndpoints.ValidateUserMFA,
1584
1577
  onAuthComplete: function (state, data) {
@@ -1607,7 +1600,7 @@ var MFAOptions = function (_a) {
1607
1600
  }
1608
1601
  }
1609
1602
  },
1610
- }), handleSubmitOTP = _m.handleSubmitOTP, loading = _m.loading, attemptCount = _m.attemptCount, remainingAttempts = _m.remainingAttempts, isMaxAttemptsReached = _m.isMaxAttemptsReached, resetAttempts = _m.resetAttempts;
1603
+ }), handleSubmitOTP = _j.handleSubmitOTP, loading = _j.loading, attemptCount = _j.attemptCount, remainingAttempts = _j.remainingAttempts, isMaxAttemptsReached = _j.isMaxAttemptsReached, resetAttempts = _j.resetAttempts;
1611
1604
  var handleGoBack = function () {
1612
1605
  setAuthType(null);
1613
1606
  setOtpVisible(false);
@@ -1729,12 +1722,12 @@ var ADLoginModal = function (_a) {
1729
1722
  return (jsxRuntime.jsxs(FormItem, { children: [jsxRuntime.jsx(FormLabel, { children: "Username" }), jsxRuntime.jsx(FormControl, { children: jsxRuntime.jsx(Input, __assign({ className: "h-12", placeholder: "Enter your username" }, field)) }), jsxRuntime.jsx(FormMessage, {})] }));
1730
1723
  } }), jsxRuntime.jsx(FormField, { control: form.control, name: "password", render: function (_a) {
1731
1724
  var field = _a.field;
1732
- return (jsxRuntime.jsxs(FormItem, { children: [jsxRuntime.jsx(FormLabel, { children: "Password" }), jsxRuntime.jsx(FormControl, { children: jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsx(Input, __assign({ className: "h-12 pr-10", type: "password", placeholder: "Enter your password" }, field)), jsxRuntime.jsx("button", { type: "button", onClick: function () { return setShowPassword(!showPassword); }, className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground", children: showPassword ? (jsxRuntime.jsx(lucideReact.EyeOff, { className: "w-5 h-5" })) : (jsxRuntime.jsx(lucideReact.Eye, { className: "w-5 h-5" })) })] }) }), jsxRuntime.jsx(FormMessage, {})] }));
1733
- } }), jsxRuntime.jsx(Button, { type: "submit", className: "py-3 w-full bg-[#506f4a] hover:bg-[#506f4a]/90", children: "Continue" })] }) }))) : (jsxRuntime.jsxs("div", { className: "space-y-4", children: [jsxRuntime.jsx(GenericOTPVerifier, { value: MFACode, setValue: setMFACode, setLoading: setIsLoading, isDisabled: isLoading, onChangeOTP: handleMFASubmit, fieldName: "AuthenticatorCode" }), isLoading && (jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 text-sm text-muted-foreground", children: [jsxRuntime.jsx(lucideReact.Loader2, { className: "w-4 h-4 animate-spin" }), jsxRuntime.jsx("span", { children: "Verifying..." })] }))] }))] }) }));
1725
+ return (jsxRuntime.jsxs(FormItem, { children: [jsxRuntime.jsx(FormLabel, { children: "Password" }), jsxRuntime.jsx(FormControl, { children: jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsx(Input, __assign({ className: "h-12 pr-10", type: showPassword ? "text" : "password", placeholder: "Enter your password" }, field)), jsxRuntime.jsx("button", { type: "button", onClick: function () { return setShowPassword(!showPassword); }, className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground", children: showPassword ? (jsxRuntime.jsx(lucideReact.EyeOff, { className: "w-5 h-5" })) : (jsxRuntime.jsx(lucideReact.Eye, { className: "w-5 h-5" })) })] }) }), jsxRuntime.jsx(FormMessage, {})] }));
1726
+ } }), jsxRuntime.jsx(Button, { type: "submit", className: "py-4 w-full bg-[#506f4a] hover:bg-[#506f4a]/90", children: "Continue" })] }) }))) : (jsxRuntime.jsxs("div", { className: "space-y-4", children: [jsxRuntime.jsx(GenericOTPVerifier, { value: MFACode, setValue: setMFACode, setLoading: setIsLoading, isDisabled: isLoading, onChangeOTP: handleMFASubmit, fieldName: "AuthenticatorCode" }), isLoading && (jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 text-sm text-muted-foreground", children: [jsxRuntime.jsx(lucideReact.Loader2, { className: "w-4 h-4 animate-spin" }), jsxRuntime.jsx("span", { children: "Verifying..." })] }))] }))] }) }));
1734
1727
  };
1735
1728
 
1736
1729
  var DefaultLoginPage = function (_a) {
1737
- var usePassKey = _a.usePassKey, useADLogin = _a.useADLogin, MFAEndpoints = _a.MFAEndpoints, CredentialsAuthEndpoint = _a.CredentialsAuthEndpoint, PassKeysRegisterProps = _a.PassKeysRegisterProps;
1730
+ var usePassKey = _a.usePassKey, useADLogin = _a.useADLogin, MFAEndpoints = _a.MFAEndpoints, CredentialsAuthEndpoint = _a.CredentialsAuthEndpoint, PassKeysRegisterProps = _a.PassKeysRegisterProps, onADLoginSuccess = _a.onADLoginSuccess;
1738
1731
  var cardVariants = {
1739
1732
  hidden: { opacity: 0, scale: 0.8, y: 50 },
1740
1733
  visible: {
@@ -1748,20 +1741,20 @@ var DefaultLoginPage = function (_a) {
1748
1741
  var context = useCAMSContext();
1749
1742
  var login = context.login, isLoading = context.isLoading, authMode = context.authMode;
1750
1743
  var _b = React.useState(false), showADModal = _b[0], setShowADModal = _b[1];
1744
+ var _c = React.useState(false), showSuccessAnimation = _c[0], setShowSuccessAnimation = _c[1];
1751
1745
  var register = useWebAuthn().register;
1752
1746
  var authentication = new camsSdk.CAMSMFAAuthenticator();
1753
- var _c = useCredentialsHandler(function (state, data) { return __awaiter$1(void 0, void 0, void 0, function () {
1747
+ var _d = useCredentialsHandler(function (state, data) { return __awaiter$1(void 0, void 0, void 0, function () {
1754
1748
  return __generator$1(this, function (_a) {
1755
1749
  console.log(data);
1756
1750
  if (state && data && data.isValid) {
1757
- context.isAuthenticated = true;
1751
+ setShowSuccessAnimation(true);
1758
1752
  localStorage.setItem(context.storageKey, JSON.stringify({
1759
- isAuthenticated: false,
1753
+ isAuthenticated: true,
1760
1754
  requiresMFA: false,
1761
1755
  accessToken: "Credentials",
1762
1756
  idToken: "Credentials",
1763
1757
  }));
1764
- context.requiresMFA = false;
1765
1758
  context.setUserProfile({
1766
1759
  state: "AUTH_SUCCESS",
1767
1760
  message: data.message,
@@ -1774,13 +1767,14 @@ var DefaultLoginPage = function (_a) {
1774
1767
  tokens: data.tokens,
1775
1768
  },
1776
1769
  });
1770
+ setShowADModal(false);
1777
1771
  }
1778
1772
  else {
1779
1773
  sonner.toast.error("\u274C AD Login failed. ".concat((data === null || data === void 0 ? void 0 : data.message) || "Unknown error"));
1780
1774
  }
1781
1775
  return [2 /*return*/];
1782
1776
  });
1783
- }); }), handleSubmitCredentials = _c.handleSubmitCredentials, isCredAuthLoading = _c.loading, setIsCredAuthLoading = _c.setLoading;
1777
+ }); }), handleSubmitCredentials = _d.handleSubmitCredentials, isCredAuthLoading = _d.loading, setIsCredAuthLoading = _d.setLoading;
1784
1778
  var handleMSALLogin = function () {
1785
1779
  if (typeof window !== "undefined" && !window.crypto) {
1786
1780
  sonner.toast.error("Crypto API not available. Please use a modern browser.");
@@ -1794,6 +1788,11 @@ var DefaultLoginPage = function (_a) {
1794
1788
  console.warn("Regular CAMS login requires configuration");
1795
1789
  }
1796
1790
  };
1791
+ if (showSuccessAnimation && useADLogin) {
1792
+ return (jsxRuntime.jsx("div", { className: "flex justify-center items-center h-dvh", children: jsxRuntime.jsx(Card, { className: "mx-auto space-y-6 p-6 bg-white rounded-lg shadow-md", children: jsxRuntime.jsx(AuthSuccessAnimation, { onComplete: function () {
1793
+ onADLoginSuccess === null || onADLoginSuccess === void 0 ? void 0 : onADLoginSuccess();
1794
+ } }) }) }));
1795
+ }
1797
1796
  return (jsxRuntime.jsxs("main", { className: "cams-sdk min-h-screen bg-gray-50", children: [jsxRuntime.jsx(framerMotion.motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.5 }, children: jsxRuntime.jsx("div", { className: "flex h-screen items-center justify-center", children: jsxRuntime.jsxs(framerMotion.motion.div, { variants: cardVariants, initial: "hidden", animate: "visible", exit: "exit", className: "w-full max-w-md p-6 space-y-4 rounded-2xl shadow-2xl", children: [jsxRuntime.jsxs(CardHeader, { className: "text-center space-y-3", children: [jsxRuntime.jsx("div", { className: "w-full flex items-center justify-center", children: jsxRuntime.jsx("img", { src: NIBSSLogo, alt: "NIBSS Logo", width: 225, height: 225 }) }), jsxRuntime.jsx(CardTitle, { className: "text-3xl font-bold", children: "NIBSS CAMS" }), jsxRuntime.jsx(CardTitle, { className: "text-gray-500 dark:text-gray-400 font-bold text-lg", children: "Centralized Authentication" })] }), jsxRuntime.jsxs(CardAction, { className: "w-full flex flex-col items-center justify-center text-center text-gray-500 dark:text-gray-400 mb-8", children: [jsxRuntime.jsx("img", { src: AuthLogo, alt: "Auth Logo", width: 365, height: 365 }), "Use Below Identity Providers To Authenticate"] }), jsxRuntime.jsxs("div", { className: "space-y-4", children: [jsxRuntime.jsxs(Button
1798
1797
  // variant="outline"
1799
1798
  , {
@@ -1803,7 +1802,7 @@ var DefaultLoginPage = function (_a) {
1803
1802
  : "Sign in with ActiveDirectory" })] })), usePassKey && (jsxRuntime.jsxs(Button, { className: "w-full flex items-center justify-center cursor-pointer bg-[#506f4a] hover:bg-[#506f4a] rounded-lg border border-transparent px-5 py-8 text-base font-medium transition-colors duration-250", onClick: function () {
1804
1803
  return authentication.HandleRegister(MFAEndpoints.RegisterNewChallenge, MFAEndpoints.RegisterVerify +
1805
1804
  "?username=".concat(PassKeysRegisterProps.username), register, PassKeysRegisterProps);
1806
- }, disabled: isLoading, children: [jsxRuntime.jsx(lucideReact.KeyIcon, { className: "text-[#506f4a]", size: 64 }), jsxRuntime.jsx("span", { children: "Create a Passkey" })] }))] }), jsxRuntime.jsxs(CardFooter, { className: "flex items-center justify-center mt-6 space-x-2 text-gray-400 text-sm", children: [jsxRuntime.jsx(lucideReact.ShieldCheck, { className: "w-4 h-4 text-[#506f4a] pulse-glow" }), jsxRuntime.jsx("span", { children: "Powered By NIBSS" })] })] }) }) }, "landing"), jsxRuntime.jsx(ADLoginModal, { open: showADModal, onOpenChange: setShowADModal, isLoading: isCredAuthLoading, setIsLoading: setIsCredAuthLoading, onLogin: function (_a) { return __awaiter$1(void 0, [_a], void 0, function (_b) {
1805
+ }, disabled: isLoading, children: [jsxRuntime.jsx(lucideReact.KeyIcon, { className: "text-[#506f4a]", size: 64 }), jsxRuntime.jsx("span", { children: "Create a Passkey" })] }))] }), jsxRuntime.jsxs(CardFooter, { className: "flex items-center justify-center mt-6 space-x-2 text-gray-400 text-sm", children: [jsxRuntime.jsx(lucideReact.ShieldCheck, { className: "w-4 h-4 text-[#506f4a] pulse-glow" }), jsxRuntime.jsx("span", { children: "Powered By NIBSS" })] })] }) }) }, "landing"), jsxRuntime.jsx(ADLoginModal, { open: showADModal, onOpenChange: setShowADModal, isLoading: context.isLoading || isCredAuthLoading, setIsLoading: setIsCredAuthLoading, onLogin: function (_a) { return __awaiter$1(void 0, [_a], void 0, function (_b) {
1807
1806
  var username = _b.username, password = _b.password, MFACode = _b.MFACode;
1808
1807
  return __generator$1(this, function (_c) {
1809
1808
  // Implement your AD login logic here
@@ -1862,6 +1861,8 @@ var MFAGate = function (_a) {
1862
1861
  (_a = context.onAuthSuccess) === null || _a === void 0 ? void 0 : _a.call(context, tokens);
1863
1862
  }
1864
1863
  }
1864
+ // Force state update after MFA completion
1865
+ setAuthState("Authenticated");
1865
1866
  }
1866
1867
  else if (!success) {
1867
1868
  camsSdk.Logger.error("MFA authentication failed", { context: context || null });
@@ -1955,7 +1956,7 @@ var MFAGate = function (_a) {
1955
1956
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
1956
1957
  case "Unauthenticated":
1957
1958
  default:
1958
- return (jsxRuntime.jsx(DefaultLoginPage, { usePassKey: usePassKey, useADLogin: useADLogin, MFAEndpoints: ValidatedMFAEndpoints, PassKeysRegisterProps: PassKeysRegisterProps, CredentialsAuthEndpoint: CredentialsAuthEndpoint }));
1959
+ return (jsxRuntime.jsx(DefaultLoginPage, { usePassKey: usePassKey, useADLogin: useADLogin, MFAEndpoints: ValidatedMFAEndpoints, PassKeysRegisterProps: PassKeysRegisterProps, CredentialsAuthEndpoint: CredentialsAuthEndpoint, onADLoginSuccess: function () { return setAuthState("Authenticated"); } }));
1959
1960
  }
1960
1961
  };
1961
1962