diff --git a/app/auth/layout.tsx b/app/auth/layout.tsx index 27799fd..feb3fd4 100644 --- a/app/auth/layout.tsx +++ b/app/auth/layout.tsx @@ -5,5 +5,5 @@ export default function AuthLayout({ }: { children: React.ReactNode; }) { - return {children}; + return <> {children}; } diff --git a/app/auth/page.tsx b/app/auth/page.tsx index 3701857..bab07f2 100644 --- a/app/auth/page.tsx +++ b/app/auth/page.tsx @@ -1,8 +1,8 @@ -import Login from '@/components/form/login' -import React from 'react' +import Login from "@/components/form/login"; +import QudoLogin from "@/components/form/qudo-login"; +import React from "react"; export default function AuthPage() { - return ( - - ) + // return ; + return ; } diff --git a/components/form/login.tsx b/components/form/login.tsx index 85b1e83..ff18874 100644 --- a/components/form/login.tsx +++ b/components/form/login.tsx @@ -8,6 +8,7 @@ import Cookies from "js-cookie"; import { close, error, loading } from "@/config/swal"; import { getProfile, postSignIn } from "@/service/master-user"; import { useRouter } from "next/navigation"; +import { HumasLayout } from "../layout/humas-layout"; export default function Login() { const router = useRouter(); @@ -99,112 +100,114 @@ export default function Login() { }; return ( -
-
-
- Selamat Datang di Portal Resmi Humas Polri -
-
- { - setValUsername(e.target.value.trim()); - }} - onPaste={(e: any) => { - setValUsername(e.target.value.trim()); - }} - onCopy={(e: any) => { - setValUsername(e.target.value.trim()); - }} - /> -
-
- - {isVisible ? ( - - ) : ( - - )} - - } - type={isVisible ? "text" : "password"} - label="Password" - placeholder="Masukkan password anda" - variant="underlined" - onChange={(event) => setPassword(event.target.value)} - /> -
+ +
+
+
+ Selamat Datang di Portal Resmi Humas Polri +
+
+ { + setValUsername(e.target.value.trim()); + }} + onPaste={(e: any) => { + setValUsername(e.target.value.trim()); + }} + onCopy={(e: any) => { + setValUsername(e.target.value.trim()); + }} + /> +
+
+ + {isVisible ? ( + + ) : ( + + )} + + } + type={isVisible ? "text" : "password"} + label="Password" + placeholder="Masukkan password anda" + variant="underlined" + onChange={(event) => setPassword(event.target.value)} + /> +
-
- -
-
- Don't have account? Register Now -
-
- +
- +
+
+ Don't have account? Register Now +
+
+ + + +
+
+
+ logo
-
- logo -
-
+
); } diff --git a/components/form/qudo-login.tsx b/components/form/qudo-login.tsx new file mode 100644 index 0000000..8e5beaa --- /dev/null +++ b/components/form/qudo-login.tsx @@ -0,0 +1,261 @@ +"use client"; +import { successToast } from "@/config/swal"; +import Cookies from "js-cookie"; +import { EyeIconMdi, EyeOffIconMdi } from "@/components/icons"; +import { error, loading, close } from "@/config/swal"; + +import { Button, Input } from "@nextui-org/react"; +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import { getProfile, postSignIn } from "@/service/master-user"; + +const images = ["bg1.jpg", "bg2.jpg"]; + +export default function QudoLogin() { + const [currentImageIndex, setCurrentImageIndex] = useState(0); + const router = useRouter(); + + useEffect(() => { + const intervalId = setInterval(() => { + setCurrentImageIndex((prevIndex) => (prevIndex + 1) % images.length); + }, 10000); + + return () => clearInterval(intervalId); + }, []); + + useEffect(() => { + const isLogout = Cookies.get("is_logout"); + if (isLogout) { + successToast("Session Expired", "Please log in again."); + Cookies.remove("is_logout"); + } + }, []); + + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [typePass, setTypePass] = useState("password"); + const [category, setCategory] = useState("5"); + const [role, setRole] = useState([]); + const [isVisible, setIsVisible] = useState(false); + + const toggleVisibility = () => setIsVisible(!isVisible); + + const onSubmit = async () => { + const data = { + username: username, + password: password, + }; + + if (!username || !password) { + error("Username & Password Wajib Diisi !"); + } else { + loading(); + const response = await postSignIn(data); + if (response?.error) { + error("Username / Password Tidak Sesuai"); + } else { + const access_token: any = response?.data?.data?.id_token; + const refresh_token: any = response?.data?.data?.refresh_token; + const dateTime: any = new Date(); + const newTime: any = dateTime.getTime() + 10 * 60 * 1000; + + Cookies.set("access_token", access_token, { + expires: 1, + }); + Cookies.set("refresh_token", refresh_token, { + expires: 1, + }); + Cookies.set("time_refresh", newTime, { + expires: 1, + }); + Cookies.set("is_first_login", "true", { + secure: true, + sameSite: "strict", + }); + const profile = await getProfile(); + console.log("PROFILE : ", profile?.data); + Cookies.set("profile_picture", profile?.data?.data?.profilePictureUrl, { + expires: 1, + }); + Cookies.set("uie", profile?.data?.data?.id, { + expires: 1, + }); + Cookies.set("ufne", profile?.data?.data?.fullname, { + expires: 1, + }); + Cookies.set("username", profile?.data?.data?.username, { + expires: 1, + }); + Cookies.set("urie", profile?.data?.data?.roleId, { + expires: 1, + }); + Cookies.set("roleName", profile?.data?.data?.roleName, { + expires: 1, + }); + Cookies.set("masterPoldaId", profile?.data?.data?.masterPoldaId, { + expires: 1, + }); + Cookies.set("ulne", profile?.data?.data?.roleLevelNumber, { + expires: 1, + }); + Cookies.set("urce", profile?.data?.data?.roleCode, { + expires: 1, + }); + Cookies.set("email", profile?.data?.data?.email, { + expires: 1, + }); + + close(); + router.push("/admin/dashboard"); + Cookies.set("status", "login", { + expires: 1, + }); + } + } + // } + }; + const setValUsername = (e: any) => { + const uname = e.replaceAll(/[^\w.-]/g, ""); + setUsername(uname.toLowerCase()); + }; + + const [forgotPassword, setForgotPassword] = useState(false); + + const handleForgotPassword = (data: boolean) => { + setForgotPassword(false); + }; + + return ( +
+
+

Another innovation from

+

Qudōco

+

+ AI-based creativity and functionality will soon be available for + public use. +

+
+ +
+ Qudoco Logo + +

+ Welcome Back! +

+ +
+

+ Username* +

+ { + setValUsername(e.target.value.trim()); + }} + onPaste={(e: any) => { + setValUsername(e.target.value.trim()); + }} + onCopy={(e: any) => { + setValUsername(e.target.value.trim()); + }} + /> +
+
+

+ Password* +

+ + {isVisible ? ( + + ) : ( + + )} + + } + type={isVisible ? "text" : "password" && typePass} + classNames={{ + input: ["w-full", "bg-slate-100", "!text-black", "rounded-sm"], + mainWrapper: [ + "w-full", + "bg-slate-100", + "border-2", + "border-slate-200", + "rounded-sm", + ], + innerWrapper: ["bg-transparent"], + inputWrapper: [ + "bg-transparent", + "rounded-sm", + "dark:bg-transparent", + "hover:bg-transparent", + "dark:hover:bg-transparent", + "group-data-[focused=true]:bg-transparent", + "dark:group-data-[focused=true]:bg-transaparent", + "group-data-[focused=false]:bg-transparent", + "focus-within:!bg-transparent", + ], + }} + onChange={(event) => setPassword(event.target.value)} + /> + setForgotPassword(true)} + className="cursor-pointer mt-2 text-sm text-black mb-5" + > + Forgot Password? + + +
+ +
+ Dont have an account?{" "} + + Sign up now + +
+ +
© 2024 Qudoco
+
+
+ ); +} diff --git a/components/layout/navbar/NavbarHumas.tsx b/components/layout/navbar/NavbarHumas.tsx index f649b83..6952632 100644 --- a/components/layout/navbar/NavbarHumas.tsx +++ b/components/layout/navbar/NavbarHumas.tsx @@ -18,7 +18,7 @@ import { } from "@nextui-org/react"; import Image from "next/image"; import Link from "next/link"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { ChevronDownIcon, ChevronRightIcon, @@ -32,6 +32,8 @@ import { YtIcon, } from "../../icons"; import { ThemeSwitch } from "../../theme-switch"; +import Cookies from "js-cookie"; +import { useRouter } from "next/navigation"; interface MenuItem { key: string; @@ -51,6 +53,22 @@ interface DropdownOpenState { export default function NavbarHumas() { const [dropdownOpen, setDropdownOpen] = useState({}); + const router = useRouter(); + + const token = Cookies.get("access_token"); + + useEffect(() => { + if (!token) { + onLogout(); + } + }, [token]); + + const onLogout = () => { + Object.keys(Cookies.get()).forEach((cookieName) => { + Cookies.remove(cookieName); + }); + router.push("/auth"); + }; const toggleDropdown = (key: any) => { setDropdownOpen({ @@ -363,9 +381,15 @@ export default function NavbarHumas() {
- - - + {token ? ( + + ) : ( + + + + )}
@@ -379,9 +403,15 @@ export default function NavbarHumas() {
{item.key === "login" ? ( - - - + token ? ( + + ) : ( + + + + ) ) : (
toggleDropdown(item.key)} diff --git a/public/bg1.jpg b/public/bg1.jpg new file mode 100644 index 0000000..8a52108 Binary files /dev/null and b/public/bg1.jpg differ diff --git a/public/bg2.jpg b/public/bg2.jpg new file mode 100644 index 0000000..a5d1884 Binary files /dev/null and b/public/bg2.jpg differ diff --git a/public/qudoco.png b/public/qudoco.png new file mode 100644 index 0000000..6c9ff44 Binary files /dev/null and b/public/qudoco.png differ