import React, { useState, useEffect, useCallback } from 'react'; import { Building2, Star, MessageSquare, CheckCircle2, X, Lock } from 'lucide-react'; import { apiClient, getAuthToken, setAuthToken, fetchGuestToken } from '../../services/apiClient'; import { NPSSurvey } from '../../types'; interface NPSSurveyPageProps { surveyId: string | number; apartment?: string; // Номер квартиры из параметров URL } // Используем тип из types.ts export const NPSSurveyPage: React.FC = ({ surveyId, apartment: apartmentProp }) => { const [survey, setSurvey] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isAuthorized, setIsAuthorized] = useState(false); const [accessKeyInput, setAccessKeyInput] = useState(''); const [score, setScore] = useState(null); const [comment, setComment] = useState(''); const [respondentName, setRespondentName] = useState(''); const [apartment, setApartment] = useState(apartmentProp || ''); const [isSubmitting, setIsSubmitting] = useState(false); const [isSubmitted, setIsSubmitted] = useState(false); // Получаем номер квартиры из URL параметров, если не передан в пропсах useEffect(() => { if (!apartmentProp) { const urlParams = new URLSearchParams(window.location.search); const apartmentFromUrl = urlParams.get('apartment'); if (apartmentFromUrl) { setApartment(apartmentFromUrl); } } }, [apartmentProp]); const loadSurvey = useCallback(async () => { if (!surveyId) { console.error('Survey ID is missing'); setIsLoading(false); return; } try { setIsLoading(true); // Гость без учётки: если нет токена — получаем гостевой (доступ к опросам) if (!getAuthToken()) { try { const guestToken = await fetchGuestToken(); setAuthToken(guestToken); } catch (e) { console.error('Failed to get guest token:', e); } } console.log(`Loading survey with ID: ${surveyId}`); const data = await apiClient.get(`/pr/nps-surveys/${surveyId}`); console.log('Survey loaded:', data); setSurvey(data); } catch (err: any) { console.error('Error loading survey:', err); const errorMessage = err.response?.data?.error || err.message || 'Неизвестная ошибка'; console.error(`Failed to load survey ${surveyId}:`, errorMessage); // Не показываем alert сразу - покажем ошибку в UI setSurvey(null); } finally { // Гарантированно устанавливаем isLoading в false setIsLoading(false); } }, [surveyId]); useEffect(() => { if (surveyId) { loadSurvey(); } }, [surveyId, loadSurvey]); useEffect(() => { if (survey) { // Проверяем ключ из URL const urlParams = new URLSearchParams(window.location.search); const keyFromUrl = urlParams.get('key'); if (keyFromUrl === survey.accessKey) { setIsAuthorized(true); } else if (!keyFromUrl) { // Если ключа нет в URL, но опрос загружен - показываем форму ввода setIsAuthorized(false); } else { // Неверный ключ setIsAuthorized(false); } } }, [survey]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (score === null) { alert('Пожалуйста, выберите оценку'); return; } try { setIsSubmitting(true); await apiClient.post(`/pr/nps-surveys/${surveyId}/responses`, { score, comment: comment || null, respondent_name: respondentName || null, apartment: apartment || null, access_key: survey?.accessKey }); setIsSubmitted(true); } catch (err: any) { console.error('Error submitting response:', err); const errorMessage = err.response?.data?.error || err.message || 'Неизвестная ошибка'; alert(`Ошибка отправки ответа: ${errorMessage}`); } finally { setIsSubmitting(false); } }; // Форма ввода ключа доступа if (!isAuthorized && survey) { return (

Доступ к опросу

Введите ключ доступа для участия в опросе

setAccessKeyInput(e.target.value)} placeholder="Введите ключ доступа" className="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl text-sm focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-transparent" onKeyPress={(e) => { if (e.key === 'Enter' && survey && accessKeyInput === survey.accessKey) { setIsAuthorized(true); const url = new URL(window.location.href); url.searchParams.set('key', accessKeyInput); window.history.pushState({}, '', url.toString()); } }} />
); } // Страница благодарности после отправки if (isSubmitted) { return (

Спасибо за ваш отзыв!

Ваше мнение очень важно для нас. Мы используем ваши ответы для улучшения качества обслуживания.

Ваш ответ сохранен анонимно

); } // Основная страница опроса if (isLoading) { return (

Загрузка опроса...

); } // Если опрос не загружен и не загружается - показываем ошибку if (!survey) { return (

Ошибка загрузки опроса

Не удалось загрузить опрос. Проверьте правильность ссылки или обратитесь к администратору.

ID опроса: {surveyId}

); } return (
{/* Header */}

{survey.title}

{survey.description && (

{survey.description}

)}
{survey.address && (

📍 {survey.address}

)} {apartment && (

Квартира №{apartment}

)}
{/* Опрос */}
{/* Оценка от 0 до 10 */}
{[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((num) => ( ))}
Точно нет Нейтрально Определенно да
{/* Дополнительная информация */}