import React, { useCallback } from 'react'; import { Box, Flex, Button, useDisclosure, useTheme, Divider } 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 } from '@/store/static'; import { useTranslation } from 'next-i18next'; import Loading from '@/components/Loading'; import Avatar from '@/components/Avatar'; import MyIcon from '@/components/Icon'; import MyTooltip from '@/components/MyTooltip'; 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 { t } = useTranslation(); const { userInfo, updateUserInfo, initUserInfo } = useUserStore(); 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, 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.Password')}:  ***** {feConfigs?.show_userDetail && ( <> {t('user.Balance')}:  {userInfo?.balance.toFixed(3)} OpenAI 账号 )} {isOpenPayModal && } {isOpenUpdatePsw && } {isOpenOpenai && userInfo && ( onclickSave({ ...userInfo, openaiAccount: data }) } onClose={onCloseOpenai} /> )} ); }; export default UserInfo;