From 4ae43d926ffc15e7294982c5ed1c0d7b78b2fa32 Mon Sep 17 00:00:00 2001 From: nasdan Date: Fri, 20 Jan 2017 09:05:33 +0100 Subject: [PATCH 1/8] Move student edit reducer to logic reducers folder --- .../pages/student-detail/studentDetailContainer.tsx | 4 ++-- 18 Normalizr/src/reducers/domain/student/index.ts | 5 +---- 18 Normalizr/src/reducers/index.ts | 3 +++ .../reducers/logic/{session.ts => session/index.ts} | 8 ++++---- .../src/reducers/{domain => logic}/student/edit.ts | 0 18 Normalizr/src/reducers/logic/student/index.ts | 11 +++++++++++ 6 files changed, 21 insertions(+), 10 deletions(-) rename 18 Normalizr/src/reducers/logic/{session.ts => session/index.ts} (80%) rename 18 Normalizr/src/reducers/{domain => logic}/student/edit.ts (100%) create mode 100644 18 Normalizr/src/reducers/logic/student/index.ts diff --git a/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx b/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx index 94aa55d..e4d502f 100644 --- a/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx +++ b/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx @@ -12,8 +12,8 @@ import {State} from '../../reducers'; const mapStateToProps = (state: State) => { return { - student: state.studentDomain.edit.editingStudent, - errors: state.studentDomain.edit.editingStudentErrors, + student: state.studentLogic.edit.editingStudent, + errors: state.studentLogic.edit.editingStudentErrors, countries: getCountries(state) }; }; diff --git a/18 Normalizr/src/reducers/domain/student/index.ts b/18 Normalizr/src/reducers/domain/student/index.ts index da74a67..0b42814 100644 --- a/18 Normalizr/src/reducers/domain/student/index.ts +++ b/18 Normalizr/src/reducers/domain/student/index.ts @@ -1,17 +1,14 @@ import { combineReducers } from 'redux'; import {byId} from './byId'; import {allIds} from './list'; -import { edit, EditState } from './edit'; import { StudentNormalized } from '../../../model/normalized/studentNormalized'; export interface StudentDomain { byId: {[id: number] : StudentNormalized}, allIds: number[]; - edit: EditState; }; export const studentDomain = combineReducers({ byId, - allIds, - edit + allIds }); diff --git a/18 Normalizr/src/reducers/index.ts b/18 Normalizr/src/reducers/index.ts index c105468..02cf0a5 100644 --- a/18 Normalizr/src/reducers/index.ts +++ b/18 Normalizr/src/reducers/index.ts @@ -2,17 +2,20 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; import { sessionReducer, SessionState } from './logic/session'; import { studentDomain, StudentDomain } from './domain/student'; +import { studentLogic, StudentLogic } from './logic/student'; import { StudentView } from '../model/view/studentView'; import { countryDomain, CountryDomain } from './domain/country'; export interface State { studentDomain: StudentDomain; + studentLogic: StudentLogic; countryDomain: CountryDomain; sessionReducer: SessionState; routing: any; } export const reducers = combineReducers({ studentDomain, + studentLogic, countryDomain, sessionReducer, routing: routerReducer, diff --git a/18 Normalizr/src/reducers/logic/session.ts b/18 Normalizr/src/reducers/logic/session/index.ts similarity index 80% rename from 18 Normalizr/src/reducers/logic/session.ts rename to 18 Normalizr/src/reducers/logic/session/index.ts index 27937fe..074a7e5 100644 --- a/18 Normalizr/src/reducers/logic/session.ts +++ b/18 Normalizr/src/reducers/logic/session/index.ts @@ -1,7 +1,7 @@ -import {actionsEnums} from '../../common/actionsEnums'; -import {UserProfile} from '../../model/view/userProfile'; -import {LoginResponse} from '../../model/view/loginResponse'; -import {LoginEntity} from '../../model/view/login'; +import {actionsEnums} from '../../../common/actionsEnums'; +import {UserProfile} from '../../../model/view/userProfile'; +import {LoginResponse} from '../../../model/view/loginResponse'; +import {LoginEntity} from '../../../model/view/login'; export class SessionState { isUserLoggedIn : boolean; diff --git a/18 Normalizr/src/reducers/domain/student/edit.ts b/18 Normalizr/src/reducers/logic/student/edit.ts similarity index 100% rename from 18 Normalizr/src/reducers/domain/student/edit.ts rename to 18 Normalizr/src/reducers/logic/student/edit.ts diff --git a/18 Normalizr/src/reducers/logic/student/index.ts b/18 Normalizr/src/reducers/logic/student/index.ts new file mode 100644 index 0000000..d4d6e55 --- /dev/null +++ b/18 Normalizr/src/reducers/logic/student/index.ts @@ -0,0 +1,11 @@ +import { combineReducers } from 'redux'; +import { edit, EditState } from './edit'; +import { StudentNormalized } from '../../../model/normalized/studentNormalized'; + +export interface StudentLogic { + edit: EditState; +}; + +export const studentLogic = combineReducers({ + edit +}); From b3c15b37503436b47c627ae78087e01af72f9fb7 Mon Sep 17 00:00:00 2001 From: nasdan Date: Fri, 20 Jan 2017 09:07:55 +0100 Subject: [PATCH 2/8] Rename sessionReducer to sessionLogic --- 18 Normalizr/src/pages/login/loginContainer.tsx | 2 +- 18 Normalizr/src/reducers/index.ts | 6 +++--- 18 Normalizr/src/reducers/logic/session/index.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/18 Normalizr/src/pages/login/loginContainer.tsx b/18 Normalizr/src/pages/login/loginContainer.tsx index 9ec0310..e46dc48 100644 --- a/18 Normalizr/src/pages/login/loginContainer.tsx +++ b/18 Normalizr/src/pages/login/loginContainer.tsx @@ -7,7 +7,7 @@ import {State} from '../../reducers'; const mapStateToProps = (state: State) => { return { - loginInfo: state.sessionReducer.editingLogin + loginInfo: state.sessionLogic.editingLogin } } diff --git a/18 Normalizr/src/reducers/index.ts b/18 Normalizr/src/reducers/index.ts index 02cf0a5..a2a4394 100644 --- a/18 Normalizr/src/reducers/index.ts +++ b/18 Normalizr/src/reducers/index.ts @@ -1,6 +1,6 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; -import { sessionReducer, SessionState } from './logic/session'; +import { sessionLogic, SessionState } from './logic/session'; import { studentDomain, StudentDomain } from './domain/student'; import { studentLogic, StudentLogic } from './logic/student'; import { StudentView } from '../model/view/studentView'; @@ -10,13 +10,13 @@ export interface State { studentDomain: StudentDomain; studentLogic: StudentLogic; countryDomain: CountryDomain; - sessionReducer: SessionState; + sessionLogic: SessionState; routing: any; } export const reducers = combineReducers({ studentDomain, studentLogic, countryDomain, - sessionReducer, + sessionLogic, routing: routerReducer, }); diff --git a/18 Normalizr/src/reducers/logic/session/index.ts b/18 Normalizr/src/reducers/logic/session/index.ts index 074a7e5..87cc992 100644 --- a/18 Normalizr/src/reducers/logic/session/index.ts +++ b/18 Normalizr/src/reducers/logic/session/index.ts @@ -16,7 +16,7 @@ export class SessionState { } } -export const sessionReducer = (state : SessionState = new SessionState(), action) => { +export const sessionLogic = (state : SessionState = new SessionState(), action) => { switch (action.type) { case actionsEnums.USERPROFILE_PERFORM_LOGIN: return handlePerformLogin(state, action.payload); From 6a2edaced6b476abe6e450fea9931849733557d0 Mon Sep 17 00:00:00 2001 From: nasdan Date: Fri, 20 Jan 2017 09:44:08 +0100 Subject: [PATCH 3/8] Refactor state into domain and logic --- .../src/pages/login/loginContainer.tsx | 2 +- .../student-detail/studentDetailContainer.tsx | 4 ++-- .../src/reducers/domain/country/index.ts | 2 +- .../domain/country/selectors/index.ts | 2 +- 18 Normalizr/src/reducers/domain/index.ts | 13 +++++++++++++ .../src/reducers/domain/student/index.ts | 2 +- .../domain/student/selectors/index.ts | 2 +- 18 Normalizr/src/reducers/index.ts | 19 ++++++------------- 18 Normalizr/src/reducers/logic/index.ts | 12 ++++++++++++ .../src/reducers/logic/session/index.ts | 2 +- .../src/reducers/logic/student/index.ts | 2 +- 11 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 18 Normalizr/src/reducers/domain/index.ts create mode 100644 18 Normalizr/src/reducers/logic/index.ts diff --git a/18 Normalizr/src/pages/login/loginContainer.tsx b/18 Normalizr/src/pages/login/loginContainer.tsx index e46dc48..c1e82ba 100644 --- a/18 Normalizr/src/pages/login/loginContainer.tsx +++ b/18 Normalizr/src/pages/login/loginContainer.tsx @@ -7,7 +7,7 @@ import {State} from '../../reducers'; const mapStateToProps = (state: State) => { return { - loginInfo: state.sessionLogic.editingLogin + loginInfo: state.logic.session.editingLogin } } diff --git a/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx b/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx index e4d502f..1e77064 100644 --- a/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx +++ b/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx @@ -12,8 +12,8 @@ import {State} from '../../reducers'; const mapStateToProps = (state: State) => { return { - student: state.studentLogic.edit.editingStudent, - errors: state.studentLogic.edit.editingStudentErrors, + student: state.logic.student.edit.editingStudent, + errors: state.logic.student.edit.editingStudentErrors, countries: getCountries(state) }; }; diff --git a/18 Normalizr/src/reducers/domain/country/index.ts b/18 Normalizr/src/reducers/domain/country/index.ts index f5859b2..18a9af4 100644 --- a/18 Normalizr/src/reducers/domain/country/index.ts +++ b/18 Normalizr/src/reducers/domain/country/index.ts @@ -8,7 +8,7 @@ export interface CountryDomain { allIds: number[]; } -export const countryDomain = combineReducers({ +export const country = combineReducers({ byId, allIds }); diff --git a/18 Normalizr/src/reducers/domain/country/selectors/index.ts b/18 Normalizr/src/reducers/domain/country/selectors/index.ts index 4d57a67..21681da 100644 --- a/18 Normalizr/src/reducers/domain/country/selectors/index.ts +++ b/18 Normalizr/src/reducers/domain/country/selectors/index.ts @@ -3,7 +3,7 @@ import {State} from '../../../index'; import {CountryDomain} from '../index'; import {CountryView} from '../../../../model/view/countryView'; -export const countryDomain = (state: State) => state.countryDomain; +export const countryDomain = (state: State) => state.domain.country; export const getCountries = createSelector( countryDomain, diff --git a/18 Normalizr/src/reducers/domain/index.ts b/18 Normalizr/src/reducers/domain/index.ts new file mode 100644 index 0000000..45b351c --- /dev/null +++ b/18 Normalizr/src/reducers/domain/index.ts @@ -0,0 +1,13 @@ +import { combineReducers } from 'redux'; +import { routerReducer } from 'react-router-redux'; +import { student, StudentDomain } from './student'; +import { country, CountryDomain } from './country'; + +export interface Domain { + student: StudentDomain; + country: CountryDomain; +} +export const domain = combineReducers({ + student, + country, +}); diff --git a/18 Normalizr/src/reducers/domain/student/index.ts b/18 Normalizr/src/reducers/domain/student/index.ts index 0b42814..ed97879 100644 --- a/18 Normalizr/src/reducers/domain/student/index.ts +++ b/18 Normalizr/src/reducers/domain/student/index.ts @@ -8,7 +8,7 @@ export interface StudentDomain { allIds: number[]; }; -export const studentDomain = combineReducers({ +export const student = combineReducers({ byId, allIds }); diff --git a/18 Normalizr/src/reducers/domain/student/selectors/index.ts b/18 Normalizr/src/reducers/domain/student/selectors/index.ts index 0d711f3..c809ef6 100644 --- a/18 Normalizr/src/reducers/domain/student/selectors/index.ts +++ b/18 Normalizr/src/reducers/domain/student/selectors/index.ts @@ -5,7 +5,7 @@ import {StudentView} from '../../../../model/view/studentView'; import {CountryDomain} from '../../country'; import {countryDomain, getCountry} from '../../country/selectors'; -const studentDomain = (state: State) => state.studentDomain; +const studentDomain = (state: State) => state.domain.student; export const getStudents = createSelector( studentDomain, diff --git a/18 Normalizr/src/reducers/index.ts b/18 Normalizr/src/reducers/index.ts index a2a4394..59455e0 100644 --- a/18 Normalizr/src/reducers/index.ts +++ b/18 Normalizr/src/reducers/index.ts @@ -1,22 +1,15 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; -import { sessionLogic, SessionState } from './logic/session'; -import { studentDomain, StudentDomain } from './domain/student'; -import { studentLogic, StudentLogic } from './logic/student'; -import { StudentView } from '../model/view/studentView'; -import { countryDomain, CountryDomain } from './domain/country'; +import { logic, Logic } from './logic'; +import { domain, Domain } from './domain'; export interface State { - studentDomain: StudentDomain; - studentLogic: StudentLogic; - countryDomain: CountryDomain; - sessionLogic: SessionState; + domain: Domain; + logic: Logic; routing: any; } export const reducers = combineReducers({ - studentDomain, - studentLogic, - countryDomain, - sessionLogic, + domain, + logic, routing: routerReducer, }); diff --git a/18 Normalizr/src/reducers/logic/index.ts b/18 Normalizr/src/reducers/logic/index.ts new file mode 100644 index 0000000..5675766 --- /dev/null +++ b/18 Normalizr/src/reducers/logic/index.ts @@ -0,0 +1,12 @@ +import { combineReducers } from 'redux'; +import { session, SessionState } from './session'; +import { student, StudentLogic } from './student'; + +export interface Logic { + student: StudentLogic; + session: SessionState +} +export const logic = combineReducers({ + student, + session, +}); diff --git a/18 Normalizr/src/reducers/logic/session/index.ts b/18 Normalizr/src/reducers/logic/session/index.ts index 87cc992..70622d7 100644 --- a/18 Normalizr/src/reducers/logic/session/index.ts +++ b/18 Normalizr/src/reducers/logic/session/index.ts @@ -16,7 +16,7 @@ export class SessionState { } } -export const sessionLogic = (state : SessionState = new SessionState(), action) => { +export const session = (state : SessionState = new SessionState(), action) => { switch (action.type) { case actionsEnums.USERPROFILE_PERFORM_LOGIN: return handlePerformLogin(state, action.payload); diff --git a/18 Normalizr/src/reducers/logic/student/index.ts b/18 Normalizr/src/reducers/logic/student/index.ts index d4d6e55..1fc8c59 100644 --- a/18 Normalizr/src/reducers/logic/student/index.ts +++ b/18 Normalizr/src/reducers/logic/student/index.ts @@ -6,6 +6,6 @@ export interface StudentLogic { edit: EditState; }; -export const studentLogic = combineReducers({ +export const student = combineReducers({ edit }); From 84e53ed14331e037b180a58ebc170fcc92070d31 Mon Sep 17 00:00:00 2001 From: nasdan Date: Fri, 20 Jan 2017 12:11:34 +0100 Subject: [PATCH 4/8] Join into one byId file and one list file --- .../student-detail/studentDetailContainer.tsx | 2 +- .../student-list/studentListContainer.tsx | 2 +- 18 Normalizr/src/reducers/domain/byId.ts | 29 ++++++++++++ .../src/reducers/domain/country/byId.ts | 12 ----- .../src/reducers/domain/country/index.ts | 14 ------ .../src/reducers/domain/country/list.ts | 13 ----- .../domain/country/selectors/index.ts | 15 ------ 18 Normalizr/src/reducers/domain/index.ts | 14 +++--- 18 Normalizr/src/reducers/domain/list.ts | 47 +++++++++++++++++++ .../src/reducers/domain/selectors/country.ts | 15 ++++++ .../src/reducers/domain/selectors/index.ts | 7 +++ .../src/reducers/domain/selectors/student.ts | 18 +++++++ .../src/reducers/domain/student/byId.ts | 11 ----- .../src/reducers/domain/student/index.ts | 14 ------ .../src/reducers/domain/student/list.ts | 9 ---- .../domain/student/selectors/index.ts | 20 -------- 16 files changed, 126 insertions(+), 116 deletions(-) create mode 100644 18 Normalizr/src/reducers/domain/byId.ts delete mode 100644 18 Normalizr/src/reducers/domain/country/byId.ts delete mode 100644 18 Normalizr/src/reducers/domain/country/index.ts delete mode 100644 18 Normalizr/src/reducers/domain/country/list.ts delete mode 100644 18 Normalizr/src/reducers/domain/country/selectors/index.ts create mode 100644 18 Normalizr/src/reducers/domain/list.ts create mode 100644 18 Normalizr/src/reducers/domain/selectors/country.ts create mode 100644 18 Normalizr/src/reducers/domain/selectors/index.ts create mode 100644 18 Normalizr/src/reducers/domain/selectors/student.ts delete mode 100644 18 Normalizr/src/reducers/domain/student/byId.ts delete mode 100644 18 Normalizr/src/reducers/domain/student/index.ts delete mode 100644 18 Normalizr/src/reducers/domain/student/list.ts delete mode 100644 18 Normalizr/src/reducers/domain/student/selectors/index.ts diff --git a/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx b/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx index 1e77064..8161ba0 100644 --- a/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx +++ b/18 Normalizr/src/pages/student-detail/studentDetailContainer.tsx @@ -5,7 +5,7 @@ import { studentFieldValueChangedStart } from "./actions/studentFieldValueChange import { studentSaveRequestStart } from "./actions/studentSaveRequestStart"; import { resetStudentAction } from './actions/resetStudent'; import { StudentView } from "../../model/view/studentView"; -import { getCountries } from '../../reducers/domain/country/selectors'; +import { getCountries } from '../../reducers/domain/selectors'; import {addCountryAction} from '../student-detail/actions/addCountry'; import {CountryView} from '../../model/view/countryView'; import {State} from '../../reducers'; diff --git a/18 Normalizr/src/pages/student-list/studentListContainer.tsx b/18 Normalizr/src/pages/student-list/studentListContainer.tsx index 1600331..5abd544 100644 --- a/18 Normalizr/src/pages/student-list/studentListContainer.tsx +++ b/18 Normalizr/src/pages/student-list/studentListContainer.tsx @@ -2,7 +2,7 @@ import { connect } from "react-redux"; import { studentListRequestStartedAction } from "./actions/studentListRequestStarted"; import { StudentListComponent } from "./studentList"; import { navigateToEditStudentAction, navigateToNewStudentAction } from "./actions/navigateToEditStudent"; -import { getStudents } from '../../reducers/domain/student/selectors'; +import { getStudents } from '../../reducers/domain/selectors'; import { fetchCountryListRequestStartedAction } from './actions/fetchCountryList'; import {State} from '../../reducers'; diff --git a/18 Normalizr/src/reducers/domain/byId.ts b/18 Normalizr/src/reducers/domain/byId.ts new file mode 100644 index 0000000..69286ec --- /dev/null +++ b/18 Normalizr/src/reducers/domain/byId.ts @@ -0,0 +1,29 @@ +import { StudentNormalized } from "../../model/normalized/studentNormalized"; +import { CountryNormalized } from '../../model/normalized/countryNormalized'; + +export interface ById { + students: {[id: number] : StudentNormalized}; + countries: {[id: number]: CountryNormalized}; +} + +const initialState = { + students: {}, + countries: {} +} + +export const byId = (state: ById = initialState, action) => { + if (action.payload && action.payload.entities) { + return { + ...state, + students: { + ...state.students, + ...action.payload.entities.students + }, + countries: { + ...state.countries, + ...action.payload.entities.countries + } + } + } + return state; +} diff --git a/18 Normalizr/src/reducers/domain/country/byId.ts b/18 Normalizr/src/reducers/domain/country/byId.ts deleted file mode 100644 index 5c5d93f..0000000 --- a/18 Normalizr/src/reducers/domain/country/byId.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CountryNormalized } from '../../../model/normalized/countryNormalized'; - -export const byId = (state: {[id: number]: CountryNormalized} = {}, action) => { - if (action.payload && action.payload.entities) { - return { - ...state, - ...action.payload.entities.countries - } - } - - return state; -} diff --git a/18 Normalizr/src/reducers/domain/country/index.ts b/18 Normalizr/src/reducers/domain/country/index.ts deleted file mode 100644 index 18a9af4..0000000 --- a/18 Normalizr/src/reducers/domain/country/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { combineReducers } from 'redux'; -import {byId} from './byId'; -import {allIds} from './list'; -import { CountryNormalized } from '../../../model/normalized/countryNormalized'; - -export interface CountryDomain { - byId: {[id: number]: CountryNormalized}; - allIds: number[]; -} - -export const country = combineReducers({ - byId, - allIds -}); diff --git a/18 Normalizr/src/reducers/domain/country/list.ts b/18 Normalizr/src/reducers/domain/country/list.ts deleted file mode 100644 index 8f5e173..0000000 --- a/18 Normalizr/src/reducers/domain/country/list.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { actionsEnums } from '../../../common/actionsEnums'; - -export const allIds = (state: number[] = [], action) => { - switch (action.type) { - case actionsEnums.FETCH_COUNTRY_LIST_REQUEST_COMPLETED: - return action.payload.result; - - case actionsEnums.ADD_COUNTRY: - return [...state, action.payload.result]; - } - - return state; -} diff --git a/18 Normalizr/src/reducers/domain/country/selectors/index.ts b/18 Normalizr/src/reducers/domain/country/selectors/index.ts deleted file mode 100644 index 21681da..0000000 --- a/18 Normalizr/src/reducers/domain/country/selectors/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {createSelector} from 'reselect'; -import {State} from '../../../index'; -import {CountryDomain} from '../index'; -import {CountryView} from '../../../../model/view/countryView'; - -export const countryDomain = (state: State) => state.domain.country; - -export const getCountries = createSelector( - countryDomain, - (state: CountryDomain) => state.allIds.map(id => getCountry(state, id)) -); - -export const getCountry = (state: CountryDomain, id: number): CountryView => ({ - ...state.byId[id] -}); diff --git a/18 Normalizr/src/reducers/domain/index.ts b/18 Normalizr/src/reducers/domain/index.ts index 45b351c..357c429 100644 --- a/18 Normalizr/src/reducers/domain/index.ts +++ b/18 Normalizr/src/reducers/domain/index.ts @@ -1,13 +1,15 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; -import { student, StudentDomain } from './student'; -import { country, CountryDomain } from './country'; +import {byId, ById} from './byId'; +import {allIds, AllIds} from './list'; +import { StudentNormalized } from '../../model/normalized/studentNormalized'; +import { CountryNormalized } from '../../model/normalized/countryNormalized'; export interface Domain { - student: StudentDomain; - country: CountryDomain; + byId: ById; + allIds: AllIds; } export const domain = combineReducers({ - student, - country, + byId, + allIds }); diff --git a/18 Normalizr/src/reducers/domain/list.ts b/18 Normalizr/src/reducers/domain/list.ts new file mode 100644 index 0000000..dcbdce8 --- /dev/null +++ b/18 Normalizr/src/reducers/domain/list.ts @@ -0,0 +1,47 @@ +import { actionsEnums } from "../../common/actionsEnums"; + +export interface AllIds { + students: number[]; + countries: number[]; +} + +const initialState = { + students: [], + countries: [] +} + +export const allIds = (state: AllIds = initialState, action) => { + switch (action.type) { + case actionsEnums.STUDENTS_GET_LIST_REQUEST_COMPLETED: + return handleStudentsGetListRequestCompleted(state, action.payload.result); + + case actionsEnums.FETCH_COUNTRY_LIST_REQUEST_COMPLETED: + return handleFetchCountryListRequestCompleted(state, action.payload.result); + + case actionsEnums.ADD_COUNTRY: + return handleAddCountry(state, action.payload.result); + } + + return state; +}; + +const handleStudentsGetListRequestCompleted = (state: AllIds, ids: number[]) => { + return { + ...state, + students: ids + } +} + +const handleFetchCountryListRequestCompleted = (state: AllIds, ids: number[]) => { + return { + ...state, + countries: ids + } +} + +const handleAddCountry = (state: AllIds, id: number) => { + return { + ...state, + countries: [...state.countries, id] + } +} diff --git a/18 Normalizr/src/reducers/domain/selectors/country.ts b/18 Normalizr/src/reducers/domain/selectors/country.ts new file mode 100644 index 0000000..9c03fc7 --- /dev/null +++ b/18 Normalizr/src/reducers/domain/selectors/country.ts @@ -0,0 +1,15 @@ +import {createSelector} from 'reselect'; +import {State} from '../../index'; +import {Domain} from '../index'; +import {CountryView} from '../../../model/view/countryView'; + +const domain = (state: State) => state.domain; + +export const getCountries = createSelector( + domain, + (state: Domain) => state.allIds.countries.map(id => getCountry(state, id)) +); + +export const getCountry = (state: Domain, id: number): CountryView => ({ + ...state.byId.countries[id] +}); diff --git a/18 Normalizr/src/reducers/domain/selectors/index.ts b/18 Normalizr/src/reducers/domain/selectors/index.ts new file mode 100644 index 0000000..4a7fcbe --- /dev/null +++ b/18 Normalizr/src/reducers/domain/selectors/index.ts @@ -0,0 +1,7 @@ +import {getStudents} from './student'; +import {getCountries} from './country'; + +export { + getStudents, + getCountries +} diff --git a/18 Normalizr/src/reducers/domain/selectors/student.ts b/18 Normalizr/src/reducers/domain/selectors/student.ts new file mode 100644 index 0000000..58cd136 --- /dev/null +++ b/18 Normalizr/src/reducers/domain/selectors/student.ts @@ -0,0 +1,18 @@ +import {createSelector} from 'reselect'; +import {State} from '../../index'; +import {Domain} from '../index'; +import {StudentView} from '../../../model/view/studentView'; +import {getCountry} from './country'; + +const domain = (state: State) => state.domain; + +export const getStudents = createSelector( + domain, + (domain: Domain) => + domain.allIds.students.map(id => getStudent(domain, id)) +); + +const getStudent = (domain: Domain, id: number): StudentView => ({ + ...domain.byId.students[id], + country: getCountry(domain, domain.byId.students[id].country) +}); diff --git a/18 Normalizr/src/reducers/domain/student/byId.ts b/18 Normalizr/src/reducers/domain/student/byId.ts deleted file mode 100644 index b1e8957..0000000 --- a/18 Normalizr/src/reducers/domain/student/byId.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { StudentNormalized } from "../../../model/normalized/studentNormalized"; - -export const byId = (state : {[id: number] : StudentNormalized} = {}, action) => { - if (action.payload && action.payload.entities) { - return { - ...state, - ...action.payload.entities.students - } - } - return state; -} diff --git a/18 Normalizr/src/reducers/domain/student/index.ts b/18 Normalizr/src/reducers/domain/student/index.ts deleted file mode 100644 index ed97879..0000000 --- a/18 Normalizr/src/reducers/domain/student/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { combineReducers } from 'redux'; -import {byId} from './byId'; -import {allIds} from './list'; -import { StudentNormalized } from '../../../model/normalized/studentNormalized'; - -export interface StudentDomain { - byId: {[id: number] : StudentNormalized}, - allIds: number[]; -}; - -export const student = combineReducers({ - byId, - allIds -}); diff --git a/18 Normalizr/src/reducers/domain/student/list.ts b/18 Normalizr/src/reducers/domain/student/list.ts deleted file mode 100644 index 7f0d2c3..0000000 --- a/18 Normalizr/src/reducers/domain/student/list.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { actionsEnums } from "../../../common/actionsEnums"; - -export const allIds = (state: Number[] = [], action) => { - switch (action.type) { - case actionsEnums.STUDENTS_GET_LIST_REQUEST_COMPLETED: - return action.payload.result; - } - return state; -}; diff --git a/18 Normalizr/src/reducers/domain/student/selectors/index.ts b/18 Normalizr/src/reducers/domain/student/selectors/index.ts deleted file mode 100644 index c809ef6..0000000 --- a/18 Normalizr/src/reducers/domain/student/selectors/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import {createSelector} from 'reselect'; -import {State} from '../../../index'; -import {StudentDomain} from '../index'; -import {StudentView} from '../../../../model/view/studentView'; -import {CountryDomain} from '../../country'; -import {countryDomain, getCountry} from '../../country/selectors'; - -const studentDomain = (state: State) => state.domain.student; - -export const getStudents = createSelector( - studentDomain, - countryDomain, - (studentDomain: StudentDomain, countryDomain: CountryDomain) => - studentDomain.allIds.map(id => getStudent(studentDomain, countryDomain, id)) -); - -const getStudent = (studentDomain: StudentDomain, countryDomain: CountryDomain, id: number): StudentView => ({ - ...studentDomain.byId[id], - country: getCountry(countryDomain, studentDomain.byId[id].country) -}); From 92cbad85931913741237c2c605f77c003f4d41ff Mon Sep 17 00:00:00 2001 From: nasdan Date: Fri, 20 Jan 2017 12:17:12 +0100 Subject: [PATCH 5/8] Remove unneeded imports --- 18 Normalizr/src/reducers/domain/index.ts | 3 --- 18 Normalizr/src/reducers/index.ts | 2 +- 18 Normalizr/src/reducers/logic/index.ts | 8 ++++---- 18 Normalizr/src/reducers/logic/session/index.ts | 8 ++++---- 18 Normalizr/src/reducers/logic/student/index.ts | 5 ++--- 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/18 Normalizr/src/reducers/domain/index.ts b/18 Normalizr/src/reducers/domain/index.ts index 357c429..2fba1a2 100644 --- a/18 Normalizr/src/reducers/domain/index.ts +++ b/18 Normalizr/src/reducers/domain/index.ts @@ -1,9 +1,6 @@ import { combineReducers } from 'redux'; -import { routerReducer } from 'react-router-redux'; import {byId, ById} from './byId'; import {allIds, AllIds} from './list'; -import { StudentNormalized } from '../../model/normalized/studentNormalized'; -import { CountryNormalized } from '../../model/normalized/countryNormalized'; export interface Domain { byId: ById; diff --git a/18 Normalizr/src/reducers/index.ts b/18 Normalizr/src/reducers/index.ts index 59455e0..9bfa06c 100644 --- a/18 Normalizr/src/reducers/index.ts +++ b/18 Normalizr/src/reducers/index.ts @@ -1,7 +1,7 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; -import { logic, Logic } from './logic'; import { domain, Domain } from './domain'; +import { logic, Logic } from './logic'; export interface State { domain: Domain; diff --git a/18 Normalizr/src/reducers/logic/index.ts b/18 Normalizr/src/reducers/logic/index.ts index 5675766..9203f6a 100644 --- a/18 Normalizr/src/reducers/logic/index.ts +++ b/18 Normalizr/src/reducers/logic/index.ts @@ -1,10 +1,10 @@ import { combineReducers } from 'redux'; -import { session, SessionState } from './session'; -import { student, StudentLogic } from './student'; +import { session, Session } from './session'; +import { student, Student } from './student'; export interface Logic { - student: StudentLogic; - session: SessionState + student: Student; + session: Session } export const logic = combineReducers({ student, diff --git a/18 Normalizr/src/reducers/logic/session/index.ts b/18 Normalizr/src/reducers/logic/session/index.ts index 70622d7..f28b794 100644 --- a/18 Normalizr/src/reducers/logic/session/index.ts +++ b/18 Normalizr/src/reducers/logic/session/index.ts @@ -3,7 +3,7 @@ import {UserProfile} from '../../../model/view/userProfile'; import {LoginResponse} from '../../../model/view/loginResponse'; import {LoginEntity} from '../../../model/view/login'; -export class SessionState { +export class Session { isUserLoggedIn : boolean; userProfile : UserProfile; editingLogin : LoginEntity; @@ -16,7 +16,7 @@ export class SessionState { } } -export const session = (state : SessionState = new SessionState(), action) => { +export const session = (state : Session = new Session(), action) => { switch (action.type) { case actionsEnums.USERPROFILE_PERFORM_LOGIN: return handlePerformLogin(state, action.payload); @@ -29,7 +29,7 @@ export const session = (state : SessionState = new SessionState(), action) => { }; -const handlePerformLogin = (state : SessionState, payload : LoginResponse) => { +const handlePerformLogin = (state : Session, payload : LoginResponse) => { return { ...state, isUserLoggedIn: payload.succeeded, @@ -37,7 +37,7 @@ const handlePerformLogin = (state : SessionState, payload : LoginResponse) => { }; } -const handleUpdateEditingLogin = (state: SessionState, payload : LoginEntity) => { +const handleUpdateEditingLogin = (state: Session, payload : LoginEntity) => { return { ...state, editingLogin: payload diff --git a/18 Normalizr/src/reducers/logic/student/index.ts b/18 Normalizr/src/reducers/logic/student/index.ts index 1fc8c59..5b991b7 100644 --- a/18 Normalizr/src/reducers/logic/student/index.ts +++ b/18 Normalizr/src/reducers/logic/student/index.ts @@ -1,11 +1,10 @@ import { combineReducers } from 'redux'; import { edit, EditState } from './edit'; -import { StudentNormalized } from '../../../model/normalized/studentNormalized'; -export interface StudentLogic { +export interface Student { edit: EditState; }; -export const student = combineReducers({ +export const student = combineReducers({ edit }); From fa403b11803e14cb9269857945cff50bf3fea01b Mon Sep 17 00:00:00 2001 From: nasdan Date: Fri, 20 Jan 2017 12:24:01 +0100 Subject: [PATCH 6/8] Rename to FETCH_STUDENT_LIST_REQUEST_COMPLETED --- 18 Normalizr/src/common/actionsEnums.ts | 2 +- .../actions/studentListRequestCompleted.ts | 2 +- 18 Normalizr/src/reducers/domain/byId.ts | 2 +- 18 Normalizr/src/reducers/domain/list.ts | 12 ++++++------ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/18 Normalizr/src/common/actionsEnums.ts b/18 Normalizr/src/common/actionsEnums.ts index 7aa8180..d161375 100644 --- a/18 Normalizr/src/common/actionsEnums.ts +++ b/18 Normalizr/src/common/actionsEnums.ts @@ -1,7 +1,7 @@ export const actionsEnums = { USERPROFILE_UPDATE_EDITING_LOGIN: "USERPROFILE_UPDATE_EDITING_LOGIN", USERPROFILE_PERFORM_LOGIN: "USERPROFILE_PERFORM_LOGIN", - STUDENTS_GET_LIST_REQUEST_COMPLETED: "STUDENTS_GET_LIST_REQUEST_COMPLETED", + FETCH_STUDENT_LIST_REQUEST_COMPLETED: "FETCH_STUDENT_LIST_REQUEST_COMPLETED", STUDENT_GET_STUDENT_REQUEST_COMPLETED: "STUDENT_GET_STUDENT_REQUEST_COMPLETED", STUDENT_FIELD_VALUE_CHANGED_COMPLETED: "STUDENT_FIELD_VALUE_CHANGED_COMPLETED", STUDENT_SAVE_COMPLETED: "STUDENT_SAVE_COMPLETED", diff --git a/18 Normalizr/src/pages/student-list/actions/studentListRequestCompleted.ts b/18 Normalizr/src/pages/student-list/actions/studentListRequestCompleted.ts index 5ff2209..6ef3c40 100644 --- a/18 Normalizr/src/pages/student-list/actions/studentListRequestCompleted.ts +++ b/18 Normalizr/src/pages/student-list/actions/studentListRequestCompleted.ts @@ -4,7 +4,7 @@ import { actionsEnums } from "../../../common/actionsEnums"; // dictionary not that easy export const studentListRequestCompletedAction = (studentList: any) => { return { - type: actionsEnums.STUDENTS_GET_LIST_REQUEST_COMPLETED, + type: actionsEnums.FETCH_STUDENT_LIST_REQUEST_COMPLETED, payload: studentList }; }; diff --git a/18 Normalizr/src/reducers/domain/byId.ts b/18 Normalizr/src/reducers/domain/byId.ts index 69286ec..8ba74f3 100644 --- a/18 Normalizr/src/reducers/domain/byId.ts +++ b/18 Normalizr/src/reducers/domain/byId.ts @@ -9,7 +9,7 @@ export interface ById { const initialState = { students: {}, countries: {} -} +}; export const byId = (state: ById = initialState, action) => { if (action.payload && action.payload.entities) { diff --git a/18 Normalizr/src/reducers/domain/list.ts b/18 Normalizr/src/reducers/domain/list.ts index dcbdce8..53a2ada 100644 --- a/18 Normalizr/src/reducers/domain/list.ts +++ b/18 Normalizr/src/reducers/domain/list.ts @@ -8,15 +8,15 @@ export interface AllIds { const initialState = { students: [], countries: [] -} +}; export const allIds = (state: AllIds = initialState, action) => { switch (action.type) { - case actionsEnums.STUDENTS_GET_LIST_REQUEST_COMPLETED: - return handleStudentsGetListRequestCompleted(state, action.payload.result); + case actionsEnums.FETCH_STUDENT_LIST_REQUEST_COMPLETED: + return handleFetchStudents(state, action.payload.result); case actionsEnums.FETCH_COUNTRY_LIST_REQUEST_COMPLETED: - return handleFetchCountryListRequestCompleted(state, action.payload.result); + return handleFetchCountries(state, action.payload.result); case actionsEnums.ADD_COUNTRY: return handleAddCountry(state, action.payload.result); @@ -25,14 +25,14 @@ export const allIds = (state: AllIds = initialState, action) => { return state; }; -const handleStudentsGetListRequestCompleted = (state: AllIds, ids: number[]) => { +const handleFetchStudents = (state: AllIds, ids: number[]) => { return { ...state, students: ids } } -const handleFetchCountryListRequestCompleted = (state: AllIds, ids: number[]) => { +const handleFetchCountries = (state: AllIds, ids: number[]) => { return { ...state, countries: ids From 470b23a372c11944b22f17bab5ee31ca4b7ea0a9 Mon Sep 17 00:00:00 2001 From: nasdan Date: Fri, 20 Jan 2017 12:25:28 +0100 Subject: [PATCH 7/8] Rename to FETCH_STUDENT_REQUEST_COMPLETED --- 18 Normalizr/src/common/actionsEnums.ts | 2 +- .../pages/student-detail/actions/getStudentRequestCompleted.ts | 2 +- 18 Normalizr/src/reducers/logic/student/edit.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/18 Normalizr/src/common/actionsEnums.ts b/18 Normalizr/src/common/actionsEnums.ts index d161375..b08dfd3 100644 --- a/18 Normalizr/src/common/actionsEnums.ts +++ b/18 Normalizr/src/common/actionsEnums.ts @@ -2,7 +2,7 @@ export const actionsEnums = { USERPROFILE_UPDATE_EDITING_LOGIN: "USERPROFILE_UPDATE_EDITING_LOGIN", USERPROFILE_PERFORM_LOGIN: "USERPROFILE_PERFORM_LOGIN", FETCH_STUDENT_LIST_REQUEST_COMPLETED: "FETCH_STUDENT_LIST_REQUEST_COMPLETED", - STUDENT_GET_STUDENT_REQUEST_COMPLETED: "STUDENT_GET_STUDENT_REQUEST_COMPLETED", + FETCH_STUDENT_REQUEST_COMPLETED: "FETCH_STUDENT_REQUEST_COMPLETED", STUDENT_FIELD_VALUE_CHANGED_COMPLETED: "STUDENT_FIELD_VALUE_CHANGED_COMPLETED", STUDENT_SAVE_COMPLETED: "STUDENT_SAVE_COMPLETED", RESET_EDITING_STUDENT: "RESET_EDITING_STUDENT", diff --git a/18 Normalizr/src/pages/student-detail/actions/getStudentRequestCompleted.ts b/18 Normalizr/src/pages/student-detail/actions/getStudentRequestCompleted.ts index 12eefc6..a749e8d 100644 --- a/18 Normalizr/src/pages/student-detail/actions/getStudentRequestCompleted.ts +++ b/18 Normalizr/src/pages/student-detail/actions/getStudentRequestCompleted.ts @@ -3,7 +3,7 @@ import { StudentView } from "../../../model/view/studentView"; export const getStudentRequestCompletedAction = (student: StudentView) => { return { - type: actionsEnums.STUDENT_GET_STUDENT_REQUEST_COMPLETED, + type: actionsEnums.FETCH_STUDENT_REQUEST_COMPLETED, payload: student, }; }; diff --git a/18 Normalizr/src/reducers/logic/student/edit.ts b/18 Normalizr/src/reducers/logic/student/edit.ts index eb1aa86..46288f4 100644 --- a/18 Normalizr/src/reducers/logic/student/edit.ts +++ b/18 Normalizr/src/reducers/logic/student/edit.ts @@ -15,7 +15,7 @@ export class EditState { export const edit = (state : EditState = new EditState(), action) => { switch (action.type) { - case actionsEnums.STUDENT_GET_STUDENT_REQUEST_COMPLETED: + case actionsEnums.FETCH_STUDENT_REQUEST_COMPLETED: return handleGetStudent(state, action.payload); case actionsEnums.STUDENT_FIELD_VALUE_CHANGED_COMPLETED: return handleFieldValueChanged(state, action.payload); From b3282928382f5a74403676f98b6066a6255cb18b Mon Sep 17 00:00:00 2001 From: nasdan Date: Fri, 20 Jan 2017 12:30:56 +0100 Subject: [PATCH 8/8] Remove return carriage --- 18 Normalizr/src/reducers/domain/selectors/student.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/18 Normalizr/src/reducers/domain/selectors/student.ts b/18 Normalizr/src/reducers/domain/selectors/student.ts index 58cd136..9f819bb 100644 --- a/18 Normalizr/src/reducers/domain/selectors/student.ts +++ b/18 Normalizr/src/reducers/domain/selectors/student.ts @@ -8,8 +8,7 @@ const domain = (state: State) => state.domain; export const getStudents = createSelector( domain, - (domain: Domain) => - domain.allIds.students.map(id => getStudent(domain, id)) + (domain: Domain) => domain.allIds.students.map(id => getStudent(domain, id)) ); const getStudent = (domain: Domain, id: number): StudentView => ({