diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.html b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.html index 59ac6f3..9f07043 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.html +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/registration/registration.component.html @@ -1,6 +1,6 @@
- arrow_back + arrow_back
Create an Account
diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.css b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.css index ccf116c..41aa481 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.css +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.css @@ -47,10 +47,6 @@ input { font-size: 20px; } -.align-to-right { - text-align: right; -} - @media (max-width: 400px) { .container { margin-left: 0%; diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.html b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.html index 178319d..5eae2cc 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.html +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.html @@ -1,21 +1,15 @@
- arrow_back + arrow_back
Select character
- + - Oweja - arrow_forward + + account_circle +
{{character.name}}
+ arrow_forward +
{{character.className}} level: {{character.level}}
+
- - James - arrow_forward - - - Legolas - arrow_forward - - -
- +
diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.ts index 2409f57..bb796df 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/select-character/select-character.component.ts @@ -1,30 +1,49 @@ -import { Component } from '@angular/core'; +import {Component, OnInit} from '@angular/core'; import { Router } from '@angular/router'; +import {first} from 'rxjs/operators'; +import {ClearUserId} from '../../store/actions/app.actions'; +import {ErrorResponse} from '../../../types/ErrorResponse'; +import {HttpErrorResponse} from '@angular/common/http'; +import {Store} from '@ngrx/store'; +import {AppState} from '../../store/models/app-state.model'; +import {CharacterService} from '../../../services/character.service'; +import {CharacterForLoginViewModel} from '../../../types/viewmodels/character-viewmodels/CharacterForLoginViewModel'; +import {AddCharacterId} from '../../store/actions/player.action'; @Component({ selector: 'app-select-character', templateUrl: './select-character.component.html', styleUrls: ['./select-character.component.css'] }) -export class SelectCharacterComponent { - isExpanded = false; +export class SelectCharacterComponent implements OnInit { + charactersList: CharacterForLoginViewModel[]; - collapse() { - this.isExpanded = false; + constructor(private router: Router, private store: Store, private characterService: CharacterService) {} + + ngOnInit() { + this.getUserCharactersList(); } - toggle() { - this.isExpanded = !this.isExpanded; + getUserCharactersList() { + this.store.select(s => s.appStore.userId).pipe(first()).subscribe((userId) => { + this.characterService.getUserCharactersList(userId).pipe(first()).subscribe((charactersList) => { + this.charactersList = charactersList; + }, (error: ErrorResponse | HttpErrorResponse) => { + if (error instanceof HttpErrorResponse) { + error = error.error as ErrorResponse; + } + console.error(error.message); + } ); + }); } - constructor(private router: Router) {} - - onCharacterClick(){ - this.router.navigate(['player']) + onCharacterClick(characterId: number) { + this.store.dispatch(new AddCharacterId({characterId})); + this.router.navigate(['player']); } - onArrowBackClick(){ - this.router.navigate(['login']) + onArrowBackClick() { + this.store.dispatch(new ClearUserId()); + this.router.navigate(['login']); } } - diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.html b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.html index 4e5cc02..6eede7b 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.html +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.html @@ -1,6 +1,6 @@
- arrow_back + arrow_back
Sign In
diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.ts index 9f2734b..1bf5263 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/components/sign-in/sign-in.component.ts @@ -9,6 +9,7 @@ import {AppStoreModel} from '../../store/models/app-store.model'; import {select, Store} from '@ngrx/store'; import {AddUserId} from '../../store/actions/app.actions'; import {AppState} from 'src/app/store/models/app-state.model'; +import {first} from "rxjs/operators"; @Component({ selector: 'app-sign-in', @@ -43,9 +44,9 @@ export class SignInComponent implements OnDestroy, OnInit { onLoginButtonClick() { let role = ''; - this.store.select(s => s.appStore.role).subscribe((v) => { + this.store.select(s => s.appStore.role).pipe(first()).subscribe((v) => { role = v; - }).unsubscribe(); + }); this.allSubscriptions.add( this.userService.tryLogin( this.signInFormGroup.get('signIn').value['username'], diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/reducers/index.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/reducers/index.ts deleted file mode 100644 index 4f57bb0..0000000 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/reducers/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { - ActionReducer, - ActionReducerMap, - createFeatureSelector, - createSelector, - MetaReducer -} from '@ngrx/store'; -import { environment } from '../../environments/environment'; - -export interface State { - -} - -export const reducers: ActionReducerMap = { - -}; - - -export const metaReducers: MetaReducer[] = !environment.production ? [] : []; diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/store/actions/app.actions.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/actions/app.actions.ts index 4b2b34b..362b983 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/store/actions/app.actions.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/actions/app.actions.ts @@ -1,9 +1,9 @@ -import {AppStoreModel} from '../models/app-store.model'; -import { Action } from '@ngrx/store'; +import {Action} from '@ngrx/store'; export enum AppActionTypes { ADD_USER_ID = '[APP] Add user id', - ADD_ROLE = '[APP] Add role' + ADD_ROLE = '[APP] Add role', + CLEAR_USER_ID = '[APP] Clear user id' } export class AddUserId implements Action { @@ -20,4 +20,13 @@ export class AddRole implements Action { } } -export type AppAction = AddUserId | AddRole; +export class ClearUserId implements Action { + readonly type = AppActionTypes.CLEAR_USER_ID; + + constructor() { + } +} + + + +export type AppAction = AddUserId | AddRole | ClearUserId; diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/store/actions/player.action.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/actions/player.action.ts new file mode 100644 index 0000000..45c74d8 --- /dev/null +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/actions/player.action.ts @@ -0,0 +1,15 @@ +import {Action} from "@ngrx/store"; + +export enum PlayerActionTypes { + ADD_CHARACTER_ID= '[PLAYER] Add character id' +} + +export class AddCharacterId implements Action { + readonly type = PlayerActionTypes.ADD_CHARACTER_ID; + + constructor(public payload: {characterId: number}) { + + } +} + +export type PlayerAction = AddCharacterId; diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/store/models/app-state.model.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/models/app-state.model.ts index 8d87023..fe999ff 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/store/models/app-state.model.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/models/app-state.model.ts @@ -1,11 +1,15 @@ import {AppStoreModel} from './app-store.model'; import {ActionReducerMap} from '@ngrx/store'; import {AppReducer} from '../reducers/app.reducer'; +import {PlayerStoreModel} from './player-store.model'; +import {PlayerReducer} from '../reducers/player.reducer'; export interface AppState { appStore: AppStoreModel; + playerStore: PlayerStoreModel; } export const reducers: ActionReducerMap = { appStore: AppReducer, + playerStore: PlayerReducer, }; diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/store/models/player-store.model.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/models/player-store.model.ts new file mode 100644 index 0000000..8cc606f --- /dev/null +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/models/player-store.model.ts @@ -0,0 +1,3 @@ +export interface PlayerStoreModel { + characterId: number; +} diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/store/reducers/app.reducer.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/reducers/app.reducer.ts index 777c63a..d86c636 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/app/store/reducers/app.reducer.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/reducers/app.reducer.ts @@ -12,6 +12,8 @@ export function AppReducer(state: AppStoreModel = initialState, action: AppActio return {...state, userId: action.payload.userId}; case AppActionTypes.ADD_ROLE: return {...state, role: action.payload.role}; + case AppActionTypes.CLEAR_USER_ID: + return {...state, userId: null}; default: return state; } diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/app/store/reducers/player.reducer.ts b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/reducers/player.reducer.ts new file mode 100644 index 0000000..3077834 --- /dev/null +++ b/SessionCompanion/SessionCompanion/ClientApp/src/app/store/reducers/player.reducer.ts @@ -0,0 +1,15 @@ +import {PlayerStoreModel} from '../models/player-store.model'; +import {PlayerAction, PlayerActionTypes} from '../actions/player.action'; + +const initialState: PlayerStoreModel = { + characterId: null +}; + +export function PlayerReducer(state: PlayerStoreModel = initialState, action: PlayerAction) { + switch (action.type) { + case PlayerActionTypes.ADD_CHARACTER_ID: + return {...state, characterId: action.payload.characterId}; + default: + return state; + } +} diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/services/character.service.ts b/SessionCompanion/SessionCompanion/ClientApp/src/services/character.service.ts index ea14dc8..c390a44 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/services/character.service.ts +++ b/SessionCompanion/SessionCompanion/ClientApp/src/services/character.service.ts @@ -1,8 +1,9 @@ import {Inject, Injectable} from '@angular/core'; -import {HttpClient} from '@angular/common/http'; +import {HttpClient, HttpParams} from '@angular/common/http'; import {Observable, of, throwError} from 'rxjs'; import {ErrorResponse} from '../types/ErrorResponse'; import {Either} from '../types/Either'; +import {CharacterForLoginViewModel} from '../types/viewmodels/character-viewmodels/CharacterForLoginViewModel'; import {switchMap, retry} from 'rxjs/operators'; import {LoggedCharactersViewModel} from '../types/viewmodels/character-viewmodels/LoggedCharactersViewModel'; @@ -27,4 +28,17 @@ export class CharacterService { retry(3) ); } + + getUserCharactersList(userId: number): Observable { + const params = new HttpParams().set('userId', userId.toString()) + return this.http.get>(this.baseUrl + 'userCharactersList', {params}).pipe( + switchMap(response => { + if (response.isLeft) { + return of(response.left); + } else { + return throwError(response.right); + } + }) + ); + } } diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/styles.css b/SessionCompanion/SessionCompanion/ClientApp/src/styles.css index bd973fd..311e04a 100644 --- a/SessionCompanion/SessionCompanion/ClientApp/src/styles.css +++ b/SessionCompanion/SessionCompanion/ClientApp/src/styles.css @@ -73,6 +73,10 @@ mat-divider { border-top-color: #e9cca7 !important; } +.arrow-select { + cursor: pointer; +} + html, body { height: 100%; diff --git a/SessionCompanion/SessionCompanion/ClientApp/src/types/viewmodels/character-viewmodels/CharacterForLoginViewModel.ts b/SessionCompanion/SessionCompanion/ClientApp/src/types/viewmodels/character-viewmodels/CharacterForLoginViewModel.ts new file mode 100644 index 0000000..fa9c0d8 --- /dev/null +++ b/SessionCompanion/SessionCompanion/ClientApp/src/types/viewmodels/character-viewmodels/CharacterForLoginViewModel.ts @@ -0,0 +1,7 @@ +export interface CharacterForLoginViewModel { + id: number; + userId: number; + name: string; + className: string; + level: number; +}