import React, { useCallback, useRef } from 'react'; import { Box, Flex, Button, useDisclosure, useTheme, Divider, Select, Input } from '@chakra-ui/react'; import { useForm } from 'react-hook-form'; import { UserUpdateParams } from '@/types/user'; import { useToast } from '@/web/common/hooks/useToast'; import { useUserStore } from '@/web/support/user/useUserStore'; import type { UserType } from '@fastgpt/global/support/user/type.d'; import { useQuery } from '@tanstack/react-query'; import dynamic from 'next/dynamic'; import { useSelectFile } from '@/web/common/file/hooks/useSelectFile'; import { compressImgFileAndUpload } from '@/web/common/file/controller'; import { feConfigs, systemVersion } from '@/web/common/system/staticData'; import { useTranslation } from 'next-i18next'; import { timezoneList } from '@fastgpt/global/common/time/timezone'; import Loading from '@/components/Loading'; import Avatar from '@/components/Avatar'; import MyIcon from '@/components/Icon'; import MyTooltip from '@/components/MyTooltip'; import { langMap, setLngStore } from '@/web/common/utils/i18n'; import { useRouter } from 'next/router'; import MySelect from '@/components/Select'; import { formatPrice } from '@fastgpt/global/support/wallet/bill/tools'; import { putUpdateMemberName } from '@/web/support/user/team/api'; const TeamMenu = dynamic(() => import('@/components/support/user/team/TeamMenu')); 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 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 compressImgFileAndUpload({ file, maxW: 300, maxH: 300 }); 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')} {feConfigs.isPlus && ( {t('user.Member Name')}:  { const val = e.target.value; if (val === userInfo?.team?.memberName) return; try { putUpdateMemberName(val); } catch (error) {} }} /> )} {t('user.Account')}:  {userInfo?.username} {t('user.Team')}:  {t('user.Language')}:  ({ label: lang.label, value: key }))} onchange={(val: any) => { const lang = val; setLngStore(lang); router.replace(router.basePath, router.asPath, { locale: lang }); }} /> {t('user.Timezone')}:  {t('user.Password')}:  ***** {t('user.team.Balance')}:  {formatPrice(userInfo?.team?.balance).toFixed(3)} {feConfigs?.show_pay && userInfo?.team?.canWrite && ( )} {feConfigs?.docUrl && ( <> { window.open(`${feConfigs.docUrl}/docs/intro`); }} > {t('system.Help Document')} V{systemVersion} )} {feConfigs?.show_openai_account && ( <> OpenAI/OneAPI 账号 )} {isOpenPayModal && } {isOpenUpdatePsw && } {isOpenOpenai && userInfo && ( onclickSave({ ...userInfo, openaiAccount: data }) } onClose={onCloseOpenai} /> )} ); }; export default UserInfo;