diff --git a/web/containers/Layout/RibbonPanel/index.tsx b/web/containers/Layout/RibbonPanel/index.tsx index 41ceea8e3..6bed2b424 100644 --- a/web/containers/Layout/RibbonPanel/index.tsx +++ b/web/containers/Layout/RibbonPanel/index.tsx @@ -22,6 +22,7 @@ import { reduceTransparentAtom, selectedSettingAtom, } from '@/helpers/atoms/Setting.atom' +import { threadsAtom } from '@/helpers/atoms/Thread.atom' export default function RibbonPanel() { const [mainViewState, setMainViewState] = useAtom(mainViewStateAtom) @@ -32,6 +33,7 @@ export default function RibbonPanel() { const reduceTransparent = useAtomValue(reduceTransparentAtom) const setSelectedSetting = useSetAtom(selectedSettingAtom) const downloadedModels = useAtomValue(downloadedModelsAtom) + const threads = useAtomValue(threadsAtom) const onMenuClick = (state: MainViewState) => { if (mainViewState === state) return @@ -88,6 +90,7 @@ export default function RibbonPanel() { reduceTransparent && ' bg-[hsla(var(--ribbon-panel-bg))]', mainViewState === MainViewState.Thread && !isDownloadALocalModel && + !threads.length && 'border-none' )} > diff --git a/web/jest.config.js b/web/jest.config.js index bbdf21742..7601f1e43 100644 --- a/web/jest.config.js +++ b/web/jest.config.js @@ -7,9 +7,21 @@ const createJestConfig = nextJest({}) const config = { coverageProvider: 'v8', testEnvironment: 'jsdom', + transform: { + '^.+\\.(ts|tsx)$': 'ts-jest', + '^.+\\.(js|jsx)$': 'babel-jest', + }, + moduleNameMapper: { + // ... + '^@/(.*)$': '/$1', + }, // Add more setup options before each test is run // setupFilesAfterEnv: ['/jest.setup.ts'], } -// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async -module.exports = createJestConfig(config) +// https://stackoverflow.com/a/72926763/5078746 +// module.exports = createJestConfig(config) +module.exports = async () => ({ + ...(await createJestConfig(config)()), + transformIgnorePatterns: ['/node_modules/(?!(layerr)/)'], +}) diff --git a/web/screens/Thread/ThreadCenterPanel/ChatBody/OnDeviceStarterScreen/index.test.tsx b/web/screens/Thread/ThreadCenterPanel/ChatBody/OnDeviceStarterScreen/index.test.tsx new file mode 100644 index 000000000..44ecc3dad --- /dev/null +++ b/web/screens/Thread/ThreadCenterPanel/ChatBody/OnDeviceStarterScreen/index.test.tsx @@ -0,0 +1,171 @@ +import React from 'react' +import { render, screen, fireEvent } from '@testing-library/react' +import { Provider } from 'jotai' +import OnDeviceStarterScreen from './index' +import * as jotai from 'jotai' +import '@testing-library/jest-dom' + +jest.mock('jotai', () => ({ + ...jest.requireActual('jotai'), + useAtomValue: jest.fn(), + useSetAtom: jest.fn(), +})) + +jest.mock('next/image', () => ({ + __esModule: true, + default: (props: any) => , +})) + +jest.mock('@janhq/joi', () => ({ + Button: (props: any) => +
+ + + {toGibibytes(featModel.metadata.size)} + +
)} ) @@ -255,7 +268,7 @@ const OnDeviceStarterScreen = ({ extensionHasSettings }: Props) => { return (
{row.map((remoteEngine) => { const engineLogo = getLogoEngine( diff --git a/web/screens/Thread/index.tsx b/web/screens/Thread/index.tsx index 8b4db95ec..4fda61e2c 100644 --- a/web/screens/Thread/index.tsx +++ b/web/screens/Thread/index.tsx @@ -7,7 +7,7 @@ import ThreadLeftPanel from '@/screens/Thread/ThreadLeftPanel' import { localEngines } from '@/utils/modelEngine' import ThreadCenterPanel from './ThreadCenterPanel' -import OnDeviceStarterScreen from './ThreadCenterPanel/ChatBody/EmptyModel' +import OnDeviceStarterScreen from './ThreadCenterPanel/ChatBody/OnDeviceStarterScreen' import ModalCleanThread from './ThreadLeftPanel/ModalCleanThread' import ModalDeleteThread from './ThreadLeftPanel/ModalDeleteThread' import ModalEditTitleThread from './ThreadLeftPanel/ModalEditTitleThread'