diff --git a/packages/aesirx-bi-app/package.json b/packages/aesirx-bi-app/package.json index f414cd69..41684398 100644 --- a/packages/aesirx-bi-app/package.json +++ b/packages/aesirx-bi-app/package.json @@ -1,6 +1,6 @@ { "name": "aesirx-bi-app", - "version": "2.8.0", + "version": "2.8.1", "license": "GPL-3.0-only", "author": "AesirX", "main": "dist/index.js", diff --git a/packages/aesirx-bi-app/src/containers/Dashboard/Dashboard.jsx b/packages/aesirx-bi-app/src/containers/Dashboard/Dashboard.jsx index d1a5936d..b63b7229 100644 --- a/packages/aesirx-bi-app/src/containers/Dashboard/Dashboard.jsx +++ b/packages/aesirx-bi-app/src/containers/Dashboard/Dashboard.jsx @@ -190,11 +190,21 @@ const Dashboard = observer(
- -
Local
- - -
Page
+ {this.props.integration && this.props.isFreemium ? ( + <> + ) : ( + +
Local
+ + )} + +
+ Page +
@@ -207,17 +217,29 @@ const Dashboard = observer( const urlParams = item?.url && new URL(item?.url); return ( - -
- -
- - -
+ {this.props.integration && this.props.isFreemium ? ( + <> + ) : ( + +
+ +
+ + )} + +
{urlParams === '' ? 'Unknown' @@ -234,13 +256,21 @@ const Dashboard = observer( {this.dashboardListViewModel.liveVisitorsListData?.length ? (
{this.props.integration ? ( - this.props.handleChangeLink(e, `/visitors/realtime`)} - className={'text-secondary-50 text-nowrap fw-medium'} - > - {t('txt_view_more')} - + <> + {!this.props.isFreemium ? ( + + this.props.handleChangeLink(e, `/visitors/realtime`) + } + className={'text-secondary-50 text-nowrap fw-medium'} + > + {t('txt_view_more')} + + ) : ( + <> + )} + ) : (
- -
- -
- - + {this.props.integration && this.props.isFreemium ? ( + <> + ) : ( + +
+ +
+ + )} +
diff --git a/packages/aesirx-bi-app/src/containers/Dashboard/index.jsx b/packages/aesirx-bi-app/src/containers/Dashboard/index.jsx index b6ead38a..b876f21b 100644 --- a/packages/aesirx-bi-app/src/containers/Dashboard/index.jsx +++ b/packages/aesirx-bi-app/src/containers/Dashboard/index.jsx @@ -64,7 +64,7 @@ const DashboardContainer = observer( componentRef={this.componentRef} sectionName={'dashboard'} /> - (this.componentRef = el)} /> + (this.componentRef = el)} {...this.props} /> ); } diff --git a/packages/aesirx-bi-app/src/containers/UTMTrackingPage/UTMTracking.jsx b/packages/aesirx-bi-app/src/containers/UTMTrackingPage/UTMTracking.jsx index 4e07042f..81be009a 100644 --- a/packages/aesirx-bi-app/src/containers/UTMTrackingPage/UTMTracking.jsx +++ b/packages/aesirx-bi-app/src/containers/UTMTrackingPage/UTMTracking.jsx @@ -95,15 +95,16 @@ const UTMTrackingPage = observer((props) => { ?.reduce((acc, curr) => ({ ...acc, ...curr }), {}), 'filter[attribute_name]': 'utm_source', }); - getAttributeUtm({ - ...activeDomain - ?.map((value, index) => ({ - [`filter[domain][${index + 1}]`]: value, - })) - ?.reduce((acc, curr) => ({ ...acc, ...curr }), {}), - 'filter[attribute_name][0]': 'utm_campaign', - 'filter_not[visibility_change]': 'true', - }); + !(props.integration && props.isFreemium) && + getAttributeUtm({ + ...activeDomain + ?.map((value, index) => ({ + [`filter[domain][${index + 1}]`]: value, + })) + ?.reduce((acc, curr) => ({ ...acc, ...curr }), {}), + 'filter[attribute_name][0]': 'utm_campaign', + 'filter_not[visibility_change]': 'true', + }); }; execute(); return () => {}; @@ -234,23 +235,29 @@ const UTMTrackingPage = observer((props) => { />
-

UTM Value & Engagement Score

-
-
- {dataAttributeUtm?.list?.data && ( - - )} -
-
+ {props.integration && props.isFreemium ? ( + <> + ) : ( + <> +

UTM Value & Engagement Score

+
+
+ {dataAttributeUtm?.list?.data && ( + + )} +
+
+ + )}

List Campaign

{dataAttributeList?.toAttributeList()?.length && ( diff --git a/packages/aesirx-bi-app/src/containers/UTMTrackingPage/index.jsx b/packages/aesirx-bi-app/src/containers/UTMTrackingPage/index.jsx index 5f612221..91c7fdf8 100644 --- a/packages/aesirx-bi-app/src/containers/UTMTrackingPage/index.jsx +++ b/packages/aesirx-bi-app/src/containers/UTMTrackingPage/index.jsx @@ -42,7 +42,7 @@ const UTMTrackingPage = observer( ); } render() { - const { integration = false } = this.props; + const { integration = false, isFreemium = true } = this.props; const { integrationLink, activeDomain } = this.biListViewModel; const match = matchPath(history.location.pathname, { @@ -67,6 +67,7 @@ const UTMTrackingPage = observer( (this.componentRef = el)} diff --git a/packages/aesirx-bi-app/src/containers/VisitorsPage/Visitors.jsx b/packages/aesirx-bi-app/src/containers/VisitorsPage/Visitors.jsx index 21b4d088..192b34ac 100644 --- a/packages/aesirx-bi-app/src/containers/VisitorsPage/Visitors.jsx +++ b/packages/aesirx-bi-app/src/containers/VisitorsPage/Visitors.jsx @@ -201,61 +201,65 @@ const VisitorsPage = observer( handleChangeLink={this.handleChangeLink} {...this.props} /> -
-
-

{t('txt_user_experience')}

- {this.props.integration ? ( - this.handleChangeLink(e, `/flow-list`)} - className={'text-success me-2 text-nowrap fw-semibold'} - > - {t('txt_view_more')} - + {this.props.integration && this.props.isFreemium ? ( + <> + ) : ( +
+
+

{t('txt_user_experience')}

+ {this.props.integration ? ( + this.handleChangeLink(e, `/flow-list`)} + className={'text-success me-2 text-nowrap fw-semibold'} + > + {t('txt_view_more')} + + ) : ( + + {t('txt_view_more')} + + )} +
+ + {this.visitorsListViewModel?.statusFlowList === PAGE_STATUS.LOADING ? ( + + ) : this.visitorsListViewModel?.flowListTableData?.list ? ( + { + await this.visitorsListViewModel.handleFilterFlowList({ page: value }); + }} + selectPageSize={async (value) => { + await this.visitorsListViewModel.handleFilterFlowList({ + page: 1, + page_size: value, + }); + }} + status={status} + sortAPI={true} + handleSort={this.handleSortFlowList} + sortBy={this.visitorsListViewModel?.sortByFlowList} + {...this.props} + /> ) : ( - - {t('txt_view_more')} - +
+
+ +
+
)}
- - {this.visitorsListViewModel?.statusFlowList === PAGE_STATUS.LOADING ? ( - - ) : this.visitorsListViewModel?.flowListTableData?.list ? ( - { - await this.visitorsListViewModel.handleFilterFlowList({ page: value }); - }} - selectPageSize={async (value) => { - await this.visitorsListViewModel.handleFilterFlowList({ - page: 1, - page_size: value, - }); - }} - status={status} - sortAPI={true} - handleSort={this.handleSortFlowList} - sortBy={this.visitorsListViewModel?.sortByFlowList} - {...this.props} - /> - ) : ( -
-
- -
-
- )} -
+ )}
); } diff --git a/packages/aesirx-bi-app/src/containers/VisitorsPage/index.jsx b/packages/aesirx-bi-app/src/containers/VisitorsPage/index.jsx index 64aa30fe..d1051745 100644 --- a/packages/aesirx-bi-app/src/containers/VisitorsPage/index.jsx +++ b/packages/aesirx-bi-app/src/containers/VisitorsPage/index.jsx @@ -44,7 +44,7 @@ const VisitorsContainer = observer( } render() { - const { integration = false } = this.props; + const { integration = false, isFreemium = true } = this.props; const { integrationLink, activeDomain } = this.biListViewModel; const matchVisitor = matchPath(history.location.pathname, { path: process.env.REACT_APP_INTERGRATION ? '/bi' : '' + '/visitors', @@ -105,6 +105,7 @@ const VisitorsContainer = observer( integrationLink={integrationLink} activeDomain={activeDomain} ref={(el) => (this.componentRef = el)} + isFreemium={isFreemium} /> ); diff --git a/packages/aesirx-bi-app/src/integration/lib/MainLayoutIntegration.jsx b/packages/aesirx-bi-app/src/integration/lib/MainLayoutIntegration.jsx index 249c0f9b..a106dc8f 100644 --- a/packages/aesirx-bi-app/src/integration/lib/MainLayoutIntegration.jsx +++ b/packages/aesirx-bi-app/src/integration/lib/MainLayoutIntegration.jsx @@ -3,7 +3,7 @@ * @license GNU General Public License version 3, see LICENSE. */ -import React, { lazy, Suspense, useState } from 'react'; +import React, { lazy, Suspense, useEffect, useState } from 'react'; import { BiStoreProvider, useBiViewModel } from '../../store/BiStore/BiViewModelContextProvider'; import { BiViewModel } from '../../store/BiStore/BiViewModel'; @@ -16,8 +16,8 @@ import { authRoutes, mainRoutes } from '../../routes/routes'; import { DataStream } from '../../components/DataStream'; import { appLanguages } from '../../translations'; import SbarLeftIntegration from './SbarLeftIntegration'; -import { Storage } from 'aesirx-lib'; -import { mainMenu } from 'routes/menu'; +import { env, Storage } from 'aesirx-lib'; +import { freemiumMainMenu, mainMenu } from 'routes/menu'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useTranslation } from 'react-i18next'; import { Dropdown } from 'react-bootstrap'; @@ -46,7 +46,7 @@ const biViewModel = new BiViewModel(); const MainLayoutIntegration = (props) => { const isAuthenticated = Storage.getItem('auth'); - + const isFreemium = props?.isFreemium ?? true; return ( { isLogin={() => true} componentHeader={} integration={true} - leftMenu={} + isFreemium={isFreemium} + leftMenu={} rootId="#biapp" noavatar={true} isColorMode={false} @@ -65,7 +66,7 @@ const MainLayoutIntegration = (props) => { {!isAuthenticated && window.env.STORAGE === 'external' ? ( ) : ( - + )}
@@ -78,6 +79,24 @@ String.prototype.startsWith = function (str) { }; const RenderComponent = ({ link, ...props }) => { + const isFreemium = props?.isFreemium ?? true; + + if ( + isFreemium && + ([ + 'woocommerce', + 'woocommerce-product', + 'consents', + 'consents-template', + 'consents-advance', + 'flow-list', + ].includes(link) || + link.startsWith('flow') || + link.startsWith('events-detail')) + ) { + return ; + } + switch (link) { case 'visitors': return ; @@ -153,6 +172,8 @@ const App = observer((props) => { biListViewModel: { integrationLink, activeDomain, setIntegrationLink }, } = useBiViewModel(); const { t } = useTranslation(); + const [menuList, setMenuList] = useState(mainMenu); + const handleChangeLink = (e, link) => { e.preventDefault(); if (link) { @@ -160,11 +181,17 @@ const App = observer((props) => { } }; + useEffect(() => { + if (props?.isFreemium) { + setMenuList(freemiumMainMenu); + } + }, [props?.isFreemium]); + return ( }> - {mainMenu ? ( + {menuList ? (
- {mainMenu?.map((menuList, menuListKey) => { + {menuList?.map((menuList, menuListKey) => { return (
{menuList?.link && ( @@ -216,8 +243,13 @@ const App = observer((props) => { ) : ( handleChangeLink(e, menuList?.page)} + href={`${menuList?.page === 'cmp' ? `${env.REACT_APP_CMP_LINK}` : '#'} `} + {...(menuList?.page === 'cmp' ? { target: '_blank' } : {})} + onClick={(e) => { + if (menuList?.page !== 'cmp') { + handleChangeLink(e, menuList?.page); + } + }} className={`d-flex align-items-center me-3 px-4 py-10 text-decoration-none fw-medium border rounded-pill ${ integrationLink === menuList.page ? 'active' : '' }`} diff --git a/packages/aesirx-bi-app/src/integration/lib/SbarLeftIntegration.jsx b/packages/aesirx-bi-app/src/integration/lib/SbarLeftIntegration.jsx index 08866de6..2465c92e 100644 --- a/packages/aesirx-bi-app/src/integration/lib/SbarLeftIntegration.jsx +++ b/packages/aesirx-bi-app/src/integration/lib/SbarLeftIntegration.jsx @@ -11,15 +11,17 @@ import { env } from 'aesirx-lib'; import { Collapse } from 'react-bootstrap'; import { useBiViewModel } from '../../store/BiStore/BiViewModelContextProvider'; -import { mainMenu } from '../../routes/menu'; +import { mainMenu, freemiumMainMenu } from '../../routes/menu'; -const SbarLeftIntegration = observer(() => { +const SbarLeftIntegration = observer((props) => { const [isOpenCollapse, setIsOpenCollapse] = useState('default'); const [dataStreamActive, setDataStreamActive] = useState( env.REACT_APP_DATA_STREAM && JSON.parse(env.REACT_APP_DATA_STREAM)[0].domain ); const biStore = useBiViewModel(); const { t } = useTranslation(); + + const [menuList, setMenuList] = useState(mainMenu); const handleOpen = (clickedIndex, parentIndex) => { if (isOpenCollapse === clickedIndex.toString()) { if (parentIndex) { @@ -55,6 +57,12 @@ const SbarLeftIntegration = observer(() => { fetchData(); }, [biStore.biListViewModel.activeDomain, dataStreamActive]); + useEffect(() => { + if (props?.isFreemium) { + setMenuList(freemiumMainMenu); + } + }, [props?.isFreemium]); + return (