diff --git a/package.json b/package.json index 20b9a5e3295a90964a98092f613016a370776dc5..ced9dca458bb8278f4cbaa884ce86e1675849348 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@testing-library/user-event": "^12.1.10", "@tinymce/tinymce-react": "^3.12.6", "axios": "^0.21.1", + "jwt-decode": "^3.1.2", "react": "^17.0.2", "react-dom": "^17.0.2", "react-router-dom": "^5.2.0", diff --git a/src/App.tsx b/src/App.tsx index 6b049e5c766e705972d543382a9011289f2ce515..ea280ca675cf325259775f7ef7112fb0e0f7e984 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,21 +2,14 @@ import React, { createContext } from 'react' import { BrowserRouter } from 'react-router-dom' import Layout from './components/Layout/Layout' import Routes from './components/Routes/Routes' -// import { UserContext } from './hooks/userContext' -// import useFindUser from './hooks/useFindUser' -interface userContext { - user: string -} -export const userProfile: userContext = { - user: '', -} -const UserContext: React.Context<userContext> = createContext(userProfile) +import { useAuth } from './hooks/useAuth' +import { UserContext } from './hooks/userContext' -// const { user, setUser, isLoading } = useFindUser() function App() { + const { user, setUser, loginUser, isLogged } = useAuth() return ( <BrowserRouter> - <UserContext.Provider value={userProfile}> + <UserContext.Provider value={{ user, setUser, isLogged, loginUser }}> <Layout> <Routes /> </Layout> diff --git a/src/components/Editing/Editing.tsx b/src/components/Editing/Editing.tsx index ababfcbfbb19ea3f91a20c1758374815d4fd735b..feceb9b27c95d5c0544a6eecd91756e8322f9066 100644 --- a/src/components/Editing/Editing.tsx +++ b/src/components/Editing/Editing.tsx @@ -1,17 +1,24 @@ -import React, { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useContext, useEffect, useState } from 'react' import { Editor } from '@tinymce/tinymce-react' import DateSelector from '../DateSelector/DateSelector' import './editing.scss' import { MonthlyNewsService } from '../../services/monthlyNews.service' +import { UserContext } from '../../hooks/userContext' +import { MonthlyNews } from '../../models/monthlyNews.model' const Editing: React.FC = () => { const [date, setDate] = useState<Date>(new Date()) const [header, setHeader] = useState<string>('') const [quote, setQuote] = useState<string>('') - + const { user }: any = useContext(UserContext) const handleSave = async () => { const monthlyNewsService = new MonthlyNewsService() - await monthlyNewsService.createMonthlyReport(date, header, quote) + await monthlyNewsService.createMonthlyReport( + date, + header, + quote, + user.xsrftoken + ) } const handleCancel = useCallback(() => { setQuote('') @@ -23,13 +30,21 @@ const Editing: React.FC = () => { } else return true } useEffect(() => { - async function authenticate() { + async function getCurrentMonthlyNews() { const monthlyNewsService = new MonthlyNewsService() - const res = await monthlyNewsService.apiAuth() - console.log('res', res) + const news: MonthlyNews = await monthlyNewsService.getSingleMonthlyReport( + date.getFullYear(), + date.getMonth(), + user.xsrftoken + ) + console.log('news', news) + if (news) { + setHeader(news.header) + setQuote(news.quote) + } } - authenticate() - }, []) + getCurrentMonthlyNews() + }, [date]) return ( <> diff --git a/src/components/Login/Login.tsx b/src/components/Login/Login.tsx index 73e5c9f5c6cc9a3513794c46a3394c9f7a0974a2..6bc50137e01df31f31b8626e097f34d8d74687ab 100644 --- a/src/components/Login/Login.tsx +++ b/src/components/Login/Login.tsx @@ -1,15 +1,14 @@ -import React, { useEffect } from 'react' -import { userProfile } from '../../App' +import React, { useContext } from 'react' +import { useAuth } from '../../hooks/useAuth' +import { UserContext } from '../../hooks/userContext' +// import { userProfile } from '../../App' // import { UserContext } from '../../hooks/userContext' const Login: React.FC = () => { - // const [isLogged] = useState<boolean>(false) + const { user, setUser, loginUser } = useContext(UserContext) - useEffect(() => { - userProfile.user = 'testUser' - }, []) return ( <div className="login"> - <button>Login</button> + <button onClick={loginUser}>Login</button> </div> ) } diff --git a/src/components/Routes/Routes.tsx b/src/components/Routes/Routes.tsx index 99bb4c66a812ab022b74bcaac295050595082d4b..9cf3a0831f335d4b3473c86d00150160a1f41022 100644 --- a/src/components/Routes/Routes.tsx +++ b/src/components/Routes/Routes.tsx @@ -1,14 +1,24 @@ -import React from 'react' +import React, { useContext } from 'react' import { Redirect, Route, Switch } from 'react-router-dom' +import { UserContext } from '../../hooks/userContext' import Editing from '../Editing/Editing' +import Login from '../Login/Login' import Settings from '../Settings/Settings' const Routes: React.FC = () => { + const { isLogged } = useContext(UserContext) return ( <Switch> - <Route path="/editing" component={Editing} /> - <Route path="/settings" component={Settings} /> - <Redirect path="*" to="/editing" /> + <Route path="/login" component={Login} /> + {isLogged ? ( + <> + <Route path="/editing" component={Editing} /> + <Route path="/settings" component={Settings} /> + <Redirect path="*" to="/editing" /> + </> + ) : ( + <Redirect path="*" to="/login" /> + )} </Switch> ) } diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts new file mode 100644 index 0000000000000000000000000000000000000000..38f20c396598955a5b3e138f76c42c454a88fd39 --- /dev/null +++ b/src/hooks/useAuth.ts @@ -0,0 +1,36 @@ +import React, { useState, useContext } from 'react' +import { useHistory } from 'react-router-dom' +import axios from 'axios' +import { UserContext } from './userContext' +import { User } from '../models/user.model' + +const _apiUrl: string = 'https://localhost:1443/' + +export interface Auth { + user: User + setUser: React.Dispatch<any> + loginUser: () => void + error: null + isLogged: boolean +} +export const useAuth = (): Auth => { + const [user, setUser] = useState<any>(null) + const [isLogged, setisLogged] = useState(false) + const [error, setError] = useState(null) + + //login user + const loginUser = async () => { + try { + await axios.get(`${_apiUrl}OAuth2Login`) + const { data } = await axios.get(`${_apiUrl}api/common/WhoAmI`) + if (data) { + setisLogged(true) + console.log(data) + setUser(data) + } + } catch (e) { + setError(e) + } + } + return { user, setUser, loginUser, error, isLogged } +} diff --git a/src/hooks/userContext.ts b/src/hooks/userContext.ts new file mode 100644 index 0000000000000000000000000000000000000000..851a020192f33b125dc97afa982b68aa31930988 --- /dev/null +++ b/src/hooks/userContext.ts @@ -0,0 +1,11 @@ +import { createContext } from 'react' +import { User } from '../models/user.model' + +export interface UserContextProps { + user: User + setUser: React.Dispatch<any> + loginUser: () => void + error: null + isLogged: boolean +} +export const UserContext = createContext<Partial<UserContextProps>>({}) diff --git a/src/models/monthlyNews.model.ts b/src/models/monthlyNews.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..a85ec819beba977b1280c269303a2fd585f6818f --- /dev/null +++ b/src/models/monthlyNews.model.ts @@ -0,0 +1,6 @@ +export interface MonthlyNews { + year: number + month: number + header: string + quote: string +} diff --git a/src/models/user.model.ts b/src/models/user.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..914cb4cbc59bde1285375e8fc93a3c3e5fbd6500 --- /dev/null +++ b/src/models/user.model.ts @@ -0,0 +1,7 @@ +export interface User { + displayName: string + id: string + isAdmin: boolean + login: string + xsrftoken: string +} diff --git a/src/services/monthlyNews.service.ts b/src/services/monthlyNews.service.ts index dbe964fdcfdf6898672c7c1ef0f2efb41af59678..0c6cbf853993464be7b4b5fb2ab7b6a1cbfcb98b 100644 --- a/src/services/monthlyNews.service.ts +++ b/src/services/monthlyNews.service.ts @@ -1,5 +1,5 @@ import axios from 'axios' -import https from 'https' +import { MonthlyNews } from '../models/monthlyNews.model' export class MonthlyNewsService { private readonly _apiUrl: string constructor() { @@ -14,27 +14,24 @@ export class MonthlyNewsService { public createMonthlyReport = async ( date: Date, header: string, - quote: string + quote: string, + token: string ): Promise<void> => { try { - const response = await fetch( - 'https://localhost:1443/api/admin/monthlyNews', + await axios.post( + `${this._apiUrl}api/admin/monthlyNews`, { - method: 'POST', - body: JSON.stringify({ - month: date.getMonth(), - year: date.getFullYear(), - header: header, - quote: quote, - }), + month: date.getMonth(), + year: date.getFullYear(), + header: header, + quote: quote, + }, + { + headers: { + 'XSRF-TOKEN': token, + }, } ) - if (response.status !== 201) { - throw new Error( - `Le post n'a pas pu être créé (code ${response.status})` - ) - } - console.log('Le post a été créé avec succès') } catch (e) { console.log(e) } @@ -44,52 +41,23 @@ export class MonthlyNewsService { * Gets a quotation and header for selected month */ public getSingleMonthlyReport = async ( - year: string, - month: string - ): Promise<any> => { + year: number, + month: number, + token: string + ): Promise<MonthlyNews | any> => { try { - const response = await fetch( - 'https://localhost:1443/api/admin/monthlyNews', + const { data } = await axios.get( + `${this._apiUrl}api/admin/monthlyNews/${year}/${month}`, { - method: 'GET', - body: JSON.stringify({ - year: year, - month: month, - }), + headers: { + 'XSRF-TOKEN': token, + }, } ) - if (response.status !== 201) { - throw new Error( - `Erreur lors de la récupération (code ${response.status})` - ) - } - return response.json() - } catch (e) { - console.log(e) - } - } - /** - * apiAuth */ - public apiAuth = async (): Promise<any> => { - try { - axios.get(`${this._apiUrl}OAuth2Login`).finally(async () => { - const { data } = await axios.get(`${this._apiUrl}api/common/WhoAmI`) - console.log(data) - }) - } catch (e) { - console.log(e) - } - } - - /** - * getToken - */ - public getToken = async (): Promise<any> => { - try { - const response = await axios.get(`${this._apiUrl}api/common/WhoAmI`) - console.log(response) + return data as MonthlyNews } catch (e) { - console.log(e) + console.log('error', e) + return } } } diff --git a/yarn.lock b/yarn.lock index f58501a2402a43273416a5e090c09f60139d5c84..d88552004718232d3ddf0a3c3d2d1f102076e4c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7222,6 +7222,11 @@ jsprim@^1.2.2: array-includes "^3.1.2" object.assign "^4.1.2" +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"