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",