Files
pwap/mobile/src/screens/IdentityScreen.tsx
T
pezkuwichain 40bc15f1f9 Fix all ESLint errors in mobile app (157 errors -> 0)
Major fixes:
- Replace `any` types with proper TypeScript types across all files
- Convert require() imports to ES module imports
- Add __DEV__ guards to console statements
- Escape special characters in JSX (' and ")
- Fix unused variables (prefix with _ or remove)
- Fix React hooks violations (useCallback, useMemo patterns)
- Convert wasm-crypto-shim.js to TypeScript
- Add eslint-disable comments for valid setState patterns

Files affected: 50+ screens, components, contexts, and services

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 02:55:03 +03:00

1072 lines
29 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React, { useState, useEffect, useCallback } from 'react';
import {
View,
Text,
TouchableOpacity,
StyleSheet,
SafeAreaView,
ScrollView,
StatusBar,
ActivityIndicator,
RefreshControl,
} from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
import { useNavigation } from '@react-navigation/native';
import { KurdistanColors } from '../theme/colors';
import { usePezkuwi } from '../contexts/PezkuwiContext';
import {
fetchUserTikiNFTs,
getCitizenNFTDetails,
ROLE_CATEGORIES,
type TikiNFTDetails,
} from '../../shared/lib/tiki';
/**
* Identity Screen
*
* Shows user's digital identity:
* - Citizens: Welati NFT card + other role NFTs
* - Visitors: Digital Kurdistan State Visa Card + any NFTs they have
*/
const IdentityScreen: React.FC = () => {
const navigation = useNavigation();
const { api, isApiReady, selectedAccount } = usePezkuwi();
// Choice state
const [userChoice, setUserChoice] = useState<'citizen' | 'visitor' | null>(null);
// Loading & data state
const [loading, setLoading] = useState(false);
const [refreshing, setRefreshing] = useState(false);
const [citizenNFT, setCitizenNFT] = useState<TikiNFTDetails | null>(null);
const [otherNFTs, setOtherNFTs] = useState<TikiNFTDetails[]>([]);
const [citizenCheckDone, setCitizenCheckDone] = useState(false);
const [isActuallyCitizen, setIsActuallyCitizen] = useState(false);
const fetchNFTData = useCallback(async () => {
if (!api || !isApiReady || !selectedAccount) {
setLoading(false);
return;
}
try {
setLoading(true);
// Fetch citizen NFT
const citizenDetails = await getCitizenNFTDetails(api, selectedAccount.address);
setCitizenNFT(citizenDetails);
setIsActuallyCitizen(!!citizenDetails);
// Fetch all tiki NFTs
const allTikis = await fetchUserTikiNFTs(api, selectedAccount.address);
// Filter out Welati from other NFTs (it's shown separately)
const others = allTikis.filter(nft => nft.tikiRole !== 'Welati');
setOtherNFTs(others);
setCitizenCheckDone(true);
} catch (error) {
if (__DEV__) console.error('[Identity] Error fetching NFTs:', error);
} finally {
setLoading(false);
setRefreshing(false);
}
}, [api, isApiReady, selectedAccount]);
// Fetch data when user makes a choice
useEffect(() => {
if (userChoice && selectedAccount) {
fetchNFTData();
}
}, [userChoice, selectedAccount, fetchNFTData]);
const onRefresh = () => {
setRefreshing(true);
fetchNFTData();
};
// Get category for a tiki
const getTikiCategory = (tiki: string): string => {
for (const [category, roles] of Object.entries(ROLE_CATEGORIES)) {
if (roles.includes(tiki)) {
return category;
}
}
return 'Other';
};
// Format address
const formatAddress = (address: string) => {
return `${address.slice(0, 8)}...${address.slice(-6)}`;
};
// Generate visa number from address
const generateVisaNumber = (address: string) => {
const hash = address.slice(2, 10).toUpperCase();
return `VIS-${hash}-KRD`;
};
// No wallet connected
if (!selectedAccount) {
return (
<SafeAreaView style={styles.container}>
<StatusBar barStyle="light-content" />
<LinearGradient
colors={[KurdistanColors.kesk, KurdistanColors.zer, KurdistanColors.sor]}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 1 }}
style={styles.noWalletContainer}
>
<View style={styles.noWalletContent}>
<Text style={styles.noWalletIcon}>🔗</Text>
<Text style={styles.noWalletTitle}>Wallet Required</Text>
<Text style={styles.noWalletText}>
Please connect your wallet to view your digital identity.
</Text>
<TouchableOpacity
style={styles.connectButton}
onPress={() => navigation.navigate('Wallet' as never)}
>
<Text style={styles.connectButtonText}>Connect Wallet</Text>
</TouchableOpacity>
</View>
</LinearGradient>
</SafeAreaView>
);
}
// Choice screen - Ask if citizen or visitor
if (!userChoice) {
return (
<SafeAreaView style={styles.container}>
<StatusBar barStyle="light-content" />
<LinearGradient
colors={[KurdistanColors.kesk, KurdistanColors.zer, KurdistanColors.sor]}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 1 }}
style={styles.choiceContainer}
>
<View style={styles.choiceContent}>
<Text style={styles.choiceIcon}>🆔</Text>
<Text style={styles.choiceTitle}>Nasnameya Dîjîtal</Text>
<Text style={styles.choiceSubtitle}>Digital Identity</Text>
<Text style={styles.choiceQuestion}>Hûn welatî ne?</Text>
<Text style={styles.choiceQuestionEn}>Are you a citizen?</Text>
<View style={styles.choiceCards}>
<TouchableOpacity
style={styles.choiceCard}
onPress={() => setUserChoice('citizen')}
activeOpacity={0.8}
>
<View style={[styles.choiceCardIcon, { backgroundColor: KurdistanColors.kesk }]}>
<Text style={styles.choiceCardEmoji}>👤</Text>
</View>
<Text style={styles.choiceCardTitle}>Ez welatî me</Text>
<Text style={styles.choiceCardSubtitle}>I am a citizen</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.choiceCard}
onPress={() => setUserChoice('visitor')}
activeOpacity={0.8}
>
<View style={[styles.choiceCardIcon, { backgroundColor: KurdistanColors.zer }]}>
<Text style={styles.choiceCardEmoji}>🌍</Text>
</View>
<Text style={styles.choiceCardTitle}>Ez ne welatî me</Text>
<Text style={styles.choiceCardSubtitle}>Not a citizen</Text>
</TouchableOpacity>
</View>
</View>
</LinearGradient>
</SafeAreaView>
);
}
// Main content after choice
return (
<SafeAreaView style={styles.container}>
<StatusBar barStyle="light-content" />
<ScrollView
style={styles.content}
contentContainerStyle={styles.contentContainer}
refreshControl={
<RefreshControl refreshing={refreshing} onRefresh={onRefresh} />
}
>
{loading ? (
<View style={styles.loadingContainer}>
<ActivityIndicator size="large" color={KurdistanColors.kesk} />
<Text style={styles.loadingText}>Loading your identity...</Text>
</View>
) : (
<>
{/* Wallet Address Card */}
<View style={styles.walletCard}>
<Text style={styles.walletLabel}>Connected Wallet</Text>
<Text style={styles.walletAddress}>{formatAddress(selectedAccount.address)}</Text>
</View>
{/* CITIZEN PATH */}
{userChoice === 'citizen' && (
<>
{citizenCheckDone && !isActuallyCitizen ? (
// User selected citizen but doesn't have Welati
<View style={styles.notCitizenAlert}>
<Text style={styles.notCitizenIcon}></Text>
<Text style={styles.notCitizenTitle}>Citizenship Not Found</Text>
<Text style={styles.notCitizenText}>
We couldn&apos;t find a Welati (citizen) NFT for this wallet.
Please apply for citizenship to get your digital identity.
</Text>
<TouchableOpacity
style={styles.applyButton}
onPress={() => navigation.navigate('BeCitizen' as never)}
>
<Text style={styles.applyButtonText}>Apply for Citizenship</Text>
</TouchableOpacity>
</View>
) : citizenNFT ? (
// Citizen NFT Card
<View style={styles.citizenCard}>
<LinearGradient
colors={[KurdistanColors.kesk, KurdistanColors.zer]}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 1 }}
style={styles.citizenCardGradient}
>
<View style={styles.citizenCardInner}>
<View style={styles.nftBadge}>
<Text style={styles.nftBadgeText}>NFT</Text>
</View>
<View style={styles.citizenIconContainer}>
<Text style={styles.citizenIcon}>👤</Text>
</View>
<Text style={styles.citizenTitle}>WELATI</Text>
<Text style={styles.citizenSubtitle}>Citizen of Digital Kurdistan</Text>
<View style={styles.citizenDetails}>
<View style={styles.detailRow}>
<Text style={styles.detailLabel}>Collection ID</Text>
<Text style={styles.detailValue}>#{citizenNFT.collectionId}</Text>
</View>
<View style={styles.detailRow}>
<Text style={styles.detailLabel}>Item ID</Text>
<Text style={styles.detailValue}>#{citizenNFT.itemId}</Text>
</View>
<View style={styles.detailRow}>
<Text style={styles.detailLabel}>Score Bonus</Text>
<Text style={styles.detailValue}>+{citizenNFT.tikiScore}</Text>
</View>
</View>
<View style={styles.verifiedBadge}>
<Text style={styles.verifiedText}> Verified Citizen</Text>
</View>
</View>
</LinearGradient>
</View>
) : null}
</>
)}
{/* VISITOR PATH - Digital Kurdistan State Visa Card */}
{userChoice === 'visitor' && (
<View style={styles.visaCard}>
<LinearGradient
colors={['#1a237e', '#283593', '#3949ab']}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 1 }}
style={styles.visaCardGradient}
>
<View style={styles.visaCardInner}>
{/* Top Banner */}
<View style={styles.visaTopBanner}>
<Text style={styles.visaCountryName}>KOMARA DÎJÎTAL A KURDISTANÊ</Text>
<Text style={styles.visaCountryNameEn}>DIGITAL REPUBLIC OF KURDISTAN</Text>
</View>
{/* Visa Type */}
<View style={styles.visaTypeBadge}>
<Text style={styles.visaTypeText}>STATE VISA</Text>
</View>
{/* Kurdistan Flag Colors Bar */}
<View style={styles.visaFlagBar}>
<View style={[styles.visaFlagStripe, { backgroundColor: KurdistanColors.sor }]} />
<View style={[styles.visaFlagStripe, { backgroundColor: KurdistanColors.spi }]} />
<View style={[styles.visaFlagStripe, { backgroundColor: KurdistanColors.kesk }]} />
</View>
{/* Photo placeholder with globe */}
<View style={styles.visaPhotoContainer}>
<Text style={styles.visaPhotoEmoji}>🌍</Text>
</View>
{/* Visa Details */}
<View style={styles.visaDetails}>
<View style={styles.visaDetailRow}>
<Text style={styles.visaDetailLabel}>VISA NUMBER</Text>
<Text style={styles.visaDetailValue}>
{generateVisaNumber(selectedAccount.address)}
</Text>
</View>
<View style={styles.visaDetailRow}>
<Text style={styles.visaDetailLabel}>STATUS</Text>
<Text style={styles.visaDetailValue}>VISITOR</Text>
</View>
<View style={styles.visaDetailRow}>
<Text style={styles.visaDetailLabel}>WALLET</Text>
<Text style={[styles.visaDetailValue, { fontSize: 11 }]}>
{formatAddress(selectedAccount.address)}
</Text>
</View>
<View style={styles.visaDetailRow}>
<Text style={styles.visaDetailLabel}>ACCESS LEVEL</Text>
<Text style={styles.visaDetailValue}>LIMITED</Text>
</View>
</View>
{/* Sun emblem */}
<View style={styles.visaSunEmblem}>
<Text style={styles.visaSunText}></Text>
</View>
{/* Bottom info */}
<View style={styles.visaBottom}>
<Text style={styles.visaBottomText}>
This visa grants limited access to Digital Kurdistan services.
</Text>
<Text style={styles.visaBottomText}>
Apply for citizenship for full access.
</Text>
</View>
</View>
</LinearGradient>
{/* Become Citizen CTA */}
<TouchableOpacity
style={styles.upgradeButton}
onPress={() => navigation.navigate('BeCitizen' as never)}
>
<Text style={styles.upgradeButtonText}>Upgrade to Citizenship</Text>
</TouchableOpacity>
</View>
)}
{/* Other Tikis Section */}
<View style={styles.sectionHeader}>
<Text style={styles.sectionTitle}>Tikiyên Din / Other NFTs</Text>
<Text style={styles.sectionCount}>{otherNFTs.length} NFT</Text>
</View>
{otherNFTs.length === 0 ? (
<View style={styles.noOtherNFTs}>
<Text style={styles.noOtherText}>
{userChoice === 'citizen'
? 'No other role NFTs yet. Participate in governance, get elected, or earn roles to receive more tikis.'
: 'No NFTs found. As a visitor, you can still explore the ecosystem. Consider applying for citizenship to unlock more features.'}
</Text>
</View>
) : (
<View style={styles.nftGrid}>
{otherNFTs.map((nft, index) => (
<View key={`${nft.tikiRole}-${index}`} style={styles.nftCard}>
<View style={[styles.nftCardHeader, { backgroundColor: nft.tikiColor }]}>
<Text style={styles.nftCardEmoji}>{nft.tikiEmoji}</Text>
</View>
<View style={styles.nftCardBody}>
<Text style={styles.nftCardRole}>{nft.tikiRole}</Text>
<Text style={styles.nftCardName}>{nft.tikiDisplayName}</Text>
<View style={styles.nftCardCategory}>
<Text style={styles.nftCardCategoryText}>
{getTikiCategory(nft.tikiRole)}
</Text>
</View>
<Text style={styles.nftCardScore}>+{nft.tikiScore} pts</Text>
</View>
</View>
))}
</View>
)}
{/* Total Score - only show if has NFTs */}
{(citizenNFT || otherNFTs.length > 0) && (
<View style={styles.totalScoreCard}>
<Text style={styles.totalScoreLabel}>Total Tiki Score</Text>
<Text style={styles.totalScoreValue}>
{(citizenNFT?.tikiScore || 0) + otherNFTs.reduce((sum, nft) => sum + nft.tikiScore, 0)}
</Text>
<Text style={styles.totalScoreSubtext}>
{(citizenNFT ? 1 : 0) + otherNFTs.length} NFT{(citizenNFT ? 1 : 0) + otherNFTs.length !== 1 ? 's' : ''} total
</Text>
</View>
)}
{/* Info Section */}
<View style={styles.infoSection}>
<Text style={styles.infoTitle}>About Digital Identity</Text>
<Text style={styles.infoText}>
{userChoice === 'citizen' ? (
<>
Your Welati NFT is your digital citizenship in the Digital Republic of Kurdistan.
It grants you voting rights, access to governance, and participation in the ecosystem.
{'\n\n'}
Additional role NFTs (Tikis) represent your achievements and positions within the republic.
</>
) : (
<>
As a visitor, you have limited access to Digital Kurdistan services.
Your State Visa allows basic exploration of the ecosystem.
{'\n\n'}
To unlock full benefits including voting rights, governance participation,
and exclusive services, consider applying for citizenship.
</>
)}
</Text>
</View>
</>
)}
</ScrollView>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#F5F5F5',
},
// No Wallet
noWalletContainer: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
noWalletContent: {
backgroundColor: 'rgba(255,255,255,0.95)',
borderRadius: 24,
padding: 32,
margin: 24,
alignItems: 'center',
boxShadow: '0px 8px 24px rgba(0, 0, 0, 0.2)',
elevation: 10,
},
noWalletIcon: {
fontSize: 64,
marginBottom: 16,
},
noWalletTitle: {
fontSize: 24,
fontWeight: 'bold',
color: KurdistanColors.reş,
marginBottom: 12,
},
noWalletText: {
fontSize: 14,
color: '#666',
textAlign: 'center',
marginBottom: 24,
lineHeight: 22,
},
connectButton: {
backgroundColor: KurdistanColors.kesk,
paddingHorizontal: 32,
paddingVertical: 14,
borderRadius: 12,
marginBottom: 12,
},
connectButtonText: {
color: KurdistanColors.spi,
fontSize: 16,
fontWeight: 'bold',
},
backButton: {
padding: 12,
},
backButtonText: {
color: KurdistanColors.kesk,
fontSize: 16,
},
// Choice Screen
choiceContainer: {
flex: 1,
},
choiceBackButton: {
position: 'absolute',
top: 50,
left: 20,
zIndex: 10,
padding: 8,
},
choiceBackText: {
fontSize: 16,
color: KurdistanColors.spi,
fontWeight: '600',
},
choiceContent: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
padding: 24,
},
choiceIcon: {
fontSize: 64,
marginBottom: 16,
},
choiceTitle: {
fontSize: 28,
fontWeight: 'bold',
color: KurdistanColors.spi,
marginBottom: 4,
},
choiceSubtitle: {
fontSize: 16,
color: 'rgba(255,255,255,0.8)',
marginBottom: 40,
},
choiceQuestion: {
fontSize: 22,
fontWeight: '600',
color: KurdistanColors.spi,
marginBottom: 4,
},
choiceQuestionEn: {
fontSize: 16,
color: 'rgba(255,255,255,0.8)',
marginBottom: 32,
},
choiceCards: {
flexDirection: 'row',
gap: 16,
},
choiceCard: {
backgroundColor: 'rgba(255,255,255,0.95)',
borderRadius: 20,
padding: 24,
alignItems: 'center',
width: 150,
boxShadow: '0px 4px 12px rgba(0, 0, 0, 0.2)',
elevation: 6,
},
choiceCardIcon: {
width: 60,
height: 60,
borderRadius: 30,
justifyContent: 'center',
alignItems: 'center',
marginBottom: 12,
},
choiceCardEmoji: {
fontSize: 32,
},
choiceCardTitle: {
fontSize: 14,
fontWeight: 'bold',
color: KurdistanColors.reş,
textAlign: 'center',
marginBottom: 4,
},
choiceCardSubtitle: {
fontSize: 12,
color: '#666',
textAlign: 'center',
},
// Header
header: {
paddingTop: 20,
paddingBottom: 30,
paddingHorizontal: 20,
position: 'relative',
overflow: 'hidden',
},
headerBackButton: {
position: 'absolute',
top: 20,
left: 16,
zIndex: 10,
padding: 8,
},
headerBackText: {
fontSize: 24,
color: KurdistanColors.spi,
},
headerContent: {
alignItems: 'center',
marginTop: 10,
},
headerIcon: {
fontSize: 48,
marginBottom: 8,
},
headerTitle: {
fontSize: 24,
fontWeight: 'bold',
color: KurdistanColors.spi,
marginBottom: 4,
},
headerSubtitle: {
fontSize: 14,
color: 'rgba(255,255,255,0.8)',
},
// Sun decoration
sunDecoration: {
position: 'absolute',
right: -30,
top: -30,
width: 120,
height: 120,
opacity: 0.2,
},
sunCenter: {
position: 'absolute',
width: 40,
height: 40,
borderRadius: 20,
backgroundColor: KurdistanColors.zer,
left: 40,
top: 40,
},
sunRay: {
position: 'absolute',
width: 3,
height: 60,
backgroundColor: KurdistanColors.zer,
left: 58,
top: 0,
transformOrigin: 'center bottom',
},
// Content
content: {
flex: 1,
},
contentContainer: {
padding: 16,
paddingBottom: 40,
},
// Loading
loadingContainer: {
padding: 60,
alignItems: 'center',
},
loadingText: {
marginTop: 16,
color: '#666',
},
// Wallet Card
walletCard: {
backgroundColor: KurdistanColors.spi,
borderRadius: 12,
padding: 16,
marginBottom: 20,
boxShadow: '0px 2px 4px rgba(0, 0, 0, 0.05)',
elevation: 2,
},
walletLabel: {
fontSize: 12,
color: '#666',
marginBottom: 4,
},
walletAddress: {
fontSize: 16,
fontFamily: 'monospace',
color: KurdistanColors.reş,
fontWeight: '600',
},
// Not Citizen Alert
notCitizenAlert: {
backgroundColor: '#FFF3E0',
borderRadius: 16,
padding: 24,
alignItems: 'center',
marginBottom: 24,
borderWidth: 1,
borderColor: '#FFB74D',
},
notCitizenIcon: {
fontSize: 48,
marginBottom: 12,
},
notCitizenTitle: {
fontSize: 18,
fontWeight: 'bold',
color: '#E65100',
marginBottom: 8,
},
notCitizenText: {
fontSize: 14,
color: '#666',
textAlign: 'center',
marginBottom: 20,
lineHeight: 22,
},
applyButton: {
backgroundColor: KurdistanColors.kesk,
paddingHorizontal: 24,
paddingVertical: 12,
borderRadius: 10,
},
applyButtonText: {
color: KurdistanColors.spi,
fontWeight: 'bold',
fontSize: 14,
},
// Citizen Card
citizenCard: {
borderRadius: 20,
overflow: 'hidden',
marginBottom: 24,
boxShadow: '0px 8px 24px rgba(0, 128, 0, 0.2)',
elevation: 8,
},
citizenCardGradient: {
padding: 3,
},
citizenCardInner: {
backgroundColor: KurdistanColors.spi,
borderRadius: 17,
padding: 24,
alignItems: 'center',
},
nftBadge: {
position: 'absolute',
top: 16,
right: 16,
backgroundColor: KurdistanColors.kesk,
paddingHorizontal: 10,
paddingVertical: 4,
borderRadius: 8,
},
nftBadgeText: {
color: KurdistanColors.spi,
fontSize: 10,
fontWeight: 'bold',
},
citizenIconContainer: {
width: 80,
height: 80,
borderRadius: 40,
backgroundColor: `${KurdistanColors.kesk}15`,
justifyContent: 'center',
alignItems: 'center',
marginBottom: 16,
borderWidth: 3,
borderColor: KurdistanColors.kesk,
},
citizenIcon: {
fontSize: 40,
},
citizenTitle: {
fontSize: 28,
fontWeight: 'bold',
color: KurdistanColors.kesk,
letterSpacing: 4,
marginBottom: 4,
},
citizenSubtitle: {
fontSize: 14,
color: '#666',
marginBottom: 20,
},
citizenDetails: {
width: '100%',
backgroundColor: '#F8F9FA',
borderRadius: 12,
padding: 16,
marginBottom: 16,
},
detailRow: {
flexDirection: 'row',
justifyContent: 'space-between',
paddingVertical: 8,
borderBottomWidth: 1,
borderBottomColor: '#E0E0E0',
},
detailLabel: {
fontSize: 14,
color: '#666',
},
detailValue: {
fontSize: 14,
fontWeight: '600',
color: KurdistanColors.reş,
},
verifiedBadge: {
backgroundColor: '#E8F5E9',
paddingHorizontal: 20,
paddingVertical: 10,
borderRadius: 20,
},
verifiedText: {
color: KurdistanColors.kesk,
fontWeight: 'bold',
fontSize: 14,
},
// Visa Card
visaCard: {
marginBottom: 24,
},
visaCardGradient: {
borderRadius: 20,
padding: 2,
},
visaCardInner: {
backgroundColor: '#1a237e',
borderRadius: 18,
padding: 20,
alignItems: 'center',
},
visaTopBanner: {
alignItems: 'center',
marginBottom: 16,
},
visaCountryName: {
fontSize: 12,
fontWeight: 'bold',
color: KurdistanColors.zer,
letterSpacing: 1,
},
visaCountryNameEn: {
fontSize: 10,
color: 'rgba(255,255,255,0.7)',
letterSpacing: 0.5,
},
visaTypeBadge: {
backgroundColor: KurdistanColors.sor,
paddingHorizontal: 20,
paddingVertical: 6,
borderRadius: 4,
marginBottom: 16,
},
visaTypeText: {
color: KurdistanColors.spi,
fontWeight: 'bold',
fontSize: 14,
letterSpacing: 2,
},
visaFlagBar: {
flexDirection: 'row',
width: '100%',
height: 6,
borderRadius: 3,
overflow: 'hidden',
marginBottom: 20,
},
visaFlagStripe: {
flex: 1,
},
visaPhotoContainer: {
width: 80,
height: 80,
borderRadius: 40,
backgroundColor: 'rgba(255,255,255,0.1)',
justifyContent: 'center',
alignItems: 'center',
marginBottom: 20,
borderWidth: 2,
borderColor: 'rgba(255,255,255,0.3)',
},
visaPhotoEmoji: {
fontSize: 40,
},
visaDetails: {
width: '100%',
backgroundColor: 'rgba(255,255,255,0.1)',
borderRadius: 12,
padding: 16,
marginBottom: 16,
},
visaDetailRow: {
flexDirection: 'row',
justifyContent: 'space-between',
paddingVertical: 6,
borderBottomWidth: 1,
borderBottomColor: 'rgba(255,255,255,0.1)',
},
visaDetailLabel: {
fontSize: 10,
color: 'rgba(255,255,255,0.6)',
fontWeight: '600',
},
visaDetailValue: {
fontSize: 12,
color: KurdistanColors.spi,
fontWeight: 'bold',
fontFamily: 'monospace',
},
visaSunEmblem: {
marginBottom: 16,
},
visaSunText: {
fontSize: 32,
},
visaBottom: {
alignItems: 'center',
},
visaBottomText: {
fontSize: 10,
color: 'rgba(255,255,255,0.5)',
textAlign: 'center',
},
upgradeButton: {
backgroundColor: KurdistanColors.kesk,
padding: 16,
borderRadius: 12,
alignItems: 'center',
marginTop: 12,
},
upgradeButtonText: {
color: KurdistanColors.spi,
fontWeight: 'bold',
fontSize: 16,
},
// Section Header
sectionHeader: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
marginBottom: 12,
marginTop: 8,
},
sectionTitle: {
fontSize: 18,
fontWeight: 'bold',
color: KurdistanColors.reş,
},
sectionCount: {
fontSize: 14,
color: '#666',
},
// No Other NFTs
noOtherNFTs: {
backgroundColor: KurdistanColors.spi,
borderRadius: 12,
padding: 24,
marginBottom: 24,
},
noOtherText: {
fontSize: 14,
color: '#666',
textAlign: 'center',
lineHeight: 22,
},
// NFT Grid
nftGrid: {
flexDirection: 'row',
flexWrap: 'wrap',
gap: 12,
marginBottom: 24,
},
nftCard: {
width: '48%',
backgroundColor: KurdistanColors.spi,
borderRadius: 16,
overflow: 'hidden',
boxShadow: '0px 2px 8px rgba(0, 0, 0, 0.08)',
elevation: 3,
},
nftCardHeader: {
padding: 16,
alignItems: 'center',
},
nftCardEmoji: {
fontSize: 36,
},
nftCardBody: {
padding: 12,
alignItems: 'center',
},
nftCardRole: {
fontSize: 12,
fontWeight: 'bold',
color: KurdistanColors.kesk,
marginBottom: 2,
},
nftCardName: {
fontSize: 13,
color: KurdistanColors.reş,
textAlign: 'center',
marginBottom: 8,
},
nftCardCategory: {
backgroundColor: '#F0F0F0',
paddingHorizontal: 8,
paddingVertical: 2,
borderRadius: 4,
marginBottom: 8,
},
nftCardCategoryText: {
fontSize: 10,
color: '#666',
},
nftCardScore: {
fontSize: 14,
fontWeight: 'bold',
color: KurdistanColors.zer,
},
// Total Score
totalScoreCard: {
backgroundColor: KurdistanColors.kesk,
borderRadius: 16,
padding: 24,
alignItems: 'center',
marginBottom: 24,
},
totalScoreLabel: {
fontSize: 14,
color: 'rgba(255,255,255,0.8)',
marginBottom: 8,
},
totalScoreValue: {
fontSize: 48,
fontWeight: 'bold',
color: KurdistanColors.spi,
},
totalScoreSubtext: {
fontSize: 14,
color: 'rgba(255,255,255,0.8)',
marginTop: 4,
},
// Info Section
infoSection: {
backgroundColor: KurdistanColors.spi,
borderRadius: 16,
padding: 20,
},
infoTitle: {
fontSize: 16,
fontWeight: 'bold',
color: KurdistanColors.reş,
marginBottom: 12,
},
infoText: {
fontSize: 14,
color: '#666',
lineHeight: 22,
},
});
export default IdentityScreen;