feat: remove <BrainConfigProvider /> (#1154)

This commit is contained in:
Mamadou DICKO 2023-09-12 18:04:35 +02:00 committed by GitHub
parent 7cc90ef258
commit 7f9ea9d64c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 49 additions and 226 deletions

View File

@ -1,5 +1,3 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable max-lines */
import { UUID } from "crypto";
@ -10,11 +8,8 @@ import Button from "@/lib/components/ui/Button";
import { Divider } from "@/lib/components/ui/Divider";
import Field from "@/lib/components/ui/Field";
import { TextArea } from "@/lib/components/ui/TextArea";
import {
freeModels,
paidModels,
} from "@/lib/context/BrainConfigProvider/types";
import { defineMaxTokens } from "@/lib/helpers/defineMaxTokens";
import { freeModels, paidModels } from "@/lib/types/brainConfig";
import { SaveButton } from "@/shared/SaveButton";
import { PublicPrompts } from "./components/PublicPrompts/PublicPrompts";

View File

@ -10,7 +10,7 @@ import { useTranslation } from "react-i18next";
import { getBrainDataKey } from "@/lib/api/brain/config";
import { useBrainApi } from "@/lib/api/brain/useBrainApi";
import { usePromptApi } from "@/lib/api/prompt/usePromptApi";
import { useBrainConfig } from "@/lib/context/BrainConfigProvider";
import { defaultBrainConfig } from "@/lib/config/defaultBrainConfig";
import { useBrainContext } from "@/lib/context/BrainProvider/hooks/useBrainContext";
import { Brain } from "@/lib/context/BrainProvider/types";
import { defineMaxTokens } from "@/lib/helpers/defineMaxTokens";
@ -30,13 +30,12 @@ export const useSettingsTab = ({ brainId }: UseSettingsTabProps) => {
const { publish } = useToast();
const formRef = useRef<HTMLFormElement>(null);
const { setAsDefaultBrain, getBrain, updateBrain } = useBrainApi();
const { config } = useBrainConfig();
const { fetchAllBrains, fetchDefaultBrain, defaultBrainId } =
useBrainContext();
const { getPrompt, updatePrompt, createPrompt } = usePromptApi();
const defaultValues = {
...config,
...defaultBrainConfig,
name: "",
description: "",
setDefault: false,

View File

@ -1,10 +1,6 @@
import { render } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import {
BrainConfigContextMock,
BrainConfigProviderMock,
} from "@/lib/context/BrainConfigProvider/mocks/BrainConfigProviderMock";
import {
BrainContextMock,
BrainProviderMock,
@ -38,10 +34,6 @@ vi.mock("@/lib/context/BrainProvider/brain-provider", () => ({
BrainContext: BrainContextMock,
}));
vi.mock("@/lib/context/BrainConfigProvider/brain-config-provider", () => ({
BrainConfigContext: BrainConfigContextMock,
}));
vi.mock("@/lib/api/chat/useChatApi", () => ({
useChatApi: () => ({
getHistory: () => [],
@ -53,11 +45,9 @@ describe("Chat page", () => {
const { getByTestId } = render(
<ChatProviderMock>
<SupabaseProviderMock>
<BrainConfigProviderMock>
<BrainProviderMock>
<SelectedChatPage />,
</BrainProviderMock>
</BrainConfigProviderMock>
<BrainProviderMock>
<SelectedChatPage />,
</BrainProviderMock>
</SupabaseProviderMock>
</ChatProviderMock>
);

View File

@ -3,8 +3,8 @@ import { MdCheck, MdSettings } from "react-icons/md";
import Button from "@/lib/components/ui/Button";
import { Modal } from "@/lib/components/ui/Modal";
import { freeModels } from "@/lib/context/BrainConfigProvider/types";
import { defineMaxTokens } from "@/lib/helpers/defineMaxTokens";
import { freeModels } from "@/lib/types/brainConfig";
import { useConfigModal } from "./hooks/useConfigModal";

View File

@ -7,7 +7,7 @@ import {
getChatConfigFromLocalStorage,
saveChatConfigInLocalStorage,
} from "@/lib/api/chat/chat.local";
import { useBrainConfig } from "@/lib/context/BrainConfigProvider";
import { defaultBrainConfig } from "@/lib/config/defaultBrainConfig";
import { useBrainContext } from "@/lib/context/BrainProvider/hooks/useBrainContext";
import { ChatConfig } from "@/lib/context/ChatProvider/types";
import { defineMaxTokens } from "@/lib/helpers/defineMaxTokens";
@ -17,7 +17,6 @@ import { useToast } from "@/lib/hooks";
export const useConfigModal = (chatId?: string) => {
const { publish } = useToast();
const [isConfigModalOpen, setIsConfigModalOpen] = useState(false);
const { config } = useBrainConfig();
const { getBrain } = useBrainApi();
const { currentBrain } = useBrainContext();
@ -51,14 +50,14 @@ export const useConfigModal = (chatId?: string) => {
if (relatedBrainConfig === undefined) {
return;
}
setValue("model", relatedBrainConfig.model ?? config.model);
setValue("model", relatedBrainConfig.model ?? defaultBrainConfig.model);
setValue(
"temperature",
relatedBrainConfig.temperature ?? config.temperature
relatedBrainConfig.temperature ?? defaultBrainConfig.temperature
);
setValue(
"maxTokens",
relatedBrainConfig.max_tokens ?? config.maxTokens
relatedBrainConfig.max_tokens ?? defaultBrainConfig.maxTokens
);
}
};

View File

@ -1,8 +1,6 @@
import { render } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { BrainConfigProvider } from "@/lib/context/BrainConfigProvider";
import DocumentData from "../DocumentData";
const useSupabaseMock = vi.fn(() => ({
@ -63,9 +61,7 @@ describe("DocumentData", () => {
it.skip("should render document data", () => {
const documentName = "Test document";
const { getByTestId } = render(
<BrainConfigProvider>
<DocumentData documentName={documentName} />
</BrainConfigProvider>
<DocumentData documentName={documentName} />
);
expect(getByTestId("document-name")).toBeDefined();

View File

@ -5,7 +5,6 @@ import { cookies, headers } from "next/headers";
import { ToastProvider } from "@/lib/components/ui/Toast";
import { FeatureFlagsProvider } from "@/lib/context";
import { BrainConfigProvider } from "@/lib/context/BrainConfigProvider";
import { BrainProvider } from "@/lib/context/BrainProvider";
import { SupabaseProvider } from "@/lib/context/SupabaseProvider";
@ -42,13 +41,11 @@ const RootLayout = async ({
<FeatureFlagsProvider>
<ToastProvider>
<SupabaseProvider session={session}>
<BrainConfigProvider>
<BrainProvider>
<App>
<div className="flex-1">{children}</div>
</App>
</BrainProvider>
</BrainConfigProvider>
<BrainProvider>
<App>
<div className="flex-1">{children}</div>
</App>
</BrainProvider>
</SupabaseProvider>
</ToastProvider>
<Analytics />

View File

@ -46,12 +46,6 @@ vi.mock("@/lib/hooks", async () => {
};
});
vi.mock("@/lib/context/BrainConfigProvider", () => ({
useBrainConfig: () => ({
config: {},
}),
}));
describe("useApiKeyConfig", () => {
afterEach(() => {
vi.restoreAllMocks();

View File

@ -7,12 +7,6 @@ vi.mock("@/lib/context/SupabaseProvider", () => ({
useSupabase: () => ({}),
}));
vi.mock("@/lib/context/BrainConfigProvider", () => ({
useBrainConfig: () => ({
config: {},
}),
}));
export const getNock = (url?: string): nock.Scope => {
return nock(
url ?? `${process.env.NEXT_PUBLIC_BACKEND_URL ?? DEFAULT_BACKEND_URL}`

View File

@ -7,11 +7,8 @@ import { PublicPrompts } from "@/app/brains-management/[brainId]/components/Brai
import Button from "@/lib/components/ui/Button";
import Field from "@/lib/components/ui/Field";
import { Modal } from "@/lib/components/ui/Modal";
import {
freeModels,
paidModels,
} from "@/lib/context/BrainConfigProvider/types";
import { defineMaxTokens } from "@/lib/helpers/defineMaxTokens";
import { freeModels, paidModels } from "@/lib/types/brainConfig";
import { useAddBrainModal } from "./hooks/useAddBrainModal";
import { Divider } from "../ui/Divider";

View File

@ -6,7 +6,7 @@ import { useTranslation } from "react-i18next";
import { useBrainApi } from "@/lib/api/brain/useBrainApi";
import { usePromptApi } from "@/lib/api/prompt/usePromptApi";
import { useBrainConfig } from "@/lib/context/BrainConfigProvider";
import { defaultBrainConfig } from "@/lib/config/defaultBrainConfig";
import { useBrainContext } from "@/lib/context/BrainProvider/hooks/useBrainContext";
import { defineMaxTokens } from "@/lib/helpers/defineMaxTokens";
import { useToast } from "@/lib/hooks";
@ -20,9 +20,9 @@ export const useAddBrainModal = () => {
const { setAsDefaultBrain } = useBrainApi();
const { createPrompt } = usePromptApi();
const [isShareModalOpen, setIsShareModalOpen] = useState(false);
const { config } = useBrainConfig();
const defaultValues = {
...config,
...defaultBrainConfig,
name: "",
description: "",
setDefault: false,

View File

@ -2,10 +2,6 @@
import { fireEvent, render } from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
import {
BrainConfigContextMock,
BrainConfigProviderMock,
} from "@/lib/context/BrainConfigProvider/mocks/BrainConfigProviderMock";
import {
BrainContextMock,
BrainProviderMock,
@ -21,10 +17,6 @@ vi.mock("@/lib/context/SupabaseProvider/supabase-provider", () => ({
SupabaseContext: SupabaseContextMock,
}));
vi.mock("@/lib/context/BrainConfigProvider/brain-config-provider", () => ({
BrainConfigContext: BrainConfigContextMock,
}));
vi.mock("@/lib/context/BrainProvider/brain-provider", () => ({
BrainContext: BrainContextMock,
}));
@ -74,11 +66,9 @@ describe("ShareBrain", () => {
it("should render ShareBrain component properly", () => {
const { getByTestId } = render(
<SupabaseProviderMock>
<BrainConfigProviderMock>
<BrainProviderMock>
<ShareBrain brainId="cf9bb422-b1b6-4fd7-abc1-01bd395d2318" />
</BrainProviderMock>
</BrainConfigProviderMock>
<BrainProviderMock>
<ShareBrain brainId="cf9bb422-b1b6-4fd7-abc1-01bd395d2318" />
</BrainProviderMock>
</SupabaseProviderMock>
);
const shareButton = getByTestId("share-brain-button");
@ -90,9 +80,7 @@ describe("ShareBrain", () => {
// Todo: add a custom render function that wraps the component with the providers
<SupabaseProviderMock>
<BrainProviderMock>
<BrainConfigProviderMock>
<ShareBrain brainId="cf9bb422-b1b6-4fd7-abc1-01bd395d2318" />
</BrainConfigProviderMock>
<ShareBrain brainId="cf9bb422-b1b6-4fd7-abc1-01bd395d2318" />
</BrainProviderMock>
</SupabaseProviderMock>
);
@ -104,11 +92,9 @@ describe("ShareBrain", () => {
it('shoud add new user row when "Add new user" button is clicked and only where there is no empty field', async () => {
const { getByTestId, findAllByTestId } = render(
<SupabaseProviderMock>
<BrainConfigProviderMock>
<BrainProviderMock>
<ShareBrain brainId="cf9bb422-b1b6-4fd7-abc1-01bd395d2318" />
</BrainProviderMock>
</BrainConfigProviderMock>
<BrainProviderMock>
<ShareBrain brainId="cf9bb422-b1b6-4fd7-abc1-01bd395d2318" />
</BrainProviderMock>
</SupabaseProviderMock>
);
const shareButton = getByTestId("share-brain-button");

View File

@ -0,0 +1,14 @@
import { BrainConfig } from "../types/brainConfig";
export const defaultBrainConfig: BrainConfig = {
model: "gpt-3.5-turbo",
temperature: 0,
maxTokens: 256,
keepLocal: true,
anthropicKey: undefined,
backendUrl: undefined,
openAiKey: undefined,
supabaseKey: undefined,
supabaseUrl: undefined,
prompt_id: undefined,
};

View File

@ -1,65 +0,0 @@
"use client";
import { createContext, useEffect, useState } from "react";
import { removeUndefined } from "@/lib/helpers/removeUndefined";
import {
getBrainConfigFromLocalStorage,
saveBrainConfigInLocalStorage,
} from "./helpers/brainConfigLocalStorage";
import { BrainConfig, BrainConfigContextType } from "./types";
export const BrainConfigContext = createContext<
BrainConfigContextType | undefined
>(undefined);
const defaultBrainConfig: BrainConfig = {
model: "gpt-3.5-turbo",
temperature: 0,
maxTokens: 256,
keepLocal: true,
anthropicKey: undefined,
backendUrl: undefined,
openAiKey: undefined,
supabaseKey: undefined,
supabaseUrl: undefined,
prompt_id: undefined,
};
export const BrainConfigProvider = ({
children,
}: {
children: React.ReactNode;
}): JSX.Element => {
const [brainConfig, setBrainConfig] =
useState<BrainConfig>(defaultBrainConfig);
const updateConfig = (newConfig: Partial<BrainConfig>) => {
setBrainConfig((config) => {
const updatedConfig: BrainConfig = {
...config,
...removeUndefined(newConfig),
};
saveBrainConfigInLocalStorage(updatedConfig);
return updatedConfig;
});
};
const resetConfig = () => {
updateConfig(defaultBrainConfig);
};
useEffect(() => {
setBrainConfig(getBrainConfigFromLocalStorage() ?? defaultBrainConfig);
}, []);
return (
<BrainConfigContext.Provider
value={{ config: brainConfig, updateConfig, resetConfig }}
>
{children}
</BrainConfigContext.Provider>
);
};

View File

@ -1,21 +0,0 @@
/* eslint-disable */
import { BrainConfig } from "../types";
const BRAIN_CONFIG_LOCAL_STORAGE_KEY = "userBrainConfig";
export const saveBrainConfigInLocalStorage = (updatedConfig: BrainConfig) => {
localStorage.setItem(
BRAIN_CONFIG_LOCAL_STORAGE_KEY,
JSON.stringify(updatedConfig)
);
};
export const getBrainConfigFromLocalStorage = (): BrainConfig | undefined => {
const persistedBrainConfig = localStorage.getItem(
BRAIN_CONFIG_LOCAL_STORAGE_KEY
);
if (persistedBrainConfig === null) {
return;
}
return JSON.parse(persistedBrainConfig);
};

View File

@ -1,14 +0,0 @@
import { useContext } from "react";
import { BrainConfigContext } from "@/lib/context/BrainConfigProvider/brain-config-provider";
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export const useBrainConfig = () => {
const context = useContext(BrainConfigContext);
if (context === undefined) {
throw new Error("useBrainConfig must be used inside BrainConfigProvider");
}
return context;
};

View File

@ -1,2 +0,0 @@
export * from "./brain-config-provider";
export * from "./hooks/useBrainConfig";

View File

@ -1,28 +0,0 @@
import { createContext, PropsWithChildren } from "react";
import { BrainConfigContextType } from "../types";
export const BrainConfigContextMock = createContext<
BrainConfigContextType | undefined
>(undefined);
export const BrainConfigProviderMock = ({
children,
}: PropsWithChildren): JSX.Element => {
return (
<BrainConfigContextMock.Provider
value={{
config: {
model: "gpt-3.5-turbo",
temperature: 0,
maxTokens: 256,
keepLocal: true,
},
updateConfig: () => void 0,
resetConfig: () => void 0,
}}
>
{children}
</BrainConfigContextMock.Provider>
);
};

View File

@ -4,7 +4,7 @@ import { BrainRoleType } from "@/lib/components/BrainUsers/types";
import { Document } from "@/lib/types/Document";
import { useBrainProvider } from "./hooks/useBrainProvider";
import { Model } from "../BrainConfigProvider/types";
import { Model } from "../../types/brainConfig";
export type Brain = {
id: UUID;

View File

@ -1,6 +1,6 @@
import { ChatMessage, Notification } from "@/app/chat/[chatId]/types";
import { Model } from "../BrainConfigProvider/types";
import { Model } from "../../types/brainConfig";
export type ChatConfig = {
model?: Model;

View File

@ -1,4 +1,4 @@
import { Model, PaidModels } from "../context/BrainConfigProvider/types";
import { Model, PaidModels } from "../types/brainConfig";
export const defineMaxTokens = (model: Model | PaidModels): number => {
//At the moment is evaluating only models from OpenAI

View File

@ -1,9 +1,9 @@
import axios, { AxiosError, AxiosInstance } from "axios";
import { useBrainConfig } from "@/lib/context/BrainConfigProvider";
import { useSupabase } from "@/lib/context/SupabaseProvider";
import { DEFAULT_BACKEND_URL } from "../config/CONSTANTS";
import { defaultBrainConfig } from "../config/defaultBrainConfig";
const axiosInstance = axios.create({
baseURL: `${process.env.NEXT_PUBLIC_BACKEND_URL ?? DEFAULT_BACKEND_URL}`,
@ -11,9 +11,7 @@ const axiosInstance = axios.create({
export const useAxios = (): { axiosInstance: AxiosInstance } => {
const { session } = useSupabase();
const {
config: { backendUrl, openAiKey },
} = useBrainConfig();
const { backendUrl, openAiKey } = defaultBrainConfig;
axiosInstance.interceptors.request.clear();
axiosInstance.interceptors.request.use(
(config) => {

View File

@ -2,7 +2,7 @@ import { useEffect, useState } from "react";
import { useSupabase } from "@/lib/context/SupabaseProvider";
import { useBrainConfig } from "../context/BrainConfigProvider/hooks/useBrainConfig";
import { defaultBrainConfig } from "../config/defaultBrainConfig";
interface FetchInstance {
get: (url: string, headers?: HeadersInit) => Promise<Response>;
@ -30,9 +30,7 @@ const fetchInstance: FetchInstance = {
export const useFetch = (): { fetchInstance: FetchInstance } => {
const { session } = useSupabase();
const {
config: { backendUrl: configBackendUrl, openAiKey },
} = useBrainConfig();
const { backendUrl: configBackendUrl, openAiKey } = defaultBrainConfig;
const [instance, setInstance] = useState(fetchInstance);

View File

@ -13,12 +13,8 @@ export type BrainConfig = {
prompt_id?: UUID;
};
type OptionalConfig = { [K in keyof BrainConfig]?: BrainConfig[K] | undefined };
export type BrainConfigContextType = {
config: BrainConfig;
updateConfig: (config: OptionalConfig) => void;
resetConfig: () => void;
};
export const openAiFreeModels = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k"] as const;