diff --git a/services/web/frontend/js/features/ide-redesign/components/chat.tsx b/services/web/frontend/js/features/ide-redesign/components/chat.tsx new file mode 100644 index 0000000000..41606806b4 --- /dev/null +++ b/services/web/frontend/js/features/ide-redesign/components/chat.tsx @@ -0,0 +1,108 @@ +import ChatFallbackError from '@/features/chat/components/chat-fallback-error' +import InfiniteScroll from '@/features/chat/components/infinite-scroll' +import MessageInput from '@/features/chat/components/message-input' +import { useChatContext } from '@/features/chat/context/chat-context' +import OLBadge from '@/features/ui/components/ol/ol-badge' +import { FetchError } from '@/infrastructure/fetch-json' +import { FullSizeLoadingSpinner } from '@/shared/components/loading-spinner' +import MaterialIcon from '@/shared/components/material-icon' +import { useUserContext } from '@/shared/context/user-context' +import { lazy, Suspense, useEffect } from 'react' +import { useTranslation } from 'react-i18next' + +const MessageList = lazy(() => import('../../chat/components/message-list')) + +export const ChatIndicator = () => { + const { unreadMessageCount } = useChatContext() + if (unreadMessageCount === 0) { + return null + } + return {unreadMessageCount} +} + +const Loading = () => + +export const ChatPane = () => { + const { t } = useTranslation() + + const user = useUserContext() + const { + status, + messages, + initialMessagesLoaded, + atEnd, + loadInitialMessages, + loadMoreMessages, + reset, + sendMessage, + markMessagesAsRead, + error, + } = useChatContext() + + useEffect(() => { + if (!initialMessagesLoaded) { + loadInitialMessages() + } + }, [loadInitialMessages, initialMessagesLoaded]) + + const shouldDisplayPlaceholder = status !== 'pending' && messages.length === 0 + + const messageContentCount = messages.reduce( + (acc, { contents }) => acc + contents.length, + 0 + ) + + if (error) { + // let user try recover from fetch errors + if (error instanceof FetchError) { + return + } + throw error + } + + if (!user) { + return null + } + + return ( + + ) +} + +function Placeholder() { + const { t } = useTranslation() + return ( + <> +
{t('no_messages')}
+
+ {t('send_first_message')} +
+ +
+ + ) +} diff --git a/services/web/frontend/js/features/ide-redesign/components/rail.tsx b/services/web/frontend/js/features/ide-redesign/components/rail.tsx index 4a8e3198b4..3fb89a4a1d 100644 --- a/services/web/frontend/js/features/ide-redesign/components/rail.tsx +++ b/services/web/frontend/js/features/ide-redesign/components/rail.tsx @@ -8,12 +8,15 @@ import { useLayoutContext } from '@/shared/context/layout-context' import { ErrorIndicator, ErrorPane } from './errors' import { RailTabKey, useRailTabContext } from '../contexts/rail-tab-context' import FileTreeOutlinePanel from './file-tree-outline-panel' +import { ChatIndicator, ChatPane } from './chat' +import getMeta from '@/utils/meta' type RailElement = { icon: AvailableUnfilledIcon key: RailTabKey component: ReactElement indicator?: ReactElement + hide?: boolean } type RailActionLink = { key: string; icon: AvailableUnfilledIcon; href: string } @@ -43,7 +46,9 @@ const RAIL_TABS: RailElement[] = [ { key: 'chat', icon: 'forum', - component: <>Chat, + component: , + indicator: , + hide: !getMeta('ol-chatEnabled'), }, { key: 'errors', @@ -86,15 +91,17 @@ export const RailLayout = () => { activeKey={selectedTab} className="d-flex flex-column ide-rail-tabs-nav" > - {RAIL_TABS.map(({ icon, key, indicator }) => ( - - ))} + {RAIL_TABS.filter(({ hide }) => !hide).map( + ({ icon, key, indicator }) => ( + + ) + )}
{railActions?.map(action => ( @@ -110,7 +117,7 @@ export const RailLayout = () => { >
- {RAIL_TABS.map(({ key, component }) => ( + {RAIL_TABS.filter(({ hide }) => !hide).map(({ key, component }) => ( {component} diff --git a/services/web/frontend/stylesheets/bootstrap-5/pages/editor/chat.scss b/services/web/frontend/stylesheets/bootstrap-5/pages/editor/chat.scss index 00993559e4..e0bcf91c83 100644 --- a/services/web/frontend/stylesheets/bootstrap-5/pages/editor/chat.scss +++ b/services/web/frontend/stylesheets/bootstrap-5/pages/editor/chat.scss @@ -20,6 +20,17 @@ --chat-message-name-color: var(--neutral-70); } +.ide-redesign-main { + --chat-bg: var(--white); + --chat-color: var(--neutral-70); + --chat-instructions-color: var(--neutral-70); + --chat-new-message-bg: var(--neutral-10); + --chat-new-message-textarea-color: var(--neutral-90); + --chat-new-message-textarea-bg: var(--white); + --chat-message-date-color: var(--neutral-70); + --chat-message-name-color: var(--neutral-70); +} + .chat { $new-message-height: 80px;