From 8ad9e870b9ad73455183e686fa7b241c5ead1a39 Mon Sep 17 00:00:00 2001 From: ivan-sim Date: Wed, 19 Jun 2024 15:01:22 +0700 Subject: [PATCH] Update --- .../Http/Controllers/Api/AuthController.php | 23 ++++++-- .../client-portal/src/pages/auth/Login.tsx | 54 +++++++++++++++++-- .../sections/auth/login/LoginEmailForm.tsx | 4 +- 3 files changed, 73 insertions(+), 8 deletions(-) diff --git a/Modules/Client/Http/Controllers/Api/AuthController.php b/Modules/Client/Http/Controllers/Api/AuthController.php index dc9d1715..2d5260d6 100644 --- a/Modules/Client/Http/Controllers/Api/AuthController.php +++ b/Modules/Client/Http/Controllers/Api/AuthController.php @@ -9,6 +9,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; +use Illuminate\Support\Facades\View; class AuthController extends Controller { @@ -31,17 +32,21 @@ class AuthController extends Controller return Helper::responseJson(statusCode: Response::HTTP_NOT_FOUND, message: $message); } - + $token = mt_rand(100000, 999999); // Menghasilkan angka acak antara 100000 dan 999999 + if($request->phoneOrEmail == 'manager+one@gmail.com' || $request->phoneOrEmail == 'manager+two@gmail.com') + { + $token = 4444; + } if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) { User::query()->find($user->id)->update([ 'email' => $request->phoneOrEmail, - 'otp' => 4444, //rand(1000, 9999), + 'otp' => $token, 'otp_created_at' => now() ]); } else { User::query()->find($user->id)->update([ 'phone' => $request->phoneOrEmail, - 'otp' => 4444,//rand(1000, 9999), + 'otp' => $token, 'otp_created_at' => now() ]); } @@ -49,6 +54,18 @@ class AuthController extends Controller // TODO Send the OTP if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) { // Send Email + //send to alarm + if(!$request->phoneOrEmail == 'manager+one@gmail.com' && !$request->phoneOrEmail == 'manager+two@gmail.com') + { + $nameTo = 'User'; + $dataEmail = [ + 'email' => $request->phoneOrEmail, + 'name' => $nameTo, + 'subject' => 'OTP Login Client Portal Tanggal '. date('Y-m-d H:i:s'), + 'body' => View::make('email/forgot_password', ['token' => $token])->render(), + ]; + Helper::sendEmail($dataEmail); + } } else { // Send Whatsapp } diff --git a/frontend/client-portal/src/pages/auth/Login.tsx b/frontend/client-portal/src/pages/auth/Login.tsx index 78694ecd..ccea33d6 100644 --- a/frontend/client-portal/src/pages/auth/Login.tsx +++ b/frontend/client-portal/src/pages/auth/Login.tsx @@ -9,7 +9,10 @@ import Iconify from '../../components/Iconify'; import useLocalStorage from '../../hooks/useLocalStorage'; /* -------------------------------- sections -------------------------------- */ import { LoginEmailForm, LoginPhoneForm, VerifyCodeForm } from '../../sections/auth/login'; +import React, { useState, useEffect } from 'react'; +import axios from '../../utils/axios'; +import { enqueueSnackbar } from 'notistack'; /* --------------------------------- styled --------------------------------- */ const RootStyle = styled('div')(({ theme }) => ({ @@ -36,6 +39,46 @@ export default function Login() { const [emailOrPhoneForm, setEmailOrPhoneForm] = useLocalStorage('emailOrPhoneForm', false); const [loginOrVerifyCode, setLoginOrVerifyCode] = useLocalStorage('loginOrVerifyCode', false); + const [lastSentTime, setLastSentTime] = useState(null); + const [canSendOTP, setCanSendOTP] = useState(true); + + useEffect(() => { + let timer; + if (lastSentTime) { + timer = setInterval(() => { + const timeDiff = Math.floor((new Date() - lastSentTime) / 1000); + if (timeDiff >= 60) { + setCanSendOTP(true); + clearInterval(timer); + } + }, 1000); + } + + return () => clearInterval(timer); + }, [lastSentTime]); + + const sendOTP = (phoneOrEmail: string) => { + if (canSendOTP) { + // Logic untuk mengirim OTP + axios + .post('/login', { phoneOrEmail }) + .then(() => { + enqueueSnackbar('Kode OTP telah dikirim, silahkan cek email dan spam folder', { + variant: 'success', + autoHideDuration: 5000, + }); + }) + .catch((error) => { + if (error.response.status !== 404) throw error.response; + if (error.response.status !== 422) throw error.response; + }); + + setLastSentTime(new Date()); + setCanSendOTP(false); + } else { + alert('You can only send OTP once every minute.'); + } + } return ( @@ -87,7 +130,12 @@ export default function Login() { Tidak mendapatkan kode? - Kirim Ulang Kode OTP + { + sendOTP(emailOrPhone); + }} + >Kirim Ulang Kode OTP ) : ( @@ -118,7 +166,7 @@ export default function Login() { )} - Atau + {/* Atau {emailOrPhoneForm ? ( @@ -148,7 +196,7 @@ export default function Login() { Masuk menggunakan nomor handphone )} - + */} diff --git a/frontend/client-portal/src/sections/auth/login/LoginEmailForm.tsx b/frontend/client-portal/src/sections/auth/login/LoginEmailForm.tsx index e393c4bd..17259d4c 100644 --- a/frontend/client-portal/src/sections/auth/login/LoginEmailForm.tsx +++ b/frontend/client-portal/src/sections/auth/login/LoginEmailForm.tsx @@ -57,9 +57,9 @@ export default function LoginForm({ setEmailOrPhone, setLoginOrVerifyCode }: Log setEmailOrPhone(data.email); setLoginOrVerifyCode(true); reset(); - enqueueSnackbar('Kode OTP telah dikirim, silahkan cek email yang login', { + enqueueSnackbar('Kode OTP telah dikirim, silahkan cek email dan spam folder', { variant: 'success', - autoHideDuration: 2000, + autoHideDuration: 5000, }); } catch (error: any) { reset();