mirror of
https://github.com/khoaliber/khoj.git
synced 2026-03-09 13:25:11 +00:00
Improve loading state when files not found and fix default state interpretation for model selector
This commit is contained in:
@@ -28,7 +28,7 @@ import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/h
|
|||||||
import { Skeleton } from "@/components/ui/skeleton";
|
import { Skeleton } from "@/components/ui/skeleton";
|
||||||
|
|
||||||
interface ModelSelectorProps extends PopoverProps {
|
interface ModelSelectorProps extends PopoverProps {
|
||||||
onSelect: (model: ModelOptions) => void;
|
onSelect: (model: ModelOptions, userModification: boolean) => void;
|
||||||
selectedModel?: string;
|
selectedModel?: string;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
}
|
}
|
||||||
@@ -51,7 +51,6 @@ export function ModelSelector({ ...props }: ModelSelectorProps) {
|
|||||||
} else {
|
} else {
|
||||||
setSelectedModel(models[0]);
|
setSelectedModel(models[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}, [models, props.selectedModel, userConfig]);
|
}, [models, props.selectedModel, userConfig]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -63,7 +62,8 @@ export function ModelSelector({ ...props }: ModelSelectorProps) {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (selectedModel) {
|
if (selectedModel) {
|
||||||
props.onSelect(selectedModel);
|
const userModification = selectedModel.id !== userConfig?.selected_chat_model_config;
|
||||||
|
props.onSelect(selectedModel, userModification);
|
||||||
}
|
}
|
||||||
}, [selectedModel]);
|
}, [selectedModel]);
|
||||||
|
|
||||||
|
|||||||
@@ -46,20 +46,14 @@ import { ScrollArea } from "@/components/ui/scroll-area";
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
ArrowRight,
|
ArrowRight,
|
||||||
ArrowLeft,
|
|
||||||
ArrowDown,
|
ArrowDown,
|
||||||
Spinner,
|
Spinner,
|
||||||
Check,
|
Check,
|
||||||
FolderPlus,
|
FolderPlus,
|
||||||
DotsThreeVertical,
|
DotsThreeVertical,
|
||||||
House,
|
|
||||||
StackPlus,
|
|
||||||
UserCirclePlus,
|
|
||||||
Sidebar,
|
|
||||||
NotePencil,
|
|
||||||
FunnelSimple,
|
FunnelSimple,
|
||||||
MagnifyingGlass,
|
|
||||||
ChatsCircle,
|
ChatsCircle,
|
||||||
|
Info,
|
||||||
} from "@phosphor-icons/react";
|
} from "@phosphor-icons/react";
|
||||||
|
|
||||||
interface ChatHistory {
|
interface ChatHistory {
|
||||||
@@ -132,7 +126,7 @@ function renameConversation(conversationId: string, newTitle: string) {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
.then((response) => response.json())
|
.then((response) => response.json())
|
||||||
.then((data) => {})
|
.then((data) => { })
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
return;
|
return;
|
||||||
@@ -171,7 +165,7 @@ function deleteConversation(conversationId: string) {
|
|||||||
response.json();
|
response.json();
|
||||||
mutate("/api/chat/sessions");
|
mutate("/api/chat/sessions");
|
||||||
})
|
})
|
||||||
.then((data) => {})
|
.then((data) => { })
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
return;
|
return;
|
||||||
@@ -237,8 +231,29 @@ export function FilesMenu(props: FilesMenuProps) {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (error) return <div>Failed to load files</div>;
|
if (error || selectedFilesError) {
|
||||||
if (selectedFilesError) return <div>Failed to load selected files</div>;
|
return (
|
||||||
|
<div className="w-auto bg-background border border-muted p-4 drop-shadow-sm rounded-2xl">
|
||||||
|
<div className="flex items-center justify-between space-x-4">
|
||||||
|
<h4 className="text-sm font-semibold">
|
||||||
|
Context
|
||||||
|
<p>
|
||||||
|
<span className="text-muted-foreground text-xs">
|
||||||
|
{
|
||||||
|
error ? "Failed to load files" : "Failed to load selected files"
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
</h4>
|
||||||
|
<Button variant="ghost" size="sm" className="w-9 p-0">
|
||||||
|
<Info className="h-4 w-4" />
|
||||||
|
<span className="sr-only">Error Info</span>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (!files) return <InlineLoading />;
|
if (!files) return <InlineLoading />;
|
||||||
if (!selectedFiles && props.conversationId) return <InlineLoading />;
|
if (!selectedFiles && props.conversationId) return <InlineLoading />;
|
||||||
|
|
||||||
|
|||||||
@@ -183,9 +183,9 @@ function ChatSidebarInternal({ ...props }: ChatSideBarProps) {
|
|||||||
setHasModified(false);
|
setHasModified(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleModelSelect(model: string) {
|
function handleModelSelect(model: string, userModification: boolean = true) {
|
||||||
setSelectedModel(model);
|
setSelectedModel(model);
|
||||||
if (model !== agentData?.chat_model) {
|
if (userModification) {
|
||||||
setHasModified(true);
|
setHasModified(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -255,7 +255,7 @@ function ChatSidebarInternal({ ...props }: ChatSideBarProps) {
|
|||||||
<SidebarMenuItem key={"model"} className="list-none">
|
<SidebarMenuItem key={"model"} className="list-none">
|
||||||
<ModelSelector
|
<ModelSelector
|
||||||
disabled={!isEditable || !authenticatedData?.is_active}
|
disabled={!isEditable || !authenticatedData?.is_active}
|
||||||
onSelect={(model) => handleModelSelect(model.name)}
|
onSelect={(model, userModification) => handleModelSelect(model.name, userModification)}
|
||||||
selectedModel={selectedModel}
|
selectedModel={selectedModel}
|
||||||
/>
|
/>
|
||||||
</SidebarMenuItem>
|
</SidebarMenuItem>
|
||||||
@@ -395,7 +395,7 @@ function ChatSidebarInternal({ ...props }: ChatSideBarProps) {
|
|||||||
<SidebarMenuItem>
|
<SidebarMenuItem>
|
||||||
<SidebarMenuButton asChild>
|
<SidebarMenuButton asChild>
|
||||||
<Button
|
<Button
|
||||||
className="w-full"
|
className={`w-full ${hasModified ? "bg-accent-foreground text-accent" : ""}`}
|
||||||
variant={"secondary"}
|
variant={"secondary"}
|
||||||
onClick={() => handleSave()}
|
onClick={() => handleSave()}
|
||||||
disabled={!isEditable || !hasModified || isSaving}
|
disabled={!isEditable || !hasModified || isSaving}
|
||||||
|
|||||||
Reference in New Issue
Block a user