269 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import * as Actions from "../actions";
 | |
| 
 | |
| import { ILearner } from "../models/learner";
 | |
| import { ILevel } from "../models/level";
 | |
| import { IUser } from "../models/user";
 | |
| import { IVocab, IReviewCard } from "../models/vocab";
 | |
| import { IReviewMetadata } from "../models/review";
 | |
| 
 | |
| interface IState {
 | |
|     drawer: boolean;
 | |
|     scorePopoverOpen: boolean;
 | |
|     drawerButton: boolean;
 | |
|     authenticated: boolean;
 | |
|     didLogin: boolean;
 | |
| 
 | |
|     // TODO: Rework this
 | |
|     user: IUser | {},
 | |
| 
 | |
|     // All available levels
 | |
|     levels: ILevel[];
 | |
| 
 | |
|     login: {
 | |
|         loading: boolean;
 | |
|         snackMsg: string;
 | |
|         snackOpen: boolean;
 | |
|     };
 | |
| 
 | |
|     level: {
 | |
|         currentVocab: IVocab;
 | |
|         lookedAt: number[];
 | |
|         vocab: IVocab[];
 | |
|         loading: boolean;
 | |
|     };
 | |
| 
 | |
|     levelList: {
 | |
|         loading: boolean;
 | |
|         snackbar: boolean;
 | |
|     };
 | |
| 
 | |
|     dashboard: {
 | |
|         loading: boolean;
 | |
|     };
 | |
| 
 | |
|     review: {
 | |
|         current: IReviewCard;
 | |
| 
 | |
|         dialogOpen: boolean;
 | |
|         loading: boolean;
 | |
|         vocab: IVocab[];
 | |
|         metadata: IReviewMetadata;
 | |
|         popoverOpen: boolean;
 | |
|         popoverText: string;
 | |
|         popoverColor: string;
 | |
|         popoverTextColor: string;
 | |
|     };
 | |
| 
 | |
|     topTen: ILearner[];
 | |
| 
 | |
|     nextLevel: ILevel;
 | |
|     lastReview: any;
 | |
| };
 | |
| 
 | |
| const initialState: IState = {
 | |
|     // Show the drawer?
 | |
|     drawer: false,
 | |
|     // Should we show the button to open the drawer?
 | |
|     drawerButton: true,
 | |
|     scorePopoverOpen: false,
 | |
|     didLogin: false,
 | |
| 
 | |
|     // Is the user authenticated?
 | |
|     authenticated: false,
 | |
| 
 | |
|     user: {
 | |
|         score: 0,
 | |
|     },
 | |
| 
 | |
|     login: {
 | |
|         loading: false,
 | |
|         snackMsg: "",
 | |
|         snackOpen: false,
 | |
|     },
 | |
| 
 | |
|     levels: [],
 | |
| 
 | |
|     level: {
 | |
|         currentVocab: {} as IVocab,
 | |
|         lookedAt: [0],
 | |
|         vocab: [],
 | |
|         loading: true,
 | |
|     },
 | |
| 
 | |
|     levelList: {
 | |
|         loading: true,
 | |
|         snackbar: false,
 | |
|     },
 | |
| 
 | |
|     dashboard: {
 | |
|         loading: true,
 | |
|     },
 | |
| 
 | |
|     review: {
 | |
|         current: {} as IReviewCard,
 | |
| 
 | |
|         dialogOpen: false,
 | |
|         loading: true,
 | |
|         vocab: [],
 | |
|         metadata: {} as IReviewMetadata,
 | |
|         popoverOpen: false,
 | |
|         popoverText: "",
 | |
|         popoverColor: "",
 | |
|         popoverTextColor: "",
 | |
|     },
 | |
| 
 | |
|     nextLevel: {} as ILevel,
 | |
|     lastReview: {
 | |
|         correct: 0,
 | |
|         wrong: 0,
 | |
|     },
 | |
| 
 | |
|     // The top ten
 | |
|     topTen: [],
 | |
| };
 | |
| 
 | |
| export function LateinicusApp(state: IState = initialState, action: any) {
 | |
|     switch (action.type) {
 | |
|         case Actions.SET_DRAWER:
 | |
|             return Object.assign({}, state, {
 | |
|                 drawer: action.show,
 | |
|             });
 | |
|         case Actions.SET_DRAWER_BUTTON:
 | |
|             return Object.assign({}, state, {
 | |
|                 drawerButton: action.show,
 | |
|             });
 | |
|         case Actions.LOGIN_SET_SNACKBAR:
 | |
|             return Object.assign({}, state, {
 | |
|                 login: {
 | |
|                     loading: state.login.loading,
 | |
|                     snackMsg: action.msg,
 | |
|                     snackOpen: action.show,
 | |
|                 },
 | |
|             });
 | |
|         case Actions.LOGIN_SET_LOADING:
 | |
|             return Object.assign({}, state, {
 | |
|                 login: {
 | |
|                     loading: action.show,
 | |
|                     snackMsg: state.login.snackMsg,
 | |
|                     snackOpen: state.login.snackOpen,
 | |
|                 },
 | |
|             });
 | |
|         case Actions.SET_AUTHENTICATED:
 | |
|             return Object.assign({}, state, {
 | |
|                 authenticated: action.status,
 | |
|             });
 | |
|         case Actions.SET_USER:
 | |
|             return Object.assign({}, state, {
 | |
|                 user: action.user,
 | |
|             });
 | |
|         case Actions.LEVEL_SET_LOOKEDAT:
 | |
|             return Object.assign({}, state, {
 | |
|                 level: Object.assign({}, state.level, {
 | |
|                     lookedAt: action.lookedAt,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.LEVEL_SET_CUR_VOCAB:
 | |
|             return Object.assign({}, state, {
 | |
|                 level: Object.assign({}, state.level, {
 | |
|                     currentVocab: action.vocab,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.LEVEL_SET_VOCAB:
 | |
|             return Object.assign({}, state, {
 | |
|                 level: Object.assign({}, state.level, {
 | |
|                     vocab: action.vocab,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.LEVEL_SET_LOADING:
 | |
|             return Object.assign({}, state, {
 | |
|                 level: Object.assign({}, state.level, {
 | |
|                     loading: action.state,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.SET_LEVELS:
 | |
|             return Object.assign({}, state, {
 | |
|                 levels: action.levels,
 | |
|             });
 | |
|         case Actions.REVIEW_SET_POPOVER:
 | |
|             return Object.assign({}, state, {
 | |
|                 review: Object.assign({}, state.review, {
 | |
|                     popoverText: action.text,
 | |
|                     popoverOpen: action.state,
 | |
|                     popoverColor: action.color,
 | |
|                     popoverTextColor: action.textColor,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.SET_REVIEW:
 | |
|             return Object.assign({}, state, {
 | |
|                 review: Object.assign({}, state.review, {
 | |
|                     current: action.current,
 | |
|                     metadata: action.meta,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.SET_LAST_REVIEW:
 | |
|             return Object.assign({}, state, {
 | |
|                 lastReview: action.metadata,
 | |
|             });
 | |
|         case Actions.SET_USER_SCORE_DELTA:
 | |
|             return Object.assign({}, state, {
 | |
|                 user: Object.assign({}, state.user, {
 | |
|                     score: state.user.score + action.delta,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.REVIEW_SET_LOADING:
 | |
|             return Object.assign({}, state, {
 | |
|                 review: Object.assign({}, state.review, {
 | |
|                     loading: action.state,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.LEVELLIST_SET_LOADING:
 | |
|             return Object.assign({}, state, {
 | |
|                 levelList: Object.assign({}, state.levelList, {
 | |
|                     loading: action.state,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.SET_SCORE_POPOVER:
 | |
|             return Object.assign({}, state, {
 | |
|                 scorePopoverOpen: action.state,
 | |
|             });
 | |
|         case Actions.SET_NEXT_LEVEL:
 | |
|             return Object.assign({}, state, {
 | |
|                 nextLevel: action.level,
 | |
|             });
 | |
|         case Actions.SET_TOP_TEN:
 | |
|             return Object.assign({}, state, {
 | |
|                 topTen: action.topTen,
 | |
|             });
 | |
|         case Actions.SET_DID_LOGIN:
 | |
|             return Object.assign({}, state, {
 | |
|                 didLogin: state,
 | |
|             });
 | |
|         case Actions.REVIEW_SET_DIALOG:
 | |
|             return Object.assign({}, state, {
 | |
|                 review: Object.assign({}, state.review, {
 | |
|                     dialogOpen: action.state,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.DASHBOARD_SET_LOADING:
 | |
|             return Object.assign({}, state, {
 | |
|                 review: Object.assign({}, state.review, {
 | |
|                     loading: action.state,
 | |
|                 }),
 | |
|             });
 | |
|         case Actions.LEVELLIST_SET_SNACKBAR:
 | |
|             return Object.assign({}, state, {
 | |
|                 levelList: Object.assign({}, state.levelList, {
 | |
|                     snackbar: action.state,
 | |
|                 }),
 | |
|             });
 | |
|         default:
 | |
|             // Ignore the initialization call to the reducer. By that we can
 | |
|             // catch all actions that are not implemented
 | |
|             if (action.type && !action.type.startsWith("@@redux/INIT")) {
 | |
|                 console.log("Reducer not implemented:", action.type);
 | |
|             }
 | |
| 
 | |
|             return state;
 | |
|     }
 | |
| };
 | 
