diff --git a/client/src/components/Input/Endpoints/FileUpload.jsx b/client/src/components/Input/Endpoints/FileUpload.jsx
new file mode 100644
index 0000000000..817386ee28
--- /dev/null
+++ b/client/src/components/Input/Endpoints/FileUpload.jsx
@@ -0,0 +1,54 @@
+import React from 'react';
+import { useSetRecoilState } from 'recoil';
+import { FileUp } from 'lucide-react';
+import store from '~/store';
+import axios from 'axios';
+
+async function fetchPresets(callback) {
+ try {
+ const response = await axios.get('/api/presets', {
+ timeout: 1000,
+ withCredentials: true
+ });
+
+ callback(response.data);
+ } catch (error) {
+ console.error(error);
+ console.log('[FileUpload] Error fetching presets');
+ }
+}
+
+const FileUpload = ({ onFileSelected }) => {
+ const setPresets = useSetRecoilState(store.presets);
+
+ const handleFileChange = event => {
+ const file = event.target.files[0];
+ if (!file) return;
+
+ const reader = new FileReader();
+ reader.onload = e => {
+ const jsonData = JSON.parse(e.target.result);
+ onFileSelected(jsonData, () => fetchPresets(setPresets));
+ };
+ reader.readAsText(file);
+ };
+
+ return (
+
+ );
+};
+
+export default FileUpload;
diff --git a/client/src/components/Input/Endpoints/NewConversationMenu.jsx b/client/src/components/Input/Endpoints/NewConversationMenu.jsx
index 0962d80f14..bd122bd5c5 100644
--- a/client/src/components/Input/Endpoints/NewConversationMenu.jsx
+++ b/client/src/components/Input/Endpoints/NewConversationMenu.jsx
@@ -3,8 +3,9 @@ import { useRecoilValue, useRecoilState } from 'recoil';
import EditPresetDialog from '../../Endpoints/EditPresetDialog';
import EndpointItems from './EndpointItems';
import PresetItems from './PresetItems';
+import FileUpload from './FileUpload';
import getIcon from '~/utils/getIcon';
-import manualSWR from '~/utils/fetchers';
+import manualSWR, { handleFileSelected } from '~/utils/fetchers';
import { Button } from '../../ui/Button.tsx';
import {
@@ -135,6 +136,7 @@ export default function NewConversationMenu() {
Select a Preset
+