Skip to content

Commit 7a48c80

Browse files
committed
Merge pull request #516 from dvargas46/bugfix/511/run-change-hours-outside-zone
fix(change-hours): run change hours interval outside of angular zone
2 parents c4dfda6 + 39ca01a commit 7a48c80

File tree

4 files changed

+22
-16
lines changed

4 files changed

+22
-16
lines changed

projects/angular-ngrx-material-starter/e2e/protractor.conf.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const { SpecReporter } = require('jasmine-spec-reporter');
99
*/
1010
exports.config = {
1111
allScriptsTimeout: 11000,
12-
specs: ['./src/setup.ts', './src/**/*.e2e-spec.ts'],
12+
specs: ['./src/**/*.e2e-spec.ts'],
1313
capabilities: {
1414
browserName: 'chrome',
1515
chromeOptions: {

projects/angular-ngrx-material-starter/e2e/src/setup.ts

-3
This file was deleted.

projects/angular-ngrx-material-starter/src/app/core/settings/settings.effects.spec.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Actions, getEffectsMetadata } from '@ngrx/effects';
55
import { TestScheduler } from 'rxjs/testing';
66
import { Store } from '@ngrx/store';
77
import { of } from 'rxjs';
8+
import { NgZone } from '@angular/core';
89

910
import {
1011
AnimationsService,
@@ -29,6 +30,7 @@ describe('SettingsEffects', () => {
2930
let animationsService: jasmine.SpyObj<AnimationsService>;
3031
let translateService: jasmine.SpyObj<TranslateService>;
3132
let store: jasmine.SpyObj<Store<AppState>>;
33+
let ngZone: jasmine.SpyObj<NgZone>;
3234

3335
beforeEach(() => {
3436
router = {
@@ -51,6 +53,8 @@ describe('SettingsEffects', () => {
5153
]);
5254
translateService = jasmine.createSpyObj('TranslateService', ['use']);
5355
store = jasmine.createSpyObj('store', ['pipe']);
56+
ngZone = jasmine.createSpyObj('mockNgZone', ['run', 'runOutsideAngular']);
57+
ngZone.run.and.callFake(fn => fn());
5458
});
5559

5660
it('should call methods on LocalStorageService for PERSIST action', () => {
@@ -80,7 +84,8 @@ describe('SettingsEffects', () => {
8084
localStorageService,
8185
titleService,
8286
animationsService,
83-
translateService
87+
translateService,
88+
ngZone
8489
);
8590

8691
effect.persistSettings.subscribe(() => {

projects/angular-ngrx-material-starter/src/app/core/settings/settings.effects.ts

+15-11
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import { ActivationEnd, Router } from '@angular/router';
2-
import { Injectable } from '@angular/core';
2+
import { Injectable, NgZone } from '@angular/core';
33
import { OverlayContainer } from '@angular/cdk/overlay';
44
import { select, Store } from '@ngrx/store';
55
import { Actions, createEffect, ofType } from '@ngrx/effects';
66
import { TranslateService } from '@ngx-translate/core';
7-
import { combineLatest, interval, merge, of } from 'rxjs';
7+
import { combineLatest, merge, of } from 'rxjs';
88
import {
99
tap,
1010
withLatestFrom,
11-
map,
1211
distinctUntilChanged,
13-
mapTo,
1412
filter
1513
} from 'rxjs/operators';
1614

@@ -51,15 +49,21 @@ export class SettingsEffects {
5149
private localStorageService: LocalStorageService,
5250
private titleService: TitleService,
5351
private animationsService: AnimationsService,
54-
private translateService: TranslateService
52+
private translateService: TranslateService,
53+
private ngZone: NgZone
5554
) {}
5655

57-
changeHour = createEffect(() =>
58-
interval(60_000).pipe(
59-
mapTo(new Date().getHours()),
60-
distinctUntilChanged(),
61-
map(hour => actionSettingsChangeHour({ hour }))
62-
)
56+
hour = 0;
57+
changeHour = this.ngZone.runOutsideAngular(() =>
58+
setInterval(() => {
59+
const hour = new Date().getHours();
60+
if (hour !== this.hour) {
61+
this.hour = hour;
62+
this.ngZone.run(() =>
63+
this.store.dispatch(actionSettingsChangeHour({ hour }))
64+
);
65+
}
66+
}, 60_000)
6367
);
6468

6569
persistSettings = createEffect(

0 commit comments

Comments
 (0)