src/converter/link-factory/fs-product-link.ts
This class represents a link and allows the creation of product links.
Methods |
|
constructor(link: FsProductLinkTemplate, productService: ProductService)
|
|||||||||
Parameters :
|
Public create |
create()
|
Returns :
LinkData
|
Private createProductLink | |||||||||
createProductLink(productCode: string, ltTooltipText: CmsInputTextFormData)
|
|||||||||
Parameters :
Returns :
LinkData
|
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 { Product, ProductService } from '@spartacus/core';
import { nullSafe } from 'fs-spartacus-common';
import { Observable } from 'rxjs';
import { CmsInputTextFormData, FsIndexFormData, LinkData } from '../teaser/fs-teaser.model';
import { FsLinkFactoryInterface, FsProductLinkTemplate } from './fs-link.model';
/**
* This class represents a link and allows the creation of product links.
*
* @export
* @class FsProductLink
*/
export class FsProductLink implements FsLinkFactoryInterface<LinkData> {
constructor(private link: FsProductLinkTemplate, private productService: ProductService) {}
public create(): LinkData {
if (this.link?.formData != null) {
const { lt_product, lt_tooltip_text } = this.link.formData;
const productCode = this.extractProductCode(lt_product);
if (productCode) {
return this.createProductLink(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 createProductLink(productCode: string, ltTooltipText: CmsInputTextFormData): LinkData {
return {
href: undefined,
product: this.getProduct(productCode),
tooltip: nullSafe(ltTooltipText?.value, ''),
};
}
private getProduct(productCode: string | undefined): Observable<Product> {
if (productCode != null && productCode.length > 0) {
return this.productService.get(productCode);
}
}
}