"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; const getAccessToken = () => { if (typeof window === "undefined") return null; const saved = localStorage.getItem("authUser"); const authUser = saved ? JSON.parse(saved) : null; return authUser?.accessToken || null; }; // профиль + автоподстановка адреса/города/телефона useEffect(() => { const fetchProfile = async () => { if (!API_BASE) return; const accessToken = getAccessToken(); 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(); // UserProfile const fullName = [data.first_name, data.last_name].filter(Boolean).join(" ").trim() || data.email; setUserName(fullName); // подставляем только если поля ещё пустые, чтобы не перетирать ручной ввод if (!address && data.address) { setAddress(data.address); } if (!city && data.city) { setCity(data.city); } if (!phone && data.phone) { setPhone(data.phone); } } catch (e) { setProfileError("Ошибка загрузки профиля"); } }; fetchProfile(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // однократно при монтировании // геолокация useEffect(() => { if (typeof navigator === "undefined" || !("geolocation" in navigator)) { setGeoError("Геолокация не поддерживается браузером"); return; } navigator.geolocation.getCurrentPosition( (pos) => { const { latitude: lat, longitude: lon } = pos.coords; setLatitude(lat.toFixed(6)); setLongitude(lon.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 accessToken = getAccessToken(); 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, // TODO: вынести в селект типов 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 (
{/* Header */}

{userName}

{profileError && (

{profileError}

)}

Создать заявку

{/* Ошибка */} {error && (
{error}
)} {/* Карточка с формой */}
{/* Что сделать */}
setTitle(e.target.value)} className="w-full bg-[#72B8E2] rounded-lg px-3 py-3 text-sm font-montserrat text-white placeholder:text-white/70 outline-none focus:ring-2 focus:ring-blue-200" placeholder="Опишите основную задачу" />
{/* Адрес */}
setAddress(e.target.value)} className="w-full bg-[#72B8E2] rounded-lg px-3 py-3 text-sm font-montserrat text-white placeholder:text-white/70 outline-none focus:ring-2 focus:ring-blue-200" placeholder="ул. Ленина, д. 10, кв. 5" />
{/* Город */}
setCity(e.target.value)} className="w-full bg-[#72B8E2] rounded-lg px-3 py-3 text-sm font-montserrat text-white placeholder:text-white/70 outline-none focus:ring-2 focus:ring-blue-200" placeholder="Например: Пермь" />
{/* Координаты */}
setLatitude(e.target.value)} className="w-full bg-[#72B8E2] rounded-lg px-3 py-3 text-sm font-montserrat text-white placeholder:text-white/70 outline-none focus:ring-2 focus:ring-blue-200" placeholder="55.751244" />
setLongitude(e.target.value)} className="w-full bg-[#72B8E2] rounded-lg px-3 py-3 text-sm font-montserrat text-white placeholder:text-white/70 outline-none focus:ring-2 focus:ring-blue-200" placeholder="37.618423" />
{geoError && (

{geoError}

)} {/* Дата и Время */}
setDate(e.target.value)} className="w-full bg-[#72B8E2] rounded-lg px-3 py-3 text-sm font-montserrat text-white outline-none focus:ring-2 focus:ring-blue-200" />
setTime(e.target.value)} className="w-full bg-[#72B8E2] rounded-lg px-3 py-3 text-sm font-montserrat text-white outline-none focus:ring-2 focus:ring-blue-200" />
{/* Срочность */}
{/* Телефон для связи */}
setPhone(e.target.value)} className="w-full bg-[#72B8E2] rounded-lg px-3 py-3 text-sm font-montserrat text-white placeholder:text-white/70 outline-none focus:ring-2 focus:ring-blue-200" placeholder="+7 900 000 00 00" />
{/* Описание */}