'use client' import type { FC } from 'react' import { useCallback, useEffect, useState, } from 'react' import { useAsyncEffect } from 'ahooks' import { useThemeContext } from '../embedded-chatbot/theme/theme-context' import { ChatWithHistoryContext, useChatWithHistoryContext, } from './context' import { useChatWithHistory } from './hooks' import Sidebar from './sidebar' import Header from './header' import HeaderInMobile from './header-in-mobile' import ChatWrapper from './chat-wrapper' import type { InstalledApp } from '@/models/explore' import Loading from '@/app/components/base/loading' import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' import { checkOrSetAccessToken, removeAccessToken } from '@/app/components/share/utils' import AppUnavailable from '@/app/components/base/app-unavailable' import cn from '@/utils/classnames' import useDocumentTitle from '@/hooks/use-document-title' import { useTranslation } from 'react-i18next' import { usePathname, useRouter, useSearchParams } from 'next/navigation' type ChatWithHistoryProps = { className?: string } const ChatWithHistory: FC = ({ className, }) => { const { userCanAccess, appInfoError, appData, appInfoLoading, appChatListDataLoading, chatShouldReloadKey, isMobile, themeBuilder, sidebarCollapseState, isInstalledApp, } = useChatWithHistoryContext() const isSidebarCollapsed = sidebarCollapseState const customConfig = appData?.custom_config const site = appData?.site const [showSidePanel, setShowSidePanel] = useState(false) useEffect(() => { themeBuilder?.buildTheme(site?.chat_color_theme, site?.chat_color_theme_inverted) }, [site, customConfig, themeBuilder]) useDocumentTitle(site?.title || 'Chat') const { t } = useTranslation() const searchParams = useSearchParams() const router = useRouter() const pathname = usePathname() const getSigninUrl = useCallback(() => { const params = new URLSearchParams(searchParams) params.delete('message') params.set('redirect_url', pathname) return `/webapp-signin?${params.toString()}` }, [searchParams, pathname]) const backToHome = useCallback(() => { removeAccessToken() const url = getSigninUrl() router.replace(url) }, [getSigninUrl, router]) if (appInfoLoading) { return ( ) } if (!userCanAccess) { return
{!isInstalledApp && {t('common.userProfile.logout')}}
} if (appInfoError) { return ( ) } return (
{!isMobile && (
)} {isMobile && ( )}
{isSidebarCollapsed && (
setShowSidePanel(true)} onMouseLeave={() => setShowSidePanel(false)} >
)}
{!isMobile &&
} {appChatListDataLoading && ( )} {!appChatListDataLoading && ( )}
) } export type ChatWithHistoryWrapProps = { installedAppInfo?: InstalledApp className?: string } const ChatWithHistoryWrap: FC = ({ installedAppInfo, className, }) => { const media = useBreakpoints() const isMobile = media === MediaType.mobile const themeBuilder = useThemeContext() const { appInfoError, appInfoLoading, userCanAccess, appData, appParams, appMeta, appChatListDataLoading, currentConversationId, currentConversationItem, appPrevChatTree, pinnedConversationList, conversationList, newConversationInputs, newConversationInputsRef, handleNewConversationInputsChange, inputsForms, handleNewConversation, handleStartChat, handleChangeConversation, handlePinConversation, handleUnpinConversation, handleDeleteConversation, conversationRenaming, handleRenameConversation, handleNewConversationCompleted, chatShouldReloadKey, isInstalledApp, appId, handleFeedback, currentChatInstanceRef, sidebarCollapseState, handleSidebarCollapse, clearChatList, setClearChatList, isResponding, setIsResponding, currentConversationInputs, setCurrentConversationInputs, allInputsHidden, } = useChatWithHistory(installedAppInfo) return ( ) } const ChatWithHistoryWrapWithCheckToken: FC = ({ installedAppInfo, className, }) => { const [initialized, setInitialized] = useState(false) const [appUnavailable, setAppUnavailable] = useState(false) const [isUnknownReason, setIsUnknownReason] = useState(false) useAsyncEffect(async () => { if (!initialized) { if (!installedAppInfo) { try { await checkOrSetAccessToken() } catch (e: any) { if (e.status === 404) { setAppUnavailable(true) } else { setIsUnknownReason(true) setAppUnavailable(true) } } } setInitialized(true) } }, []) if (!initialized) return null if (appUnavailable) return return ( ) } export default ChatWithHistoryWrapWithCheckToken