+
+
+

+
+
-
-
- {localize('com_auth_reset_password')}
-
- {resetError && (
-
- )}
-
+
+ {privacyPolicyRender}
+ {privacyPolicyRender && termsOfServiceRender && (
+
+ )}
+ {termsOfServiceRender}
);
diff --git a/client/src/components/Auth/SocialButton.tsx b/client/src/components/Auth/SocialButton.tsx
index 7e76c6f76..8b8318ac3 100644
--- a/client/src/components/Auth/SocialButton.tsx
+++ b/client/src/components/Auth/SocialButton.tsx
@@ -15,6 +15,7 @@ const SocialButton = ({ id, enabled, serverDomain, oauthPath, Icon, label }) =>
const handleMouseLeave = () => {
setIsHovered(false);
+ if (isPressed) {setIsPressed(false);}
};
const handleMouseDown = () => {
@@ -28,7 +29,7 @@ const SocialButton = ({ id, enabled, serverDomain, oauthPath, Icon, label }) =>
const getButtonStyles = () => {
// Define Tailwind CSS classes based on state
- const baseStyles = 'border border-solid border-gray-300 dark:border-gray-800 transition-colors';
+ const baseStyles = 'border border-solid border-gray-300 dark:border-gray-600 transition-colors';
const pressedStyles = 'bg-blue-200 border-blue-200 dark:bg-blue-900 dark:border-blue-600';
const hoverStyles = 'bg-gray-100 dark:bg-gray-700';
diff --git a/client/src/components/Chat/ExportButton.tsx b/client/src/components/Chat/ExportButton.tsx
new file mode 100644
index 000000000..48acd20ec
--- /dev/null
+++ b/client/src/components/Chat/ExportButton.tsx
@@ -0,0 +1,71 @@
+import React from 'react';
+
+import { useState } from 'react';
+import { useLocation } from 'react-router-dom';
+import type { TConversation } from 'librechat-data-provider';
+import { Download } from 'lucide-react';
+import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from '~/components/ui';
+import { useLocalize } from '~/hooks';
+import { ExportModal } from '../Nav';
+import { useRecoilValue } from 'recoil';
+import store from '~/store';
+
+function ExportButton() {
+ const localize = useLocalize();
+ const location = useLocation();
+
+ const [showExports, setShowExports] = useState(false);
+
+ const activeConvo = useRecoilValue(store.conversationByIndex(0));
+ const globalConvo = useRecoilValue(store.conversation) ?? ({} as TConversation);
+
+ let conversation: TConversation | null | undefined;
+ if (location.state?.from?.pathname.includes('/chat')) {
+ conversation = globalConvo;
+ } else {
+ conversation = activeConvo;
+ }
+
+ const clickHandler = () => {
+ if (exportable) {
+ setShowExports(true);
+ }
+ };
+
+ const exportable =
+ conversation &&
+ conversation.conversationId &&
+ conversation.conversationId !== 'new' &&
+ conversation.conversationId !== 'search';
+
+ return (
+ <>
+ {exportable && (
+
+
+
+
+
+
+
+ {localize('com_nav_export_conversation')}
+
+
+
+
+ )}
+ {showExports && (
+
+ )}
+ >
+ );
+}
+
+export default ExportButton;
diff --git a/client/src/components/Chat/Header.tsx b/client/src/components/Chat/Header.tsx
index cc76bbbc6..ab40ace0b 100644
--- a/client/src/components/Chat/Header.tsx
+++ b/client/src/components/Chat/Header.tsx
@@ -5,6 +5,7 @@ import { useGetStartupConfig } from 'librechat-data-provider/react-query';
import type { ContextType } from '~/common';
import { EndpointsMenu, ModelSpecsMenu, PresetsMenu, HeaderNewChat } from './Menus';
import HeaderOptions from './Input/HeaderOptions';
+import ExportButton from './ExportButton';
const defaultInterface = getConfigDefaults().interface;
@@ -19,12 +20,15 @@ export default function Header() {
return (
-
- {!navVisible &&
}
- {interfaceConfig.endpointsMenu &&
}
- {modelSpecs?.length > 0 &&
}
- {
}
- {interfaceConfig.presets &&
}
+
+
+ {!navVisible &&
}
+ {interfaceConfig.endpointsMenu &&
}
+ {modelSpecs?.length > 0 &&
}
+ {
}
+ {interfaceConfig.presets &&
}
+
+
{/* Empty div for spacing */}
diff --git a/client/src/components/Chat/Input/ChatForm.tsx b/client/src/components/Chat/Input/ChatForm.tsx
index 16343cd0e..f05fd7279 100644
--- a/client/src/components/Chat/Input/ChatForm.tsx
+++ b/client/src/components/Chat/Input/ChatForm.tsx
@@ -100,7 +100,7 @@ const ChatForm = ({ index = 0 }) => {
{showMentionPopover && (
)}
-
+
-
+
{localize('com_nav_my_files')}
diff --git a/client/src/components/Chat/Input/Files/Table/DataTable.tsx b/client/src/components/Chat/Input/Files/Table/DataTable.tsx
index 23e7b8ea7..75bbb3823 100644
--- a/client/src/components/Chat/Input/Files/Table/DataTable.tsx
+++ b/client/src/components/Chat/Input/Files/Table/DataTable.tsx
@@ -220,7 +220,7 @@ export default function DataTable({ columns, data }: DataTablePro
)}