@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
120 lines • 14.7 kB
JavaScript
import { Inject, Injectable, isDevMode, } from '@angular/core';
import { resolveApplicable } from '@spartacus/core';
import { BehaviorSubject, combineLatest } from 'rxjs';
import { filter, map, take, tap } from 'rxjs/operators';
import { LaunchRenderStrategy } from './launch-render.strategy';
import * as i0 from "@angular/core";
import * as i1 from "../../config/layout-config";
export class LaunchDialogService {
constructor(renderStrategies, layoutConfig) {
this.renderStrategies = renderStrategies;
this.layoutConfig = layoutConfig;
this._dialogClose = new BehaviorSubject(undefined);
this._dataSubject = new BehaviorSubject(undefined);
this.renderStrategies = this.renderStrategies || [];
}
get data$() {
return this._dataSubject.asObservable();
}
/**
* Open the dialog
*
* @param caller LAUNCH_CALLER
* @param openElement button's Element ref
* @param vcr View Container Ref of the container for inline rendering
* @param data optional data which could be passed to dialog
*/
openDialog(caller, openElement, vcr, data) {
const component = this.launch(caller, vcr, data);
if (component) {
return combineLatest([component, this.dialogClose]).pipe(filter(([, close]) => close !== undefined), tap(([comp]) => {
openElement === null || openElement === void 0 ? void 0 : openElement.nativeElement.focus();
this.clear(caller);
comp.destroy();
}), map(([comp]) => comp));
}
}
/**
* Render the element based on the strategy from the launch configuration
*
* @param caller LAUNCH_CALLER
* @param vcr View Container Ref of the container for inline rendering
*/
launch(caller, vcr, data) {
const config = this.findConfiguration(caller);
if (config) {
const renderer = this.getStrategy(config);
// Render if the strategy exists
if (renderer) {
this._dialogClose.next(undefined);
this._dataSubject.next(data);
return renderer.render(config, caller, vcr);
}
}
else if (isDevMode()) {
console.warn('No configuration provided for caller ' + caller);
}
}
/**
* Opens dialog and subscribe in the service. Should be used if the trigger component might get destroyed while the component is open.
*
* @param caller Launch Caller
* @param openElement Element to open
* @param data Data to provide to the rendered element
*/
openDialogAndSubscribe(caller, openElement, data) {
var _a;
(_a = this.openDialog(caller, openElement, undefined, data)) === null || _a === void 0 ? void 0 : _a.pipe(take(1)).subscribe();
}
/**
* Util method to remove element from rendered elements list
*
* @param caller LAUNCH_CALLER
*/
clear(caller) {
const config = this.findConfiguration(caller);
if (config) {
const renderer = this.getStrategy(config);
// Render if the strategy exists
if (renderer) {
renderer.remove(caller, config);
}
}
}
get dialogClose() {
return this._dialogClose.asObservable();
}
closeDialog(reason) {
this._dialogClose.next(reason);
}
/**
* Returns the configuration for the caller
*
* @param caller LAUNCH_CALLER
*/
findConfiguration(caller) {
var _a;
if ((_a = this.layoutConfig) === null || _a === void 0 ? void 0 : _a.launch) {
return this.layoutConfig.launch[caller];
}
return undefined;
}
/**
* Returns the render strategy based on the configuration
*
* @param config Configuration for launch
*/
getStrategy(config) {
return resolveApplicable(this.renderStrategies, [config]);
}
}
LaunchDialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: LaunchDialogService, deps: [{ token: LaunchRenderStrategy }, { token: i1.LayoutConfig }], target: i0.ɵɵFactoryTarget.Injectable });
LaunchDialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: LaunchDialogService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: LaunchDialogService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [LaunchRenderStrategy]
}] }, { type: i1.LayoutConfig }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF1bmNoLWRpYWxvZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RvcmVmcm9udGxpYi9sYXlvdXQvbGF1bmNoLWRpYWxvZy9zZXJ2aWNlcy9sYXVuY2gtZGlhbG9nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLE1BQU0sRUFDTixVQUFVLEVBQ1YsU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBR2hFLE1BQU0sT0FBTyxtQkFBbUI7SUFROUIsWUFFWSxnQkFBd0MsRUFDeEMsWUFBMEI7UUFEMUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF3QjtRQUN4QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQVY5QixpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFTLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQU0sU0FBUyxDQUFDLENBQUM7UUFXekQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQVZELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBVUQ7Ozs7Ozs7T0FPRztJQUNILFVBQVUsQ0FDUixNQUE4QixFQUM5QixXQUF3QixFQUN4QixHQUFzQixFQUN0QixJQUFVO1FBRVYsTUFB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QU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sV0FBVyxDQUFDLE1BQXFCO1FBQ3pDLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDOztnSEF2SVUsbUJBQW1CLGtCQVNwQixvQkFBb0I7b0hBVG5CLG1CQUFtQixjQUROLE1BQU07MkZBQ25CLG1CQUFtQjtrQkFEL0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQVU3QixNQUFNOzJCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudFJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbmplY3RhYmxlLFxuICBpc0Rldk1vZGUsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZUFwcGxpY2FibGUgfSBmcm9tICdAc3BhcnRhY3VzL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTGF5b3V0Q29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnL2xheW91dC1jb25maWcnO1xuaW1wb3J0IHsgTGF1bmNoT3B0aW9ucywgTEFVTkNIX0NBTExFUiB9IGZyb20gJy4uL2NvbmZpZy9sYXVuY2gtY29uZmlnJztcbmltcG9ydCB7IExhdW5jaFJlbmRlclN0cmF0ZWd5IH0gZnJvbSAnLi9sYXVuY2gtcmVuZGVyLnN0cmF0ZWd5JztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBMYXVuY2hEaWFsb2dTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfZGlhbG9nQ2xvc2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfZGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4odW5kZWZpbmVkKTtcblxuICBnZXQgZGF0YSQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExhdW5jaFJlbmRlclN0cmF0ZWd5KVxuICAgIHByb3RlY3RlZCByZW5kZXJTdHJhdGVnaWVzOiBMYXVuY2hSZW5kZXJTdHJhdGVneVtdLFxuICAgIHByb3RlY3RlZCBsYXlvdXRDb25maWc6IExheW91dENvbmZpZ1xuICApIHtcbiAgICB0aGlzLnJlbmRlclN0cmF0ZWdpZXMgPSB0aGlzLnJlbmRlclN0cmF0ZWdpZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgZGlhbG9nXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsZXIgTEFVTkNIX0NBTExFUlxuICAgKiBAcGFyYW0gb3BlbkVsZW1lbnQgYnV0dG9uJ3MgRWxlbWVudCByZWZcbiAgICogQHBhcmFtIHZjciBWaWV3IENvbnRhaW5lciBSZWYgb2YgdGhlIGNvbnRhaW5lciBmb3IgaW5saW5lIHJlbmRlcmluZ1xuICAgKiBAcGFyYW0gZGF0YSBvcHRpb25hbCBkYXRhIHdoaWNoIGNvdWxkIGJlIHBhc3NlZCB0byBkaWFsb2dcbiAgICovXG4gIG9wZW5EaWFsb2coXG4gICAgY2FsbGVyOiBMQVVOQ0hfQ0FMTEVSIHwgc3RyaW5nLFxuICAgIG9wZW5FbGVtZW50PzogRWxlbWVudFJlZixcbiAgICB2Y3I/OiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIGRhdGE/OiBhbnlcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmxhdW5jaChjYWxsZXIsIHZjciwgZGF0YSk7XG5cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbY29tcG9uZW50LCB0aGlzLmRpYWxvZ0Nsb3NlXSkucGlwZShcbiAgICAgICAgZmlsdGVyKChbLCBjbG9zZV0pID0+IGNsb3NlICE9PSB1bmRlZmluZWQpLFxuICAgICAgICB0YXAoKFtjb21wXSkgPT4ge1xuICAgICAgICAgIG9wZW5FbGVtZW50Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgdGhpcy5jbGVhcihjYWxsZXIpO1xuICAgICAgICAgIGNvbXAuZGVzdHJveSgpO1xuICAgICAgICB9KSxcbiAgICAgICAgbWFwKChbY29tcF0pID0+IGNvbXApXG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVuZGVyIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBzdHJhdGVneSBmcm9tIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGVyIExBVU5DSF9DQUxMRVJcbiAgICogQHBhcmFtIHZjciBWaWV3IENvbnRhaW5lciBSZWYgb2YgdGhlIGNvbnRhaW5lciBmb3IgaW5saW5lIHJlbmRlcmluZ1xuICAgKi9cbiAgbGF1bmNoKFxuICAgIGNhbGxlcjogTEFVTkNIX0NBTExFUiB8IHN0cmluZyxcbiAgICB2Y3I/OiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIGRhdGE/OiBhbnlcbiAgKTogdm9pZCB8IE9ic2VydmFibGU8Q29tcG9uZW50UmVmPGFueT4gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmZpbmRDb25maWd1cmF0aW9uKGNhbGxlcik7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmdldFN0cmF0ZWd5KGNvbmZpZyk7XG5cbiAgICAgIC8vIFJlbmRlciBpZiB0aGUgc3RyYXRlZ3kgZXhpc3RzXG4gICAgICBpZiAocmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5fZGlhbG9nQ2xvc2UubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLl9kYXRhU3ViamVjdC5uZXh0KGRhdGEpO1xuXG4gICAgICAgIHJldHVybiByZW5kZXJlci5yZW5kZXIoY29uZmlnLCBjYWxsZXIsIHZjcik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc29sZS53YXJuKCdObyBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGZvciBjYWxsZXIgJyArIGNhbGxlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGRpYWxvZyBhbmQgc3Vic2NyaWJlIGluIHRoZSBzZXJ2aWNlLiBTaG91bGQgYmUgdXNlZCBpZiB0aGUgdHJpZ2dlciBjb21wb25lbnQgbWlnaHQgZ2V0IGRlc3Ryb3llZCB3aGlsZSB0aGUgY29tcG9uZW50IGlzIG9wZW4uXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsZXIgTGF1bmNoIENhbGxlclxuICAgKiBAcGFyYW0gb3BlbkVsZW1lbnQgRWxlbWVudCB0byBvcGVuXG4gICAqIEBwYXJhbSBkYXRhIERhdGEgdG8gcHJvdmlkZSB0byB0aGUgcmVuZGVyZWQgZWxlbWVudFxuICAgKi9cbiAgb3BlbkRpYWxvZ0FuZFN1YnNjcmliZShcbiAgICBjYWxsZXI6IExBVU5DSF9DQUxMRVIgfCBzdHJpbmcsXG4gICAgb3BlbkVsZW1lbnQ/OiBFbGVtZW50UmVmLFxuICAgIGRhdGE/OiBhbnlcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuRGlhbG9nKGNhbGxlciwgb3BlbkVsZW1lbnQsIHVuZGVmaW5lZCwgZGF0YSlcbiAgICAgID8ucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWwgbWV0aG9kIHRvIHJlbW92ZSBlbGVtZW50IGZyb20gcmVuZGVyZWQgZWxlbWVudHMgbGlzdFxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGVyIExBVU5DSF9DQUxMRVJcbiAgICovXG4gIGNsZWFyKGNhbGxlcjogTEFVTkNIX0NBTExFUiB8IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZmluZENvbmZpZ3VyYXRpb24oY2FsbGVyKTtcblxuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5nZXRTdHJhdGVneShjb25maWcpO1xuXG4gICAgICAvLyBSZW5kZXIgaWYgdGhlIHN0cmF0ZWd5IGV4aXN0c1xuICAgICAgaWYgKHJlbmRlcmVyKSB7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZShjYWxsZXIsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpYWxvZ0Nsb3NlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RpYWxvZ0Nsb3NlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgY2xvc2VEaWFsb2cocmVhc29uOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kaWFsb2dDbG9zZS5uZXh0KHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNhbGxlclxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGVyIExBVU5DSF9DQUxMRVJcbiAgICovXG4gIHByb3RlY3RlZCBmaW5kQ29uZmlndXJhdGlvbihcbiAgICBjYWxsZXI6IExBVU5DSF9DQUxMRVIgfCBzdHJpbmdcbiAgKTogTGF1bmNoT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnPy5sYXVuY2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmxheW91dENvbmZpZy5sYXVuY2hbY2FsbGVyXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZW5kZXIgc3RyYXRlZ3kgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uIGZvciBsYXVuY2hcbiAgICovXG4gIHByb3RlY3RlZCBnZXRTdHJhdGVneShjb25maWc6IExhdW5jaE9wdGlvbnMpOiBMYXVuY2hSZW5kZXJTdHJhdGVneSB7XG4gICAgcmV0dXJuIHJlc29sdmVBcHBsaWNhYmxlKHRoaXMucmVuZGVyU3RyYXRlZ2llcywgW2NvbmZpZ10pO1xuICB9XG59XG4iXX0=