CognxSafeTrack
feat: implement whatsapp templates management with security hardening, audit logs, and crm integration
0f2f80a | import React from 'react'; | |
| import { useTranslation } from 'react-i18next'; | |
| import { ChevronDown } from 'lucide-react'; | |
| import { motion, AnimatePresence } from 'framer-motion'; | |
| const languages = [ | |
| { code: 'en', label: 'English', flag: '🇺🇸' }, | |
| { code: 'fr', label: 'Français', flag: '🇫🇷' }, | |
| { code: 'es', label: 'Español', flag: '🇪🇸' }, | |
| { code: 'pt', label: 'Português', flag: '🇵🇹' } | |
| ]; | |
| export default function LanguageSwitcher() { | |
| const { i18n } = useTranslation(); | |
| const [isOpen, setIsOpen] = React.useState(false); | |
| const currentLanguage = languages.find(l => l.code === i18n.language) || languages[1]; | |
| const changeLanguage = (code: string) => { | |
| i18n.changeLanguage(code); | |
| setIsOpen(false); | |
| }; | |
| return ( | |
| <div className="relative"> | |
| <button | |
| onClick={() => setIsOpen(!isOpen)} | |
| className="flex items-center gap-2 px-3 py-2 text-slate-300 hover:text-white transition bg-slate-800 rounded-xl text-xs w-full justify-between" | |
| > | |
| <div className="flex items-center gap-2"> | |
| <span>{currentLanguage.flag}</span> | |
| <span className="font-medium">{currentLanguage.label}</span> | |
| </div> | |
| <ChevronDown className={`w-3 h-3 transition-transform ${isOpen ? 'rotate-180' : ''}`} /> | |
| </button> | |
| <AnimatePresence> | |
| {isOpen && ( | |
| <motion.div | |
| initial={{ opacity: 0, y: 10 }} | |
| animate={{ opacity: 1, y: 0 }} | |
| exit={{ opacity: 0, y: 10 }} | |
| className="absolute bottom-full left-0 right-0 mb-2 bg-slate-800 border border-slate-700 rounded-xl overflow-hidden shadow-xl z-50" | |
| > | |
| {languages.map((lang) => ( | |
| <button | |
| key={lang.code} | |
| onClick={() => changeLanguage(lang.code)} | |
| className={`w-full flex items-center gap-3 px-4 py-2.5 text-xs text-left transition hover:bg-slate-700 ${ | |
| i18n.language === lang.code ? 'text-white bg-slate-700/50' : 'text-slate-400' | |
| }`} | |
| > | |
| <span>{lang.flag}</span> | |
| <span>{lang.label}</span> | |
| </button> | |
| ))} | |
| </motion.div> | |
| )} | |
| </AnimatePresence> | |
| </div> | |
| ); | |
| } | |