From c2a050a03d5b6c66a02ed88ca189830ce01d4d71 Mon Sep 17 00:00:00 2001 From: lukman Date: Thu, 25 Jul 2024 10:06:55 +0800 Subject: [PATCH] feat :update module --- src/module/_global/bin/val_global.ts | 1 + src/module/_global/index.ts | 20 +++--- src/module/auth/login/view/view_login.tsx | 64 ++++++++++++++--- .../varification/view/view_verification.tsx | 70 ++++++++++++++++--- src/module/user/profile/view/view_profile.tsx | 29 +++++++- 5 files changed, 156 insertions(+), 28 deletions(-) create mode 100644 src/module/_global/bin/val_global.ts diff --git a/src/module/_global/bin/val_global.ts b/src/module/_global/bin/val_global.ts new file mode 100644 index 0000000..17bfaca --- /dev/null +++ b/src/module/_global/bin/val_global.ts @@ -0,0 +1 @@ +export const pwd_key_config = "fchgvjknlmdfnbvghhujlaknsdvjbhknlkmsdbdyu567t8y9u30r4587638y9uipkoeghjvuyi89ipkoefmnrjbhtiu4or9ipkoemnjfbhjiuoijdklnjhbviufojkejnshbiuojijknehgruyu" \ No newline at end of file diff --git a/src/module/_global/index.ts b/src/module/_global/index.ts index 60a43da..3755cf2 100644 --- a/src/module/_global/index.ts +++ b/src/module/_global/index.ts @@ -1,3 +1,5 @@ +import prisma from "./bin/prisma"; +import { pwd_key_config } from "./bin/val_global"; import { WARNA } from "./fun/WARNA"; import LayoutDrawer from "./layout/layout_drawer"; import LayoutIconBack from "./layout/layout_icon_back"; @@ -7,11 +9,13 @@ import LayoutNavbarHome from "./layout/layout_navbar_home"; import LayoutNavbarNew from "./layout/layout_navbar_new"; import ViewFilter from "./view/view_filter"; -export { WARNA } -export { LayoutLogin } -export { LayoutNavbarHome } -export { LayoutIconBack } -export { LoadingPage } -export { LayoutDrawer } -export { LayoutNavbarNew } -export { ViewFilter } \ No newline at end of file +export { WARNA }; +export { LayoutLogin }; +export { LayoutNavbarHome }; +export { LayoutIconBack }; +export { LoadingPage }; +export { LayoutDrawer }; +export { LayoutNavbarNew }; +export { ViewFilter }; +export { prisma }; +export { pwd_key_config }; diff --git a/src/module/auth/login/view/view_login.tsx b/src/module/auth/login/view/view_login.tsx index 9e03589..8c5eb23 100644 --- a/src/module/auth/login/view/view_login.tsx +++ b/src/module/auth/login/view/view_login.tsx @@ -12,24 +12,68 @@ import { Title, } from "@mantine/core"; import { useRouter } from "next/navigation"; -import React from "react"; +import React, { useState } from "react"; +import toast from "react-hot-toast"; +import ViewVerification from "../../varification/view/view_verification"; +import { useFocusTrap } from "@mantine/hooks"; function ViewLogin() { + const focusTrapRef = useFocusTrap() const router = useRouter() const textInfo = "Kami akan mengirim kode verifikasi melalui WhatsApp, guna mengonfirmasikan nomor Anda."; - - function onMasuk() { - // router.push("/verification") - window.location.href = "/verification" + + const [isPhone, setPhone] = useState("") + const [isOTP, setOTP] = useState(null) + const [isValPhone, setValPhone] = useState(null) + const [isUser, setUser] = useState(null) + const [isVerif, setVerif] = useState(false) + const [isLoading, setLoading] = useState(false) + + async function onLogin() { + if (isPhone == "") + return toast.error('Please fill in completely') + const cek = await fetch('/api/auth/login', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ phone: isPhone }) + }) + const json = await cek.json() + console.log(json) + + const code = Math.floor(Math.random() * 1000) + 1000 + + setLoading(true) + const res = await fetch(`https://wa.wibudev.com/code?nom=${json.phone}&text=${code}`).then( + async (res) => { + if (res.status == 200) { + setValPhone(json.phone) + setOTP(code) + setUser(json.id) + setVerif(true) + setLoading(false) + toast.success('OTP sent successfully') + } else { + toast.error('OTP not sent') + setLoading(false) + } + console.log("code", code) + } + ) + + } - + + if (isVerif) return + return ( <> - + +62} placeholder="XXX XXX XXX" + onChange={(val) => { setPhone(val.target.value) }} /> {textInfo} @@ -62,7 +107,10 @@ function ViewLogin() { size="md" radius={30} fullWidth - onClick={onMasuk} + loading={isLoading} + onClick={() => { + onLogin() + }} > MASUK diff --git a/src/module/auth/varification/view/view_verification.tsx b/src/module/auth/varification/view/view_verification.tsx index 7585341..d9583f8 100644 --- a/src/module/auth/varification/view/view_verification.tsx +++ b/src/module/auth/varification/view/view_verification.tsx @@ -1,16 +1,54 @@ "use client"; import { LayoutLogin, WARNA } from "@/module/_global"; -import { Box, Button, PinInput, Stack, Text, Title } from "@mantine/core"; +import { IVerification } from "@/types"; +import { Anchor, Box, Button, Group, PinInput, Stack, Text, Title } from "@mantine/core"; import { useRouter } from "next/navigation"; -import React from "react"; +import React, { useState } from "react"; +import toast from "react-hot-toast"; -export default function ViewVerification() { - const router = useRouter(); +export default function ViewVerification({ phone, otp, user }: IVerification) { + const router = useRouter() + const [isOTP, setOTP] = useState(otp) + const [inputOTP, setInputOTP] = useState() + const [isLoading, setLoading] = useState(false) - function onNext() { - // router.push("/welcome"); - window.location.href = "/welcome" + async function onResend() { + const code = Math.floor(Math.random() * 1000) + 1000 + + const res = await fetch(`https://wa.wibudev.com/code?nom=${phone}&text=${code}`) + .then( + async (res) => { + if (res.status == 200) { + toast.success('Verification code has been sent') + setOTP(code) + } else { + toast.error('Error') + } + } + ); } + + async function getVerification() { + setLoading(true) + if (isOTP == inputOTP) { + setLoading(false) + const res = await fetch('/api/auth/set-cookies', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ user: user }) + }) + router.push('/welcome') + toast.success("Verification code is correct") + setLoading(false) + } else { + toast.error("Verification code is incorrect") + setLoading(false) + } + } + + return ( <> @@ -24,7 +62,7 @@ export default function ViewVerification() { Masukkan kode yang kami kirimkan melalui WhatsApp - +6287701790942 + {phone} { + setInputOTP(val) + }} /> @@ -48,11 +89,22 @@ export default function ViewVerification() { size="md" radius={30} fullWidth - onClick={onNext} + onClick={() => { getVerification() }} > Lanjut + + + Didnt receive a code ? {""} + { onResend() }} + > + Resend + + + diff --git a/src/module/user/profile/view/view_profile.tsx b/src/module/user/profile/view/view_profile.tsx index 724b1fb..50000b1 100644 --- a/src/module/user/profile/view/view_profile.tsx +++ b/src/module/user/profile/view/view_profile.tsx @@ -1,3 +1,4 @@ +"use client" import { LayoutIconBack, LayoutNavbarHome, WARNA } from "@/module/_global"; import { ActionIcon, Anchor, Box, Button, Flex, Group, Stack, Text } from "@mantine/core"; import { BsInfo } from "react-icons/bs"; @@ -7,16 +8,34 @@ import { FaSquarePhone } from "react-icons/fa6"; import { MdEmail } from "react-icons/md"; import { InfoTitleProfile } from "../component/ui/ui_profile"; import { IoMaleFemale } from "react-icons/io5"; +import toast from "react-hot-toast"; +import { LuLogOut } from "react-icons/lu"; +import LayoutModal from "@/module/_global/layout/layout_modal"; +import { useState } from "react"; export default function ViewProfile() { + const [openModal, setOpenModal] = useState(false); + + async function onLogout() { + try { + await fetch('/api/auth/logout', { + method: 'DELETE', + }); + toast.success('Logout Success') + window.location.href = '/'; + } catch (error) { + console.error(error); + } + } return ( <> - {/* - - */} + + { setOpenModal(true) }} variant="light" bg={WARNA.bgIcon} size="lg" radius="lg" aria-label="Info"> + + + + setOpenModal(false)} + description="Apakah Anda yakin ingin Keluar?" + onYes={() => onLogout()} /> ) } \ No newline at end of file