import AppHeader from "@/components/AppHeader"; import ImageUser from "@/components/imageNew"; import LabelStatus from "@/components/labelStatus"; import HeaderRightMemberDetail from "@/components/member/headerMemberDetail"; import Skeleton from "@/components/skeleton"; import Text from "@/components/Text"; import { assetUserImage } from "@/constants/AssetsError"; import { ConstEnv } from "@/constants/ConstEnv"; import { valueRoleUser } from "@/constants/RoleUser"; import Styles from "@/constants/Styles"; import { apiGetProfile } from "@/lib/api"; import { useTheme } from "@/providers/ThemeProvider"; import { AntDesign, MaterialCommunityIcons, MaterialIcons } from "@expo/vector-icons"; import { LinearGradient } from "expo-linear-gradient"; import { router, Stack, useLocalSearchParams } from "expo-router"; import React, { useEffect, useState } from "react"; import { Pressable, RefreshControl, SafeAreaView, ScrollView, View } from "react-native"; import ImageViewing from 'react-native-image-viewing'; import Toast from "react-native-toast-message"; import { useSelector } from "react-redux"; type Props = { id: string, name: string, nik: string, email: string, phone: string, gender: string, position: string, group: string, img: string, isActive: boolean, isApprover: boolean, role: string } export default function MemberDetail() { const { id } = useLocalSearchParams<{ id: string }>(); const { colors } = useTheme(); const [data, setData] = useState() const [errorImg, setErrorImg] = useState(false) const entityUser = useSelector((state: any) => state.user) const [isEdit, setEdit] = useState(true) const arrSkeleton = Array.from({ length: 5 }, (_, index) => index) const [loading, setLoading] = useState(true) const [refreshing, setRefreshing] = useState(false) const [preview, setPreview] = useState(false) async function handleLoad(loading: boolean) { try { setLoading(loading) const response = await apiGetProfile({ id: id }) if (response.success) { setData(response.data) setEdit(valueRoleUser.filter((v) => v.login == entityUser.role)[0]?.data.some((i: any) => i.id == response.data.idUserRole)) } else { Toast.show({ type: 'small', text1: response.message }) } } catch (error : any ) { console.error(error); const message = error?.response?.data?.message || "Gagal mengambil data" Toast.show({ type: 'small', text1: message }) } finally { setLoading(false) } } useEffect(() => { handleLoad(true) }, []); const handleRefresh = async () => { setRefreshing(true) handleLoad(false) await new Promise(resolve => setTimeout(resolve, 2000)); setRefreshing(false) }; return ( ( router.back()} right={ (entityUser.role != "user") && isEdit ? : <> } /> ) }} /> } > {loading ? ( <> ) : ( <> setPreview(true)}> {data?.name} {data?.role} {data?.isApprover && ( APPROVER )} {data?.isActive ? 'AKTIF' : 'TIDAK AKTIF'} )} Informasi {loading ? ( arrSkeleton.map((_, index) => ( )) ) : ( [ { icon: , label: 'NIK', value: data?.nik }, { icon: , label: 'Lembaga Desa', value: data?.group }, { icon: , label: 'Jabatan', value: data?.position }, { icon: , label: 'No Telepon', value: `+62${data?.phone}` }, { icon: , label: 'Email', value: data?.email }, { icon: , label: 'Jenis Kelamin', value: data?.gender == "F" ? "Perempuan" : "Laki-Laki" }, ].map((item, index, arr) => ( {item.icon} {item.label} {item.value ?? '-'} )) )} setPreview(false)} doubleTapToZoomEnabled /> ) }