import React from 'react';
import { View, Text, Button, FlatList, ActivityIndicator, StyleSheet } from 'react-native';
import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query';
const queryClient = new QueryClient();
function UserList() {
const { data, error, isLoading, refetch } = useQuery(['users'], async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/users');
if (!response.ok) throw new Error('Network response was not ok');
return response.json();
});
if (isLoading) {
return <ActivityIndicator size="large" style={styles.loading} accessibilityLabel="Loading users" />;
}
if (error) {
return (
<View style={styles.container}>
<Text style={styles.errorText} accessibilityRole="alert">Error loading users: {error.message}</Text>
<Button title="Retry" onPress={refetch} accessibilityLabel="Retry fetching users" />
</View>
);
}
return (
<View style={styles.container}>
<FlatList
data={data}
keyExtractor={item => item.id.toString()}
renderItem={({ item }) => <Text style={styles.item}>{item.name}</Text>}
accessibilityLabel="User list"
/>
<Button title="Refresh" onPress={refetch} accessibilityLabel="Refresh user list" />
</View>
);
}
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<UserList />
</QueryClientProvider>
);
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 16, backgroundColor: '#fff' },
item: { padding: 12, borderBottomWidth: 1, borderBottomColor: '#ccc', fontSize: 16 },
errorText: { color: 'red', marginBottom: 10, fontSize: 16 },
loading: { flex: 1, justifyContent: 'center', alignItems: 'center' }
});We use the useQuery hook from React Query to fetch the user data asynchronously. It manages loading, error, and data states for us.
While loading, we show an ActivityIndicator spinner. If an error happens, we display a red error message and a Retry button that calls refetch.
When data is loaded, we render a FlatList showing user names. The Refresh button also calls refetch to reload the data on demand.
This approach keeps the UI responsive and handles network states cleanly with minimal code.