mirror of
https://github.com/DocNR/POWR.git
synced 2025-04-22 16:51:33 +00:00

- Enhanced NostrBandService with aggressive cache-busting and better error handling - Improved useProfileStats hook with optimized refresh settings and platform-specific logging - Fixed ProfileFollowerStats UI to show actual values with loading indicators - Added visual feedback during refresh operations - Updated CHANGELOG.md to document these improvements This resolves the issue where follower/following counts were not updating properly on Android and iOS platforms.
254 lines
7.5 KiB
TypeScript
254 lines
7.5 KiB
TypeScript
import React from 'react';
|
|
import { View, Text, StyleSheet, TouchableOpacity, ScrollView, Image } from 'react-native';
|
|
import { SafeAreaView } from 'react-native-safe-area-context';
|
|
import { StatusBar } from 'expo-status-bar';
|
|
import { useRouter } from 'expo-router';
|
|
|
|
/**
|
|
* Demo index page for showcasing implemented React Query features.
|
|
* This page serves as a central hub for navigating to different test components
|
|
* that demonstrate various aspects of the React Query integration.
|
|
*/
|
|
export default function ReactQueryDemoIndex() {
|
|
const router = useRouter();
|
|
|
|
// Only include the demo options that are currently available
|
|
const demoOptions = [
|
|
{
|
|
id: 'react-query-auth-test',
|
|
title: 'Authentication Demo',
|
|
description: 'Demonstrates authentication flow using React Query, including login, logout, and profile management.',
|
|
icon: '🔐',
|
|
},
|
|
{
|
|
id: 'auth-test',
|
|
title: 'Legacy Auth Demo',
|
|
description: 'Original authentication implementation for comparison.',
|
|
icon: '👤',
|
|
},
|
|
{
|
|
id: 'simple-auth',
|
|
title: 'Simple Auth Demo',
|
|
description: 'Simpler authentication implementation for testing.',
|
|
icon: '🔑',
|
|
},
|
|
{
|
|
id: 'robohash',
|
|
title: 'Robohash Avatar Demo',
|
|
description: 'Demonstrates the Robohash avatar generation system.',
|
|
icon: '🤖',
|
|
},
|
|
{
|
|
id: 'cache-test',
|
|
title: 'Image Cache Demo',
|
|
description: 'Tests React Query integration with profile and banner image caching.',
|
|
icon: '🖼️',
|
|
}
|
|
];
|
|
|
|
return (
|
|
<SafeAreaView style={styles.container}>
|
|
<StatusBar style="dark" />
|
|
<ScrollView contentContainerStyle={styles.scrollContent}>
|
|
<Text style={styles.header}>React Query Integration</Text>
|
|
<Text style={styles.subheader}>Phase 1 Implementation Demo</Text>
|
|
|
|
<View style={styles.infoCard}>
|
|
<Text style={styles.cardTitle}>🚀 Implementation Complete</Text>
|
|
<Text style={styles.cardText}>
|
|
Phase 1 of the React Query integration has been implemented. This includes:
|
|
</Text>
|
|
<View style={styles.bulletList}>
|
|
<Text style={styles.bulletItem}>• Authentication with React Query</Text>
|
|
<Text style={styles.bulletItem}>• Profile data management</Text>
|
|
<Text style={styles.bulletItem}>• Network connectivity tracking</Text>
|
|
<Text style={styles.bulletItem}>• Optimized query client configuration</Text>
|
|
<Text style={styles.bulletItem}>• Standardized query key structure</Text>
|
|
</View>
|
|
<Text style={styles.cardText}>
|
|
Select a demo below to explore the implementation.
|
|
</Text>
|
|
</View>
|
|
|
|
<Text style={styles.sectionTitle}>Available Demos</Text>
|
|
|
|
{demoOptions.map((demo) => (
|
|
<TouchableOpacity
|
|
key={demo.id}
|
|
style={styles.demoOption}
|
|
onPress={() => router.push({
|
|
pathname: `/test/${demo.id}` as any
|
|
})}
|
|
>
|
|
<View style={styles.iconContainer}>
|
|
<Text style={styles.icon}>{demo.icon}</Text>
|
|
</View>
|
|
<View style={styles.demoContent}>
|
|
<Text style={styles.demoTitle}>{demo.title}</Text>
|
|
<Text style={styles.demoDescription}>{demo.description}</Text>
|
|
</View>
|
|
</TouchableOpacity>
|
|
))}
|
|
|
|
<View style={styles.infoCard}>
|
|
<Text style={styles.cardTitle}>📝 Implementation Notes</Text>
|
|
<Text style={styles.cardText}>
|
|
This implementation follows the phased approach outlined in the React Query Integration Plan.
|
|
Phase 1 focuses on core authentication and network status management.
|
|
</Text>
|
|
<Text style={[styles.cardText, {color: '#e65100', fontWeight: 'bold'}]}>
|
|
Note: Test components have been updated with isolated providers to prevent hook ordering conflicts.
|
|
Each test now uses dedicated providers and properly manages its own state.
|
|
</Text>
|
|
<Text style={styles.cardText}>
|
|
The hooks are designed to be drop-in replacements for existing hooks, with enhanced functionality:
|
|
</Text>
|
|
<View style={styles.bulletList}>
|
|
<Text style={styles.bulletItem}>• Automatic loading states</Text>
|
|
<Text style={styles.bulletItem}>• Standardized error handling</Text>
|
|
<Text style={styles.bulletItem}>• Optimistic updates</Text>
|
|
<Text style={styles.bulletItem}>• Smart caching and refetching</Text>
|
|
<Text style={styles.bulletItem}>• Automatic query invalidation</Text>
|
|
</View>
|
|
</View>
|
|
|
|
<View style={styles.nextSteps}>
|
|
<Text style={styles.nextStepsTitle}>Next Steps:</Text>
|
|
<Text style={styles.nextStepsText}>
|
|
1. Implement domain-specific hooks (workouts, exercises, templates)
|
|
</Text>
|
|
<Text style={styles.nextStepsText}>
|
|
2. Integrate with UI components
|
|
</Text>
|
|
<Text style={styles.nextStepsText}>
|
|
3. Add advanced features (prefetching, suspense)
|
|
</Text>
|
|
<Text style={styles.nextStepsText}>
|
|
4. Complete full migration of state management
|
|
</Text>
|
|
</View>
|
|
</ScrollView>
|
|
</SafeAreaView>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
backgroundColor: '#f5f5f5',
|
|
},
|
|
scrollContent: {
|
|
padding: 16,
|
|
paddingBottom: 40,
|
|
},
|
|
header: {
|
|
fontSize: 28,
|
|
fontWeight: 'bold',
|
|
textAlign: 'center',
|
|
marginTop: 8,
|
|
color: '#333',
|
|
},
|
|
subheader: {
|
|
fontSize: 18,
|
|
color: '#666',
|
|
textAlign: 'center',
|
|
marginBottom: 24,
|
|
},
|
|
infoCard: {
|
|
backgroundColor: 'white',
|
|
borderRadius: 12,
|
|
padding: 16,
|
|
marginBottom: 24,
|
|
shadowColor: '#000',
|
|
shadowOffset: { width: 0, height: 2 },
|
|
shadowOpacity: 0.1,
|
|
shadowRadius: 4,
|
|
elevation: 3,
|
|
},
|
|
cardTitle: {
|
|
fontSize: 18,
|
|
fontWeight: 'bold',
|
|
marginBottom: 12,
|
|
color: '#333',
|
|
},
|
|
cardText: {
|
|
fontSize: 15,
|
|
color: '#555',
|
|
lineHeight: 22,
|
|
marginBottom: 12,
|
|
},
|
|
bulletList: {
|
|
marginLeft: 8,
|
|
marginBottom: 16,
|
|
},
|
|
bulletItem: {
|
|
fontSize: 15,
|
|
color: '#555',
|
|
lineHeight: 24,
|
|
},
|
|
sectionTitle: {
|
|
fontSize: 20,
|
|
fontWeight: 'bold',
|
|
marginBottom: 16,
|
|
color: '#333',
|
|
},
|
|
demoOption: {
|
|
backgroundColor: 'white',
|
|
borderRadius: 12,
|
|
marginBottom: 12,
|
|
padding: 16,
|
|
flexDirection: 'row',
|
|
shadowColor: '#000',
|
|
shadowOffset: { width: 0, height: 1 },
|
|
shadowOpacity: 0.1,
|
|
shadowRadius: 2,
|
|
elevation: 2,
|
|
},
|
|
iconContainer: {
|
|
width: 48,
|
|
height: 48,
|
|
borderRadius: 24,
|
|
backgroundColor: '#f0f0f0',
|
|
justifyContent: 'center',
|
|
alignItems: 'center',
|
|
marginRight: 16,
|
|
},
|
|
icon: {
|
|
fontSize: 24,
|
|
},
|
|
demoContent: {
|
|
flex: 1,
|
|
justifyContent: 'center',
|
|
},
|
|
demoTitle: {
|
|
fontSize: 16,
|
|
fontWeight: 'bold',
|
|
marginBottom: 4,
|
|
color: '#333',
|
|
},
|
|
demoDescription: {
|
|
fontSize: 14,
|
|
color: '#666',
|
|
lineHeight: 20,
|
|
},
|
|
nextSteps: {
|
|
backgroundColor: '#e6f7ff',
|
|
borderRadius: 12,
|
|
padding: 16,
|
|
marginTop: 8,
|
|
borderLeftWidth: 4,
|
|
borderLeftColor: '#1890ff',
|
|
},
|
|
nextStepsTitle: {
|
|
fontSize: 16,
|
|
fontWeight: 'bold',
|
|
marginBottom: 12,
|
|
color: '#333',
|
|
},
|
|
nextStepsText: {
|
|
fontSize: 14,
|
|
color: '#444',
|
|
lineHeight: 24,
|
|
},
|
|
});
|