kwikid-components
Version:
KwikID's Components Library
667 lines • 86.3 kB
JavaScript
import { checkObjectKeyExists, isNotEmptyArray } from "kwikid-toolkit";
import { Injectable } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "../../services/api.service";
export class KwikIDLoginService {
constructor(apiService) {
this.apiService = apiService;
this.backend = {};
this.secureApis = {};
this.utilityFlags = {};
}
checkIfEncryptAPI(API_KEY) {
var _a, _b, _c, _d, _e;
if ((_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.secureAllApis) === null || _b === void 0 ? void 0 : _b.encrypt) {
return true;
}
if (isNotEmptyArray((_c = this === null || this === void 0 ? void 0 : this.secureApis) === null || _c === void 0 ? void 0 : _c.encrypt) &&
((_e = (_d = this === null || this === void 0 ? void 0 : this.secureApis) === null || _d === void 0 ? void 0 : _d.encrypt) === null || _e === void 0 ? void 0 : _e.includes(API_KEY))) {
return true;
}
return false;
}
checkIfDecryptAPI(API_KEY) {
var _a, _b, _c, _d, _e;
if ((_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.secureAllApis) === null || _b === void 0 ? void 0 : _b.decrypt) {
return true;
}
if (isNotEmptyArray((_c = this === null || this === void 0 ? void 0 : this.secureApis) === null || _c === void 0 ? void 0 : _c.decrypt) &&
((_e = (_d = this === null || this === void 0 ? void 0 : this.secureApis) === null || _d === void 0 ? void 0 : _d.decrypt) === null || _e === void 0 ? void 0 : _e.includes(API_KEY))) {
return true;
}
return false;
}
checkIfVerifySignature(API_KEY) {
var _a, _b, _c, _d, _e;
if ((_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.secureAllApis) === null || _b === void 0 ? void 0 : _b.verifySignature) {
return true;
}
if (isNotEmptyArray((_c = this === null || this === void 0 ? void 0 : this.secureApis) === null || _c === void 0 ? void 0 : _c.verifySignature) &&
((_e = (_d = this === null || this === void 0 ? void 0 : this.secureApis) === null || _d === void 0 ? void 0 : _d.verifySignature) === null || _e === void 0 ? void 0 : _e.includes(API_KEY))) {
return true;
}
return false;
}
setConfig(config) {
this.backend = config === null || config === void 0 ? void 0 : config.backend;
this.secureApis = config === null || config === void 0 ? void 0 : config.secureApis;
this.utilityFlags = config === null || config === void 0 ? void 0 : config.utilityFlags;
}
userLogin(data) {
return new Promise((resolve) => {
var _a;
const API_KEY = "USER_LOGIN";
const requestBody = {
phone_number: localStorage.getItem("mobile"),
username: localStorage.getItem("user_id"),
extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info
};
const url = this.backend.loginUrls[API_KEY];
this.apiService
.post(url, requestBody, {
headers: {
auth: localStorage.getItem("token"),
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json"
}
}, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY))
.subscribe((res) => {
resolve({
success: true,
api_response: res
});
}, (err) => {
resolve({
success: false,
api_response: err
});
});
});
}
sendUserOtp(formData, data) {
return new Promise((resolve) => {
var _a, _b, _c;
const API_KEY = "USER_SEND_OTP";
const requestBody = {
phone_number: (_a = formData.mobile) !== null && _a !== void 0 ? _a : localStorage.getItem("mobile"),
user_id: (_b = formData.user_id) !== null && _b !== void 0 ? _b : localStorage.getItem("user_id"),
extras: (_c = JSON.parse(localStorage.getItem("user_info"))) !== null && _c !== void 0 ? _c : data === null || data === void 0 ? void 0 : data.user_info,
session_id: localStorage.getItem("session_id")
};
const url = this.backend.loginUrls[API_KEY];
this.apiService
.post(url, requestBody, {
headers: {
auth: localStorage.getItem("token"),
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json"
}
}, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY))
.subscribe((res) => {
if (res && (res === null || res === void 0 ? void 0 : res.success)) {
resolve({
success: true,
api_response: res
});
}
else if (checkObjectKeyExists(res, "msg")) {
resolve({
success: false,
message: res.msg,
type: "POPUP",
api_response: res
});
}
else if (checkObjectKeyExists(res, "message")) {
resolve({
success: false,
message: res.message,
type: "POPUP",
api_response: res
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: res
});
}
}, (err) => {
if ((err === null || err === void 0 ? void 0 : err.msg) && (err === null || err === void 0 ? void 0 : err.msg.includes("MAX_RETRIES"))) {
resolve({
success: false,
message: "7",
type: "PAGE",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.msg) && !(err === null || err === void 0 ? void 0 : err.msg.includes("MAX_RETRIES"))) {
resolve({
success: false,
message: err.msg,
type: "POPUP",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: "Token Expired, Restarting Portal.",
type: "RELOAD",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
!(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: err.message,
type: "POPUP",
api_response: err
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: err
});
}
});
});
}
verifyUserOtp(formData, data) {
return new Promise((resolve) => {
var _a;
const API_KEY = "USER_VERIFY_OTP";
const requestBody = {
phone_number: localStorage.getItem("mobile"),
user_id: localStorage.getItem("user_id"),
otp: formData.otp,
dedupe: this.utilityFlags.dedupeMobileOtp,
extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info,
session_id: localStorage.getItem("session_id")
};
const url = this.backend.loginUrls[API_KEY];
this.apiService
.post(url, requestBody, {
headers: {
auth: localStorage.getItem("token"),
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json"
}
}, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY))
.subscribe((res) => {
if (res && (res === null || res === void 0 ? void 0 : res.verified)) {
resolve({
success: true,
api_response: res
});
}
else if (checkObjectKeyExists(res, "msg")) {
resolve({
success: false,
message: res.msg,
type: "POPUP",
api_response: res
});
}
else if (checkObjectKeyExists(res, "message")) {
resolve({
success: false,
message: res.message,
type: "POPUP",
api_response: res
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: res
});
}
}, (err) => {
if ((err === null || err === void 0 ? void 0 : err.msg) && (err === null || err === void 0 ? void 0 : err.msg.includes("OTP Not Verified"))) {
resolve({
success: false,
message: "Invalid OTP Entered!",
type: "POPUP",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.msg) && !(err === null || err === void 0 ? void 0 : err.msg.includes("OTP Not Verified"))) {
resolve({
success: false,
message: err.msg,
type: "POPUP",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: "Token Expired, Restarting Portal.",
type: "RELOAD",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
!(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: err.message,
type: "POPUP",
api_response: err
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: err
});
}
});
});
}
agentLogin(formData, data) {
return new Promise((resolve) => {
var _a;
const API_KEY = "AGENT_LOGIN";
const requestBody = {
agent_id: formData.username,
agent_password: formData.password,
agent_data_needed: true,
concurrent_auditor: false,
domain_name: localStorage.getItem("domain"),
extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info
};
const url = this.backend.loginUrls[API_KEY];
this.apiService
.post(url, requestBody, {
headers: {
auth: localStorage.getItem("token"),
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json"
}
}, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY))
.subscribe((res) => {
var _a, _b;
if (res && (res === null || res === void 0 ? void 0 : res.success)) {
resolve({
success: true,
api_response: res
});
}
else if (checkObjectKeyExists(res, "msg")) {
resolve({
success: false,
message: res.msg,
type: "POPUP",
api_response: res
});
}
else if (checkObjectKeyExists(res, "message")) {
resolve({
success: false,
message: res.message,
type: "POPUP",
api_response: res
});
}
else {
const message = (_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.loginErrorMsg) !== null && _b !== void 0 ? _b : "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: res
});
}
}, (err) => {
var _a, _b;
if (err === null || err === void 0 ? void 0 : err.msg) {
resolve({
success: false,
message: err.msg,
type: "POPUP",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: "Token Expired, Restarting Portal.",
type: "RELOAD",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
!(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: err.message,
type: "POPUP",
api_response: err
});
}
else {
const message = (_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.loginErrorMsg) !== null && _b !== void 0 ? _b : "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: err
});
}
});
});
}
sendAgentOtp(formData, data) {
return new Promise((resolve) => {
var _a;
const API_KEY = "AGENT_SEND_OTP";
const requestBody = {
agent_id: formData.username,
extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info
};
const url = this.backend.loginUrls[API_KEY];
this.apiService
.post(url, requestBody, {
headers: {
auth: localStorage.getItem("token"),
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json"
}
}, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY))
.subscribe((res) => {
if (res && (res === null || res === void 0 ? void 0 : res.success)) {
resolve({
success: true,
api_response: res
});
}
else if (checkObjectKeyExists(res, "msg")) {
resolve({
success: false,
message: res.msg,
type: "POPUP",
api_response: res
});
}
else if (checkObjectKeyExists(res, "message")) {
resolve({
success: false,
message: res.message,
type: "POPUP",
api_response: res
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: res
});
}
}, (err) => {
if ((err === null || err === void 0 ? void 0 : err.msg) && (err === null || err === void 0 ? void 0 : err.msg.includes("MAX_RETRIES"))) {
resolve({
success: false,
message: "7",
type: "PAGE",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.msg) && !(err === null || err === void 0 ? void 0 : err.msg.includes("MAX_RETRIES"))) {
resolve({
success: false,
message: err.msg,
type: "POPUP",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: "Token Expired, Restarting Portal.",
type: "RELOAD",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
!(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: err.message,
type: "POPUP",
api_response: err
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: err
});
}
});
});
}
verifyAgentOtp(formData, data) {
return new Promise((resolve) => {
var _a;
const API_KEY = "AGENT_VERIFY_OTP";
const requestBody = {
agent_id: localStorage.getItem("agent_id"),
domain_name: localStorage.getItem("domain"),
otp: formData.otp,
extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info
};
const url = this.backend.loginUrls[API_KEY];
this.apiService
.post(url, requestBody, {
headers: {
auth: localStorage.getItem("token"),
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json"
}
}, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY))
.subscribe((res) => {
if (res && (res === null || res === void 0 ? void 0 : res.verified)) {
resolve({
success: true,
api_response: res
});
}
else if (checkObjectKeyExists(res, "msg")) {
resolve({
success: false,
message: res.msg,
type: "POPUP",
api_response: res
});
}
else if (checkObjectKeyExists(res, "message")) {
resolve({
success: false,
message: res.message,
type: "POPUP",
api_response: res
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: res
});
}
}, (err) => {
if ((err === null || err === void 0 ? void 0 : err.msg) && (err === null || err === void 0 ? void 0 : err.msg.includes("OTP Not Verified"))) {
resolve({
success: false,
message: "Invalid OTP Entered!",
type: "POPUP",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.msg) && !(err === null || err === void 0 ? void 0 : err.msg.includes("OTP Not Verified"))) {
resolve({
success: false,
message: err.msg,
type: "POPUP",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: "Token Expired, Restarting Portal.",
type: "RELOAD",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
!(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: err.message,
type: "POPUP",
api_response: err
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: err
});
}
});
});
}
changeAgentPassword(formData, data) {
return new Promise((resolve) => {
const API_KEY = "AGENT_CHANGE_PASSWORD";
const agent_id = localStorage.getItem("agent_id");
const formdata = new FormData();
formdata.append("old_password", formData.old_password);
formdata.append("new_password", formData.new_password);
formdata.append("repeat_password", formData.repeat_password);
formdata.append("isEncrypted", "0");
const url = `${this.backend.loginUrls[API_KEY]}/${agent_id}`;
this.apiService
.post(url, formdata, {
headers: {
auth: localStorage.getItem("token"),
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json"
}
}, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY))
.subscribe((res) => {
if (res && ((res === null || res === void 0 ? void 0 : res.status) == 200 || (res === null || res === void 0 ? void 0 : res.success))) {
resolve({
success: true,
message: "Password Updated Successfully. Please Login Again!",
type: "RELOAD",
api_response: res
});
}
else if (checkObjectKeyExists(res, "msg")) {
resolve({
success: false,
message: res.msg,
type: "POPUP",
api_response: res
});
}
else if (checkObjectKeyExists(res, "message")) {
resolve({
success: false,
message: res.message,
type: "POPUP",
api_response: res
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: res
});
}
}, (err) => {
if (err === null || err === void 0 ? void 0 : err.msg) {
resolve({
success: false,
message: err.msg,
type: "POPUP",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: "Token Expired, Restarting Portal.",
type: "RELOAD",
api_response: err
});
}
else if ((err === null || err === void 0 ? void 0 : err.message) &&
!(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) {
resolve({
success: false,
message: err.message,
type: "POPUP",
api_response: err
});
}
else {
const message = "Something went wrong, Please try again later!";
resolve({
success: false,
message,
type: "POPUP",
api_response: err
});
}
});
});
}
}
/** @nocollapse */ KwikIDLoginService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDLoginService, deps: [{ token: i1.KwikIDApiService }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ KwikIDLoginService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDLoginService, providedIn: "root" });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDLoginService, decorators: [{
type: Injectable,
args: [{
providedIn: "root"
}]
}], ctorParameters: function () { return [{ type: i1.KwikIDApiService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvcGFnZXMvbG9naW4vbG9naW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTTNDLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFBb0IsVUFBNEI7UUFBNUIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFFaEQsWUFBTyxHQUFRLEVBQUUsQ0FBQztRQUVsQixlQUFVLEdBQVEsRUFBRSxDQUFDO1FBRXJCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO0lBTjRCLENBQUM7SUFRcEQsaUJBQWlCLENBQUMsT0FBTzs7UUFDdkIsSUFBSSxNQUFBLE1BQUEsSUFBSSxDQUFDLFlBQVksMENBQUUsYUFBYSwwQ0FBRSxPQUFPLEVBQUU7WUFDN0MsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQ0UsZUFBZSxDQUFDLE1BQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFVBQVUsMENBQUUsT0FBTyxDQUFDO2FBQzFDLE1BQUEsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsVUFBVSwwQ0FBRSxPQUFPLDBDQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQSxFQUM1QztZQUNBLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxPQUFPOztRQUN2QixJQUFJLE1BQUEsTUFBQSxJQUFJLENBQUMsWUFBWSwwQ0FBRSxhQUFhLDBDQUFFLE9BQU8sRUFBRTtZQUM3QyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFDRSxlQUFl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