diff --git a/app/(application)/banner/index.tsx b/app/(application)/banner/index.tsx index a905938..333d91f 100644 --- a/app/(application)/banner/index.tsx +++ b/app/(application)/banner/index.tsx @@ -18,6 +18,7 @@ import { router, Stack } from "expo-router" import * as Sharing from 'expo-sharing' import { useState } from "react" import { Alert, Image, Platform, RefreshControl, SafeAreaView, ScrollView, View } from "react-native" +import ImageViewing from 'react-native-image-viewing' import * as mime from 'react-native-mime-types' import Toast from "react-native-toast-message" import { useDispatch, useSelector } from "react-redux" @@ -38,12 +39,13 @@ export default function BannerList() { const dispatch = useDispatch() const [refreshing, setRefreshing] = useState(false) const [loadingOpen, setLoadingOpen] = useState(false) + const [viewImg, setViewImg] = useState(false) const handleDeleteEntity = async () => { try { const hasil = await decryptToken(String(token?.current)); const deletedEntity = await apiDeleteBanner({ user: hasil }, dataId); - if (deletedEntity.success ) { + if (deletedEntity.success) { Toast.show({ type: 'small', text1: 'Berhasil menghapus data', }) apiGetBanner({ user: hasil }).then((data) => dispatch(setEntities(data.data)) @@ -167,8 +169,14 @@ export default function BannerList() { /> } - title="Lihat / Share" - onPress={() => { openFile() }} + title="Lihat" + onPress={() => { + setModal(false) + setTimeout(() => { + setViewImg(true); + }, 1000); + // openFile() + }} /> } @@ -184,6 +192,14 @@ export default function BannerList() { /> + + setViewImg(false)} + doubleTapToZoomEnabled + /> ) } \ No newline at end of file diff --git a/app/(application)/member/[id].tsx b/app/(application)/member/[id].tsx index 770e8e9..0bc6770 100644 --- a/app/(application)/member/[id].tsx +++ b/app/(application)/member/[id].tsx @@ -5,13 +5,15 @@ 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 { router, Stack, useLocalSearchParams } from "expo-router"; import { useEffect, useState } from "react"; -import { RefreshControl, SafeAreaView, ScrollView, View } from "react-native"; +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"; @@ -32,12 +34,13 @@ type Props = { export default function MemberDetail() { const { id } = useLocalSearchParams<{ id: string }>(); const [data, setData] = useState() - const [error, setError] = useState(false) + 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 { @@ -100,7 +103,9 @@ export default function MemberDetail() { : <> - + setPreview(true)}> + + {data?.name} {data?.role} @@ -136,6 +141,14 @@ export default function MemberDetail() { + + setPreview(false)} + doubleTapToZoomEnabled + /> ) } \ No newline at end of file diff --git a/app/(application)/profile.tsx b/app/(application)/profile.tsx index 877c2d5..1c9c989 100644 --- a/app/(application)/profile.tsx +++ b/app/(application)/profile.tsx @@ -3,19 +3,22 @@ import ButtonBackHeader from "@/components/buttonBackHeader"; import { ButtonHeader } from "@/components/buttonHeader"; import ItemDetailMember from "@/components/itemDetailMember"; import Text from "@/components/Text"; +import { assetUserImage } from "@/constants/AssetsError"; import { ConstEnv } from "@/constants/ConstEnv"; import Styles from "@/constants/Styles"; import { useAuthSession } from "@/providers/AuthProvider"; import { AntDesign } from "@expo/vector-icons"; import { router, Stack } from "expo-router"; import { useState } from "react"; -import { Image, SafeAreaView, ScrollView, View } from "react-native"; +import { Image, Pressable, SafeAreaView, ScrollView, View } from "react-native"; +import ImageViewing from 'react-native-image-viewing'; import { useSelector } from 'react-redux'; export default function Profile() { const { signOut } = useAuthSession() const entities = useSelector((state: any) => state.entities) const [error, setError] = useState(false) + const [preview, setPreview] = useState(false) return ( @@ -41,11 +44,13 @@ export default function Profile() { - { setError(true) }} - style={[Styles.userProfileBig]} - /> + setPreview(true)}> + { setError(true) }} + style={[Styles.userProfileBig]} + /> + {entities.name} {entities.role} @@ -65,6 +70,13 @@ export default function Profile() { + setPreview(false)} + doubleTapToZoomEnabled + /> ) } \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 3381a39..0099b5b 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/components/imageNew.tsx b/components/imageNew.tsx index 3bcd988..903a7ad 100644 --- a/components/imageNew.tsx +++ b/components/imageNew.tsx @@ -6,17 +6,19 @@ type Props = { src: string, size?: 'sm' | 'xs' | 'lg' border?: boolean + onError?: (val:boolean) => void } -export default function ImageUser({ src, size }: Props) { +export default function ImageUser({ src, size, onError }: Props) { const [error, setError] = useState(false) return ( + onError={() => { setError(true) - } + onError?.(true) + }} /> ) } \ No newline at end of file diff --git a/constants/AssetsError.ts b/constants/AssetsError.ts new file mode 100644 index 0000000..4923633 --- /dev/null +++ b/constants/AssetsError.ts @@ -0,0 +1,5 @@ +import { Image } from "react-native"; + +export const assetUserImage = Image.resolveAssetSource( + require('@/assets/images/user.jpg') +); \ No newline at end of file diff --git a/ios/Desa.xcodeproj/project.pbxproj b/ios/Desa.xcodeproj/project.pbxproj index b1cad5d..942742d 100644 --- a/ios/Desa.xcodeproj/project.pbxproj +++ b/ios/Desa.xcodeproj/project.pbxproj @@ -394,7 +394,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = mobiledarmasaba.app; - PRODUCT_NAME = "Desa"; + PRODUCT_NAME = Desa; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Desa/Desa-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -429,7 +429,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = mobiledarmasaba.app; - PRODUCT_NAME = "Desa"; + PRODUCT_NAME = Desa; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Desa/Desa-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/package.json b/package.json index c81e9d6..c108c70 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "react-native-gesture-handler": "~2.24.0", "react-native-gifted-charts": "^1.4.57", "react-native-image-picker": "^8.2.1", + "react-native-image-viewing": "^0.2.2", "react-native-mime-types": "^2.5.0", "react-native-modal": "^14.0.0-rc.1", "react-native-modal-datetime-picker": "^18.0.0",