import React, { memo, useEffect, useState, useCallback, useRef } from 'react'; import { FlatList, ScrollView, View } from 'react-native'; import { Text } from '@/components/ui/text'; import { Pressable } from '@/components/ui/pressable'; import { Image } from '@/components/ui/image'; import { Box } from '@/components/ui/box'; import { Icon } from '@/components/ui/icon'; import { VStack } from '@/components/ui/vstack'; import { SkeletonText } from '@/components/ui/skeleton'; import { useShowToast } from '@/core-components/useShowToast'; import { Plus, UserRound } from 'lucide-react-native'; import { AXIOS } from '@/utils/utils'; import CustomSpinner, { SmallSpinner } from '@/core-components/CustomSpinner'; import CustomRefreshControl from '@/core-components/CustomRefreshControl'; import InternetError from '@/core-components/InternetError'; const PageItem = memo(({ item, navigate }) => ( navigate('PageDetail', { id: item.id })} className='flex-row items-center gap-x-3 p-2 bg-white dark:bg-gray-800 rounded-lg elevation-2' > {item.name} {item.name} )); const RenderEmptyComponent = memo(({ state, onRefresh }) => { if (state.loading) return ; else if (state.error) return ; else return ( Crea tu primera página Lanza tu espacio en segundos y conecta con tu comunidad. Tu página es el lugar perfecto para compartir tus ideas, mostrar tu trabajo o vender tus productos. En solo unos clics tendrás un sitio profesional, listo para recibir visitas.{'\n'}• Elige un nombre memorable.{'\n'}• Usa imágenes de tu marca.{'\n'}• Crea publicaciones.{'\n'}• Y mucho más. Nombre de la página ) }); const keyExtractor = item => item.id.toString(); export default ({ navigation: { navigate, setOptions }, route: { params } }) => { const showToast = useShowToast(); const lastProcessedRefreshed = useRef(undefined); const [state, setState] = useState({ loading: true }); useEffect(() => { const isInitialLoad = params?.refreshed === undefined && lastProcessedRefreshed.current === undefined; const hasRefreshTriggered = params?.refreshed !== undefined && params?.refreshed !== lastProcessedRefreshed.current; if (isInitialLoad) { setOptions({ headerRight: () => ( navigate('FrmCreatePage')} className='rounded-full px-4 py-1.5 ml-5 bg-white dark:bg-gray-700 flex-row items-center elevation-2' > Crear página ) }); } const controller = new AbortController(); if (isInitialLoad || hasRefreshTriggered) { (async () => { try { if (hasRefreshTriggered) setState(prevState => ({ ...prevState, refreshing: true })); const { data } = await AXIOS.get('/me/page/', { signal: controller.signal }); setState(data); lastProcessedRefreshed.current = params?.refreshed; } catch { if (controller.signal.aborted) return; setState({ error: true }); showToast(); } })(); } return () => controller.abort(); }, [params?.refreshed]); const onRefresh = useCallback(async () => { try { setState(prevState => ({ ...prevState, refreshing: true })); const { data } = await AXIOS.get('/me/page/'); setState(data); } catch { setState(prevState => ({ ...prevState, refreshing: false })); showToast(); } }, []); const loadMore = useCallback(async () => { try { setState(prevState => ({ ...prevState, loading_more: true })); const { data } = await AXIOS.get(`/me/page/?page=${state.next}`); setState(prevState => ({ next: data.next, results: prevState.results.concat(data.results) })); } catch { setState(prevState => ({ ...prevState, loading_more: false })); showToast(); } }, [state?.next]); const renderItem = useCallback(({ item }) => , []); return ( } onEndReached={(state.next && !state.loading_more) ? loadMore : null} ListFooterComponent={state.next && } ListEmptyComponent={} /> ); };