import React, { useCallback, useState, useEffect } from 'react'; import { View, Text, StyleSheet, FlatList, TouchableOpacity, Image, Modal, ActivityIndicator, Dimensions } 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 { width: screenWidth, height: screenHeight } = Dimensions.get('window'); 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 [selectedQrCodeId, setSelectedQrCodeId] = useState(null); const fetchHistories = useCallback(async () => { if (!userAttributes?.sub) return; try { setHistoriesLoading(true); const historiesData = await getScannedHistories(); dispatch(setScannedHistories(historiesData)); } 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 filteredQrCodes = showBookmarks ? histories.filter(qr => qr.bookmarked) : histories; const handleItemPress = (item: QRCodeType) => { setSelectedQrCodeId(item.data.id || null); }; const clearSelectedData = () => { setSelectedQrCodeId(null); }; return ( { setShowBookmarks(false); clearSelectedData(); }}> History { setShowBookmarks(true); clearSelectedData(); }}> Bookmarks {historiesLoading && } {!historiesLoading && filteredQrCodes.length === 0 && ( {showBookmarks ? 'No bookmarks available' : 'No history available'} )} {selectedQrCodeId && ( )} ( 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) => index.toString()} contentContainerStyle={styles.flatListContent} /> 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, paddingTop: screenHeight * 0.05, // Add padding from the top }, headerContainer: { flexDirection: 'row', justifyContent: 'space-around', marginBottom: 20, }, headerTextActive: { fontSize: screenWidth * 0.06, fontWeight: 'bold', color: '#ff69b4', }, headerTextInactive: { fontSize: screenWidth * 0.06, fontWeight: 'bold', color: '#ccc', }, itemContainer: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#ffe6f0', padding: screenWidth * 0.025, borderRadius: screenWidth * 0.025, marginBottom: screenWidth * 0.025, }, itemLeft: { flex: 1, marginRight: 2, }, itemContent: { flexDirection: 'row', alignItems: 'center', }, itemRight: { flexDirection: 'row', alignItems: 'center', }, textContainer: { flex: 1, marginLeft: 0, }, dataText: { fontSize: screenWidth * 0.03, color: '#000', marginBottom: screenWidth * 0.02, }, dateText: { fontSize: screenWidth * 0.03, color: '#666', marginLeft: screenWidth * 0.02, flex: 1, }, scanIcon: { width: screenWidth * 0.1, height: screenWidth * 0.1, }, flatListContent: { paddingBottom: screenHeight * 0.1, }, emptyMessage: { textAlign: 'center', fontSize: screenWidth * 0.04, color: '#ff69b4', marginVertical: screenHeight * 0.02, }, scannedDataBoxContainer: { marginBottom: screenHeight * 0.02, }, modalContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: 'rgba(0, 0, 0, 0.5)', }, modalContent: { width: '80%', backgroundColor: 'white', borderRadius: screenWidth * 0.025, padding: screenWidth * 0.05, alignItems: 'center', }, modalTitle: { fontSize: screenWidth * 0.05, fontWeight: 'bold', marginBottom: screenHeight * 0.01, }, modalText: { fontSize: screenWidth * 0.04, marginBottom: screenHeight * 0.02, textAlign: 'center', }, modalButtons: { flexDirection: 'row', justifyContent: 'space-between', width: '100%', }, modalButton: { flex: 1, alignItems: 'center', padding: screenWidth * 0.025, }, modalButtonText: { fontSize: screenWidth * 0.04, color: '#000', }, }); export default HistoryScreen;