Browse Source

Remember language. (#862)

pull/863/head
Sebastian Stehle 4 years ago
committed by GitHub
parent
commit
7bc7ef17a2
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      frontend/src/app/features/content/pages/content/content-page.component.html
  2. 20
      frontend/src/app/features/content/pages/content/content-page.component.ts
  3. 6
      frontend/src/app/features/content/pages/content/editor/content-field.component.ts
  4. 6
      frontend/src/app/features/content/pages/content/editor/content-section.component.ts
  5. 6
      frontend/src/app/features/content/pages/contents/contents-page.component.html
  6. 20
      frontend/src/app/features/content/pages/contents/contents-page.component.ts
  7. 8
      frontend/src/app/features/content/shared/forms/array-editor.component.ts
  8. 10
      frontend/src/app/features/content/shared/forms/assets-editor.component.ts
  9. 60
      frontend/src/app/framework/services/local-store.service.spec.ts
  10. 6
      frontend/src/app/framework/services/onboarding.service.ts
  11. 10
      frontend/src/app/shared/components/assets/assets-selector.component.ts
  12. 12
      frontend/src/app/shared/components/forms/geolocation-editor.component.ts
  13. 6
      frontend/src/app/shared/components/schema-category.component.ts
  14. 2
      frontend/src/app/shared/state/settings.ts
  15. 8
      frontend/src/app/shell/pages/internal/notifications-menu.component.ts

6
frontend/src/app/features/content/pages/content/content-page.component.html

@ -56,7 +56,11 @@
<sqx-notifo topic="apps/{{contentsState.appId}}/schemas/{{schema?.name}}/contents/{{content.id}}"></sqx-notifo>
<ng-container *ngIf="languages.length > 1">
<sqx-language-selector class="languages-buttons" [(language)]="language" [languages]="languages"></sqx-language-selector>
<sqx-language-selector class="languages-buttons"
(languageChange)="changeLanguage($event)"
[language]="language"
[languages]="languages">
</sqx-language-selector>
</ng-container>
<ng-container *ngIf="content?.canDelete">

20
frontend/src/app/features/content/pages/content/content-page.component.ts

@ -9,7 +9,7 @@ import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Observable, of } from 'rxjs';
import { filter, map, tap } from 'rxjs/operators';
import { ApiUrlConfig, AppLanguageDto, AppsState, AuthService, AutoSaveKey, AutoSaveService, CanComponentDeactivate, ContentDto, ContentsState, defined, DialogService, EditContentForm, LanguagesState, ModalModel, ResolveAssets, ResolveContents, ResourceOwner, SchemaDto, SchemasState, TempService, ToolbarService, Types, Version } from '@app/shared';
import { ApiUrlConfig, AppLanguageDto, AppsState, AuthService, AutoSaveKey, AutoSaveService, CanComponentDeactivate, ContentDto, ContentsState, defined, DialogService, EditContentForm, LanguagesState, LocalStoreService, ModalModel, ResolveAssets, ResolveContents, ResourceOwner, SchemaDto, SchemasState, Settings, TempService, ToolbarService, Types, Version } from '@app/shared';
@Component({
selector: 'sqx-content-page',
@ -49,6 +49,7 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD
private readonly autoSaveService: AutoSaveService,
private readonly dialogs: DialogService,
private readonly languagesState: LanguagesState,
private readonly localStore: LocalStoreService,
private readonly route: ActivatedRoute,
private readonly router: Router,
private readonly schemasState: SchemasState,
@ -86,6 +87,13 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD
.subscribe(schema => {
this.schema = schema;
const languageKey = this.localStore.get(this.languageKey());
const language = this.languages.find(x => x.iso2Code === languageKey);
if (language) {
this.language = language;
}
this.contentForm = new EditContentForm(this.languages, this.schema, this.schemasState.schemaMap, this.formContext);
}));
@ -217,6 +225,12 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD
}
}
public changeLanguage(language: AppLanguageDto) {
this.language = language;
this.localStore.set(this.languageKey(), language.iso2Code);
}
public checkPendingChangesBeforePreview() {
return this.checkPendingChanges('i18n:contents.pendingChangesTextToPreview');
}
@ -277,6 +291,10 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD
this.contentForm.load(data, isInitial);
this.contentForm.setEnabled(!this.content || this.content.canUpdate);
}
private languageKey(): any {
return Settings.Local.CONTENT_LANGUAGE(this.schema.id);
}
}
function isOtherContent(lhs: ContentDto | undefined | null, rhs: ContentDto | undefined | null) {

6
frontend/src/app/features/content/pages/content/editor/content-field.component.ts

@ -74,7 +74,7 @@ export class ContentFieldComponent implements OnChanges {
}
public ngOnChanges(changes: SimpleChanges) {
this.showAllControls = this.localStore.getBoolean(this.configKey());
this.showAllControls = this.localStore.getBoolean(this.showAllControlsKey());
if (changes['formModel'] && this.formModel) {
this.isInvalid = invalid$(this.formModel.form);
@ -88,7 +88,7 @@ export class ContentFieldComponent implements OnChanges {
public changeShowAllControls(showAllControls: boolean) {
this.showAllControls = showAllControls;
this.localStore.setBoolean(this.configKey(), this.showAllControls);
this.localStore.setBoolean(this.showAllControlsKey(), this.showAllControls);
}
public copy() {
@ -164,7 +164,7 @@ export class ContentFieldComponent implements OnChanges {
return language.iso2Code;
}
private configKey() {
private showAllControlsKey() {
return Settings.Local.FIELD_ALL(this.schema?.id, this.formModel.field.fieldId);
}
}

6
frontend/src/app/features/content/pages/content/editor/content-section.component.ts

@ -59,7 +59,7 @@ export class ContentSectionComponent extends StatefulComponent<State> implements
this.changes.subscribe(state => {
if (this.formSection?.separator && this.schema) {
this.localStore.setBoolean(this.expandedKey(), state.isCollapsed);
this.localStore.setBoolean(this.isCollapsedKey(), state.isCollapsed);
}
});
}
@ -67,7 +67,7 @@ export class ContentSectionComponent extends StatefulComponent<State> implements
public ngOnChanges(changes: SimpleChanges) {
if (changes['formSection' || changes['schema']]) {
if (this.formSection?.separator && this.schema) {
const isCollapsed = this.localStore.getBoolean(this.expandedKey());
const isCollapsed = this.localStore.getBoolean(this.isCollapsedKey());
this.next({ isCollapsed });
}
@ -89,7 +89,7 @@ export class ContentSectionComponent extends StatefulComponent<State> implements
return formState.field.fieldId;
}
private expandedKey(): string {
private isCollapsedKey(): string {
return Settings.Local.FIELD_COLLAPSED(this.schema?.id, this.formSection?.separator?.fieldId);
}
}

6
frontend/src/app/features/content/pages/contents/contents-page.component.html

@ -24,7 +24,11 @@
</sqx-search-form>
</div>
<div class="col-auto" *ngIf="languages.length > 1">
<sqx-language-selector class="languages-buttons" [(language)]="language" [languages]="languages"></sqx-language-selector>
<sqx-language-selector class="languages-buttons"
(languageChange)="changeLanguage($event)"
[language]="language"
[languages]="languages">
</sqx-language-selector>
</div>
<div class="col-auto">
<button type="button" class="btn btn-success" routerLink="new" title="i18n:contents.createContentTooltip" shortcut="CTRL + U" [disabled]="(contentsState.canCreateAny | async) === false">

20
frontend/src/app/features/content/pages/contents/contents-page.component.ts

@ -10,7 +10,7 @@
import { Component, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { distinctUntilChanged, map, switchMap, take, tap } from 'rxjs/operators';
import { AppLanguageDto, AppsState, ContentDto, ContentsState, ContributorsState, defined, LanguagesState, ModalModel, Queries, Query, QuerySynchronizer, ResourceOwner, Router2State, SchemaDto, SchemasService, SchemasState, switchSafe, TableSettings, TempService, UIState } from '@app/shared';
import { AppLanguageDto, AppsState, ContentDto, ContentsState, ContributorsState, defined, LanguagesState, LocalStoreService, ModalModel, Queries, Query, QuerySynchronizer, ResourceOwner, Router2State, SchemaDto, SchemasService, SchemasState, Settings, switchSafe, TableSettings, TempService, UIState } from '@app/shared';
import { DueTimeSelectorComponent } from './../../shared/due-time-selector.component';
@Component({
@ -59,6 +59,7 @@ export class ContentsPageComponent extends ResourceOwner implements OnInit {
public readonly languagesState: LanguagesState,
private readonly appsState: AppsState,
private readonly contributorsState: ContributorsState,
private readonly localStore: LocalStoreService,
private readonly route: ActivatedRoute,
private readonly router: Router,
private readonly schemasState: SchemasState,
@ -103,6 +104,13 @@ export class ContentsPageComponent extends ResourceOwner implements OnInit {
this.contentsState.load(false, initial);
this.contentsRoute.listen();
const languageKey = this.localStore.get(this.languageKey());
const language = this.languages.find(x => x.iso2Code === languageKey);
if (language) {
this.language = language;
}
}));
this.own(
@ -151,6 +159,12 @@ export class ContentsPageComponent extends ResourceOwner implements OnInit {
this.router.navigate(['new'], { relativeTo: this.route });
}
public changeLanguage(language: AppLanguageDto) {
this.language = language;
this.localStore.set(this.languageKey(), language.iso2Code);
}
public search(query: Query) {
this.contentsState.search(query);
}
@ -221,6 +235,10 @@ export class ContentsPageComponent extends ResourceOwner implements OnInit {
private selectItems(predicate?: (content: ContentDto) => boolean) {
return this.contentsState.snapshot.contents.filter(c => this.selectedItems[c.id] && (!predicate || predicate(c)));
}
private languageKey(): any {
return Settings.Local.CONTENT_LANGUAGE(this.schema.id);
}
}
function getSchemaName(route: ActivatedRoute) {

8
frontend/src/app/features/content/shared/forms/array-editor.component.ts

@ -87,7 +87,7 @@ export class ArrayEditorComponent implements OnChanges {
}
if (changes['formModel'] || changes['formLevel']) {
this.isCollapsedInitial = this.localStore.getBoolean(this.expandedKey()) || this.formLevel > 0;
this.isCollapsedInitial = this.localStore.getBoolean(this.isCollapsedKey()) || this.formLevel > 0;
}
}
@ -129,7 +129,7 @@ export class ArrayEditorComponent implements OnChanges {
}
if (this.formLevel === 0) {
this.localStore.setBoolean(this.expandedKey(), true);
this.localStore.setBoolean(this.isCollapsedKey(), true);
}
this.scroller?.first?.invalidateAllCachedMeasurements();
@ -141,7 +141,7 @@ export class ArrayEditorComponent implements OnChanges {
}
if (this.formLevel === 0) {
this.localStore.setBoolean(this.expandedKey(), false);
this.localStore.setBoolean(this.isCollapsedKey(), false);
}
this.scroller?.first?.invalidateAllCachedMeasurements();
@ -153,7 +153,7 @@ export class ArrayEditorComponent implements OnChanges {
});
}
private expandedKey(): string {
private isCollapsedKey(): string {
return Settings.Local.FIELD_COLLAPSED(this.form.schema?.id, this.formModel.field?.fieldId);
}
}

10
frontend/src/app/features/content/shared/forms/assets-editor.component.ts

@ -8,6 +8,7 @@
import { CdkDragDrop } from '@angular/cdk/drag-drop';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, Input, OnInit } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { AssetDto, DialogModel, LocalStoreService, MessageBus, ResolveAssets, Settings, sorted, StatefulControlComponent, Types } from '@app/shared';
export const SQX_ASSETS_EDITOR_CONTROL_VALUE_ACCESSOR: any = {
@ -56,9 +57,8 @@ export class AssetsEditorComponent extends StatefulControlComponent<State, Reado
public assetsDialog = new DialogModel();
constructor(changeDetector: ChangeDetectorRef,
constructor(changeDetector: ChangeDetectorRef, localStore: LocalStoreService,
private readonly assetsResolver: ResolveAssets,
private readonly localStore: LocalStoreService,
private readonly messageBus: MessageBus,
) {
super(changeDetector, {
@ -66,6 +66,10 @@ export class AssetsEditorComponent extends StatefulControlComponent<State, Reado
assetFiles: [],
isListView: localStore.getBoolean(Settings.Local.ASSETS_MODE),
});
this.changes.pipe(map(x => x.isListView), distinctUntilChanged()).subscribe(value => {
localStore.setBoolean(Settings.Local.ASSETS_MODE, value);
});
}
public writeValue(obj: any) {
@ -170,8 +174,6 @@ export class AssetsEditorComponent extends StatefulControlComponent<State, Reado
public changeView(isListView: boolean) {
this.next({ isListView });
this.localStore.setBoolean('squidex.assets.list-view', isListView);
}
private updateValue() {

60
frontend/src/app/framework/services/local-store.service.spec.ts

@ -9,36 +9,36 @@ import { LocalStoreService } from './local-store.service';
describe('LocalStore', () => {
it('should instantiate', () => {
const localStoreService = new LocalStoreService();
const localStore = new LocalStoreService();
expect(localStoreService).toBeDefined();
expect(localStore).toBeDefined();
});
it('should call local store for set function', () => {
const localStoreService = new LocalStoreService();
const localStore = new LocalStoreService();
let passedKey = '';
let passedVal = '';
localStoreService.configureStore({
localStore.configureStore({
setItem: (k: string, v: string) => {
passedKey = k;
passedVal = v;
},
});
localStoreService.set('mykey', 'myval');
localStore.set('mykey', 'myval');
expect(passedKey).toBe('mykey');
expect(passedVal).toBe('myval');
});
it('should call local store for get function', () => {
const localStoreService = new LocalStoreService();
const localStore = new LocalStoreService();
let passedKey = '';
localStoreService.configureStore({
localStore.configureStore({
getItem: (key: string): string => {
passedKey = key;
@ -46,16 +46,16 @@ describe('LocalStore', () => {
},
});
const returnedVal = localStoreService.get('mykey');
const returnedVal = localStore.get('mykey');
expect(passedKey).toBe('mykey');
expect(returnedVal).toBe('myval');
});
it('should set and get from fallback value if local store failed', () => {
const localStoreService = new LocalStoreService();
const localStore = new LocalStoreService();
localStoreService.configureStore({
localStore.configureStore({
setItem: () => {
throw new Error('Not supported');
},
@ -64,43 +64,43 @@ describe('LocalStore', () => {
},
});
localStoreService.set('mykey', 'myval');
localStore.set('mykey', 'myval');
expect(localStoreService.get('mykey')).toBe('myval');
expect(localStore.get('mykey')).toBe('myval');
});
it('should get boolean from local store', () => {
const localStoreService = new LocalStoreService();
const localStore = new LocalStoreService();
localStoreService.setBoolean('key1', true);
localStoreService.setBoolean('key2', false);
localStore.setBoolean('key1', true);
localStore.setBoolean('key2', false);
expect(localStoreService.getBoolean('key1')).toBe(true);
expect(localStoreService.getBoolean('key2')).toBe(false);
expect(localStore.getBoolean('key1')).toBe(true);
expect(localStore.getBoolean('key2')).toBe(false);
expect(localStoreService.getBoolean('not_set')).toBe(false);
expect(localStore.getBoolean('not_set')).toBe(false);
});
it('should get int from local store', () => {
const localStoreService = new LocalStoreService();
const localStore = new LocalStoreService();
localStoreService.set('key1', 'abc');
localStoreService.setInt('key2', 2);
localStoreService.setInt('key3', 0);
localStore.set('key1', 'abc');
localStore.setInt('key2', 2);
localStore.setInt('key3', 0);
expect(localStoreService.getInt('key1', 13)).toBe(13);
expect(localStoreService.getInt('key2', 13)).toBe(2);
expect(localStoreService.getInt('key3', 13)).toBe(0);
expect(localStore.getInt('key1', 13)).toBe(13);
expect(localStore.getInt('key2', 13)).toBe(2);
expect(localStore.getInt('key3', 13)).toBe(0);
expect(localStoreService.getInt('not_set', 13)).toBe(13);
expect(localStore.getInt('not_set', 13)).toBe(13);
});
it('should remove item from local store', () => {
const localStoreService = new LocalStoreService();
const localStore = new LocalStoreService();
localStoreService.set('key1', 'abc');
localStoreService.remove('key1');
localStore.set('key1', 'abc');
localStore.remove('key1');
expect(localStoreService.get('key1')).toBeNull();
expect(localStore.get('key1')).toBeNull();
});
});

6
frontend/src/app/framework/services/onboarding.service.ts

@ -24,7 +24,7 @@ export class OnboardingService {
}
public disable(key: string) {
this.localStore.set(this.getConfigKey(key), '1');
this.localStore.set(this.disabledKey(key), '1');
}
public shouldShow(key: string) {
@ -32,10 +32,10 @@ export class OnboardingService {
}
private shouldShowKey(key: string) {
return this.localStore.get(this.getConfigKey(key)) !== '1';
return this.localStore.get(this.disabledKey(key)) !== '1';
}
private getConfigKey(key: string): string {
private disabledKey(key: string): string {
return `squidex.onboarding.disable.${key}`;
}
}

10
frontend/src/app/shared/components/assets/assets-selector.component.ts

@ -6,6 +6,7 @@
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, OnInit, Output } from '@angular/core';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { AssetDto, ComponentAssetsState, LocalStoreService, Query, Settings, StatefulComponent } from '@app/shared/internal';
interface State {
@ -32,15 +33,18 @@ export class AssetsSelectorComponent extends StatefulComponent<State> implements
@Output()
public select = new EventEmitter<ReadonlyArray<AssetDto>>();
constructor(changeDector: ChangeDetectorRef,
constructor(changeDector: ChangeDetectorRef, localStore: LocalStoreService,
public readonly assetsState: ComponentAssetsState,
public readonly localStore: LocalStoreService,
) {
super(changeDector, {
selectedAssets: {},
selectionCount: 0,
isListView: localStore.getBoolean(Settings.Local.ASSETS_MODE),
});
this.changes.pipe(map(x => x.isListView), distinctUntilChanged()).subscribe(value => {
localStore.setBoolean(Settings.Local.ASSETS_MODE, value);
});
}
public ngOnInit() {
@ -85,7 +89,5 @@ export class AssetsSelectorComponent extends StatefulComponent<State> implements
public changeView(isListView: boolean) {
this.next({ isListView });
this.localStore.setBoolean(Settings.Local.ASSETS_MODE, isListView);
}
}

12
frontend/src/app/shared/components/forms/geolocation-editor.component.ts

@ -7,6 +7,7 @@
import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, forwardRef, Input, ViewChild } from '@angular/core';
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { ExtendedFormGroup, LocalStoreService, ResourceLoaderService, Settings, StatefulControlComponent, Types, UIOptions, ValidatorsEx } from '@app/shared/internal';
declare const L: any;
@ -20,7 +21,7 @@ type Geolocation = { latitude: number; longitude: number };
interface State {
// True when the map should be hidden.
isMapHidden?: boolean;
isMapHidden: boolean;
// True, when width less than 600 pixels.
isCompact?: boolean;
@ -69,8 +70,7 @@ export class GeolocationEditorComponent extends StatefulControlComponent<State,
@ViewChild('searchBox', { static: false })
public searchBoxInput!: ElementRef<HTMLInputElement>;
constructor(changeDetector: ChangeDetectorRef,
private readonly localStore: LocalStoreService,
constructor(changeDetector: ChangeDetectorRef, localStore: LocalStoreService,
private readonly resourceLoader: ResourceLoaderService,
private readonly uiOptions: UIOptions,
) {
@ -78,13 +78,15 @@ export class GeolocationEditorComponent extends StatefulControlComponent<State,
isMapHidden: localStore.getBoolean(Settings.Local.HIDE_MAP),
});
this.changes.pipe(map(x => x.isMapHidden), distinctUntilChanged()).subscribe(value => {
localStore.setBoolean(Settings.Local.HIDE_MAP, value);
});
this.isGoogleMaps = uiOptions.get('map.type') !== 'OSM';
}
public hideMap(isMapHidden: boolean) {
this.next({ isMapHidden });
this.localStore.setBoolean(Settings.Local.HIDE_MAP, isMapHidden);
}
public writeValue(obj: any) {

6
frontend/src/app/shared/components/schema-category.component.ts

@ -46,14 +46,14 @@ export class SchemaCategoryComponent implements OnChanges {
public toggle() {
this.isCollapsed = !this.isCollapsed;
this.localStore.setBoolean(this.configKey(), this.isCollapsed);
this.localStore.setBoolean(this.isCollapsedKey(), this.isCollapsed);
}
public ngOnChanges() {
if (this.schemaCategory.countSchemasInSubtreeFiltered < this.schemaCategory.countSchemasInSubtree) {
this.isCollapsed = false;
} else {
this.isCollapsed = this.localStore.getBoolean(this.configKey());
this.isCollapsed = this.localStore.getBoolean(this.isCollapsedKey());
}
}
@ -98,7 +98,7 @@ export class SchemaCategoryComponent implements OnChanges {
return category.name;
}
private configKey(): string {
private isCollapsedKey(): string {
return `squidex.schema.category.${this.schemaCategory.name}.collapsed`;
}
}

2
frontend/src/app/shared/state/settings.ts

@ -15,12 +15,14 @@ export const Settings = {
},
Local: {
ASSETS_MODE: 'squidex.assets.list-view',
CONTENT_LANGUAGE: (schema: any) => `squidex.schemas.${schema}.language`,
DASHBOARD_CHART_STACKED: 'dashboard.charts.stacked',
DISABLE_ONBOARDING: (key: any) => `squidex.onboarding.disable.${key}`,
FIELD_ALL: (schema: any, field: any) => `squidex.schemas.${schema}.fields.${field}.show-all`,
FIELD_COLLAPSED: (schema: any, field: any) => `squidex.schemas.${schema}.fields.${field}.closed`,
HIDE_MAP: 'hideMap',
NEWS_VERSION: 'squidex.news.version',
NOTIFICATION_VERSION: 'notifications.version',
SCHEMA_CATEGORY_COLLAPSED: (category: any) => `squidex.schema.category.${category}.collapsed`,
SCHEMA_PREVIEW: (schema: any) => `squidex.schemas.${schema}.preview-button`,
SCHEMAS_COLLAPSED: 'content.schemas.collapsed',

8
frontend/src/app/shell/pages/internal/notifications-menu.component.ts

@ -8,9 +8,7 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { timer } from 'rxjs';
import { onErrorResumeNext, switchMap, tap } from 'rxjs/operators';
import { AuthService, CommentDto, CommentsService, CommentsState, DialogService, LocalStoreService, ModalModel, ResourceOwner, UIOptions } from '@app/shared';
const CONFIG_KEY = 'notifications.version';
import { AuthService, CommentDto, CommentsService, CommentsState, DialogService, LocalStoreService, ModalModel, ResourceOwner, Settings, UIOptions } from '@app/shared';
@Component({
selector: 'sqx-notifications-menu',
@ -44,7 +42,7 @@ export class NotificationsMenuComponent extends ResourceOwner implements OnInit
this.userToken = authService.user!.token;
this.versionRead = localStore.getInt(CONFIG_KEY, -1);
this.versionRead = localStore.getInt(Settings.Local.NOTIFICATION_VERSION, -1);
this.versionReceived = this.versionRead;
this.updateVersion();
@ -91,7 +89,7 @@ export class NotificationsMenuComponent extends ResourceOwner implements OnInit
if (this.modalMenu.isOpen) {
this.versionRead = this.versionReceived;
this.localStore.setInt(CONFIG_KEY, this.versionRead);
this.localStore.setInt(Settings.Local.NOTIFICATION_VERSION, this.versionRead);
}
}
}

Loading…
Cancel
Save