upd: image picker

Deskripsi:
- tambah icon kamera pada image picker > edit profile, tambah anggota dan edit anggota

No Issues
This commit is contained in:
2025-08-07 11:34:54 +08:00
parent 81aedb525f
commit 9cb848ddd2
4 changed files with 51 additions and 34 deletions

View File

@@ -8,6 +8,7 @@ import Styles from "@/constants/Styles";
import { apiEditProfile, apiGetProfile } from "@/lib/api";
import { setEntities } from "@/lib/entitiesSlice";
import { useAuthSession } from "@/providers/AuthProvider";
import { MaterialCommunityIcons } from "@expo/vector-icons";
import * as ImagePicker from "expo-image-picker";
import { router, Stack } from "expo-router";
import { useEffect, useState } from "react";
@@ -229,8 +230,8 @@ export default function EditProfile() {
),
}}
/>
<ScrollView>
<View style={[Styles.p15, Styles.mb100]}>
<ScrollView style={[Styles.h100]}>
<View style={[Styles.p15]}>
<View style={{ justifyContent: "center", alignItems: "center" }}>
{
selectedImage != undefined ? (
@@ -244,16 +245,20 @@ export default function EditProfile() {
style={[Styles.userProfileBig]}
onError={() => { setErrorImg(true) }}
/>
<View style={[Styles.absoluteIconPicker]}>
<MaterialCommunityIcons name="image" color={'white'} size={15} />
</View>
</Pressable>
) : (
<Pressable onPress={pickImageAsync}>
{
<Image
source={errorImg ? require("../../assets/images/user.jpg") : { uri: `https://wibu-storage.wibudev.com/api/files/${data?.img}` }}
style={[Styles.userProfileBig]}
onError={() => { setErrorImg(true) }}
/>
}
<Image
source={errorImg ? require("../../assets/images/user.jpg") : { uri: `https://wibu-storage.wibudev.com/api/files/${data?.img}` }}
style={[Styles.userProfileBig]}
onError={() => { setErrorImg(true) }}
/>
<View style={[Styles.absoluteIconPicker]}>
<MaterialCommunityIcons name="image" color={'white'} size={15} />
</View>
</Pressable>
)
}

View File

@@ -10,6 +10,7 @@ import { apiCreateUser } from "@/lib/api";
import { setUpdateMember } from "@/lib/memberSlice";
import { useAuthSession } from "@/providers/AuthProvider";
import { MaterialCommunityIcons } from "@expo/vector-icons";
import { useHeaderHeight } from '@react-navigation/elements';
import * as ImagePicker from "expo-image-picker";
import { router, Stack } from "expo-router";
import { useEffect, useState } from "react";
@@ -24,7 +25,6 @@ import {
} from "react-native";
import Toast from "react-native-toast-message";
import { useDispatch, useSelector } from "react-redux";
import { useHeaderHeight } from '@react-navigation/elements';
export default function CreateMember() {
const headerHeight = useHeaderHeight();
@@ -147,7 +147,7 @@ export default function CreateMember() {
}, [error, dataForm])
useEffect(() => {
if(entityUser.role !="supadmin" && entityUser.role != "developer"){
if (entityUser.role != "supadmin" && entityUser.role != "developer") {
validationForm("group", entities.idGroup, entities.group)
}
}, [])
@@ -173,7 +173,7 @@ export default function CreateMember() {
fd.append("file", "undefined")
}
const response = await apiCreateUser({data: fd})
const response = await apiCreateUser({ data: fd })
if (response.success) {
Toast.show({ type: 'small', text1: 'Berhasil menambahkan data', })
dispatch(setUpdateMember(!update))
@@ -184,7 +184,7 @@ export default function CreateMember() {
} catch (error) {
console.error(error)
Toast.show({ type: 'small', text1: 'Terjadi kesalahan', })
}finally{
} finally {
setLoading(false)
}
}
@@ -227,9 +227,9 @@ export default function CreateMember() {
}}
/>
<KeyboardAvoidingView
style={[Styles.h100]}
behavior={Platform.OS === 'ios' ? 'padding' : undefined}
keyboardVerticalOffset={headerHeight}
style={[Styles.h100]}
behavior={Platform.OS === 'ios' ? 'padding' : undefined}
keyboardVerticalOffset={headerHeight}
>
<ScrollView>
<View style={[Styles.p15]}>
@@ -237,17 +237,16 @@ export default function CreateMember() {
{selectedImage != undefined ? (
<Pressable onPress={pickImageAsync}>
<Image src={selectedImage} style={[Styles.userProfileBig]} />
<View style={[Styles.absoluteIconPicker]}>
<MaterialCommunityIcons name="image" color={'white'} size={15} />
</View>
</Pressable>
) : (
<Pressable
onPress={pickImageAsync}
style={[Styles.iconContent, ColorsStatus.gray]}
>
<MaterialCommunityIcons
name="account-tie"
size={100}
color={"gray"}
/>
<Pressable onPress={pickImageAsync} style={[Styles.iconContent, ColorsStatus.gray]} >
<MaterialCommunityIcons name="account-tie" size={85} color={"gray"} />
<View style={[Styles.absoluteIconPicker]}>
<MaterialCommunityIcons name="image" color={'white'} size={15} />
</View>
</Pressable>
)}
</View>

View File

@@ -8,6 +8,8 @@ import Styles from "@/constants/Styles";
import { apiEditUser, apiGetProfile } from "@/lib/api";
import { setUpdateMember } from "@/lib/memberSlice";
import { useAuthSession } from "@/providers/AuthProvider";
import { MaterialCommunityIcons } from "@expo/vector-icons";
import { useHeaderHeight } from '@react-navigation/elements';
import * as ImagePicker from "expo-image-picker";
import { router, Stack, useLocalSearchParams } from "expo-router";
import { useEffect, useState } from "react";
@@ -22,7 +24,6 @@ import {
} from "react-native";
import Toast from "react-native-toast-message";
import { useDispatch, useSelector } from "react-redux";
import { useHeaderHeight } from '@react-navigation/elements';
type Props = {
id: string;
@@ -208,7 +209,7 @@ export default function EditMember() {
} catch (error) {
console.error(error)
Toast.show({ type: 'small', text1: 'Terjadi kesalahan', })
}finally{
} finally {
setLoading(false)
}
}
@@ -268,13 +269,14 @@ export default function EditMember() {
{
errorImg ?
<Pressable onPress={pickImageAsync}>
{
<Image
source={errorImg ? require("../../../../assets/images/user.jpg") : { uri: `https://wibu-storage.wibudev.com/api/files/${data?.img}` }}
style={[Styles.userProfileBig]}
onError={() => { setErrorImg(true) }}
/>
}
<Image
source={errorImg ? require("../../../../assets/images/user.jpg") : { uri: `https://wibu-storage.wibudev.com/api/files/${data?.img}` }}
style={[Styles.userProfileBig]}
onError={() => { setErrorImg(true) }}
/>
<View style={[Styles.absoluteIconPicker]}>
<MaterialCommunityIcons name="image" color={'white'} size={15} />
</View>
</Pressable>
:
selectedImage != undefined ? (
@@ -288,6 +290,9 @@ export default function EditMember() {
style={[Styles.userProfileBig]}
onError={() => { setErrorImg(true) }}
/>
<View style={[Styles.absoluteIconPicker]}>
<MaterialCommunityIcons name="image" color={'white'} size={15} />
</View>
</Pressable>
) : (
<Image

View File

@@ -585,6 +585,14 @@ const Styles = StyleSheet.create({
width: '90%',
borderWidth: 1,
borderColor: '#d6d8f6',
},
absoluteIconPicker: {
backgroundColor: '#384288',
padding: 5,
borderRadius: 100,
bottom: 5,
right: 5,
position: 'absolute'
}
})