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;