Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dbf81a4cf5 | |||
| 0984d78f1e | |||
| ade91c4ed8 | |||
| 905e783f76 |
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
version: '3'
|
version: '3'
|
||||||
services:
|
services:
|
||||||
merms-panel:
|
merms-panel:
|
||||||
# image: registry.chiefsoft.net/wrenchboard-users-wrench:latest
|
image: registry.chiefsoft.net/merms-panel-reactjs:latest
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: docker/Dockerfile
|
dockerfile: docker/Dockerfile
|
||||||
|
|||||||
+23
-20
@@ -2,6 +2,7 @@ import { Routes, Route } from 'react-router-dom';
|
|||||||
|
|
||||||
import UserExist from './component/authorization/UserExist';
|
import UserExist from './component/authorization/UserExist';
|
||||||
import AuthLayout from './component/auth/AuthLayout';
|
import AuthLayout from './component/auth/AuthLayout';
|
||||||
|
import BearerToken from './component/authorization/BearerToken';
|
||||||
import siteLinks from './links/siteLinks';
|
import siteLinks from './links/siteLinks';
|
||||||
|
|
||||||
import LoginPage from './views/LoginPage';
|
import LoginPage from './views/LoginPage';
|
||||||
@@ -22,27 +23,29 @@ function AppRouters() {
|
|||||||
return (
|
return (
|
||||||
<div className="">
|
<div className="">
|
||||||
<Routes>
|
<Routes>
|
||||||
{/* auth routes wrapper */}
|
<Route element={<BearerToken />}>
|
||||||
<Route element={<AuthLayout />}>
|
{/* auth routes wrapper */}
|
||||||
<Route path={siteLinks.home} element={<LoginPage />} />
|
<Route element={<AuthLayout />}>
|
||||||
<Route path={siteLinks.login} element={<LoginPage />} />
|
<Route path={siteLinks.home} element={<LoginPage />} />
|
||||||
<Route path={siteLinks.signup} element={<SignupPage />} />
|
<Route path={siteLinks.login} element={<LoginPage />} />
|
||||||
<Route path={siteLinks.forgetpwd} element={<ForgetpwdPage />} />
|
<Route path={siteLinks.signup} element={<SignupPage />} />
|
||||||
<Route path={siteLinks.csignup} element={<CSignupPage />} />
|
<Route path={siteLinks.forgetpwd} element={<ForgetpwdPage />} />
|
||||||
<Route path={siteLinks.error} element={<LoginPage />} />
|
<Route path={siteLinks.csignup} element={<CSignupPage />} />
|
||||||
</Route>
|
<Route path={siteLinks.error} element={<LoginPage />} />
|
||||||
|
</Route>
|
||||||
|
|
||||||
{/* protected routes */}
|
{/* protected routes */}
|
||||||
<Route element={<SocketIOContextProvider />}>
|
<Route element={<SocketIOContextProvider />}>
|
||||||
<Route element={<UserExist />}>
|
<Route element={<UserExist />}>
|
||||||
<Route path={siteLinks.dash} element={<HomePage />} />
|
<Route path={siteLinks.dash} element={<HomePage />} />
|
||||||
<Route path={siteLinks.product} element={<ProductPage />} />
|
<Route path={siteLinks.product} element={<ProductPage />} />
|
||||||
<Route path={siteLinks.reports} element={<ReportsPage />} />
|
<Route path={siteLinks.reports} element={<ReportsPage />} />
|
||||||
<Route path={siteLinks.comments} element={<CommentsPage />} />
|
<Route path={siteLinks.comments} element={<CommentsPage />} />
|
||||||
<Route path={siteLinks.contacts} element={<ContactsPage />} />
|
<Route path={siteLinks.contacts} element={<ContactsPage />} />
|
||||||
<Route path={siteLinks.user} element={<UserPage />} />
|
<Route path={siteLinks.user} element={<UserPage />} />
|
||||||
<Route path={siteLinks.calendar} element={<CalendarPage />} />
|
<Route path={siteLinks.calendar} element={<CalendarPage />} />
|
||||||
<Route path={siteLinks.settings} element={<SettingsPage />} />
|
<Route path={siteLinks.settings} element={<SettingsPage />} />
|
||||||
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
</Routes>
|
</Routes>
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ export default function Login() {
|
|||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
|
|
||||||
const [fields, setFields] = useState({
|
const [fields, setFields] = useState({
|
||||||
username: localStorage.getItem('username') || '',
|
username: '',
|
||||||
password: '',
|
password: '',
|
||||||
remember: localStorage.getItem('username') ? true : false
|
remember: false
|
||||||
})
|
})
|
||||||
|
|
||||||
const handleChange = ({target:{name, value}}) => {
|
const handleChange = ({target:{name, value}}) => {
|
||||||
@@ -37,20 +37,25 @@ export default function Login() {
|
|||||||
throw new Error('Please provide all fields marked *')
|
throw new Error('Please provide all fields marked *')
|
||||||
}
|
}
|
||||||
rememberMe(fields.remember) // FUNCTION TO SAVE USERNAME OF THE USER TO LOCAL STORAGE
|
rememberMe(fields.remember) // FUNCTION TO SAVE USERNAME OF THE USER TO LOCAL STORAGE
|
||||||
|
delete fields.remember // REMOVING REMEMBER FROM THE PAYLOAD
|
||||||
return loginUser(fields)
|
return loginUser(fields)
|
||||||
},
|
},
|
||||||
onError: (error) => {
|
onError: (error) => {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
},
|
},
|
||||||
onSuccess: (res) => {
|
onSuccess: (res) => {
|
||||||
const {token, room} = res?.data?.data
|
if(res?.data?.error_message){
|
||||||
if(token){
|
throw({message: res?.data?.error_message})
|
||||||
localStorage.setItem('token', token)
|
|
||||||
localStorage.setItem('room', room)
|
|
||||||
// const data = {token}
|
|
||||||
// dispatch(updateUserDetails({ ...data }));
|
|
||||||
navigate('/dash') // later add redux to dispatch state
|
|
||||||
}
|
}
|
||||||
|
const {token, room, uid} = res?.data
|
||||||
|
if(!token || !room){
|
||||||
|
throw({message: 'something went wrong, try again!'})
|
||||||
|
}
|
||||||
|
localStorage.setItem('token', token)
|
||||||
|
localStorage.setItem('room', room)
|
||||||
|
localStorage.setItem('uid', uid)
|
||||||
|
dispatch(updateUserDetails({ ...res?.data }));
|
||||||
|
navigate('/dash') // later add redux to dispatch state
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -79,19 +84,19 @@ export default function Login() {
|
|||||||
<div className="col-12">
|
<div className="col-12">
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label className="control-label text-black fw-bold">User Name*</label>
|
<label className="control-label text-black fw-bold">User Name*</label>
|
||||||
<input name='username' value={fields.username} onChange={handleChange} type="text" className="form-control" placeholder="Username" />
|
<input maxLength={55} name='username' value={fields.username} onChange={handleChange} type="text" className="form-control" placeholder="Username" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-12">
|
<div className="col-12">
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label className="control-label text-black fw-bold">Password*</label>
|
<label className="control-label text-black fw-bold">Password*</label>
|
||||||
<input name='password' value={fields.password} onChange={handleChange} type="password" className="form-control" placeholder="Password" />
|
<input maxLength={55} name='password' value={fields.password} onChange={handleChange} type="password" className="form-control" placeholder="Password" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-12">
|
<div className="col-12">
|
||||||
<div className="d-block d-sm-flex align-items-center">
|
<div className="d-block d-sm-flex align-items-center">
|
||||||
<div className="form-check">
|
<div className="form-check">
|
||||||
<input className="form-check-input" type="checkbox" id="gridCheck" name='remember' checked={fields.remember} onChange={handleChange} disabled={!fields.username ? true : false} />
|
<input className="form-check-input" type="checkbox" id="gridCheck" name='remember' checked={fields.remember || false} onChange={handleChange} disabled={!fields.username ? true : false} />
|
||||||
<label className="form-check-label text-black" htmlFor="gridCheck">
|
<label className="form-check-label text-black" htmlFor="gridCheck">
|
||||||
Remember Me
|
Remember Me
|
||||||
</label>
|
</label>
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import {useEffect} from 'react'
|
||||||
|
import { useMutation } from '@tanstack/react-query'
|
||||||
|
import { Outlet } from 'react-router-dom'
|
||||||
|
import MainLoaderBS from '../loaders/MainLoaderBS'
|
||||||
|
|
||||||
|
import { userToken } from '../../services/services'
|
||||||
|
|
||||||
|
export default function BearerToken() {
|
||||||
|
const bearerToken = useMutation({
|
||||||
|
mutationFn: (fields) => {
|
||||||
|
return userToken(fields)
|
||||||
|
},
|
||||||
|
onError: (error) => {
|
||||||
|
location.reload();
|
||||||
|
},
|
||||||
|
onSuccess: (res) => {
|
||||||
|
if(res?.data?.resultCode != '0'){
|
||||||
|
throw({message: 'Something went wrong'})
|
||||||
|
}
|
||||||
|
const {access_token, refresh_token} = res?.data?.data
|
||||||
|
if(access_token){
|
||||||
|
localStorage.setItem('access_token', access_token)
|
||||||
|
}else{
|
||||||
|
throw({message: 'Something went wrong'})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
let reqData = {
|
||||||
|
"username": "user",
|
||||||
|
"password": "password"
|
||||||
|
}
|
||||||
|
bearerToken.mutate(reqData)
|
||||||
|
},[])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{bearerToken.isPending ?
|
||||||
|
<MainLoaderBS />
|
||||||
|
:
|
||||||
|
<Outlet />
|
||||||
|
}
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,13 +1,15 @@
|
|||||||
import React, { useEffect, useState } from 'react'
|
import React, { useEffect, useState } from 'react'
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
import { Outlet, useNavigate } from 'react-router-dom'
|
import { Outlet, useNavigate } from 'react-router-dom'
|
||||||
|
import { useMutation } from '@tanstack/react-query'
|
||||||
|
|
||||||
import { updateUserDetails } from "../../store/UserDetails";
|
import { updateUserDetails } from "../../store/UserDetails";
|
||||||
|
import { userInfo } from '../../services/services'
|
||||||
import MainLoaderBS from '../loaders/MainLoaderBS'
|
import MainLoaderBS from '../loaders/MainLoaderBS'
|
||||||
import Layout from '../layout/Layout'
|
import Layout from '../layout/Layout'
|
||||||
import siteLinks from '../../links/siteLinks'
|
import siteLinks from '../../links/siteLinks'
|
||||||
|
|
||||||
import debounceFunction from '../../utils/debounceFunction'
|
import debounceFunction from '../../utils/debounceFunction'
|
||||||
import { accountDashboard } from '../../services/services';
|
|
||||||
import { SocketContextValues } from '../context/SocketIOContext';
|
import { SocketContextValues } from '../context/SocketIOContext';
|
||||||
|
|
||||||
|
|
||||||
@@ -23,9 +25,9 @@ export default function UserExist() {
|
|||||||
|
|
||||||
const [lastActivityTime, setLastActivityTime] = useState(Date.now()); // HOLDS THE INITIAL TIME USER LOGS IN
|
const [lastActivityTime, setLastActivityTime] = useState(Date.now()); // HOLDS THE INITIAL TIME USER LOGS IN
|
||||||
|
|
||||||
const { userDetails: { lastname }} = useSelector((state) => state?.userDetails); // CHECKS IF USER Details are avaliable, to determine if user is active
|
const { userDetails: { token, room }} = useSelector((state) => state?.userDetails); // CHECKS IF USER Details are avaliable, to determine if user is active
|
||||||
|
|
||||||
let loggedIn = lastname ? true : false; // variable to determine if user is logged in
|
let loggedIn = token && room ? true : false; // variable to determine if user is logged in
|
||||||
// console.log('loggedIn', loggedIn)
|
// console.log('loggedIn', loggedIn)
|
||||||
|
|
||||||
// Function to log the user out
|
// Function to log the user out
|
||||||
@@ -40,6 +42,31 @@ export default function UserExist() {
|
|||||||
debounceFunction(setLastActivityTime(Date.now()), 1000)
|
debounceFunction(setLastActivityTime(Date.now()), 1000)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const getUser = useMutation({
|
||||||
|
mutationFn: (fields) => {
|
||||||
|
return userInfo(fields)
|
||||||
|
},
|
||||||
|
onError: (error) => {
|
||||||
|
navigate(siteLinks.login)
|
||||||
|
setLoading(false)
|
||||||
|
},
|
||||||
|
onSuccess: (res) => {
|
||||||
|
const {token, room, uid} = res?.data
|
||||||
|
if(!token || !room){
|
||||||
|
navigate(siteLinks.login)
|
||||||
|
setLoading(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
localStorage.setItem('token', token)
|
||||||
|
localStorage.setItem('room', room)
|
||||||
|
localStorage.setItem('uid', uid)
|
||||||
|
dispatch(updateUserDetails({ ...res?.data }));
|
||||||
|
setLoading(false)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
const timer = setTimeout(()=>{
|
const timer = setTimeout(()=>{
|
||||||
if(Date.now() - Number(lastActivityTime) >= Number(process.env.REACT_APP_TIMEOUT)){
|
if(Date.now() - Number(lastActivityTime) >= Number(process.env.REACT_APP_TIMEOUT)){
|
||||||
@@ -61,37 +88,21 @@ export default function UserExist() {
|
|||||||
window.removeEventListener(event, resetTimer);
|
window.removeEventListener(event, resetTimer);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},[lastActivityTime])
|
},[lastActivityTime])
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
accountDashboard().then(res => {
|
let token = localStorage.getItem('token') // USER TOKEN
|
||||||
const {dash_data} = res?.data
|
let uid = localStorage.getItem('uid') // USER UID
|
||||||
|
if(token && loggedIn){
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
dispatch(updateUserDetails({ ...dash_data }));
|
}else if(token && uid && !loggedIn){
|
||||||
}).catch(err => {
|
const reqData = {token, uid}
|
||||||
|
getUser.mutate(reqData)
|
||||||
|
}else{
|
||||||
navigate(siteLinks.login)
|
navigate(siteLinks.login)
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
})
|
}
|
||||||
},[])
|
},[])
|
||||||
|
|
||||||
|
|
||||||
// useEffect(()=>{
|
|
||||||
// let token = localStorage.getItem('token')
|
|
||||||
// const timer = setTimeout(()=>{
|
|
||||||
// if(token && loggedIn){
|
|
||||||
// setLoading(false)
|
|
||||||
// }else if(token && !loggedIn){
|
|
||||||
// const data = {token}
|
|
||||||
// dispatch(updateUserDetails({ ...data }));
|
|
||||||
// setLoading(false)
|
|
||||||
// // dispatch(updateUserDetails({ ...res.data }));
|
|
||||||
// }else{
|
|
||||||
// navigate('auth/login')
|
|
||||||
// }
|
|
||||||
// },1000)
|
|
||||||
|
|
||||||
// return () => clearTimeout(timer)
|
|
||||||
// },[])
|
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
if(localStorage.getItem('room')){
|
if(localStorage.getItem('room')){
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { useQuery } from '@tanstack/react-query'
|
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
import { useQuery } from '@tanstack/react-query'
|
||||||
import { topBar } from '../../services/services'
|
import { topBar } from '../../services/services'
|
||||||
import queryKeys from '../../services/queryKeys'
|
import queryKeys from '../../services/queryKeys'
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
const queryKeys = {
|
const queryKeys = {
|
||||||
|
user_details: ['user_details'],
|
||||||
|
|
||||||
dashboard: ['dashboard'],
|
dashboard: ['dashboard'],
|
||||||
topBar: ['top-bar'],
|
topBar: ['top-bar'],
|
||||||
recentAction: ['recent-action'],
|
recentAction: ['recent-action'],
|
||||||
|
|||||||
@@ -4,12 +4,12 @@ import axios from "axios"
|
|||||||
axios.interceptors.request.use(
|
axios.interceptors.request.use(
|
||||||
config => {
|
config => {
|
||||||
config.headers = {
|
config.headers = {
|
||||||
// Accept: "application/json",
|
Accept: "application/json",
|
||||||
"Access-Control-Allow-Origin": "*",
|
"Access-Control-Allow-Origin": "*",
|
||||||
// "Access-Control-Expose-Headers": "Access-Control-Allow-Origin",
|
// "Access-Control-Expose-Headers": "Access-Control-Allow-Origin",
|
||||||
// "Access-Control-Allow-Headers": "Origin, X-API-KEY, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Allow-Headers, Authorization, observe, enctype, Content-Length, X-Csrf-Token",
|
// "Access-Control-Allow-Headers": "Origin, X-API-KEY, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Allow-Headers, Authorization, observe, enctype, Content-Length, X-Csrf-Token",
|
||||||
// "Content-Type": "application/json;charset=UTF-8",
|
// "Content-Type": "application/json;charset=UTF-8",
|
||||||
'Authorization': `Bearer ${localStorage.getItem('token')}`
|
'Authorization': (localStorage && localStorage.getItem('access_token')) ? `Bearer ${localStorage.getItem('access_token')}` : ''
|
||||||
};
|
};
|
||||||
// config.headers['Authorization'] = `Bearer ${localStorage.getItem('token')}`;
|
// config.headers['Authorization'] = `Bearer ${localStorage.getItem('token')}`;
|
||||||
// config.baseURL = process.env.REACT_APP_MAIN_API
|
// config.baseURL = process.env.REACT_APP_MAIN_API
|
||||||
@@ -25,7 +25,7 @@ const postAuxEnd = (path, postData, media=false) => {
|
|||||||
return axios.post(`${basePath}${path}`, postData).then(res => {
|
return axios.post(`${basePath}${path}`, postData).then(res => {
|
||||||
return res
|
return res
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
throw new Error(err.response.data.message);
|
throw new Error(err.response.data.msg);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,14 +42,36 @@ const getAuxEnd = (path, reqData= null) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FUNCTION TO LOGIN USER IN
|
||||||
|
export const userToken = (reqData) => {
|
||||||
|
let postData = {
|
||||||
|
...reqData
|
||||||
|
}
|
||||||
|
return postAuxEnd('/Authorize', postData, false)
|
||||||
|
}
|
||||||
|
|
||||||
// FUNCTION TO LOGIN USER IN
|
// FUNCTION TO LOGIN USER IN
|
||||||
export const loginUser = (reqData) => {
|
export const loginUser = (reqData) => {
|
||||||
let postData = {
|
let postData = {
|
||||||
...reqData
|
...reqData
|
||||||
}
|
}
|
||||||
return postAuxEnd('/panel/auth/login', postData, false)
|
return postAuxEnd('/panel/Login', postData, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FUNCTION TO GET USER INFO DATA
|
||||||
|
export const userInfo = (reqData) => {
|
||||||
|
let postData = {
|
||||||
|
...reqData
|
||||||
|
}
|
||||||
|
return postAuxEnd('/panel/Account', postData, false)
|
||||||
|
}
|
||||||
|
// export const getUserDetails = (reqData) => {
|
||||||
|
// return getAuxEnd(`/panel/Account`, reqData)
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// FUNCTION TO REGISTER USER
|
// FUNCTION TO REGISTER USER
|
||||||
export const signUpUser = (reqData) => {
|
export const signUpUser = (reqData) => {
|
||||||
let postData = {
|
let postData = {
|
||||||
@@ -91,11 +113,6 @@ export const recoverPWD = (reqData) => {
|
|||||||
return postAuxEnd('/panel/auth/reset', postData, false)
|
return postAuxEnd('/panel/auth/reset', postData, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION TO GET DASHBOARD DATA
|
|
||||||
export const accountDashboard = () => {
|
|
||||||
return getAuxEnd(`/panel/account/dash`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FUNCTION TO GET DASHBOARD TOP BAR SECTION
|
// FUNCTION TO GET DASHBOARD TOP BAR SECTION
|
||||||
export const topBar = () => {
|
export const topBar = () => {
|
||||||
return getAuxEnd(`/panel/account/bar`)
|
return getAuxEnd(`/panel/account/bar`)
|
||||||
|
|||||||
Reference in New Issue
Block a user