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}
));
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={}
/>
);
};