feat: Prevent users from starting levels that they did not reach yet
This commit is contained in:
parent
cee5680a6a
commit
5361d1bab5
@ -192,3 +192,11 @@ export function setDashboardLoading(state: boolean) {
|
|||||||
state,
|
state,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const LEVELLIST_SET_SNACKBAR = "LEVELLIST_SET_SNACKBAR";
|
||||||
|
export function setLevelListSnackbar(state: boolean) {
|
||||||
|
return {
|
||||||
|
type: LEVELLIST_SET_SNACKBAR,
|
||||||
|
state,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
|
|
||||||
import { setLevelListLoading, setLevels } from "../actions";
|
import {
|
||||||
|
setLevelListLoading, setLevels, setLevelListSnackbar
|
||||||
|
} from "../actions";
|
||||||
|
|
||||||
import { ILevel } from "../models/level";
|
import { ILevel } from "../models/level";
|
||||||
|
|
||||||
@ -11,12 +13,14 @@ const mapStateToProps = state => {
|
|||||||
levels: state.levels,
|
levels: state.levels,
|
||||||
loading: state.levelList.loading,
|
loading: state.levelList.loading,
|
||||||
user: state.user,
|
user: state.user,
|
||||||
|
snackbar: state.levelList.snackbar,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
const mapDispatchToProps = dispatch => {
|
const mapDispatchToProps = dispatch => {
|
||||||
return {
|
return {
|
||||||
setLoading: (state: boolean) => dispatch(setLevelListLoading(state)),
|
setLoading: (state: boolean) => dispatch(setLevelListLoading(state)),
|
||||||
setLevels: (levels: ILevel[]) => dispatch(setLevels(levels)),
|
setLevels: (levels: ILevel[]) => dispatch(setLevels(levels)),
|
||||||
|
setSnackbar: (state: boolean) => dispatch(setLevelListSnackbar(state)),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -7,9 +7,11 @@ import Card from '@material-ui/core/Card';
|
|||||||
import CardActions from '@material-ui/core/CardActions';
|
import CardActions from '@material-ui/core/CardActions';
|
||||||
import CardContent from '@material-ui/core/CardContent';
|
import CardContent from '@material-ui/core/CardContent';
|
||||||
import Paper from "@material-ui/core/Paper";
|
import Paper from "@material-ui/core/Paper";
|
||||||
|
import Snackbar from "@material-ui/core/Snackbar";
|
||||||
|
|
||||||
import CircularProgress from "@material-ui/core/CircularProgress";
|
import CircularProgress from "@material-ui/core/CircularProgress";
|
||||||
|
|
||||||
import { Link } from "react-router-dom";
|
import { withRouter } from "react-router-dom";
|
||||||
|
|
||||||
import { ILevel } from "../models/level";
|
import { ILevel } from "../models/level";
|
||||||
import { IUser } from "../models/user";
|
import { IUser } from "../models/user";
|
||||||
@ -17,14 +19,19 @@ import { IUser } from "../models/user";
|
|||||||
interface IProps {
|
interface IProps {
|
||||||
getLevels: () => Promise<ILevel[]>;
|
getLevels: () => Promise<ILevel[]>;
|
||||||
|
|
||||||
|
history: any;
|
||||||
|
|
||||||
user: IUser;
|
user: IUser;
|
||||||
setLevels: (levels: ILevel[]) => void;
|
setLevels: (levels: ILevel[]) => void;
|
||||||
setLoading: (state: boolean) => void;
|
setLoading: (state: boolean) => void;
|
||||||
loading: boolean;
|
loading: boolean;
|
||||||
|
snackbar: boolean;
|
||||||
|
setSnackbar: (state: boolean) => void;
|
||||||
levels: ILevel[];
|
levels: ILevel[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Dashboard extends React.Component<IProps> {
|
const LevelListWithRouter = withRouter(
|
||||||
|
class Dashboard extends React.Component<IProps> {
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.props.setLoading(true);
|
this.props.setLoading(true);
|
||||||
|
|
||||||
@ -35,6 +42,15 @@ export default class Dashboard extends React.Component<IProps> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toLevel(id: number) {
|
||||||
|
const maxLevel = Math.max(...this.props.user.levels);
|
||||||
|
if (maxLevel + 1 >= id) {
|
||||||
|
this.props.history.push(`/level/${id}`);
|
||||||
|
} else {
|
||||||
|
this.props.setSnackbar(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
if (this.props.loading) {
|
if (this.props.loading) {
|
||||||
return <div>
|
return <div>
|
||||||
@ -76,9 +92,8 @@ export default class Dashboard extends React.Component<IProps> {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
<CardActions>
|
<CardActions>
|
||||||
<Button
|
<Button
|
||||||
component={Link}
|
className="lesson-card-btn"
|
||||||
to={`/level/${level.level}`}
|
onClick={() => this.toLevel(level.level)}>
|
||||||
className="lesson-card-btn">
|
|
||||||
Zum Level
|
Zum Level
|
||||||
</Button>
|
</Button>
|
||||||
</CardActions>
|
</CardActions>
|
||||||
@ -86,8 +101,20 @@ export default class Dashboard extends React.Component<IProps> {
|
|||||||
</Grid>;
|
</Grid>;
|
||||||
};
|
};
|
||||||
|
|
||||||
return <Grid container spacing={16} direction="row">
|
return <div>
|
||||||
|
<Grid container spacing={16} direction="row">
|
||||||
{this.props.levels.map(levelToCard)}
|
{this.props.levels.map(levelToCard)}
|
||||||
</Grid>
|
</Grid>
|
||||||
|
<Snackbar
|
||||||
|
anchorOrigin={{
|
||||||
|
vertical: "top",
|
||||||
|
horizontal: "right",
|
||||||
|
}}
|
||||||
|
open={this.props.snackbar}
|
||||||
|
onClose={() => this.props.setSnackbar(false)}
|
||||||
|
message={<span>Du hast dieses Level noch nicht freigeschaltet!</span>} />
|
||||||
|
</div>;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
);
|
||||||
|
export default LevelListWithRouter;
|
||||||
|
@ -34,6 +34,7 @@ interface IState {
|
|||||||
|
|
||||||
levelList: {
|
levelList: {
|
||||||
loading: boolean;
|
loading: boolean;
|
||||||
|
snackbar: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
dashboard: {
|
dashboard: {
|
||||||
@ -91,6 +92,7 @@ const initialState: IState = {
|
|||||||
|
|
||||||
levelList: {
|
levelList: {
|
||||||
loading: true,
|
loading: true,
|
||||||
|
snackbar: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
dashboard: {
|
dashboard: {
|
||||||
@ -248,6 +250,12 @@ export function LateinicusApp(state: IState = initialState, action: any) {
|
|||||||
loading: action.state,
|
loading: action.state,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
case Actions.LEVELLIST_SET_SNACKBAR:
|
||||||
|
return Object.assign({}, state, {
|
||||||
|
levelList: Object.assign({}, state.levelList, {
|
||||||
|
snackbar: action.state,
|
||||||
|
}),
|
||||||
|
});
|
||||||
default:
|
default:
|
||||||
// Ignore the initialization call to the reducer. By that we can
|
// Ignore the initialization call to the reducer. By that we can
|
||||||
// catch all actions that are not implemented
|
// catch all actions that are not implemented
|
||||||
|
Reference in New Issue
Block a user