File

src/lib/fs/cms/page/preview/preview-page.service.ts

Description

This service handles the URL creation and the navigation for the preview within the ContentCreator.

Index

Properties
Methods

Constructor

constructor(ngZone: NgZone, semanticPathService: SemanticPathService, router: Router)
Parameters :
Name Type Optional
ngZone NgZone No
semanticPathService SemanticPathService No
router Router No

Methods

Private addLeadingSlash
addLeadingSlash(url: string)
Parameters :
Name Type Optional
url string No
Returns : string
Private assembleUrl
assembleUrl(hybrisPageId: string)
Parameters :
Name Type Optional
hybrisPageId string No
Returns : string | null
Async navigateTo
navigateTo(hybrisPageId: string)

This method navigates the preview to a SAP Commerce page by a given ID.

Parameters :
Name Type Optional Description
hybrisPageId string No

The ID of the SAP Commerce page to navigate the preview to.

Returns : Promise<boolean>

Promise to resolve with whether the navigation was successful.

Properties

Static Readonly HOMEPAGE_ID
Type : string
Default value : '__HOMEPAGE__'
import { Injectable, NgZone } from '@angular/core';
import { SemanticPathService, PageType } from '@spartacus/core';
import { Router } from '@angular/router';

/**
 * This service handles the URL creation and the navigation for the preview within the ContentCreator.
 *
 * @export
 * @class PreviewPageService
 */
@Injectable({
  providedIn: 'root',
})
export class PreviewPageService {
  static readonly HOMEPAGE_ID = '__HOMEPAGE__';
  constructor(private ngZone: NgZone, private semanticPathService: SemanticPathService, private router: Router) {}

  private assembleUrl(hybrisPageId: string): string | null {
    if (hybrisPageId == null || typeof hybrisPageId !== 'string' || hybrisPageId.length === 0) {
      console.error(
        `Can't assemble an url for navigation from an empty hybris page id! Please make sure the hybrisPageId is not empty and of type string.`
      );
      return null;
    }
    let url: string = null;
    const [sapPageType, sapPageId] = hybrisPageId.split(':');
    if (hybrisPageId.indexOf(':') < 0) {
      // Probably a FirstSpirit driven page since the hybrisPageId doesn't contain a colon
      // In this case we'll assume this is the page's uid and try to navigate directly to it
      url = this.router.serializeUrl(this.router.parseUrl(this.addLeadingSlash(hybrisPageId)));
    } else if (sapPageId && sapPageId === PreviewPageService.HOMEPAGE_ID) {
      url = this.router.serializeUrl(this.router.createUrlTree(this.semanticPathService.transform({ cxRoute: 'homepage' })));
    } else if (sapPageId != null && sapPageType != null && sapPageId.length > 0 && sapPageType.length > 0) {
      switch (sapPageType) {
        case PageType.PRODUCT_PAGE:
          url = this.router.serializeUrl(
            this.router.createUrlTree(this.semanticPathService.transform({ cxRoute: 'product', params: { code: sapPageId, name: '' } }))
          );
          break;
        case PageType.CATEGORY_PAGE:
          url = this.router.serializeUrl(
            this.router.createUrlTree(this.semanticPathService.transform({ cxRoute: 'category', params: { code: sapPageId } }))
          );
          break;
        case PageType.CONTENT_PAGE:
        case PageType.CATALOG_PAGE:
        default:
          url = this.router.serializeUrl(this.router.parseUrl(this.addLeadingSlash(sapPageId)));
      }
    } else {
      console.error(`Couldn't assemble an url for the given hybrisPageId '${hybrisPageId}'!`);
    }
    return url;
  }

  private addLeadingSlash(url: string): string {
    return url?.startsWith('/') ? `${url}` : `/${url}`;
  }

  /**
   * This method navigates the preview to a SAP Commerce page by a given ID.
   *
   * @param {string} hybrisPageId The ID of the SAP Commerce page to navigate the preview to.
   * @return {Promise<boolean>} Promise to resolve with whether the navigation was successful.
   * @memberof PreviewPageService
   */
  async navigateTo(hybrisPageId: string): Promise<boolean> {
    const url = this.assembleUrl(hybrisPageId);
    if (url != null) {
      console.log(`Navigate to '${url}' for hybrisPageId '${hybrisPageId}'`);
      return await this.ngZone.run(async () => {
        const success: boolean | void = await this.router
          .navigateByUrl(url)
          .catch((error) => console.error(`Error navigating to url '${url}': ${error}`));
        return typeof success === 'boolean' ? success : false;
      });
    }
    return false;
  }
}

results matching ""

    No results matching ""