import React, { useState, useEffect } from 'react'; import { View, Text, TextInput, ScrollView, TouchableOpacity, Platform, Image, Modal, } from 'react-native'; import AsyncStorage from '@react-native-async-storage/async-storage'; import ModalSelector from 'react-native-modal-selector'; import MultiSelect from 'react-native-multiple-select'; import CustomHeader from '../../../components/CustomHeader'; import IMAGES from '../../../constants/Images'; import { GlobalTheme } from '../../../theme'; import CustomButton from '../../../components/CustomButton'; import { styles } from './style'; import { toastError, toastSuccess } from '../../../constants/Toast'; import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; import Icon from 'react-native-vector-icons/FontAwesome'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import mockDataFlat1 from './data.json'; import CustomCamera from '../../../components/CustomCamera'; import CustomModal from '../../../components/CustomModal'; import { SafeAreaView } from 'react-native-safe-area-context'; const transformSurveyData = (flatData) => { const grouped = {}; flatData?.forEach(item => { if (!grouped[item.QuestionId]) { grouped[item.QuestionId] = { QuestionId: item.QuestionId, Question: item.Question, QuestionType: item.QuestionTypeNew, QEnable: item.QEnable, EnableQuestion: item.EnableQuestion, DisableQuestion: item.DisableQuestion, QuestionSequence: item.QuestionSequence, CategorySequence: item.CategorySequence, Answers: [] }; } if (!['Number', 'Text', 'OnlyText'].includes(item.QuestionTypeNew)) { if (item.AnswerId || item.Answer) { grouped[item.QuestionId].Answers.push({ AnswerId: item.AnswerId, Answer: item.Answer }); } } }); return Object.values(grouped).sort((a, b) => a.QuestionSequence - b.QuestionSequence); }; const FeedbackFormScreen = ({ route, navigation }) => { const { CategoryId, SurveyId, CategoryName } = route.params || {}; const [questions, setQuestions] = useState([]); const [answers, setAnswers] = useState({}); const [enabledQuestions, setEnabledQuestions] = useState({}); const [showCamera, setShowCamera] = useState(false); const [activeCameraQId, setActiveCameraQId] = useState(null); // For modal const [showModal, setShowModal] = useState(false); const [selectedImg, setSelectedImg] = useState(null); const [reCapImgModalObj, setReCapImgModalObj] = useState({}); useEffect(() => { const filtered = mockDataFlat1?.mockDataFlat?.filter( item => item.CategoryId === CategoryId && item.SurveyId === SurveyId ); const transformed = transformSurveyData(filtered); setQuestions(transformed); const enableMap = {}; transformed.forEach(q => { enableMap[q.QuestionId] = q.QEnable; }); setEnabledQuestions(enableMap); loadSavedAnswers(); }, []); const loadSavedAnswers = async () => { try { const saved = await AsyncStorage.getItem('feedback_answers'); if (saved) setAnswers(JSON.parse(saved)); } catch (e) { console.warn('Failed to load saved answers'); } }; const saveAnswers = async () => { try { await AsyncStorage.setItem('feedback_answers', JSON.stringify(answers)); const completedRaw = await AsyncStorage.getItem('completed_categories'); let completed = completedRaw ? JSON.parse(completedRaw) : []; if (!completed.includes(CategoryId)) { completed.push(CategoryId); await AsyncStorage.setItem('completed_categories', JSON.stringify(completed)); } toastSuccess('Success', 'Answers Saved Successfully'); navigation.goBack(); } catch (e) { toastError('Error', 'Failed to save answers'); } }; const handleAnswerChange = (questionId, value, enableList = '', disableList = '') => { setAnswers(prev => ({ ...prev, [questionId]: value })); const updated = { ...enabledQuestions }; if (disableList) { disableList.split(',').forEach(id => { updated[parseInt(id)] = false; }); } if (enableList) { enableList.split(',').forEach(id => { updated[parseInt(id)] = true; }); } setEnabledQuestions(updated); }; const handleImageCaptured = (photo) => { if (activeCameraQId) { setAnswers(prev => ({ ...prev, [activeCameraQId]: photo.uri })); setSelectedImg(photo.uri); setShowModal(true); } setShowCamera(false); setActiveCameraQId(null); }; const openCamera = (questionId) => { setActiveCameraQId(questionId); setShowCamera(true); }; const _OpenCaptureImage_Modal = (imgUri) => { const isImageCap = imgUri !== '' && imgUri != null; let { cameraType } = reCapImgModalObj; return ( {isImageCap && ( { setShowModal(false); openCamera(activeCameraQId); }} > setShowModal(false)} style={{ paddingVertical: 10, paddingHorizontal: 30, backgroundColor: GlobalTheme.colors.primary, borderRadius: 6 }} > Close )} ); }; return ( navigation.goBack()} onRightPress={() => navigation.navigate('Dashboard')} /> {CategoryName} {questions.map((qtn) => { if (!enabledQuestions[qtn.QuestionId]) return null; return ( {qtn.Question} {qtn.QuestionType === 'Single choice list' && ( ({ key: ans.AnswerId, label: ans.Answer }))} initValue="Select one" onChange={option => { const selectedAnswer = option.label; // Look up the matching full answer entry from mockDataFlat1 const matchedRow = mockDataFlat1.mockDataFlat.find(item => item.QuestionId === qtn.QuestionId && item.Answer === selectedAnswer ); const enableQ = matchedRow?.EnableQuestion || ''; const disableQ = matchedRow?.DisableQuestion || ''; handleAnswerChange( qtn.QuestionId, selectedAnswer, enableQ, disableQ ); }} > {answers[qtn.QuestionId] || '---Select option---'} )} {qtn.QuestionType === 'Multi choice list' && ( handleAnswerChange( qtn.QuestionId, selected, qtn.EnableQuestion, qtn.DisableQuestion ) } selectedItems={answers[qtn.QuestionId] || []} selectText="Pick Items" searchInputPlaceholderText="Search Items..." searchIcon={} tagRemoveIconColor="#ccc" tagBorderColor="#ccc" tagTextColor="#000" selectedItemTextColor={GlobalTheme.colors.primary} selectedItemIconColor="#000" itemTextColor="#000" styleMainWrapper={styles.multiSelect} submitButtonText={'Submit'} textColor={GlobalTheme.colors.black} submitButtonColor={GlobalTheme.colors.secondary} styleItemsContainer={styles.styleItemsContainer} styleListContainer={styles.styleListContainer} styleInputGroup={styles.styleInputGroup} styleDropdownMenuSubsection={styles.styleDropdownMenuSubsection} styleDropdownMenu={styles.styleDropdownMenu} /> )} {(qtn.QuestionType === 'Text' || qtn.QuestionType === 'OnlyText' || qtn.QuestionType === 'Number') && ( handleAnswerChange(qtn.QuestionId, text)} returnKeyType={(Platform.OS === 'ios') ? 'done' : 'next'} /> )} {qtn.QuestionType === 'Image' && ( <> { if (answers[qtn.QuestionId]) { setSelectedImg(answers[qtn.QuestionId]); setReCapImgModalObj({ cameraType: '1' }); setActiveCameraQId(qtn.QuestionId); setShowModal(true); } else { openCamera(qtn.QuestionId); // if no image yet, open camera directly } }} > )} ); })} {showCamera && ( setShowCamera(false)} /> )} {/* Modal Preview with Retake */} {_OpenCaptureImage_Modal(selectedImg)} ); }; export default FeedbackFormScreen;