From 871225ea3a1ead8252b6f1404b75acc1c7169431 Mon Sep 17 00:00:00 2001 From: Patryk Date: Tue, 10 Jun 2025 00:35:28 +0200 Subject: [PATCH] fix notice page --- ArtisanConnect/app/notice/[id].jsx | 155 ++++++++++++++++++++++++++--- 1 file changed, 140 insertions(+), 15 deletions(-) diff --git a/ArtisanConnect/app/notice/[id].jsx b/ArtisanConnect/app/notice/[id].jsx index 31f5fde..537adf2 100644 --- a/ArtisanConnect/app/notice/[id].jsx +++ b/ArtisanConnect/app/notice/[id].jsx @@ -7,20 +7,28 @@ import { Image } from "@/components/ui/image"; import { Text } from "@/components/ui/text"; import { VStack } from "@/components/ui/vstack"; import { Ionicons } from "@expo/vector-icons"; +import { + Avatar, + AvatarImage, + AvatarFallbackText, +} from "@/components/ui/avatar"; 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"; - -const { width } = Dimensions.get("window"); +import * as ScreenOrientation from "expo-screen-orientation"; +import { useAuthStore } from "@/store/authStore"; +import { sendEmail } from "@/api/email"; export default function NoticeDetails() { const { id } = useLocalSearchParams(); @@ -31,20 +39,85 @@ export default function NoticeDetails() { 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 [Email, setEmail] = useState(""); - const handleSendMessage = () => { - console.log("Wiadomość do:", user?.email); - console.log("Email nadawcy:", Email); - console.log("Treść:", message); + const [isSending, setIsSending] = useState(false); - setIsMessageFormVisible(false); - setMessage(""); - setEmail(""); + 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) => { @@ -74,6 +147,51 @@ export default function NoticeDetails() { 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); @@ -167,7 +285,6 @@ export default function NoticeDetails() { ref={flatListRef} data={images} horizontal - snapToInterval={width} snapToAlignment="start" decelerationRate="fast" showsHorizontalScrollIndicator={false} @@ -175,12 +292,15 @@ export default function NoticeDetails() { onViewableItemsChanged={onViewableItemsChanged} viewabilityConfig={viewabilityConfig} renderItem={({ item, index }) => ( - + {`Zdjęcie )} @@ -376,9 +496,14 @@ export default function NoticeDetails() { - Wyślij + {isSending ? ( + + ) : ( + Wyślij + )}