import ButtonBackHeader from "@/components/buttonBackHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader"; import { InputForm } from "@/components/inputForm"; import ModalSelect from "@/components/modalSelect"; import SelectForm from "@/components/selectForm"; import Text from "@/components/Text"; 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"; import { Image, Pressable, SafeAreaView, ScrollView, View } from "react-native"; import Toast from "react-native-toast-message"; import { useDispatch, useSelector } from "react-redux"; type Props = { id: string; name: string; nik: string; email: string; phone: string; gender: string; img: string; isActive: boolean; idGroup: string; idPosition: string; }; export default function EditProfile() { const dispatch = useDispatch() const entities = useSelector((state: any) => state.entities) const { token, decryptToken } = useAuthSession() const [errorImg, setErrorImg] = useState(false) const [selectedImage, setSelectedImage] = useState(undefined); const [choosePosition, setChoosePosition] = useState({ val: entities.idPosition, label: entities.position }); const [chooseGender, setChooseGender] = useState({ val: entities.gender, label: entities.gender == "F" ? 'Perempuan' : 'Laki-laki' }); const [valSelect, setValSelect] = useState<"position" | "gender">("position"); const [isSelect, setSelect] = useState(false); const [disableBtn, setDisableBtn] = useState(false) const [valChoose, setValChoose] = useState("") const [imgForm, setImgForm] = useState() const [loading, setLoading] = useState(false) const [data, setData] = useState({ id: entities.id, name: entities.name, nik: entities.nik, email: entities.email, phone: entities.phone, gender: entities.gender, img: entities.img, isActive: entities.isActive, idGroup: entities.idGroup, idPosition: entities.idPosition }); const [error, setError] = useState({ position: false, nik: false, name: false, phone: false, email: false, gender: false, }); async function handleLoad() { try { const response = await apiGetProfile({ id: entities.id }); dispatch(setEntities(response.data)) } catch (error) { console.error(error); } } useEffect(() => { if (entities.id == undefined) { handleLoad(); } }, [entities]); function validationForm(cat: string, val: any, label?: string) { if (cat == "position") { setChoosePosition({ val, label: String(label) }); setData({ ...data, idPosition: val }); if (val == "" || val == "null") { setError({ ...error, position: true }); } else { setError({ ...error, position: false }); } } else if (cat == "nik") { setData({ ...data, nik: val }); if (val == "" || val.length !== 16) { setError({ ...error, nik: true }); } else { setError({ ...error, nik: false }); } } else if (cat == "name") { setData({ ...data, name: val }); if (val == "") { setError({ ...error, name: true }); } else { setError({ ...error, name: false }); } } else if (cat == "email") { setData({ ...data, email: val }); if ( val == "" || !/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(val) ) { setError({ ...error, email: true }); } else { setError({ ...error, email: false }); } } else if (cat == "phone") { setData({ ...data, phone: val }); if (val == "" || !(val.length >= 10 && val.length <= 15)) { setError({ ...error, phone: true }); } else { setError({ ...error, phone: false }); } } else if (cat == "gender") { setChooseGender({ val, label: String(label) }); setData({ ...data, gender: val }); if (val == "" || val == "null") { setError({ ...error, gender: true }); } else { setError({ ...error, gender: false }); } } } function checkForm() { if (Object.values(error).some((v) => v == true) || Object.values(data).some((v) => v == "")) { setDisableBtn(true) } else { setDisableBtn(false) } } useEffect(() => { checkForm() }, [error, data]) async function handleEdit() { try { setLoading(true) const hasil = await decryptToken(String(token?.current)) 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( { user: hasil, ...data } )) const response = await apiEditProfile(fd) if (response.success) { Toast.show({ type: 'small', text1: 'Berhasil mengupdate data', }) await handleLoad() router.back() } else { Toast.show({ type: 'small', text1: response.message, }) } } catch (error) { console.error(error) Toast.show({ type: 'small', text1: 'Gagal mengupdate data', }) } finally { setLoading(false) } } const pickImageAsync = async () => { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ["images"], allowsEditing: false, quality: 1, aspect: [1, 1], }); if (!result.canceled) { setErrorImg(false) setSelectedImage(result.assets[0].uri); setImgForm(result.assets[0]); } else { setErrorImg(false) } }; return ( ( { router.back(); }} /> ), headerTitle: "Edit Profile", headerTitleAlign: "center", headerRight: () => ( { handleEdit() }} /> ), }} /> { selectedImage != undefined ? ( { setErrorImg(true) }} /> ) : ( { setErrorImg(true) }} /> ) } { setValChoose(choosePosition.val); setValSelect("position"); setSelect(true); }} error={error.position} errorText="Jabatan tidak boleh kosong" /> { validationForm("nik", val) }} /> { validationForm("name", val) }} /> { validationForm("email", val) }} /> +62} value={data?.phone} error={error.phone} errorText="Nomor Telepon tidak valid" onChange={val => { validationForm("phone", val) }} /> { setValChoose(chooseGender.val); setValSelect("gender"); setSelect(true); }} error={error.gender} errorText="Jenis Kelamin tidak boleh kosong" /> { validationForm(valSelect, value.val, value.label); }} title={ valSelect == "position" ? "Jabatan" : "Jenis Kelamin" } open={isSelect} idParent={valSelect == "position" ? data?.idGroup : ""} valChoose={valChoose} /> ); }