diff --git a/rag-view/src/features/slices/details-slice/index.js b/rag-view/src/features/slices/details-slice/index.js index c68de67..b7d44e2 100644 --- a/rag-view/src/features/slices/details-slice/index.js +++ b/rag-view/src/features/slices/details-slice/index.js @@ -2,6 +2,7 @@ export { logoutUser, clearError, clearDeleteStatus, + setOAuthTokens, //addLoadedFiles, default, } from "./userDetailsSlice"; diff --git a/rag-view/src/features/slices/details-slice/reducers.js b/rag-view/src/features/slices/details-slice/reducers.js index ea66471..d401f54 100644 --- a/rag-view/src/features/slices/details-slice/reducers.js +++ b/rag-view/src/features/slices/details-slice/reducers.js @@ -1,6 +1,7 @@ import { JWT_TOKEN, JWT_REFRESH_TOKEN } from "../../constants"; import { initialState } from "./initialState"; +import { updateTokens } from "./tokenHelpers"; export const reducers = { logoutUser(state) { @@ -20,6 +21,11 @@ export const reducers = { state.deletedCount = 0; }, + setOAuthTokens(state, action) { + const { token, refreshToken } = action.payload; + updateTokens(state, token, refreshToken); + }, + // addLoadedFiles(state, action) { // state.loadedFiles = [...state.loadedFiles, ...action.payload]; // }, diff --git a/rag-view/src/features/slices/details-slice/userDetailsSlice.js b/rag-view/src/features/slices/details-slice/userDetailsSlice.js index 4f2d476..85bb1ce 100644 --- a/rag-view/src/features/slices/details-slice/userDetailsSlice.js +++ b/rag-view/src/features/slices/details-slice/userDetailsSlice.js @@ -18,7 +18,7 @@ const userDetailsSlice = createSlice({ }); //export const { logoutUser, clearError, clearDeleteStatus, addLoadedFiles } = -export const { logoutUser, clearError, clearDeleteStatus } = +export const { logoutUser, clearError, clearDeleteStatus, setOAuthTokens } = userDetailsSlice.actions; export default userDetailsSlice.reducer; diff --git a/rag-view/src/pages/LoginPage.jsx b/rag-view/src/pages/LoginPage.jsx index 7762ea7..3592561 100644 --- a/rag-view/src/pages/LoginPage.jsx +++ b/rag-view/src/pages/LoginPage.jsx @@ -1,17 +1,55 @@ import { useState, useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; -import { useNavigate, Link } from "react-router-dom"; -import { clearError } from "../features/slices/details-slice"; +import { useNavigate, Link, useSearchParams } from "react-router-dom"; +import { clearError, setOAuthTokens } from "../features/slices/details-slice"; import fetchLoginUser from "../features/fetch-async/fetchLoginUser"; +function GoogleIcon() { + return ( + + ); +} + +function GitHubIcon() { + return ( + + ); +} + +function FacebookIcon() { + return ( + + ); +} + function LoginPage() { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const dispatch = useDispatch(); const navigate = useNavigate(); + const [searchParams] = useSearchParams(); const { loading, error, token } = useSelector((state) => state.userDetails); + // Handle OAuth2 callback: ?token=...&refreshToken=... + useEffect(() => { + const urlToken = searchParams.get("token"); + const urlRefreshToken = searchParams.get("refreshToken"); + if (urlToken) { + dispatch(setOAuthTokens({ token: urlToken, refreshToken: urlRefreshToken })); + navigate("/", { replace: true }); + } + }, [searchParams, dispatch, navigate]); + // Redirect if already logged in useEffect(() => { if (token) { @@ -119,6 +157,39 @@ function LoginPage() { + {/* OAuth2 section */} +
Don't have an account?{" "}