src/converter/teaser/fs-teaser-product-link-overlay.ts
This class is a factory to create product links from a ProductLinkTemplate.
FsTeaserOverlayFactoryInterface
Methods |
|
constructor(area: ProductLinkTemplate, positionAndDimension, productService: ProductService)
|
||||||||||||
Parameters :
|
Public create |
create()
|
Returns :
OverlayLink
|
Private createProductLinkOverlay | |||||||||
createProductLinkOverlay(productCode: string, ltTooltipText: CmsInputTextFormData)
|
|||||||||
Parameters :
Returns :
OverlayLink
|
Private extractProductCode | ||||||
extractProductCode(productInputComponent: FsIndexFormData)
|
||||||
Parameters :
Returns :
string | undefined
|
Private extractProductIdentifier | ||||||
extractProductIdentifier(productInputComponent: FsIndexFormData)
|
||||||
Parameters :
Returns :
string | undefined
|
Private getProduct | ||||||
getProduct(productCode: string | undefined)
|
||||||
Parameters :
Returns :
Observable<Product>
|
Private stripCatalogFromProductIdentifier | ||||||
stripCatalogFromProductIdentifier(productIdentifier: string)
|
||||||
Parameters :
Returns :
any
|
import {
CmsInputTextFormData,
FsIndexFormData,
FsTeaserOverlayFactoryInterface,
OverlayDimension,
OverlayLink,
OverlayPosition,
ProductLinkTemplate,
} from './fs-teaser.model';
import { nullSafe } from 'fs-spartacus-common';
import { ProductService, Product } from '@spartacus/core';
import { Observable } from 'rxjs';
/**
* This class is a factory to create product links from a {@link ProductLinkTemplate}.
*
* @export
* @class FsTeaserProductLinkOverlay
*/
export class FsTeaserProductLinkOverlay implements FsTeaserOverlayFactoryInterface<OverlayLink> {
constructor(
private area: ProductLinkTemplate,
private positionAndDimension: OverlayPosition & OverlayDimension,
private productService: ProductService
) {}
public create(): OverlayLink {
if (this.area?.link?.formData != null) {
const { lt_product, lt_tooltip_text } = this.area.link.formData;
const productCode = this.extractProductCode(lt_product);
if (productCode) {
return this.createProductLinkOverlay(productCode, lt_tooltip_text);
}
}
}
private extractProductCode(productInputComponent: FsIndexFormData): string | undefined {
const productIdentifier = this.extractProductIdentifier(productInputComponent);
if (productIdentifier) {
return this.stripCatalogFromProductIdentifier(productIdentifier);
}
}
private extractProductIdentifier(productInputComponent: FsIndexFormData): string | undefined {
return (
productInputComponent &&
Array.isArray(productInputComponent.value) &&
productInputComponent.value.length &&
productInputComponent.value[0].identifier
);
}
private stripCatalogFromProductIdentifier(productIdentifier: string) {
const identifierParts = productIdentifier.split('/').filter(Boolean);
if (identifierParts.length === 2) {
return identifierParts[1];
}
}
private createProductLinkOverlay(productCode: string, ltTooltipText: CmsInputTextFormData): OverlayLink {
return {
href: undefined,
product: this.getProduct(productCode),
tooltip: nullSafe(ltTooltipText?.value, ''),
...this.positionAndDimension,
};
}
private getProduct(productCode: string | undefined): Observable<Product> {
if (productCode != null && productCode.length > 0) {
return this.productService.get(productCode);
}
}
}