File

src/services/onboarding-configuration.service.ts

Index

Properties
Methods

Constructor

constructor(sharedPreferences: SharedPreferences, profileService: ProfileService, deviceRegisterService: DeviceRegisterService, events: Events, segmentationTagService: SegmentationTagService, container: ContainerService, appGlobalService: AppGlobalService, commonUtilService: CommonUtilService)
Parameters :
Name Type Optional
sharedPreferences SharedPreferences No
profileService ProfileService No
deviceRegisterService DeviceRegisterService No
events Events No
segmentationTagService SegmentationTagService No
container ContainerService No
appGlobalService AppGlobalService No
commonUtilService CommonUtilService No

Methods

Private checkInitialScreen
checkInitialScreen()
Returns : void
findAllTabs
findAllTabs(theme: string, status: string)
Parameters :
Name Type Optional
theme string No
status string No
Returns : any
getAppConfig
getAppConfig()
Returns : any
getCategoryTranslationKey
getCategoryTranslationKey(category: string)
Parameters :
Name Type Optional
category string No
Returns : string
getOnboardingConfig
getOnboardingConfig(page: String)
Parameters :
Name Type Optional
page String No
Returns : OnBoardingConfig
Private Async guestOnboardingStep
guestOnboardingStep(config)
Parameters :
Name Optional
config No
Returns : unknown
initializedTabs
initializedTabs(theme: string, userType: string)
Parameters :
Name Type Optional
theme string No
userType string No
Returns : any
Private isProfileComplete
isProfileComplete(profile?)
Parameters :
Name Optional
profile Yes
Returns : boolean
Private Async loggedInUserOnboardingStep
loggedInUserOnboardingStep(config)
Parameters :
Name Optional
config No
Returns : unknown
Private Async setDefaultFrameworkDetails
setDefaultFrameworkDetails(defaultVal)
Parameters :
Name Optional
defaultVal No
Returns : any
Private setDistrictMappingDetails
setDistrictMappingDetails(config)
Parameters :
Name Optional
config No
Returns : void
Public Async skipOnboardingStep
skipOnboardingStep(currentPage, isUserLoggedIn)
Parameters :
Name Optional Default value
currentPage No
isUserLoggedIn No false
Returns : unknown

Properties

initialOnboardingScreenName
onBoardingConfig
Type : literal type
tabList
Type : literal type
import { Inject, Injectable } from "@angular/core";
import { OnboardingScreenType, PreferenceKey, SwitchableTabsConfig, ProfileConstants } from "@app/app/app.constant";
import { GUEST_TEACHER_TABS, initTabs } from "@app/app/module.service";
import { Events } from '@app/util/events';
import { DeviceRegisterService, Profile, ProfileService, ProfileSource, ProfileType, SharedPreferences } from 'sunbird-sdk';
import { AppGlobalService, CommonUtilService, ContainerService } from ".";
import onboarding from './../assets/configurations/config.json';
import { SegmentationTagService } from "./segmentation-tag/segmentation-tag.service";


interface OnBoardingConfig {
    name: string;
    skip: boolean;
    default: any;
    data: Array<any>
    params: { [key: string]: string }
}

interface Category {
    code: string;
    value: string;
    translation_key: string;
}

interface ICON {
    active: string;
    inactive: string;
    disabled?: string;
  }
interface TabConfig {
    name: string;
    root: string;
    icon?: ICON;
    label: string;
    index: number;
    isSelected?: boolean;
    status: string;
    disabled: boolean;
    theme: string;
    userTypeAdmin?: string;
  }
  interface Theme {
    name: string;
  }

@Injectable({
    providedIn: 'root'
})
export class OnboardingConfigurationService {

    onBoardingConfig: { 
        overriddenDefaultChannelId: string,
        theme: Theme
        onboarding: Array<OnBoardingConfig> ,
        categories: Array<Category>
    };
    initialOnboardingScreenName;
    tabList: { tab: Array<TabConfig> };

    constructor(
        @Inject('SHARED_PREFERENCES') private sharedPreferences: SharedPreferences,
        @Inject('PROFILE_SERVICE') private profileService: ProfileService,
        @Inject('DEVICE_REGISTER_SERVICE') private deviceRegisterService: DeviceRegisterService,
        private events: Events,
        private segmentationTagService: SegmentationTagService,
        private container: ContainerService,
        private appGlobalService: AppGlobalService,
        private commonUtilService: CommonUtilService,
    ) {
        this.onBoardingConfig = onboarding;
        this.checkInitialScreen();
    }

    // checking initial onboarding screen to handle back button
    private checkInitialScreen() {
        if (this.initialOnboardingScreenName === undefined) {
            const initialScreen = this.onBoardingConfig && this.onBoardingConfig.onboarding &&
                this.onBoardingConfig.onboarding.find(obj => (obj && !obj.skip));
            if (initialScreen) {
                this.initialOnboardingScreenName = initialScreen.name;
            }
        }
    }

    public async skipOnboardingStep(currentPage, isUserLoggedIn = false) {
        if(!this.onBoardingConfig || !this.onBoardingConfig.onboarding){
            return false;
        }
        this.checkInitialScreen();

        const config = this.onBoardingConfig.onboarding.find(obj => {
            return (obj && obj.name === currentPage);
        });

        if (!config || !config.skip || !config.default) {
            return false;
        }
        if (isUserLoggedIn) {
            return await this.loggedInUserOnboardingStep(config);
        } else {
            return await this.guestOnboardingStep(config);
        }
    }

    private async guestOnboardingStep(config) {
        let skipOnboarding = true;

        switch (config.name) {

            case OnboardingScreenType.LANGUAGE_SETTINGS:
                const selectedLanguage = await this.sharedPreferences.getString(PreferenceKey.SELECTED_LANGUAGE_CODE).toPromise();
                if (!selectedLanguage) {
                    this.sharedPreferences.putString(PreferenceKey.SELECTED_LANGUAGE_CODE, config.default.code).toPromise();
                    this.sharedPreferences.putString(PreferenceKey.SELECTED_LANGUAGE, config.default.label).toPromise();
                }
                break;

            case OnboardingScreenType.USER_TYPE_SELECTION:
                const selectedUser = await this.sharedPreferences.getString(PreferenceKey.SELECTED_USER_TYPE).toPromise();
                if (!selectedUser) {
                    const profile = this.appGlobalService.getCurrentUser();
                    const profileRequest: Profile = {
                        uid: profile.uid,
                        handle: 'Guest1',
                        profileType: config.default,
                        source: ProfileSource.LOCAL
                    };
                    await this.profileService.updateProfile(profileRequest).toPromise();
                    await this.profileService.setActiveSessionForProfile(profileRequest.uid).toPromise();
                    this.sharedPreferences.putString(PreferenceKey.GUEST_USER_ID_BEFORE_LOGIN, profile.uid).toPromise().then();
                    this.sharedPreferences.putString(PreferenceKey.SELECTED_USER_TYPE, config.default).toPromise();
                }
                break;

            case OnboardingScreenType.PROFILE_SETTINGS:
                const profile = await this.profileService.getActiveSessionProfile({ requiredFields: ProfileConstants.REQUIRED_FIELDS }).toPromise();
                if (!this.isProfileComplete(profile)) {
                    await this.setDefaultFrameworkDetails(config.default);
                }
                break;

            case OnboardingScreenType.DISTRICT_MAPPING:
                this.setDistrictMappingDetails(config);
                break;

            default:
                skipOnboarding = false;
                break;
        }

        return skipOnboarding;
    }

    private async loggedInUserOnboardingStep(config) {
        let skipOnboarding = true;

        switch (config.name) {
            case OnboardingScreenType.USER_TYPE_SELECTION:
                //todo
                break;

            case OnboardingScreenType.PROFILE_SETTINGS:
                //todo
                break;

            case OnboardingScreenType.DISTRICT_MAPPING:
                //todo
                break;

            default:
                skipOnboarding = false;
                break;
        }

        return skipOnboarding;
    }

    private async setDefaultFrameworkDetails(defaultVal) {
        const activeSessionProfile = await this.profileService.getActiveSessionProfile({
            requiredFields: ProfileConstants.REQUIRED_FIELDS
        }).toPromise();

        let profileType;
        if (activeSessionProfile.profileType) {
            profileType = activeSessionProfile.profileType
        } else if (!(profileType = await this.sharedPreferences.getString(PreferenceKey.SELECTED_USER_TYPE).toPromise())) {
            profileType = ProfileType.NONE;
        }

        const updateProfileRequest: Profile = {
            ...activeSessionProfile,
            ...defaultVal,
            profileType
        };

        let profile: Profile;
        profile = await this.profileService.updateProfile(updateProfileRequest).toPromise();

        this.segmentationTagService.refreshSegmentTags(profile);
        initTabs(this.container, GUEST_TEACHER_TABS);
        this.segmentationTagService.createSegmentTags(profile);
        await this.commonUtilService.handleToTopicBasedNotification();
        this.events.publish('onboarding-card:completed', { isOnBoardingCardCompleted: true });
        this.events.publish('refresh:profile');
        this.appGlobalService.guestUserProfile = profile;

    }

    private isProfileComplete(profile?): boolean {
        return profile
            && profile.syllabus && profile.syllabus[0]
            && profile.board && profile.board.length
            && profile.grade && profile.grade.length
            && profile.medium && profile.medium.length;
    }

    private setDistrictMappingDetails(config) {
        const req = {
            userDeclaredLocation: {
                ...config.default, 
                declaredOffline: !this.commonUtilService.networkInfo.isNetworkAvailable
            }
        };
        this.deviceRegisterService.registerDevice(req).toPromise();
        this.sharedPreferences.putString(PreferenceKey.DEVICE_LOCATION, JSON.stringify(req.userDeclaredLocation)).toPromise();
        this.commonUtilService.handleToTopicBasedNotification();
        this.appGlobalService.setOnBoardingCompleted();
    }

    initializedTabs(theme: string, userType: string) {
        if (userType === ProfileType.ADMIN) {
            return this.tabList = onboarding.tabs.filter((tab) => tab && tab.userTypeAdmin);
          } else if (theme === SwitchableTabsConfig.HOME_DISCOVER_TABS_CONFIG) {
            if (this.appGlobalService.isUserLoggedIn()) {
              return this.findAllTabs('NEW', 'logIn');
            } else {
              return this.findAllTabs('NEW', 'guest');
            }
          } else {
            if (this.appGlobalService.isUserLoggedIn()) {
              return this.findAllTabs('OLD', 'logIn');
            } else {
              return this.findAllTabs('OLD', 'guest');
            }
          }
    }

    findAllTabs(theme: string, status: string) {
        return this.tabList = onboarding.tabs.filter((tab) =>
        (tab.theme === theme || tab.theme === 'ALL') && (tab.status === 'ALL' || tab.status === status));
      }

    getCategoryTranslationKey(category: string): string {
            return this.onBoardingConfig.categories.find((element) => (element.code === category)).translation_key
      }

    getOnboardingConfig(page: String): OnBoardingConfig {
        return this.onBoardingConfig.onboarding.find((element) => (element.name === page))
    }  

    getAppConfig(): any {
        return this.onBoardingConfig
    }

}

results matching ""

    No results matching ""