From 298113488cbb98502e6c22afd1bc13a062e6ba0d Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Fri, 22 Aug 2025 16:29:52 +0800 Subject: [PATCH] upd: task divisi Deskripsi: - update role akses task divisi No Issues' --- .../(fitur-division)/task/[detail]/index.tsx | 43 ++++++++-- components/task/headerTaskDetail.tsx | 44 ++-------- components/task/sectionFileTask.tsx | 38 ++++---- components/task/sectionLinkTask.tsx | 34 +++++--- components/task/sectionMemberTask.tsx | 44 ++++++---- components/task/sectionTanggalTugasTask.tsx | 86 +++++++++++-------- 6 files changed, 164 insertions(+), 125 deletions(-) diff --git a/app/(application)/division/[id]/(fitur-division)/task/[detail]/index.tsx b/app/(application)/division/[id]/(fitur-division)/task/[detail]/index.tsx index b7edf09..8eb62fd 100644 --- a/app/(application)/division/[id]/(fitur-division)/task/[detail]/index.tsx +++ b/app/(application)/division/[id]/(fitur-division)/task/[detail]/index.tsx @@ -8,7 +8,7 @@ import SectionMemberTask from "@/components/task/sectionMemberTask"; import SectionReportTask from "@/components/task/sectionReportTask"; import SectionTanggalTugasTask from "@/components/task/sectionTanggalTugasTask"; import Styles from "@/constants/Styles"; -import { apiGetTaskOne } from "@/lib/api"; +import { apiGetDivisionOneFeature, apiGetTaskOne } from "@/lib/api"; import { useAuthSession } from "@/providers/AuthProvider"; import { router, Stack, useLocalSearchParams } from "expo-router"; import { useEffect, useState } from "react"; @@ -32,6 +32,35 @@ export default function DetailTaskDivision() { const [progress, setProgress] = useState(0) const update = useSelector((state: any) => state.taskUpdate) const [refreshing, setRefreshing] = useState(false) + const [isMemberDivision, setIsMemberDivision] = useState(false); + const [isAdminDivision, setIsAdminDivision] = useState(false); + const entityUser = useSelector((state: any) => state.user); + + async function handleCheckMember() { + try { + const hasil = await decryptToken(String(token?.current)); + const response = await apiGetDivisionOneFeature({ + id, + user: hasil, + cat: "check-member", + }); + + setIsMemberDivision(response.data); + + const response2 = await apiGetDivisionOneFeature({ + id, + user: hasil, + cat: "check-admin", + }); + setIsAdminDivision(response2.data); + } catch (error) { + console.error(error); + } + } + + useEffect(() => { + handleCheckMember() + }, []) async function handleLoad(cat: 'data' | 'progress') { @@ -74,7 +103,9 @@ export default function DetailTaskDivision() { headerLeft: () => { router.back() }} />, headerTitle: loading ? 'Loading... ' : data?.title, headerTitleAlign: 'center', - headerRight: () => , + headerRight: () => (entityUser.role == "user" || entityUser.role == "coadmin") && !isMemberDivision + ? <> + : , }} /> - - - - + + + + diff --git a/components/task/headerTaskDetail.tsx b/components/task/headerTaskDetail.tsx index 392c6da..b5a08da 100644 --- a/components/task/headerTaskDetail.tsx +++ b/components/task/headerTaskDetail.tsx @@ -1,10 +1,10 @@ import Styles from "@/constants/Styles" -import { apiAddLinkTask, apiDeleteTask, apiGetDivisionOneFeature } from "@/lib/api" +import { apiAddLinkTask, apiDeleteTask } from "@/lib/api" import { setUpdateTask } from "@/lib/taskUpdate" import { useAuthSession } from "@/providers/AuthProvider" import { AntDesign, Feather, Ionicons, MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons" import { router } from "expo-router" -import { useEffect, useState } from "react" +import { useState } from "react" import { View } from "react-native" import Toast from "react-native-toast-message" import { useDispatch, useSelector } from "react-redux" @@ -18,46 +18,19 @@ import ModalFloat from "../modalFloat" type Props = { id: string | string[] division: string - status: number | undefined + status: number | undefined, + isAdminDivision: boolean } -export default function HeaderRightTaskDetail({ id, division, status }: Props) { +export default function HeaderRightTaskDetail({ id, division, status, isAdminDivision }: Props) { const { token, decryptToken } = useAuthSession() const [isVisible, setVisible] = useState(false) const entityUser = useSelector((state: any) => state.user); - const [isMemberDivision, setIsMemberDivision] = useState(false); - const [isAdminDivision, setIsAdminDivision] = useState(false); const dispatch = useDispatch() const update = useSelector((state: any) => state.taskUpdate) const [isAddLink, setAddLink] = useState(false) const [link, setLink] = useState("") - async function handleCheckMember() { - try { - const hasil = await decryptToken(String(token?.current)); - const response = await apiGetDivisionOneFeature({ - id: division, - user: hasil, - cat: "check-member", - }); - - setIsMemberDivision(response.data); - - const response2 = await apiGetDivisionOneFeature({ - id: division, - user: hasil, - cat: "check-admin", - }); - setIsAdminDivision(response2.data); - } catch (error) { - console.error(error); - } - } - - useEffect(() => { - handleCheckMember() - }, []) - async function handleDelete() { try { const hasil = await decryptToken(String(token?.current)) @@ -95,12 +68,7 @@ export default function HeaderRightTaskDetail({ id, division, status }: Props) { return ( <> - { - (entityUser.role == "user" || entityUser.role == "coadmin") && !isMemberDivision - ? <> - : - { setVisible(true) }} /> - } + { setVisible(true) }} /> () @@ -39,6 +39,7 @@ export default function SectionFileTask({ refreshing }: { refreshing: boolean }) const arrSkeleton = Array.from({ length: 5 }) const [selectFile, setSelectFile] = useState(null) const [loadingOpen, setLoadingOpen] = useState(false) + const entityUser = useSelector((state: any) => state.user); async function handleLoad(loading: boolean) { try { @@ -163,21 +164,28 @@ export default function SectionFileTask({ refreshing }: { refreshing: boolean }) openFile() }} /> - } - title="Hapus" - onPress={() => { - setModal(false) - AlertKonfirmasi({ - title: 'Konfirmasi', - desc: 'Apakah Anda yakin ingin menghapus file ini? File yang dihapus tidak dapat dikembalikan', - onPress: () => { - handleDelete() - } - }) + { + (entityUser.role != "user" && entityUser.role != "coadmin") || isMemberDivision + ? + } + title="Hapus" + onPress={() => { + setModal(false) + AlertKonfirmasi({ + title: 'Konfirmasi', + desc: 'Apakah Anda yakin ingin menghapus file ini? File yang dihapus tidak dapat dikembalikan', + onPress: () => { + handleDelete() + } + }) + + }} + /> + : + <> + } - }} - /> diff --git a/components/task/sectionLinkTask.tsx b/components/task/sectionLinkTask.tsx index b617ff5..17a3293 100644 --- a/components/task/sectionLinkTask.tsx +++ b/components/task/sectionLinkTask.tsx @@ -20,7 +20,7 @@ type Props = { link: string } -export default function SectionLinkTask({ refreshing }: { refreshing: boolean }) { +export default function SectionLinkTask({ refreshing, isMemberDivision }: { refreshing: boolean, isMemberDivision: boolean }) { const [isModal, setModal] = useState(false) const { token, decryptToken } = useAuthSession() const { detail } = useLocalSearchParams<{ detail: string }>() @@ -28,6 +28,7 @@ export default function SectionLinkTask({ refreshing }: { refreshing: boolean }) const update = useSelector((state: any) => state.taskUpdate) const dispatch = useDispatch() const [selectLink, setSelectLink] = useState(null) + const entityUser = useSelector((state: any) => state.user); async function handleLoad() { try { @@ -101,18 +102,25 @@ export default function SectionLinkTask({ refreshing }: { refreshing: boolean }) Linking.openURL(urlCompleted(String(selectLink?.link))) }} /> - } - title="Hapus" - onPress={() => { - setModal(false) - AlertKonfirmasi({ - title: 'Konfirmasi', - desc: 'Apakah Anda yakin ingin menghapus link ini? Link yang dihapus tidak dapat dikembalikan', - onPress: () => { handleDelete() } - }) - }} - /> + { + (entityUser.role != "user" && entityUser.role != "coadmin") || isMemberDivision + ? + } + title="Hapus" + onPress={() => { + setModal(false) + AlertKonfirmasi({ + title: 'Konfirmasi', + desc: 'Apakah Anda yakin ingin menghapus link ini? Link yang dihapus tidak dapat dikembalikan', + onPress: () => { handleDelete() } + }) + }} + /> + : + <> + } + diff --git a/components/task/sectionMemberTask.tsx b/components/task/sectionMemberTask.tsx index 4a66180..8bdb89b 100644 --- a/components/task/sectionMemberTask.tsx +++ b/components/task/sectionMemberTask.tsx @@ -26,8 +26,9 @@ type Props = { position: string; }; -export default function SectionMemberTask({ refreshing }: { refreshing: boolean }) { +export default function SectionMemberTask({ refreshing, isMemberDivision }: { refreshing: boolean, isMemberDivision: boolean }) { const [isModal, setModal] = useState(false); + const entityUser = useSelector((state: any) => state.user); const { token, decryptToken } = useAuthSession(); const { id, detail } = useLocalSearchParams<{ id: string; detail: string }>(); const [data, setData] = useState([]); @@ -165,24 +166,31 @@ export default function SectionMemberTask({ refreshing }: { refreshing: boolean }} /> - + } + title="Keluarkan" + onPress={() => { + setModal(false) + AlertKonfirmasi({ + title: "Konfirmasi", + desc: "Apakah Anda yakin ingin mengeluarkan anggota?", + onPress: () => { handleDeleteMember() }, + }); + }} /> - } - title="Keluarkan" - onPress={() => { - setModal(false) - AlertKonfirmasi({ - title: "Konfirmasi", - desc: "Apakah Anda yakin ingin mengeluarkan anggota?", - onPress: () => { handleDeleteMember() }, - }); - }} - /> + : + <> + } diff --git a/components/task/sectionTanggalTugasTask.tsx b/components/task/sectionTanggalTugasTask.tsx index 69977d2..5f19055 100644 --- a/components/task/sectionTanggalTugasTask.tsx +++ b/components/task/sectionTanggalTugasTask.tsx @@ -26,8 +26,9 @@ type Props = { dateEnd: string; } -export default function SectionTanggalTugasTask({ refreshing }: { refreshing: boolean }) { +export default function SectionTanggalTugasTask({ refreshing, isMemberDivision }: { refreshing: boolean, isMemberDivision: boolean }) { const dispatch = useDispatch() + const entityUser = useSelector((state: any) => state.user); const update = useSelector((state: any) => state.taskUpdate) const [isModal, setModal] = useState(false) const [isSelect, setSelect] = useState(false) @@ -155,24 +156,6 @@ export default function SectionTanggalTugasTask({ refreshing }: { refreshing: bo - } - title="Update Status" - onPress={() => { - setModal(false) - setTimeout(() => { - setSelect(true) - }, 600); - }} - /> - } - title="Edit Tugas" - onPress={() => { - setModal(false) - router.push(`./update/${tugas.id}`) - }} - /> - - - } - title="Hapus Tugas" - onPress={() => { - setModal(false) - AlertKonfirmasi({ - title: 'Konfirmasi', - desc: 'Apakah anda yakin ingin menghapus data ini?', - onPress: () => { - handleDelete() - } - }) + { + (entityUser.role != "user" && entityUser.role != "coadmin") || isMemberDivision + ? + <> + } + title="Update Status" + onPress={() => { + setModal(false) + setTimeout(() => { + setSelect(true) + }, 600); + }} + /> + } + title="Edit Tugas" + onPress={() => { + setModal(false) + router.push(`./update/${tugas.id}`) + }} + /> + + : + <> + } - }} - /> + { + (entityUser.role != "user" && entityUser.role != "coadmin") || isMemberDivision + ? + + } + title="Hapus Tugas" + onPress={() => { + setModal(false) + AlertKonfirmasi({ + title: 'Konfirmasi', + desc: 'Apakah anda yakin ingin menghapus data ini?', + onPress: () => { + handleDelete() + } + }) + + }} + /> + + : + <> + }