From 89c179c7e7719d9ba0df788604b385e3cf7a7d45 Mon Sep 17 00:00:00 2001 From: Romulus21 Date: Mon, 11 Sep 2023 08:24:22 +0200 Subject: [PATCH] clean css --- app/Http/Controllers/AuthController.php | 6 +-- app/Mail/Reset.php | 2 +- resources/js/components/Card.tsx | 15 ++++++ resources/js/components/Header.tsx | 19 ++++--- .../js/components/rainfall/AddRainfall.tsx | 35 ++++++------ .../js/components/rainfall/LastFiveMesure.tsx | 21 ++++---- resources/js/pages/App.tsx | 2 +- resources/js/pages/Auth/ForgotPassword.tsx | 40 ++++++++++++++ resources/js/pages/Auth/Login.tsx | 38 +++++++------ resources/js/pages/Auth/Profile.tsx | 21 +++++--- resources/js/pages/Auth/Register.tsx | 47 ++++++++-------- resources/js/pages/Auth/Reset.tsx | 54 +++++++++++++++++++ resources/js/pages/Home.tsx | 14 ++++- resources/js/pages/Rainfall.tsx | 4 +- resources/js/pages/Router.tsx | 6 ++- resources/views/mail/reset.blade.php | 10 ++-- routes/api.php | 6 ++- 17 files changed, 246 insertions(+), 94 deletions(-) create mode 100644 resources/js/components/Card.tsx create mode 100644 resources/js/pages/Auth/ForgotPassword.tsx create mode 100644 resources/js/pages/Auth/Reset.tsx diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index a13c916..69aece8 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -62,7 +62,7 @@ class AuthController extends Controller $token = Str::random(12); - DB::table('password_resets')->insert([ + DB::table('password_reset_tokens')->insert([ 'email' => $user->email, 'token' => $token, 'created_at' => now(), @@ -96,7 +96,7 @@ class AuthController extends Controller { $data = $request->validate([ 'email' => 'exists:users,email', - 'token' => 'exists:password_resets,token', + 'token' => 'exists:password_reset_tokens,token', 'password' => ['required', 'regex:/^(?=.*?[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$/'], 'confirm_password' => 'same:password', ], [ @@ -104,7 +104,7 @@ class AuthController extends Controller 'confirm_password.same' => __('validation.password_confirm'), ]); - $token = DB::table('password_resets') + $token = DB::table('password_reset_tokens') ->whereEmail($data['email']) ->whereToken($data['token']) ->orderBy('created_at', 'desc') diff --git a/app/Mail/Reset.php b/app/Mail/Reset.php index f8bacc3..8b97afb 100644 --- a/app/Mail/Reset.php +++ b/app/Mail/Reset.php @@ -40,7 +40,7 @@ class Reset extends Mailable return new Content( markdown: 'mail.reset', with: [ - 'link' => config('app.url').'/reset/'.$this->token, + 'link' => config('app.url').'/changer-le-mot-de-passe/'.$this->token, ], ); } diff --git a/resources/js/components/Card.tsx b/resources/js/components/Card.tsx new file mode 100644 index 0000000..c70b1d9 --- /dev/null +++ b/resources/js/components/Card.tsx @@ -0,0 +1,15 @@ +import React, {FC} from "react"; +import {PropsWithChildren} from "react"; + +const Card: FC> = ({children, className = ''}) => { + + return
+ {children} +
+} + +export default Card + +interface CardProps { + className?: string +} diff --git a/resources/js/components/Header.tsx b/resources/js/components/Header.tsx index 0a39c6f..3cda1ab 100644 --- a/resources/js/components/Header.tsx +++ b/resources/js/components/Header.tsx @@ -11,16 +11,19 @@ const Header = () => { Bermite - {authUser && } + {/*{authUser && }*/} - {authUser ? {authUser.name} + {authUser + ? + {authUser.name} + : - Connexion - S'inscrire - } + Connexion + {/*S'inscrire*/} + } } diff --git a/resources/js/components/rainfall/AddRainfall.tsx b/resources/js/components/rainfall/AddRainfall.tsx index f9b86cf..8cf2473 100644 --- a/resources/js/components/rainfall/AddRainfall.tsx +++ b/resources/js/components/rainfall/AddRainfall.tsx @@ -1,6 +1,7 @@ import React, {Dispatch, FC, FormEvent, SetStateAction, useState} from "react" import useAxiosTools from "../../hooks/AxiosTools"; import Field from "../Field"; +import Card from "../Card"; const AddRainfall: FC = ({reload}) => { @@ -20,22 +21,26 @@ const AddRainfall: FC = ({reload}) => { } } - return
-

Ajout d'une mesure

- setDate(event.target.value)} - autoFocus>Date - setValue(Number(event.target.value))}>Mesure + return +

+ Ajout d'une mesure +

+ + setDate(event.target.value)} + autoFocus>Date + setValue(Number(event.target.value))}>Mesure - - + + +
} export default AddRainfall diff --git a/resources/js/components/rainfall/LastFiveMesure.tsx b/resources/js/components/rainfall/LastFiveMesure.tsx index 1b638cf..91f6066 100644 --- a/resources/js/components/rainfall/LastFiveMesure.tsx +++ b/resources/js/components/rainfall/LastFiveMesure.tsx @@ -2,6 +2,7 @@ import React, {FC, useEffect, useState} from "react" import useAxiosTools from "../../hooks/AxiosTools"; import {rainfall} from "../../types"; import {AxiosError} from "axios"; +import Card from "../Card"; const LastFiveMesure: FC = ({loadedAt}) => { @@ -25,16 +26,18 @@ const LastFiveMesure: FC = ({loadedAt}) => { } } - return
-

5 dernières mesures

+ return +

5 dernières mesures

{error &&
{error}
} -
    - {data.map(line =>
  • - {(new Date(line.date)).toLocaleDateString()} - {line.value} -
  • )} -
-
+ + + {data.map(line => + + + )} + +
{(new Date(line.date)).toLocaleDateString()}{line.value}
+ } export default LastFiveMesure diff --git a/resources/js/pages/App.tsx b/resources/js/pages/App.tsx index 2a689ec..42ad917 100644 --- a/resources/js/pages/App.tsx +++ b/resources/js/pages/App.tsx @@ -4,7 +4,7 @@ import Router from "./Router"; const App = () => { - return
+ return
diff --git a/resources/js/pages/Auth/ForgotPassword.tsx b/resources/js/pages/Auth/ForgotPassword.tsx new file mode 100644 index 0000000..fa2c15e --- /dev/null +++ b/resources/js/pages/Auth/ForgotPassword.tsx @@ -0,0 +1,40 @@ +import React, {FormEvent, SyntheticEvent, useState} from "react" +import Field from "../../components/Field"; +import axios from "axios"; +import {useNavigate} from "react-router-dom"; +import useAuthUser from "../../hooks/AuthUser"; + +const ForgotPassword = () => { + + const [email, setEmail] = useState('') + const [message, setMessage] = useState(false) + + const handleSubmit = async (event: FormEvent) => { + event.preventDefault() + try { + await axios.get('/sanctum/csrf-cookie') + const res = await axios.post('/api/forgot', {email}) + setMessage(true) + } catch (e) { + console.error(e) + } + } + + return
+
+

Connexion

+ + {message &&

Un email vous a été envoyer pour modifier le mot de passe.

} + + setEmail(event.target.value)} + autoFocus>Email + +
+
+} + +export default ForgotPassword diff --git a/resources/js/pages/Auth/Login.tsx b/resources/js/pages/Auth/Login.tsx index 468a1bd..56f975a 100644 --- a/resources/js/pages/Auth/Login.tsx +++ b/resources/js/pages/Auth/Login.tsx @@ -1,8 +1,9 @@ import React, {FormEvent, SyntheticEvent, useState} from "react" import Field from "../../components/Field"; import axios from "axios"; -import {useNavigate} from "react-router-dom"; +import {Link, useNavigate} from "react-router-dom"; import useAuthUser from "../../hooks/AuthUser"; +import Card from "../../components/Card"; const Login = () => { @@ -24,22 +25,27 @@ const Login = () => { } return
-
-

Connexion

+ + +

+ Connexion +

- setEmail(event.target.value)} - autoFocus>Email - setPassword(event.target.value)}>Mot de passe - - + setEmail(event.target.value)} + autoFocus>Email + setPassword(event.target.value)}>Mot de passe + + Mot de passe oublié ? + +
} diff --git a/resources/js/pages/Auth/Profile.tsx b/resources/js/pages/Auth/Profile.tsx index 22e0018..daee8e5 100644 --- a/resources/js/pages/Auth/Profile.tsx +++ b/resources/js/pages/Auth/Profile.tsx @@ -1,19 +1,24 @@ import React from "react"; import useAuthUser from "../../hooks/AuthUser"; +import PageLayout from "../../components/PageLayout"; const Profile = () => { - const {authUser} = useAuthUser() + const {authUser, logout} = useAuthUser() - return <> -

Profile

+ return +

Profile

- Nom: {authUser?.name} +
Nom: {authUser?.name}
+
Email: {authUser?.email}
-
Update name & email
-
Change password
-
Delete Account
- +
+ +
+ {/*
Update name & email
*/} + {/*
Change password
*/} + {/*
Delete Account
*/} +
} export default Profile diff --git a/resources/js/pages/Auth/Register.tsx b/resources/js/pages/Auth/Register.tsx index faa8cc8..d651b4c 100644 --- a/resources/js/pages/Auth/Register.tsx +++ b/resources/js/pages/Auth/Register.tsx @@ -2,6 +2,7 @@ import React, {ChangeEvent, FormEvent, SyntheticEvent, useState} from "react" import Field from "../../components/Field"; import axios from "axios"; import {useNavigate} from "react-router-dom"; +import Card from "../../components/Card"; const Register = () => { @@ -23,28 +24,32 @@ const Register = () => { } return
-
-

S'inscrire

+ + +

+ S'inscrire +

- setName(event.target.value)} - autoFocus>Nom - setEmail(event.target.value)} - autoFocus>Email - setPassword(event.target.value)} - autoFocus>Mot de passe - - + setName(event.target.value)} + autoFocus>Nom + setEmail(event.target.value)} + autoFocus>Email + setPassword(event.target.value)} + autoFocus>Mot de passe + + +
} diff --git a/resources/js/pages/Auth/Reset.tsx b/resources/js/pages/Auth/Reset.tsx new file mode 100644 index 0000000..de6d6c3 --- /dev/null +++ b/resources/js/pages/Auth/Reset.tsx @@ -0,0 +1,54 @@ +import PageLayout from "../../components/PageLayout"; +import Field from "../../components/Field"; +import React, {FormEvent, useState} from "react"; +import {useNavigate, useParams} from "react-router-dom"; +import useAuthUser from "../../hooks/AuthUser"; +import axios from "axios"; + +const Reset = () => { + + let {token} = useParams() + const navigate = useNavigate() + const {setAuthUser} = useAuthUser() + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [samePassword, setSamePassword] = useState('') + + const handleSubmit = async (event: FormEvent) => { + event.preventDefault() + try { + await axios.get('/sanctum/csrf-cookie') + const res = await axios.post('/api/reset', {email, token, password, samePassword}) + setAuthUser(res.data.user) + navigate('/connexion') + } catch (e) { + console.error(e) + } + } + + return
+
+

Connexion

+ + setEmail(event.target.value)} + autoFocus>Email + setPassword(event.target.value)}>Mot de passe + setSamePassword(event.target.value)}>Confirmation du mot de passe + +
+
+} + +export default Reset diff --git a/resources/js/pages/Home.tsx b/resources/js/pages/Home.tsx index d627427..ebe994b 100644 --- a/resources/js/pages/Home.tsx +++ b/resources/js/pages/Home.tsx @@ -1,10 +1,20 @@ import React from "react" import {Link} from "react-router-dom"; +import useAuthUser from "../hooks/AuthUser"; +import Rainfall from "./Rainfall"; const Home = () => { - return
Home Connexion - S'inscrire + const {authUser} = useAuthUser() + + return
+ {authUser + ? + :
+

Application pour enregistrer sa pluviométrie

+

Un compte est nécessaire mais les inscriptions ne sont pas ouvertes.

+
+ }
} diff --git a/resources/js/pages/Rainfall.tsx b/resources/js/pages/Rainfall.tsx index ae55f48..ca63931 100644 --- a/resources/js/pages/Rainfall.tsx +++ b/resources/js/pages/Rainfall.tsx @@ -38,12 +38,12 @@ const Rainfall = () => { } return -
+
-
+ { @@ -22,7 +24,9 @@ const Router = () => { } /> } /> } /> - } /> + {/*} />*/} + } /> + } /> } /> } /> diff --git a/resources/views/mail/reset.blade.php b/resources/views/mail/reset.blade.php index de9a155..f06738b 100644 --- a/resources/views/mail/reset.blade.php +++ b/resources/views/mail/reset.blade.php @@ -1,12 +1,12 @@ -# Introduction +# Créer un nouveau mot de passe -The body of your message. +Veuillez cliquer sur le bouton de réinitilisation de votre de mot de passe. - -Button Text + + Réinitialisation de mot de passe -Thanks,
+Merci,
{{ config('app.name') }}
diff --git a/routes/api.php b/routes/api.php index ecad50a..fbc2772 100644 --- a/routes/api.php +++ b/routes/api.php @@ -17,14 +17,16 @@ use Illuminate\Support\Facades\Route; */ Route::post('/login', [AuthController::class, 'login'])->name('login'); +Route::post('/forgot', [AuthController::class, 'forgot'])->name('forgot'); Route::post('/register', [AuthController::class, 'register'])->name('register'); +Route::post('/reset', [AuthController::class, 'reset'])->name('reset'); Route::middleware('auth:sanctum')->group(function () { Route::get('/user', [AuthController::class, 'user'])->name('user'); Route::delete('/logout', [AuthController::class, 'logout'])->name('logout'); - Route::get('rainfalls/last', [RainfallController::class, 'lastRainfalls'])->name('rainfalls.last'); - Route::get('rainfalls/graph', [RainfallController::class, 'graphValue'])->name('rainfalls.graph'); + Route::get('/rainfalls/last', [RainfallController::class, 'lastRainfalls'])->name('rainfalls.last'); + Route::get('/rainfalls/graph', [RainfallController::class, 'graphValue'])->name('rainfalls.graph'); Route::post('rainfalls', [RainfallController::class, 'store'])->name('rainfall.store'); // Route::resource('rainfalls', RainfallController::class);