// app/add_review.tsx import React, { useState } from 'react'; import { View, Text, TextInput, Button, StyleSheet, ScrollView, Alert, TouchableOpacity, } from 'react-native'; import { Picker } from '@react-native-picker/picker'; // If you were using a picker import { useRouter, useLocalSearchParams } from 'expo-router'; // Import useRouter and useLocalSearchParams // Ensure interfaces match your PrayerSpacesListPage.tsx and backend expectations interface ReviewPayload { user: string; place: string; // Backend expects place NAME string for lookup quiet: number | null; clean: number | null; private: number | null; cleanWudu: number | null; childFriendly: number | null; safe: number | null; notes?: string; // Corresponds to comment in your frontend if added } interface AddReviewResponse { message: string; reviewId?: string; } const BACKEND_URL = 'http://132.145.65.145:8080'; // Your backend URL const HARDCODED_USERNAME = 'testuser'; // Hardcoded username string, matching your seed user // --- Emoji Rating Helpers (copied from PrayerSpacesListPage.tsx) --- // This ensures the new page has these functions available function averageRatingToEmoji(avg: number) { if (avg < 1.66) { return "😞"; } else if (avg < 2.33) { return "😐"; } else { return "😊"; } } interface EmojiRatingSelectorProps { label: string; value: number | null; onSelect: (value: number) => void; style?: object; } const EmojiRatingSelector: React.FC = ({ label, value, onSelect, style }) => { const emojis = [ { emoji: "😞", value: 1, label: "Poor" }, { emoji: "😐", value: 2, label: "Okay" }, { emoji: "😊", value: 3, label: "Great" } ]; return ( {label} {emojis.map((item) => ( onSelect(item.value)} > {item.emoji} {item.label} ))} ); }; // --- End Emoji Rating Helpers --- export default function AddReviewScreen() { const router = useRouter(); const params = useLocalSearchParams(); // Get params passed from navigation const placeName = typeof params.placeName === 'string' ? params.placeName : 'Unknown Place'; const placeId = typeof params.placeId === 'string' ? params.placeId : ''; // Place ID for potential future use or debugging const [quiet, setQuiet] = useState(null); const [clean, setClean] = useState(null); const [privacy, setPrivacy] = useState(null); const [cleanWudu, setCleanWudu] = useState(null); const [childFriendly, setChildFriendly] = useState(null); const [safe, setSafe] = useState(null); const [notes, setNotes] = useState(''); // Changed from comment to notes to match backend model name const isValidRating = (val: number | null): boolean => { return val !== null && val >= 1 && val <= 3; }; const handleSubmit = async () => { // Validate all rating fields if (!quiet || !clean || !privacy || !cleanWudu || !childFriendly || !safe) { Alert.alert('Missing Info', 'Please fill in all rating fields.'); return; } if (![quiet, clean, privacy, cleanWudu, childFriendly, safe].every(isValidRating)) { Alert.alert('Invalid Input', 'Please select a rating for each category (1-3).'); return; } // Prepare payload for backend - sending place NAME as string const payload: ReviewPayload = { user: HARDCODED_USERNAME, place: placeName, // IMPORTANT: Sending place NAME, not ID, as per your backend's SaveReview quiet: quiet, clean: clean, private: privacy, cleanWudu: cleanWudu, childFriendly: childFriendly, safe: safe, notes: notes, // Sending notes field }; console.log("Sending review payload from AddReviewScreen:", payload); try { const response = await fetch(`${BACKEND_URL}/reviews/new`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); if (!response.ok) { const errorData = await response.json().catch(() => ({ message: 'Unknown error' })); console.error("Backend error response:", errorData); throw new Error(errorData.message || `HTTP error! Status: ${response.status}`); } const data: AddReviewResponse = await response.json(); Alert.alert('Success', data.message || 'Review submitted!'); // Clear form and navigate back setQuiet(null); setClean(null); setPrivacy(null); setCleanWudu(null); setChildFriendly(null); setSafe(null); setNotes(''); // Clear notes field router.back(); // Go back to the previous screen (PrayerSpacesListPage) } catch (error: any) { Alert.alert('Error', `Could not send review: ${error.message || error}`); console.error("Review submission error:", error); } }; return ( Submit a Review For: {placeName} {/* Emoji Rating Selectors */} Your Comments (optional)