🔗 fix: Share Links Respect Custom Base Path (#11087)
Some checks are pending
Docker Dev Branch Images Build / build (Dockerfile, lc-dev, node) (push) Waiting to run
Docker Dev Branch Images Build / build (Dockerfile.multi, lc-dev-api, api-build) (push) Waiting to run

* fix: share links respect base path

Fixes #11072

* chore: import order

* chore: import order

---------

Co-authored-by: Dustin Healy <54083382+dustinhealy@users.noreply.github.com>
This commit is contained in:
NK 2025-12-25 04:29:40 +05:30 committed by GitHub
parent 5740ca59d8
commit 9b6e7cabc9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 34 additions and 7 deletions

View file

@ -6,7 +6,7 @@ import { useGetSharedLinkQuery } from 'librechat-data-provider/react-query';
import { OGDialogTemplate, Button, Spinner, OGDialog } from '@librechat/client';
import { useLocalize, useCopyToClipboard } from '~/hooks';
import SharedLinkButton from './SharedLinkButton';
import { cn } from '~/utils';
import { buildShareLinkUrl, cn } from '~/utils';
import store from '~/store';
export default function ShareButton({
@ -40,8 +40,7 @@ export default function ShareButton({
useEffect(() => {
if (share?.shareId !== undefined) {
const link = `${window.location.protocol}//${window.location.host}/share/${share.shareId}`;
setSharedLink(link);
setSharedLink(buildShareLinkUrl(share.shareId));
}
}, [share]);

View file

@ -1,4 +1,4 @@
import { useState, useCallback, useRef } from 'react';
import { useState, useRef } from 'react';
import { Trans } from 'react-i18next';
import { QrCode, RotateCw, Trash2 } from 'lucide-react';
import {
@ -20,6 +20,7 @@ import {
useDeleteSharedLinkMutation,
} from '~/data-provider';
import { NotificationSeverity } from '~/common';
import { buildShareLinkUrl } from '~/utils';
import { useLocalize } from '~/hooks';
export default function SharedLinkButton({
@ -85,9 +86,7 @@ export default function SharedLinkButton({
},
});
const generateShareLink = useCallback((shareId: string) => {
return `${window.location.protocol}//${window.location.host}/share/${shareId}`;
}, []);
const generateShareLink = (shareId: string) => buildShareLinkUrl(shareId);
const updateSharedLink = async () => {
if (!shareId) {

View file

@ -0,0 +1,22 @@
jest.mock('librechat-data-provider', () => ({
apiBaseUrl: jest.fn(),
}));
import { apiBaseUrl } from 'librechat-data-provider';
import { buildShareLinkUrl } from '../share';
describe('buildShareLinkUrl', () => {
it('includes the base path for subdirectory deployments', () => {
(apiBaseUrl as jest.Mock).mockReturnValue('/librechat');
expect(buildShareLinkUrl('reW8SsFGQEH1b1uzSHe4I')).toBe(
'http://localhost:3080/librechat/share/reW8SsFGQEH1b1uzSHe4I',
);
});
it('works when base path is root', () => {
(apiBaseUrl as jest.Mock).mockReturnValue('');
expect(buildShareLinkUrl('reW8SsFGQEH1b1uzSHe4I')).toBe(
'http://localhost:3080/share/reW8SsFGQEH1b1uzSHe4I',
);
});
});

View file

@ -23,6 +23,7 @@ export * from './roles';
export * from './localStorage';
export * from './promptGroups';
export * from './email';
export * from './share';
export * from './timestamps';
export { default as cn } from './cn';
export { default as logger } from './logger';

View file

@ -0,0 +1,6 @@
import { apiBaseUrl } from 'librechat-data-provider';
export const buildShareLinkUrl = (shareId: string): string => {
const baseURL = apiBaseUrl();
return new URL(`${baseURL}/share/${shareId}`, window.location.origin).toString();
};