import React, { useEffect, useRef } from "react"; import { Animated, Pressable, Text, View } from "react-native"; import { useTheme } from "../../contexts/ThemeContext"; interface IncomingToastProps { sessionName: string; preview: string; onTap: () => void; onDismiss: () => void; } const DISPLAY_MS = 4000; export function IncomingToast({ sessionName, preview, onTap, onDismiss }: IncomingToastProps) { const { colors } = useTheme(); const opacity = useRef(new Animated.Value(0)).current; const translateY = useRef(new Animated.Value(-40)).current; useEffect(() => { // Slide in Animated.parallel([ Animated.timing(opacity, { toValue: 1, duration: 200, useNativeDriver: true }), Animated.timing(translateY, { toValue: 0, duration: 200, useNativeDriver: true }), ]).start(); // Auto-dismiss const timer = setTimeout(() => { Animated.parallel([ Animated.timing(opacity, { toValue: 0, duration: 200, useNativeDriver: true }), Animated.timing(translateY, { toValue: -40, duration: 200, useNativeDriver: true }), ]).start(() => onDismiss()); }, DISPLAY_MS); return () => clearTimeout(timer); }, []); return ( ({ flexDirection: "row", alignItems: "center", gap: 10, paddingHorizontal: 14, paddingVertical: 10, borderRadius: 12, backgroundColor: pressed ? colors.bgTertiary : colors.bgSecondary, borderWidth: 1, borderColor: colors.border, shadowColor: "#000", shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.25, shadowRadius: 4, elevation: 5, })} > {sessionName} {preview} tap to switch ); }