diff --git a/package.json b/package.json index 5ae63a524..d730bda61 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "colors": "1.4.0", "core-js": "3.33.3", "custom-idle-queue": "3.0.1", + "deepmerge": "^4.3.1", "eslint-plugin-sonarjs": "^0.23.0", "gulp-clean": "^0.4.0", "gulp-run": "^1.7.1", diff --git a/projects/ui/ng-package.json b/projects/ui/ng-package.json index ef5f0140e..ab7900c4a 100644 --- a/projects/ui/ng-package.json +++ b/projects/ui/ng-package.json @@ -4,5 +4,5 @@ "lib": { "entryFile": "./src/public-api.ts" }, - "allowedNonPeerDependencies": ["@angular/cdk", "@po-ui/style", "@po-ui/ng-schematics"] + "allowedNonPeerDependencies": ["@angular/cdk", "@po-ui/style", "@po-ui/ng-schematics", "deepmerge"] } diff --git a/projects/ui/package.json b/projects/ui/package.json index 8669c4ef0..6b1c1c6f4 100644 --- a/projects/ui/package.json +++ b/projects/ui/package.json @@ -39,6 +39,7 @@ "@angular-devkit/schematics": "^18", "@po-ui/style": "0.0.0-PLACEHOLDER", "rxjs": "~7.8.1", - "zone.js": "~0.14.4" + "zone.js": "~0.14.4", + "deepmerge": "^4.3.1" } } diff --git a/projects/ui/src/lib/services/po-i18n/index.ts b/projects/ui/src/lib/services/po-i18n/index.ts index ae77d94cb..b415823d6 100644 --- a/projects/ui/src/lib/services/po-i18n/index.ts +++ b/projects/ui/src/lib/services/po-i18n/index.ts @@ -1,4 +1,5 @@ export * from './interfaces/po-i18n-config.interface'; +export * from './interfaces/po-i18n-config-context.interface'; export * from './interfaces/po-i18n-config-default.interface'; export * from './interfaces/po-i18n-literals.interface'; export * from './po-i18n.pipe'; diff --git a/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config-context.interface.ts b/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config-context.interface.ts new file mode 100644 index 000000000..e8f5184c3 --- /dev/null +++ b/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config-context.interface.ts @@ -0,0 +1,12 @@ +/** + * @description + * + * + * + * Interface para a configuração dos contextos do módulo `PoI18nModule`. + * + * @usedBy PoI18nModule + */ +export interface PoI18nConfigContext { + [name: string]: { [language: string]: { [literal: string]: string } } | { url: string }; +} diff --git a/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config.interface.ts b/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config.interface.ts index bda96e402..caf87e7a7 100644 --- a/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config.interface.ts +++ b/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config.interface.ts @@ -1,4 +1,5 @@ import { PoI18nConfigDefault } from './po-i18n-config-default.interface'; +import { PoI18nConfigContext } from './po-i18n-config-context.interface'; /** * @description @@ -76,5 +77,5 @@ export interface PoI18nConfig { * ``` * > Caso a constante contenha alguma literal que o serviço não possua será utilizado a literal da constante. */ - contexts: object; + contexts: PoI18nConfigContext; } diff --git a/projects/ui/src/lib/services/po-i18n/po-i18n-base.service.ts b/projects/ui/src/lib/services/po-i18n/po-i18n-base.service.ts index 85993cafa..9156a9e52 100644 --- a/projects/ui/src/lib/services/po-i18n/po-i18n-base.service.ts +++ b/projects/ui/src/lib/services/po-i18n/po-i18n-base.service.ts @@ -191,7 +191,7 @@ export class PoI18nBaseService { const context = options['context'] ? options['context'] : this.contextDefault; const literals: Array = options['literals'] ? options['literals'] : []; - return new Observable(observer => { + return new Observable(observer => { if (this.servicesContext[context]) { // Faz o processo de busca de um contexto que contém serviço this.getLiteralsFromContextService(language, context, literals, observer); diff --git a/projects/ui/src/lib/services/po-i18n/po-i18n-config-injection-token.ts b/projects/ui/src/lib/services/po-i18n/po-i18n-config-injection-token.ts index f0e5e57a9..8a64af3fa 100644 --- a/projects/ui/src/lib/services/po-i18n/po-i18n-config-injection-token.ts +++ b/projects/ui/src/lib/services/po-i18n/po-i18n-config-injection-token.ts @@ -2,4 +2,4 @@ import { InjectionToken } from '@angular/core'; import { PoI18nConfig } from './interfaces/po-i18n-config.interface'; -export const I18N_CONFIG = new InjectionToken('I18N_CONFIG'); +export const I18N_CONFIG = new InjectionToken>('I18N_CONFIG'); diff --git a/projects/ui/src/lib/services/po-i18n/po-i18n.module.ts b/projects/ui/src/lib/services/po-i18n/po-i18n.module.ts index c260d7f1f..c69df861c 100644 --- a/projects/ui/src/lib/services/po-i18n/po-i18n.module.ts +++ b/projects/ui/src/lib/services/po-i18n/po-i18n.module.ts @@ -1,4 +1,4 @@ -import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; +import { APP_INITIALIZER, ModuleWithProviders, NgModule, Provider } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { PoLanguageService } from './../po-language/po-language.service'; @@ -162,8 +162,10 @@ export class PoI18nModule { providers: [ { provide: I18N_CONFIG, - useValue: config + useValue: config, + multi: true }, + provideI18nConfig(config), { provide: APP_INITIALIZER, useFactory: initializeLanguageDefault, @@ -180,12 +182,27 @@ export class PoI18nModule { } } -export function initializeLanguageDefault(config: PoI18nConfig, languageService: PoLanguageService) { - // eslint-disable-next-line sonarjs/prefer-immediate-return - const setDefaultLanguage = () => { - if (config.default.language) { +export function provideI18nConfig(config: PoI18nConfig): Array { + return [ + { + provide: I18N_CONFIG, + useValue: config, + multi: true + }, + { + provide: PoI18nService, + useFactory: returnPoI18nService, + deps: [I18N_CONFIG, HttpClient, PoLanguageService] + } + ]; +} + +export function initializeLanguageDefault(configs: Array, languageService: PoLanguageService) { + const config = configs.find(c => c.default); // Busca a configuração com `default` + + return () => { + if (config?.default.language) { languageService.setLanguageDefault(config.default.language); } }; - return setDefaultLanguage; } diff --git a/projects/ui/src/lib/services/po-i18n/po-i18n.service.ts b/projects/ui/src/lib/services/po-i18n/po-i18n.service.ts index 701f33240..fe74035e3 100644 --- a/projects/ui/src/lib/services/po-i18n/po-i18n.service.ts +++ b/projects/ui/src/lib/services/po-i18n/po-i18n.service.ts @@ -1,5 +1,6 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { all as deepmergeAll } from 'deepmerge'; import { PoLanguageService } from './../po-language/po-language.service'; @@ -14,6 +15,17 @@ import { PoI18nConfig } from './interfaces/po-i18n-config.interface'; export class PoI18nService extends PoI18nBaseService {} // Função usada para retornar instância para o módulo po-i18n.module -export function returnPoI18nService(config: PoI18nConfig, http: HttpClient, languageService: PoLanguageService) { - return new PoI18nService(config, http, languageService); +export function returnPoI18nService( + configs: Array, + http: HttpClient, + languageService: PoLanguageService +) { + const validatedConfigs = configs.map(config => ({ + ...config, + contexts: config.contexts, + default: config.default + })); + const mergedConfig = deepmergeAll(validatedConfigs); + + return new PoI18nService(mergedConfig, http, languageService); }