Темный режим

7.3. Survey - Модули

Основные модули приложения

Приложение Survey состоит из нескольких функциональных модулей, каждый из которых отвечает за определенную часть функциональности. Ниже приведено описание основных модулей.

Модуль SurveyCard

Модуль SurveyCard - это основной компонент опроса, который отображает текущий вопрос и управляет навигацией по опросу.

Файл: src/components/SurveyCard.tsx

Функциональность:

  • Отображение вопроса и интерфейса для ответа
  • Навигация между вопросами (вперед/назад)
  • Сохранение ответов
  • Отслеживание прогресса прохождения опроса
Пример кода SurveyCard

import React, { useState } from 'react';
import Header from './Header';
import QuestionInterface from './QuestionInterface';
import NavigationControls from './NavigationControls';
import './SurveyCard.css';

interface SurveyCardProps {
  title: string;
  currentQuestion: any;
  totalQuestions: number;
  currentQuestionIndex: number;
  onNext: () => void;
  onPrev: () => void;
  onAnswerChange: (questionId: string, value: any) => void;
  answers: Record<string, any>;
  companyName?: string;
}

const SurveyCard: React.FC<SurveyCardProps> = ({
  title,
  currentQuestion,
  totalQuestions,
  currentQuestionIndex,
  onNext,
  onPrev,
  onAnswerChange,
  answers,
  companyName
}) => {
  // Проверяем, есть ли ответ на текущий вопрос
  const hasAnswer = currentQuestion && answers[currentQuestion.questionId] !== undefined;
  
  return (
    
{currentQuestion && ( onAnswerChange(currentQuestion.questionId, value)} value={answers[currentQuestion.questionId]} /> )} 0} isLastQuestion={currentQuestionIndex === totalQuestions - 1} />
); }; export default SurveyCard;

Модуль QuestionInterface

Модуль QuestionInterface отвечает за отображение вопроса и соответствующего интерфейса для ответа.

Файл: src/components/QuestionInterface.tsx

Функциональность:

  • Отображение текста вопроса
  • Выбор и отображение соответствующего интерфейса для ответа (радио, шкала, текст и т.д.)
  • Передача значения ответа в родительский компонент
Пример кода QuestionInterface

import React from 'react';
import Radio5pt from './answer-interfaces/radio-5pt/Radio5pt';
import Stars5pt from './answer-interfaces/stars-5pt/Stars5pt';
import Scale11pt from './answer-interfaces/scale-11pt/Scale11pt';
import Slider11pt from './answer-interfaces/slider-11pt/Slider11pt';
import Text from './answer-interfaces/text/Text';
import Pictures4pt from './answer-interfaces/pictures-4pt/Pictures4pt';
import './QuestionInterface.css';

interface QuestionInterfaceProps {
  question: any;
  onChange: (value: any) => void;
  value: any;
}

const QuestionInterface: React.FC<QuestionInterfaceProps> = ({
  question,
  onChange,
  value
}) => {
  // Выбор компонента интерфейса ответа в зависимости от типа вопроса
  const renderAnswerInterface = () => {
    switch (question.type) {
      case 'radio-5pt':
        return (
          
        );
      case 'stars-5pt':
        return (
          
        );
      case 'scale-11pt':
        return (
          
        );
      case 'slider-11pt':
        return (
          
        );
      case 'text':
        return (
          
        );
      case 'pictures-4pt':
        return (
          
        );
      default:
        return null;
    }
  };
  
  return (
    
{question.question}
{question.hint && (
{question.hint}
)}
{renderAnswerInterface()}
); }; export default QuestionInterface;

Модуль NavigationControls

Модуль NavigationControls отвечает за управление навигацией по опросу.

Файл: src/components/NavigationControls.tsx

Функциональность:

  • Кнопки для перехода к следующему/предыдущему вопросу
  • Кнопка для завершения опроса (на последнем вопросе)
  • Управление состоянием доступности кнопок
Пример кода NavigationControls

import React from 'react';
import './NavigationControls.css';

interface NavigationControlsProps {
  onNext: () => void;
  onPrev: () => void;
  canGoNext: boolean;
  canGoPrev: boolean;
  isLastQuestion: boolean;
}

const NavigationControls: React.FC<NavigationControlsProps> = ({
  onNext,
  onPrev,
  canGoNext,
  canGoPrev,
  isLastQuestion
}) => {
  return (
    
); }; export default NavigationControls;

Интерфейсы ответов

Модуль answer-interfaces содержит компоненты для различных типов ответов на вопросы.

Папка: src/components/answer-interfaces/

Доступные интерфейсы ответов:

  • radio-5pt - 5-балльная шкала с радиокнопками
  • stars-5pt - 5-балльная шкала с звездами
  • scale-11pt - 11-балльная шкала (от 0 до 10)
  • slider-11pt - 11-балльная шкала с ползунком
  • text - текстовое поле для ввода ответа
  • pictures-4pt - выбор одного изображения из четырех
Пример кода интерфейса ответа (Stars5pt)

import React from 'react';
import './Stars5pt.css';

interface Stars5ptProps {
  value: number | null;
  onChange: (value: number) => void;
}

const Stars5pt: React.FC<Stars5ptProps> = ({ value, onChange }) => {
  const handleClick = (rating: number) => {
    onChange(rating);
  };
  
  return (
    
{[1, 2, 3, 4, 5].map((rating) => (
handleClick(rating)} > ★
))}
); }; export default Stars5pt;

Модуль SurveyCompleted

Модуль SurveyCompleted отображает экран завершения опроса после успешного прохождения всех вопросов.

Файл: src/components/SurveyCompleted.tsx

Функциональность:

  • Отображение сообщения о завершении опроса
  • Благодарность за участие
  • Информация о компании
Пример кода SurveyCompleted

import React from 'react';
import Logo from './Logo';
import './SurveyCompleted.css';

interface SurveyCompletedProps {
  companyName?: string;
}

const SurveyCompleted: React.FC<SurveyCompletedProps> = ({ companyName }) => {
  return (
    

Опрос завершен

Благодарим вас за участие в опросе!{companyName && ` Компания ${companyName} ценит ваше мнение и использует его для улучшения рабочей среды.`}

); }; export default SurveyCompleted;

Модуль PreparationSteps

Модуль PreparationSteps отображает инструкции по подготовке к опросу перед его началом.

Файл: src/components/PreparationSteps.tsx

Функциональность:

  • Отображение инструкций по подготовке к опросу
  • Кнопка для начала опроса
Пример кода PreparationSteps

import React from 'react';
import Logo from './Logo';
import './PreparationSteps.css';

interface PreparationStepsProps {
  onStart: () => void;
  companyName?: string;
}

const PreparationSteps: React.FC<PreparationStepsProps> = ({ onStart, companyName }) => {
  return (
    

Подготовка к опросу

1

Найдите тихое место

Убедитесь, что вас ничто не отвлекает во время прохождения опроса.

2

Подготовьте нужную информацию

Возможно, вам потребуется вспомнить некоторые события или факты.

3

Будьте честны

Ваши ответы анонимны и помогут {companyName || 'компании'} стать лучше.

); }; export default PreparationSteps;

Модуль DifficultyModal

Модуль DifficultyModal отображает модальное окно для выбора уровня сложности опроса.

Файл: src/components/DifficultyModal.tsx

Функциональность:

  • Отображение модального окна для выбора сложности
  • Обработка выбора пользователя
Пример кода DifficultyModal

import React from 'react';
import './DifficultyModal.css';

interface DifficultyModalProps {
  isOpen: boolean;
  onClose: () => void;
  onSelectDifficulty: (difficulty: string) => void;
}

const DifficultyModal: React.FC<DifficultyModalProps> = ({
  isOpen,
  onClose,
  onSelectDifficulty
}) => {
  if (!isOpen) return null;
  
  return (
    

Выберите уровень сложности

); }; export default DifficultyModal;
```