From d902e78ffa0cbbcc8db0bd98e26d9063c6e8c9ce Mon Sep 17 00:00:00 2001
From: Mamadou DICKO <63923024+mamadoudicko@users.noreply.github.com>
Date: Mon, 20 Nov 2023 18:22:06 +0100
Subject: [PATCH] feat(apiBrain): improve ux (#1672)
Demo:
https://github.com/StanGirard/quivr/assets/63923024/71efe888-285a-41ed-aa89-44e5f0b99162
---
backend/models/brain_entity.py | 1 +
backend/models/databases/supabase/brains.py | 8 +++--
.../BrainListItem/BrainListItem.tsx | 8 +++--
.../PublicBrainItem/PublicBrainItem.tsx | 22 ++++++++++++--
.../components/SecretsDefinitionFields.tsx | 2 +-
.../ActionsBar/components/ChatInput/index.tsx | 6 ++--
.../getKnowledgeCardIconFromBrainType.tsx | 19 ------------
.../mapBackendMinimalBrainToMinimalBrain.ts | 1 +
frontend/lib/context/BrainProvider/types.ts | 1 +
.../lib/helpers/getBrainIconFromBrainType.tsx | 30 +++++++++++++++++++
10 files changed, 68 insertions(+), 30 deletions(-)
delete mode 100644 frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/utils/getKnowledgeCardIconFromBrainType.tsx
create mode 100644 frontend/lib/helpers/getBrainIconFromBrainType.tsx
diff --git a/backend/models/brain_entity.py b/backend/models/brain_entity.py
index dd011458f..e251c4a8f 100644
--- a/backend/models/brain_entity.py
+++ b/backend/models/brain_entity.py
@@ -43,6 +43,7 @@ class MinimalBrainEntity(BaseModel):
name: str
rights: RoleEnum
status: str
+ brain_type: BrainType
class PublicBrain(BaseModel):
diff --git a/backend/models/databases/supabase/brains.py b/backend/models/databases/supabase/brains.py
index da1b03c0e..7fb536282 100644
--- a/backend/models/databases/supabase/brains.py
+++ b/backend/models/databases/supabase/brains.py
@@ -73,7 +73,7 @@ class Brain(Repository):
def get_user_brains(self, user_id) -> list[MinimalBrainEntity]:
response = (
self.db.from_("brains_users")
- .select("id:brain_id, rights, brains (brain_id, name, status)")
+ .select("id:brain_id, rights, brains (brain_id, name, status, brain_type)")
.filter("user_id", "eq", user_id)
.execute()
)
@@ -85,6 +85,7 @@ class Brain(Repository):
name=item["brains"]["name"],
rights=item["rights"],
status=item["brains"]["status"],
+ brain_type=item["brains"]["brain_type"],
)
)
user_brains[-1].rights = item["rights"]
@@ -120,7 +121,9 @@ class Brain(Repository):
def get_brain_for_user(self, user_id, brain_id) -> MinimalBrainEntity | None:
response = (
self.db.from_("brains_users")
- .select("id:brain_id, rights, brains (id: brain_id, status, name)")
+ .select(
+ "id:brain_id, rights, brains (id: brain_id, status, name, brain_type)"
+ )
.filter("user_id", "eq", user_id)
.filter("brain_id", "eq", brain_id)
.execute()
@@ -134,6 +137,7 @@ class Brain(Repository):
name=brain_data["brains"]["name"],
rights=brain_data["rights"],
status=brain_data["brains"]["status"],
+ brain_type=brain_data["brains"]["brain_type"],
)
def get_brain_details(self, brain_id):
diff --git a/frontend/app/brains-management/[brainId]/components/BrainsList/components/BrainListItem/BrainListItem.tsx b/frontend/app/brains-management/[brainId]/components/BrainsList/components/BrainListItem/BrainListItem.tsx
index cec5bc37c..5175a1088 100644
--- a/frontend/app/brains-management/[brainId]/components/BrainsList/components/BrainListItem/BrainListItem.tsx
+++ b/frontend/app/brains-management/[brainId]/components/BrainsList/components/BrainListItem/BrainListItem.tsx
@@ -1,9 +1,10 @@
import Link from "next/link";
import { useTranslation } from "react-i18next";
-import { FaBrain } from "react-icons/fa";
+import { CgFileDocument } from "react-icons/cg";
import { Chip } from "@/lib/components/ui/Chip";
import { MinimalBrainForUser } from "@/lib/context/BrainProvider/types";
+import { getBrainIconFromBrainType } from "@/lib/helpers/getBrainIconFromBrainType";
import { cn } from "@/lib/utils";
import { useBrainListItem } from "./hooks/useBrainListItem";
@@ -33,7 +34,10 @@ export const BrainListItem = ({ brain }: BrainsListItemProps): JSX.Element => {
>
-
+ {getBrainIconFromBrainType(brain.brain_type, {
+ iconSize: 24,
+ DocBrainIcon: CgFileDocument,
+ })}
{brain.name}
{brain.status === "public" && (
diff --git a/frontend/app/brains-management/library/components/PublicBrainItem/PublicBrainItem.tsx b/frontend/app/brains-management/library/components/PublicBrainItem/PublicBrainItem.tsx
index 16981e708..49c8e3e55 100644
--- a/frontend/app/brains-management/library/components/PublicBrainItem/PublicBrainItem.tsx
+++ b/frontend/app/brains-management/library/components/PublicBrainItem/PublicBrainItem.tsx
@@ -1,9 +1,11 @@
import { useTranslation } from "react-i18next";
+import { CgFileDocument } from "react-icons/cg";
import { MdAdd, MdLink } from "react-icons/md";
import Button from "@/lib/components/ui/Button";
import { Modal } from "@/lib/components/ui/Modal";
import { PublicBrain } from "@/lib/context/BrainProvider/types";
+import { getBrainIconFromBrainType } from "@/lib/helpers/getBrainIconFromBrainType";
import { SecretsDefinitionFields } from "./components/SecretsDefinitionFields";
import { usePublicBrainItem } from "./hooks/usePublicBrainItem";
@@ -61,7 +63,15 @@ export const PublicBrainItem = ({
Trigger={
-
{brain.name}
+
+
+ {getBrainIconFromBrainType(brain.brain_type, {
+ iconSize: 24,
+ DocBrainIcon: CgFileDocument,
+ })}
+
+ {brain.name}
+
-
{brain.name}
+
+
+ {getBrainIconFromBrainType(brain.brain_type, {
+ iconSize: 30,
+ DocBrainIcon: CgFileDocument,
+ })}
+
+ {brain.name}
+
{brainDescription}
diff --git a/frontend/app/brains-management/library/components/PublicBrainItem/components/SecretsDefinitionFields.tsx b/frontend/app/brains-management/library/components/PublicBrainItem/components/SecretsDefinitionFields.tsx
index 129c2cd31..30d34bf55 100644
--- a/frontend/app/brains-management/library/components/PublicBrainItem/components/SecretsDefinitionFields.tsx
+++ b/frontend/app/brains-management/library/components/PublicBrainItem/components/SecretsDefinitionFields.tsx
@@ -31,7 +31,7 @@ export const SecretsDefinitionFields = ({
diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/index.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/index.tsx
index c55531931..c1d382aca 100644
--- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/index.tsx
+++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/index.tsx
@@ -9,7 +9,7 @@ import { OnboardingQuestions } from "./components";
import { ChatBar } from "./components/ChatBar/ChatBar";
import { ConfigModal } from "./components/ConfigModal";
import { useChatInput } from "./hooks/useChatInput";
-import { getKnowledgeCardIconFromBrainType } from "./utils/getKnowledgeCardIconFromBrainType";
+import { getBrainIconFromBrainType } from "../../../../../../../lib/helpers/getBrainIconFromBrainType";
type ChatInputProps = {
shouldDisplayFeedOrSecretsCard: boolean;
@@ -46,9 +46,7 @@ export const ChatInput = ({
onClick={() => setShouldDisplayFeedCard(true)}
tooltip={t("add_content_card_button_tooltip")}
>
- {getKnowledgeCardIconFromBrainType(
- currentBrainDetails?.brain_type
- )}
+ {getBrainIconFromBrainType(currentBrainDetails?.brain_type)}
)}
diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/utils/getKnowledgeCardIconFromBrainType.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/utils/getKnowledgeCardIconFromBrainType.tsx
deleted file mode 100644
index 7fb595724..000000000
--- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/utils/getKnowledgeCardIconFromBrainType.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { LuBrain } from "react-icons/lu";
-import { PiPaperclipFill } from "react-icons/pi";
-import { TbWorld } from "react-icons/tb";
-
-import { BrainType } from "@/lib/types/brainConfig";
-
-export const getKnowledgeCardIconFromBrainType = (
- brainType?: BrainType
-): JSX.Element => {
- const iconSize = 38;
- if (brainType === undefined) {
- return
;
- }
- if (brainType === "api") {
- return
;
- }
-
- return
;
-};
diff --git a/frontend/lib/api/brain/utils/mapBackendMinimalBrainToMinimalBrain.ts b/frontend/lib/api/brain/utils/mapBackendMinimalBrainToMinimalBrain.ts
index 9baf7077f..a9fb5252e 100644
--- a/frontend/lib/api/brain/utils/mapBackendMinimalBrainToMinimalBrain.ts
+++ b/frontend/lib/api/brain/utils/mapBackendMinimalBrainToMinimalBrain.ts
@@ -10,4 +10,5 @@ export const mapBackendMinimalBrainToMinimalBrain = (
name: backendMinimalBrain.name,
role: backendMinimalBrain.rights,
status: backendMinimalBrain.status,
+ brain_type: backendMinimalBrain.brain_type,
});
diff --git a/frontend/lib/context/BrainProvider/types.ts b/frontend/lib/context/BrainProvider/types.ts
index 97bec19c1..76ada3cab 100644
--- a/frontend/lib/context/BrainProvider/types.ts
+++ b/frontend/lib/context/BrainProvider/types.ts
@@ -28,6 +28,7 @@ export type MinimalBrainForUser = {
name: string;
role: BrainRoleType;
status: BrainAccessStatus;
+ brain_type: BrainType;
};
//TODO: rename rights to role in Backend and use MinimalBrainForUser instead of BackendMinimalBrainForUser
diff --git a/frontend/lib/helpers/getBrainIconFromBrainType.tsx b/frontend/lib/helpers/getBrainIconFromBrainType.tsx
new file mode 100644
index 000000000..d815acdbc
--- /dev/null
+++ b/frontend/lib/helpers/getBrainIconFromBrainType.tsx
@@ -0,0 +1,30 @@
+import { IconType } from "react-icons/lib";
+import { LuBrain } from "react-icons/lu";
+import { PiPaperclipFill } from "react-icons/pi";
+import { TbWorld } from "react-icons/tb";
+
+import { BrainType } from "@/lib/types/brainConfig";
+type GetBrainIconFromBrainTypeOptions = {
+ iconSize?: number;
+ ApiBrainIcon?: IconType;
+ DocBrainIcon?: IconType;
+};
+
+export const getBrainIconFromBrainType = (
+ brainType?: BrainType,
+ options?: GetBrainIconFromBrainTypeOptions
+): JSX.Element => {
+ const iconSize = options?.iconSize ?? 38;
+
+ const ApiBrainIcon = options?.ApiBrainIcon ?? TbWorld;
+ const DocBrainIcon = options?.DocBrainIcon ?? PiPaperclipFill;
+
+ if (brainType === undefined) {
+ return
;
+ }
+ if (brainType === "api") {
+ return
;
+ }
+
+ return
;
+};