import React from 'react'; import { View, Text, StyleSheet, TouchableOpacity, Modal, Dimensions, Platform, } from 'react-native'; import { MaterialIcons } from '@expo/vector-icons'; import { useTheme } from '../contexts/ThemeContext'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import * as Haptics from 'expo-haptics'; import AndroidUpdatePopup from './AndroidUpdatePopup'; const { width, height } = Dimensions.get('window'); interface UpdatePopupProps { visible: boolean; updateInfo: { isAvailable: boolean; manifest?: { id?: string; version?: string; description?: string; }; }; onUpdateNow: () => void; onUpdateLater: () => void; onDismiss: () => void; isInstalling?: boolean; } const UpdatePopup: React.FC = ({ visible, updateInfo, onUpdateNow, onUpdateLater, onDismiss, isInstalling = false, }) => { const { currentTheme } = useTheme(); const insets = useSafeAreaInsets(); const getReleaseNotes = () => { const manifest: any = updateInfo?.manifest || {}; return ( manifest.description || manifest.releaseNotes || manifest.extra?.releaseNotes || manifest.metadata?.releaseNotes || '' ); }; const handleUpdateNow = () => { if (Platform.OS === 'ios') { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); } onUpdateNow(); }; const handleUpdateLater = () => { if (Platform.OS === 'ios') { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); } onUpdateLater(); }; const handleDismiss = () => { if (Platform.OS === 'ios') { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); } onDismiss(); }; if (!visible || !updateInfo.isAvailable) { return null; } // Completely disable popup on Android if (Platform.OS === 'android') { return null; } // iOS implementation with full features return ( {/* Header */} Update Available A new version of Nuvio is ready to install {/* Update Info */} Version: {updateInfo.manifest?.id || 'Latest'} {!!getReleaseNotes() && ( {getReleaseNotes()} )} {/* Actions */} {isInstalling ? ( <> Installing... ) : ( <> Update Now )} Later Dismiss ); }; const styles = StyleSheet.create({ overlay: { flex: 1, backgroundColor: 'rgba(0, 0, 0, 0.8)', justifyContent: 'center', alignItems: 'center', paddingHorizontal: 20, }, popup: { width: Math.min(width - 40, 400), borderRadius: 20, borderWidth: 1, backgroundColor: '#1a1a1a', // Solid background - not transparent ...(Platform.OS === 'ios' ? { shadowColor: '#000', shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.5, shadowRadius: 20, } : { elevation: 15, }), overflow: 'hidden', }, header: { alignItems: 'center', paddingHorizontal: 24, paddingTop: 32, paddingBottom: 20, }, iconContainer: { width: 64, height: 64, borderRadius: 32, alignItems: 'center', justifyContent: 'center', marginBottom: 16, }, title: { fontSize: 24, fontWeight: '700', letterSpacing: 0.3, marginBottom: 8, textAlign: 'center', }, subtitle: { fontSize: 16, textAlign: 'center', lineHeight: 22, }, updateInfo: { paddingHorizontal: 24, paddingBottom: 20, }, infoRow: { flexDirection: 'row', alignItems: 'flex-start', marginBottom: 12, }, infoLabel: { fontSize: 14, fontWeight: '500', marginLeft: 8, marginRight: 8, marginTop: 2, minWidth: 60, }, infoValue: { fontSize: 14, fontWeight: '600', flex: 1, lineHeight: 20, }, descriptionContainer: { marginTop: 8, padding: 12, borderRadius: 8, backgroundColor: 'rgba(255, 255, 255, 0.15)', }, description: { fontSize: 14, lineHeight: 20, }, actions: { paddingHorizontal: 24, paddingBottom: 20, }, button: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', paddingVertical: 14, paddingHorizontal: 20, borderRadius: 12, gap: 8, marginBottom: 12, }, primaryButton: { ...(Platform.OS === 'ios' ? { shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.2, shadowRadius: 8, } : { elevation: 4, }), }, secondaryButton: { borderWidth: 1, flex: 1, marginHorizontal: 4, }, disabledButton: { opacity: 0.6, }, buttonText: { color: 'white', fontSize: 16, fontWeight: '600', letterSpacing: 0.3, }, secondaryActions: { flexDirection: 'row', gap: 8, }, secondaryButtonText: { fontSize: 15, fontWeight: '500', }, footer: { paddingHorizontal: 24, paddingBottom: 24, alignItems: 'center', }, footerText: { fontSize: 12, textAlign: 'center', opacity: 0.7, }, }); export default UpdatePopup;