add delete account button && homescrolling
This commit is contained in:
@@ -7,6 +7,7 @@ import {
|
|||||||
ScrollView,
|
ScrollView,
|
||||||
TouchableOpacity,
|
TouchableOpacity,
|
||||||
ActivityIndicator,
|
ActivityIndicator,
|
||||||
|
RefreshControl,
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import { StatusBar } from 'expo-status-bar';
|
import { StatusBar } from 'expo-status-bar';
|
||||||
import { Ionicons } from '@expo/vector-icons';
|
import { Ionicons } from '@expo/vector-icons';
|
||||||
@@ -23,6 +24,7 @@ const HomeScreen = () => {
|
|||||||
const [loadingCardBalance, setLoadingCardBalance] = useState(true);
|
const [loadingCardBalance, setLoadingCardBalance] = useState(true);
|
||||||
const [cardBalanceError, setCardBalanceError] = useState(null);
|
const [cardBalanceError, setCardBalanceError] = useState(null);
|
||||||
const [isBalanceVisible, setIsBalanceVisible] = useState(true);
|
const [isBalanceVisible, setIsBalanceVisible] = useState(true);
|
||||||
|
const [refreshing, setRefreshing] = useState(false);
|
||||||
|
|
||||||
const showBalanceCard = !loadingCardBalance && cardBalanceError === null && cardBalance !== null;
|
const showBalanceCard = !loadingCardBalance && cardBalanceError === null && cardBalance !== null;
|
||||||
|
|
||||||
@@ -79,11 +81,64 @@ const HomeScreen = () => {
|
|||||||
fetchCardBalance();
|
fetchCardBalance();
|
||||||
}, [user]);
|
}, [user]);
|
||||||
|
|
||||||
|
const handleRefresh = async () => {
|
||||||
|
setRefreshing(true);
|
||||||
|
await Promise.all([
|
||||||
|
(async () => {
|
||||||
|
try {
|
||||||
|
const response = await apiService.getMetrics();
|
||||||
|
if (response.success) {
|
||||||
|
setMetrics(response.data);
|
||||||
|
} else {
|
||||||
|
console.warn('Failed to fetch metrics during refresh:', response.error);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Error fetching metrics during refresh:', error);
|
||||||
|
}
|
||||||
|
})(),
|
||||||
|
(async () => {
|
||||||
|
if (!user?.passport_serie || !user?.passport_id || !user?.card_number || !user?.card_month || !user?.card_year) {
|
||||||
|
setCardBalance(null); // Clear previous balance if conditions are not met
|
||||||
|
setCardBalanceError(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const res = await apiService.getCardBalanceQuickCheck();
|
||||||
|
if (res.success) {
|
||||||
|
const raw = res.data;
|
||||||
|
let balanceValue = null;
|
||||||
|
if (raw && typeof raw === 'object') {
|
||||||
|
balanceValue = raw.balance ?? raw.card_balance ?? raw.amount ?? null;
|
||||||
|
}
|
||||||
|
setCardBalance(balanceValue);
|
||||||
|
setCardBalanceError(null);
|
||||||
|
} else {
|
||||||
|
console.warn('Failed to fetch card balance during refresh:', res.error);
|
||||||
|
setCardBalanceError(res.error || 'Error');
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Error fetching card balance during refresh:', e);
|
||||||
|
}
|
||||||
|
})(),
|
||||||
|
]);
|
||||||
|
setRefreshing(false);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SafeAreaView style={styles.container}>
|
<SafeAreaView style={styles.container}>
|
||||||
<StatusBar style="dark" />
|
<StatusBar style="dark" />
|
||||||
|
|
||||||
<ScrollView style={styles.scrollView} showsVerticalScrollIndicator={false}>
|
<ScrollView
|
||||||
|
style={styles.scrollView}
|
||||||
|
showsVerticalScrollIndicator={false}
|
||||||
|
refreshControl={
|
||||||
|
<RefreshControl
|
||||||
|
refreshing={refreshing}
|
||||||
|
onRefresh={handleRefresh}
|
||||||
|
tintColor={COLORS.primary}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
>
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<View style={styles.header}>
|
<View style={styles.header}>
|
||||||
<View>
|
<View>
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ const ProfileScreen = () => {
|
|||||||
// { id: 11, title: 'Ulanmak düzgünleri', icon: 'document-text', hasArrow: true },
|
// { id: 11, title: 'Ulanmak düzgünleri', icon: 'document-text', hasArrow: true },
|
||||||
// { id: 12, title: 'Gizlinlik syýasaty', icon: 'lock-open', hasArrow: true },
|
// { id: 12, title: 'Gizlinlik syýasaty', icon: 'lock-open', hasArrow: true },
|
||||||
{ id: 13, title: 'Programma barada', icon: 'information-circle', value: 'v1.0.0', hasArrow: true },
|
{ id: 13, title: 'Programma barada', icon: 'information-circle', value: 'v1.0.0', hasArrow: true },
|
||||||
|
{ id: 14, title: 'Hasaby poz', icon: 'trash', hasArrow: false, color: COLORS.red },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
@@ -102,6 +103,12 @@ const ProfileScreen = () => {
|
|||||||
case 5: // Security
|
case 5: // Security
|
||||||
handleSecuritySettings();
|
handleSecuritySettings();
|
||||||
break;
|
break;
|
||||||
|
case 13: // About App
|
||||||
|
Alert.alert('Üns beriň', 'Programma barada maglumatlar açylýar...');
|
||||||
|
break;
|
||||||
|
case 14: // Delete Account
|
||||||
|
handleDeleteAccount();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// Alert.alert('Üns beriň', 'Bu funksiýa entek işlenok');
|
// Alert.alert('Üns beriň', 'Bu funksiýa entek işlenok');
|
||||||
}
|
}
|
||||||
@@ -201,6 +208,40 @@ const ProfileScreen = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleDeleteAccount = () => {
|
||||||
|
Alert.alert(
|
||||||
|
'Hasaby pozmak',
|
||||||
|
'Hasabyňyzy pozmak isleýändigiňize ynamlymy? Bu amal yzyna gaýtarylmaz.',
|
||||||
|
[
|
||||||
|
{
|
||||||
|
text: 'Ýok',
|
||||||
|
style: 'cancel',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Hawa',
|
||||||
|
style: 'destructive',
|
||||||
|
onPress: async () => {
|
||||||
|
try {
|
||||||
|
setIsLoading(true);
|
||||||
|
const result = await apiService.deleteAccount();
|
||||||
|
|
||||||
|
if (result.message == 'user deleted successfully') {
|
||||||
|
Alert.alert('Üstünlik', 'Hasabyňyz üstünlikli pozuldy.');
|
||||||
|
logout(); // Log out the user after successful deletion
|
||||||
|
} else {
|
||||||
|
Alert.alert('Ýalňyşlyk', result.error || 'Hasaby pozmak amala aşmady.');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
Alert.alert('Ýalňyşlyk', error.message || 'Hasaby pozmakda näsazlyk ýüze çykdy.');
|
||||||
|
} finally {
|
||||||
|
setIsLoading(false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const handleNotificationSettings = () => {
|
const handleNotificationSettings = () => {
|
||||||
Alert.alert('Bildirişler', 'Bildiriş sazlamalary sahypasy açylýar...');
|
Alert.alert('Bildirişler', 'Bildiriş sazlamalary sahypasy açylýar...');
|
||||||
};
|
};
|
||||||
@@ -294,7 +335,7 @@ const ProfileScreen = () => {
|
|||||||
>
|
>
|
||||||
<View style={styles.profileItemLeft}>
|
<View style={styles.profileItemLeft}>
|
||||||
<View style={styles.profileItemIcon}>
|
<View style={styles.profileItemIcon}>
|
||||||
<Ionicons name={item.icon} size={20} color={COLORS.primary} />
|
<Ionicons name={item.icon} size={20} color={item.color || COLORS.primary} />
|
||||||
</View>
|
</View>
|
||||||
<Text style={styles.profileItemTitle}>{item.title}</Text>
|
<Text style={styles.profileItemTitle}>{item.title}</Text>
|
||||||
</View>
|
</View>
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ class AuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async deleteAccount() {
|
async deleteAccount() {
|
||||||
return this.makeRequest('/user/delete-account', null, true, 'DELETE');
|
return this.makeRequest(API_CONFIG.ENDPOINTS.AUTH.DELETE_USER, null, true, 'POST');
|
||||||
}
|
}
|
||||||
|
|
||||||
// ================================
|
// ================================
|
||||||
|
|||||||
Reference in New Issue
Block a user