Newer
Older
import { ActionReducer, ReducerTypes, createReducer, on } from '@ngrx/store';
import {
createEmptyStateResource,
createErrorStateResource,
createStateResource,
} from '../resource/resource.util';
import {
LoadResourceFailureProps,
LoadResourceSuccessProps,
SingleResourceLoadActions,
} from './actions';
import {
ApiSingleResourceState,
SingleResourceState,
initialApiResourceState,
initialResourceState,
} from './state.model';
export class SingleResourceReducer {
public reducer: ActionReducer<SingleResourceState>;
protected loadActionReducerType: ReducerTypes<SingleResourceState, any>;
protected loadSuccessActionReducerType: ReducerTypes<SingleResourceState, any>;
protected loadFailureActionReducerType: ReducerTypes<SingleResourceState, any>;
protected clearActionReducerType: ReducerTypes<SingleResourceState, any>;
protected reloadActionReducerType: ReducerTypes<SingleResourceState, any>;
constructor(protected actions: SingleResourceLoadActions) {
this.initReducerTypes();
initReducerTypes() {
this.loadActionReducerType = this.createLoadActionReducerType();
this.loadSuccessActionReducerType = this.createLoadSuccessActionReducerType();
this.loadFailureActionReducerType = this.createLoadFailureActionReducerType();
this.clearActionReducerType = this.createClearActionReducerType();
this.reloadActionReducerType = this.createReloadActionReducerType();
}
protected initReducer(): void {
this.reducer = createReducer(
initialResourceState,
this.loadActionReducerType,
this.loadSuccessActionReducerType,
this.loadFailureActionReducerType,
this.clearActionReducerType,
this.reloadActionReducerType,
);
}
createLoadActionReducerType(): ReducerTypes<SingleResourceState, any> {
return on(this.actions.loadAction, (state: SingleResourceState): SingleResourceState => {
return {
...state,
resource: { ...state.resource, loading: true },
};
});
}
createLoadSuccessActionReducerType(): ReducerTypes<SingleResourceState, any> {
return on(
this.actions.loadSuccessAction,
(state: SingleResourceState, props: LoadResourceSuccessProps): SingleResourceState => {
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
resource: createStateResource(props.resource),
};
},
);
}
createLoadFailureActionReducerType(): ReducerTypes<SingleResourceState, any> {
return on(
this.actions.loadFailureAction,
(state: SingleResourceState, props: LoadResourceFailureProps): SingleResourceState => ({
...state,
resource: createErrorStateResource(props.error),
}),
);
}
createClearActionReducerType(): ReducerTypes<SingleResourceState, any> {
return on(
this.actions.clearAction,
(state: SingleResourceState): SingleResourceState => ({
...state,
resource: createEmptyStateResource(),
}),
);
}
createReloadActionReducerType(): ReducerTypes<SingleResourceState, any> {
return on(
this.actions.reloadAction,
(state: SingleResourceState): SingleResourceState => ({
...state,
resource: { ...state.resource, reload: true },
}),
);
}
}
export class ApiSingleResourceReducer extends SingleResourceReducer {
public reducer: ActionReducer<ApiSingleResourceState>;
constructor(protected actions: ApiSingleResourceActions) {
super(actions);
}
initReducer(): void {
this.reducer = createReducer(
initialApiResourceState,
this.loadActionReducerType,
this.loadSuccessActionReducerType,
this.loadFailureActionReducerType,
this.clearActionReducerType,
this.reloadActionReducerType,
on(this.actions.saveAction, (state: ApiSingleResourceState): ApiSingleResourceState => {
return {
...state,
saveResource: createEmptyStateResource(true),
this.actions.saveSuccessAction,
(
state: ApiSingleResourceState,
props: LoadResourceSuccessProps,
): ApiSingleResourceState => {
saveResource: createStateResource(props.resource),
this.actions.saveFailureAction,
(
state: ApiSingleResourceState,
props: LoadResourceFailureProps,
): ApiSingleResourceState => {
return {
...state,
saveResource: createErrorStateResource(props.error),
};
},