import { FC, useRef, useState } from 'react'; import { FaChevronLeft, FaChevronRight } from 'react-icons/fa'; import { LocalizeText, MessengerFriend } from '../../../../api'; import { FriendBarItemView } from './FriendBarItemView'; import { motion, AnimatePresence } from 'framer-motion'; const MAX_DISPLAY_COUNT = 3; // Mirrored from Toolbar to keep physics identical const containerVariants = { hidden: {}, visible: { transition: { staggerChildren: 0.05 } }, exit: { transition: { staggerChildren: 0.03, staggerDirection: -1 as const } }, }; const itemVariants = { hidden: { opacity: 0, y: 10, scale: 0.8 }, visible: { opacity: 1, y: 0, scale: 1, transition: { type: 'spring', stiffness: 400, damping: 22 } }, exit: { opacity: 0, y: 6, scale: 0.85, transition: { duration: 0.1 } }, }; export const FriendBarView: FC<{ onlineFriends: MessengerFriend[]; requestsCount?: number }> = props => { const { onlineFriends = [], requestsCount = 0 } = props; const [ indexOffset, setIndexOffset ] = useState(0); const elementRef = useRef(null); const hasScrollableFriends = (onlineFriends.length > MAX_DISPLAY_COUNT); const visibleFriends = onlineFriends.slice(indexOffset, (indexOffset + MAX_DISPLAY_COUNT)); return ( { (requestsCount > 0) &&
{ requestsCount } { LocalizeText('friendbar.requests.title') }
}
{ if(indexOffset > 0) setIndexOffset(indexOffset - 1); } } >
{ visibleFriends.map(friend => ( )) } { (!onlineFriends.length && (requestsCount <= 0)) &&
Nessun amico online
}
MAX_DISPLAY_COUNT) && ((indexOffset + MAX_DISPLAY_COUNT) <= (onlineFriends.length - 1)))) ? 'opacity-30 cursor-not-allowed' : 'cursor-pointer hover:text-white active:scale-95' }` } onClick={ () => { if((onlineFriends.length > MAX_DISPLAY_COUNT) && ((indexOffset + MAX_DISPLAY_COUNT) <= (onlineFriends.length - 1))) setIndexOffset(indexOffset + 1); } } >
); }; const FRIENDBAR_STYLES = ` .tbme-panel { background: rgba(18, 16, 14, 0.88); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.08); border-radius: 14px; padding: 10px 12px; box-shadow: 0 10px 36px rgba(0, 0, 0, 0.65), 0 1px 0 rgba(255, 255, 255, 0.05) inset; } .tbme-icon { opacity: 0.72; cursor: pointer; transition: opacity 0.15s ease, transform 0.15s ease; } .tbme-icon:hover { opacity: 1; transform: translateY(-2px); } .tbme-icon:active { opacity: 0.85; transform: translateY(0); } `;