Compare commits

..

13 Commits

Author SHA1 Message Date
victorAnumudu 1d31507984 new products endpoint added 2025-06-25 19:31:50 +01:00
ameye a3dbc8cab1 Merge branch 'location-reload' of MERMS/MermsPanelReactJS into master 2025-06-25 13:08:28 +00:00
victorAnumudu 29878e3ddf fix location reload error 2025-06-25 13:06:32 +01:00
CHIEFSOFT\ameye 80a40da9df dev .env 2025-06-24 15:57:41 -04:00
ameye 9f7f1b706b Merge branch 'product-endpoint' of MERMS/MermsPanelReactJS into master 2025-06-24 16:18:58 +00:00
victorAnumudu d878d1d098 made product endpoint a POST request 2025-06-24 17:17:36 +01:00
ameye 3a60d4e12c Merge branch 'new-top-bar' of MERMS/MermsPanelReactJS into master 2025-06-24 15:47:48 +00:00
victorAnumudu c03c70b07e auth layout fix 2025-06-24 16:41:05 +01:00
victorAnumudu 9d158fe1cb added new endpoint for top bar data 2025-06-24 16:38:42 +01:00
CHIEFSOFT\ameye ffd80d9888 New urls 2025-06-23 18:12:51 -04:00
CHIEFSOFT\ameye 384da476a6 Hide real build for now 2025-06-23 16:20:55 -04:00
CHIEFSOFT\ameye 3576e7f702 force all to test 2025-06-23 14:55:27 -04:00
ameye 5ed94fee53 Merge branch 'login-new-endpoint' of MERMS/MermsPanelReactJS into master 2025-06-23 18:36:13 +00:00
10 changed files with 182 additions and 71 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
SKIP_PREFLIGHT_CHECK=true
REACT_APP_NODE_ENV="development"
REACT_APP_SOCKET_URL="https://dev-socket.mermsemr.com"
REACT_APP_SOCKET_URL="https://devsocket.mermsemr.com"
REACT_APP_MAIN_API="https://devapi.mermsemr.com"
REACT_APP_MEDIA_SERVER="https://dev-media.mermsemr.com"
REACT_APP_MAIN_SOCKET="https://dev-socket.mermsemr.com"
+1 -1
View File
@@ -1,6 +1,6 @@
SKIP_PREFLIGHT_CHECK=true
REACT_APP_NODE_ENV="development"
REACT_APP_SOCKET_URL="https://dev-socket.mermsemr.com"
REACT_APP_SOCKET_URL="https://devsocket.mermsemr.com"
REACT_APP_MAIN_API="https://devapi.mermsemr.com"
REACT_APP_MEDIA_SERVER="https://dev-media.mermsemr.com"
REACT_APP_MAIN_SOCKET="https://dev-socket.mermsemr.com"
+1 -1
View File
@@ -1,7 +1,7 @@
SKIP_PREFLIGHT_CHECK=true
REACT_APP_NODE_ENV="production"
REACT_APP_SOCKET_URL="https://socket.mermsemr.com"
REACT_APP_MAIN_API="https://api.mermsemr.com"
REACT_APP_MAIN_API="https://devapi.mermsemr.com"
REACT_APP_MEDIA_SERVER="https://media.mermsemr.com"
# login footer links
+2 -1
View File
@@ -33,7 +33,8 @@
},
"scripts": {
"start": "react-scripts start -e .env.development",
"build": "GENERATE_SOURCEMAP=false react-scripts build -e .env.production",
"build": "react-scripts start -e .env.development",
"build_real": "GENERATE_SOURCEMAP=false react-scripts build -e .env.production",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
+11 -2
View File
@@ -1,6 +1,6 @@
import React, { useState } from 'react'
import React, { useEffect, useState } from 'react'
import { useMutation } from '@tanstack/react-query'
import { useDispatch } from 'react-redux'
import { useDispatch, useSelector } from 'react-redux'
// import LoginImg from '../../assets/bg/login.svg'
@@ -14,6 +14,9 @@ import IOSDownload from '../../assets/img/download/apple.jpg'
export default function Login() {
const { userDetails: { token, room }} = useSelector((state) => state?.userDetails); // CHECKS IF USER Details are avaliable, to determine if user is active
let loggedIn = token && room ? true : false; // variable to determine if user is logged in
const dispatch = useDispatch()
const navigate = useNavigate()
@@ -67,6 +70,12 @@ export default function Login() {
}
}
useEffect(()=>{ // NAVIGATES USER TO HOME PAGE IF USER IS ACTIVE
if(loggedIn){
navigate(siteLinks.dash)
}
},[])
return (
<div className="app">
<div className="app-wrap">
+2 -1
View File
@@ -11,7 +11,8 @@ export default function BearerToken() {
return userToken(fields)
},
onError: (error) => {
location.reload();
console.log(error)
// window.location.reload(true)
},
onSuccess: (res) => {
if(res?.data?.resultCode != '0'){
+31 -25
View File
@@ -1,29 +1,35 @@
import { useQuery } from '@tanstack/react-query'
import React from 'react'
import { productData } from '../../services/services'
import queryKeys from '../../services/queryKeys'
import React, {useEffect} from 'react'
import { useMutation } from '@tanstack/react-query'
import { productsData } from '../../services/services'
import productPath from "../../utils/productpath";
import { Link } from 'react-router-dom';
export default function Products() {
const {data, isFetching, isError, error} = useQuery({
queryKey: queryKeys.product,
queryFn: () => productData()
export default function Products() {
const getProductsData = useMutation({
mutationFn: (reqData) => {
return productsData(reqData)
},
onError: (error) => {
console.log(error)
},
onSuccess: (res) => {
if(res?.data?.resultCode != '0'){
throw({message: 'Something went wrong'})
}
}
})
/*
{
"banner": "p1.jpg",
"description": "Your personal professional web presence",
"id": 1,
"name": "Personal Website",
"product_id": "A000001",
"product_uid": "e92282b4-3ee1-4026-92ac-12cfd214b43a",
"status": 5,
"status_text": "Activate Now"
},
*/
//const products = data?.data?.products_list?.products
const products = data?.data?.products_list
useEffect(()=>{
let reqData = {
token: localStorage.getItem('token'), // USER TOKEN
uid: localStorage.getItem('uid') // USER UID
}
getProductsData.mutate(reqData)
},[])
const products = getProductsData?.data?.data?.products_data // PRODUCTS DATA
console.log('PPP', products)
return (
<>
@@ -32,7 +38,7 @@ export default function Products() {
<h4 className="card-title">My Products</h4>
</div>
<div className="card-body pb-0">
{isFetching ?
{getProductsData?.isPending ?
<>
<div className="row">
<div className="col-12">
@@ -40,10 +46,10 @@ export default function Products() {
</div>
</div>
</>
: isError ?
: getProductsData?.isPending ?
<div className="row">
<div className="col-12">
<p className='text-danger'>{error.message}</p>
<p className='text-danger'>{getProductsData?.error?.message}</p>
</div>
</div>
:
+28 -12
View File
@@ -1,20 +1,36 @@
import React from 'react'
import { useQuery } from '@tanstack/react-query'
import React, {useEffect} from 'react'
import { useMutation } from '@tanstack/react-query'
import { topBar } from '../../services/services'
import queryKeys from '../../services/queryKeys'
export default function TopBar() {
const {data, isFetching, isError, error} = useQuery({
queryKey: queryKeys.topBar,
queryFn: () => topBar()
})
const topBarData = useMutation({
mutationFn: (reqData) => {
return topBar(reqData)
},
onError: (error) => {
console.log(error)
},
onSuccess: (res) => {
if(res?.data?.resultCode != '0'){
throw({message: 'Something went wrong'})
}
}
})
const topData = data?.data?.bar_data?.top_bar
useEffect(()=>{
let reqData = {
token: localStorage.getItem('token'), // USER TOKEN
uid: localStorage.getItem('uid') // USER UID
}
topBarData.mutate(reqData)
},[])
const data = topBarData?.data?.data?.top_bar // top bar data
return (
<>
{isFetching ?
{topBarData.isPending ?
<>
<div className="col-12">
<div className="card p-4">
@@ -22,15 +38,15 @@ export default function TopBar() {
</div>
</div>
</>
: isError ?
: topBarData.error ?
<div className="col-12">
<div className="card p-4">
<p className='text-danger'>{error.message}</p>
<p className='text-danger'>{topBarData.error.message}</p>
</div>
</div>
:
<>
{topData && topData?.map((item, index)=>{
{data && data?.map((item, index)=>{
let textColor = item?.description == 'Contacts' ? 'text-danger' : item?.description == 'Site Traffic' ? 'text-primary' : item?.description == 'Appointments' ? 'text-orange' : 'text-success'
return (
<div key={item.id + index} className="col-sm-6 col-xxl-3">
+67
View File
@@ -0,0 +1,67 @@
import React from 'react'
import { useQuery } from '@tanstack/react-query'
import { topBar } from '../../services/services'
import queryKeys from '../../services/queryKeys'
export default function TopBar() {
const {data, isFetching, isError, error} = useQuery({
queryKey: queryKeys.topBar,
queryFn: () => topBar()
})
const topData = data?.data?.bar_data?.top_bar
console.log('topData', topData)
return (
<>
{isFetching ?
<>
<div className="col-12">
<div className="card p-4">
<p className='text-mute'>Loading...</p>
</div>
</div>
</>
: isError ?
<div className="col-12">
<div className="card p-4">
<p className='text-danger'>{error.message}</p>
</div>
</div>
:
<>
{topData && topData?.map((item, index)=>{
let textColor = item?.description == 'Contacts' ? 'text-danger' : item?.description == 'Site Traffic' ? 'text-primary' : item?.description == 'Appointments' ? 'text-orange' : 'text-success'
return (
<div key={item.id + index} className="col-sm-6 col-xxl-3">
<div className="card card-statistics ecommerce-contant overflow-h">
<div className="card-body p-0">
<div className="d-flex m-b-0 ecommerce-contant-text h-100">
<div className="w-100">
<div className="row p-3">
<div className="col">
<h3 className="mb-0">{item?.value || 0}</h3>
<small className="d-block">{item?.data_span}</small>
</div>
<div className="col text-right">
<h5 className="text-muted mb-0">{item?.description}</h5>
<strong className={`${textColor} m-t-5`}><i
className="zmdi zmdi-long-arrow-up font-weight-bold"></i> N/A</strong>
</div>
</div>
<div className="apexchart-wrapper">
<div id="ecommercedemo3" className="chart-fit"></div>
</div>
</div>
</div>
</div>
</div>
</div>
)
})}
</>
}
</>
)
}
+38 -27
View File
@@ -9,7 +9,8 @@ axios.interceptors.request.use(
// "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",
// "Content-Type": "application/json;charset=UTF-8",
'Authorization': (localStorage && localStorage.getItem('access_token')) ? `Bearer ${localStorage.getItem('access_token')}` : ''
'Authorization': (localStorage && localStorage.getItem('access_token')) ? `Bearer ${localStorage.getItem('access_token')}` : '',
// 'uuid': 'dummy'
};
// config.headers['Authorization'] = `Bearer ${localStorage.getItem('token')}`;
// config.baseURL = process.env.REACT_APP_MAIN_API
@@ -42,7 +43,7 @@ const getAuxEnd = (path, reqData= null) => {
})
}
// FUNCTION TO LOGIN USER IN
// FUNCTION TO AUTHORIZE USER IN
export const userToken = (reqData) => {
let postData = {
...reqData
@@ -63,14 +64,40 @@ export const userInfo = (reqData) => {
let postData = {
...reqData
}
return postAuxEnd('/panel/Account', postData, false)
return postAuxEnd('/panel/account', postData, false)
}
// FUNCTION TO GET DASHBOARD TOP BAR SECTION
export const topBar = (reqData) => {
let postData = {
...reqData,
}
return postAuxEnd(`/panel/account/bar`, postData, false)
}
// FUNCTION TO GET DASHBOARD RECENT ACTIONS SECTION
export const recentActions = (reqData) => {
let postData = {
...reqData,
}
//return getAuxEnd(`/panel/account/actions`)
return postAuxEnd(`/panel/account/actions`, postData, false)
}
// FUNCTION TO GET DASHBOARD PRODUCT DATA SECTION
export const productsData = (reqData) => {
let postData = {
...reqData,
}
return postAuxEnd(`/panel/account/products`, postData, false)
}
// export const getUserDetails = (reqData) => {
// return getAuxEnd(`/panel/Account`, reqData)
// }
// FUNCTION TO GET DASHBOARD PRODUCT URL DATA SECTION
export const productsURL = () => {
return getAuxEnd(`/panel/account/products/url`)
}
// FUNCTION TO REGISTER USER
export const signUpUser = (reqData) => {
@@ -113,19 +140,13 @@ export const recoverPWD = (reqData) => {
return postAuxEnd('/panel/auth/reset', postData, false)
}
// FUNCTION TO GET DASHBOARD TOP BAR SECTION
export const topBar = () => {
return getAuxEnd(`/panel/account/bar`)
}
// FUNCTION TO GET CALENDAR EVENTS
export const getCalendarEvents = () => {
return getAuxEnd(`/panel/account/calendar`)
}
// FUNCTION TO GET DASHBOARD RECENT ACTIONS SECTION
export const recentActions = () => {
return getAuxEnd(`/panel/account/actions`)
// return getAuxEnd(`/panel/account/calendar`)
let postData = {
"a":"b"
}
return postAuxEnd(`/panel/account/calendar`, postData, false)
}
// FUNCTION TO GET MY PRODUCT PROVISION DATA
@@ -134,21 +155,11 @@ export const productProvision = (reqData) => {
return getAuxEnd(`/panel/myproduct/provision`, postData)
}
// FUNCTION TO GET DASHBOARD PRODUCT DATA SECTION
export const productData = () => {
return getAuxEnd(`/panel/account/products`)
}
// FUNCTION TO GET DASHBOARD PRODUCT DATA SECTION
export const contactData = () => {
return getAuxEnd(`/panel/contacts`)
}
// FUNCTION TO GET DASHBOARD PRODUCT URL DATA SECTION
export const productsURL = () => {
return getAuxEnd(`/panel/account/products/url`)
}
export const MyProductData = (productID) => {
const reqData = { product_id : productID}
//console.log(reqData)