@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
98 lines • 12.2 kB
JavaScript
import { Injectable } from '@angular/core';
import { Subscription } from 'rxjs';
import { tap } from 'rxjs/operators';
import { DirectionMode } from './config/direction.model';
import * as i0 from "@angular/core";
import * as i1 from "@spartacus/core";
/**
* The `DirectionService` can be used to add the direction to the overall storefront or individual elements.
* By default, the direction is added to the `html` element (i.e. `<html dir="ltr">`). The API of this service
* does however provide methods to add direction to individual elements if needed.
*
* The direction is configurable and allows for language driven direction configuration.
*
* To react to the active language, the service subscribes to the active language in the initialize method. This
* is called from an APP_INITIALIZER method and should only happen once.
*/
export class DirectionService {
constructor(configInit, languageService, winRef) {
this.configInit = configInit;
this.languageService = languageService;
this.winRef = winRef;
this.startsDetecting = false;
this.subscription = new Subscription();
}
/**
* Initializes the layout direction for the storefront.
*/
initialize() {
return this.configInit
.getStable('direction')
.pipe(tap((config) => {
var _a, _b;
this.config = config === null || config === void 0 ? void 0 : config.direction;
if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.detect) {
this.detect();
}
else {
this.setDirection(this.winRef.document.documentElement, (_b = this.config) === null || _b === void 0 ? void 0 : _b.default);
}
}))
.toPromise();
}
/**
* Observes the _active_ language and set the required direction for the given language.
* The method is guarded to ensure that the active language is observed only once.
*/
detect() {
if (this.startsDetecting) {
return;
}
this.subscription.add(this.languageService
.getActive()
.subscribe((isoCode) => this.setDirection(this.winRef.document.documentElement, this.getDirection(isoCode))));
this.startsDetecting = true;
}
/**
* Sets the direction attribute for the given element. If the direction is undefined, the `dir`
* attribute is removed.
*/
setDirection(el, direction) {
if (direction) {
el.setAttribute('dir', direction);
}
else {
el.removeAttribute('dir');
}
}
/**
* Gets the `DirectionMode` for the given language isoCode. The language isoCode is compared
* to the configured list of languages(`direction.rtlLanguages` vs `direction.ltrLanguages`).
*
* If no language is given, or no language mapping could be found, we fallback to the default
* `direction.mode`.
*/
getDirection(language) {
var _a, _b, _c, _d, _e;
if (language && ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.rtlLanguages) === null || _b === void 0 ? void 0 : _b.includes(language))) {
return DirectionMode.RTL;
}
if (language && ((_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.ltrLanguages) === null || _d === void 0 ? void 0 : _d.includes(language))) {
return DirectionMode.LTR;
}
return (_e = this.config) === null || _e === void 0 ? void 0 : _e.default;
}
ngOnDestroy() {
// Cleans up the subscription, to avoid memory leaks in SSR.
this.subscription.unsubscribe();
}
}
DirectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: DirectionService, deps: [{ token: i1.ConfigInitializerService }, { token: i1.LanguageService }, { token: i1.WindowRef }], target: i0.ɵɵFactoryTarget.Injectable });
DirectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: DirectionService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: DirectionService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.ConfigInitializerService }, { type: i1.LanguageService }, { type: i1.WindowRef }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL2xheW91dC9kaXJlY3Rpb24vZGlyZWN0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQU10RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7OztBQUVwRTs7Ozs7Ozs7O0dBU0c7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQ1ksVUFBb0MsRUFDcEMsZUFBZ0MsRUFDaEMsTUFBaUI7UUFGakIsZUFBVSxHQUFWLFVBQVUsQ0FBMEI7UUFDcEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFQbkIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFFeEIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBTXpDLENBQUM7SUFFSjs7T0FFRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxVQUFVO2FBQ25CLFNBQVMsQ0FBQyxXQUFXLENBQUM7YUFDdEIsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLE1BQXVCLEVBQUUsRUFBRTs7WUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsU0FBUyxDQUFDO1lBQ2hDLElBQUksTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxNQUFNLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNmO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxZQUFZLENBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUNwQyxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLE9BQU8sQ0FDckIsQ0FBQzthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sTUFBTTtRQUNkLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxDQUFDLGVBQWU7YUFDakIsU0FBUyxFQUFFO2FBQ1gsU0FBUyxDQUFDLENBQUMsT0FBZSxFQUFFLEVBQUUsQ0FDN0IsSUFBSSxDQUFDLFlBQVksQ0FDZixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQzNCLENBQ0YsQ0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxFQUFlLEVBQUUsU0FBd0I7UUFDcEQsSUFBSSxTQUFTLEVBQUU7WUFDYixFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNuQzthQUFNO1lBQ0wsRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxZQUFZLENBQUMsUUFBaUI7O1FBQzVCLElBQUksUUFBUSxLQUFJLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxZQUFZLDBDQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQSxFQUFFO1lBQzdELE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQztTQUMxQjtRQUNELElBQUksUUFBUSxLQUFJLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxZQUFZLDBDQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQSxFQUFFO1lBQzdELE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQztTQUMxQjtRQUNELE9BQU8sTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVc7UUFDVCw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDOzs2R0F2RlUsZ0JBQWdCO2lIQUFoQixnQkFBZ0IsY0FGZixNQUFNOzJGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbmZpZ0luaXRpYWxpemVyU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlLFxuICBXaW5kb3dSZWYsXG59IGZyb20gJ0BzcGFydGFjdXMvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERpcmVjdGlvbkNvbmZpZyB9IGZyb20gJy4vY29uZmlnL2RpcmVjdGlvbi5jb25maWcnO1xuaW1wb3J0IHsgRGlyZWN0aW9uLCBEaXJlY3Rpb25Nb2RlIH0gZnJvbSAnLi9jb25maWcvZGlyZWN0aW9uLm1vZGVsJztcblxuLyoqXG4gKiBUaGUgYERpcmVjdGlvblNlcnZpY2VgIGNhbiBiZSB1c2VkIHRvIGFkZCB0aGUgZGlyZWN0aW9uIHRvIHRoZSBvdmVyYWxsIHN0b3JlZnJvbnQgb3IgaW5kaXZpZHVhbCBlbGVtZW50cy5cbiAqIEJ5IGRlZmF1bHQsIHRoZSBkaXJlY3Rpb24gaXMgYWRkZWQgdG8gdGhlIGBodG1sYCBlbGVtZW50IChpLmUuIGA8aHRtbCBkaXI9XCJsdHJcIj5gKS4gVGhlIEFQSSBvZiB0aGlzIHNlcnZpY2VcbiAqIGRvZXMgaG93ZXZlciBwcm92aWRlIG1ldGhvZHMgdG8gYWRkIGRpcmVjdGlvbiB0byBpbmRpdmlkdWFsIGVsZW1lbnRzIGlmIG5lZWRlZC5cbiAqXG4gKiBUaGUgZGlyZWN0aW9uIGlzIGNvbmZpZ3VyYWJsZSBhbmQgYWxsb3dzIGZvciBsYW5ndWFnZSBkcml2ZW4gZGlyZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVG8gcmVhY3QgdG8gdGhlIGFjdGl2ZSBsYW5ndWFnZSwgdGhlIHNlcnZpY2Ugc3Vic2NyaWJlcyB0byB0aGUgYWN0aXZlIGxhbmd1YWdlIGluIHRoZSBpbml0aWFsaXplIG1ldGhvZC4gVGhpc1xuICogaXMgY2FsbGVkIGZyb20gYW4gQVBQX0lOSVRJQUxJWkVSIG1ldGhvZCBhbmQgc2hvdWxkIG9ubHkgaGFwcGVuIG9uY2UuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBEaXJlY3Rpb25TZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIGNvbmZpZzogRGlyZWN0aW9uO1xuICBwcm90ZWN0ZWQgc3RhcnRzRGV0ZWN0aW5nID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY29uZmlnSW5pdDogQ29uZmlnSW5pdGlhbGl6ZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgd2luUmVmOiBXaW5kb3dSZWZcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgbGF5b3V0IGRpcmVjdGlvbiBmb3IgdGhlIHN0b3JlZnJvbnQuXG4gICAqL1xuICBpbml0aWFsaXplKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnSW5pdFxuICAgICAgLmdldFN0YWJsZSgnZGlyZWN0aW9uJylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGNvbmZpZzogRGlyZWN0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc/LmRpcmVjdGlvbjtcbiAgICAgICAgICBpZiAodGhpcy5jb25maWc/LmRldGVjdCkge1xuICAgICAgICAgICAgdGhpcy5kZXRlY3QoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXREaXJlY3Rpb24oXG4gICAgICAgICAgICAgIHRoaXMud2luUmVmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgICAgICAgdGhpcy5jb25maWc/LmRlZmF1bHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmVzIHRoZSBfYWN0aXZlXyBsYW5ndWFnZSBhbmQgc2V0IHRoZSByZXF1aXJlZCBkaXJlY3Rpb24gZm9yIHRoZSBnaXZlbiBsYW5ndWFnZS5cbiAgICogVGhlIG1ldGhvZCBpcyBndWFyZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBhY3RpdmUgbGFuZ3VhZ2UgaXMgb2JzZXJ2ZWQgb25seSBvbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRldGVjdCgpIHtcbiAgICBpZiAodGhpcy5zdGFydHNEZXRlY3RpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2VcbiAgICAgICAgLmdldEFjdGl2ZSgpXG4gICAgICAgIC5zdWJzY3JpYmUoKGlzb0NvZGU6IHN0cmluZykgPT5cbiAgICAgICAgICB0aGlzLnNldERpcmVjdGlvbihcbiAgICAgICAgICAgIHRoaXMud2luUmVmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgICAgIHRoaXMuZ2V0RGlyZWN0aW9uKGlzb0NvZGUpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN0YXJ0c0RldGVjdGluZyA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlyZWN0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIElmIHRoZSBkaXJlY3Rpb24gaXMgdW5kZWZpbmVkLCB0aGUgYGRpcmBcbiAgICogYXR0cmlidXRlIGlzIHJlbW92ZWQuXG4gICAqL1xuICBzZXREaXJlY3Rpb24oZWw6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbk1vZGUpOiB2b2lkIHtcbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RpcicsIGRpcmVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGlyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGBEaXJlY3Rpb25Nb2RlYCBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIGlzb0NvZGUuIFRoZSBsYW5ndWFnZSBpc29Db2RlIGlzIGNvbXBhcmVkXG4gICAqIHRvIHRoZSBjb25maWd1cmVkIGxpc3Qgb2YgbGFuZ3VhZ2VzKGBkaXJlY3Rpb24ucnRsTGFuZ3VhZ2VzYCB2cyBgZGlyZWN0aW9uLmx0ckxhbmd1YWdlc2ApLlxuICAgKlxuICAgKiBJZiBubyBsYW5ndWFnZSBpcyBnaXZlbiwgb3Igbm8gbGFuZ3VhZ2UgbWFwcGluZyBjb3VsZCBiZSBmb3VuZCwgd2UgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHRcbiAgICogYGRpcmVjdGlvbi5tb2RlYC5cbiAgICovXG4gIGdldERpcmVjdGlvbihsYW5ndWFnZT86IHN0cmluZyk6IERpcmVjdGlvbk1vZGUge1xuICAgIGlmIChsYW5ndWFnZSAmJiB0aGlzLmNvbmZpZz8ucnRsTGFuZ3VhZ2VzPy5pbmNsdWRlcyhsYW5ndWFnZSkpIHtcbiAgICAgIHJldHVybiBEaXJlY3Rpb25Nb2RlLlJUTDtcbiAgICB9XG4gICAgaWYgKGxhbmd1YWdlICYmIHRoaXMuY29uZmlnPy5sdHJMYW5ndWFnZXM/LmluY2x1ZGVzKGxhbmd1YWdlKSkge1xuICAgICAgcmV0dXJuIERpcmVjdGlvbk1vZGUuTFRSO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWc/LmRlZmF1bHQ7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbnMgdXAgdGhlIHN1YnNjcmlwdGlvbiwgdG8gYXZvaWQgbWVtb3J5IGxlYWtzIGluIFNTUi5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=