import React, { useEffect, useRef } from 'react'; import { Animated, Text, StyleSheet, View } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { useColors } from '../constants/Colors'; import { ColorPalette } from '../types'; interface ToastProps { message: string; isVisible: boolean; onClose: () => void; isDark?: boolean; colorPalette?: ColorPalette; } export const Toast: React.FC = ({ message, isVisible, onClose, isDark = false, colorPalette = 'forest', }) => { const colors = useColors(isDark, colorPalette); const opacity = useRef(new Animated.Value(0)).current; const translateY = useRef(new Animated.Value(20)).current; useEffect(() => { if (isVisible) { Animated.parallel([ Animated.timing(opacity, { toValue: 1, duration: 300, useNativeDriver: true }), Animated.timing(translateY, { toValue: 0, duration: 300, useNativeDriver: true }), ]).start(); const timer = setTimeout(() => { Animated.parallel([ Animated.timing(opacity, { toValue: 0, duration: 300, useNativeDriver: true }), Animated.timing(translateY, { toValue: 20, duration: 300, useNativeDriver: true }), ]).start(() => onClose()); }, 3000); return () => clearTimeout(timer); } }, [isVisible]); if (!isVisible) return null; return ( {message} ); }; const styles = StyleSheet.create({ container: { position: 'absolute', bottom: 100, left: 0, right: 0, alignItems: 'center', zIndex: 70, pointerEvents: 'none', }, toast: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 16, paddingVertical: 12, borderRadius: 24, shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.2, shadowRadius: 8, elevation: 8, }, text: { fontSize: 13, fontWeight: '500' }, });