From e33a330786ffbfcd774de00dc697c6dff47faf27 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Mon, 20 Feb 2023 14:20:44 +0700 Subject: fix --- src/core/components/elements/Alert/Alert.jsx | 21 +++++ src/core/components/elements/Link/Link.jsx | 2 +- src/core/components/elements/Sidebar/Sidebar.jsx | 26 +++++++ src/core/components/elements/Spinner/Spinner.jsx | 13 ++++ src/core/utils/greeting.js | 9 +++ src/lib/auth/api/loginApi.js | 12 +++ src/lib/auth/components/Login.jsx | 99 ++++++++++++++++++++++++ src/lib/cart/components/Cart.jsx | 6 ++ src/pages/login.jsx | 7 ++ 9 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 src/core/components/elements/Alert/Alert.jsx create mode 100644 src/core/components/elements/Spinner/Spinner.jsx create mode 100644 src/core/utils/greeting.js create mode 100644 src/lib/auth/api/loginApi.js create mode 100644 src/lib/auth/components/Login.jsx create mode 100644 src/pages/login.jsx diff --git a/src/core/components/elements/Alert/Alert.jsx b/src/core/components/elements/Alert/Alert.jsx new file mode 100644 index 00000000..3f5584b9 --- /dev/null +++ b/src/core/components/elements/Alert/Alert.jsx @@ -0,0 +1,21 @@ +const Alert = ({ children, className, type }) => { + let typeClass = '' + switch (type) { + case 'info': + typeClass = 'bg-blue-100 text-blue-900 border-blue-400' + break + case 'success': + typeClass = 'bg-green-100 text-green-900 border-green-400' + break + case 'warning': + typeClass = 'bg-yellow-100 text-yellow-900 border-yellow-400' + break + } + return ( +
+ {children} +
+ ) +} + +export default Alert \ No newline at end of file diff --git a/src/core/components/elements/Link/Link.jsx b/src/core/components/elements/Link/Link.jsx index a619164d..897cf6d7 100644 --- a/src/core/components/elements/Link/Link.jsx +++ b/src/core/components/elements/Link/Link.jsx @@ -5,7 +5,7 @@ const Link = ({ children, ...props }) => { {children} diff --git a/src/core/components/elements/Sidebar/Sidebar.jsx b/src/core/components/elements/Sidebar/Sidebar.jsx index 249ccbce..74984393 100644 --- a/src/core/components/elements/Sidebar/Sidebar.jsx +++ b/src/core/components/elements/Sidebar/Sidebar.jsx @@ -1,14 +1,40 @@ +import { getAuth } from "@/core/utils/auth" import Link from "../Link/Link" +import greeting from "@/core/utils/greeting" +import { Cog6ToothIcon } from "@heroicons/react/24/solid" const Sidebar = ({ active, close }) => { + const auth = getAuth() + return ( <> { active &&
}
+
+ { !auth && ( + <> + Daftar + Masuk + + ) } + { auth && ( + <> +
+ {/* { greeting() }, */} + + { auth?.name } + +
+ + + + + ) } +
Semua Brand diff --git a/src/core/components/elements/Spinner/Spinner.jsx b/src/core/components/elements/Spinner/Spinner.jsx new file mode 100644 index 00000000..60f88279 --- /dev/null +++ b/src/core/components/elements/Spinner/Spinner.jsx @@ -0,0 +1,13 @@ +const Spinner = ({ className }) => { + return ( +
+ + Loading... +
+ ) +} + +export default Spinner \ No newline at end of file diff --git a/src/core/utils/greeting.js b/src/core/utils/greeting.js new file mode 100644 index 00000000..014c0e3c --- /dev/null +++ b/src/core/utils/greeting.js @@ -0,0 +1,9 @@ +const greeting = () => { + let hours = new Date().getHours() + if (hours < 11) return 'Selamat Pagi' + if (hours < 15) return 'Selamat Siang' + if (hours < 18) return 'Selamat Sore' + return 'Selamat Malam' +} + +export default greeting \ No newline at end of file diff --git a/src/lib/auth/api/loginApi.js b/src/lib/auth/api/loginApi.js new file mode 100644 index 00000000..4782680c --- /dev/null +++ b/src/lib/auth/api/loginApi.js @@ -0,0 +1,12 @@ +import odooApi from "@/core/api/odooApi" + +const loginApi = async ({email, password}) => { + let result = await odooApi( + 'POST', + '/api/v1/user/login', + {email, password} + ) + return result +} + +export default loginApi \ No newline at end of file diff --git a/src/lib/auth/components/Login.jsx b/src/lib/auth/components/Login.jsx new file mode 100644 index 00000000..e598fe48 --- /dev/null +++ b/src/lib/auth/components/Login.jsx @@ -0,0 +1,99 @@ +import Image from "next/image" +import IndoteknikLogo from "@/images/logo.png" +import Link from "@/core/components/elements/Link/Link" +import { useState } from "react" +import loginApi from "../api/loginApi" +import { useRouter } from "next/router" +import Alert from "@/core/components/elements/Alert/Alert" +import { setAuth } from "@/core/utils/auth" + +const Login = () => { + const router = useRouter() + const [ email, setEmail ] = useState('') + const [ password, setPassword ] = useState('') + const [ isLoading, setIsLoading ] = useState(false) + const [ alert, setAlert ] = useState(null) + + const handleSubmit = async (e) => { + e.preventDefault() + setIsLoading(true) + const login = await loginApi({ email, password }) + setIsLoading(false) + + if (login.isAuth) { + setAuth(login.user) + router.push('/') + return + } + switch (login.reason) { + case 'NOT_FOUND': + setAlert({ + children: 'Email atau password tidak cocok', + type: 'info' + }) + break + case 'NOT_ACTIVE': + setAlert({ + children: ( + <> + Email belum diaktivasi, + aktivasi sekarang + + ), + type: 'info' + }) + break + } + } + + return ( +
+ + Logo Indoteknik + +

Mulai Belanja Sekarang

+

Masuk ke akun kamu untuk belanja

+ + { alert && ( + + { alert.children } + + ) } + +
+
+ + setEmail(e.target.value)} + placeholder="contoh@email.com" + /> +
+
+ + setPassword(e.target.value)} + placeholder="••••••••••••" + /> +
+ +
+

Belum punya akun Indoteknik? Daftar

+
+ ) +} + +export default Login \ No newline at end of file diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx index 4b9dd41f..bb1f21f6 100644 --- a/src/lib/cart/components/Cart.jsx +++ b/src/lib/cart/components/Cart.jsx @@ -9,6 +9,7 @@ import { createSlug } from "@/core/utils/slug" import { useRouter } from "next/router" import BottomPopup from "@/core/components/elements/Popup/BottomPopup" import { toast } from "react-hot-toast" +import Spinner from "@/core/components/elements/Spinner/Spinner" const Cart = () => { const router = useRouter() @@ -119,6 +120,11 @@ const Cart = () => {
+ { cart.isLoading && ( +
+ +
+ ) } { products?.map((product) => (