// app/(tabs)/social/powr.tsx import React, { useState, useCallback, useEffect, useRef } from 'react'; import { View, FlatList, RefreshControl, TouchableOpacity } from 'react-native'; import { Text } from '@/components/ui/text'; import EnhancedSocialPost from '@/components/social/EnhancedSocialPost'; import { ChevronUp, Zap } from 'lucide-react-native'; import POWRPackSection from '@/components/social/POWRPackSection'; import { usePOWRFeed } from '@/lib/hooks/useFeedHooks'; import { router } from 'expo-router'; import { AnyFeedEntry } from '@/types/feed'; import { withOfflineState } from '@/components/social/SocialOfflineState'; // Define the conversion function here to avoid import issues function convertToLegacyFeedItem(entry: AnyFeedEntry) { return { id: entry.eventId, type: entry.type, originalEvent: entry.event!, parsedContent: entry.content!, createdAt: (entry.timestamp || Date.now()) / 1000 }; } function PowerScreen() { const { entries, newEntries, loading, resetFeed, clearNewEntries } = usePOWRFeed(); const [isRefreshing, setIsRefreshing] = useState(false); const [showNewButton, setShowNewButton] = useState(false); // Use ref for list to scroll to top const listRef = useRef(null); // Break the dependency cycle by using proper effect useEffect(() => { // Only set the button if we have new entries if (newEntries.length > 0) { setShowNewButton(true); } }, [newEntries.length]); // Depend only on length change, not the array itself // Handle showing new entries const handleShowNewEntries = useCallback(() => { clearNewEntries(); setShowNewButton(false); // Scroll to top listRef.current?.scrollToOffset({ offset: 0, animated: true }); }, [clearNewEntries]); // Handle refresh - updated with proper reset handling const handleRefresh = useCallback(async () => { setIsRefreshing(true); try { await resetFeed(); // Add a slight delay to ensure the UI updates await new Promise(resolve => setTimeout(resolve, 300)); } catch (error) { console.error('Error refreshing feed:', error); } finally { setIsRefreshing(false); } }, [resetFeed]); // Handle post selection - simplified for testing const handlePostPress = useCallback((entry: AnyFeedEntry) => { // Just show an alert with the entry info for testing alert(`Selected ${entry.type} with ID: ${entry.eventId}`); // Alternatively, log to console for debugging console.log(`Selected ${entry.type}:`, entry); }, []); // Memoize render item to prevent re-renders const renderItem = useCallback(({ item }: { item: AnyFeedEntry }) => ( handlePostPress(item)} /> ), [handlePostPress]); // Memoize empty component const renderEmptyComponent = useCallback(() => ( loading ? ( Loading POWR content... ) : ( No POWR content found ) ), [loading]); // Header component const renderHeaderComponent = useCallback(() => ( <> {/* POWR Welcome Section */} POWR Community Official updates, featured content, and community highlights from the POWR team. {/* POWR Packs Section */} ), []); return ( {showNewButton && ( New Posts ({newEntries.length}) )} item.id} renderItem={renderItem} refreshControl={ } ListHeaderComponent={renderHeaderComponent} ListEmptyComponent={renderEmptyComponent} contentContainerStyle={{ flexGrow: 1, paddingBottom: 16 }} /> ); } // Export the component wrapped with the offline state HOC export default withOfflineState(PowerScreen);