From 1a4d7477cb7dd02c03797600f8ee68a45a60d054 Mon Sep 17 00:00:00 2001 From: kazachilo Date: Fri, 21 Mar 2025 13:27:49 +0300 Subject: [PATCH] Add feedback form functionality --- src/assets/feedback250x.png | Bin 0 -> 23655 bytes src/assets/index.ts | 2 + src/components/shared/FeedbackHandler.tsx | 58 ++++++ .../shared/FeedbackModal.module.css | 114 +++++++++++ src/components/shared/FeedbackModal.tsx | 190 ++++++++++++++++++ src/config/homeScreen.ts | 8 +- src/screens/Home.tsx | 22 +- src/services/feedbackService.ts | 75 +++++++ src/types/telegram-webapp.d.ts | 78 +++++++ 9 files changed, 542 insertions(+), 5 deletions(-) create mode 100644 src/assets/feedback250x.png create mode 100644 src/components/shared/FeedbackHandler.tsx create mode 100644 src/components/shared/FeedbackModal.module.css create mode 100644 src/components/shared/FeedbackModal.tsx create mode 100644 src/services/feedbackService.ts create mode 100644 src/types/telegram-webapp.d.ts diff --git a/src/assets/feedback250x.png b/src/assets/feedback250x.png new file mode 100644 index 0000000000000000000000000000000000000000..3e0f8fe27ea4c93ab41b3955b5f54a9bc6286d72 GIT binary patch literal 23655 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 void; +} + +interface FeedbackHandlerProps { + onFeedbackSent?: () => void; // Callback после успешной отправки +} + +const FeedbackHandler = forwardRef((props, ref) => { + const { onFeedbackSent } = props; + + // Состояние для модального окна обратной связи + const [isFeedbackModalVisible, setIsFeedbackModalVisible] = useState(false); + + // Экспортируем метод openFeedbackModal через ref + useImperativeHandle(ref, () => ({ + openFeedbackModal: () => { + setIsFeedbackModalVisible(true); + } + })); + + // Обработчик отправки формы обратной связи + const handleFeedbackSubmit = async (data: FeedbackData): Promise => { + try { + const result = await sendFeedback(data); + console.log('Результат отправки обратной связи:', result); + + // Вызываем callback после успешной отправки + if (result && onFeedbackSent) { + onFeedbackSent(); + } + + return result; + } catch (error) { + console.error('Ошибка при отправке обратной связи:', error); + return false; + } + }; + + return ( + <> + {/* Модальное окно обратной связи */} + setIsFeedbackModalVisible(false)} + onSubmit={handleFeedbackSubmit} + /> + + ); +}); + +export default FeedbackHandler; diff --git a/src/components/shared/FeedbackModal.module.css b/src/components/shared/FeedbackModal.module.css new file mode 100644 index 0000000..ba454ed --- /dev/null +++ b/src/components/shared/FeedbackModal.module.css @@ -0,0 +1,114 @@ +.textarea { + width: calc(100% - var(--spacing-small) * 2); + min-height: 100px; + margin-bottom: var(--spacing-medium); + padding: var(--spacing-small); + border: 1px solid var(--color-border); + border-radius: var(--border-radius); + resize: none; + font-family: inherit; + font-size: 14px; + box-sizing: border-box; +} + +.textarea:focus { + outline: none; + border-color: var(--color-primary); +} + +.imageUploadContainer { + margin-bottom: var(--spacing-medium); + width: 100%; + box-sizing: border-box; +} + +.addImageButton { + padding: var(--spacing-small) var(--spacing-medium); + background-color: var(--color-border); + border: none; + border-radius: var(--border-radius); + font-size: 14px; + cursor: pointer; + transition: background-color 0.2s; + width: auto; + max-width: 100%; + box-sizing: border-box; +} + +.addImageButton:hover { + background-color: #d0d0d0; +} + +.fileInput { + display: none; +} + +.imagePreviewContainer { + display: flex; + flex-wrap: wrap; + gap: var(--spacing-small); + margin-top: var(--spacing-small); + width: 100%; + box-sizing: border-box; +} + +.imagePreview { + position: relative; + width: 80px; + height: 80px; + border-radius: var(--border-radius); + overflow: hidden; +} + +.imagePreview img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.removeImageButton { + position: absolute; + top: 4px; + right: 4px; + width: 20px; + height: 20px; + border-radius: 50%; + background-color: rgba(0, 0, 0, 0.6); + color: white; + border: none; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + cursor: pointer; +} + +.errorMessage { + color: #e53935; + font-size: 14px; + margin-bottom: var(--spacing-medium); + padding: 8px; + background-color: rgba(229, 57, 53, 0.1); + border-radius: var(--border-radius); + text-align: center; +} + +/* Специальные стили для iOS */ +@supports (-webkit-touch-callout: none) { + .textarea { + -webkit-appearance: none; + -webkit-tap-highlight-color: transparent; + } + + /* Исправление для предотвращения проблем с прокруткой на iOS */ + .imagePreviewContainer { + -webkit-overflow-scrolling: touch; + } + + /* Дополнительные исправления для iOS */ + .modal { + width: calc(100% - var(--spacing-large) * 2); + margin: 0 var(--spacing-large); + max-width: 90vw; + } +} diff --git a/src/components/shared/FeedbackModal.tsx b/src/components/shared/FeedbackModal.tsx new file mode 100644 index 0000000..bdd3ffd --- /dev/null +++ b/src/components/shared/FeedbackModal.tsx @@ -0,0 +1,190 @@ +import React, { useState, useRef } from 'react'; +import styles from './NotificationModal.module.css'; // Используем существующие стили +import feedbackStyles from './FeedbackModal.module.css'; // Дополнительные стили для формы + +export interface FeedbackData { + text: string; + images: File[]; +} + +interface FeedbackModalProps { + isVisible: boolean; + onClose: () => void; + onSubmit: (data: FeedbackData) => Promise | boolean; +} + +const FeedbackModal: React.FC = ({ isVisible, onClose, onSubmit }) => { + const [text, setText] = useState(''); + const [images, setImages] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const textareaRef = useRef(null); + const fileInputRef = useRef(null); + + // Сброс формы при закрытии + const handleClose = () => { + setText(''); + setImages([]); + setError(null); + onClose(); + }; + + // Функция для сворачивания клавиатуры + const dismissKeyboard = () => { + if (textareaRef.current) { + textareaRef.current.blur(); + } + }; + + // Обработчик нажатия клавиш + const handleKeyDown = (e: React.KeyboardEvent) => { + // Если нажата клавиша Enter (или Done на iOS) + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); // Предотвращаем добавление новой строки + dismissKeyboard(); // Сворачиваем клавиатуру + } + }; + + // Обработчик добавления изображений + const handleFileChange = (e: React.ChangeEvent) => { + if (e.target.files && e.target.files.length > 0) { + const newFiles = Array.from(e.target.files); + setImages(prevImages => [...prevImages, ...newFiles]); + + // Сбрасываем значение input, чтобы можно было выбрать тот же файл повторно + e.target.value = ''; + } + }; + + // Обработчик удаления изображения + const handleRemoveImage = (index: number) => { + setImages(prevImages => prevImages.filter((_, i) => i !== index)); + }; + + // Обработчик отправки формы + const handleSubmit = async () => { + // Проверяем, что есть текст или изображения + if (!text.trim() && images.length === 0) { + setError('Пожалуйста, введите текст или добавьте изображение'); + return; + } + + try { + setIsLoading(true); + setError(null); + + const result = await onSubmit({ + text: text.trim(), + images + }); + + if (result) { + handleClose(); + } else { + setError('Не удалось отправить обратную связь. Пожалуйста, попробуйте позже.'); + } + } catch (err) { + console.error('Ошибка при отправке обратной связи:', err); + setError('Произошла ошибка при отправке. Пожалуйста, попробуйте позже.'); + } finally { + setIsLoading(false); + } + }; + + if (!isVisible) return null; + + return ( +
+
+
+
+ {isLoading && } + Обратная связь +
+
Расскажите нам о проблеме или предложении
+
+ + {/* Поле для ввода текста */} +