import React, { useState, useEffect } from 'react'; import { StyleSheet, TouchableOpacity, Animated, Easing, View, Text, Image, } from 'react-native'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import { colors, spacing, borderRadius, typography, shadows, iconSizes } from '../theme'; import { ChatbotModal } from './ChatbotModal'; const logo = require('../assets/ic_launcher_foreground.png'); export const FloatingAssistantButton: React.FC = () => { const [scaleValue] = useState(new Animated.Value(1)); const [pulseValue] = useState(new Animated.Value(1)); const [glowValue] = useState(new Animated.Value(0)); const [isChatbotVisible, setIsChatbotVisible] = useState(false); const [showLabel, setShowLabel] = useState(true); useEffect(() => { // Continuous pulse animation Animated.loop( Animated.sequence([ Animated.timing(pulseValue, { toValue: 1.15, duration: 1500, easing: Easing.inOut(Easing.ease), useNativeDriver: true, }), Animated.timing(pulseValue, { toValue: 1, duration: 1500, easing: Easing.inOut(Easing.ease), useNativeDriver: true, }), ]) ).start(); // Glow animation Animated.loop( Animated.sequence([ Animated.timing(glowValue, { toValue: 1, duration: 2000, easing: Easing.inOut(Easing.ease), useNativeDriver: true, }), Animated.timing(glowValue, { toValue: 0, duration: 2000, easing: Easing.inOut(Easing.ease), useNativeDriver: true, }), ]) ).start(); // Hide label after 5 seconds const timer = setTimeout(() => { setShowLabel(false); }, 5000); return () => clearTimeout(timer); }, [pulseValue, glowValue]); const handlePressIn = () => { Animated.spring(scaleValue, { toValue: 0.9, useNativeDriver: true, }).start(); }; const handlePressOut = () => { Animated.spring(scaleValue, { toValue: 1, friction: 3, tension: 40, useNativeDriver: true, }).start(); }; const handlePress = () => { setIsChatbotVisible(true); }; return ( <> {/* Pulse ring */} {/* Glow effect */} {/* Label */} {showLabel && ( Ask AI Assistant )} {/* Main button */} {/* Microphone indicator */} {/* Chatbot Modal */} setIsChatbotVisible(false)} /> ); }; const styles = StyleSheet.create({ pulseRing: { position: 'absolute', bottom: 90, right: 20, width: 76, height: 76, borderRadius: 38, backgroundColor: colors.highlight, }, glowRing: { position: 'absolute', bottom: 85, right: 15, width: 86, height: 86, borderRadius: 43, backgroundColor: colors.highlight, }, labelContainer: { position: 'absolute', bottom: 100, right: 100, }, label: { backgroundColor: colors.surfaceAlt, paddingHorizontal: spacing.lg, paddingVertical: spacing.md, borderRadius: borderRadius.lg, borderWidth: 2, borderColor: colors.border, ...shadows.md, }, labelText: { ...typography.caption, fontSize: 13, fontWeight: '700', color: colors.highlightAlt, }, labelArrow: { position: 'absolute', top: '50%', right: -6, width: 12, height: 12, marginTop: -6, backgroundColor: colors.surfaceAlt, borderRightWidth: 2, borderBottomWidth: 2, borderColor: colors.border, transform: [{ rotate: '-45deg' }], }, buttonContainer: { position: 'absolute', bottom: 90, right: 20, width: 72, height: 72, borderRadius: 36, }, button: { width: 72, height: 72, borderRadius: 36, backgroundColor: colors.highlight, alignItems: 'center', justifyContent: 'center', borderWidth: 3, borderColor: colors.highlightAlt, ...shadows.glowStrong, }, buttonLogo: { width: 48, height: 48, }, micIndicator: { position: 'absolute', bottom: 4, right: 4, width: 20, height: 20, borderRadius: 10, backgroundColor: '#4ADE80', borderWidth: 2, borderColor: colors.background, alignItems: 'center', justifyContent: 'center', }, });