From 42d85096ccb565dfaa045935112a398bc3a831cc Mon Sep 17 00:00:00 2001 From: mamadoudicko Date: Mon, 11 Dec 2023 17:48:12 +0100 Subject: [PATCH 1/7] style : update colors --- frontend/tailwind.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index 7ee29d0d91da..cc43b5c67491 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -16,7 +16,8 @@ module.exports = { }, colors: { black: "#11243E", - primary: "#7A27FD", + primary: "#6142D4", + accent: "#13ABBA", "chat-bg-gray": "#D9D9D9", "msg-gray": "#9B9B9B", "msg-header-gray": "#8F8F8F", From 9e7122503dcd7649fe36712af06228e61437ea33 Mon Sep 17 00:00:00 2001 From: mamadoudicko Date: Mon, 11 Dec 2023 17:48:28 +0100 Subject: [PATCH 2/7] feat: update chat button --- .../components/ActionsBar/components/ChatInput/index.tsx | 2 +- frontend/lib/components/ui/Button.tsx | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) 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 078e72cc23bc..da4ab08ddf22 100644 --- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/index.tsx +++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/index.tsx @@ -60,7 +60,7 @@ export const ChatInput = ({
; if (tooltip !== undefined) { return ( From 3cb49093bac0cba61745c425db6fe9e08994693e Mon Sep 17 00:00:00 2001 From: mamadoudicko Date: Tue, 12 Dec 2023 09:40:55 +0100 Subject: [PATCH 3/7] feat: add chat options popover --- .../components/ActionsModal/ActionsModal.tsx | 42 ++++++++++ .../ActionsModal/components/Button.tsx | 42 ++++++++++ .../components/ConfigModal/ConfigModal.tsx | 82 +++++++++++++++++++ .../ConfigModal/hooks/useConfigModal.ts | 78 ++++++++++++++++++ .../components/ConfigModal/index.ts | 1 + .../ActionsBar/components/ChatInput/index.tsx | 8 +- 6 files changed, 248 insertions(+), 5 deletions(-) create mode 100644 frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/ActionsModal.tsx create mode 100644 frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/Button.tsx create mode 100644 frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/ConfigModal.tsx create mode 100644 frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/hooks/useConfigModal.ts create mode 100644 frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/index.ts diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/ActionsModal.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/ActionsModal.tsx new file mode 100644 index 000000000000..0742ef086527 --- /dev/null +++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/ActionsModal.tsx @@ -0,0 +1,42 @@ +import { PopoverAnchor } from "@radix-ui/react-popover"; +import { useState } from "react"; +import { LuPlusCircle, LuXCircle } from "react-icons/lu"; + +import Button from "@/lib/components/ui/Button"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/lib/components/ui/Popover"; + +import { ConfigModal } from "./components/ConfigModal"; + +export const ActionsModal = (): JSX.Element => { + const [isActionsModalOpened, setIsActionsModalOpened] = useState(false); + + const Icon = isActionsModalOpened ? LuXCircle : LuPlusCircle; + + return ( +
+ setIsActionsModalOpened(isOpened)} + > + + + + + + + + + +
+ ); +}; diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/Button.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/Button.tsx new file mode 100644 index 000000000000..87f73f38a3bc --- /dev/null +++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/Button.tsx @@ -0,0 +1,42 @@ +import { forwardRef } from "react"; + +import CoreButton, { + ButtonProps as CoreButtonProps, +} from "@/lib/components/ui/Button"; +import { cn } from "@/lib/utils"; + +type ButtonProps = CoreButtonProps & { + onClick?: () => void; + className?: string; + label?: string; + startIcon?: JSX.Element; + endIcon?: JSX.Element; +}; + +export const Button = forwardRef( + ( + { onClick, className, label, startIcon, endIcon, ...props }: ButtonProps, + forwardedRef + ): JSX.Element => { + return ( + +
+
+ {startIcon} + {label} +
+ {endIcon} +
+
+ ); + } +); + +Button.displayName = CoreButton.displayName; diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/ConfigModal.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/ConfigModal.tsx new file mode 100644 index 000000000000..82ddd0bd81f1 --- /dev/null +++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/ConfigModal.tsx @@ -0,0 +1,82 @@ +import { useTranslation } from "react-i18next"; +import { LuChevronRight, LuSettings } from "react-icons/lu"; +import { MdCheck } from "react-icons/md"; + +import { Modal } from "@/lib/components/ui/Modal"; +import { defineMaxTokens } from "@/lib/helpers/defineMaxTokens"; + +import { useConfigModal } from "./hooks/useConfigModal"; +import { Button } from "../Button"; + +export const ConfigModal = (): JSX.Element => { + const { + handleSubmit, + isConfigModalOpen, + setIsConfigModalOpen, + register, + maxTokens, + model, + accessibleModels, + } = useConfigModal(); + const { t } = useTranslation("config"); + + return ( + } + endIcon={} + /> + } + title="Chat configuration" + desc="Adjust your chat settings" + isOpen={isConfigModalOpen} + setOpen={setIsConfigModalOpen} + CloseTrigger={
} + > +
+
+ + +
+
+ + +
+ +
-
+
From 475f5e83a0068c80e15273994c928e228282f407 Mon Sep 17 00:00:00 2001 From: mamadoudicko Date: Tue, 12 Dec 2023 09:41:17 +0100 Subject: [PATCH 4/7] feat: move chat config to chat options popover --- .../components/ConfigModal/ConfigModal.tsx | 1 + .../components/ConfigModal/ConfigModal.tsx | 84 ------------------- .../ConfigModal/hooks/useConfigModal.ts | 78 ----------------- .../ChatInput/components/ConfigModal/index.ts | 1 - .../components/ChatInput/components/index.ts | 1 - 5 files changed, 1 insertion(+), 164 deletions(-) delete mode 100644 frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/ConfigModal.tsx delete mode 100644 frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/hooks/useConfigModal.ts delete mode 100644 frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/index.ts diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/ConfigModal.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/ConfigModal.tsx index 82ddd0bd81f1..bbe66c11097e 100644 --- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/ConfigModal.tsx +++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ActionsModal/components/ConfigModal/ConfigModal.tsx @@ -27,6 +27,7 @@ export const ConfigModal = (): JSX.Element => { label={"Parametres"} startIcon={} endIcon={} + className="w-full" /> } title="Chat configuration" diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/ConfigModal.tsx b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/ConfigModal.tsx deleted file mode 100644 index 7d1406c4f229..000000000000 --- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/ConfigModal.tsx +++ /dev/null @@ -1,84 +0,0 @@ -/* eslint-disable max-lines */ -import { useTranslation } from "react-i18next"; -import { MdCheck, MdSettings } from "react-icons/md"; - -import Button from "@/lib/components/ui/Button"; -import { Modal } from "@/lib/components/ui/Modal"; -import { defineMaxTokens } from "@/lib/helpers/defineMaxTokens"; - -import { useConfigModal } from "./hooks/useConfigModal"; - -export const ConfigModal = (): JSX.Element => { - const { - handleSubmit, - isConfigModalOpen, - setIsConfigModalOpen, - register, - maxTokens, - model, - accessibleModels, - } = useConfigModal(); - const { t } = useTranslation("config"); - - return ( - - - - } - title="Chat configuration" - desc="Adjust your chat settings" - isOpen={isConfigModalOpen} - setOpen={setIsConfigModalOpen} - CloseTrigger={
} - > -
-
- - -
-
- - -
- - -
- - ); -}; diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/hooks/useConfigModal.ts b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/hooks/useConfigModal.ts deleted file mode 100644 index 176bcef2c975..000000000000 --- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/hooks/useConfigModal.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* eslint-disable max-lines */ -import { useCallback, useEffect, useState } from "react"; -import { useForm } from "react-hook-form"; - -import { useLocalStorageChatConfig } from "@/app/chat/[chatId]/hooks/useLocalStorageChatConfig"; -import { saveChatsConfigInLocalStorage } from "@/lib/api/chat/chat.local"; -import { ChatConfig } from "@/lib/context/ChatProvider/types"; -import { getAccessibleModels } from "@/lib/helpers/getAccessibleModels"; -import { useToast } from "@/lib/hooks"; -import { useUserData } from "@/lib/hooks/useUserData"; - -// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -export const useConfigModal = () => { - const { publish } = useToast(); - const [isConfigModalOpen, setIsConfigModalOpen] = useState(false); - const { chatConfig } = useLocalStorageChatConfig(); - const { userData } = useUserData(); - - const { register, watch, setValue } = useForm({ - defaultValues: { - model: chatConfig.model, - temperature: chatConfig.temperature ?? 0, - maxTokens: chatConfig.maxTokens ?? 3000, - }, - }); - - const model = watch("model"); - - const temperature = watch("temperature"); - const maxTokens = watch("maxTokens"); - - const accessibleModels = getAccessibleModels({ - userData, - }); - - useEffect(() => { - if (chatConfig.model !== undefined) { - setValue("model", chatConfig.model); - } - if (chatConfig.temperature !== undefined) { - setValue("temperature", chatConfig.temperature); - } - if (chatConfig.maxTokens !== undefined) { - setValue("maxTokens", chatConfig.maxTokens); - } - }, [chatConfig.maxTokens, chatConfig.model, chatConfig.temperature]); - - const handleSubmit = useCallback(() => { - try { - saveChatsConfigInLocalStorage({ - maxTokens, - model: model.length > 0 ? model : undefined, - temperature, - }); - - publish({ - variant: "success", - text: "Chat config successfully updated", - }); - } catch (err) { - publish({ - variant: "danger", - text: "An error occurred while updating chat config", - }); - } - }, [maxTokens, model, publish, temperature]); - - return { - isConfigModalOpen, - setIsConfigModalOpen, - handleSubmit, - register, - model, - temperature, - maxTokens, - accessibleModels, - }; -}; diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/index.ts b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/index.ts deleted file mode 100644 index 4c07388b515b..000000000000 --- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/ConfigModal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ConfigModal"; diff --git a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/index.ts b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/index.ts index 07a86bb961d0..319b800a7e1e 100644 --- a/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/index.ts +++ b/frontend/app/chat/[chatId]/components/ActionsBar/components/ChatInput/components/index.ts @@ -1,2 +1 @@ -export * from "./ConfigModal"; export * from "./OnboardingQuestions"; From 62b46e80f1af0681fd953756cc7c91363b256904 Mon Sep 17 00:00:00 2001 From: mamadoudicko Date: Tue, 12 Dec 2023 09:42:40 +0100 Subject: [PATCH 5/7] feat: update popover component --- frontend/lib/components/UserToInvite.tsx | 2 + frontend/lib/components/ui/Popover.tsx | 88 +++++++----------------- frontend/lib/components/ui/Select.tsx | 65 ++++++++++------- 3 files changed, 64 insertions(+), 91 deletions(-) diff --git a/frontend/lib/components/UserToInvite.tsx b/frontend/lib/components/UserToInvite.tsx index adfe9b2d1396..045bad91da6b 100644 --- a/frontend/lib/components/UserToInvite.tsx +++ b/frontend/lib/components/UserToInvite.tsx @@ -70,6 +70,8 @@ export const UserToInvite = ({ onChange={setSelectedRole} value={selectedRole} options={translatedOptions} + popoverSide="bottom" + popoverClassName="w-36" />
); diff --git a/frontend/lib/components/ui/Popover.tsx b/frontend/lib/components/ui/Popover.tsx index 36563953476b..98ee59d9e3b2 100644 --- a/frontend/lib/components/ui/Popover.tsx +++ b/frontend/lib/components/ui/Popover.tsx @@ -1,71 +1,29 @@ -"use client"; import * as PopoverPrimitive from "@radix-ui/react-popover"; -import { AnimatePresence, motion } from "framer-motion"; -import { ReactNode, useState } from "react"; +import * as React from "react"; -import Button from "./Button"; +import { cn } from "@/lib/utils"; -interface PopoverProps { - children?: ReactNode; - Trigger: ReactNode; - ActionTrigger?: ReactNode; - CloseTrigger?: ReactNode; -} +const Popover = PopoverPrimitive.Root; -const Popover = ({ - children, - Trigger, - ActionTrigger, - CloseTrigger, -}: PopoverProps): JSX.Element => { - const [open, setOpen] = useState(false); +const PopoverTrigger = PopoverPrimitive.Trigger; - return ( - - {Trigger} - - {open && ( - - - -
{children}
-
- {ActionTrigger !== undefined && ( - - {ActionTrigger} - - )} - - {CloseTrigger === undefined ? ( - - ) : ( - CloseTrigger - )} - -
- -
-
-
- )} -
-
- ); -}; +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)); +PopoverContent.displayName = PopoverPrimitive.Content.displayName; -export default Popover; +export { Popover, PopoverContent, PopoverTrigger }; diff --git a/frontend/lib/components/ui/Select.tsx b/frontend/lib/components/ui/Select.tsx index 901d19863b3c..9926c7e01038 100644 --- a/frontend/lib/components/ui/Select.tsx +++ b/frontend/lib/components/ui/Select.tsx @@ -1,7 +1,13 @@ +/*eslint complexity: ["error", 10]*/ + /* eslint-disable max-lines */ import { BsCheckCircleFill } from "react-icons/bs"; -import Popover from "@/lib/components/ui/Popover"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/lib/components/ui/Popover"; import { cn } from "@/lib/utils"; export type SelectOptionProps = { @@ -17,6 +23,8 @@ type SelectProps = { readOnly?: boolean; className?: string; emptyLabel?: string; + popoverClassName?: string; + popoverSide?: "top" | "bottom" | "left" | "right" | undefined; }; const selectedStyle = "rounded-lg bg-black text-white"; @@ -29,6 +37,8 @@ export const Select = ({ readOnly = false, className, emptyLabel, + popoverClassName, + popoverSide, }: SelectProps): JSX.Element => { const selectedValueLabel = options.find( (option) => option.value === value @@ -74,8 +84,8 @@ export const Select = ({ )}
- + - } - CloseTrigger={
} - > -
    - {options.map((option) => ( -
  • onChange(option.value)} - > -
    + +
      + {options.map((option) => ( +
    • onChange(option.value)} > - - {option.label} - - {value === option.value && } -
    -
  • - ))} -
+
+ + {option.label} + + {value === option.value && } +
+ + ))} + +
From 8818dc41cebf202be5a5aa2481d3cabc0557c765 Mon Sep 17 00:00:00 2001 From: mamadoudicko Date: Tue, 12 Dec 2023 09:44:20 +0100 Subject: [PATCH 6/7] feat: remove unused components --- .../LanguageDropDown/LanguageDropDown.tsx | 59 ------------------- .../user/components/LanguageDropDown/index.ts | 1 - .../LanguageSelect.tsx | 0 .../__tests__/LanguageSelect.test.tsx | 0 .../hooks/useLanguageHook.ts | 0 frontend/app/user/page.tsx | 2 +- 6 files changed, 1 insertion(+), 61 deletions(-) delete mode 100644 frontend/app/user/components/LanguageDropDown/LanguageDropDown.tsx delete mode 100644 frontend/app/user/components/LanguageDropDown/index.ts rename frontend/app/user/components/{LanguageDropDown => LanguageSelect}/LanguageSelect.tsx (100%) rename frontend/app/user/components/{LanguageDropDown => LanguageSelect}/__tests__/LanguageSelect.test.tsx (100%) rename frontend/app/user/components/{LanguageDropDown => LanguageSelect}/hooks/useLanguageHook.ts (100%) diff --git a/frontend/app/user/components/LanguageDropDown/LanguageDropDown.tsx b/frontend/app/user/components/LanguageDropDown/LanguageDropDown.tsx deleted file mode 100644 index 592039294bd3..000000000000 --- a/frontend/app/user/components/LanguageDropDown/LanguageDropDown.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { FaLanguage } from "react-icons/fa"; -import { MdCheck } from "react-icons/md"; - -import Popover from "@/lib/components/ui/Popover"; - -import { useLanguageHook } from "./hooks/useLanguageHook"; - -export const LanguageDropDown = (): JSX.Element => { - const { allLanguages, currentLanguage, change } = useLanguageHook(); - - return ( - <> - {/* Add the brain icon and dropdown */} -
- - - - } - CloseTrigger={false} - > -
-
- {Object.keys(allLanguages).map((lang) => { - return ( -
- -
- ); - })} -
-
-
-
- - ); -}; diff --git a/frontend/app/user/components/LanguageDropDown/index.ts b/frontend/app/user/components/LanguageDropDown/index.ts deleted file mode 100644 index 6d219232313f..000000000000 --- a/frontend/app/user/components/LanguageDropDown/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./LanguageDropDown"; diff --git a/frontend/app/user/components/LanguageDropDown/LanguageSelect.tsx b/frontend/app/user/components/LanguageSelect/LanguageSelect.tsx similarity index 100% rename from frontend/app/user/components/LanguageDropDown/LanguageSelect.tsx rename to frontend/app/user/components/LanguageSelect/LanguageSelect.tsx diff --git a/frontend/app/user/components/LanguageDropDown/__tests__/LanguageSelect.test.tsx b/frontend/app/user/components/LanguageSelect/__tests__/LanguageSelect.test.tsx similarity index 100% rename from frontend/app/user/components/LanguageDropDown/__tests__/LanguageSelect.test.tsx rename to frontend/app/user/components/LanguageSelect/__tests__/LanguageSelect.test.tsx diff --git a/frontend/app/user/components/LanguageDropDown/hooks/useLanguageHook.ts b/frontend/app/user/components/LanguageSelect/hooks/useLanguageHook.ts similarity index 100% rename from frontend/app/user/components/LanguageDropDown/hooks/useLanguageHook.ts rename to frontend/app/user/components/LanguageSelect/hooks/useLanguageHook.ts diff --git a/frontend/app/user/page.tsx b/frontend/app/user/page.tsx index 42cf2a0a49a3..2ba9e2dcd938 100644 --- a/frontend/app/user/page.tsx +++ b/frontend/app/user/page.tsx @@ -9,7 +9,7 @@ import { redirectToLogin } from "@/lib/router/redirectToLogin"; import { StripePricingOrManageButton, UserStatistics } from "./components"; import { ApiKeyConfig } from "./components/ApiKeyConfig"; -import LanguageSelect from "./components/LanguageDropDown/LanguageSelect"; +import LanguageSelect from "./components/LanguageSelect/LanguageSelect"; import { LogoutModal } from "./components/LogoutCard/LogoutModal"; import ThemeSelect from "./components/ThemeSelect/ThemeSelect"; From 182286321d8be72211aa386b166d2bd12ad6c087 Mon Sep 17 00:00:00 2001 From: mamadoudicko Date: Tue, 12 Dec 2023 12:33:19 +0100 Subject: [PATCH 7/7] style: update Quivr font --- frontend/app/layout.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx index b43a7174ff40..6a632711074e 100644 --- a/frontend/app/layout.tsx +++ b/frontend/app/layout.tsx @@ -1,6 +1,6 @@ import { createServerComponentSupabaseClient } from "@supabase/auth-helpers-nextjs"; import { Analytics as VercelAnalytics } from "@vercel/analytics/react"; -import { Inter } from "next/font/google"; +import { Outfit } from "next/font/google"; import { cookies, headers } from "next/headers"; import { ToastProvider } from "@/lib/components/ui/Toast"; @@ -10,7 +10,7 @@ import { SupabaseProvider } from "@/lib/context/SupabaseProvider"; import { App } from "./App"; import "./globals.css"; -const inter = Inter({ subsets: ["latin"] }); +const inter = Outfit({ subsets: ["latin"], weight: "400" }); export const metadata = { title: "Quivr - Get a Second Brain with Generative AI",