diff --git a/README.md b/README.md
index 8faddbe..8063dbf 100644
--- a/README.md
+++ b/README.md
@@ -209,3 +209,8 @@ Visit our *site*, we wil
- **[MIT license](http://opensource.org/licenses/mit-license.php)**
- Copyright 2022 © SoftServe IT Academy.
+
+---
+## Create .env file in repository root example
+---
+GoogleAuth__ClientId=123721973387-7i3rs06c8iui5lrb805f22o0k2s6gk1o.apps.googleusercontent.com
diff --git a/package.json b/package.json
index 3fb0c8c..0e944be 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
"@fortawesome/fontawesome-free": "^6.4.0",
"@react-google-maps/api": "^2.18.1",
"@react-hook/resize-observer": "^1.2.6",
+ "@react-oauth/google": "^0.13.5",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
diff --git a/src/app/api/user/user.api.ts b/src/app/api/user/user.api.ts
index aba34d5..c2c9b91 100644
--- a/src/app/api/user/user.api.ts
+++ b/src/app/api/user/user.api.ts
@@ -6,33 +6,39 @@ import {
UserLoginRequest, UserLoginResponce,
} from '@/models/user/user.model';
- const UserApi = {
- login: (loginParams: UserLoginRequest) =>
- Agent.post(
- API_ROUTES.USERS.LOGIN,
- loginParams,
- ),
+const UserApi = {
+ login: (loginParams: UserLoginRequest) =>
+ Agent.post(
+ API_ROUTES.USERS.LOGIN,
+ loginParams,
+ ),
- refreshToken: (token: RefreshTokenRequest) =>
- Agent.post(
- API_ROUTES.USERS.REFRESH_TOKEN,
- token,
- ),
+ googleLogin: (body: { idToken: string }) =>
+ Agent.post(
+ API_ROUTES.ADMIN_AUTHORIZATION.GOOGLE_LOGIN,
+ body,
+ ),
- adminLogin: (loginParams: UserLoginRequest) =>
- Agent.post(
- API_ROUTES.ADMIN_AUTHORIZATION.LOGIN,
- loginParams,
- ),
+ refreshToken: (token: RefreshTokenRequest) =>
+ Agent.post(
+ API_ROUTES.USERS.REFRESH_TOKEN,
+ token,
+ ),
- adminRefreshToken: (token: RefreshTokenRequest) =>
- Agent.post(
- API_ROUTES.ADMIN_AUTHORIZATION.REFRESH_TOKEN,
- token,
- ),
- adminLogout: () =>
- Agent.post(
- API_ROUTES.ADMIN_AUTHORIZATION.LOGOUT, {},
- ),
- };
+ adminLogin: (loginParams: UserLoginRequest) =>
+ Agent.post(
+ API_ROUTES.ADMIN_AUTHORIZATION.LOGIN,
+ loginParams,
+ ),
+
+ adminRefreshToken: (token: RefreshTokenRequest) =>
+ Agent.post(
+ API_ROUTES.ADMIN_AUTHORIZATION.REFRESH_TOKEN,
+ token,
+ ),
+ adminLogout: () =>
+ Agent.post(
+ API_ROUTES.ADMIN_AUTHORIZATION.LOGOUT, {},
+ ),
+};
export default UserApi;
diff --git a/src/app/common/constants/api-routes.constants.ts b/src/app/common/constants/api-routes.constants.ts
index b5728f2..fe9aa00 100644
--- a/src/app/common/constants/api-routes.constants.ts
+++ b/src/app/common/constants/api-routes.constants.ts
@@ -220,7 +220,9 @@ export const API_ROUTES = {
},
ADMIN_AUTHORIZATION: {
LOGIN: "auth/login",
+ GOOGLE_LOGIN: "auth/google-login",
REFRESH_TOKEN: "auth/refresh-token",
+ LOGOUT: "auth/logout",
},
COMMENTS: {
GET_BY_STREETCODE_ID: "comment/getByStreetcodeId",
@@ -228,4 +230,4 @@ export const API_ROUTES = {
UPDATE: "comment/update",
DELETE: "comment/delete",
},
-};
+};
\ No newline at end of file
diff --git a/src/features/AdminPage/LoginPage/LoginPage.component.tsx b/src/features/AdminPage/LoginPage/LoginPage.component.tsx
index 5958d78..47eb8fc 100644
--- a/src/features/AdminPage/LoginPage/LoginPage.component.tsx
+++ b/src/features/AdminPage/LoginPage/LoginPage.component.tsx
@@ -1,9 +1,10 @@
import './LoginPage.styles.scss';
+import { GoogleLogin } from '@react-oauth/google';
import { useState } from 'react';
import { Button, Checkbox, Form, Input, message } from 'antd';
import { observer } from 'mobx-react-lite';
-import { Navigate,useNavigate } from 'react-router-dom';
+import { Navigate, useNavigate } from 'react-router-dom';
import UserLoginStore from '@/app/stores/user-login-store';
import UserApi from '@api/user/user.api';
@@ -100,9 +101,26 @@ const LoginPage = () => {
-
+ {
+ try {
+ setIsLoading(true);
+ const response = await UserApi.googleLogin({
+ idToken: credentialResponse.credential as string
+ });
+ userLoginStore.setUserLoginResponce(response, userLoginStore.refreshToken);
+ navigate(FRONTEND_ROUTES.ADMIN.BASE);
+ } catch (e) {
+ console.error('Google Auth Error:', e);
+ message.error('Помилка авторизації через Google');
+ } finally {
+ setIsLoading(false);
+ }
+ }}
+ onError={() => {
+ message.error('Не вдалося увійти через Google');
+ }}
+ />
diff --git a/src/global.d.ts b/src/global.d.ts
index 4cb2480..773f7da 100644
--- a/src/global.d.ts
+++ b/src/global.d.ts
@@ -7,5 +7,7 @@ declare const process: {
readonly REACT_APP_ENVIRONMENT?: string;
readonly REACT_APP_BUILD_SHA?: string;
readonly REACT_APP_BUILD_NUMBER?: string;
+
+ readonly REACT_APP_GOOGLE_CLIENT_ID?: string;
};
};
diff --git a/src/index.tsx b/src/index.tsx
index 5aec473..2d58b93 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -6,6 +6,7 @@ import ReactDOM from 'react-dom/client';
import ReactGA from 'react-ga4';
import { RouterProvider } from 'react-router-dom';
import router from '@app/router/Routes';
+import { GoogleOAuthProvider } from '@react-oauth/google';
ReactGA.initialize('G-2RHY04JKG0');
@@ -14,6 +15,8 @@ const root = ReactDOM.createRoot(
);
root.render(
-
+
+
+
,
);