📜 feat: Customize Privacy Policy & Terms of Service (#2091)

This commit is contained in:
Flynn 2024-03-14 16:43:18 -04:00 committed by GitHub
parent d4190c9320
commit 1b243c6f8c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 155 additions and 45 deletions

View file

@ -91,6 +91,29 @@ function Login() {
),
};
const privacyPolicy = startupConfig.interface?.privacyPolicy;
const termsOfService = startupConfig.interface?.termsOfService;
const privacyPolicyRender = privacyPolicy?.externalUrl && (
<a
className="text-xs font-medium text-gray-500"
href={privacyPolicy.externalUrl}
target={privacyPolicy.openNewTab ? '_blank' : undefined} rel="noreferrer"
>
{localize('com_ui_privacy_policy')}
</a>
);
const termsOfServiceRender = termsOfService?.externalUrl && (
<a
className="text-xs font-medium text-gray-500"
href={termsOfService.externalUrl}
target={termsOfService.openNewTab ? '_blank' : undefined} rel="noreferrer"
>
{localize('com_ui_terms_of_service')}
</a>
);
return (
<div className="flex min-h-screen flex-col items-center justify-center bg-white pt-6 dark:bg-gray-900 sm:pt-0">
<div className="absolute bottom-0 left-0 m-4">
@ -139,6 +162,13 @@ function Login() {
</>
)}
</div>
<div className="flex justify-center gap-4 align-middle">
{privacyPolicyRender}
{privacyPolicyRender && termsOfServiceRender && (
<div className="border-r-[1px] border-gray-300" />
)}
{termsOfServiceRender}
</div>
</div>
);
}

View file

@ -4,20 +4,61 @@ import { useLocalize } from '~/hooks';
export default function Footer() {
const { data: config } = useGetStartupConfig();
const localize = useLocalize();
const privacyPolicy = config?.interface?.privacyPolicy;
const termsOfService = config?.interface?.termsOfService;
const privacyPolicyRender = privacyPolicy?.externalUrl && (
<a
className=" text-gray-500 underline"
href={privacyPolicy.externalUrl}
target={privacyPolicy.openNewTab ? '_blank' : undefined} rel="noreferrer"
>
{localize('com_ui_privacy_policy')}
</a>
);
const termsOfServiceRender = termsOfService?.externalUrl && (
<a
className=" text-gray-500 underline"
href={termsOfService.externalUrl}
target={termsOfService.openNewTab ? '_blank' : undefined} rel="noreferrer"
>
{localize('com_ui_terms_of_service')}
</a>
);
const mainContentRender = (
<span>
{typeof config?.customFooter === 'string' ? (
config.customFooter
) : (
<>
<a href="https://librechat.ai" target="_blank" rel="noreferrer" className="underline">
{config?.appTitle || 'LibreChat'} v0.6.10
</a>
{' - '} {localize('com_ui_new_footer')}
</>
)}
</span>
);
const footerElements = [mainContentRender, privacyPolicyRender, termsOfServiceRender].filter(
Boolean,
);
return (
<div className="relative px-2 py-2 text-center text-xs text-gray-600 dark:text-gray-300 md:px-[60px]">
<span>
{typeof config?.customFooter === 'string' ? (
config.customFooter
) : (
<div className="relative flex items-center justify-center gap-2 px-2 py-2 text-xs text-gray-600 dark:text-gray-300 md:px-[60px]">
{footerElements.map((contentRender, index) => {
const isLastElement = index === footerElements.length - 1;
return (
<>
<a href="https://librechat.ai" target="_blank" rel="noreferrer" className="underline">
{config?.appTitle || 'LibreChat'} v0.6.10
</a>
{' - '} {localize('com_ui_new_footer')}
{contentRender}
{!isLastElement && <div className="h-2 border-r-[1px] border-gray-300" />}
</>
)}
</span>
);
})}
</div>
);
}