1+ import React , { useEffect , useState } from 'react' ;
2+ import { View , StyleSheet , Alert } from 'react-native' ;
3+ import { router } from 'expo-router' ;
4+ import { useFeed , FeedType } from '../../contexts/FeedContext' ;
5+ import { FeedToggle , PostList , CreatePostButton } from '../../components/feed' ;
6+ import { WorkoutPostResponse } from '../../services/api' ;
7+
8+ export default function FeedScreen ( ) {
9+ const {
10+ getCurrentFeed,
11+ currentFeedType,
12+ setCurrentFeedType,
13+ loadFeed,
14+ loadMorePosts,
15+ refreshFeed,
16+ isLoading,
17+ error,
18+ hasMore,
19+ personalFeed,
20+ publicFeed,
21+ combinedFeed,
22+ clearError,
23+ } = useFeed ( ) ;
24+
25+ const [ isRefreshing , setIsRefreshing ] = useState ( false ) ;
26+
27+ useEffect ( ( ) => {
28+ // Load initial feed when component mounts
29+ loadFeed ( currentFeedType , true ) ;
30+ } , [ ] ) ;
31+
32+ useEffect ( ( ) => {
33+ // Show error alert if there's an error
34+ if ( error ) {
35+ Alert . alert ( 'Error' , error , [
36+ { text : 'OK' , onPress : clearError }
37+ ] ) ;
38+ }
39+ } , [ error , clearError ] ) ;
40+
41+ const handleFeedTypeChange = async ( feedType : FeedType ) => {
42+ setCurrentFeedType ( feedType ) ;
43+
44+ // Load feed if it's empty or switch to a different type
45+ const targetFeed = getFeedForType ( feedType ) ;
46+ if ( targetFeed . length === 0 ) {
47+ await loadFeed ( feedType , true ) ;
48+ }
49+ } ;
50+
51+ const getFeedForType = ( feedType : FeedType ) : WorkoutPostResponse [ ] => {
52+ switch ( feedType ) {
53+ case 'personal' :
54+ return personalFeed ;
55+ case 'public' :
56+ return publicFeed ;
57+ case 'combined' :
58+ return combinedFeed ;
59+ default :
60+ return personalFeed ;
61+ }
62+ } ;
63+
64+ const handleRefresh = async ( ) => {
65+ setIsRefreshing ( true ) ;
66+ try {
67+ await refreshFeed ( ) ;
68+ } finally {
69+ setIsRefreshing ( false ) ;
70+ }
71+ } ;
72+
73+ const handleLoadMore = async ( ) => {
74+ await loadMorePosts ( ) ;
75+ } ;
76+
77+ const handleCreatePost = ( ) => {
78+ router . push ( '/create-post' as any ) ;
79+ } ;
80+
81+ const handlePostPress = ( post : WorkoutPostResponse ) => {
82+ // Navigate to post detail or user profile
83+ console . log ( 'Post pressed:' , post . id ) ;
84+ // TODO: Implement post detail navigation
85+ } ;
86+
87+ const postCounts = {
88+ personal : personalFeed . length ,
89+ public : publicFeed . length ,
90+ combined : combinedFeed . length ,
91+ } ;
92+
93+ const currentFeed = getCurrentFeed ( ) ;
94+
95+ return (
96+ < View style = { styles . container } >
97+ < FeedToggle
98+ currentFeedType = { currentFeedType }
99+ onFeedTypeChange = { handleFeedTypeChange }
100+ postCounts = { postCounts }
101+ />
102+
103+ < PostList
104+ posts = { currentFeed }
105+ isLoading = { isLoading }
106+ isRefreshing = { isRefreshing }
107+ hasMore = { hasMore }
108+ onRefresh = { handleRefresh }
109+ onLoadMore = { handleLoadMore }
110+ onPostPress = { handlePostPress }
111+ />
112+
113+ < CreatePostButton onPress = { handleCreatePost } />
114+ </ View >
115+ ) ;
116+ }
117+
118+ const styles = StyleSheet . create ( {
119+ container : {
120+ flex : 1 ,
121+ backgroundColor : '#f5f5f5' ,
122+ } ,
123+ } ) ;
0 commit comments