79 lines
2.6 KiB
TypeScript
79 lines
2.6 KiB
TypeScript
import React, { Dispatch, useEffect } from "react";
|
|
import { Page } from "@/pages/base";
|
|
import { Button, Container } from "@material-ui/core";
|
|
import { Action, StudentActions, useDispatch } from "@/state/actions";
|
|
import { Route, Switch, useHistory, useLocation, useRouteMatch } from "react-router-dom";
|
|
import { route } from "@/routing";
|
|
import { useVerticalSpacing } from "@/styles";
|
|
import { AppState } from "@/state/reducer";
|
|
|
|
import api from "@/api";
|
|
import { UserActions } from "@/state/actions/user";
|
|
import { getAuthorizeUrl } from "@/api/user";
|
|
|
|
const authorizeUser = (code: string) => async (dispatch: Dispatch<Action>, getState: () => AppState): Promise<void> => {
|
|
const token = await api.user.login(code);
|
|
|
|
dispatch({
|
|
type: UserActions.Login,
|
|
token,
|
|
})
|
|
|
|
const student = await api.student.current();
|
|
dispatch({
|
|
type: StudentActions.Set,
|
|
student: student,
|
|
})
|
|
}
|
|
|
|
export const UserLoginPage = () => {
|
|
const dispatch = useDispatch();
|
|
const history = useHistory();
|
|
const match = useRouteMatch();
|
|
const location = useLocation();
|
|
const query = new URLSearchParams(useLocation().search);
|
|
|
|
const handleSampleLogin = async () => {
|
|
await dispatch(authorizeUser("test"));
|
|
|
|
history.push(route("home"));
|
|
}
|
|
|
|
const handlePgLogin = async () => {
|
|
history.push(route("user_login") + "/pg");
|
|
}
|
|
|
|
const classes = useVerticalSpacing(3);
|
|
|
|
useEffect(() => {
|
|
(async function() {
|
|
if (location.pathname === `${match.path}/check/pg`) {
|
|
await dispatch(authorizeUser(query.get("code") as string));
|
|
history.push("/");
|
|
}
|
|
})();
|
|
}, [ match.path ]);
|
|
|
|
return <Page>
|
|
<Page.Header maxWidth="md">
|
|
<Page.Title>Zaloguj się</Page.Title>
|
|
</Page.Header>
|
|
<Container>
|
|
<Switch>
|
|
<Route path={match.path} exact>
|
|
<Container maxWidth="md" className={ classes.root }>
|
|
<Button fullWidth onClick={ handlePgLogin } variant="contained" color="primary">Zaloguj się z pomocą konta PG</Button>
|
|
<Button fullWidth onClick={ handleSampleLogin } variant="contained" color="secondary">Zaloguj jako przykładowy student</Button>
|
|
</Container>
|
|
</Route>
|
|
<Route path={`${match.path}/pg`} render={
|
|
() => (window.location.href = getAuthorizeUrl())
|
|
} />
|
|
<Route path={`${match.path}/check/pg`}>
|
|
Kod: { query.get("code") }
|
|
</Route>
|
|
</Switch>
|
|
</Container>
|
|
</Page>;
|
|
}
|