Skip to content

Commit 9bc8d5c

Browse files
author
Brian Genisio
committed
On redirect to /login, redirect to initial route on successful login
1 parent a4f2e27 commit 9bc8d5c

File tree

3 files changed

+107
-7
lines changed

3 files changed

+107
-7
lines changed

client/src/hooks/AuthContext.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
useCallback,
88
createContext,
99
} from 'react';
10-
import { useNavigate } from 'react-router-dom';
10+
import { NavigateOptions, useNavigate } from 'react-router-dom';
1111
import { useRecoilState } from 'recoil';
1212
import { setTokenHeader, SystemRoles } from 'librechat-data-provider';
1313
import { useGetStartupConfig } from '~/data-provider';
@@ -46,6 +46,15 @@ const AuthContextProvider = ({
4646
const { data: startupConfig = null } = useGetStartupConfig();
4747

4848
const navigate = useNavigate();
49+
const navigateToLogin = useCallback((options?: NavigateOptions) => {
50+
const currentPath = document.location.pathname + document.location.search;
51+
let loginPath = "/login";
52+
if (!currentPath.startsWith('/login')) {
53+
loginPath = `/login?redirect=${encodeURIComponent(currentPath)}`;
54+
}
55+
56+
navigate(loginPath, options);
57+
}, [navigate]);
4958

5059
const setUserContext = useCallback(
5160
(userContext: TUserContext) => {
@@ -75,12 +84,14 @@ const AuthContextProvider = ({
7584
onSuccess: (data: t.TLoginResponse) => {
7685
const { user, token } = data;
7786
setError(undefined);
78-
setUserContext({ token, isAuthenticated: true, user, redirect: '/c/new' });
87+
88+
const redirect = document.location.search ? document.location.search.split('redirect=')[1] : '/c/new';
89+
setUserContext({ token, isAuthenticated: true, user, redirect: decodeURIComponent(redirect) });
7990
},
8091
onError: (error: TResError | unknown) => {
8192
const resError = error as TResError;
8293
doSetError(resError.message);
83-
navigate('/login', { replace: true });
94+
navigateToLogin({ replace: true });
8495
},
8596
});
8697
const logoutUser = useLogoutUserMutation({
@@ -126,15 +137,15 @@ const AuthContextProvider = ({
126137
if (authConfig?.test === true) {
127138
return;
128139
}
129-
navigate('/login');
140+
navigateToLogin();
130141
}
131142
},
132143
onError: (error) => {
133144
console.log('refreshToken mutation error:', error);
134145
if (authConfig?.test === true) {
135146
return;
136147
}
137-
navigate('/login');
148+
navigateToLogin();
138149
},
139150
});
140151
}, []);
@@ -154,7 +165,7 @@ const AuthContextProvider = ({
154165
setUser(userQuery.data);
155166
} else if (userQuery.isError) {
156167
doSetError((userQuery.error as Error).message);
157-
navigate('/login', { replace: true });
168+
navigateToLogin({replace: true});
158169
}
159170
if (error != null && error && isAuthenticated) {
160171
doSetError(undefined);

client/src/routes/useAuthRedirect.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ export default function useAuthRedirect() {
99
useEffect(() => {
1010
const timeout = setTimeout(() => {
1111
if (!isAuthenticated) {
12-
navigate('/login', { replace: true });
12+
const currentPath = document.location.pathname + document.location.search;
13+
let loginPath = "/login";
14+
if (!currentPath.startsWith('/login')) {
15+
loginPath = `/login?redirect=${encodeURIComponent(currentPath)}`;
16+
}
17+
18+
navigate(loginPath, { replace: true });
1319
}
1420
}, 300);
1521

config/add-preset.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
const path = require('path');
2+
require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
3+
const { askQuestion, silentExit } = require('./helpers');
4+
const User = require('~/models/User');
5+
const { savePreset } = require('~/models/Preset');
6+
const connect = require('./connect');
7+
8+
(async () => {
9+
await connect();
10+
11+
console.purple('------------------------');
12+
console.purple('Create a new preset!');
13+
console.purple('------------------------');
14+
15+
if (process.argv.length < 4) {
16+
console.orange('Usage: npm run add-preset <username> <promptPrefix>');
17+
console.orange('Note: if you do not pass in the arguments, you will be prompted for them.');
18+
console.purple('------------------------');
19+
}
20+
21+
let username = '';
22+
let promptPrefix = '';
23+
24+
// Parse command line arguments
25+
if (process.argv.length >= 3) {
26+
username = process.argv[2];
27+
}
28+
if (process.argv.length >= 4) {
29+
promptPrefix = process.argv[3];
30+
}
31+
32+
if (!username) {
33+
username = await askQuestion('Username:');
34+
}
35+
36+
const user = await User.findOne({ username });
37+
if (!user) {
38+
console.red('Error: User not found!');
39+
silentExit(1);
40+
}
41+
42+
if (!promptPrefix) {
43+
promptPrefix = await askQuestion('Prompt Prefix:');
44+
}
45+
46+
if (!promptPrefix) {
47+
console.red('Error: Prompt prefix is required!');
48+
silentExit(1);
49+
}
50+
51+
const preset = {
52+
presetId: Math.random().toString(36).substring(2),
53+
title: 'Custom Preset',
54+
promptPrefix,
55+
endpoint: 'openAI'
56+
};
57+
58+
try {
59+
const result = await savePreset(user._id, preset);
60+
if (result.message) {
61+
console.red('Error: ' + result.message);
62+
silentExit(1);
63+
}
64+
console.green('Preset created successfully!');
65+
silentExit(0);
66+
} catch (error) {
67+
console.red('Error creating preset: ' + error.message);
68+
silentExit(1);
69+
}
70+
})();
71+
72+
process.on('uncaughtException', (err) => {
73+
if (!err.message.includes('fetch failed')) {
74+
console.error('There was an uncaught error:');
75+
console.error(err);
76+
}
77+
78+
if (err.message.includes('fetch failed')) {
79+
return;
80+
} else {
81+
process.exit(1);
82+
}
83+
});

0 commit comments

Comments
 (0)