import { parseJwt } from "@credify/crypto" import { BareEventCallback, JsonObject, PushClaimEventCallback, UserProfile, } from "." import * as config from "./config" import { saveUserCredential } from "./storage" import { parseUserClaims } from "./utils" const createUserCompletedHandler = ( pushClaimCB: PushClaimEventCallback, passportWindow: Window | null, payload: object ) => { // payload is UserProfile saveUserCredential(JSON.stringify(payload)) const user: UserProfile = payload as UserProfile if (pushClaimCB) { pushClaimCB(user?.credifyId!, (isSuccess: boolean) => { console.log({ pushClaimCBStatus: isSuccess }) passportWindow?.postMessage( JSON.stringify({ type: config.WEBSDK_EVENT, action: config.PUSH_CLAIM_COMPLETED_ACTION, payload: { isSuccess }, }), "*" ) }) } else { passportWindow?.postMessage( JSON.stringify({ type: config.WEBSDK_EVENT, action: config.PUSH_CLAIM_COMPLETED_ACTION, payload: { isSuccess: true }, }), "*" ) } } const initialLoadCompletedHandler = ( passportWindow: Window | null, data: JsonObject ) => { passportWindow?.postMessage( JSON.stringify({ type: config.WEBSDK_EVENT, action: "startRedemption", payload: data, }), "*" ) } const initPromotionLoadCompleted = ( passportWindow: Window | null, data: JsonObject ) => { passportWindow?.postMessage( JSON.stringify({ type: config.WEBSDK_EVENT, action: config.OPENER_SHOW_PROMOTION_OFFER, payload: data, }), "*" ) } const loadActionLoginHandler = ( passportWindow: Window | null, data: JsonObject ) => { passportWindow?.postMessage( JSON.stringify({ type: config.WEBSDK_EVENT, action: "actionLogin", payload: data, }), "*" ) } const loginDataActionHandler = ( passportWindow: Window | null, payload: object, proxyLoginCallback: BareEventCallback ) => { // Doing mapping to UserProfule first const userData = parseUserClaims(payload) // Store this user PII for offer filtering and login in the future saveUserCredential(JSON.stringify(userData)) // close the passport window passportWindow?.close() // Reload offer list callback if (proxyLoginCallback) { proxyLoginCallback() } } const oidcCompletedHandler = ( passportWindow: Window | null, payload: object ) => { // @ts-ignore const url = payload.url || "" if (!url) { console.log("The payload has something wrong") passportWindow?.close() return } let form = document.createElement("form") form.method = "POST" form.action = url document.body.appendChild(form) form.submit() // close the passport window passportWindow?.close() } const checkTokenExpired = (token: string) => { try { const jwtValue = parseJwt(token) if (jwtValue?.payload?.exp) { const currentTime = +new Date() / 1000 // seconds return currentTime < jwtValue?.payload?.exp } return true } catch (error) { return true } } export { createUserCompletedHandler, initialLoadCompletedHandler, loginDataActionHandler, oidcCompletedHandler, loadActionLoginHandler, initPromotionLoadCompleted, checkTokenExpired, }