upd: member

Deskripsi;
- upload gambar pada tambah member
- upload gambar pada edit member

NO Issues
This commit is contained in:
amel
2025-05-19 15:05:06 +08:00
parent fb7149ce02
commit b45822fff2
4 changed files with 71 additions and 23 deletions

View File

@@ -28,7 +28,7 @@ export default function MemberDetail() {
const [data, setData] = useState<Props>() const [data, setData] = useState<Props>()
const [error, setError] = useState(false) const [error, setError] = useState(false)
const entityUser = useSelector((state: any) => state.user) const entityUser = useSelector((state: any) => state.user)
const [isEdit, setEdit] = useState(false) const [isEdit, setEdit] = useState(true)
async function handleLoad() { async function handleLoad() {
try { try {
@@ -40,6 +40,7 @@ export default function MemberDetail() {
} }
} }
useEffect(() => { useEffect(() => {
handleLoad() handleLoad()
}, []); }, []);
@@ -51,7 +52,7 @@ export default function MemberDetail() {
headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />, headerLeft: () => <ButtonBackHeader onPress={() => { router.back() }} />,
headerTitle: 'Anggota', headerTitle: 'Anggota',
headerTitleAlign: 'center', headerTitleAlign: 'center',
headerRight: () => (entityUser.role != "user") && isEdit && <HeaderRightMemberDetail active={data?.isActive} id={id} />, headerRight: () => (entityUser.role != "user") && isEdit ? <HeaderRightMemberDetail active={data?.isActive} id={id} /> : <></>,
headerShadowVisible: false headerShadowVisible: false
}} }}
/> />

View File

@@ -37,6 +37,7 @@ export default function CreateMember() {
const [isSelect, setSelect] = useState(false); const [isSelect, setSelect] = useState(false);
const [disableBtn, setDisableBtn] = useState(true) const [disableBtn, setDisableBtn] = useState(true)
const [valChoose, setValChoose] = useState("") const [valChoose, setValChoose] = useState("")
const [imgForm, setImgForm] = useState<any>()
const [error, setError] = useState({ const [error, setError] = useState({
group: false, group: false,
position: false, position: false,
@@ -144,9 +145,21 @@ export default function CreateMember() {
try { try {
const hasil = await decryptToken(String(token?.current)) const hasil = await decryptToken(String(token?.current))
const fd = new FormData() const fd = new FormData()
fd.append("data", JSON.stringify( fd.append("data", JSON.stringify(
{ user: hasil, ...dataForm } { user: hasil, ...dataForm }
)) ))
if (imgForm != undefined) {
fd.append("file", {
uri: imgForm.uri,
type: imgForm.mimeType,
name: imgForm.fileName,
} as any)
} else {
fd.append("file", "undefined")
}
const response = await apiCreateUser(fd) const response = await apiCreateUser(fd)
if (response.success) { if (response.success) {
ToastAndroid.show('Berhasil menambahkan data', ToastAndroid.SHORT) ToastAndroid.show('Berhasil menambahkan data', ToastAndroid.SHORT)
@@ -166,10 +179,13 @@ export default function CreateMember() {
mediaTypes: ["images"], mediaTypes: ["images"],
allowsEditing: true, allowsEditing: true,
quality: 1, quality: 1,
aspect: [1, 1],
}); });
if (!result.canceled) { if (!result.canceled) {
setSelectedImage(result.assets[0].uri); setSelectedImage(result.assets[0].uri);
setImgForm(result.assets[0]);
} else { } else {
alert("Tidak ada gambar yang dipilih"); alert("Tidak ada gambar yang dipilih");
} }

View File

@@ -41,7 +41,7 @@ export default function EditMember() {
const { token, decryptToken } = useAuthSession() const { token, decryptToken } = useAuthSession()
const { id } = useLocalSearchParams<{ id: string }>(); const { id } = useLocalSearchParams<{ id: string }>();
const [errorImg, setErrorImg] = useState(false) const [errorImg, setErrorImg] = useState(false)
const [selectedImage, setSelectedImage] = useState<string | undefined>(undefined); const [selectedImage, setSelectedImage] = useState<string | undefined | { uri: string }>(undefined);
const [choosePosition, setChoosePosition] = useState({ val: "", label: "" }); const [choosePosition, setChoosePosition] = useState({ val: "", label: "" });
const [chooseRole, setChooseRole] = useState({ val: "", label: "" }); const [chooseRole, setChooseRole] = useState({ val: "", label: "" });
const [chooseGender, setChooseGender] = useState({ val: "", label: "" }); const [chooseGender, setChooseGender] = useState({ val: "", label: "" });
@@ -49,6 +49,7 @@ export default function EditMember() {
const [isSelect, setSelect] = useState(false); const [isSelect, setSelect] = useState(false);
const [disableBtn, setDisableBtn] = useState(false) const [disableBtn, setDisableBtn] = useState(false)
const [valChoose, setValChoose] = useState("") const [valChoose, setValChoose] = useState("")
const [imgForm, setImgForm] = useState<any>();
const [data, setData] = useState<Props>({ const [data, setData] = useState<Props>({
id: "", id: "",
name: "", name: "",
@@ -76,6 +77,7 @@ export default function EditMember() {
try { try {
const response = await apiGetProfile({ id: id }); const response = await apiGetProfile({ id: id });
setData(response.data); setData(response.data);
setSelectedImage({ uri: `https://wibu-storage.wibudev.com/api/files/${response.data.img}`, });
setChoosePosition({ setChoosePosition({
val: response.data.idPosition, val: response.data.idPosition,
label: response.data.position, label: response.data.position,
@@ -173,19 +175,33 @@ export default function EditMember() {
try { try {
const hasil = await decryptToken(String(token?.current)) const hasil = await decryptToken(String(token?.current))
const fd = new FormData() const fd = new FormData()
if (imgForm != undefined) {
fd.append("file", {
uri: imgForm.uri,
type: imgForm.mimeType,
name: imgForm.fileName,
} as any);
} else {
fd.append("file", "undefined",);
}
fd.append("data", JSON.stringify( fd.append("data", JSON.stringify(
{ user: hasil, ...data } { user: hasil, ...data }
)) ))
const response = await apiEditUser(fd, id) const response = await apiEditUser(fd, id)
if (response.success) { if (response.success) {
ToastAndroid.show('Berhasil mengupdate data', ToastAndroid.SHORT) ToastAndroid.show('Berhasil mengupdate data', ToastAndroid.SHORT)
dispatch(setUpdateMember(!update)) dispatch(setUpdateMember(!update))
router.replace(`/member/${id}`); router.back()
} else { } else {
ToastAndroid.show(response.message, ToastAndroid.SHORT) ToastAndroid.show(response.message, ToastAndroid.SHORT)
} }
} catch (error) { } catch (error) {
console.error(error) console.error(error)
ToastAndroid.show('Gagal mengupdate data', ToastAndroid.SHORT)
} }
} }
@@ -196,12 +212,16 @@ export default function EditMember() {
mediaTypes: ["images"], mediaTypes: ["images"],
allowsEditing: true, allowsEditing: true,
quality: 1, quality: 1,
aspect: [1, 1],
}); });
if (!result.canceled) { if (!result.canceled) {
setErrorImg(false)
setSelectedImage(result.assets[0].uri); setSelectedImage(result.assets[0].uri);
setImgForm(result.assets[0]);
} else { } else {
alert("Tidak ada gambar yang dipilih"); alert("Tidak ada gambar yang dipilih");
setErrorImg(false)
} }
}; };
@@ -232,26 +252,37 @@ export default function EditMember() {
<ScrollView> <ScrollView>
<View style={[Styles.p15, Styles.mb100]}> <View style={[Styles.p15, Styles.mb100]}>
<View style={{ justifyContent: "center", alignItems: "center" }}> <View style={{ justifyContent: "center", alignItems: "center" }}>
<Pressable onPress={pickImageAsync}> {
{ errorImg ?
<Image
source={errorImg ? require("../../../../assets/images/user.jpg") : { uri: `https://wibu-storage.wibudev.com/api/files/${data?.img}` }}
style={[Styles.userProfileBig]}
onError={() => { setErrorImg(true) }}
/>
}
</Pressable>
{/* {
selectedImage != undefined ? (
<Pressable onPress={pickImageAsync}> <Pressable onPress={pickImageAsync}>
<Image src={selectedImage} style={[Styles.userProfileBig]} /> {
<Image
source={errorImg ? require("../../../../assets/images/user.jpg") : { uri: `https://wibu-storage.wibudev.com/api/files/${data?.img}` }}
style={[Styles.userProfileBig]}
onError={() => { setErrorImg(true) }}
/>
}
</Pressable> </Pressable>
) : ( :
<Pressable onPress={pickImageAsync} style={[Styles.iconContent, ColorsStatus.gray]}> selectedImage != undefined ? (
<MaterialCommunityIcons name="account-tie" size={100} color={'gray'} /> <Pressable onPress={pickImageAsync}>
</Pressable> <Image
) src={
} */} typeof selectedImage === "string"
? selectedImage
: selectedImage.uri
}
style={[Styles.userProfileBig]}
onError={() => { setErrorImg(true) }}
/>
</Pressable>
) : (
<Image
source={require("../../../../assets/images/user.jpg")}
style={[Styles.userProfileBig]}
/>
)
}
</View> </View>
<SelectForm <SelectForm
label="Jabatan" label="Jabatan"

View File

@@ -34,7 +34,7 @@ export function InputForm({ label, value, placeholder, onChange, info, disable,
</Text> </Text>
) )
} }
<View style={[Styles.inputRoundForm, itemRight != undefined ? Styles.inputRoundFormRight : Styles.inputRoundFormLeft, round && Styles.round30, { backgroundColor: bg && bg == 'white' ? 'white' : 'transparent' }, Styles.pv10]}> <View style={[Styles.inputRoundForm, itemRight != undefined ? Styles.inputRoundFormRight : Styles.inputRoundFormLeft, round && Styles.round30, { backgroundColor: bg && bg == 'white' ? 'white' : 'transparent' }, Styles.pv10, error && { borderColor: "red" }]}>
{itemRight != undefined ? itemRight : itemLeft} {itemRight != undefined ? itemRight : itemLeft}
<TextInput <TextInput
editable={!disable} editable={!disable}