Skip to content

Commit ddcd244

Browse files
committed
Store max score to localstorage
1 parent 3f6a722 commit ddcd244

File tree

5 files changed

+57
-9
lines changed

5 files changed

+57
-9
lines changed
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div>
2-
<p>Score</p>
3-
<t-number [num]="points$ | async"></t-number>
1+
<div *ngIf="labelAndPoints$ | async as labelAndPoint">
2+
<p>{{ labelAndPoint.label }}</p>
3+
<t-number [num]="labelAndPoint.points"></t-number>
44
</div>
Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,43 @@
11
import { Component, OnInit } from '@angular/core';
22
import { TetrisQuery } from '@trungk18/state/tetris/tetris.query';
3-
import { Observable } from 'rxjs';
3+
import { Observable, of, timer } from 'rxjs';
4+
import { switchMap, map } from 'rxjs/operators';
5+
import { untilDestroyed, UntilDestroy } from '@ngneat/until-destroy';
46

7+
const REFRESH_LABEL_INTERVAL = 3000;
8+
@UntilDestroy()
59
@Component({
610
selector: 't-point',
711
templateUrl: './point.component.html',
812
styleUrls: ['./point.component.scss']
913
})
1014
export class PointComponent implements OnInit {
11-
points$: Observable<number>;
15+
labelAndPoints$: Observable<LabelAndNumber>;
1216
constructor(private _query: TetrisQuery) {}
1317

1418
ngOnInit(): void {
15-
this.points$ = this._query.points$;
19+
this.renderLabelAndPoints();
1620
}
21+
22+
private renderLabelAndPoints() {
23+
this.labelAndPoints$ = this._query.hasCurrent$.pipe(
24+
untilDestroyed(this),
25+
switchMap((hasCurrent) => {
26+
if (hasCurrent) {
27+
return of(new LabelAndNumber('Score', this._query.raw.points));
28+
}
29+
return timer(0, REFRESH_LABEL_INTERVAL).pipe(
30+
map((val) => {
31+
let isOdd = val % 2 === 0;
32+
let { points, max } = this._query.raw;
33+
return isOdd ? new LabelAndNumber('Score', points) : new LabelAndNumber('Max ', max);
34+
})
35+
);
36+
})
37+
);
38+
}
39+
}
40+
41+
class LabelAndNumber {
42+
constructor(public label: string, public points: number) {}
1743
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const ANGULAR_TETRIS_STORAGE_KEY = 'ANGULAR_TETRIS';
2+
export class LocalStorageService {
3+
constructor() {}
4+
5+
static setMaxPoint(max: number) {
6+
localStorage.setItem(ANGULAR_TETRIS_STORAGE_KEY, `${max}`);
7+
}
8+
9+
static get maxPoint(): number {
10+
let max = parseInt(localStorage.getItem(ANGULAR_TETRIS_STORAGE_KEY));
11+
return Number.isInteger(max) ? max : 0;
12+
}
13+
}

src/app/state/tetris/tetris.service.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { TetrisQuery } from './tetris.query';
1212
import { createInitialState, TetrisStore } from './tetris.store';
1313
import { Speed } from '@trungk18/interface/speed';
1414
import { SoundManagerService } from '@trungk18/services/sound-manager.service';
15+
import { LocalStorageService } from '@trungk18/services/local-storage.service';
1516

1617
@Injectable({ providedIn: 'root' })
1718
export class TetrisService {
@@ -136,7 +137,7 @@ export class TetrisService {
136137
return;
137138
}
138139
while (!this._isCollidesBottom) {
139-
this._clearPiece()
140+
this._clearPiece();
140141
this._setCurrentPiece(this._current.store());
141142
this._setCurrentPiece(this._current.moveDown());
142143
}
@@ -240,10 +241,15 @@ export class TetrisService {
240241
private _onGameOver() {
241242
this.pause();
242243
this._soundManager.gameOver();
244+
let { points, max } = this._query.raw;
245+
let maxPoint = Math.max(points, max);
243246
this._store.update({
244247
gameState: GameState.Over,
245-
current: null
248+
current: null,
249+
max: maxPoint,
250+
points: 0
246251
});
252+
LocalStorageService.setMaxPoint(maxPoint);
247253
}
248254

249255
private get _isCollidesBottom(): boolean {

src/app/state/tetris/tetris.store.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Piece } from '@trungk18/interface/piece/piece';
66
import { Tile } from '@trungk18/interface/tile/tile';
77
import { MatrixUtil } from '@trungk18/interface/utils/matrix';
88
import { Speed } from '@trungk18/interface/speed';
9+
import { LocalStorageService } from '@trungk18/services/local-storage.service';
910

1011
export interface TetrisState {
1112
matrix: Tile[];
@@ -19,6 +20,7 @@ export interface TetrisState {
1920
clearedLines: number;
2021
gameState: GameState;
2122
saved: TetrisState;
23+
max: number;
2224
}
2325

2426
export function createInitialState(pieceFactory: PieceFactory): TetrisState {
@@ -33,7 +35,8 @@ export function createInitialState(pieceFactory: PieceFactory): TetrisState {
3335
clearedLines: 0,
3436
speed: 1,
3537
gameState: GameState.Loading,
36-
saved: null
38+
saved: null,
39+
max: LocalStorageService.maxPoint
3740
};
3841
}
3942

0 commit comments

Comments
 (0)