diff --git a/web/hooks/useActiveModel.ts b/web/hooks/useActiveModel.ts index edcc1faab..d869afd2f 100644 --- a/web/hooks/useActiveModel.ts +++ b/web/hooks/useActiveModel.ts @@ -107,7 +107,7 @@ export function useActiveModel() { toaster({ title: 'Failed!', description: `Model ${model.id} failed to start.`, - type: 'success', + type: 'error', }) setLoadModelError(error) return Promise.reject(error) diff --git a/web/screens/Chat/ChatBody/index.tsx b/web/screens/Chat/ChatBody/index.tsx index 70521a9bd..be6107d1d 100644 --- a/web/screens/Chat/ChatBody/index.tsx +++ b/web/screens/Chat/ChatBody/index.tsx @@ -3,10 +3,14 @@ import ScrollToBottom from 'react-scroll-to-bottom' import { MessageStatus } from '@janhq/core' import { useAtomValue } from 'jotai' +import { loadModelErrorAtom } from '@/hooks/useActiveModel' + import ChatItem from '../ChatItem' import ErrorMessage from '../ErrorMessage' +import LoadModelError from '../LoadModelError' + import EmptyModel from './EmptyModel' import EmptyThread from './EmptyThread' @@ -16,6 +20,7 @@ import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' const ChatBody: React.FC = () => { const messages = useAtomValue(getCurrentChatMessagesAtom) const downloadedModels = useAtomValue(downloadedModelsAtom) + const loadModelError = useAtomValue(loadModelErrorAtom) if (downloadedModels.length === 0) return if (messages.length === 0) return @@ -29,9 +34,15 @@ const ChatBody: React.FC = () => { )} - {(message.status === MessageStatus.Error || - message.status === MessageStatus.Stopped) && - index === messages.length - 1 && } + {loadModelError ? ( + + ) : ( + index === messages.length - 1 && + message.status !== MessageStatus.Pending && + message.status !== MessageStatus.Ready && ( + + ) + )} ))} diff --git a/web/screens/Chat/ErrorMessage/index.tsx b/web/screens/Chat/ErrorMessage/index.tsx index 17c23f773..7e7686ed1 100644 --- a/web/screens/Chat/ErrorMessage/index.tsx +++ b/web/screens/Chat/ErrorMessage/index.tsx @@ -10,7 +10,6 @@ import ModalTroubleShooting, { import { MainViewState } from '@/constants/screens' -import { loadModelErrorAtom } from '@/hooks/useActiveModel' import useSendChatMessage from '@/hooks/useSendChatMessage' import { mainViewStateAtom } from '@/helpers/atoms/App.atom' @@ -20,9 +19,7 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => { const messages = useAtomValue(getCurrentChatMessagesAtom) const { resendChatMessage } = useSendChatMessage() const setModalTroubleShooting = useSetAtom(modalTroubleShootingAtom) - const loadModelError = useAtomValue(loadModelErrorAtom) const setMainState = useSetAtom(mainViewStateAtom) - const PORT_NOT_AVAILABLE = 'PORT_NOT_AVAILABLE' const regenerateMessage = async () => { const lastMessageIndex = messages.length - 1 @@ -77,63 +74,23 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => { )} {message.status === MessageStatus.Error && ( - <> - {loadModelError === PORT_NOT_AVAILABLE ? ( -
+ {getErrorTitle()} +

+ Jan’s in beta. Access  + setModalTroubleShooting(true)} > -

- Port 3928 is currently unavailable. Check for conflicting apps, - or access  - setModalTroubleShooting(true)} - > - troubleshooting assistance - -  for further support. -

- -
- ) : loadModelError && - loadModelError?.includes('EXTENSION_IS_NOT_INSTALLED') ? ( -
-

- Model is currently unavailable. Please switch to a different - model or install the{' '} - {' '} - to continue using it. -

-
- ) : ( -
- {getErrorTitle()} -

- Jan’s in beta. Access  - setModalTroubleShooting(true)} - > - troubleshooting assistance - -  now. -

- -
- )} - + troubleshooting assistance + +  now. +

+ + )} ) diff --git a/web/screens/Chat/LoadModelError/index.tsx b/web/screens/Chat/LoadModelError/index.tsx new file mode 100644 index 000000000..3bf01f8cb --- /dev/null +++ b/web/screens/Chat/LoadModelError/index.tsx @@ -0,0 +1,70 @@ +import { useAtomValue, useSetAtom } from 'jotai' + +import ModalTroubleShooting, { + modalTroubleShootingAtom, +} from '@/containers/ModalTroubleShoot' + +import { MainViewState } from '@/constants/screens' + +import { loadModelErrorAtom } from '@/hooks/useActiveModel' + +import { mainViewStateAtom } from '@/helpers/atoms/App.atom' + +const LoadModelError = () => { + const setModalTroubleShooting = useSetAtom(modalTroubleShootingAtom) + const loadModelError = useAtomValue(loadModelErrorAtom) + const setMainState = useSetAtom(mainViewStateAtom) + const PORT_NOT_AVAILABLE = 'PORT_NOT_AVAILABLE' + + return ( +
+ {loadModelError === PORT_NOT_AVAILABLE ? ( +
+

+ Port 3928 is currently unavailable. Check for conflicting apps, or + access  + setModalTroubleShooting(true)} + > + troubleshooting assistance + +  for further support. +

+ +
+ ) : loadModelError && + loadModelError?.includes('EXTENSION_IS_NOT_INSTALLED') ? ( +
+

+ Model is currently unavailable. Please switch to a different model + or install the{' '} + {' '} + to continue using it. +

+
+ ) : ( +
+ Apologies, something’s amiss! +

+ Jan’s in beta. Access  + setModalTroubleShooting(true)} + > + troubleshooting assistance + +  now. +

+ +
+ )} +
+ ) +} +export default LoadModelError