diff --git a/web/containers/ModelDropdown/index.tsx b/web/containers/ModelDropdown/index.tsx index ed7eed635f..3d72df615f 100644 --- a/web/containers/ModelDropdown/index.tsx +++ b/web/containers/ModelDropdown/index.tsx @@ -1,4 +1,4 @@ -import { useState, useMemo, useEffect, useCallback } from 'react' +import { useState, useMemo, useEffect, useCallback, useRef } from 'react' import { InferenceEngine } from '@janhq/core' import { Badge, Input, ScrollArea, Select, useClickOutside } from '@janhq/joi' @@ -70,7 +70,7 @@ const ModelDropdown = ({ const downloadStates = useAtomValue(modelDownloadStateAtom) const setThreadModelParams = useSetAtom(setThreadModelParamsAtom) const { updateModelParameter } = useUpdateModelParameters() - + const searchInputRef = useRef(null) const configuredModels = useAtomValue(configuredModelsAtom) const featuredModel = configuredModels.filter((x) => x.metadata.tags.includes('Featured') @@ -108,6 +108,12 @@ const ModelDropdown = ({ [configuredModels, searchText, searchFilter] ) + useEffect(() => { + if (open && searchInputRef.current) { + searchInputRef.current.focus() + } + }, [open]) + useEffect(() => { if (!activeThread) return let model = downloadedModels.find( @@ -258,6 +264,7 @@ const ModelDropdown = ({ setSearchText(e.target.value)} suffixIcon={ diff --git a/web/screens/Thread/ThreadLeftPanel/ModalCleanThread/index.tsx b/web/screens/Thread/ThreadLeftPanel/ModalCleanThread/index.tsx index f03dcc8b5e..03878254f3 100644 --- a/web/screens/Thread/ThreadLeftPanel/ModalCleanThread/index.tsx +++ b/web/screens/Thread/ThreadLeftPanel/ModalCleanThread/index.tsx @@ -7,9 +7,10 @@ import useDeleteThread from '@/hooks/useDeleteThread' type Props = { threadId: string + closeContextMenu?: () => void } -const ModalCleanThread = ({ threadId }: Props) => { +const ModalCleanThread = ({ threadId, closeContextMenu }: Props) => { const { cleanThread } = useDeleteThread() const onCleanThreadClick = useCallback( (e: React.MouseEvent) => { @@ -22,6 +23,11 @@ const ModalCleanThread = ({ threadId }: Props) => { return ( { + if (open && closeContextMenu) { + closeContextMenu() + } + }} trigger={
void } -const ModalDeleteThread = ({ threadId }: Props) => { +const ModalDeleteThread = ({ threadId, closeContextMenu }: Props) => { const { deleteThread } = useDeleteThread() + const onDeleteThreadClick = useCallback( (e: React.MouseEvent) => { e.stopPropagation() @@ -22,6 +24,11 @@ const ModalDeleteThread = ({ threadId }: Props) => { return ( { + if (open && closeContextMenu) { + closeContextMenu() + } + }} trigger={
void } -const ModalEditTitleThread = ({ thread }: Props) => { +const ModalEditTitleThread = ({ thread, closeContextMenu }: Props) => { const [title, setTitle] = useState(thread.title) const { updateThreadMetadata } = useCreateNewThread() @@ -30,6 +31,11 @@ const ModalEditTitleThread = ({ thread }: Props) => { return ( { + if (open && closeContextMenu) { + closeContextMenu() + } + }} trigger={
{ const setEditMessage = useSetAtom(editMessageAtom) const { recommendedModel, downloadedModels } = useRecommendedModel() + const [contextMenu, setContextMenu] = useState<{ + visible: boolean + thread?: Thread + }>({ + visible: false, + thread: undefined, + }) + const onThreadClick = useCallback( (thread: Thread) => { setActiveThread(thread) @@ -91,6 +99,21 @@ const ThreadLeftPanel = () => { } } + const onContextMenu = (event: React.MouseEvent, thread: Thread) => { + event.preventDefault() + setContextMenu({ + visible: true, + thread, + }) + } + + const closeContextMenu = () => { + setContextMenu({ + visible: false, + thread: undefined, + }) + } + return ( {threads.length === 0 ? ( @@ -124,8 +147,10 @@ const ThreadLeftPanel = () => { onClick={() => { onThreadClick(thread) }} + onContextMenu={(e) => onContextMenu(e, thread)} + onMouseLeave={closeContextMenu} > -
+

{ -
- - - +
+ + +
{activeThreadId === thread.id && ( diff --git a/web/screens/Thread/ThreadRightPanel/Tools/index.tsx b/web/screens/Thread/ThreadRightPanel/Tools/index.tsx index 7faecc08ae..2b34cbb677 100644 --- a/web/screens/Thread/ThreadRightPanel/Tools/index.tsx +++ b/web/screens/Thread/ThreadRightPanel/Tools/index.tsx @@ -166,7 +166,7 @@ const Tools = () => {