251 lines
8.8 KiB
TypeScript
251 lines
8.8 KiB
TypeScript
import React, { useEffect, useState } from 'react';
|
|
import {
|
|
View,
|
|
Text,
|
|
ScrollView,
|
|
TouchableOpacity,
|
|
RefreshControl,
|
|
} from 'react-native';
|
|
import { useAppTheme } from '@theme';
|
|
import { ScreenHeader } from '@components';
|
|
import { WalletIcon, CheckCircleIcon, ClipboardIcon } from '@icons';
|
|
import { useNavigation } from '@react-navigation/native';
|
|
import { NativeStackNavigationProp } from '@react-navigation/native-stack';
|
|
import { AppStackParamList } from '@navigation/navigationTypes';
|
|
import { getStyles } from './bankDetailsScreen.styles';
|
|
import { formatDate, maskAccountNumber, RouteNames } from '@utils';
|
|
import { fetchBankAccounts } from '../addBankDetailsScreen';
|
|
import { useAppDispatch, useAppSelector } from '@store';
|
|
|
|
// ── Dummy data — replace with API data later ──────────────────────────────────
|
|
// const DUMMY_ACCOUNTS: BankAccount[] = [
|
|
// {
|
|
// id: '071e5d96-9e7f-4e57-a79c-593c2e2d0453',
|
|
// ownerType: 'MERCHANT',
|
|
// ownerId: 'b2b301a9-bc8f-4b22-b724-78279022dd85',
|
|
// accountHolderName: 'sddsd',
|
|
// bankName: 'sddsds',
|
|
// accountNumber: 'ssdsds',
|
|
// ifscCode: 'sdssd',
|
|
// branchName: 'sdssdsd',
|
|
// isDefault: true,
|
|
// isVerified: false,
|
|
// passbookImage:
|
|
// '/bank-accounts/image/b2b301a9-bc8f-4b22-b724-78279022dd85-1784618982576.png',
|
|
// createdAt: '2026-07-21T07:29:26.645Z',
|
|
// updatedAt: '2026-07-21T07:29:42.582Z',
|
|
// },
|
|
// ];
|
|
export const BankDetailsScreen: React.FC = () => {
|
|
const { colors } = useAppTheme();
|
|
const styles = getStyles(colors);
|
|
const navigation =
|
|
useNavigation<NativeStackNavigationProp<AppStackParamList>>();
|
|
const dispatch = useAppDispatch();
|
|
const { bankAccounts, isLoading, error } = useAppSelector(
|
|
state => state.addBankDetails,
|
|
);
|
|
|
|
// Replace this state with Redux selector when wiring real API
|
|
// const [accounts] = useState<BankAccount[]>(bankAccounts);
|
|
const [refreshing, setRefreshing] = useState(false);
|
|
|
|
useEffect(() => {
|
|
dispatch(fetchBankAccounts());
|
|
}, []);
|
|
|
|
const handleRefresh = () => {
|
|
setRefreshing(true);
|
|
dispatch(fetchBankAccounts())
|
|
.unwrap()
|
|
.then(() => setRefreshing(false))
|
|
.catch(() => setRefreshing(false));
|
|
};
|
|
|
|
const handleAddAccount = () => {
|
|
navigation.navigate(RouteNames.AddBankDetails);
|
|
};
|
|
|
|
return (
|
|
<View style={styles.container}>
|
|
<ScreenHeader
|
|
title="Bank Details"
|
|
showBack={true}
|
|
onBack={() => navigation.goBack()}
|
|
/>
|
|
|
|
<ScrollView
|
|
contentContainerStyle={styles.scrollContainer}
|
|
showsVerticalScrollIndicator={false}
|
|
refreshControl={
|
|
<RefreshControl
|
|
refreshing={refreshing}
|
|
onRefresh={handleRefresh}
|
|
tintColor={colors.primary}
|
|
colors={[colors.primary]}
|
|
/>
|
|
}
|
|
>
|
|
{/* Summary Banner */}
|
|
<View style={styles.summaryBanner}>
|
|
<View style={styles.summaryIconCircle}>
|
|
<WalletIcon size={22} color={colors.white} />
|
|
</View>
|
|
<View style={styles.summaryTextContainer}>
|
|
<Text style={styles.summaryTitle}>Payout Accounts</Text>
|
|
<Text style={styles.summarySubtitle}>
|
|
Manage your bank accounts for receiving earnings
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
|
|
{/* Empty State */}
|
|
{bankAccounts?.length === 0 ? (
|
|
<View style={styles.emptyContainer}>
|
|
<View style={styles.emptyIconCircle}>
|
|
<WalletIcon size={36} color={colors.primary} />
|
|
</View>
|
|
<Text style={styles.emptyTitle}>No Bank Accounts</Text>
|
|
<Text style={styles.emptySubtitle}>
|
|
Add your bank account to start receiving your delivery earnings
|
|
directly.
|
|
</Text>
|
|
</View>
|
|
) : (
|
|
<>
|
|
{/* Section Header */}
|
|
<View style={styles.sectionHeader}>
|
|
<Text style={styles.sectionTitle}>Your Accounts</Text>
|
|
<View style={styles.countBadge}>
|
|
<Text style={styles.countBadgeText}>
|
|
{bankAccounts?.length}
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
|
|
{/* Account Cards */}
|
|
{bankAccounts?.map(account => (
|
|
<View
|
|
key={account.id}
|
|
style={[
|
|
styles.accountCard,
|
|
account.isDefault ? styles.defaultCard : null,
|
|
]}
|
|
>
|
|
{/* Top color strip for default account */}
|
|
{account.isDefault && <View style={styles.cardTopStrip} />}
|
|
|
|
<View style={styles.cardBody}>
|
|
{/* Card Header Row */}
|
|
<View style={styles.cardHeaderRow}>
|
|
<View style={styles.cardHeaderLeft}>
|
|
<View style={styles.bankIconCircle}>
|
|
<ClipboardIcon size={22} color={colors.primary} />
|
|
</View>
|
|
<View style={styles.cardTitleGroup}>
|
|
<Text style={styles.bankName} numberOfLines={1}>
|
|
{account.bankName}
|
|
</Text>
|
|
<Text style={styles.holderName} numberOfLines={1}>
|
|
{account.accountHolderName}
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
|
|
{/* Status Badges */}
|
|
<View style={styles.badgeRow}>
|
|
{account.isDefault && (
|
|
<View style={styles.defaultBadge}>
|
|
<Text style={styles.defaultBadgeText}>DEFAULT</Text>
|
|
</View>
|
|
)}
|
|
<View
|
|
style={
|
|
account.isVerified
|
|
? styles.verifiedBadge
|
|
: styles.unverifiedBadge
|
|
}
|
|
>
|
|
<Text
|
|
style={
|
|
account.isVerified
|
|
? styles.verifiedBadgeText
|
|
: styles.unverifiedBadgeText
|
|
}
|
|
>
|
|
{account.isVerified ? 'VERIFIED' : 'PENDING'}
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
</View>
|
|
|
|
<View style={styles.divider} />
|
|
|
|
{/* Fields Grid */}
|
|
<View style={styles.fieldsGrid}>
|
|
<View style={styles.fieldItem}>
|
|
<Text style={styles.fieldLabel}>Account Number</Text>
|
|
<Text style={styles.fieldValueMasked}>
|
|
{maskAccountNumber(account.accountNumber)}
|
|
</Text>
|
|
</View>
|
|
|
|
<View style={styles.fieldItem}>
|
|
<Text style={styles.fieldLabel}>IFSC Code</Text>
|
|
<Text style={styles.fieldValue}>
|
|
{account.ifscCode || '—'}
|
|
</Text>
|
|
</View>
|
|
|
|
{account.branchName ? (
|
|
<View style={styles.fieldItem}>
|
|
<Text style={styles.fieldLabel}>Branch</Text>
|
|
<Text style={styles.fieldValue} numberOfLines={1}>
|
|
{account.branchName}
|
|
</Text>
|
|
</View>
|
|
) : null}
|
|
|
|
<View style={styles.fieldItem}>
|
|
<Text style={styles.fieldLabel}>Owner Type</Text>
|
|
<Text style={styles.fieldValue}>
|
|
{account.ownerType || '—'}
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
|
|
<View style={styles.divider} />
|
|
|
|
{/* Card Footer */}
|
|
<View style={styles.cardFooter}>
|
|
<Text style={styles.addedAtText}>
|
|
Added {formatDate(account.createdAt)}
|
|
</Text>
|
|
{account.isVerified && (
|
|
<CheckCircleIcon size={16} color={colors.success} />
|
|
)}
|
|
</View>
|
|
</View>
|
|
</View>
|
|
))}
|
|
</>
|
|
)}
|
|
|
|
{/* Add Bank Account Button */}
|
|
<TouchableOpacity
|
|
style={styles.addButton}
|
|
onPress={handleAddAccount}
|
|
activeOpacity={0.8}
|
|
>
|
|
<View style={styles.addButtonIcon}>
|
|
<Text style={styles.addButtonIconText}>+</Text>
|
|
</View>
|
|
<Text style={styles.addButtonText}>Add Bank Account</Text>
|
|
</TouchableOpacity>
|
|
</ScrollView>
|
|
</View>
|
|
);
|
|
};
|
|
|
|
export default BankDetailsScreen;
|