import React, { useCallback, useRef, useState } from 'react'; import { Box, Flex, Button, useDisclosure, useTheme, Divider, Select, Menu, MenuButton, MenuList, MenuItem } from '@chakra-ui/react'; import { useForm } from 'react-hook-form'; import { UserUpdateParams } from '@/types/user'; import { useToast } from '@/hooks/useToast'; import { useUserStore } from '@/store/user'; import { UserType } from '@/types/user'; import { useQuery } from '@tanstack/react-query'; import dynamic from 'next/dynamic'; import { useSelectFile } from '@/hooks/useSelectFile'; import { compressImg } from '@/utils/file'; import { feConfigs, systemVersion } from '@/store/static'; import { useTranslation } from 'next-i18next'; import { timezoneList } from '@/utils/user'; import Loading from '@/components/Loading'; import Avatar from '@/components/Avatar'; import MyIcon from '@/components/Icon'; import MyTooltip from '@/components/MyTooltip'; import { getLangStore, LangEnum, langMap, setLangStore } from '@/utils/i18n'; import { useRouter } from 'next/router'; import MyMenu from '@/components/MyMenu'; import MySelect from '@/components/Select'; const PayModal = dynamic(() => import('./PayModal'), { loading: () => , ssr: false }); const UpdatePswModal = dynamic(() => import('./UpdatePswModal'), { loading: () => , ssr: false }); const OpenAIAccountModal = dynamic(() => import('./OpenAIAccountModal'), { loading: () => , ssr: false }); const UserInfo = () => { const theme = useTheme(); const router = useRouter(); const { t, i18n } = useTranslation(); const { userInfo, updateUserInfo, initUserInfo } = useUserStore(); const timezones = useRef(timezoneList()); const { reset } = useForm({ defaultValues: userInfo as UserType }); const { toast } = useToast(); const { isOpen: isOpenPayModal, onClose: onClosePayModal, onOpen: onOpenPayModal } = useDisclosure(); const { isOpen: isOpenUpdatePsw, onClose: onCloseUpdatePsw, onOpen: onOpenUpdatePsw } = useDisclosure(); const { isOpen: isOpenOpenai, onClose: onCloseOpenai, onOpen: onOpenOpenai } = useDisclosure(); const { File, onOpen: onOpenSelectFile } = useSelectFile({ fileType: '.jpg,.png', multiple: false }); const [language, setLanguage] = useState<`${LangEnum}`>(getLangStore()); const onclickSave = useCallback( async (data: UserType) => { await updateUserInfo({ avatar: data.avatar, timezone: data.timezone, openaiAccount: data.openaiAccount }); reset(data); toast({ title: '更新数据成功', status: 'success' }); }, [reset, toast, updateUserInfo] ); const onSelectFile = useCallback( async (e: File[]) => { const file = e[0]; if (!file || !userInfo) return; try { const src = await compressImg({ file, maxW: 100, maxH: 100 }); onclickSave({ ...userInfo, avatar: src }); } catch (err: any) { toast({ title: typeof err === 'string' ? err : '头像选择异常', status: 'warning' }); } }, [onclickSave, toast, userInfo] ); useQuery(['init'], initUserInfo, { onSuccess(res) { reset(res); } }); return ( {t('user.Replace')} {t('user.Account')}:  {userInfo?.username} {t('user.Language')}:  ({ label: lang.label, value: key }))} onchange={(val: any) => { const lang = val; setLangStore(lang); setLanguage(lang); i18n?.changeLanguage?.(lang); router.reload(); }} /> {t('user.Timezone')}:  {t('user.Password')}:  ***** {feConfigs?.show_userDetail && ( {t('user.Balance')}:  {userInfo?.balance.toFixed(3)} )} {feConfigs?.show_doc && ( <> { window.open(`https://doc.fastgpt.run/docs/intro`); }} > {t('system.Help Document')} V{systemVersion} )} {feConfigs?.show_userDetail && ( <> OpenAI 账号 )} {isOpenPayModal && } {isOpenUpdatePsw && } {isOpenOpenai && userInfo && ( onclickSave({ ...userInfo, openaiAccount: data }) } onClose={onCloseOpenai} /> )} ); }; export default UserInfo;