Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding "Reveal" button #18

Closed
wants to merge 16 commits into from
Prev Previous commit
Next Next commit
adding point counters
  • Loading branch information
tarrball committed Jun 24, 2023
commit 596d6b522275eba7bcd4de913b0603a1683455d0
7 changes: 6 additions & 1 deletion src/app/1. features/game/game.component.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
<div class="container">
<div>Points: {{ earnedPoints$ | async }}</div>
<div>Total Points: {{ potentialPoints$ | async }}</div>
</div>

<div class="container answer-container">
<div class="word" *ngFor="let answer of answers$ | async" [id]="answer.word">
<span class="letter" *ngFor="let letter of answer.letters">
{{ answer.isRevealed ? letter : "_" }}
{{ answer.isFound ? letter : "_" }}
</span>
</div>
</div>
Expand Down
6 changes: 6 additions & 0 deletions src/app/1. features/game/game.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import {
selectAnswers,
selectClickableLetters,
selectClickedLetters,
selectEarnedPoints,
selectMostRecentAnswer,
selectPotentialPoints,
} from 'src/app/2. store/game/game.selectors';
import { Answer, Letter } from 'src/app/2. store/game/game.state';

Expand All @@ -23,11 +25,15 @@ export class GameComponent implements OnInit {
public answers$: Observable<Answer[]>;
public clickableLetters$: Observable<Letter[]>;
public clickedLetters$: Observable<Letter[]>;
public earnedPoints$: Observable<number>;
public potentialPoints$: Observable<number>;

constructor(private readonly store: Store) {
this.answers$ = this.store.select(selectAnswers);
this.clickableLetters$ = this.store.select(selectClickableLetters);
this.clickedLetters$ = this.store.select(selectClickedLetters);
this.earnedPoints$ = this.store.select(selectEarnedPoints);
this.potentialPoints$ = this.store.select(selectPotentialPoints);
}

public ngOnInit(): void {
Expand Down
4 changes: 2 additions & 2 deletions src/app/2. store/game/game.reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const gameReducer = createReducer(
// TODO a bit of redundancy here
word: answer,
letters: Array.from(answer),
isRevealed: false,
isFound: false,
}));

draft.scrambedLetters = Array.from(word).map((letter, index) => ({
Expand Down Expand Up @@ -62,7 +62,7 @@ export const gameReducer = createReducer(
);

if (matchingAnswer) {
matchingAnswer.isRevealed = true;
matchingAnswer.isFound = true;
draft.mostRecentAnswer = submittedWord;
}

Expand Down
19 changes: 18 additions & 1 deletion src/app/2. store/game/game.selectors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { createFeatureSelector, createSelector } from '@ngrx/store';
import { GameState } from './game.state';

const PointsPerLetter = 10;

export const selectFeature = createFeatureSelector<GameState>('game');

export const selectAnswers = createSelector(
Expand All @@ -13,10 +15,25 @@ export const selectClickableLetters = createSelector(selectFeature, (state) =>
);

export const selectClickedLetters = createSelector(selectFeature, (state) =>
state.scrambedLetters.filter((letter) => letter.typedIndex !== undefined)
state.scrambedLetters
.filter((letter) => letter.typedIndex !== undefined)
.sort((a, b) => a.typedIndex! - b.typedIndex!)
);

export const selectMostRecentAnswer = createSelector(
selectFeature,
(state) => state.mostRecentAnswer
);

export const selectEarnedPoints = createSelector(selectAnswers, (answers) =>
answers
.filter((answer) => answer.isFound)
.reduce((acc, answer) => acc + answer.letters.length * PointsPerLetter, 0)
);

export const selectPotentialPoints = createSelector(selectAnswers, (answers) =>
answers.reduce(
(acc, answer) => acc + answer.letters.length * PointsPerLetter,
0
)
);
2 changes: 1 addition & 1 deletion src/app/2. store/game/game.state.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
export interface Answer {
word: string;
letters: string[];
isRevealed: boolean;
isFound: boolean;
}

export interface Letter {
Expand Down