"use client"; import React, { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { FaBell, FaUser } from "react-icons/fa"; import TabBar from "../components/TabBar"; const API_BASE = process.env.NEXT_PUBLIC_API_BASE_URL; const CreateRequestPage = () => { const router = useRouter(); const [title, setTitle] = useState(""); const [date, setDate] = useState(""); // desired_completion_date const [time, setTime] = useState(""); const [description, setDescription] = useState(""); const [note, setNote] = useState(""); // contact_notes const [address, setAddress] = useState(""); const [city, setCity] = useState(""); const [phone, setPhone] = useState(""); const [urgency, setUrgency] = useState("medium"); const [latitude, setLatitude] = useState(""); const [longitude, setLongitude] = useState(""); const [geoError, setGeoError] = useState(""); const [error, setError] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); const [userName, setUserName] = useState("Пользователь"); const [profileError, setProfileError] = useState(""); const isFormValid = title && date && time && description && address && city && urgency && latitude && longitude; // профиль useEffect(() => { const fetchProfile = async () => { if (!API_BASE) return; const saved = typeof window !== "undefined" ? localStorage.getItem("authUser") : null; const authUser = saved ? JSON.parse(saved) : null; const accessToken = authUser?.accessToken; if (!accessToken) return; try { const res = await fetch(`${API_BASE}/users/me`, { headers: { Accept: "application/json", Authorization: `Bearer ${accessToken}`, }, }); if (!res.ok) { setProfileError("Не удалось загрузить профиль"); return; } const data = await res.json(); const fullName = [data.first_name, data.last_name] .filter(Boolean) .join(" ") .trim() || data.email; setUserName(fullName); } catch (e) { setProfileError("Ошибка загрузки профиля"); } }; fetchProfile(); }, []); useEffect(() => { if (!("geolocation" in navigator)) { setGeoError("Геолокация не поддерживается браузером"); return; } navigator.geolocation.getCurrentPosition( (pos) => { const { latitude, longitude } = pos.coords; setLatitude(latitude.toFixed(6)); setLongitude(longitude.toFixed(6)); setGeoError(""); }, (err) => { console.error("Geolocation error:", err); setGeoError("Не удалось получить геолокацию, введите координаты вручную"); }, { enableHighAccuracy: true, timeout: 10000, maximumAge: 60000, } ); }, []); const handleSubmit = async (e) => { e.preventDefault(); if (!isFormValid || !API_BASE) return; try { setError(""); setIsSubmitting(true); const saved = typeof window !== "undefined" ? localStorage.getItem("authUser") : null; const authUser = saved ? JSON.parse(saved) : null; const accessToken = authUser?.accessToken; if (!accessToken) { setError("Вы не авторизованы"); setIsSubmitting(false); return; } const desiredDateTime = new Date(`${date}T${time}:00`); const desired_completion_date = desiredDateTime.toISOString(); const body = { request_type_id: 1, // можно потом вынести в селект title, description, latitude: Number(latitude), longitude: Number(longitude), address, city, desired_completion_date, urgency, // low | medium | high | urgent contact_phone: phone || null, contact_notes: note || null, }; const res = await fetch(`${API_BASE}/requests`, { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json", Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify(body), }); if (!res.ok) { let msg = "Ошибка при создании заявки"; try { const data = await res.json(); if (data.error) msg = data.error; } catch { const text = await res.text(); if (text) msg = text; } setError(msg); setIsSubmitting(false); return; } const created = await res.json(); console.log("Заявка создана:", created); router.push("/home"); } catch (err) { setError(err.message || "Ошибка сети"); setIsSubmitting(false); } }; return (
{userName}
{profileError && ({profileError}
)}