import React, { useCallback, useState, useEffect, useRef } from 'react'; import { View, Text, StyleSheet, FlatList, TouchableOpacity, Image, BackHandler, Modal } from 'react-native'; import { useDispatch, useSelector } from 'react-redux'; import ScannedDataBox from '../components/ScannedDataBox'; import { Ionicons } from '@expo/vector-icons'; import { RootState, AppDispatch } from '../store'; import { QRCodeType } from '../types'; import { toggleBookmark, deleteQRCode, setScannedHistories } from '../reducers/qrCodesReducer'; import useFetchUserAttributes from '../hooks/useFetchUserAttributes'; import { getScannedHistories } from '../api/qrCodeAPI'; const HistoryScreen: React.FC = () => { const dispatch = useDispatch(); const histories = useSelector((state: RootState) => state.qrCodes.histories); const { userAttributes } = useFetchUserAttributes(); const [showBookmarks, setShowBookmarks] = useState(false); const [qrCodeToDelete, setQrCodeToDelete] = useState(null); const [isModalVisible, setIsModalVisible] = useState(false); const [historiesLoading, setHistoriesLoading] = useState(false); const [historiesError, setHistoriesError] = useState(null); const fetchHistories = useCallback(async () => { if (!userAttributes?.sub) return; try { setHistoriesLoading(true); const historiesData = await getScannedHistories(); dispatch(setScannedHistories(historiesData)); setHistoriesLoading(false); } catch (error: any) { setHistoriesError(error.message); } finally { setHistoriesLoading(false); } }, [userAttributes?.sub, dispatch]); useEffect(() => { if (userAttributes?.sub) { fetchHistories(); } }, [userAttributes?.sub, fetchHistories]); const handleDelete = useCallback((qrCodeId: string) => { if (userAttributes?.sub) { dispatch(deleteQRCode({ userId: userAttributes.sub, qrCodeId })); setIsModalVisible(false); } }, [dispatch, userAttributes]); const [selectedData, setSelectedData] = useState(null); const [selectedScanResult, setSelectedScanResult] = useState(null); const [selectedType, setSelectedType] = useState(null); useEffect(() => { const backAction = () => { if (selectedData) { setSelectedData(null); setSelectedScanResult(null); setSelectedType(null); return true; } return false; }; const backHandler = BackHandler.addEventListener('hardwareBackPress', backAction); return () => backHandler.remove(); }, [selectedData]); const filteredQrCodes = showBookmarks ? histories.filter(qr => qr.bookmarked) : histories; const handleItemPress = (item: QRCodeType) => { // setSelectedData(item.data); // setSelectedScanResult(item.scanResult); // setSelectedType(item.type); //setSelectedData(item.contents); setSelectedType(item.data.type); console.log('Selected QR code data:', item); // console.log('Selected QR code type:', item.type); }; const clearSelectedData = () => { setSelectedData(null); setSelectedScanResult(null); setSelectedType(null); }; return ( {/* Header for toggling between History and Bookmarks */} { setShowBookmarks(false); clearSelectedData(); }}> History { setShowBookmarks(true); clearSelectedData(); }}> Bookmarks {/* Display scanned data details */} {selectedData && ( )} {/* List of QR codes */} { // console.log('Rendering QR code item:', item); return ( handleItemPress(item)} style={styles.itemContent}> {item.data.contents} {new Date(item.data.createdAt).toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit'})} dispatch(toggleBookmark({ userId: userAttributes.sub, qrCode: item}))}> { setQrCodeToDelete(item.data.id); setIsModalVisible(true); }}> ); }} keyExtractor={(item, index) => { //console.log(item, index); return index.toString(); }} contentContainerStyle={styles.flatListContent} /> {/* Modal for delete confirmation */} setIsModalVisible(false)} > Are you sure? If bookmarked, this will be removed from both History and Bookmarks. handleDelete(qrCodeToDelete!)}> Yes, Delete setIsModalVisible(false)}> No, Keep It ); }; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#f8f0fc', padding: 20, }, headerContainer: { flexDirection: 'row', justifyContent: 'space-around', marginBottom: 20, }, headerTextActive: { fontSize: 24, fontWeight: 'bold', color: '#ff69b4', }, headerTextInactive: { fontSize: 24, fontWeight: 'bold', color: '#ccc', }, itemContainer: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#ffe6f0', padding: 10, borderRadius: 10, marginBottom: 10, }, itemLeft: { flex: 1, marginRight: 2, }, itemContent: { flexDirection: 'row', alignItems: 'center', }, itemRight: { flexDirection: 'row', alignItems: 'center', }, textContainer: { flex: 1, marginLeft: 0, }, dataText: { fontSize: 12, color: '#000', marginBottom: 7 }, dateText: { fontSize: 12, color: '#666', marginLeft: 10, flex: 1 }, scanIcon: { width: 40, height: 40, }, flatListContent: { paddingBottom: 100, }, modalContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: 'rgba(0, 0, 0, 0.5)', }, modalContent: { width: '80%', backgroundColor: 'white', borderRadius: 10, padding: 20, alignItems: 'center', }, modalTitle: { fontSize: 20, fontWeight: 'bold', marginBottom: 10, }, modalText: { fontSize: 16, marginBottom: 20, textAlign: 'center', }, modalButtons: { flexDirection: 'row', justifyContent: 'space-between', width: '100%', }, modalButton: { flex: 1, alignItems: 'center', padding: 10, }, modalButtonText: { fontSize: 16, color: '#000', }, scannedDataBoxContainer: { marginBottom: 20, }, }); export default HistoryScreen;