From 32176560a6eac4a9247e38671408bfd3d3f11268 Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 7 Oct 2024 13:28:41 +0800 Subject: [PATCH 1/3] upd: login Deskripsi: - upd trycatch fetch wa wibu server di halaman login dan verifikasi kode No Issues --- src/module/auth/login/view/view_login.tsx | 39 +++++++++++-------- .../varification/view/view_verification.tsx | 32 ++++++++------- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/src/module/auth/login/view/view_login.tsx b/src/module/auth/login/view/view_login.tsx index 2153362..8fba247 100644 --- a/src/module/auth/login/view/view_login.tsx +++ b/src/module/auth/login/view/view_login.tsx @@ -49,23 +49,30 @@ function ViewLogin() { if (cekLogin.success) { const code = Math.floor(Math.random() * 1000) + 1000 setLoading(true) - - const res = await fetch(`https://wa.wibudev.com/code?nom=${cekLogin.phone}&text=*DARMASABA*%0A%0A -JANGAN BERIKAN KODE RAHASIA ini kepada siapa pun TERMASUK PIHAK DARMASABA. Masukkan otentikasi: *${encodeURIComponent(code)}*`).then( - async (res) => { - if (res.status == 200) { - setValPhone(cekLogin.phone) - setOTP(code) - setUser(cekLogin.id) - setVerif(true) - setLoading(false) - toast.success('Kode verifikasi telah dikirim') - } else { - toast.error('Internal Server Error') - setLoading(false) + try { + const res = await fetch(`https://wa.wibudev.com/code?nom=${cekLogin.phone}&text=*DARMASABA*%0A%0A + JANGAN BERIKAN KODE RAHASIA ini kepada siapa pun TERMASUK PIHAK DARMASABA. Masukkan otentikasi: *${encodeURIComponent(code)}*`).then( + async (res) => { + if (res.status == 200) { + setValPhone(cekLogin.phone) + setOTP(code) + setUser(cekLogin.id) + setVerif(true) + setLoading(false) + toast.success('Kode verifikasi telah dikirim') + } else { + console.error(res.status) + toast.error('Internal Server Error') + setLoading(false) + } } - } - ) + ) + } catch (error) { + console.error(error) + toast.error('Internal Server Error') + }finally{ + setLoading(false) + } } else { return toast.error(cekLogin.message) } diff --git a/src/module/auth/varification/view/view_verification.tsx b/src/module/auth/varification/view/view_verification.tsx index 374c099..d345b4c 100644 --- a/src/module/auth/varification/view/view_verification.tsx +++ b/src/module/auth/varification/view/view_verification.tsx @@ -14,26 +14,30 @@ export default function ViewVerification({ phone, otp, user }: IVerification) { const [isLoading, setLoading] = useState(false) async function onResend() { - const code = Math.floor(Math.random() * 1000) + 1000 - - const res = await fetch(`https://wa.wibudev.com/code?nom=${phone}&text=*DARMASABA*%0A%0A -JANGAN BERIKAN KODE RAHASIA ini kepada siapa pun TERMASUK PIHAK DARMASABA. Masukkan otentikasi: *${encodeURIComponent(code)}*`) - .then( - async (res) => { - if (res.status == 200) { - toast.success('Kode verifikasi telah dikirim') - setOTP(code) - } else { - toast.error('Internal Server Error') + try { + const code = Math.floor(Math.random() * 1000) + 1000 + const res = await fetch(`https://wa.wibudev.com/code?nom=${phone}&text=*DARMASABA*%0A%0A + JANGAN BERIKAN KODE RAHASIA ini kepada siapa pun TERMASUK PIHAK DARMASABA. Masukkan otentikasi: *${encodeURIComponent(code)}*`) + .then( + async (res) => { + if (res.status == 200) { + toast.success('Kode verifikasi telah dikirim') + setOTP(code) + } else { + toast.error('Internal Server Error') + } } - } - ); + ); + } catch (error) { + console.error(error) + toast.error('Internal Server Error') + } } async function getVerification() { setLoading(true) if (isOTP == inputOTP) { - const setCookies = await funSetCookies({ user: user }) + const setCookies: any = await funSetCookies({ user: user }) if (setCookies.success) { toast.success(setCookies.message) From e0c704a6eae8ade51fc8ccec15c361b361ebfab8 Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 7 Oct 2024 14:07:44 +0800 Subject: [PATCH 2/3] upd: tugas divisi Deskripsi: - validasi tambah tugas divisi - validasi edit tugas diviis No Issues --- src/module/task/ui/create_task.tsx | 85 ++++++++++++++++--------- src/module/task/ui/edit_detail_task.tsx | 33 +++------- src/module/task/ui/edit_task.tsx | 43 ++++++------- 3 files changed, 84 insertions(+), 77 deletions(-) diff --git a/src/module/task/ui/create_task.tsx b/src/module/task/ui/create_task.tsx index f6e5bec..510ffd4 100644 --- a/src/module/task/ui/create_task.tsx +++ b/src/module/task/ui/create_task.tsx @@ -1,25 +1,24 @@ "use client"; import { keyWibu, LayoutDrawer, LayoutNavbarNew, TEMA } from "@/module/_global"; -import { Avatar, Box, Button, Center, Divider, Flex, Grid, Group, Input, rem, SimpleGrid, Stack, Text, TextInput } from "@mantine/core"; +import LayoutModal from "@/module/_global/layout/layout_modal"; +import { useHookstate } from "@hookstate/core"; +import { Avatar, Box, Button, Divider, Flex, Grid, Group, rem, SimpleGrid, Stack, Text, TextInput } from "@mantine/core"; +import { Dropzone } from '@mantine/dropzone'; +import { useMediaQuery } from "@mantine/hooks"; +import _ from "lodash"; import { useParams, useRouter } from "next/navigation"; -import React, { useRef, useState } from "react"; +import { useRef, useState } from "react"; +import toast from "react-hot-toast"; +import { FaTrash } from "react-icons/fa6"; import { IoIosArrowDropright } from "react-icons/io"; -import { BsFiletypeCsv } from "react-icons/bs"; +import { useWibuRealtime } from "wibu-realtime"; +import { funCreateTask } from "../lib/api_task"; +import { IFormDateTask, IFormMemberTask, IListFileTask } from "../lib/type_task"; +import { globalMemberTask } from "../lib/val_task"; +import ViewDateEndTask from "./create_date_end_task"; import CreateUsersProject from "./create_users_project"; import ResultsDateAndTask from "./results_date-and_task"; import ResultsFile from "./results_file"; -import { useHookstate } from "@hookstate/core"; -import { globalMemberTask } from "../lib/val_task"; -import ViewDateEndTask from "./create_date_end_task"; -import { IFormDateTask, IFormMemberTask, IListFileTask } from "../lib/type_task"; -import { Dropzone } from '@mantine/dropzone'; -import toast from "react-hot-toast"; -import _ from "lodash"; -import { FaTrash } from "react-icons/fa6"; -import LayoutModal from "@/module/_global/layout/layout_modal"; -import { funCreateTask } from "../lib/api_task"; -import { useMediaQuery } from "@mantine/hooks"; -import { useWibuRealtime } from "wibu-realtime"; export default function CreateTask() { const router = useRouter() @@ -44,8 +43,6 @@ export default function CreateTask() { const tema = useHookstate(TEMA) const [touched, setTouched] = useState({ title: false, - task: false, - member: false }); const [data, setData] = useWibuRealtime({ WIBU_REALTIME_TOKEN: keyWibu, @@ -103,6 +100,44 @@ export default function CreateTask() { } + function onCheck() { + const cek = checkAll() + if (!cek) + return false + + if (dataTask.length == 0) + return toast.error("Error! silahkan tambahkan tugas") + + if (memberValue.length == 0) + return toast.error("Error! silahkan pilih anggota") + + setOpenModal(true) + } + + + function checkAll() { + let nilai = true + if (title === "") { + setTouched(touched => ({ ...touched, title: true })) + nilai = false + } + return nilai + } + + + function onValidation(kategori: string, val: string) { + if (kategori == 'title') { + setTitle(val) + if (val === "") { + setTouched({ ...touched, title: true }) + } else { + setTouched({ ...touched, title: false }) + } + } + } + + + if (openTugas) return { setOpenTugas(false) }} onSet={(val) => { setDataTask([...dataTask, val]) setOpenTugas(false) @@ -127,11 +162,7 @@ export default function CreateTask() { size="md" label="Judul Tugas" value={title} - onChange={(e) => { - setTitle(e.target.value) - setTouched({ ...touched, title: false }) - }} - onBlur={() => setTouched({ ...touched, title: true })} + onChange={(e) => { onValidation('title', e.target.value) }} required error={ touched.title && ( @@ -291,15 +322,7 @@ export default function CreateTask() { bg={tema.get().utama} size="lg" radius={30} fullWidth - onClick={() => { - if ( - title !== "" - ) { - setOpenModal(true) - } else { - toast.error("Semua form harus diisi") - } - }}> + onClick={() => { onCheck() }}> Simpan diff --git a/src/module/task/ui/edit_detail_task.tsx b/src/module/task/ui/edit_detail_task.tsx index 926fd9c..d8bbd36 100644 --- a/src/module/task/ui/edit_detail_task.tsx +++ b/src/module/task/ui/edit_detail_task.tsx @@ -1,28 +1,15 @@ "use client"; import { LayoutNavbarNew, TEMA } from "@/module/_global"; -import { - Avatar, - Box, - Button, - Flex, - Group, - Input, - rem, - SimpleGrid, - Skeleton, - Stack, - Text, - TextInput, -} from "@mantine/core"; -import React, { useState } from "react"; -import { DatePicker } from "@mantine/dates"; -import { useParams, useRouter } from "next/navigation"; -import toast from "react-hot-toast"; -import moment from "moment"; -import { funEditDetailTask, funGetDetailTask } from "../lib/api_task"; -import { useShallowEffect } from "@mantine/hooks"; import LayoutModal from "@/module/_global/layout/layout_modal"; import { useHookstate } from "@hookstate/core"; +import { Box, Button, Group, rem, SimpleGrid, Skeleton, Stack, Text, TextInput } from "@mantine/core"; +import { DatePicker } from "@mantine/dates"; +import { useShallowEffect } from "@mantine/hooks"; +import moment from "moment"; +import { useParams, useRouter } from "next/navigation"; +import { useState } from "react"; +import toast from "react-hot-toast"; +import { funEditDetailTask, funGetDetailTask } from "../lib/api_task"; export default function EditDetailTask() { @@ -185,10 +172,10 @@ export default function EditDetailTask() { touched.title && (title == "" ? "Error! harus memasukkan Judul Tahapan" : "" ) - } + } onChange={(e) => { onValidation('title', e.target.value) - }} + }} /> } diff --git a/src/module/task/ui/edit_task.tsx b/src/module/task/ui/edit_task.tsx index 9e9bb25..6aae983 100644 --- a/src/module/task/ui/edit_task.tsx +++ b/src/module/task/ui/edit_task.tsx @@ -1,22 +1,13 @@ "use client"; import { LayoutNavbarNew, TEMA } from "@/module/_global"; -import { - Box, - Button, - Input, - rem, - Skeleton, - Stack, - Textarea, - TextInput, -} from "@mantine/core"; -import React, { useState } from "react"; -import { useParams, useRouter } from "next/navigation"; -import toast from "react-hot-toast"; import LayoutModal from "@/module/_global/layout/layout_modal"; -import { funEditTask, funGetTaskDivisionById } from "../lib/api_task"; -import { useShallowEffect } from "@mantine/hooks"; import { useHookstate } from "@hookstate/core"; +import { Box, Button, rem, Skeleton, Stack, TextInput } from "@mantine/core"; +import { useShallowEffect } from "@mantine/hooks"; +import { useParams, useRouter } from "next/navigation"; +import { useState } from "react"; +import toast from "react-hot-toast"; +import { funEditTask, funGetTaskDivisionById } from "../lib/api_task"; export default function EditTask() { @@ -31,12 +22,22 @@ export default function EditTask() { }); function onVerification() { - if (title == "") - return toast.error("Error! harus memasukkan judul tugas") - + if (Object.values(touched).some((v) => v == true)) + return false setOpenModal(true) } + function onValidation(kategori: string, val: string) { + if (kategori == 'title') { + setTitle(val) + if (val === "") { + setTouched({ ...touched, title: true }) + } else { + setTouched({ ...touched, title: false }) + } + } + } + async function onSubmit() { try { const res = await funEditTask(param.detail, { title }) @@ -96,16 +97,12 @@ export default function EditTask() { label="Judul Tugas" size="md" value={title} - onChange={(e) => { - setTitle(e.target.value) - setTouched({ ...touched, title: false }) - }} + onChange={(e) => { onValidation('title', e.target.value)}} error={ touched.title && ( title == "" ? "Error! harus memasukkan judul tugas" : null ) } - onBlur={() => setTouched({ ...touched, title: true })} /> } From a561f21524a8c12b746a71965195edfb9ee0ac8c Mon Sep 17 00:00:00 2001 From: amel Date: Mon, 7 Oct 2024 14:28:42 +0800 Subject: [PATCH 3/3] upd: diskusi Deskripsi: - mati validasi form tambah diskusi - mati validasi form edit diskusi - loading pada saat tambah diskusi - loading pada saat edit diskusi No Issues: --- .../discussion/ui/form_create_discussion.tsx | 44 ++++--- .../discussion/ui/form_edit_discussion.tsx | 121 +++++++++--------- 2 files changed, 87 insertions(+), 78 deletions(-) diff --git a/src/module/discussion/ui/form_create_discussion.tsx b/src/module/discussion/ui/form_create_discussion.tsx index 1aa8245..e53f844 100644 --- a/src/module/discussion/ui/form_create_discussion.tsx +++ b/src/module/discussion/ui/form_create_discussion.tsx @@ -13,6 +13,7 @@ import { funCreateDiscussion } from "../lib/api_discussion"; export default function FormCreateDiscussion({ id }: { id: string }) { const [isValModal, setValModal] = useState(false) + const [loadingModal, setLoadingModal] = useState(false) const router = useRouter() const [isImg, setImg] = useState("") const param = useParams<{ id: string, detail: string }>() @@ -50,26 +51,25 @@ export default function FormCreateDiscussion({ id }: { id: string }) { async function createDiscussion(val: boolean) { try { - if (val) { - const response = await funCreateDiscussion({ - desc: isData.desc, - idDivision: id - }) + setLoadingModal(true) + const response = await funCreateDiscussion({ + desc: isData.desc, + idDivision: id + }) - if (response.success) { - setDataRealtime(response.notif) - toast.success(response.message) - router.push(`/division/${param.id}/discussion/`) - setValModal(false) - } else { - toast.error(response.message) - } + if (response.success) { + setDataRealtime(response.notif) + toast.success(response.message) + router.push(`/division/${param.id}/discussion/`) + } else { + toast.error(response.message) } } catch (error) { console.error(error); toast.error("Gagal menambahkan diskusi, coba lagi nanti"); } finally { setValModal(false) + setLoadingModal(false) } } @@ -94,12 +94,12 @@ export default function FormCreateDiscussion({ id }: { id: string }) { }} value={isData.desc} onChange={(e) => setData({ ...isData, desc: e.target.value })} - onBlur={() => setTouched({ ...touched, desc: true })} - error={ - touched.desc && ( - isData.desc == "" ? "Form Tidak Boleh Kosong" : null - ) - } + // onBlur={() => setTouched({ ...touched, desc: true })} + // error={ + // touched.desc && ( + // isData.desc == "" ? "Form Tidak Boleh Kosong" : null + // ) + // } /> @@ -130,9 +130,11 @@ export default function FormCreateDiscussion({ id }: { id: string }) { - setValModal(false)} + setValModal(false)} description="Apakah Anda yakin ingin menambah data?" - onYes={(val) => { createDiscussion(val) }} /> + onYes={(val) => { + createDiscussion(val) + }} /> ) } \ No newline at end of file diff --git a/src/module/discussion/ui/form_edit_discussion.tsx b/src/module/discussion/ui/form_edit_discussion.tsx index e40967f..66cf5d7 100644 --- a/src/module/discussion/ui/form_edit_discussion.tsx +++ b/src/module/discussion/ui/form_edit_discussion.tsx @@ -12,6 +12,7 @@ import { useHookstate } from "@hookstate/core" export default function FormEditDiscussion() { const [isValModal, setValModal] = useState(false) + const [loadingModal, setLoadingModal] = useState(false) const router = useRouter() const param = useParams<{ id: string, detail: string }>() const [isDataOne, setDataOne] = useState("") @@ -35,43 +36,43 @@ export default function FormEditDiscussion() { } } - async function fetchEditDiscussion(val: boolean) { + async function fetchEditDiscussion() { try { - if (val) { - const response = await funEditDiscussion(param.detail, { - desc: isDataOne - }) - if (response.success) { - toast.success(response.message) - setValModal(false) - router.push(`/division/${param.id}/discussion/${param.detail}`) - } else { - toast.error(response.message) - } + setLoadingModal(true) + const response = await funEditDiscussion(param.detail, { + desc: isDataOne + }) + if (response.success) { + toast.success(response.message) + setValModal(false) + router.push(`/division/${param.id}/discussion/${param.detail}`) + } else { + toast.error(response.message) } - setValModal(false) + } catch (error) { console.error(error); setValModal(false) toast.error("Gagal menambahkan diskusi, coba lagi nanti"); } finally { setValModal(false) + setLoadingModal(false) } } async function getData() { try { - setLoading(true) - const res = await funGetProfileByCookies() - setIMG(`https://wibu-storage.wibudev.com/api/files/${res.data.img}`) - setLoading(false) + setLoading(true) + const res = await funGetProfileByCookies() + setIMG(`https://wibu-storage.wibudev.com/api/files/${res.data.img}`) + setLoading(false) } catch (error) { - console.error(error); + console.error(error); } finally { - setLoading(false) + setLoading(false) } - } - + } + useShallowEffect(() => { fetchGetOneDiscussion() getData() @@ -84,43 +85,43 @@ export default function FormEditDiscussion() { - {loading ? - - : - - } + {loading ? + + : + + } {loading ? - Array(10) - .fill(null) - .map((_, i) => ( - - - - )) - : - -