import ThemedHeader from "@/src/components/themed/ThemedHeader"; import React, {useState} from "react"; import ThemedBackground from "@/src/components/themed/ThemedBackground"; import CustomImagePicker from "@/src/components/ImagePicker"; import {ImagePickerSuccessResult} from "expo-image-picker"; import { View, ActivityIndicator, FlatList, Text, TouchableOpacity, Linking, Modal, } from "react-native"; import {S3File, restService} from "@/src/services/RestService"; import ThemedButton from "@/src/components/themed/ThemedButton"; import {useColors} from "@/src/hooks/useColors"; import {MaterialIcons} from '@expo/vector-icons'; import { useMatrixStore } from "@/src/stores"; import SaveToMatrixButton from "@/src/components/SaveToMatrixButton"; export default function ImageScreen() { const [uploading, setUploading] = useState(false); const [files, setFiles] = useState([]); const [showFiles, setShowFiles] = useState(false); const [loadingFiles, setLoadingFiles] = useState(false); const [deletingFile, setDeletingFile] = useState(null); const {colors} = useColors(); const imageConfig = useMatrixStore((s) => s.matrixState.image); const updateImageConfig = useMatrixStore((s) => s.updateImageConfig); const fetchStoredFiles = async () => { setLoadingFiles(true); try { const response = await restService.getStoredFiles(); if (response.ok && response.data) { setFiles(response.data); setShowFiles(true); } else { console.error("Fehler beim Abrufen der Dateien"); } } catch (error) { console.error("Fehler beim Abrufen der Dateien:", error); } finally { setLoadingFiles(false); } }; const onSuccess = async (result: ImagePickerSuccessResult) => { if (result.assets && result.assets.length > 0) { const selectedAsset = result.assets[0]; console.log("Image picked successfully", selectedAsset); try { setUploading(true); const formData = new FormData(); const fileBlob = ('file' in selectedAsset && selectedAsset.file) ? selectedAsset.file as Blob : await fetch(selectedAsset.uri).then(r => r.blob()); const fileName = selectedAsset.fileName || 'upload.jpg'; formData.append('image', fileBlob, fileName); console.log("Web-Plattform: Blob angehängt mit Namen:", fileName); const response = await restService.uploadFile(formData); if (response.ok) { console.log("Datei erfolgreich hochgeladen"); fetchStoredFiles(); } else { console.error("Upload fehlgeschlagen:", response); } } catch (error) { console.error("Fehler beim Hochladen der Datei:", error); } finally { setUploading(false); } } }; const onFailure = (error: Error) => { console.error("Error picking image", error); }; const onCanceled = () => { console.log("Image picking canceled"); }; const toggleFilesList = () => { if (!showFiles) { fetchStoredFiles(); } else { setShowFiles(false); } }; const formatDate = (dateString: Date) => { const date = new Date(dateString); return date.toLocaleString('de-DE'); }; const formatFileSize = (size: number) => { if (size < 1024) { return `${size} B`; } else if (size < 1024 * 1024) { return `${(size / 1024).toFixed(2)} KB`; } else { return `${(size / (1024 * 1024)).toFixed(2)} MB`; } }; const viewFile = async (objectKey: string) => { try { const response = await restService.getFileUrl(objectKey); if (response.ok && response.data.url) { const url = response.data.url; const canOpen = await Linking.canOpenURL(url); if (canOpen) { await Linking.openURL(url); } else { console.error("Diese URL kann nicht geöffnet werden:", url); } } else { console.error("Datei-URL konnte nicht abgerufen werden"); } } catch (error) { console.error("Fehler beim Abrufen der Datei-URL:", error); } }; const deleteFile = async (objectKey: string) => { try { const response = await restService.deleteFile(objectKey); if (response.ok) { console.log("Datei erfolgreich gelöscht"); fetchStoredFiles(); } else { console.error("Datei konnte nicht gelöscht werden"); } } catch (error) { console.error("Fehler beim Löschen der Datei:", error); } }; const confirmDeleteFile = (objectKey: string) => { setDeletingFile(objectKey); }; const cancelDelete = () => { setDeletingFile(null); }; return ( Bilder Modus {uploading ? ( Datei wird hochgeladen... ) : ( )} {showFiles && ( Gespeicherte Dateien {loadingFiles ? ( ) : files.length > 0 ? ( item.key} renderItem={({item}) => ( {item.originalName} {item.mimeType} • {formatFileSize(item.size)} {formatDate(item.lastModified)} viewFile(item.key)} > confirmDeleteFile(item.key)} > )} /> ) : ( Keine Dateien gefunden )} )} Datei löschen? Diese Aktion kann nicht rückgängig gemacht werden. { if (deletingFile) { deleteFile(deletingFile); setDeletingFile(null); } }} title="Ja, löschen" mode="contained" className="bg-error" /> {imageConfig.image && ( Ausgewähltes Bild: {imageConfig.image} )} ); // add back after the text block }