kwikid-components
Version:
KwikID's Components Library
623 lines • 102 kB
JavaScript
import { __awaiter } from "tslib";
import { Component, EventEmitter, Inject, Input, Output } from "@angular/core";
import { mergeObjects } from "kwikid-toolkit";
import { TuiDialogService } from "@taiga-ui/core";
import { LOGIN_FORM_CONFIG, LOGIN_PAGE_CONFIG } from "./login.constants";
import { getFormattedTime, setFormTypeAndFormFields, setPrivacyPolicy, setSidePanelConfig, setValuesInLocalStorage } from "./login.helper";
import * as i0 from "@angular/core";
import * as i1 from "./login.service";
import * as i2 from "kwikui";
import * as i3 from "../../svgs/language-select-icon/language-select-icon.component";
import * as i4 from "../../components/page-header/page-header.component";
import * as i5 from "kwikid-forms";
import * as i6 from "../../components/page-footer/page-footer.component";
import * as i7 from "@angular/common";
import * as i8 from "@taiga-ui/core";
export class KwikIDLoginComponent {
constructor(loginService, loaderService, dialogs) {
this.loginService = loginService;
this.loaderService = loaderService;
this.dialogs = dialogs;
this.config = LOGIN_PAGE_CONFIG;
this.data = {};
// LOADING
this.loading = true;
// CONFIG VARIABLES
this.header = {};
this.footer = {};
this.privacyPolicy = {};
this.sidePanel = {};
this.showBrowserDetails = false;
// LOGIN FORM VARIABLES
this.formTitle = "";
this.formConfig = LOGIN_FORM_CONFIG;
this.formType = "";
this.formData = {};
// LOGIN FLOW VARIABLES
this.isAgentFlow = false;
this.isOTPSent = false;
this.isOTPFlow = false;
this.isChangingPassword = false;
this.apiResponses = {};
// OTP FLOW VARIABLES
this.isResendOtp = false;
this.otpTimer = undefined;
this.otpTimerCount = undefined;
this.otpTimerInterval = undefined;
// PREVIEW ERROR VARIABLES
this.previewProperties = undefined;
this.previewDialogRef = undefined;
this.preview = undefined;
// EVENT EMITTERS
this.onLoginSuccess = new EventEmitter();
this.onShowError = new EventEmitter();
this.onSendEventLogs = new EventEmitter();
this.onClickLanguageSelectIcon = new EventEmitter();
this.handleJourneyProcess = (formData) => {
if (this.isAgentFlow) {
this.handleAgentFlowJourneyProcess(formData);
}
else {
this.handleUserFlowJourneyProcess(formData);
}
};
this.handleAgentFlowJourneyProcess = (formData) => __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c;
// Condition 1 -> First Stage i.e. Agent just entered Credentials, OTP Not Sent & Not Change Agent Password
if (!this.isOTPSent && !this.isChangingPassword) {
// Agent Logged in
const agentLoginResponse = yield this.loginService.agentLogin(formData, this.data);
this.apiResponses.AGENT_LOGIN = agentLoginResponse;
// Condition 1.1 -> If Agent Login Success
if (agentLoginResponse === null || agentLoginResponse === void 0 ? void 0 : agentLoginResponse.success) {
const logs = {
label: "Agent Login Success",
type: "AGENT__LOGIN__API__SUCCESS",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_LOGIN,
status: agentLoginResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
}
// If Agent Login Fails
else {
const logs = {
label: "Agent Login failure",
type: "AGENT__LOGIN__API__FAILURE",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_LOGIN,
response: agentLoginResponse.api_response,
status: agentLoginResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleOnApiResponseMessage(agentLoginResponse);
yield this.toggleLoader(false);
return; // Do Agent Login Again
}
// Condition 1.2 -> If Agent Password is outdated, Setup Change Password Page
if (((_a = agentLoginResponse === null || agentLoginResponse === void 0 ? void 0 : agentLoginResponse.api_response) === null || _a === void 0 ? void 0 : _a.is_pass_outdated) === 1 ||
((_b = agentLoginResponse === null || agentLoginResponse === void 0 ? void 0 : agentLoginResponse.api_response) === null || _b === void 0 ? void 0 : _b.is_first_login) === 1) {
this.isChangingPassword = true;
const { config } = this;
const { data } = this;
config.formType = "Change Password";
data.loginCredrentials = {};
this.initLoginForm(config, data);
const logs = {
label: "Agent Changing Passowrd",
type: "AGENT__FORM__CHANGE_PASSWORD",
data: {
agent_id: this.formData.username
}
};
this.handleOnSendEventLogs(logs);
yield this.toggleLoader(false);
return; // Start Change Passowrd Flow
}
}
// Condition 2 -> If Agent is Changing Password
if (this.isChangingPassword) {
const chnageAgentPasswordResponse = yield this.loginService.changeAgentPassword(formData, this.data);
this.apiResponses.AGENT_CHANGE_PASSWORD = chnageAgentPasswordResponse;
if (chnageAgentPasswordResponse === null || chnageAgentPasswordResponse === void 0 ? void 0 : chnageAgentPasswordResponse.success) {
const logs = {
label: "Agent Change Password Success",
type: "AGENT__CHANGE_PASSWORD__API__SUCCESS",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_CHANGE_PASSWORD,
status: chnageAgentPasswordResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
}
else {
const logs = {
label: "Agent Change Password failure",
type: "AGENT__CHANGE_PASSWORD__API__FAILURE",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_CHANGE_PASSWORD,
response: chnageAgentPasswordResponse.api_response,
status: chnageAgentPasswordResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
}
this.handleOnApiResponseMessage(chnageAgentPasswordResponse);
return; // Changed Password Handled
}
// Condition 3 -> If Agent Flow is with OTP Verification & OTP Not Sent
if (this.isOTPFlow && !this.isOTPSent) {
const sendAgentOtpResponse = yield this.loginService.sendAgentOtp(formData, this.data);
this.apiResponses.AGENT_SEND_OTP = sendAgentOtpResponse;
// Condition 3.1. Success -> If Send User OTP Success, Go to OTP Page
if (sendAgentOtpResponse && (sendAgentOtpResponse === null || sendAgentOtpResponse === void 0 ? void 0 : sendAgentOtpResponse.success)) {
const logs = {
label: "Agent Send OTP Success",
type: "AGENT__SEND_OTP__API__SUCCESS",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_SEND_OTP,
status: sendAgentOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleSettingOtpFlow(false, (_c = sendAgentOtpResponse === null || sendAgentOtpResponse === void 0 ? void 0 : sendAgentOtpResponse.api_response) === null || _c === void 0 ? void 0 : _c.phone_number);
}
// Condition 3.2. Failure -> Else Show API Failure Popup
else {
const logs = {
label: "Agent Send OTP Failure",
type: "AGENT__SEND_OTP__API__FAILURE",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_SEND_OTP,
response: sendAgentOtpResponse.api_response,
status: sendAgentOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleOnApiResponseMessage(sendAgentOtpResponse);
}
return; // Handle OTP Flow
}
// Condition 4 -> If Agent Flow is with OTP Verification & OTP is Sent
if (this.isOTPFlow && this.isOTPSent) {
const verifyAgentOtpResponse = yield this.loginService.verifyAgentOtp(formData, this.data);
this.apiResponses.AGENT_VERIFY_OTP = verifyAgentOtpResponse;
// Condition 4.1 Success -> If Verify User OTP Success, Handle Login Success
if (verifyAgentOtpResponse && (verifyAgentOtpResponse === null || verifyAgentOtpResponse === void 0 ? void 0 : verifyAgentOtpResponse.success)) {
const logs = {
label: "Agent Verify OTP Success",
type: "AGENT__VERIFY_OTP__API__SUCCESS",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_VERIFY_OTP,
status: verifyAgentOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.isAgentFlow = false;
// Login Operation Successful | Go Ahead;
}
// Condition 4.2 Failure -> Else Show API Failure popup
else {
const logs = {
label: "Agent Verify OTP Failure",
type: "AGENT__VERIFY_OTP__API__FAILURE",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_VERIFY_OTP,
response: verifyAgentOtpResponse.api_response,
status: verifyAgentOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleOnApiResponseMessage(verifyAgentOtpResponse);
return; // Handle OTP Flow
}
}
// If Everything goes right, handle Lo
this.handleOnLoginSuccess();
});
this.handleUserFlowJourneyProcess = (formData) => __awaiter(this, void 0, void 0, function* () {
var _d, _e, _f, _g;
// Condition 1. -> If User needs to verify with OTP
if (this.isOTPFlow) {
// Condition 1.1. -> If OTP not sent
if (!this.isOTPSent) {
const sendUserOtpResponse = yield this.loginService.sendUserOtp(formData, this.data);
this.apiResponses.USER_SEND_OTP = sendUserOtpResponse;
// Condition 1.1. Success -> If Send User OTP Success, Go to OTP Page
if (sendUserOtpResponse && (sendUserOtpResponse === null || sendUserOtpResponse === void 0 ? void 0 : sendUserOtpResponse.success)) {
const logs = {
label: "User Send OTP Success",
type: "USER__SEND_OTP__API__SUCCESS",
data: {
user_id: localStorage.getItem("user_id"),
mobile_number: localStorage.getItem("mobile"),
api: {
url: this.loginService.backend.loginUrls.USER_SEND_OTP,
status: sendUserOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleSettingOtpFlow();
}
// Condition 1.1. Failure -> Else Show API Failure Popup
else {
const logs = {
label: "User Send OTP Failure",
type: "USER__SEND_OTP__API__FAILURE",
data: {
user_id: localStorage.getItem("user_id"),
mobile_number: localStorage.getItem("mobile"),
api: {
url: this.loginService.backend.loginUrls.USER_SEND_OTP,
response: sendUserOtpResponse.api_response,
status: sendUserOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleOnApiResponseMessage(sendUserOtpResponse);
}
}
// Condition 1.2. -> If OTP is sent and needs to be verified
else {
const verifyUserOtpResponse = yield this.loginService.verifyUserOtp(formData, this.data);
this.apiResponses.USER_VERIFY_OTP = verifyUserOtpResponse;
// Condition 1.2 Success -> If Verify User OTP Success, Do User Login and Handle Login Success
if (verifyUserOtpResponse && (verifyUserOtpResponse === null || verifyUserOtpResponse === void 0 ? void 0 : verifyUserOtpResponse.success)) {
const logs = {
label: "User Verify OTP Success",
type: "USER__VERIFY_OTP__API__SUCCESS",
data: {
user_id: localStorage.getItem("user_id"),
mobile_number: localStorage.getItem("mobile"),
api: {
url: this.loginService.backend.loginUrls.USER_VERIFY_OTP,
status: verifyUserOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
// If Journey is not Linked Based
if (!((_e = (_d = this.config) === null || _d === void 0 ? void 0 : _d.utilityFlags) === null || _e === void 0 ? void 0 : _e.isLinkedBased)) {
const userLoginResponse = yield this.loginService.userLogin(this.data);
this.apiResponses.USER_LOGIN = userLoginResponse;
const logs = {
label: "User Login API",
type: "USER__LOGIN__API",
data: {
user_id: localStorage.getItem("user_id"),
mobile_number: localStorage.getItem("mobile"),
api: {
url: this.loginService.backend.loginUrls.USER_LOGIN,
response: userLoginResponse.api_response,
status: userLoginResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
}
// Login Operation Successful
this.handleOnLoginSuccess();
}
// Condition 1.2 Failure -> Else Show API Failure popup
else {
const logs = {
label: "User Verify OTP Failure",
type: "USER__VERIFY_OTP__API__FAILURE",
data: {
user_id: localStorage.getItem("user_id"),
mobile_number: localStorage.getItem("mobile"),
api: {
url: this.loginService.backend.loginUrls.USER_VERIFY_OTP,
response: verifyUserOtpResponse.api_response,
status: verifyUserOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleOnApiResponseMessage(verifyUserOtpResponse);
}
}
}
// Condition 2 -> If OTP Verification not required, Handle Login Success
else {
if (!((_g = (_f = this.config) === null || _f === void 0 ? void 0 : _f.utilityFlags) === null || _g === void 0 ? void 0 : _g.isLinkedBased)) {
const userLoginResponse = yield this.loginService.userLogin(this.data);
this.apiResponses.USER_LOGIN = userLoginResponse;
const logs = {
label: "User Login API",
type: "USER__LOGIN__API",
data: {
user_id: localStorage.getItem("user_id"),
mobile_number: localStorage.getItem("mobile"),
api: {
url: this.loginService.backend.loginUrls.USER_LOGIN,
response: userLoginResponse.api_response,
status: userLoginResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
}
this.handleOnLoginSuccess();
}
});
this.handleSettingOtpFlow = (resent = false, otpSentTo = undefined) => {
// OTP FLOW UI SETUP
var _a;
this.formConfig = {};
const { config } = this;
const { data } = this;
config.formType = "OTP";
data.loginCredrentials = {};
this.initLoginForm(config, data);
//
this.otpTimerCount = (_a = this.config.utilityFlags.resendOtpTimer) !== null && _a !== void 0 ? _a : 6;
if (this.otpTimerInterval)
clearInterval(this.otpTimerInterval);
this.otpTimerInterval = setInterval(() => {
if (this.otpTimerCount <= 0) {
if (this.otpTimerInterval)
clearInterval(this.otpTimerInterval);
this.isResendOtp = true;
this.formConfig.fields[1].disabled = false;
this.formConfig.fields[1].label = "Resend OTP";
}
this.otpTimer = getFormattedTime(this.otpTimerCount);
this.otpTimerCount -= 1;
if (!this.isResendOtp) {
this.formConfig.fields[1].label = `Resend OTP in ${this.otpTimer}`;
}
}, 1000);
const user_id = String(otpSentTo !== null && otpSentTo !== void 0 ? otpSentTo : localStorage.getItem("user_id"));
let message;
if (user_id.length <= 10) {
message = `OTP ${resent ? "resent" : "sent"} successfully to XXXXXX${user_id.slice(6, 10)}`;
}
else {
message = `OTP ${resent ? "resent" : "sent"} successfully to ${user_id.slice(0, 5)}XXXXXX`;
}
this.isOTPSent = true;
this.isResendOtp = false;
this.formConfig.fields[0].messages = [
{
type: "success",
message
}
];
this.formConfig.fields[0].properties.otpLength =
this.config.utilityFlags.otpLength;
this.formConfig.fields[0].properties.hidePlaceholder =
this.config.utilityFlags.hideOtpFieldPlaceholder;
this.formConfig.fields[1].disabled = true;
this.toggleLoader(false);
};
}
ngOnInit() {
this.initLoginPageConfig();
}
initLoginPageConfig() {
var _a, _b, _c, _d, _e, _f, _g, _h;
this.config = mergeObjects(LOGIN_PAGE_CONFIG, this.config);
this.header = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.displaySettings) === null || _b === void 0 ? void 0 : _b.header;
this.footer = (_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.displaySettings) === null || _d === void 0 ? void 0 : _d.footer;
this.privacyPolicy = setPrivacyPolicy((_f = (_e = this.config) === null || _e === void 0 ? void 0 : _e.displaySettings) === null || _f === void 0 ? void 0 : _f.privacyPolicy);
this.sidePanel = setSidePanelConfig((_h = (_g = this.config) === null || _g === void 0 ? void 0 : _g.displaySettings) === null || _h === void 0 ? void 0 : _h.sidePanel);
this.loginService.setConfig(this.config);
this.initLoginPageFlow();
}
initLoginPageFlow() {
var _a, _b, _c;
this.formType = (_a = this.config) === null || _a === void 0 ? void 0 : _a.formType;
if (this.formType == "Agent Login") {
this.isAgentFlow = true;
}
else {
this.isAgentFlow = false;
}
if ((_c = (_b = this.config) === null || _b === void 0 ? void 0 : _b.utilityFlags) === null || _c === void 0 ? void 0 : _c.isOtpFlow) {
this.isOTPFlow = true;
}
else {
this.isOTPFlow = false;
}
this.initLoginForm(this.config, this.data);
this.toggleLoader(false);
}
initLoginForm(config, data) {
const { formTitle, formConfig } = setFormTypeAndFormFields(config, data);
(this.formTitle = formTitle), (this.formConfig = formConfig);
}
handleOnClickSaveButton(event) {
this.formData = Object.assign(Object.assign({}, this.formData), event.data);
this.toggleLoader(true);
setValuesInLocalStorage(this.formType, this.config, this.formData);
if (this.formType == "Custom") {
this.handleOnLoginSuccess();
}
else {
this.handleJourneyProcess(this.formData);
}
}
handleOnClickResendOTP(event) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
this.toggleLoader(true);
if (this.isAgentFlow) {
// Resend Agent OTP
const sendAgentOtpResponse = yield this.loginService.sendAgentOtp(this.formData, this.data);
this.apiResponses.AGENT_SEND_OTP = sendAgentOtpResponse;
// If Send User OTP Success, Go to OTP Page
if (sendAgentOtpResponse && (sendAgentOtpResponse === null || sendAgentOtpResponse === void 0 ? void 0 : sendAgentOtpResponse.success)) {
const logs = {
label: "Agent Resend OTP Success",
type: "AGENT__SEND_OTP__API__SUCCESS",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_SEND_OTP,
status: sendAgentOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleSettingOtpFlow(true, (_a = sendAgentOtpResponse === null || sendAgentOtpResponse === void 0 ? void 0 : sendAgentOtpResponse.api_response) === null || _a === void 0 ? void 0 : _a.phone_number);
}
// Else Show API Failure Popup
else {
const logs = {
label: "Agent Resend OTP Failure",
type: "AGENT__SEND_OTP__API__FAILURE",
data: {
agent_id: this.formData.username,
api: {
url: this.loginService.backend.loginUrls.AGENT_SEND_OTP,
response: sendAgentOtpResponse.api_response,
status: sendAgentOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleOnApiResponseMessage(sendAgentOtpResponse);
}
}
else {
// Resend User OTP
const sendUserOtpResponse = yield this.loginService.sendUserOtp(this.formData, this.data);
this.apiResponses.USER_SEND_OTP = sendUserOtpResponse;
// Condition 1.1. Success -> If Send User OTP Success, Go to OTP Page
if (sendUserOtpResponse && (sendUserOtpResponse === null || sendUserOtpResponse === void 0 ? void 0 : sendUserOtpResponse.success)) {
const logs = {
label: "User Resend OTP Success",
type: "USER__SEND_OTP__API__SUCCESS",
data: {
user_id: localStorage.getItem("user_id"),
mobile_number: localStorage.getItem("mobile"),
api: {
url: this.loginService.backend.loginUrls.USER_SEND_OTP,
status: sendUserOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleSettingOtpFlow(true);
}
// Condition 1.1. Failure -> Else Show API Failure Popup
else {
const logs = {
label: "User Resend OTP Failure",
type: "USER__SEND_OTP__API__FAILURE",
data: {
user_id: localStorage.getItem("user_id"),
mobile_number: localStorage.getItem("mobile"),
api: {
url: this.loginService.backend.loginUrls.USER_SEND_OTP,
response: sendUserOtpResponse.api_response,
status: sendUserOtpResponse.api_response.statusCode
}
}
};
this.handleOnSendEventLogs(logs);
this.handleOnApiResponseMessage(sendUserOtpResponse);
}
}
});
}
handleOnApiResponseMessage(response) {
this.handleOnShowErrorPage(response);
}
handleOnShowErrorPopup(message) {
this.dialogs.open(message, { size: "s" }).subscribe();
this.toggleLoader(false);
}
handleOnShowErrorPage(error) {
this.onShowError.emit(error);
this.toggleLoader(false);
}
handleOnClickLanguageSelectIcon() {
this.onClickLanguageSelectIcon.emit();
}
handleOnLoginSuccess() {
const data = {
api_responses: this.apiResponses,
form_data: this.formData
};
this.onLoginSuccess.emit(data);
this.toggleLoader(false);
}
handleOnSendEventLogs(logs) {
this.onSendEventLogs.emit({
api_responses: this.apiResponses,
form_data: this.formData,
form_type: this.formType,
logs
});
}
toggleLoader(loader, message = undefined) {
var _a, _b, _c;
if (loader) {
this.loaderService.show({
fullscreen: true,
loaderText: (_c = message !== null && message !== void 0 ? message : (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.displaySettings) === null || _b === void 0 ? void 0 : _b.pleaseWaitText) !== null && _c !== void 0 ? _c : "Please Wait"
});
this.loading = true;
}
else {
this.loaderService.hide();
this.loading = false;
}
}
}
/** @nocollapse */ KwikIDLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDLoginComponent, deps: [{ token: i1.KwikIDLoginService }, { token: i2.KwikUILoaderService }, { token: TuiDialogService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ KwikIDLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDLoginComponent, selector: "kwikid-components-login", inputs: { config: "config", data: "data" }, outputs: { onLoginSuccess: "onLoginSuccess", onShowError: "onShowError", onSendEventLogs: "onSendEventLogs", onClickLanguageSelectIcon: "onClickLanguageSelectIcon" }, ngImport: i0, template: "<kwikui-loader></kwikui-loader>\n\n<!-- Main Login Page Container -->\n<div\n *ngIf=\"!loading\"\n class=\"container\"\n [class.hideBackground]=\"config?.displaySettings?.hideBackground\"\n>\n <!-- Login Page Wrapper -->\n <div class=\"wrapper\">\n <!-- Login Form DIV -->\n <div class=\"login-form\">\n <!-- Language Selection Icon -->\n <kwikid-components-language-select-icon\n *ngIf=\"config?.utilityFlags?.isLanguageSelection\"\n class=\"language-select-icon\"\n (click)=\"handleOnClickLanguageSelectIcon()\"\n ></kwikid-components-language-select-icon>\n\n <!-- Login Form DIV header -->\n <kwikid-components-page-header [config]=\"header\">\n </kwikid-components-page-header>\n\n <!-- HTML Before Login Form -->\n <div\n *ngIf=\"config?.displaySettings?.html?.before\"\n [innerHtml]=\"config?.displaySettings?.html?.before | kwikuiSafeHtml\"\n >\n </div>\n\n <!-- Divider -->\n <span></span>\n\n <!-- Main Login Form -->\n <main>\n <div id=\"title\">{{ formTitle }}</div>\n <div id=\"form\">\n <kwikid-form-view\n [formConfig]=\"formConfig\"\n [allFormsData]=\"{}\"\n (onClickSaveForm)=\"handleOnClickSaveButton($event)\"\n (onClickFormFieldButton)=\"handleOnClickResendOTP($event)\"\n ></kwikid-form-view\n ></div>\n </main>\n\n <!-- HTML After Login Form -->\n <div\n *ngIf=\"config?.displaySettings?.html?.after\"\n [innerHtml]=\"config?.displaySettings?.html?.after | kwikuiSafeHtml\"\n >\n </div>\n\n <!-- Login Form DIV footer -->\n <kwikid-components-page-footer\n *ngIf=\"footer.showPowerBy\"\n [config]=\"footer\"\n >\n </kwikid-components-page-footer>\n </div>\n\n <!-- Side Animation | HTML | Image for Login Page -->\n <div class=\"animation\">\n <!-- Animation -->\n <kwikui-animation-player\n *ngIf=\"sidePanel?.animation\"\n [config]=\"sidePanel?.animation\"\n id=\"animation\"\n ></kwikui-animation-player>\n\n <!-- HTML -->\n <div\n *ngIf=\"sidePanel?.html\"\n [innerHtml]=\"sidePanel?.html | kwikuiSafeHtml\"\n >\n </div>\n\n <!-- Image -->\n <kwikui-image\n *ngIf=\"sidePanel?.image\"\n [imageSrc]=\"sidePanel?.image\"\n styles=\"width: 375px\"\n altText=\"Logo\"\n imageType=\"url\"\n ></kwikui-image>\n </div>\n </div>\n\n <!-- Show Privacy Policy -->\n <a\n *ngIf=\"privacyPolicy\"\n class=\"privacy-policy\"\n [href]=\"privacyPolicy?.redirection?.link\"\n [target]=\"privacyPolicy?.redirection?.target ?? '_blank'\"\n >\n {{ privacyPolicy?.displayText }}\n </a>\n\n <!-- Show Version -->\n <div\n *ngIf=\"config?.displaySettings?.version\"\n class=\"version-new\"\n (click)=\"\n !showBrowserDetails\n ? (showBrowserDetails = true)\n : (showBrowserDetails = false)\n \"\n >\n {{ config.displaySettings.version }}\n </div>\n\n <!-- Show Broswer Details -->\n <div\n *ngIf=\"showBrowserDetails && config?.displaySettings?.browserDetails\"\n class=\"browser-details\"\n >\n <pre style=\"text-wrap: wrap; height: 100%\">{{\n config.displaySettings.browserDetails | json\n }}</pre>\n <button\n style=\"padding: 1rem\"\n (click)=\"showBrowserDetails = false\"\n >Close</button\n >\n </div>\n</div>\n", styles: [":host{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;width:100%}.language-select-icon{width:40px;height:40px;position:absolute;left:.75rem;top:.75rem;cursor:pointer}.container{width:100%;height:100vh;position:relative;display:flex;flex-direction:row;justify-content:center;align-items:stretch;margin:auto;padding:50px;background-color:var(--tui-primary-active)}.container .wrapper{width:100%;height:100%;max-width:991px;display:flex;flex-direction:row;justify-content:center;align-items:center;background:#ffffff;border-radius:1rem;box-shadow:0 2px 10px -3px var(--tui-base-05)}.container .wrapper .login-form{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:#fff;border-top-left-radius:1rem;border-bottom-left-radius:1rem}.container .wrapper .login-form>*:not(:last-child){margin-bottom:.5rem}.container .wrapper .login-form kwikid-components-page-header{max-width:370px;padding:0 2rem}.container .wrapper .login-form span{display:block;width:100%;max-width:300px;margin-top:1rem;border-top:1px solid var(--tui-base-03)}.container .wrapper .login-form main{display:flex;flex-direction:column;align-content:center;justify-content:flex-start;align-items:center;width:100%;max-width:370px;padding:1rem}.container .wrapper .login-form main #title{padding:.5rem;font-size:1.4rem;font-weight:600;line-height:1.1}.container .wrapper .login-form main #form{width:100%}.container .wrapper .animation{padding:2rem;background-color:var(--tui-secondary-active);display:flex;align-items:center;justify-content:center;flex-wrap:wrap;height:100%;width:100%;border-top-right-radius:1rem;border-bottom-right-radius:1rem}.container.loading{background-color:var(--tui-base-01)}.container.hideBackground{padding:0;background-color:var(--tui-base-01)}.container.hideBackground .wrapper{border-radius:0;box-shadow:none}.container.hideBackground .wrapper .login-form{width:100%;height:100%;display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:center;padding:1rem;max-width:400px;margin:auto}.container.hideBackground .wrapper .animation{display:none}.container.hideBackground .version-new{color:var(--tui-base-04)}.container.hideBackground .privacy-policy{color:var(--tui-base-04)}@media only screen and (max-width: 991px){.container{padding:0;background-color:var(--tui-base-01)}.container .wrapper{border-radius:0;box-shadow:none}.container .wrapper .login-form{width:100%;height:100%;display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:center;padding:1rem;max-width:400px;margin:auto}.container .wrapper .animation{display:none}.container .version-new{color:var(--tui-base-07)}.container .privacy-policy{color:var(--tui-base-07)}}.version-new{position:absolute;bottom:0;left:0;margin:.5rem;color:var(--tui-base-04);font-style:italic;font-size:14px;z-index:1000}.privacy-policy{position:absolute;bottom:0;right:0;margin:.5rem;color:var(--tui-base-04);font-style:italic;font-size:14px;z-index:1000;text-decoration:none}.browser-details{position:absolute;top:50%;left:50%;border:.1px solid lightgray;padding:.25rem;box-shadow:#64646f33 0 7px 29px;border-radius:4px;transform:translate(-50%,-50%);background:white;width:90%;height:90%;z-index:3;overflow:auto;font-size:1em;line-height:1em;display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;grid-gap:1rem;gap:1rem}@media only screen and (max-width: 400px){main{padding:1rem 0!important}}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}\n"], components: [{ type: i2.KwikUILoaderComponent, selector: "kwikui-loader" }, { type: i3.LanguageSelectIconComponent, selector: "kwikid-components-language-select-icon" }, { type: i4.KwikIDPageHeaderComponent, selector: "kwikid-components-page-header", inputs: ["config"] }, { type: i5.KwikIDFormViewComponent, selector: "kwikid-form-view", inputs: ["allFormsData", "extraData", "apiCallResponse", "buttonClickResponse", "formConfig", "formData", "isMobileView", "popupFormCallback", "userConfig", "stepConfig"], outputs: ["getLogs", "getUnsavedDataState", "onActionShowPopupForm", "onClickApiCall", "onClickViewFile", "onClickFormFieldButton", "onClickGoBack", "onClickSaveForm", "onClickViewForms"] }, { type: i6.KwikIDPageFooterComponent, selector: "kwikid-components-page-footer", inputs: ["config"] }, { type: i2.KwikUIAnimationPlayerComponent, selector: "kwikui-animation-player", inputs: ["config", "id", "player"] }, { type: i2.KwikUIImageComponent, selector: "kwikui-image", inputs: ["altText", "class", "html", "id", "imageSrc", "imageType", "loadingType", "styles"], outputs: ["onClick"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "kwikuiSafeHtml": i2.KwikUISafeHtmlPipe, "json": i7.JsonPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDLoginComponent, decorators: [{
type: Component,
args: [{
selector: "kwikid-components-login",
templateUrl: "./login.component.html",
styleUrls: ["./login.component.scss"]
}]
}], ctorParameters: function () { return [{ type: i1.KwikIDLoginService }, { type: i2.KwikUILoaderService }, { type: i8.TuiDialogService, decorators: [{
type: Inject,
args: [TuiDialogService]
}] }]; }, propDecorators: { config: [{
type: Input
}], data: [{
type: Input
}], onLoginSuccess: [{
type: Output
}], onShowError: [{
type: Output
}], onSendEventLogs: [{
type: Output
}], onClickLanguageSelectIcon: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWNvbXBvbmVudHMvc3JjL2xpYi9wYWdlcy9sb2dpbi9sb2dpbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtY29tcG9uZW50cy9zcmMvbGliL3BhZ2VzL2xvZ2luL2xvZ2luLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQix1QkFBdUIsRUFDeEIsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQVF4QixNQUFNLE9BQU8sb0JBQW9CO0lBc0UvQixZQUNVLFlBQWdDLEVBQ2hDLGFBQWtDLEVBRXpCLE9BQXlCO1FBSGxDLGlCQUFZLEdBQVosWUFBWSxDQUFvQjtRQUNoQyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFFekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUF4RTVDLFdBQU0sR0FBUSxpQkFBaUIsQ0FBQztRQUdoQyxTQUFJLEdBQVEsRUFBRSxDQUFDO1FBRWYsVUFBVTtRQUNWLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFFZixtQkFBbUI7UUFDbkIsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUVqQixXQUFNLEdBQVEsRUFBRSxDQUFD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