Spaces:
Paused
Paused
| import type { FC } from 'react' | |
| import { | |
| 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 HeaderInMobile from './header-in-mobile' | |
| import ConfigPanel from './config-panel' | |
| 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 } from '@/app/components/share/utils' | |
| import AppUnavailable from '@/app/components/base/app-unavailable' | |
| type ChatWithHistoryProps = { | |
| className?: string | |
| } | |
| const ChatWithHistory: FC<ChatWithHistoryProps> = ({ | |
| className, | |
| }) => { | |
| const { | |
| appInfoError, | |
| appData, | |
| appInfoLoading, | |
| appPrevChatList, | |
| showConfigPanelBeforeChat, | |
| appChatListDataLoading, | |
| chatShouldReloadKey, | |
| isMobile, | |
| themeBuilder, | |
| } = useChatWithHistoryContext() | |
| const chatReady = (!showConfigPanelBeforeChat || !!appPrevChatList.length) | |
| const customConfig = appData?.custom_config | |
| const site = appData?.site | |
| useEffect(() => { | |
| themeBuilder?.buildTheme(site?.chat_color_theme, site?.chat_color_theme_inverted) | |
| if (site) { | |
| if (customConfig) | |
| document.title = `${site.title}` | |
| else | |
| document.title = `${site.title} - Powered by Dify` | |
| } | |
| }, [site, customConfig, themeBuilder]) | |
| if (appInfoLoading) { | |
| return ( | |
| <Loading type='app' /> | |
| ) | |
| } | |
| if (appInfoError) { | |
| return ( | |
| <AppUnavailable /> | |
| ) | |
| } | |
| return ( | |
| <div className={`h-full flex bg-white ${className} ${isMobile && 'flex-col'}`}> | |
| { | |
| !isMobile && ( | |
| <Sidebar /> | |
| ) | |
| } | |
| { | |
| isMobile && ( | |
| <HeaderInMobile /> | |
| ) | |
| } | |
| <div className={`grow overflow-hidden ${showConfigPanelBeforeChat && !appPrevChatList.length && 'flex items-center justify-center'}`}> | |
| { | |
| showConfigPanelBeforeChat && !appChatListDataLoading && !appPrevChatList.length && ( | |
| <div className={`flex w-full items-center justify-center h-full ${isMobile && 'px-4'}`}> | |
| <ConfigPanel /> | |
| </div> | |
| ) | |
| } | |
| { | |
| appChatListDataLoading && chatReady && ( | |
| <Loading type='app' /> | |
| ) | |
| } | |
| { | |
| chatReady && !appChatListDataLoading && ( | |
| <ChatWrapper key={chatShouldReloadKey} /> | |
| ) | |
| } | |
| </div> | |
| </div> | |
| ) | |
| } | |
| export type ChatWithHistoryWrapProps = { | |
| installedAppInfo?: InstalledApp | |
| className?: string | |
| } | |
| const ChatWithHistoryWrap: FC<ChatWithHistoryWrapProps> = ({ | |
| installedAppInfo, | |
| className, | |
| }) => { | |
| const media = useBreakpoints() | |
| const isMobile = media === MediaType.mobile | |
| const themeBuilder = useThemeContext() | |
| const { | |
| appInfoError, | |
| appInfoLoading, | |
| appData, | |
| appParams, | |
| appMeta, | |
| appChatListDataLoading, | |
| currentConversationId, | |
| currentConversationItem, | |
| appPrevChatList, | |
| pinnedConversationList, | |
| conversationList, | |
| showConfigPanelBeforeChat, | |
| newConversationInputs, | |
| newConversationInputsRef, | |
| handleNewConversationInputsChange, | |
| inputsForms, | |
| handleNewConversation, | |
| handleStartChat, | |
| handleChangeConversation, | |
| handlePinConversation, | |
| handleUnpinConversation, | |
| handleDeleteConversation, | |
| conversationRenaming, | |
| handleRenameConversation, | |
| handleNewConversationCompleted, | |
| chatShouldReloadKey, | |
| isInstalledApp, | |
| appId, | |
| handleFeedback, | |
| currentChatInstanceRef, | |
| } = useChatWithHistory(installedAppInfo) | |
| return ( | |
| <ChatWithHistoryContext.Provider value={{ | |
| appInfoError, | |
| appInfoLoading, | |
| appData, | |
| appParams, | |
| appMeta, | |
| appChatListDataLoading, | |
| currentConversationId, | |
| currentConversationItem, | |
| appPrevChatList, | |
| pinnedConversationList, | |
| conversationList, | |
| showConfigPanelBeforeChat, | |
| newConversationInputs, | |
| newConversationInputsRef, | |
| handleNewConversationInputsChange, | |
| inputsForms, | |
| handleNewConversation, | |
| handleStartChat, | |
| handleChangeConversation, | |
| handlePinConversation, | |
| handleUnpinConversation, | |
| handleDeleteConversation, | |
| conversationRenaming, | |
| handleRenameConversation, | |
| handleNewConversationCompleted, | |
| chatShouldReloadKey, | |
| isMobile, | |
| isInstalledApp, | |
| appId, | |
| handleFeedback, | |
| currentChatInstanceRef, | |
| themeBuilder, | |
| }}> | |
| <ChatWithHistory className={className} /> | |
| </ChatWithHistoryContext.Provider> | |
| ) | |
| } | |
| const ChatWithHistoryWrapWithCheckToken: FC<ChatWithHistoryWrapProps> = ({ | |
| installedAppInfo, | |
| className, | |
| }) => { | |
| const [initialized, setInitialized] = useState(false) | |
| const [appUnavailable, setAppUnavailable] = useState<boolean>(false) | |
| const [isUnknownReason, setIsUnknownReason] = useState<boolean>(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 <AppUnavailable isUnknownReason={isUnknownReason} /> | |
| return ( | |
| <ChatWithHistoryWrap | |
| installedAppInfo={installedAppInfo} | |
| className={className} | |
| /> | |
| ) | |
| } | |
| export default ChatWithHistoryWrapWithCheckToken | |