Skip to content

Commit be89bc6

Browse files
committed
[DSC-1400] Add store support for multiple source
1 parent 9847bfc commit be89bc6

6 files changed

Lines changed: 187 additions & 168 deletions

File tree

Lines changed: 34 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
1-
import {createFeatureSelector, createSelector, MemoizedSelector} from '@ngrx/store';
2-
import {subStateSelector} from '../../shared/selector.util';
3-
import {openaireSelector, OpenaireState} from '../openaire.reducer';
1+
import { createSelector, MemoizedSelector } from '@ngrx/store';
2+
import { subStateSelector } from '../../shared/selector.util';
3+
import { openaireSelector, OpenaireState } from '../openaire.reducer';
44
import {
5-
OpenaireSuggestionTarget
5+
OpenaireSuggestionTarget
66
} from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
7-
import {SuggestionTargetState} from './suggestion-targets/suggestion-targets.reducer';
8-
9-
/**
10-
* Returns the Reciter Suggestion Target state.
11-
* @function _getReciterSuggestionTargetState
12-
* @param {AppState} state Top level state.
13-
* @return {OpenaireState}
14-
*/
15-
const _getReciterSuggestionTargetState = createFeatureSelector<OpenaireState>('openaire');
7+
import { SuggestionTargetEntry, SuggestionTargetState } from './suggestion-targets/suggestion-targets.reducer';
168

179
// Reciter Suggestion Targets
1810
// ----------------------------------------------------------------------------
@@ -27,13 +19,21 @@ export function reciterSuggestionTargetStateSelector(): MemoizedSelector<Openair
2719
}
2820

2921
/**
30-
* Returns the Reciter Suggestion Targets list.
22+
* Returns the Reciter Suggestion source state
23+
* @function reciterSuggestionTargetObjectSelector
24+
* @return {SuggestionTargetEntry}
25+
*/
26+
export function reciterSuggestionSourceSelector(source: string): MemoizedSelector<OpenaireState, SuggestionTargetEntry> {
27+
return createSelector(reciterSuggestionTargetStateSelector(),(state: SuggestionTargetState) => state.sources[source]);
28+
}
29+
30+
/**
31+
* Returns the Reciter Suggestion Targets list by source.
3132
* @function reciterSuggestionTargetObjectSelector
32-
* @return {OpenaireReciterSuggestionTarget[]}
33+
* @return {OpenaireSuggestionTarget[]}
3334
*/
3435
export function reciterSuggestionTargetObjectSelector(source: string): MemoizedSelector<OpenaireState, OpenaireSuggestionTarget[]> {
35-
return createSelector(reciterSuggestionTargetStateSelector(),
36-
(state: SuggestionTargetState) => state[source]?.targets);
36+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state.targets);
3737
}
3838

3939
/**
@@ -42,10 +42,7 @@ export function reciterSuggestionTargetObjectSelector(source: string): MemoizedS
4242
* @return {boolean}
4343
*/
4444
export const isReciterSuggestionTargetLoadedSelector = (source: string) => {
45-
return createSelector(_getReciterSuggestionTargetState, (state: OpenaireState) => {
46-
const loaded = state.suggestionTarget[source]?.loaded;
47-
return loaded || false;
48-
});
45+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.loaded || false);
4946
};
5047

5148
/**
@@ -54,62 +51,50 @@ export const isReciterSuggestionTargetLoadedSelector = (source: string) => {
5451
* @return {boolean}
5552
*/
5653
export const isreciterSuggestionTargetProcessingSelector = (source: string) => {
57-
return createSelector(_getReciterSuggestionTargetState, (state: OpenaireState) => {
58-
const processing = state.suggestionTarget[source]?.processing;
59-
return processing || false;
60-
});
54+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.processing || false);
6155
};
6256

6357
/**
6458
* Returns the total available pages of Reciter Suggestion Targets.
6559
* @function getreciterSuggestionTargetTotalPagesSelector
6660
* @return {number}
6761
*/
68-
export const getreciterSuggestionTargetTotalPagesSelector = (source: string) => {
69-
return createSelector(_getReciterSuggestionTargetState, (state: OpenaireState) => state.suggestionTarget[source]?.totalPages);
62+
export const getReciterSuggestionTargetTotalPagesSelector = (source: string) => {
63+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.totalPages || 0);
7064
};
7165

7266
/**
7367
* Returns the current page of Reciter Suggestion Targets.
74-
* @function getreciterSuggestionTargetCurrentPageSelector
68+
* @function getReciterSuggestionTargetCurrentPageSelector
7569
* @return {number}
7670
*/
77-
export const getreciterSuggestionTargetCurrentPageSelector = (source: string) => {
78-
return createSelector(_getReciterSuggestionTargetState, (state: OpenaireState) => state.suggestionTarget[source]?.currentPage);
71+
export const getReciterSuggestionTargetCurrentPageSelector = (source: string) => {
72+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.currentPage || 0);
7973
};
8074

8175
/**
8276
* Returns the total number of Reciter Suggestion Targets.
83-
* @function getreciterSuggestionTargetTotalsSelector
77+
* @function getReciterSuggestionTargetTotalsSelector
8478
* @return {number}
8579
*/
86-
export const getreciterSuggestionTargetTotalsSelector = (source: string) => {
87-
return createSelector(_getReciterSuggestionTargetState, (state: OpenaireState) => state.suggestionTarget[source]?.totalElements);
80+
export const getReciterSuggestionTargetTotalsSelector = (source: string) => {
81+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.totalElements || 0);
8882
};
8983

9084
/**
9185
* Returns Suggestion Targets for the current user.
9286
* @function getCurrentUserReciterSuggestionTargetSelector
9387
* @return {OpenaireSuggestionTarget[]}
9488
*/
95-
export const getCurrentUserSuggestionTargetsSelector = createSelector(_getReciterSuggestionTargetState,
96-
(state: OpenaireState) => {
97-
const suggestionTargetValues = Object.values(state.suggestionTarget);
98-
return suggestionTargetValues.reduce(
99-
(acc, entry) => acc.concat(entry?.currentUserTargets || []),
100-
[]);
101-
}
102-
);
89+
export const getCurrentUserSuggestionTargetsSelector = () => {
90+
return createSelector(reciterSuggestionTargetStateSelector(), (state: SuggestionTargetState) => state?.currentUserTargets || []);
91+
};
10392

10493
/**
105-
* Returns whether or not the user has consulted their suggestions
94+
* Returns whether the user has consulted their suggestions
10695
* @function getCurrentUserReciterSuggestionTargetSelector
10796
* @return {boolean}
10897
*/
109-
export const getCurrentUserSuggestionTargetsVisitedSelector = createSelector(_getReciterSuggestionTargetState,
110-
(state: OpenaireState) => {
111-
const suggestionTargetValues = Object.values(state.suggestionTarget);
112-
return suggestionTargetValues.some(
113-
(entry) => entry?.currentUserTargetsVisited === true);
114-
}
115-
);
98+
export const getCurrentUserSuggestionTargetsVisitedSelector = () => {
99+
return createSelector(reciterSuggestionTargetStateSelector(), (state: SuggestionTargetState) => state?.currentUserTargetsVisited || false);
100+
};

src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import { Action } from '@ngrx/store';
44
import { type } from '../../../shared/ngrx/type';
5-
import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
5+
import {
6+
OpenaireSuggestionTarget
7+
} from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
68

79
/**
8-
* For each action type in an action group, make a simple
10+
* For each action type in A action group, make a simple
911
* enum object for all of this group's action types.
1012
*
1113
* The 'type' utility function coerces strings into string
@@ -23,7 +25,7 @@ export const SuggestionTargetActionTypes = {
2325
};
2426

2527
/**
26-
* An ngrx action to retrieve all the Suggestion Targets.
28+
* A ngrx action to retrieve all the Suggestion Targets.
2729
*/
2830
export class RetrieveTargetsBySourceAction implements Action {
2931
type = SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE;
@@ -53,18 +55,34 @@ export class RetrieveTargetsBySourceAction implements Action {
5355
}
5456

5557
/**
56-
* An ngrx action for retrieving 'all Suggestion Targets' error.
58+
* A ngrx action for notifying error.
5759
*/
58-
export class RetrieveAllTargetsErrorAction implements Action {
60+
export class RetrieveTargetsBySourceErrorAction implements Action {
5961
type = SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE_ERROR;
62+
payload: {
63+
source: string;
64+
};
65+
66+
/**
67+
* Create a new RetrieveTargetsBySourceAction.
68+
*
69+
* @param source
70+
* the source for which to retrieve suggestion targets
71+
*/
72+
constructor(source: string) {
73+
this.payload = {
74+
source
75+
};
76+
}
6077
}
6178

6279
/**
63-
* An ngrx action to load the Suggestion Target objects.
80+
* A ngrx action to load the Suggestion Target objects.
6481
*/
6582
export class AddTargetAction implements Action {
6683
type = SuggestionTargetActionTypes.ADD_TARGETS;
6784
payload: {
85+
source: string;
6886
targets: OpenaireSuggestionTarget[];
6987
totalPages: number;
7088
currentPage: number;
@@ -74,6 +92,8 @@ export class AddTargetAction implements Action {
7492
/**
7593
* Create a new AddTargetAction.
7694
*
95+
* @param source
96+
* the source of suggestion targets
7797
* @param targets
7898
* the list of targets
7999
* @param totalPages
@@ -83,8 +103,9 @@ export class AddTargetAction implements Action {
83103
* @param totalElements
84104
* the total available Suggestion Targets
85105
*/
86-
constructor(targets: OpenaireSuggestionTarget[], totalPages: number, currentPage: number, totalElements: number) {
106+
constructor(source: string, targets: OpenaireSuggestionTarget[], totalPages: number, currentPage: number, totalElements: number) {
87107
this.payload = {
108+
source,
88109
targets,
89110
totalPages,
90111
currentPage,
@@ -95,7 +116,7 @@ export class AddTargetAction implements Action {
95116
}
96117

97118
/**
98-
* An ngrx action to load the user Suggestion Target object.
119+
* A ngrx action to load the user Suggestion Target object.
99120
* Called by the ??? effect.
100121
*/
101122
export class AddUserSuggestionsAction implements Action {
@@ -117,26 +138,41 @@ export class AddUserSuggestionsAction implements Action {
117138
}
118139

119140
/**
120-
* An ngrx action to reload the user Suggestion Target object.
141+
* A ngrx action to reload the user Suggestion Target object.
121142
* Called by the ??? effect.
122143
*/
123144
export class RefreshUserSuggestionsAction implements Action {
124145
type = SuggestionTargetActionTypes.REFRESH_USER_SUGGESTIONS;
125146
}
126147

127148
/**
128-
* An ngrx action to Mark User Suggestions As Visited.
149+
* A ngrx action to Mark User Suggestions As Visited.
129150
* Called by the ??? effect.
130151
*/
131152
export class MarkUserSuggestionsAsVisitedAction implements Action {
132153
type = SuggestionTargetActionTypes.MARK_USER_SUGGESTIONS_AS_VISITED;
133154
}
134155

135156
/**
136-
* An ngrx action to clear targets state.
157+
* A ngrx action to clear targets state.
137158
*/
138159
export class ClearSuggestionTargetsAction implements Action {
139160
type = SuggestionTargetActionTypes.CLEAR_TARGETS;
161+
payload: {
162+
source: string;
163+
};
164+
165+
/**
166+
* Create a new ClearSuggestionTargetsAction.
167+
*
168+
* @param source
169+
* the source of suggestion targets
170+
*/
171+
constructor(source: string) {
172+
this.payload = {
173+
source
174+
};
175+
}
140176
}
141177

142178
/**
@@ -149,4 +185,4 @@ export type SuggestionTargetsActions
149185
| ClearSuggestionTargetsAction
150186
| MarkUserSuggestionsAsVisitedAction
151187
| RetrieveTargetsBySourceAction
152-
| RetrieveAllTargetsErrorAction;
188+
| RetrieveTargetsBySourceErrorAction;

src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { Component, Input, OnInit } from '@angular/core';
1+
import { AfterViewInit, Component, Input, OnDestroy, OnInit } from '@angular/core';
22
import { Router } from '@angular/router';
33

44
import { Observable, Subscription } from 'rxjs';
55
import { distinctUntilChanged, take } from 'rxjs/operators';
66

7-
import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
7+
import {
8+
OpenaireSuggestionTarget
9+
} from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
810
import { hasValue } from '../../../shared/empty.util';
911
import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
1012
import { SuggestionTargetsStateService } from './suggestion-targets.state.service';
@@ -21,7 +23,7 @@ import { UUIDService } from '../../../core/shared/uuid.service';
2123
templateUrl: './suggestion-targets.component.html',
2224
styleUrls: ['./suggestion-targets.component.scss'],
2325
})
24-
export class SuggestionTargetsComponent implements OnInit {
26+
export class SuggestionTargetsComponent implements AfterViewInit, OnInit, OnDestroy {
2527

2628
/**
2729
* The source for which to list targets
@@ -125,7 +127,7 @@ export class SuggestionTargetsComponent implements OnInit {
125127
* Unsubscribe from all subscriptions.
126128
*/
127129
ngOnDestroy(): void {
128-
this.suggestionTargetsStateService.dispatchClearSuggestionTargetsAction();
130+
this.suggestionTargetsStateService.dispatchClearSuggestionTargetsAction(this.source);
129131
this.subs
130132
.filter((sub) => hasValue(sub))
131133
.forEach((sub) => sub.unsubscribe());

src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.effects.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import {
1010
AddTargetAction,
1111
AddUserSuggestionsAction,
1212
RefreshUserSuggestionsAction,
13-
RetrieveAllTargetsErrorAction,
1413
RetrieveTargetsBySourceAction,
14+
RetrieveTargetsBySourceErrorAction,
1515
SuggestionTargetActionTypes,
1616
} from './suggestion-targets.actions';
1717
import { PaginatedList } from '../../../core/data/paginated-list.model';
@@ -41,13 +41,13 @@ export class SuggestionTargetsEffects {
4141
action.payload.currentPage
4242
).pipe(
4343
map((targets: PaginatedList<OpenaireSuggestionTarget>) =>
44-
new AddTargetAction(targets.page, targets.totalPages, targets.currentPage, targets.totalElements)
44+
new AddTargetAction(action.payload.source, targets.page, targets.totalPages, targets.currentPage, targets.totalElements)
4545
),
4646
catchError((error: Error) => {
4747
if (error) {
4848
console.error(error.message);
4949
}
50-
return of(new RetrieveAllTargetsErrorAction());
50+
return of(new RetrieveTargetsBySourceErrorAction(action.payload.source));
5151
})
5252
);
5353
})

0 commit comments

Comments
 (0)