Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions frontend/libs/search/search-data-access/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
export * from "./lib/search-data-access.module";
export * from "./lib/providers/character.service";
export * from "./lib/interfaces/character.interface";
export * from "./lib/+state/search.effects";
export * from "./lib/+state/search.reducer";
export * from "./lib/+state/search.actions";
export * from "./lib/+state/search.selectors";
export * from "./lib/+state/search.facades";
export * from "./lib/+state/search/search.actions";
export * from "./lib/+state/search/search.reducer";
export * from "./lib/+state/search/search.selectors";
export * from "./lib/+state/search/search.facades";
export * from "./lib/+state/search/search.effects";
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import {createAction, props} from "@ngrx/store";
import {Character} from "../../interfaces/character.interface";

export const addFavorite = createAction(
"[Favorite] Add Favorite",
props<{character: Character}>()
);

export const removeFavorite = createAction(
"[Favorite] Remove Favorite",
props<{character: Character}>()
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import {Store} from "@ngrx/store";
import {FavoriteState} from "../../interfaces/favorite.interface";
import {addFavorite, removeFavorite} from "./favorite.actions";
import {Injectable} from "@angular/core";
import {Character} from "../../interfaces/character.interface";
import {Observable} from "rxjs";
import {selectFavorites} from "./favorite.selectors";

@Injectable({
providedIn: "root",
})
export class FavoriteFacade {
constructor(private readonly store: Store<FavoriteState>) {}

public addFavorite(character: Character) {
this.store.dispatch(addFavorite({character}));
}

public removeFavorite(character: Character) {
this.store.dispatch(removeFavorite({character}));
}

public get favorites$(): Observable<Character[]> {
return this.store.select(selectFavorites);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import {createReducer, on} from "@ngrx/store";
import {initialState} from "../../interfaces/favorite.interface";
import {addFavorite, removeFavorite} from "./favorite.actions";
import {createEntityAdapter} from "@ngrx/entity";
import {Character} from "../../interfaces/character.interface";

export const favoriteFeatureKey = "favorite";

export const favoriteAdapter = createEntityAdapter<Character>({
selectId: (character: Character) => character.id,
sortComparer: (a: Character, b: Character) => a.id - b.id,
});

export const favoriteReducer = createReducer(
favoriteAdapter.getInitialState(initialState),
on(addFavorite, (state, {character}) =>
favoriteAdapter.addOne(character, state)
),
on(removeFavorite, (state, {character}) =>
favoriteAdapter.removeOne(character.id, state)
)
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import {createFeatureSelector} from "@ngrx/store";
import {FavoriteState} from "../../interfaces/favorite.interface";
import {favoriteAdapter, favoriteFeatureKey} from "./favorite.reducer";

export const selectFavoriteState =
createFeatureSelector<FavoriteState>(favoriteFeatureKey);

export const {
selectAll: selectAllCharacters,
selectEntities: selectCharacterEntities,
selectIds: selectCharacterIds,
selectTotal: selectCharacterTotal,
} = favoriteAdapter.getSelectors(selectFavoriteState);

export const selectFavorites = selectAllCharacters;
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
Character,
CharacterFilter,
CharacterPagination,
} from "../interfaces/character.interface";
} from "../../interfaces/character.interface";

export const loadCharacters = createAction(
"[Search] Load Characters",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {inject} from "@angular/core";
import {Actions, createEffect, ofType} from "@ngrx/effects";
import {CharacterService} from "../providers/character.service";
import {CharacterService} from "../../providers/character.service";
import * as SearchActions from "./search.actions";
import {catchError, map, of, switchMap} from "rxjs";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {
Character,
CharacterFilter,
CharacterPagination,
} from "../interfaces/character.interface";
} from "../../interfaces/character.interface";
import {loadCharacters, updateFilter} from "./search.actions";
import {Injectable} from "@angular/core";
import {selectSearchResults, selectSearchState} from "./search.selectors";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {createReducer, on} from "@ngrx/store";
import {Character} from "../interfaces/character.interface";
import {Character} from "../../interfaces/character.interface";
import * as SearchActions from "./search.actions";
import {createEntityAdapter, EntityState} from "@ngrx/entity";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import {EntityState} from "@ngrx/entity";

export interface CharacterResponse {
info: CharacterInfo;
results: Character[];
Expand All @@ -12,20 +10,19 @@ export interface Character {
species: string;
type: string;
gender: string;
origin: {
name: string;
url: string;
};
location: {
name: string;
url: string;
};
origin: Location;
location: Location;
image: string;
episode: string[];
url: string;
created: string;
}

export interface Location {
name: string;
url: string;
}

export interface CharacterFilter {
searchQuery: string | undefined;
gender: string | undefined;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {Character} from "./character.interface";
import {EntityState} from "@ngrx/entity";

export interface FavoriteState extends EntityState<Character> {
loading: boolean;
}

export const initialState: FavoriteState = {
ids: [],
entities: {},
loading: false,
};

Loading