Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions web/app/search/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,8 @@ export default function RootLayout() {
<body className="font-sans antialiased">
<JotaiWrapper>
<ThemeWrapper>
<ClipboardListener>
<Search />
</ClipboardListener>
<ClipboardListener />
<Search />
</ThemeWrapper>
</JotaiWrapper>
</body>
Expand Down
8 changes: 2 additions & 6 deletions web/containers/ListContainer/index.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
import { ReactNode, useCallback, useEffect, useRef } from 'react'
import { PropsWithChildren, useCallback, useEffect, useRef } from 'react'

import { ScrollArea } from '@janhq/joi'

type Props = {
children: ReactNode
}

const ListContainer = ({ children }: Props) => {
const ListContainer = ({ children }: PropsWithChildren) => {
const listRef = useRef<HTMLDivElement>(null)
const prevScrollTop = useRef(0)
const isUserManuallyScrollingUp = useRef(false)
Expand Down
1 change: 0 additions & 1 deletion web/containers/ModelConfigInput/index.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import '@testing-library/jest-dom'
import React from 'react'
import { render, fireEvent } from '@testing-library/react'
import ModelConfigInput from './index'
import { Tooltip } from '@janhq/joi'

// Mocking the Tooltip component to simplify testing
jest.mock('@janhq/joi', () => ({
Expand Down
6 changes: 3 additions & 3 deletions web/containers/Providers/AppUpdateListener.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Fragment, PropsWithChildren, useEffect } from 'react'
import { Fragment, useEffect } from 'react'

import { AppUpdateInfo } from '@janhq/core'
import { useSetAtom } from 'jotai'
Expand All @@ -8,7 +8,7 @@ import {
updateVersionErrorAtom,
} from '@/helpers/atoms/App.atom'

const AppUpdateListener = ({ children }: PropsWithChildren) => {
const AppUpdateListener = () => {
const setProgress = useSetAtom(appDownloadProgressAtom)
const setUpdateVersionError = useSetAtom(updateVersionErrorAtom)

Expand Down Expand Up @@ -39,7 +39,7 @@ const AppUpdateListener = ({ children }: PropsWithChildren) => {
}
}, [setProgress, setUpdateVersionError])

return <Fragment>{children}</Fragment>
return <Fragment></Fragment>
}

export default AppUpdateListener
6 changes: 3 additions & 3 deletions web/containers/Providers/ClipboardListener.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Fragment, PropsWithChildren } from 'react'
import { Fragment } from 'react'

import { useSetAtom } from 'jotai'

import { selectedTextAtom } from './Jotai'

const ClipboardListener = ({ children }: PropsWithChildren) => {
const ClipboardListener = () => {
const setSelectedText = useSetAtom(selectedTextAtom)

if (typeof window !== 'undefined') {
Expand All @@ -13,7 +13,7 @@ const ClipboardListener = ({ children }: PropsWithChildren) => {
})
}

return <Fragment>{children}</Fragment>
return <Fragment></Fragment>
}

export default ClipboardListener
18 changes: 5 additions & 13 deletions web/containers/Providers/DataLoader.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
'use client'

import { Fragment, ReactNode, useEffect } from 'react'
import { Fragment, useEffect } from 'react'

import { AppConfiguration, getUserHomePath } from '@janhq/core'
import { useSetAtom } from 'jotai'

import useAssistants from '@/hooks/useAssistants'
import useGetSystemResources from '@/hooks/useGetSystemResources'
import { useLoadTheme } from '@/hooks/useLoadTheme'
import useModels from '@/hooks/useModels'
import useThreads from '@/hooks/useThreads'

Expand All @@ -20,27 +19,20 @@ import {
} from '@/helpers/atoms/AppConfig.atom'
import { janSettingScreenAtom } from '@/helpers/atoms/Setting.atom'

type Props = {
children: ReactNode
}

const DataLoader: React.FC<Props> = ({ children }) => {
const DataLoader: React.FC = () => {
const setJanDataFolderPath = useSetAtom(janDataFolderPathAtom)
const setQuickAskEnabled = useSetAtom(quickAskEnabledAtom)
const setJanDefaultDataFolder = useSetAtom(defaultJanDataFolderAtom)
const setJanSettingScreen = useSetAtom(janSettingScreenAtom)
const { loadDataModel, configurePullOptions } = useModels()
const { getData: loadModels } = useModels()

useThreads()
useAssistants()
useGetSystemResources()
useLoadTheme()

useEffect(() => {
// Load data once
loadDataModel()
// Configure pull options once
configurePullOptions()
loadModels()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

Expand Down Expand Up @@ -71,7 +63,7 @@ const DataLoader: React.FC<Props> = ({ children }) => {

console.debug('Load Data...')

return <Fragment>{children}</Fragment>
return <Fragment></Fragment>
}

export default DataLoader
9 changes: 3 additions & 6 deletions web/containers/Providers/DeepLinkListener.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Fragment, ReactNode } from 'react'
import { Fragment } from 'react'

import { useSetAtom } from 'jotai'

Expand All @@ -13,11 +13,8 @@ import {
importHuggingFaceModelStageAtom,
importingHuggingFaceRepoDataAtom,
} from '@/helpers/atoms/HuggingFace.atom'
type Props = {
children: ReactNode
}

const DeepLinkListener: React.FC<Props> = ({ children }) => {
const DeepLinkListener: React.FC = () => {
const { getHfRepoData } = useGetHFRepoData()
const setLoadingInfo = useSetAtom(loadingModalInfoAtom)
const setImportingHuggingFaceRepoData = useSetAtom(
Expand Down Expand Up @@ -69,7 +66,7 @@ const DeepLinkListener: React.FC<Props> = ({ children }) => {
handleDeepLinkAction(action)
})

return <Fragment>{children}</Fragment>
return <Fragment></Fragment>
}

type DeepLinkAction = {
Expand Down
24 changes: 11 additions & 13 deletions web/containers/Providers/EventListener.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { PropsWithChildren, useCallback, useEffect } from 'react'
import { useCallback, useEffect } from 'react'

import React from 'react'

Expand All @@ -23,7 +23,7 @@ import { toaster } from '../Toast'

import AppUpdateListener from './AppUpdateListener'
import ClipboardListener from './ClipboardListener'
import EventHandler from './EventHandler'
import ModelHandler from './ModelHandler'

import ModelImportListener from './ModelImportListener'
import QuickAskListener from './QuickAskListener'
Expand All @@ -39,7 +39,7 @@ import {
removeDownloadingModelAtom,
} from '@/helpers/atoms/Model.atom'

const EventListenerWrapper = ({ children }: PropsWithChildren) => {
const EventListener = () => {
const setDownloadState = useSetAtom(setDownloadStateAtom)
const setInstallingExtension = useSetAtom(setInstallingExtensionAtom)
const removeInstallingExtension = useSetAtom(removeInstallingExtensionAtom)
Expand Down Expand Up @@ -156,16 +156,14 @@ const EventListenerWrapper = ({ children }: PropsWithChildren) => {
])

return (
<AppUpdateListener>
<ClipboardListener>
<ModelImportListener>
<QuickAskListener>
<EventHandler>{children}</EventHandler>
</QuickAskListener>
</ModelImportListener>
</ClipboardListener>
</AppUpdateListener>
<>
<AppUpdateListener />
<ClipboardListener />
<ModelImportListener />
<QuickAskListener />
<ModelHandler />
</>
)
}

export default EventListenerWrapper
export default EventListener
8 changes: 2 additions & 6 deletions web/containers/Providers/Jotai.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
'use client'

import { ReactNode } from 'react'
import { PropsWithChildren } from 'react'

import { Provider, atom } from 'jotai'

type Props = {
children: ReactNode
}

export const editPromptAtom = atom<string>('')
export const currentPromptAtom = atom<string>('')
export const fileUploadAtom = atom<FileInfo[]>([])
Expand All @@ -16,7 +12,7 @@ export const searchAtom = atom<string>('')

export const selectedTextAtom = atom('')

export default function JotaiWrapper({ children }: Props) {
export default function JotaiWrapper({ children }: PropsWithChildren) {
return <Provider>{children}</Provider>
}

Expand Down
10 changes: 3 additions & 7 deletions web/containers/Providers/KeyListener.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client'

import { Fragment, ReactNode, useEffect } from 'react'
import { Fragment, useEffect } from 'react'

import { useAtom, useAtomValue, useSetAtom } from 'jotai'

Expand All @@ -22,11 +22,7 @@ import {
ThreadModalAction,
} from '@/helpers/atoms/Thread.atom'

type Props = {
children: ReactNode
}

export default function KeyListener({ children }: Props) {
export default function KeyListener() {
const setShowLeftPanel = useSetAtom(showLeftPanelAtom)
const setShowRightPanel = useSetAtom(showRightPanelAtom)
const [mainViewState, setMainViewState] = useAtom(mainViewStateAtom)
Expand Down Expand Up @@ -94,5 +90,5 @@ export default function KeyListener({ children }: Props) {
setShowRightPanel,
])

return <Fragment>{children}</Fragment>
return <Fragment></Fragment>
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Fragment, ReactNode, useCallback, useEffect, useRef } from 'react'
import { Fragment, useCallback, useEffect, useRef } from 'react'

import {
ChatCompletionMessage,
Expand Down Expand Up @@ -43,7 +43,7 @@ import {
const maxWordForThreadTitle = 10
const defaultThreadTitle = 'New Thread'

export default function EventHandler({ children }: { children: ReactNode }) {
export default function ModelHandler() {
const messages = useAtomValue(getCurrentChatMessagesAtom)
const addNewMessage = useSetAtom(addNewMessageAtom)
const updateMessage = useSetAtom(updateMessageAtom)
Expand Down Expand Up @@ -333,5 +333,5 @@ export default function EventHandler({ children }: { children: ReactNode }) {
}
}, [onNewMessageResponse, onMessageResponseUpdate, onModelStopped])

return <Fragment>{children}</Fragment>
return <Fragment></Fragment>
}
6 changes: 3 additions & 3 deletions web/containers/Providers/ModelImportListener.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Fragment, PropsWithChildren, useCallback, useEffect } from 'react'
import { Fragment, useCallback, useEffect } from 'react'

import {
ImportingModel,
Expand All @@ -17,7 +17,7 @@ import {
updateImportingModelProgressAtom,
} from '@/helpers/atoms/Model.atom'

const ModelImportListener = ({ children }: PropsWithChildren) => {
const ModelImportListener = () => {
const updateImportingModelProgress = useSetAtom(
updateImportingModelProgressAtom
)
Expand Down Expand Up @@ -103,7 +103,7 @@ const ModelImportListener = ({ children }: PropsWithChildren) => {
onImportModelFailed,
])

return <Fragment>{children}</Fragment>
return <Fragment></Fragment>
}

export default ModelImportListener
10 changes: 3 additions & 7 deletions web/containers/Providers/QuickAskListener.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Fragment, ReactNode } from 'react'
import { Fragment } from 'react'

import { useSetAtom } from 'jotai'

Expand All @@ -10,11 +10,7 @@ import useSendChatMessage from '@/hooks/useSendChatMessage'

import { mainViewStateAtom } from '@/helpers/atoms/App.atom'

type Props = {
children: ReactNode
}

const QuickAskListener: React.FC<Props> = ({ children }) => {
const QuickAskListener: React.FC = () => {
const { sendChatMessage } = useSendChatMessage()
const setMainState = useSetAtom(mainViewStateAtom)

Expand All @@ -27,7 +23,7 @@ const QuickAskListener: React.FC<Props> = ({ children }) => {
debounced(input)
})

return <Fragment>{children}</Fragment>
return <Fragment></Fragment>
}

export default QuickAskListener
29 changes: 3 additions & 26 deletions web/containers/Providers/Responsive.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,6 @@ describe('Responsive', () => {
})
})

it('renders children correctly', () => {
const { getByText } = render(
<Responsive>
<div>Child Content</div>
</Responsive>
)

// Check if the child content is rendered
expect(getByText('Child Content')).toBeInTheDocument()
})

it('hides left and right panels on small screens', () => {
// Simulate mobile view
window.matchMedia = jest.fn().mockImplementation((query) => ({
Expand All @@ -64,11 +53,7 @@ describe('Responsive', () => {
removeListener: jest.fn(),
}))

render(
<Responsive>
<div>Child Content</div>
</Responsive>
)
render(<Responsive />)

// Check that the left and right panel states were updated to false
expect(mockSetShowLeftPanel).toHaveBeenCalledWith(false)
Expand All @@ -83,11 +68,7 @@ describe('Responsive', () => {
removeListener: jest.fn(),
}))

render(
<Responsive>
<div>Child Content</div>
</Responsive>
)
render(<Responsive />)

// Change back to desktop view
window.matchMedia = jest.fn().mockImplementation((query) => ({
Expand All @@ -97,11 +78,7 @@ describe('Responsive', () => {
}))

// Call the effect manually to simulate the component re-rendering
const rerender = render(
<Responsive>
<div>Child Content</div>
</Responsive>
)
const rerender = render(<Responsive />)

// Check that the last known states were restored (which were true initially)
expect(mockSetShowLeftPanel).toHaveBeenCalledWith(true)
Expand Down
Loading