Skip to content

Commit

Permalink
combines multiple contributions from customer
Browse files Browse the repository at this point in the history
  • Loading branch information
MikeDReynolds68 committed Mar 20, 2019
1 parent 74ac941 commit 57b09b2
Show file tree
Hide file tree
Showing 11 changed files with 111 additions and 42 deletions.
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -27,7 +27,7 @@
"core-js": "^2.5.4",
"jsonpointer": "^4.0.1",
"path-to-regexp": "^2.4.0",
"rxjs": "^6.3.3",
"rxjs": "6.3.3",
"zone.js": "~0.8.26"
},
"devDependencies": {
Expand Down
@@ -1,6 +1,5 @@
import { NgModule } from '@angular/core';
import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HttpClientModule } from '@angular/common/http';
import { RouterModule } from '@angular/router';

import { ApiUrlsService } from './services/api-urls.service';
Expand Down Expand Up @@ -33,10 +32,18 @@ import { InitializeSdkService } from './services/initialize-sdk.service';
entryComponents: [ UndefinedComponent ],
imports: [
CommonModule,
HttpClientModule,
RouterModule,
],
providers: [ApiUrlsService, ComponentMappingsService, ImageUrlService, InitializeSdkService, PageModelService, RequestContextService],
exports: [CmsEditButtonComponent, RenderCmsComponent]
exports: [CmsEditButtonComponent, RenderCmsComponent ]
})
export class BloomreachExperienceNgSdkModule { }
export class BloomreachExperienceNgSdkModule {

static forRoot(): ModuleWithProviders {
return {
ngModule: BloomreachExperienceNgSdkModule,
providers: [
ApiUrlsService, ComponentMappingsService, ImageUrlService, InitializeSdkService, PageModelService, RequestContextService
]
};
}
}
@@ -1,7 +1,5 @@
import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';

import { PageModelService } from '../../../services/page-model.service';

import { getComponentConfiguration } from '../../../common-sdk/utils/render-cms-component';

@Component({
Expand All @@ -10,14 +8,20 @@ import { getComponentConfiguration } from '../../../common-sdk/utils/render-cms-
styleUrls: ['./render-cms-component.component.css']
})
export class RenderCmsComponent implements OnInit {
@Input() path: string;
@Input() path?: string;
@Input() renderComponent?: any;
configuration: any;
@Input() configuration?: any;

constructor(private changeDetectorRef: ChangeDetectorRef,
private pageModelService: PageModelService) { }
private pageModelService: PageModelService) { }

ngOnInit() {
if (this.configuration) {
// component configuration is already provided as input.
this.detectChanges();
return;
}

this.getPageModel();
}

Expand All @@ -26,11 +30,15 @@ export class RenderCmsComponent implements OnInit {
.subscribe(pageModel => {
if (pageModel) {
this.configuration = getComponentConfiguration(this.path, pageModel);
// force Angular to rerender
if (!this.changeDetectorRef['destroyed']) {
this.changeDetectorRef.detectChanges();
}
this.detectChanges();
}
});
}

detectChanges() {
// force Angular to rerender
if (!this.changeDetectorRef['destroyed']) {
this.changeDetectorRef.detectChanges();
}
}
}
Expand Up @@ -30,6 +30,10 @@ function getPathFromParsedUrl(parsedUrlPath: string, regexpKeys: pathToRegexp.Ke
}

function detectPreview(request: Request, apiUrls: ApiUrls, parsedUrlPath: string, regexpKeys: pathToRegexp.Key[]): boolean {
if (!request.hostname) {
return false;
}

const hostname: string = getHostname(request.hostname);

// detect CMS/preview mode using query parameter
Expand Down
Expand Up @@ -3,7 +3,7 @@ import { Injectable } from '@angular/core';
import { ApiUrls, CompiledPathRegexp } from '../common-sdk/types';
import { _compilePathRegexp, _setApiUrls, initializeDefaultApiUrls } from '../common-sdk/utils/api-urls';

@Injectable()
@Injectable({ providedIn: 'root' })
export class ApiUrlsService {
private apiUrls: ApiUrls;
private compiledPathRegexp: CompiledPathRegexp;
Expand Down
Expand Up @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';

import { ComponentMappings } from '../common-sdk/types';

@Injectable()
@Injectable({ providedIn: 'root' })
export class ComponentMappingsService {
private componentMappings: ComponentMappings;

Expand Down
Expand Up @@ -6,7 +6,7 @@ import { RequestContextService } from './request-context.service';

import { _getImageUrl, _getImageUrlByPath } from '../common-sdk/utils/image-url';

@Injectable()
@Injectable({ providedIn: 'root' })
export class ImageUrlService {
constructor(private apiUrlsService: ApiUrlsService, private requestContextService: RequestContextService,
private pageModelService: PageModelService) {}
Expand Down
@@ -1,35 +1,54 @@
import { Injectable } from '@angular/core';
import { Injectable, Inject } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';

import { RequestContextService } from './request-context.service';
import { ApiUrlsService } from './api-urls.service';
import { PageModelService } from './page-model.service';

import { _initializeCmsIntegration } from '../common-sdk/utils/initialize-cms-integration';
import { logCmsCreateOverlay } from '../common-sdk/utils/page-model';
import { Subscription, Observable } from 'rxjs';

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

constructor(
private pageModelService: PageModelService,
private requestContextService: RequestContextService,
private router: Router
) {}
) {
}

initialize(): void {
initialize(sdkInitOptions?: InitializeSdkOptions): Subscription {

const defaultSdkInitOptions: InitializeSdkOptions = {
fetchPageModel: true,
subscribeToRouterEvents: true
};

const options = Object.assign(defaultSdkInitOptions, sdkInitOptions || {});
this.initializeCmsIntegration();
this.fetchPageModel();

// // fetch Page Model API when navigated to a PageComponent
this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
this.requestContextService.parseUrlPath(event.url);
this.fetchPageModel();
}
});

if (options.fetchPageModel) {
this.fetchPageModel();
}

if (options.subscribeToRouterEvents) {
// fetch Page Model API when navigated to a PageComponent
return this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
this.requestContextService.parseUrlPath(event.url);
this.fetchPageModel();
}
});
}

return;
}

private fetchPageModel(): void {
this.pageModelService.fetchPageModel().subscribe();
private fetchPageModel(): Observable<any> {
const fetchPageModelObservable = this.pageModelService.fetchPageModel();
fetchPageModelObservable.subscribe();
return fetchPageModelObservable;
}

// using arrow function so that scope (this) is preserved on callback
Expand All @@ -51,3 +70,8 @@ export class InitializeSdkService {
}
}
}

export interface InitializeSdkOptions {
fetchPageModel: boolean;
subscribeToRouterEvents: boolean;
}
@@ -1,4 +1,4 @@
import { Injectable } from '@angular/core';
import { Injectable, Injector } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';

import { BehaviorSubject, Observable, of, Subject} from 'rxjs';
Expand All @@ -17,11 +17,12 @@ import {
toUrlEncodedFormData
} from '../common-sdk/utils/page-model';

@Injectable()
@Injectable({ providedIn: 'root' })
export class PageModelService {
channelManagerApi: any;
pageModel: any;
pageModelSubject: Subject<any> = new BehaviorSubject<any>(this.pageModel);
http: HttpClient;

private httpGetOptions = {
withCredentials: true
Expand All @@ -33,10 +34,28 @@ export class PageModelService {
};

constructor(
private http: HttpClient,
private injector: Injector,
private apiUrlsService: ApiUrlsService,
private requestContextService: RequestContextService
) {}
) {
this.resolveHttpClient();
}

private resolveHttpClient(): void {
try {
this.http = this.injector.get('bre-http-client');
} catch {}

if (!this.http) {
try {
this.http = this.injector.get(HttpClient);
} catch {
throw new Error(`Couldn't resolve HttpClient.
Please make sure to import HttpClientModule in your app root module and
provide HttpClient class for the 'bre-http-client' token`);
}
}
}

fetchPageModel(): any {
const apiUrl: string = this.buildApiUrl();
Expand Down
Expand Up @@ -4,8 +4,7 @@ import { ApiUrlsService } from './api-urls.service';

import { ApiUrls, CompiledPathRegexp, Request, RequestContext } from '../common-sdk/types';
import { _parseRequest } from '../common-sdk/utils/request-context';

@Injectable()
@Injectable({ providedIn: 'root' })
export class RequestContextService {
private requestContext: RequestContext;
private debugging = false;
Expand All @@ -30,7 +29,10 @@ export class RequestContextService {
}

parseUrlPath(urlPath: string): void {
const request: Request = { hostname: window.location.hostname, path: urlPath };
const request: Request = {
hostname: (typeof window === 'undefined') ? undefined : window.location.hostname,
path: urlPath };

this.parseRequest(request);
}

Expand Down
5 changes: 5 additions & 0 deletions projects/bloomreach-experience-ng-sdk/src/public_api.ts
Expand Up @@ -11,4 +11,9 @@ export * from './lib/services/page-model.service';
export * from './lib/services/request-context.service';
export * from './lib/cms-components/core/base-component/base-component.interface';
export * from './lib/cms-components/core/single-content-component/single-content-component.component';
export * from './lib/cms-components/core/base-component/base-component.component';
export * from './lib/cms-components/core/render-cms-component/render-cms-component.component';
export * from './lib/cms-components/core/cms-edit-button/cms-edit-button.component';
export { default as getNestedObject } from './lib/common-sdk/utils/get-nested-object';
export * from './lib/common-sdk/types';
export * from './lib/common-sdk/utils/render-cms-component';

0 comments on commit 57b09b2

Please sign in to comment.