114 lines
4.6 KiB
TypeScript
Raw Normal View History

2021-05-01 14:55:58 +02:00
import { useEffect, memo } from "react";
2022-07-29 01:31:55 +02:00
import Template from "./Template";
2021-05-01 14:55:58 +02:00
import type { KcProps } from "./KcProps";
2021-06-23 08:16:51 +02:00
import type { KcContextBase } from "../getKcContext/KcContextBase";
2022-04-27 21:02:10 +02:00
import { getMsg } from "../i18n";
import { headInsert } from "../tools/headInsert";
import { pathJoin } from "../../bin/tools/pathJoin";
2021-08-20 17:03:50 +02:00
import { useCssAndCx } from "tss-react";
2021-05-01 14:55:58 +02:00
2022-07-29 01:31:55 +02:00
const LoginOtp = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginOtp } & KcProps) => {
const { otpLogin, url } = kcContext;
2021-08-20 17:03:50 +02:00
const { cx } = useCssAndCx();
2021-05-01 14:55:58 +02:00
2022-04-27 21:02:10 +02:00
const { msg, msgStr } = getMsg(kcContext);
2021-05-01 14:55:58 +02:00
useEffect(() => {
let isCleanedUp = false;
2021-05-01 14:55:58 +02:00
headInsert({
"type": "javascript",
"src": pathJoin(kcContext.url.resourcesCommonPath, "node_modules/jquery/dist/jquery.min.js"),
}).then(() => {
if (isCleanedUp) return;
2021-05-01 14:55:58 +02:00
evaluateInlineScript();
});
2021-05-01 14:55:58 +02:00
return () => {
isCleanedUp = true;
};
}, []);
return (
<Template
{...{ kcContext, ...props }}
doFetchDefaultThemeResources={true}
headerNode={msg("doLogIn")}
formNode={
<form id="kc-otp-login-form" className={cx(props.kcFormClass)} action={url.loginAction} method="post">
{otpLogin.userOtpCredentials.length > 1 && (
<div className={cx(props.kcFormGroupClass)}>
<div className={cx(props.kcInputWrapperClass)}>
{otpLogin.userOtpCredentials.map(otpCredential => (
<div key={otpCredential.id} className={cx(props.kcSelectOTPListClass)}>
<input type="hidden" value="${otpCredential.id}" />
<div className={cx(props.kcSelectOTPListItemClass)}>
<span className={cx(props.kcAuthenticatorOtpCircleClass)} />
<h2 className={cx(props.kcSelectOTPItemHeadingClass)}>{otpCredential.userLabel}</h2>
</div>
</div>
))}
</div>
2021-05-01 14:55:58 +02:00
</div>
)}
<div className={cx(props.kcFormGroupClass)}>
<div className={cx(props.kcLabelWrapperClass)}>
<label htmlFor="otp" className={cx(props.kcLabelClass)}>
{msg("loginOtpOneTime")}
</label>
</div>
2021-05-01 14:55:58 +02:00
<div className={cx(props.kcInputWrapperClass)}>
<input id="otp" name="otp" autoComplete="off" type="text" className={cx(props.kcInputClass)} autoFocus />
</div>
</div>
2021-05-01 14:55:58 +02:00
<div className={cx(props.kcFormGroupClass)}>
<div id="kc-form-options" className={cx(props.kcFormOptionsClass)}>
<div className={cx(props.kcFormOptionsWrapperClass)} />
2021-05-01 14:55:58 +02:00
</div>
<div id="kc-form-buttons" className={cx(props.kcFormButtonsClass)}>
<input
className={cx(props.kcButtonClass, props.kcButtonPrimaryClass, props.kcButtonBlockClass, props.kcButtonLargeClass)}
name="login"
id="kc-login"
type="submit"
value={msgStr("doLogIn")}
/>
</div>
</div>
</form>
}
/>
);
});
2021-05-01 14:55:58 +02:00
declare const $: any;
function evaluateInlineScript() {
$(document).ready(function () {
// Card Single Select
$(".card-pf-view-single-select").click(function (this: any) {
if ($(this).hasClass("active")) {
$(this).removeClass("active");
$(this).children().removeAttr("name");
} else {
$(".card-pf-view-single-select").removeClass("active");
$(".card-pf-view-single-select").children().removeAttr("name");
$(this).addClass("active");
$(this).children().attr("name", "selectedCredentialId");
2021-05-01 14:55:58 +02:00
}
});
var defaultCred = $(".card-pf-view-single-select")[0];
2021-05-01 14:55:58 +02:00
if (defaultCred) {
defaultCred.click();
}
});
}
2022-07-29 01:31:55 +02:00
export default LoginOtp;