Untitled

 avatar
unknown
plain_text
a month ago
14 kB
6
Indexable
//
//  HomePageWebviewPresenter.swift
//  UpGrad
//
//  Created by Pawankumar Dhamane on 21/11/23.
//  Copyright © 2023 Upgrad. All rights reserved.
//

import UIKit
import AppsFlyerLib

class HomePageWebviewPresenter: BaseModulePresenter, HomePageWebviewModuleInput, HomePageWebviewViewOutput {

    var view: HomePageWebviewViewInput?
    var interactor: HomePageWebviewInteractorInput?
    var router: HomePageWebviewRouterInput?
    var webViewType: WebViewPage
    var redirectionUrl: String
    var pageName:String?
    var cookieDomain: String
    var authCookieName: String
    var dropLeadViewModel: DropLeadRequestModel!

    init(webViewType:WebViewPage, name:String?, redirectionUrl:String) {
        self.redirectionUrl = redirectionUrl
        self.webViewType = webViewType
        self.pageName = name
        let env = Utils.environment
        switch env {
        case "Staging":
            self.authCookieName = "upgrad-auth-token.dev"
            self.cookieDomain = ".upgrad.dev"
            break
        default:
            self.authCookieName = "upgrad-auth-token.production"
            self.cookieDomain = ".upgrad.com"
            break
        }
        super.init()
    }
    
    override func viewIsReady() {
        super.viewIsReady()
        self.loadWebView()
        self.dropLeadViewModel = DropLeadRequestModel()
    }
    
    func loadWebView() {
        var device_type = "mobile"
        if IS_IPAD {
            device_type = "tablet"
        }
        var homepageUrl = self.redirectionUrl
        //TODO revert commented only for testing on stage
        if let subDomain = UGDefaults.getValue(forKey: .homePageWebSubDomain, objectType: String.self), subDomain != "" {
            homepageUrl = homepageUrl.replacingOccurrences(of: "www", with: subDomain)
        }
//        homepageUrl = homepageUrl.replacingOccurrences(of: "www.upgrad.com", with: "staging-infinity-regular-app.upgrad.dev")
//        homepageUrl = homepageUrl.replacingOccurrences(of: "ww4.upgrad.com", with: "staging-infinity-regular-app.upgrad.dev")
        if homepageUrl.contains("?") {
            homepageUrl = homepageUrl + "&device_type=\(device_type)&platform_os=ios&agent_version=\(getCurrentAppVersion())&platform_version=\(UIDevice.current.systemVersion)&platform_agent=\(UIDevice.current.name)"
        } else {
            homepageUrl = homepageUrl + "?device_type=\(device_type)&platform_os=ios&agent_version=\(getCurrentAppVersion())&platform_version=\(UIDevice.current.systemVersion)&platform_agent=\(UIDevice.current.name)"
        }
        debugPrint("url \(homepageUrl)")
        let url = homepageUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
        debugPrint("url 1\(url)")
        if let url = URL(string: url) {
            debugPrint("url web 1\(url)")
            debugPrint("cookie \(self.getAuthCookie())")
            if AppUser.isLoginUser() {
                self.view?.load(url: url, cookie: [self.getAuthCookie()])
            } else {
                self.view?.load(url: url, cookie: [HTTPCookie]())
            }
        }
    }
    
    func getAuthCookie() -> HTTPCookie {
        guard let authCookie = HTTPCookie(properties: [
            .domain: self.cookieDomain,
            .path: "/",
            .name: self.authCookieName,
            .value: AppUser.currentUser().authToken
        ]) else { return HTTPCookie() }
        return authCookie
    }
    
    private func getCurrentAppVersion() -> String {
        guard let infoPlistService = DependencyManager.sharedInstance.resolve(InfoPlistService.self) else {
            return ""
        }
        return infoPlistService.getAppVersion()
    }
    
    override func setView(_ view: BaseModuleViewInput?) {
        self.view = view as? HomePageWebviewViewInput
        super.setView(view)
    }
    
    override func setInteractor(_ interactor: BaseModuleInteractorInput?) {
        self.interactor = interactor as? HomePageWebviewInteractorInput
        super.setInteractor(interactor)
    }
    
    override func setRouter(_ router: BaseModuleRouterInput?) {
        self.router = router as? HomePageWebviewRouterInput
        super.setRouter(router)
    }
    
    func getPageType() -> WebViewPage {
        return self.webViewType
    }
    
    func getRedirectionUrl() -> String {
        return self.redirectionUrl
    }
    
    func getPageName() -> String {
        return self.pageName ?? ""
    }
    
    func openSafariView(url:String) {
        self.router?.pushSafariView(url: url)
    }
    
    func openInAppWebView(url:String) {
        guard AppUser.isLoginUser() else {
            self.openSafariView(url: url)
            return
        }
        self.view?.showLoader(message: "Loading...")
        let observable = self.interactor?.getOneTimeTokenForWebApplicationForm()
        observable?.subscribe(onNext: {[weak self] token in
            guard let self = self else { return }
            guard let tokenString = token["oneTimeToken"] else {
                SnackBar.showSnackBarWithMessage(Strings.somethingWentWrong)
                return
            }
            
            var baseURLString: String? = UpGradCentralAPI.appSettingsService.networkConfig.globalConfigURL
            baseURLString = baseURLString?.replacingOccurrences(of: "/api", with: "")
            let mWebAppURL = url
            if let url = baseURLString, !tokenString.isEmpty {
                let urlString = (url + "/auto-login/").addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
                if var url = URL(string: urlString) {
                    url.appendQueryParam(for: "oneTimeToken", value: "\(tokenString)")
                    url.appendQueryParam(for: "redirectUrl", value: "\(mWebAppURL)")
                    url.appendQueryParam(for: "devicetype", value: "iOS")
                    url.appendQueryParam(for: "app_version", value: "\(HelpAndSupportInteracter().getCurrentAppVersion())")
                    url.appendQueryParam(for: "platform", value: "iOS")
                    url.appendQueryParam(for: "appsflyer_id", value: "\(AppsFlyerLib.shared().getAppsFlyerUID())")
                    var appID = ""
                    if let propertiesPath = Bundle.main.object(forInfoDictionaryKey: Strings.appsFlyerKey) as? [String : String] {
                        if let _ = propertiesPath[Strings.appsFlyerDevKey],
                           let appleAppID = propertiesPath[Strings.appsFlyerAppID] {
                            appID = appleAppID
                        }
                    }
                    url.appendQueryParam(for: "appID", value: "\(appID)")
                    debugPrint("web url \(url)")
                    self.router?.presentSafariViewController(withUrl: url)
                }
            } else {
                self.router?.pushSafariView(url: url)
            }
            
            
            }, onError: { error in
                SnackBar.showSnackBarWithMessage(error.localizedDescription.components(separatedBy: ":").last ?? Strings.somethingWentWrong)
                self.view?.hideLoader()
        }, onCompleted: nil, onDisposed: nil)
            .disposed(by: self.bag)
    }
    
    func openWebPage(viewType: WebViewPage, name pageName:String?, redirectionUrl:String, vc:UIViewController?) {
        self.router?.openHomeWebPages(viewType: viewType, name: pageName, redirectionUrl: redirectionUrl, vc:vc)
    }
    
    func openProgramPage(slug:String) {
        self.router?.openProgramPage(slug: slug)
    }
    
    func reload(viewType: WebViewPage, name pageName:String?, redirectionUrl:String) {
        self.redirectionUrl = redirectionUrl
        self.webViewType = viewType
        self.pageName = pageName
        self.loadWebView()
    }
    
    func dismissPresentedViewController() {
        self.router?.dismissPresentedViewController()
    }
    
    func openSignInPage(title: String, eventModel: AuthEventModel) {
        self.router?.loadSignInPage(title: title, eventModel: eventModel)
    }
    
    func dropLead(programPackageKey: String?, pageCategory: String?, title: String) {
        self.dropLeadViewModel = LeadDropHelper.dropLead(leadSection: getPlateFormSection(title: title), course: programPackageKey, pageCategory: "pageCategory")
        self.interactor?.updateLead(leadViewModel: self.dropLeadViewModel!)
            .doLogging()
            .subscribe(onNext: {[weak self] response in
                if let dropLeadResponse = try? JSONDecoder().decode(DropLeadResponseModel.self, from: response.data) {
                    self?.view?.onDropLeadCompletion?(dropLeadResponse.eventSequence?.firstByUser,
                                                      dropLeadResponse.eventSequence?.firstByProgramAndUser, dropLeadResponse.leadIdentifier)
                }
            }, onError: { error in
                debugPrint(error)
            }).disposed(by: bag)
    }
    
    func getPlateFormSection(title: String) -> String {
        switch title {
        case ProgramPagePresenter.talkToUs:
            return Strings.inbound
        case ProgramPagePresenter.applyNow:
            return Strings.applyNow
        case ProgramPagePresenter.downloadBrochure:
            return Strings.downloadBrochure
        case ProgramPagePresenter.downloadCareerHandbook:
            return Strings.downloadPlacementReport
        case ProgramPagePresenter.downloadSyllabus:
            return Strings.downloadSyllabus
        default:
            return ""
        }
    }
    
    func getOneTimeToken(redirectUrl:String, pageTitle:String?, pageCategory:String?, action:String?, pageSlug:String?) {
        self.view?.showLoader(message: "Loading...")
        let observable = self.interactor?.getOneTimeTokenForWebApplicationForm()
        observable?.subscribe(onNext: {[weak self] token in
            guard let self = self else { return }
            guard let tokenString = token["oneTimeToken"] else {
                SnackBar.showSnackBarWithMessage(Strings.somethingWentWrong)
                return
            }
            self.invokeApplyNowAction(with: tokenString, redirectUrl: redirectUrl , pageTitle: pageTitle, pageCategory: pageCategory, action: action, pageSlug: pageSlug)
            }, onError: { error in
                SnackBar.showSnackBarWithMessage(error.localizedDescription.components(separatedBy: ":").last ?? Strings.somethingWentWrong)
                self.view?.hideLoader()
        }, onCompleted: nil, onDisposed: nil)
            .disposed(by: self.bag)
    }
    
    func invokeApplyNowAction(with token: String, redirectUrl:String, pageTitle:String?, pageCategory:String?, action:String?, pageSlug:String?) {
        var baseURLString: String? = UpGradCentralAPI.appSettingsService.networkConfig.globalConfigURL
        baseURLString = baseURLString?.replacingOccurrences(of: "/api", with: "")
        let mWebAppURL = redirectUrl
        if let url = baseURLString, !token.isEmpty {
            let urlString = (url + "/auto-login/").addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
            if var url = URL(string: urlString) {
                url.appendQueryParam(for: "oneTimeToken", value: "\(token)")
                url.appendQueryParam(for: "redirectUrl", value: "\(mWebAppURL)")
                url.appendQueryParam(for: "devicetype", value: "iOS")
                url.appendQueryParam(for: "app_version", value: "\(HelpAndSupportInteracter().getCurrentAppVersion())")
                url.appendQueryParam(for: "page_title", value: pageTitle ?? "")
                url.appendQueryParam(for: "page_category", value: pageCategory ?? "")
                url.appendQueryParam(for: "action", value: action ?? "")
                url.appendQueryParam(for: "page_slug", value: pageSlug ?? "")
                url.appendQueryParam(for: "platform", value: "iOS")
                url.appendQueryParam(for: "manufacturer", value: "Apple")
                url.appendQueryParam(for: "brand", value: "\(UIDevice.modelName)")
                url.appendQueryParam(for: "model", value: "\(UIDevice.modelName)")
                url.appendQueryParam(for: "width", value: "\(UIScreen.main.bounds.width)")
                url.appendQueryParam(for: "height", value: "\(UIScreen.main.bounds.height)")
                url.appendQueryParam(for: "platform_version", value: "\(UIDevice.current.systemVersion)")
                url.appendQueryParam(for: "appsflyer_id", value: "\(AppsFlyerLib.shared().getAppsFlyerUID())")

                var appID = ""
                if let propertiesPath = Bundle.main.object(forInfoDictionaryKey: Strings.appsFlyerKey) as? [String : String] {
                    if let _ = propertiesPath[Strings.appsFlyerDevKey],
                       let appleAppID = propertiesPath[Strings.appsFlyerAppID] {
                        appID = appleAppID
                    }
                }
                url.appendQueryParam(for: "appID", value: "\(appID)")
                debugPrint("apply now url \(url)")
                self.router?.presentSafariViewController(withUrl: url)
            }
        } else if let baseURL = baseURLString {
            let fallBackURLString = baseURL + "/applications"
            if let url = URL(string: fallBackURLString) {
                debugPrint("apply now url \(url)")
                self.router?.presentSafariViewController(withUrl: url)
            }
        }
    }
    
    func openLearnForFreeCourseEnrollment(variantKey: String) {
        self.router?.navigateToLearnForFreeCourseEnrollment(for: variantKey)
    }
    
    func openLearnTabView() {
        self.router?.openLearnTab()
    }
}
Editor is loading...
Leave a Comment