import BorderBottomItem from "@/components/borderBottomItem"; import ButtonBackHeader from "@/components/buttonBackHeader"; import ButtonSaveHeader from "@/components/buttonSaveHeader"; import ButtonSelect from "@/components/buttonSelect"; import DrawerBottom from "@/components/drawerBottom"; import MenuItemRow from "@/components/menuItemRow"; import Styles from "@/constants/Styles"; import { apiAddFileTask, apiCheckFileTask } from "@/lib/api"; import { setUpdateTask } from "@/lib/taskUpdate"; import { useAuthSession } from "@/providers/AuthProvider"; import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; import * as DocumentPicker from "expo-document-picker"; import { router, Stack, useLocalSearchParams } from "expo-router"; import { useState } from "react"; import { ActivityIndicator, SafeAreaView, ScrollView, Text, ToastAndroid, View, } from "react-native"; import { useDispatch, useSelector } from "react-redux"; export default function TaskDivisionAddFile() { const { id, detail } = useLocalSearchParams<{ id: string; detail: string }>(); const [fileForm, setFileForm] = useState([]); const [listFile, setListFile] = useState([]); const [indexDelFile, setIndexDelFile] = useState(0); const [isModal, setModal] = useState(false); const { token, decryptToken } = useAuthSession(); const [loadingCheck, setLoadingCheck] = useState(false); const dispatch = useDispatch(); const update = useSelector((state: any) => state.taskUpdate); const pickDocumentAsync = async () => { let result = await DocumentPicker.getDocumentAsync({ type: ["*/*"], multiple: false, }); if (!result.canceled) { if (result.assets?.[0].uri) { const check = await handleCheckFile(result.assets?.[0]); if (check) { setFileForm([...fileForm, result.assets?.[0]]); setListFile([...listFile, result.assets?.[0].name]); } else { ToastAndroid.show("File sudah ada", ToastAndroid.SHORT); } } } }; function deleteFile(index: number) { setListFile([...listFile.filter((val, i) => i !== index)]); setFileForm([...fileForm.filter((val, i) => i !== index)]); setModal(false); } async function handleCheckFile(val: any) { try { setLoadingCheck(true); const hasil = await decryptToken(String(token?.current)); const fd = new FormData(); fd.append("file", { uri: val.uri, type: "application/octet-stream", name: val.name, } as any); fd.append( "data", JSON.stringify({ user: hasil, }) ); const response = await apiCheckFileTask({ data: fd, id: detail }); return response.success; } catch (error) { console.error(error); return false; } finally { setLoadingCheck(false); } } async function handleAddFile() { try { const hasil = await decryptToken(String(token?.current)); const fd = new FormData(); for (let i = 0; i < fileForm.length; i++) { fd.append(`file${i}`, { uri: fileForm[i].uri, type: "application/octet-stream", name: fileForm[i].name, } as any); } fd.append( "data", JSON.stringify({ user: hasil, }) ); const response = await apiAddFileTask({ data: fd, id: detail }); if (response.success) { ToastAndroid.show("Berhasil menambahkan file", ToastAndroid.SHORT); dispatch(setUpdateTask({ ...update, file: !update.file })); router.back(); } else { ToastAndroid.show(response.message, ToastAndroid.SHORT); } } catch (error) { console.error(error); ToastAndroid.show("Terjadi kesalahan", ToastAndroid.SHORT); } } return ( ( { router.back(); }} /> ), headerTitle: "Tambah File", headerTitleAlign: "center", headerRight: () => ( { handleAddFile() }} /> ), }} /> { listFile.length > 0 && ( File { listFile.map((item, index) => ( } title={item} titleWeight="normal" onPress={() => { setIndexDelFile(index); setModal(true) }} /> )) } ) } { loadingCheck && } } title="Hapus" onPress={() => { deleteFile(indexDelFile) }} /> ); }