Skip to content
Snippets Groups Projects
Commit d72e71ae authored by Chif Gergő's avatar Chif Gergő
Browse files

Create me query, useMe hook and Remember me component

parent bceb3bc8
No related branches found
No related tags found
2 merge requests!19fix type imports,!17Authentication
import React from 'react'; import React from 'react';
import { QueryClient, QueryClientProvider } from 'react-query'; import { QueryClient, QueryClientProvider } from 'react-query';
import { BrowserRouter as Router } from 'react-router-dom'; import { BrowserRouter as Router } from 'react-router-dom';
import RememberMe from './components/RememberMe';
import { ClientContextProvider } from './context'; import { ClientContextProvider } from './context';
import ThemeProvider from './context/ThemeProvider'; import ThemeProvider from './context/ThemeProvider';
import { UserStateProvider } from './context/UserContext'; import { UserStateProvider } from './context/UserContext';
...@@ -14,11 +15,13 @@ function App(): React.ReactElement { ...@@ -14,11 +15,13 @@ function App(): React.ReactElement {
<QueryClientProvider client={queryClient}> <QueryClientProvider client={queryClient}>
<ClientContextProvider> <ClientContextProvider>
<UserStateProvider> <UserStateProvider>
<RememberMe>
<ThemeProvider theme={darkTheme}> <ThemeProvider theme={darkTheme}>
<Router> <Router>
<Routes /> <Routes />
</Router> </Router>
</ThemeProvider> </ThemeProvider>
</RememberMe>
</UserStateProvider> </UserStateProvider>
</ClientContextProvider> </ClientContextProvider>
</QueryClientProvider> </QueryClientProvider>
......
import Axios, { AxiosRequestConfig, AxiosResponse } from 'axios'; import Axios, { AxiosRequestConfig } from 'axios';
import { EmptyReq, LoginReq, RegisterReq, UserResponse } from './types'; import { UserResponse } from './types';
type LoginQuery = (data?: LoginReq) => Promise<AxiosResponse<UserResponse>>; type MeQuery = () => Promise<UserResponse>;
type RegisterQuery = (data?: RegisterReq) => Promise<AxiosResponse<UserResponse>>; type LogoutQuery = () => Promise<any>;
type MeQuery = (data?: EmptyReq, authToken?: string) => Promise<AxiosResponse<UserResponse>>;
export type AuthClient = { export type AuthClient = {
login: LoginQuery;
me: MeQuery; me: MeQuery;
register: RegisterQuery; logout: LogoutQuery;
}; };
export function auth(config: AxiosRequestConfig): AuthClient { export function auth(config: AxiosRequestConfig): AuthClient {
const axios = Axios.create({ const axios = Axios.create({
...config, ...config,
baseURL: `${config.baseURL}/api/auth`, baseURL: `${config.baseURL}/api/v1/`,
}); });
const login: LoginQuery = (data?: LoginReq): Promise<AxiosResponse<UserResponse>> => { const me: MeQuery = async (): Promise<UserResponse> => {
return axios.post<UserResponse>('/login', data); return (await axios.get<UserResponse>('/users/me')).data;
}; };
const register: RegisterQuery = (data?: RegisterReq): Promise<AxiosResponse<UserResponse>> => { const logout: LogoutQuery = async (): Promise<any> => {
return axios.post<UserResponse>('/register', data); return (await axios.get<any>('/logout')).data;
};
const me: MeQuery = (
data?: undefined,
authToken?: string,
): Promise<AxiosResponse<UserResponse>> => {
return axios.get<UserResponse>('/me', {
headers: { Authorization: `Bearer ${authToken}` },
});
}; };
return { return {
login,
register,
me, me,
logout,
}; };
} }
...@@ -17,6 +17,7 @@ import React, { useState } from 'react'; ...@@ -17,6 +17,7 @@ import React, { useState } from 'react';
import { useHistory } from 'react-router'; import { useHistory } from 'react-router';
import { useUserContext } from '../hooks/useUserContext'; import { useUserContext } from '../hooks/useUserContext';
import SCHBodyIcon from '../svg/SCHBodyIcon'; import SCHBodyIcon from '../svg/SCHBodyIcon';
import WrapperLink from './WrapperLink';
export interface AppBarMenuItem { export interface AppBarMenuItem {
id: number; id: number;
...@@ -188,9 +189,11 @@ const Header: React.FC<HeaderProps> = ({ customToolbar, handleLogout, menuItems ...@@ -188,9 +189,11 @@ const Header: React.FC<HeaderProps> = ({ customToolbar, handleLogout, menuItems
</Box> </Box>
</> </>
) : ( ) : (
<WrapperLink to="/api/v1/login">
<Button color="secondary" variant="contained"> <Button color="secondary" variant="contained">
Belépés Belépés
</Button> </Button>
</WrapperLink>
)} )}
</Toolbar> </Toolbar>
)} )}
......
import React, { useEffect } from 'react';
import useMe from '../hooks/useMe';
import { useUserContext } from '../hooks/useUserContext';
interface Props {}
const RememberMe: React.FC = ({ children }) => {
const { setProfile } = useUserContext();
const { data: me } = useMe();
useEffect(() => {
if (me) {
setProfile(me.user);
}
}, [me, setProfile]);
return <>{children}</>;
};
export default RememberMe;
...@@ -24,7 +24,7 @@ export const UserContext = createContext({} as UserContextType); ...@@ -24,7 +24,7 @@ export const UserContext = createContext({} as UserContextType);
const { Provider } = UserContext; const { Provider } = UserContext;
export const UserStateProvider: React.FC = ({ children }) => { export const UserStateProvider: React.FC = ({ children }) => {
const [profile, setProfile] = useState<IProfile | undefined>(initialState); const [profile, setProfile] = useState<IProfile | undefined>();
return <Provider value={{ profile, setProfile }}>{children}</Provider>; return <Provider value={{ profile, setProfile }}>{children}</Provider>;
}; };
......
import { useMutation } from 'react-query';
import useClientContext from './useClientContext';
export default function useLogin() {
const client = useClientContext();
return useMutation('login', client.client.auth.login);
}
import { useQuery, UseQueryResult } from 'react-query';
import { UserResponse } from '../client/types';
import useClientContext from './useClientContext';
export default function useMe(): UseQueryResult<UserResponse, Error> {
const client = useClientContext();
return useQuery<UserResponse, Error>('me', async () => client.client.auth.me());
}
...@@ -4,7 +4,7 @@ module.exports = function (app) { ...@@ -4,7 +4,7 @@ module.exports = function (app) {
app.use( app.use(
'/api/v1', '/api/v1',
createProxyMiddleware({ createProxyMiddleware({
target: 'https://body-dev.maze.sch.bme.hu/dev', target: process.env.REACT_APP_PROXY_TARGET,
changeOrigin: true, changeOrigin: true,
}), }),
); );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment