user analytics support

This commit is contained in:
2ManyProjects 2025-04-30 22:29:35 -05:00
parent 57c843f442
commit 4b1c0293a0
7 changed files with 18 additions and 4789 deletions

View file

@ -63,7 +63,8 @@ const config = {
site: {
domain: process.env.ENVIRONMENT === 'prod' ? 'rocks.2many.ca' : 'localhost:3000',
protocol: process.env.ENVIRONMENT === 'prod' ? 'https' : 'http',
apiDomain: process.env.ENVIRONMENT === 'prod' ? 'api.rocks.2many.ca' : 'localhost:4000'
apiDomain: process.env.ENVIRONMENT === 'prod' ? 'api.rocks.2many.ca' : 'localhost:4000',
analyticApiKey: '',
}
};
@ -152,10 +153,12 @@ config.updateFromDatabase = (settings) => {
const siteDomain = siteSettings.find(s => s.key === 'site_domain');
const siteProtocol = siteSettings.find(s => s.key === 'site_protocol');
const siteApiDomain = siteSettings.find(s => s.key === 'site_api_domain');
const analyticApiKey = siteSettings.find(s => s.key === 'site_analytics_api_key');
if (siteDomain && siteDomain.value) config.site.domain = siteDomain.value;
if (siteProtocol && siteProtocol.value) config.site.protocol = siteProtocol.value;
if (siteApiDomain && siteApiDomain.value) config.site.apiDomain = siteApiDomain.value;
if (analyticApiKey && analyticApiKey.value) config.site.analyticApiKey = analyticApiKey.value;
}
};

View file

@ -223,7 +223,7 @@ app.use('/api/admin/coupons', couponsAdminRoutes(pool, query, adminAuthMiddlewar
app.use('/api/admin/orders', ordersAdminRoutes(pool, query, adminAuthMiddleware(pool, query)));
app.use('/api/admin/blog', blogAdminRoutes(pool, query, adminAuthMiddleware(pool, query)));
app.use('/api/admin/blog-comments', blogCommentsAdminRoutes(pool, query, adminAuthMiddleware(pool, query)));
app.use('/api/admin/email-templates', emailTemplatesAdminRoutes(pool, query, adminAuthMiddleware(pool, query))); // Add new route
app.use('/api/admin/email-templates', emailTemplatesAdminRoutes(pool, query, adminAuthMiddleware(pool, query)));
// Admin-only product image upload
app.post('/api/image/product', adminAuthMiddleware(pool, query), upload.single('image'), (req, res) => {

View file

@ -32,6 +32,7 @@ VALUES
('site_api_domain', NULL, 'site'),
('site_protocol', NULL, 'site'),
('site_environment', NULL, 'site'),
('site_analytics_api_key', NULL, 'site'),
-- Payment Settings
('currency', 'CAD', 'payment'),

File diff suppressed because it is too large Load diff

View file

@ -13,6 +13,7 @@
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
"@fontsource/roboto": "^5.0.8",
"@microsoft/clarity": "^1.0.0",
"@mui/icons-material": "^5.14.19",
"@mui/material": "^5.14.19",
"@reduxjs/toolkit": "^2.0.1",

View file

@ -6,6 +6,7 @@ import ProtectedRoute from '@components/ProtectedRoute';
import { StripeProvider } from './context/StripeContext';
import useBrandingSettings from '@hooks/brandingHooks';
import imageUtils from '@utils/imageUtils';
import Clarity from '@microsoft/clarity';
// Import layouts
import MainLayout from './layouts/MainLayout';
@ -43,7 +44,14 @@ const BlogEditPage = lazy(() => import('@pages/Admin/BlogEditPage'));
const AdminBlogCommentsPage = lazy(() => import('@pages/Admin/BlogCommentsPage'));
const AdminProductReviewsPage = lazy(() => import('@pages/Admin/ProductReviewsPage'));
const EmailTemplatesPage = lazy(() => import('@pages/Admin/EmailTemplatesPage'));
const BrandingPage = lazy(() => import('@pages/Admin/BrandingPage')); // New Branding Page
const BrandingPage = lazy(() => import('@pages/Admin/BrandingPage'));
const projectId = "rcjhrd0t72"
Clarity.init(projectId);
// Loading component for suspense fallback
const LoadingComponent = () => (

View file

@ -4,7 +4,7 @@ import authService from '@services/authService';
import cartService from '@services/cartService';
import { useAuth, useCart, useNotification } from './reduxHooks';
import apiClient from '@services/api';
import Clarity from '@microsoft/clarity';
// Product hooks
export const useProducts = (params) => {
return useQuery({
@ -146,6 +146,7 @@ export const useVerifyCode = () => {
onSuccess: (data) => {
login(data.userId, data.apiKey, data.isAdmin, data.email, data?.firstName, data?.lastName);
notification.showNotification('Login successful', 'success');
Clarity.identify(data.userId, data.apiKey);
},
onError: (error) => {
notification.showNotification(