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;