Skip to main content
Glama
lallen30
by lallen30
MyProfileScreen.tsx4.51 kB
import React, { useState, useCallback } from 'react'; import { View, Text, Image, TouchableOpacity, ScrollView, ActivityIndicator } from 'react-native'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { useFocusEffect } from '@react-navigation/native'; import Icon from 'react-native-vector-icons/Ionicons'; import { styles } from './Styles'; interface UserProfile { loginInfo: { first_name: string; last_name: string; email: string; phone: string; user_avatar?: string; display_name: string; city_state?: string; }; } const MyProfileScreen = ({ navigation }: any) => { const [userInfo, setUserInfo] = useState<UserProfile | null>(null); const [isLoading, setIsLoading] = useState(true); const loadUserData = async () => { try { setIsLoading(true); console.log('Attempting to load user data...'); const userDataString = await AsyncStorage.getItem('userData'); console.log('Raw userData from AsyncStorage:', userDataString); if (!userDataString) { console.log('No userData found in AsyncStorage'); setUserInfo(null); return; } const userData = JSON.parse(userDataString); console.log('Parsed userData:', userData); // Ensure the data has the expected structure if (!userData?.loginInfo) { console.error('Invalid user data structure:', userData); setUserInfo(null); return; } console.log('Setting valid user data:', userData); setUserInfo(userData); } catch (error) { console.error('Error loading user data:', error); setUserInfo(null); } finally { setIsLoading(false); } }; useFocusEffect( useCallback(() => { loadUserData(); }, []) ); if (isLoading) { return ( <View style={[styles.container, styles.centerContent]}> <ActivityIndicator size="large" color="#007AFF" /> </View> ); } if (!userInfo?.loginInfo) { return ( <View style={[styles.container, styles.centerContent]}> <Text style={styles.errorText}>No user data available</Text> </View> ); } const { loginInfo } = userInfo; return ( <ScrollView style={styles.container}> <View style={styles.header}> <View style={styles.avatarContainer}> {loginInfo.user_avatar ? ( <Image source={{ uri: loginInfo.user_avatar }} style={styles.profileImage} /> ) : ( <Image source={require('../../../assets/images/default_profile_pic.png')} style={styles.profileImage} /> )} </View> <Text style={styles.name}>{loginInfo.display_name}</Text> {loginInfo.city_state && ( <Text style={styles.location}>{loginInfo.city_state}</Text> )} </View> <View style={styles.infoSection}> <View style={styles.infoItem}> <Icon name="person-outline" size={24} color="#666" style={styles.icon} /> <View> <Text style={styles.label}>Full Name</Text> <Text style={styles.value}> {`${loginInfo.first_name} ${loginInfo.last_name}`} </Text> </View> </View> <View style={styles.infoItem}> <Icon name="call-outline" size={24} color="#666" style={styles.icon} /> <View> <Text style={styles.label}>Mobile Number</Text> <Text style={styles.value}>{loginInfo.phone || 'Not provided'}</Text> </View> </View> <View style={styles.infoItem}> <Icon name="mail-outline" size={24} color="#666" style={styles.icon} /> <View> <Text style={styles.label}>Email</Text> <Text style={styles.value}>{loginInfo.email}</Text> </View> </View> </View> <View style={styles.buttonContainer}> <TouchableOpacity style={styles.button} onPress={() => navigation.navigate('EditProfile')} > <Text style={styles.buttonText}>Edit Account</Text> </TouchableOpacity> <TouchableOpacity style={[styles.button, styles.secondaryButton]} onPress={() => navigation.navigate('ChangePassword')} > <Text style={[styles.buttonText, styles.secondaryButtonText]}>Change Password</Text> </TouchableOpacity> </View> </ScrollView> ); }; export default MyProfileScreen;

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lallen30/mcp-remote-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server