import { ColorsStatus } from "@/constants/ColorsStatus"; import { ConstEnv } from "@/constants/ConstEnv"; import Styles from "@/constants/Styles"; import { Ionicons } from "@expo/vector-icons"; import * as FileSystem from 'expo-file-system'; import { startActivityAsync } from 'expo-intent-launcher'; import * as Sharing from 'expo-sharing'; import React, { useState } from "react"; import { Alert, Dimensions, Platform, Pressable, View } from "react-native"; import { ScrollView } from "react-native-gesture-handler"; import * as mime from 'react-native-mime-types'; import Text from "./Text"; type Props = { title?: string subtitle?: string | React.ReactNode icon: React.ReactNode desc?: string rightTopInfo?: string onPress?: () => void onLongPress?: () => void borderType: 'all' | 'bottom' | 'none' leftBottomInfo?: React.ReactNode | string rightBottomInfo?: React.ReactNode | string titleWeight?: 'normal' | 'bold' bgColor?: 'white' | 'transparent' width?: number descEllipsize?: boolean textColor?: string, colorPress?: boolean titleShowAll?: boolean dataFile: { id: string; idStorage: string; name: string; extension: string }[] } export default function BorderBottomItem2({ title, subtitle, icon, desc, onPress, onLongPress, rightTopInfo, borderType, leftBottomInfo, rightBottomInfo, titleWeight, bgColor, width, descEllipsize, textColor, colorPress, titleShowAll, dataFile }: Props) { const lebarDim = Dimensions.get("window").width; const lebar = width ? lebarDim * width / 100 : 'auto'; const textColorFix = textColor ? textColor : 'black'; const [isTap, setIsTap] = useState(false); const [loadingOpen, setLoadingOpen] = useState(false) const openFile = (item: { idStorage: string; name: string; extension: string }) => { if (Platform.OS == 'android') setLoadingOpen(true) let remoteUrl = ConstEnv.url_storage + '/files/' + item.idStorage; const fileName = item.name + '.' + item.extension; let localPath = `${FileSystem.documentDirectory}/${fileName}`; const mimeType = mime.lookup(fileName) FileSystem.downloadAsync(remoteUrl, localPath).then(async ({ uri }) => { const contentURL = await FileSystem.getContentUriAsync(uri); setLoadingOpen(false) try { if (Platform.OS == 'android') { await startActivityAsync( 'android.intent.action.VIEW', { data: contentURL, flags: 1, type: mimeType as string, } ); } 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 { if (Platform.OS == 'android') setLoadingOpen(false) } }); }; return ( setIsTap(true)} onPressOut={() => setIsTap(false)} style={({ pressed }) => [ borderType == 'bottom' ? Styles.wrapItemBorderBottom : borderType == 'all' ? Styles.wrapItemBorderAll : Styles.wrapItemBorderNone, bgColor && bgColor == 'white' && ColorsStatus.white, // efek warna saat ditekan (sementara) isTap && colorPress && ColorsStatus.pressedGray, ]} > {icon} {title} { subtitle && typeof subtitle == "string" ? {subtitle} : {subtitle} } { rightTopInfo && {rightTopInfo} } {desc && {desc}} { dataFile.length > 0 && ( {dataFile.map((item, index) => ( { openFile({ idStorage: item.idStorage, name: item.name, extension: item.extension }) }} > {item.name}.{item.extension} ))} ) } { (leftBottomInfo || rightBottomInfo) && ( { typeof leftBottomInfo == 'string' ? {leftBottomInfo} : leftBottomInfo } { typeof rightBottomInfo == 'string' ? {rightBottomInfo} : rightBottomInfo } ) } ) }