import { FileImage } from 'lucide-react'; import { useSetRecoilState } from 'recoil'; import { useState, useEffect } from 'react'; import { fileConfig as defaultFileConfig, mergeFileConfig } from 'librechat-data-provider'; import type { TUser } from 'librechat-data-provider'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '~/components/ui'; import { useUploadAvatarMutation, useGetFileConfig } from '~/data-provider'; import { useToastContext } from '~/Providers'; import { Spinner } from '~/components/svg'; import { cn, formatBytes } from '~/utils'; import { useLocalize } from '~/hooks'; import store from '~/store'; function Avatar() { const setUser = useSetRecoilState(store.user); const [input, setinput] = useState(null); const [isDialogOpen, setDialogOpen] = useState(false); const [previewUrl, setPreviewUrl] = useState(null); const { data: fileConfig = defaultFileConfig } = useGetFileConfig({ select: (data) => mergeFileConfig(data), }); const localize = useLocalize(); const { showToast } = useToastContext(); const { mutate: uploadAvatar, isLoading: isUploading } = useUploadAvatarMutation({ onSuccess: (data) => { showToast({ message: localize('com_ui_upload_success') }); setDialogOpen(false); setUser((prev) => ({ ...prev, avatar: data.url } as TUser)); }, onError: (error) => { console.error('Error:', error); showToast({ message: localize('com_ui_upload_error'), status: 'error' }); }, }); useEffect(() => { if (input) { const reader = new FileReader(); reader.onloadend = () => { setPreviewUrl(reader.result as string); }; reader.readAsDataURL(input); } else { setPreviewUrl(null); } }, [input]); const handleFileChange = (event: React.ChangeEvent): void => { const file = event.target.files?.[0]; if (fileConfig.avatarSizeLimit && file && file.size <= fileConfig.avatarSizeLimit) { setinput(file); setDialogOpen(true); } else { const megabytes = fileConfig.avatarSizeLimit ? formatBytes(fileConfig.avatarSizeLimit) : 2; showToast({ message: localize('com_ui_upload_invalid_var', megabytes + ''), status: 'error', }); } }; const handleUpload = () => { if (!input) { console.error('No file selected'); return; } const formData = new FormData(); formData.append('input', input, input.name); formData.append('manual', 'true'); uploadAvatar(formData); }; return ( <>
{localize('com_nav_profile_picture')}
setDialogOpen(false)}> {localize('com_ui_preview')}
{previewUrl && ( Preview )}
); } export default Avatar;