Compare commits

...

6 Commits

Author SHA1 Message Date
victorAnumudu 7ad1a585ea added refresh message display 2025-10-06 17:13:28 +01:00
CHIEFSOFT\ameye a8c2dd84f1 provison room 2025-10-06 11:52:38 -04:00
CHIEFSOFT\ameye ddcc6f0cd2 Rebuild site text change 2025-10-05 14:00:30 -04:00
CHIEFSOFT\ameye 683f81e8a6 customn temaplte 2025-10-05 13:53:11 -04:00
CHIEFSOFT\ameye 8e09c30c5c fix error on display 2025-10-05 13:18:16 -04:00
ameye af0d4db5de Merge branch 'external-url-populate' of MERMS/MermsPanelReactJS into master 2025-10-04 10:02:39 +00:00
6 changed files with 112 additions and 70 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

+1 -1
View File
@@ -41,7 +41,7 @@ export default function SocketIOContextProvider({children}) {
socket.on(socketOnEvents.receive_message, (data) => {
// setSocketMsgReceived(data.message);
// dispatch(tableReload({type:'CHATMESSAGELIST'})) // dispatches to update chat message sending from owner to worker and vice versa
console.log('DATA', data)
console.log('SOCKET RECEIVED DATA *** ', data)
queryClient.refetchQueries({
queryKey: [...queryKeys.recentAction],
// type: 'active',
+1 -1
View File
@@ -59,7 +59,7 @@ export default function DashPayments() {
</tr>
</thead>
<tbody>
{payments.length > 0 ?
{payments && payments?.length > 0 ?
payments.map((item, index) => {
return (
<tr key={index}>
+21 -4
View File
@@ -1,21 +1,26 @@
import React, { useMemo, useRef, useState } from "react";
import React, {useEffect, useMemo, useRef, useState} from "react";
import { useSelector } from "react-redux";
import getImage from "../../utils/getImage";
import { useMutation, useQuery } from "@tanstack/react-query";
import { productRefreshSite, getSettingsData } from "../../services/services";
import Settings from "./settingsTab/Settings";
import queryKeys from "../../services/queryKeys";
import {SocketContextValues} from "../context/SocketIOContext";
export default function ProductActive({productData}){
const {joinRoom} = SocketContextValues() // Destructures values from socket context
const iframe = useRef()
const [refreshMsg, setRefreshMsg] = useState('')
const refresh = useMutation({
mutationFn: (fields) => {
return productRefreshSite(fields)
},
onSuccess: (res) => {
setRefreshMsg(res?.data?.message)
setTimeout(()=>{setRefreshMsg('')},3000)
iframe.current.src += ''
}
})
@@ -31,6 +36,13 @@ export default function ProductActive({productData}){
}
let externalUrl= 'https://'+productData?.internal_url
const productSubUID = productData.subscription_uid;
useEffect(() => {
const provision_room = "PROVISION_"+productSubUID;
console.log("JOINING ROOM ON ACTIVE *** ", provision_room);
joinRoom(provision_room); // provision subscription room
}, [])
return(
<>
{/*<BreadcrumbComBS title='Active Product Name' paths={['Dashboard', 'Product']} />*/}
@@ -58,8 +70,13 @@ export default function ProductActive({productData}){
<iframe ref={iframe} style={{borderWidth: '0px'}} src={externalUrl} width="100%" height="600" title={externalUrl}></iframe>
</div>
<div className="p-4 ml-auto">
<button type="button" onClick={handleRefresh} className="btn btn-primary">{refresh.isPending ? 'Loading...' : 'Refresh Site'}
</button>
<div className="d-flex justify-end gap-3">
{refreshMsg &&
<p className="text-success text-center">{refreshMsg}</p>
}
<button type="button" onClick={handleRefresh} className="btn btn-primary">{refresh.isPending ? 'Initiating...' : 'Rebuild Site'}
</button>
</div>
</div>
</div>
</div>
+70 -63
View File
@@ -1,39 +1,41 @@
import { useEffect } from "react";
import { useQuery } from "@tanstack/react-query";
import {useEffect} from "react";
import {useQuery} from "@tanstack/react-query";
import queryKeys from "../../services/queryKeys";
import { productProvision } from "../../services/services";
import {productProvision} from "../../services/services";
import getImage from "../../utils/getImage";
import { SocketContextValues } from "../context/SocketIOContext";
import {SocketContextValues} from "../context/SocketIOContext";
export default function ProductProvision(props){
export default function ProductProvision(props) {
const {joinRoom} = SocketContextValues() // Destructures values from socket context
const productTitle = props?.productData?.title;
const productDescription = props?.productData?.description;
const productTitle = props?.productData?.title;
const productDescription = props?.productData?.description;
const productID = props?.productData?.product_id
const productUID = props?.productData?.product_uid
const productSubUID = props?.productData?.product_subscription_uid
const reqData = {
product_id : productID,
product_id: productID,
product_subscription_uid: productSubUID
}
const {data:provision, isFetching, isError, error} = useQuery({
const {data: provision, isFetching, isError, error} = useQuery({
queryKey: queryKeys.myproduct_provision,
queryFn: () => productProvision(reqData)
})
const provisionData = provision?.data
useEffect(()=>{
joinRoom(productSubUID); // provision subscription room
},[])
useEffect(() => {
const provision_room = "PROVISION_"+productSubUID;
console.log("JOINING ROOM ON START *** ", provision_room);
joinRoom(provision_room); // provision subscription room
}, [])
return (
<>
{isFetching ?
{isFetching ?
<>
<div className="row">
<div className="col-12">
@@ -42,82 +44,87 @@ export default function ProductProvision(props){
</div>
</>
: isError ?
<div className="row">
<div className="col-12">
<p className='text-danger'>{error.message}</p>
</div>
</div>
:
<>
<div className="row">
<div className="col-md-12">
<div className="card card-statistics">
<div className="card-header">
<div className="col-12">
<p className='text-danger'>{error.message}</p>
</div>
</div>
:
<>
<div className="row">
<div className="col-md-12">
<div className="card card-statistics">
<div className="card-header">
<div className="card-heading">
<h4 className="card-title">Creating - {productTitle} </h4>
<h4 className="card-title">Creating - {productTitle} </h4>
</div>
</div>
<div className="card-body">
<div className="progress">
<div className="progress-bar progress-bar-striped progress-bar-animated" role="progressbar"
aria-valuenow={`${provisionData?.percent_completed}%`} aria-valuemin="0" aria-valuemax="100" style={{width:`${provisionData?.percent_completed}%`}} ></div>
<div className="progress-bar progress-bar-striped progress-bar-animated"
role="progressbar"
aria-valuenow={`${provisionData?.percent_completed}%`}
aria-valuemin="0" aria-valuemax="100"
style={{width: `${provisionData?.percent_completed}%`}}></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="row">
<div className="col-md-12">
<div className="row">
<div className="col-md-12">
</div>
</div>
</div>
<div className="row">
<div className="col-lg-6">
<div className="row">
<div className="col-lg-6">
<div className="card card-statistics">
<div className="card-header">
<div className="card-heading">
<h4 className="card-title">Progress Information</h4>
<div className="card card-statistics">
<div className="card-header">
<div className="card-heading">
<h4 className="card-title">Progress Information</h4>
</div>
</div>
</div>
<div className="card-body">
<div className="table-responsive">
<table className="table table-info mb-0">
<thead>
<tr>
<th scope="col" style={{width: '10px'}}>#</th>
<th scope="col">Action</th>
</tr>
</thead>
<tbody>
{provisionData?.activities?.map(item => (
<tr key={item.id}>
<th scope="row">{item.id}</th>
<td>{item.action}</td>
<div className="card-body">
<div className="table-responsive">
<table className="table table-info mb-0">
<thead>
<tr>
<th scope="col" style={{width: '10px'}}>#</th>
<th scope="col">Action</th>
</tr>
</thead>
<tbody>
{provisionData?.activities?.map(item => (
<tr key={item.id}>
<th scope="row">{item.id}</th>
<td>{item.action}</td>
</tr>
))}
</tbody>
</table>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div className="col-lg-6">
<div className="card card-statistics ">
<h4 className="card-title" style={{padding:'10px'}}>Started creating your selection</h4>
<img className="card-img-top" src={getImage('widget/working.jpg')} alt="Card image cap" />
{/* <div className="card-body">
<div className="col-lg-6">
<div className="card card-statistics ">
<h4 className="card-title" style={{padding: '10px'}}>Started creating your
selection</h4>
<img className="card-img-top" src={getImage('widget/working.jpg')}
alt="Card image cap"/>
{/* <div className="card-body">
<div className="" dangerouslySetInnerHTML={{__html: productDescription}}/>
</div> */}
</div>
</div>
</div>
</div>
</div>
</>
</>
}
</>
)
@@ -3,6 +3,8 @@ import getImage from "../../../utils/getImage";
import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query';
import queryKeys from '../../../services/queryKeys';
import {getProductTemplateData, activateTemplate} from '../../../services/services';
import {Link} from "react-router-dom";
import siteLinks from "../../../links/siteLinks";
const SiteTemplateSelector = memo(({name = 'Full Name', data, productData}) => {
@@ -60,7 +62,23 @@ const SiteTemplateSelector = memo(({name = 'Full Name', data, productData}) => {
}
if (custom_template_name && custom_template_name != '') {
// This implies we have a custom template , just return here
return <>This product is using a custom template named {custom_template_name} </>
return <>
<div className='col-12'>
<div
className="rounded-2 d-flex flex-column justify-content-between align-items-center"
style={{backgroundColor: '#F2FAF7'}}>
<h4 className='p-4 text-black'
style={{marginBottom: '20px'}}>Custom Product Template.</h4>
<img className='' style={{width: '200px'}}
src={getImage('custom-template.png')}
alt='mail-alert'/>
<h4 className='p-4 text-black'
style={{marginTop: '20px'}}>This product is using a custom template named <span
style={{color: 'darkred'}}>&ldquo;{custom_template_name}&rdquo;</span> .</h4>
</div>
</div>
</>
}
return (
<div className="page-account-form">