import { Link, Stack, useLocalSearchParams } from "expo-router"; import { Box } from "@/components/ui/box"; import { Card } from "@/components/ui/card"; import { Heading } from "@/components/ui/heading"; import { Image } from "@/components/ui/image"; import { Text } from "@/components/ui/text"; import { VStack } from "@/components/ui/vstack"; import { Avatar, AvatarImage, AvatarFallbackText } from "@gluestack-ui/themed"; import { Ionicons } from "@expo/vector-icons"; import { ActivityIndicator, Dimensions, FlatList, View, TextInput, SafeAreaView, Alert, } from "react-native"; import { useEffect, useState, useRef } from "react"; import { useNoticesStore } from "@/store/noticesStore"; import { useWishlist } from "@/store/wishlistStore"; import { Pressable, ScrollView } from "react-native"; import { getUserById } from "@/api/client"; import * as ScreenOrientation from "expo-screen-orientation"; import { useAuthStore } from "@/store/authStore"; import { sendEmail } from "@/api/email"; export default function NoticeDetails() { const { id } = useLocalSearchParams(); const [images, setImages] = useState([]); const [isImageLoading, setIsImageLoading] = useState(true); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [notice, setNotice] = useState(null); const [user, setUser] = useState(null); const [isUserLoading, setIsUserLoading] = useState(true); const [isLandscape, setIsLandscape] = useState(false); const flatListRef = useRef(null); const [currentIndex, setCurrentIndex] = useState(0); const [isMessageFormVisible, setIsMessageFormVisible] = useState(false); const [message, setMessage] = useState(""); const [isSending, setIsSending] = useState(false); const handleSendMessage = async () => { setIsSending(true); console.log("Rozpoczynanie procesu wysyłania wiadomości..."); const { user_id, token } = useAuthStore.getState(); console.log("Dane z authStore:", { user_id, token }); if (!user_id || !token) { console.error("Brak danych zalogowanego użytkownika."); Alert.alert("Błąd", "Zaloguj się, aby wysłać wiadomość."); setIsSending(false); return; } let currentUserEmail = ""; try { console.log(`Pobieranie danych użytkownika dla user_id: ${user_id}`); const currentUser = await getUserById(user_id); console.log("Dane zalogowanego użytkownika:", currentUser); currentUserEmail = currentUser?.email; if (!currentUserEmail) { console.error("Nie znaleziono adresu email zalogowanego użytkownika."); Alert.alert("Błąd", "Nie znaleziono adresu email zalogowanego użytkownika."); setIsSending(false); return; } console.log(`Pobrano email zalogowanego użytkownika: ${currentUserEmail}`); } catch (error) { console.error("Błąd podczas pobierania danych użytkownika:", error); Alert.alert("Błąd", "Nie udało się pobrać danych użytkownika. Spróbuj ponownie później."); setIsSending(false); return; } const emailData = { to: user?.email || "", subject: `Zapytanie ${currentUserEmail} o ogłoszenie ${notice.title}`, body: message, }; console.log("Dane emaila do wysyłki:", emailData); if (!emailData.to || !emailData.subject || !emailData.body) { console.error("Walidacja nieudana: brakujące pola w emailData."); Alert.alert("Błąd", "Wszystkie pola są wymagane!"); setIsSending(false); return; } const result = await sendEmail(emailData); if (result.success) { console.log("Wiadomość wysłana pomyślnie!", result.result); setIsMessageFormVisible(false); setMessage(""); Alert.alert("Sukces", "Wiadomość została wysłana!"); } else { console.error("Błąd podczas wysyłania wiadomości:", result.error); Alert.alert("Błąd", `Nie udało się wysłać wiadomości: ${result.error}`); } setIsSending(false); console.log("Zakończono proces wysyłania wiadomości."); }; const formatDate = (dateString) => { const date = new Date(dateString); return date.toLocaleDateString("pl-PL", { year: "numeric", month: "2-digit", day: "2-digit", }); }; const { getNoticeById, getAllImagesByNoticeId } = useNoticesStore(); const toggleNoticeInWishlist = useWishlist( (state) => state.toggleNoticeInWishlist ); const isInWishlist = useWishlist((state) => id ? state.wishlistNotices.some((item) => item.noticeId == id) : false ); const onViewableItemsChanged = useRef(({ viewableItems }) => { if (viewableItems.length > 0) { setCurrentIndex(viewableItems[0].index); } const viewabilityConfig = useRef({ itemVisiblePercentThreshold: 70, }).current; useEffect(() => { const unlockOrientation = async () => { try { await ScreenOrientation.unlockAsync(); } catch (err) { console.error("Error unlocking orientation:", err); } }; const getInitialOrientation = async () => { try { const orientation = await ScreenOrientation.getOrientationAsync(); setIsLandscape( orientation === ScreenOrientation.Orientation.LANDSCAPE_LEFT || orientation === ScreenOrientation.Orientation.LANDSCAPE_RIGHT ); } catch (err) { console.error("Error getting initial orientation:", err); } }; unlockOrientation(); getInitialOrientation(); const subscription = ScreenOrientation.addOrientationChangeListener( ({ orientationInfo }) => { const isLandscapeMode = orientationInfo.orientation === ScreenOrientation.Orientation.LANDSCAPE_LEFT || orientationInfo.orientation === ScreenOrientation.Orientation.LANDSCAPE_RIGHT; setIsLandscape(isLandscapeMode); } ); return () => { ScreenOrientation.removeOrientationChangeListener(subscription); ScreenOrientation.lockAsync( ScreenOrientation.OrientationLock.PORTRAIT_UP ).catch((err) => console.error("Error locking orientation on unmount:", err) ); }; }, []); useEffect(() => { const fetchNotice = async () => { setIsLoading(true); try { const noticeData = getNoticeById(Number(id)); if (noticeData) { setNotice(noticeData); setError(null); } else { setError(new Error(`Notice with ID ${id} not found.`)); } } catch (err) { setError(err); } finally { setIsLoading(false); } }; fetchNotice(); }, [id]); useEffect(() => { const fetchImage = async () => { setIsImageLoading(true); if (notice) { try { const fetchedImages = await getAllImagesByNoticeId(notice.noticeId); console.log("Fetched images:", fetchedImages); setImages( fetchedImages && fetchedImages.length > 0 ? fetchedImages : ["https://http.cat/404.jpg"] ); } catch (err) { console.error("Error while loading images:", err); setImages(["https://http.cat/404.jpg"]); } finally { setIsImageLoading(false); } } }; if (notice) { fetchImage(); } if (!notice) { return Nie znaleziono ogłoszenia; } fetchUser(); }, [notice]); if (isLoading) { return ; } if (error) { return Błąd, spróbuj ponownie później: {error.message}; } if (!notice) { return Nie znaleziono ogłoszenia; } const renderImageSection = () => { if (isImageLoading) { return ( ); } return ( ( {`Zdjęcie console.error("Image load error:", e.nativeEvent.error)} /> )} keyExtractor={(item, index) => index.toString()} /> {images.length > 1 && ( {images.map((_, index) => ( ))} )} ); }; return ( {renderImageSection()} {formatDate(notice.publishDate)} {notice.title} Cena: {notice.price} zł { toggleNoticeInWishlist(id); }} > Kategoria:{" "} {notice.category} Opis ogłoszenia {notice.description} Użytkownik: {isUserLoading ? ( ) : user ? ( <> {user.firstName?.[0]} {user.lastName?.[0]} {user.firstName} {user.lastName} Email: {user.email} setIsMessageFormVisible(true)} className="mt-3 bg-blue-500 py-2 px-4 rounded-md" > Wyślij wiadomość Zobacz więcej ogłoszeń od {user.firstName} ) : ( Błąd podczas ładowania danych użytkownika )} {isMessageFormVisible && ( Wyślij wiadomość do {user?.firstName} Do: {user?.email || "Brak adresu e-mail"} Temat: Zapytanie o ogłoszenie '{notice.title || "Brak nazwy ogłoszenia"}' Treść: setIsMessageFormVisible(false)} className="bg-gray-300 py-2 px-4 rounded-md" > Anuluj {isSending ? ( ) : ( Wyślij )} )} ); }