import Styles from "@/constants/Styles"; import { apiDeleteFileTask, apiGetTaskOne } from "@/lib/api"; import { setUpdateTask } from "@/lib/taskUpdate"; import { useAuthSession } from "@/providers/AuthProvider"; import { Ionicons, MaterialCommunityIcons } from "@expo/vector-icons"; import * as FileSystem from 'expo-file-system'; import { startActivityAsync } from 'expo-intent-launcher'; import { useLocalSearchParams } from "expo-router"; import * as Sharing from 'expo-sharing'; import { useEffect, useState } from "react"; import { Alert, Platform, Text, ToastAndroid, View } from "react-native"; import * as mime from 'react-native-mime-types'; import { useDispatch, useSelector } from "react-redux"; import AlertKonfirmasi from "../alertKonfirmasi"; import BorderBottomItem from "../borderBottomItem"; import DrawerBottom from "../drawerBottom"; import MenuItemRow from "../menuItemRow"; import ModalLoading from "../modalLoading"; import Skeleton from "../skeleton"; type Props = { id: string name: string extension: string idStorage: string } export default function SectionFileTask() { const [isModal, setModal] = useState(false) const { token, decryptToken } = useAuthSession() const { detail } = useLocalSearchParams<{ detail: string }>() const [data, setData] = useState([]) const update = useSelector((state: any) => state.taskUpdate) const dispatch = useDispatch() const [loading, setLoading] = useState(true) const arrSkeleton = Array.from({ length: 5 }) const [selectFile, setSelectFile] = useState(null) const [loadingOpen, setLoadingOpen] = useState(false) async function handleLoad(loading: boolean) { try { setLoading(loading) const hasil = await decryptToken(String(token?.current)) const response = await apiGetTaskOne({ id: detail, user: hasil, cat: 'file' }) setData(response.data) } catch (error) { console.error(error) } finally { setLoading(false) } } useEffect(() => { handleLoad(false) }, [update.file]) useEffect(() => { handleLoad(true) }, []) const openFile = () => { setModal(false) setLoadingOpen(true) let remoteUrl = 'https://wibu-storage.wibudev.com/api/files/' + selectFile?.idStorage; const fileName = selectFile?.name + '.' + selectFile?.extension; let localPath = `${FileSystem.documentDirectory}/${fileName}`; const mimeType = mime.lookup(fileName) FileSystem.downloadAsync(remoteUrl, localPath).then(async ({ uri }) => { const contentURL = await FileSystem.getContentUriAsync(uri); try { if (Platform.OS == 'android') { // open with android intent await startActivityAsync( 'android.intent.action.VIEW', { data: contentURL, flags: 1, type: mimeType as string, } ); // or // Sharing.shareAsync(localPath); } else if (Platform.OS == 'ios') { Sharing.shareAsync(localPath); } } catch (error) { Alert.alert('INFO', 'Gagal membuka file, tidak ada aplikasi yang dapat membuka file ini'); } finally { setLoadingOpen(false) } }); }; async function handleDelete() { try { const hasil = await decryptToken(String(token?.current)); const response = await apiDeleteFileTask({ user: hasil }, String(selectFile?.id)); if (response.success) { ToastAndroid.show('Berhasil menghapus file', ToastAndroid.SHORT) dispatch(setUpdateTask({ ...update, file: !update.file })) } else { ToastAndroid.show(response.message, ToastAndroid.SHORT) } } catch (error) { console.error(error); ToastAndroid.show('Terjadi kesalahan', ToastAndroid.SHORT) } finally { setModal(false) } } return ( <> File { loading ? arrSkeleton.map((item, index) => { return ( ) }) : data.length > 0 ? data.map((item, index) => { return ( } title={item.name + '.' + item.extension} titleWeight="normal" onPress={() => { setSelectFile(item); setModal(true) }} width={65} /> ) }) : Tidak ada file } } title="Lihat File" onPress={() => { openFile() // setModal(false) }} /> {/* } title="Download" onPress={() => { setModal(false) }} /> */} } title="Hapus" onPress={() => { setModal(false) AlertKonfirmasi({ title: 'Konfirmasi', desc: 'Apakah Anda yakin ingin menghapus file ini? File yang dihapus tidak dapat dikembalikan', onPress: () => { handleDelete() } }) }} /> ) }