UNPKG

@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
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=