import React, { useState, useCallback, useEffect, useMemo } from 'react'; import { Box, Button, Center, Drawer, DrawerCloseButton, DrawerContent, DrawerOverlay, Flex, useDisclosure } from '@chakra-ui/react'; import { LoginPageTypeEnum } from '@/web/support/user/login/constants'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import type { ResLogin } from '@/global/support/api/userRes.d'; import { useRouter } from 'next/router'; import { useUserStore } from '@/web/support/user/useUserStore'; import { useChatStore } from '@/web/core/chat/context/useChatStore'; import dynamic from 'next/dynamic'; import { serviceSideProps } from '@fastgpt/web/common/system/nextjs'; import { clearToken } from '@/web/support/user/auth'; import Script from 'next/script'; import Loading from '@fastgpt/web/components/common/MyLoading'; import { useLocalStorageState, useMount } from 'ahooks'; import { useTranslation } from 'next-i18next'; import I18nLngSelector from '@/components/Select/I18nLngSelector'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import { GET } from '@/web/common/api/request'; import { getDocPath } from '@/web/common/system/doc'; import { getWebReqUrl } from '@fastgpt/web/common/system/utils'; import LoginForm from '@/pageComponents/login/LoginForm/LoginForm'; import { useToast } from '@fastgpt/web/hooks/useToast'; const RegisterForm = dynamic(() => import('@/pageComponents/login/RegisterForm')); const ForgetPasswordForm = dynamic(() => import('@/pageComponents/login/ForgetPasswordForm')); const WechatForm = dynamic(() => import('@/pageComponents/login/LoginForm/WechatForm')); const CommunityModal = dynamic(() => import('@/components/CommunityModal')); const ipDetectURL = 'https://qifu-api.baidubce.com/ip/local/geo/v1/district'; const Login = ({ ChineseRedirectUrl }: { ChineseRedirectUrl: string }) => { const router = useRouter(); const { t } = useTranslation(); const { lastRoute = '' } = router.query as { lastRoute: string }; const { feConfigs } = useSystemStore(); const [pageType, setPageType] = useState<`${LoginPageTypeEnum}`>(LoginPageTypeEnum.passwordLogin); const { setUserInfo } = useUserStore(); const { setLastChatAppId } = useChatStore(); const { isOpen, onOpen, onClose } = useDisclosure(); const { isPc } = useSystem(); const { toast } = useToast(); const { isOpen: isOpenCookiesDrawer, onOpen: onOpenCookiesDrawer, onClose: onCloseCookiesDrawer } = useDisclosure(); const cookieVersion = '1'; const [localCookieVersion, setLocalCookieVersion] = useLocalStorageState('localCookieVersion'); const loginSuccess = useCallback( (res: ResLogin) => { setUserInfo(res.user); const decodeLastRoute = decodeURIComponent(lastRoute); // 检查是否是当前的 route const navigateTo = decodeLastRoute && !decodeLastRoute.includes('/login') ? decodeLastRoute : '/app/list'; setTimeout(() => { router.push(navigateTo); }, 300); }, [setUserInfo, lastRoute, router] ); const DynamicComponent = useMemo(() => { const TypeMap = { [LoginPageTypeEnum.passwordLogin]: LoginForm, [LoginPageTypeEnum.register]: RegisterForm, [LoginPageTypeEnum.forgetPassword]: ForgetPasswordForm, [LoginPageTypeEnum.wechat]: WechatForm }; // @ts-ignore const Component = TypeMap[pageType]; return ; }, [pageType, loginSuccess]); /* default login type */ useEffect(() => { const bd_vid = sessionStorage.getItem('bd_vid'); if (bd_vid) { setPageType(LoginPageTypeEnum.passwordLogin); return; } setPageType( feConfigs?.oauth?.wechat ? LoginPageTypeEnum.wechat : LoginPageTypeEnum.passwordLogin ); // init store setLastChatAppId(''); }, [feConfigs?.oauth, setLastChatAppId]); const { isOpen: isOpenRedirect, onOpen: onOpenRedirect, onClose: onCloseRedirect } = useDisclosure(); const [showRedirect, setShowRedirect] = useLocalStorageState('showRedirect', { defaultValue: true }); const checkIpInChina = useCallback(async () => { try { const res = await GET(ipDetectURL); const country = res?.country; if ( country && country === '中国' && res.prov !== '中国香港' && res.prov !== '中国澳门' && res.prov !== '中国台湾' ) { onOpenRedirect(); } } catch (error) { console.log(error); } }, [onOpenRedirect]); useMount(() => { clearToken(); router.prefetch('/app/list'); ChineseRedirectUrl && showRedirect && checkIpInChina(); localCookieVersion !== cookieVersion && onOpenCookiesDrawer(); }); return ( <> {feConfigs.googleClientVerKey && ( )} {isPc && ( )} {pageType ? ( DynamicComponent ) : (
)}
{feConfigs?.concatMd && ( {t('common:support.user.login.can_not_login')} )}
{isOpen && }
{showRedirect && ( router.push(ChineseRedirectUrl)} disableDrawer={() => setShowRedirect(false)} /> )} {isOpenCookiesDrawer && ( { setLocalCookieVersion(cookieVersion); onCloseCookiesDrawer(); }} onClose={onCloseCookiesDrawer} /> )} ); }; function RedirectDrawer({ isOpen, onClose, disableDrawer, onRedirect }: { isOpen: boolean; onClose: () => void; disableDrawer: () => void; onRedirect: () => void; }) { const { t } = useTranslation(); return ( {t('login:Chinese_ip_tip')} {t('login:no_remind')} ); } function CookiesDrawer({ onClose, onAgree }: { onClose: () => void; onAgree: () => void }) { const { t } = useTranslation(); return ( {t('login:cookies_tip')} window.open(getDocPath('/docs/agreement/privacy/'), '_blank')} > {t('login:privacy_policy')} ); } export async function getServerSideProps(context: any) { return { props: { ChineseRedirectUrl: process.env.CHINESE_IP_REDIRECT_URL ?? '', ...(await serviceSideProps(context, ['app', 'user', 'login'])) } }; } export default Login;