diff --git a/src/PozoApp/Components/PricingPozoApp.jsx b/src/PozoApp/Components/PricingPozoApp.jsx
index ccfd08c..ab49f64 100644
--- a/src/PozoApp/Components/PricingPozoApp.jsx
+++ b/src/PozoApp/Components/PricingPozoApp.jsx
@@ -666,6 +666,15 @@ const PricingPozoApp = () => {
if (industry) {
handleIndustry();
}
+ // Clean URL: Remove special chars, convert spaces to hyphens
+ const cleanUrl = AppName
+ .replace(/[,]/g, '') // Remove commas
+ .replace(/\s+/g, '-') // Spaces to hyphens
+ .replace(/&/g, 'and') // & to 'and'
+ .replace(/[^a-z0-9-]/gi, '') // Remove other special chars
+ .toLowerCase();
+ navigate(`${subDirectory}${cleanUrl}`);
+ window.location.reload();
};
// Moved loading check after all hooks
diff --git a/src/PozoApp/Components/ResponsiveApp.jsx b/src/PozoApp/Components/ResponsiveApp.jsx
index ed7c707..2e9585c 100644
--- a/src/PozoApp/Components/ResponsiveApp.jsx
+++ b/src/PozoApp/Components/ResponsiveApp.jsx
@@ -35,7 +35,7 @@ const ResponsiveApp = () => {
};
const handlePricing = () => {
- navigate(`${subDirectory}pricing-pozoapp`);
+ navigate(`${subDirectory}pricing`);
};
const handleNavigateStore = () => {
diff --git a/src/PozoApp/Components/SignIn.jsx b/src/PozoApp/Components/SignIn.jsx
index 865c239..8ace57b 100644
--- a/src/PozoApp/Components/SignIn.jsx
+++ b/src/PozoApp/Components/SignIn.jsx
@@ -1,7 +1,6 @@
import React, { useState, useEffect, useRef } from "react";
import "../Styles/SignIn.scss";
-import pozominilogoWhite from "../Images/pozominilogoWhite.webp";
-import pozoAppLogo from "../Images/pozoAppLogo.webp";
+ import pozoAppLogo from "../Images/pozoAppLogo.webp";
import { RiArrowRightUpLine } from "react-icons/ri";
import { FaChevronDown } from "react-icons/fa";
import { useNavigate, useLocation } from "react-router-dom";
@@ -719,7 +718,7 @@ const SignIn = () => {
diff --git a/src/PozoApp/Pages/CaseStudies.jsx b/src/PozoApp/Pages/CaseStudies.jsx
new file mode 100644
index 0000000..6c06108
--- /dev/null
+++ b/src/PozoApp/Pages/CaseStudies.jsx
@@ -0,0 +1,31 @@
+import React from "react";
+import Navbar from "../Components/Navbar";
+import Footer from "../Components/Footer";
+import "./CaseStudies.scss";
+
+const CaseStudies = () => {
+ return (
+
+
+
+
+
+
Case Studies
+
Success stories from businesses powered by PozoApp
+
+
+
+
+
+
Coming Soon
+
We're currently working on bringing you inspiring success stories from our clients.
+
+
+
+
+
+ );
+};
+
+export default CaseStudies;
+
diff --git a/src/PozoApp/Pages/CaseStudies.scss b/src/PozoApp/Pages/CaseStudies.scss
new file mode 100644
index 0000000..1635143
--- /dev/null
+++ b/src/PozoApp/Pages/CaseStudies.scss
@@ -0,0 +1,82 @@
+.case-studies-page {
+ min-height: 100vh;
+ background: #000;
+ color: #fff;
+ font-family: "NeueMontreal", sans-serif;
+}
+
+.case-studies-hero {
+ padding: 120px 2rem 80px;
+ text-align: center;
+ background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
+
+ @media (max-width: 768px) {
+ padding: 100px 1.5rem 60px;
+ }
+
+ .case-studies-hero-content {
+ max-width: 800px;
+ margin: 0 auto;
+
+ h1 {
+ font-size: 56px;
+ font-weight: 700;
+ margin: 0 0 1.5rem 0;
+ background: linear-gradient(135deg, #fff 0%, #999 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+
+ @media (max-width: 768px) {
+ font-size: 36px;
+ }
+ }
+
+ p {
+ font-size: 22px;
+ color: #999;
+ margin: 0;
+ line-height: 1.5;
+
+ @media (max-width: 768px) {
+ font-size: 18px;
+ }
+ }
+ }
+}
+
+.case-studies-container {
+ padding: 120px 2rem;
+ max-width: 800px;
+ margin: 0 auto;
+ text-align: center;
+
+ @media (max-width: 768px) {
+ padding: 80px 1.5rem;
+ }
+
+ .coming-soon-message {
+ h2 {
+ font-size: 48px;
+ font-weight: 600;
+ margin: 0 0 1.5rem 0;
+ color: #fff;
+
+ @media (max-width: 768px) {
+ font-size: 32px;
+ }
+ }
+
+ p {
+ font-size: 20px;
+ color: #999;
+ line-height: 1.6;
+ margin: 0;
+
+ @media (max-width: 768px) {
+ font-size: 18px;
+ }
+ }
+ }
+}
+
diff --git a/src/PozoApp/Pages/HomePage.jsx b/src/PozoApp/Pages/HomePage.jsx
index c6bc266..2f65336 100644
--- a/src/PozoApp/Pages/HomePage.jsx
+++ b/src/PozoApp/Pages/HomePage.jsx
@@ -1,20 +1,9 @@
-import React, { useEffect, useRef, useState } from "react";
+import React, { useEffect, useRef, useState, lazy, Suspense } from "react";
import Lenis from "@studio-freight/lenis";
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";
import "./HomePage.scss";
import { IoClose } from "react-icons/io5";
-import OverView from "../Components/OverView.jsx";
-import Offering from "../Components/Offering.jsx";
-import DigitalSection from "../Components/DigitalSection.jsx";
-import Footer from "../Components/Footer.jsx";
-import NoLimt from "../Components/NoLimt.jsx";
-import TrendingApp from "../Components/TrendingApp.jsx";
-import FaqSection from "../Components/FaqSection.jsx";
-import Insiders from "../Components/Insiders.jsx";
-import Industries from "../Components/Industries.jsx";
-import PozoVideo from "../Components/PozoVideo.jsx";
-import Loader from "../Components/Loader/PozoLoader.jsx";
import { FaWhatsapp } from "react-icons/fa";
import { useNavigate } from "react-router-dom";
import { FaChevronUp } from "react-icons/fa";
@@ -27,15 +16,30 @@ import {
getAllApplicationData,
} from "../../features/publicHome/publicHome";
import { getSession, sessionStore } from "../../Services/others";
-import Navbar from "../Components/Navbar.jsx";
-import IndustriesList from "../Components/IndustriesList.jsx";
-import CompanyList from "../Components/companyList.jsx";
-import BookDemo from "../Components/BookDemo.jsx";
-import ModalSignIn from "../Components/ModalSignIn.jsx";
-import SEO from "../../Components/SEO/SEO.jsx";
-import { getSeo } from "../../features/SEO/seo.js"; // assume this exists
+import { getSeo } from "../../features/SEO/seo.js";
import { getConfigNames } from "../../features/configmasterPage/configmasterPage.js";
+// ✅ Critical imports - Load immediately
+import Navbar from "../Components/Navbar.jsx";
+import OverView from "../Components/OverView.jsx";
+import Loader from "../Components/Loader/PozoLoader.jsx";
+import SEO from "../../Components/SEO/SEO.jsx";
+
+// 🚀 Lazy imports - Code split for better performance
+const Offering = lazy(() => import("../Components/Offering.jsx"));
+const DigitalSection = lazy(() => import("../Components/DigitalSection.jsx"));
+const PozoVideo = lazy(() => import("../Components/PozoVideo.jsx"));
+const TrendingApp = lazy(() => import("../Components/TrendingApp.jsx"));
+const FaqSection = lazy(() => import("../Components/FaqSection.jsx"));
+const Insiders = lazy(() => import("../Components/Insiders.jsx"));
+const Footer = lazy(() => import("../Components/Footer.jsx"));
+
+// 🎯 Conditional lazy imports - Load only when needed
+const IndustriesList = lazy(() => import("../Components/IndustriesList.jsx"));
+const CompanyList = lazy(() => import("../Components/companyList.jsx"));
+const BookDemo = lazy(() => import("../Components/BookDemo.jsx"));
+const ModalSignIn = lazy(() => import("../Components/ModalSignIn.jsx"));
+
// import og from "../../../public/og/home.jpg"
const subDirectory = import.meta.env.BASE_URL;
@@ -66,68 +70,63 @@ const HomePage = () => {
const [seoData, setSeoData] = useState(null);
const [allpagesData, setAllpagesData] = useState([]);
+ // 🚀 Optimized: All independent API calls run in parallel
useEffect(() => {
- const fetchSEOData = async () => {
+ const initializeData = async () => {
try {
- // Get all pages
- const Res = await dispatch(
- getConfigNames({ TypeName: "SEO" })
- ).unwrap();
- if (Res?.data?.statusCode === 1) {
- const pages = Res.data.data;
+ // Run all independent API calls in parallel!
+ const [seoConfigRes, appDataRes, tokenRes] = await Promise.all([
+ // SEO Config
+ dispatch(getConfigNames({ TypeName: "SEO" })).unwrap(),
+ // App Data
+ dispatch(getAllApplicationData()).unwrap(),
+ // Token
+ dispatch(PostToken({ username: "1000000001", password: "1234" })).unwrap()
+ ]);
+
+ // Process SEO data
+ if (seoConfigRes?.data?.statusCode === 1) {
+ const pages = seoConfigRes.data.data;
setAllpagesData(pages);
-
- // Find Home page ID
+
const SeoId = pages.find((e) => e.ConfigName === "home")?.ConfigId;
- if (!SeoId) {
- console.warn("Home page ConfigId not found");
- return;
- }
-
- // Fetch SEO for Home page
- const response = await dispatch(getSeo({ PageId: SeoId })).unwrap();
- if (response?.data?.statusCode === 1) {
- const data = response.data.data.find((e) => e.PageId === SeoId);
- if (data) {
- setSeoData({
- metaTitle: data?.MetaTitle,
- metaDescription: data?.MetaDesc,
- keywords: data?.Keywords,
- imageAltText: data?.ImgAltText,
- });
- }
+ if (SeoId) {
+ // Fetch SEO details (non-blocking)
+ dispatch(getSeo({ PageId: SeoId })).unwrap().then((response) => {
+ if (response?.data?.statusCode === 1) {
+ const data = response.data.data.find((e) => e.PageId === SeoId);
+ if (data) {
+ setSeoData({
+ metaTitle: data?.MetaTitle,
+ metaDescription: data?.MetaDesc,
+ keywords: data?.Keywords,
+ imageAltText: data?.ImgAltText,
+ });
+ }
+ }
+ });
}
}
+
+ // Process App data
+ if (appDataRes?.data?.statusCode === 1) {
+ const activeApps = appDataRes?.data?.data?.filter(
+ (value) => value?.ActiveStatus === "A"
+ );
+ setAppCategory(activeApps);
+ }
+
} catch (error) {
- console.error("Error fetching SEO data:", error);
+ console.error("Error initializing data:", error);
}
};
- fetchSEOData();
- }, [dispatch]);
-
- useEffect(() => {
- getAppData();
+ initializeData();
}, []);
- const getAppData = async () => {
- try {
- const response = await dispatch(getAllApplicationData()).unwrap();
- if (response?.data?.statusCode === 1) {
- let finalsubCategory = response?.data?.data?.filter(
- (value) => value?.ActiveStatus === "A"
- );
- setAppCategory(finalsubCategory);
- }
- } catch (error) {
- console.error("Error fetching app data:", error);
- }
- };
- console.log(AppCategory, "AppCategory");
-
useEffect(() => {
- // Simulate loading delay
- const timer = setTimeout(() => setLoading(false), 100);
+ // Show page immediately - don't wait!
+ const timer = setTimeout(() => setLoading(false), 300);
// Lenis smooth scrolling
const lenisInstance = new Lenis({
@@ -159,55 +158,44 @@ const HomePage = () => {
};
}, []);
- // Separate useEffect for API calls
+ // 🚀 Optimized: Fetch categories in parallel with other data (if needed for navbar)
useEffect(() => {
- const fetchConfigName = async () => {
- setSubCategory([]);
- setAppCategory([]);
- const response = await dispatch(getCategoryData()).unwrap();
- if (response?.data?.statusCode === 1) {
- let finalCategory = response?.data?.data;
- setCategory(finalCategory);
- }
- };
-
- const Tokens = async () => {
- let data = {
- username: "1000000001",
- password: "1234",
- };
+ const fetchCategoryData = async () => {
try {
- await dispatch(PostToken(data)).unwrap();
+ const response = await dispatch(getCategoryData()).unwrap();
+ if (response?.data?.statusCode === 1) {
+ const finalCategory = response?.data?.data;
+ setCategory(finalCategory);
+
+ // Auto-fetch first subcategory (non-blocking)
+ if (finalCategory?.[0]?.CateId) {
+ dispatch(getSubCategoryData(finalCategory[0].CateId)).unwrap()
+ .then((subRes) => {
+ if (subRes?.data?.statusCode === 1) {
+ const activeSubCat = subRes?.data?.data?.filter(
+ (value) => value.ActiveStatus === "A"
+ );
+ setSubCategory(activeSubCat);
+ }
+ })
+ .catch((err) => console.error("Error fetching subcategory:", err));
+ }
+ }
} catch (error) {
- console.error("Error fetching token:", error);
+ console.error("Error fetching categories:", error);
}
};
- const initializeData = async () => {
- await fetchConfigName();
- await Tokens();
- };
- initializeData();
- }, []);
- // Auto-fetch subcategories when categories load
- useEffect(() => {
- const getSubCategory = async (cateId) => {
- // setAppCategory([]);
- const response = await dispatch(getSubCategoryData(cateId)).unwrap();
- if (response?.data?.statusCode === 1) {
- let finalsubCategory = response?.data?.data?.filter(
- (value) => value.ActiveStatus === "A"
- );
- setSubCategory(finalsubCategory);
- }
- };
-
- if (Category?.[0]?.CateId != undefined) {
- getSubCategory(Category?.[0]?.CateId);
+ // Only fetch if needed for navbar/menu
+ if (AppCategory.length > 0) {
+ // Already have app data, skip category fetch
+ } else {
+ fetchCategoryData();
}
- }, [Category]);
+ }, [AppCategory]);
// Auto-fetch apps when subcategories load
+ // Commented out - not needed with getAllApplicationData
// useEffect(() => {
// const getAppData = async (subcatId) => {
// const response = await dispatch(getApplicationData(subcatId)).unwrap();
@@ -224,8 +212,6 @@ const HomePage = () => {
// }
// }, [SubCategory]);
- if (loading) return
;
-
const scrollToTop = () => {
if (lenis) {
lenis.scrollTo(0, { duration: 1.5 });
@@ -235,7 +221,16 @@ const HomePage = () => {
};
const redirectApp = async (AppName, AppId) => {
- navigate(`${subDirectory}${AppName}`);
+ sessionStore("AppId", AppId);
+ sessionStore("AppName", AppName);
+ // Clean URL: Remove special chars, convert spaces to hyphens
+ const cleanUrl = AppName
+ .replace(/[,]/g, '') // Remove commas
+ .replace(/\s+/g, '-') // Spaces to hyphens
+ .replace(/&/g, 'and') // & to 'and'
+ .replace(/[^a-z0-9-]/gi, '') // Remove other special chars
+ .toLowerCase();
+ navigate(`${subDirectory}${cleanUrl}`);
window.location.reload();
};
@@ -329,32 +324,30 @@ const HomePage = () => {
handleModalSignInClose={handleModalSignInClose}
/>
-
-
-
-
- {/* Application DropDown */}
- {/*
*/}
-
-
-
-
+
+
+
+
+
+
+
+
+
+
{
)}
{industry && (
-
+
+
+
)}
{company && (
-
+
+
+
)}
- {demoModal && }
+ {demoModal && (
+
+
+
+ )}
- {modalSignIn && }
+ {modalSignIn && (
+
+
+
+ )}
>
);
diff --git a/src/PozoApp/Pages/Solutions.jsx b/src/PozoApp/Pages/Solutions.jsx
new file mode 100644
index 0000000..ef09d2f
--- /dev/null
+++ b/src/PozoApp/Pages/Solutions.jsx
@@ -0,0 +1,97 @@
+import React from "react";
+import { useNavigate } from "react-router-dom";
+import "./Solutions.scss";
+import Navbar from "../Components/Navbar";
+import Footer from "../Components/Footer";
+
+const subDirectory = import.meta.env.BASE_URL;
+
+const Solutions = () => {
+ const navigate = useNavigate();
+
+ const solutions = [
+ {
+ id: 1,
+ title: "Retail Billing",
+ description: "Fast, intuitive billing system for retail stores with GST compliance",
+ icon: "🛒",
+ path: "retail-billing",
+ },
+ {
+ id: 2,
+ title: "Inventory & Purchase",
+ description: "Smart inventory management with real-time stock tracking",
+ icon: "📦",
+ path: "inventory-purchase",
+ },
+ {
+ id: 3,
+ title: "Weighing Scale POS",
+ description: "Integrated weighing scale with POS for seamless billing",
+ icon: "⚖️",
+ path: "weighing-scale-pos",
+ },
+ {
+ id: 4,
+ title: "Multi-Store ERP",
+ description: "Manage multiple stores from one centralized platform",
+ icon: "🏪",
+ path: "multi-store-erp",
+ },
+ {
+ id: 5,
+ title: "GST Billing & E-Invoice",
+ description: "GST-ready billing with automated e-invoice generation",
+ icon: "📄",
+ path: "gst-billing-e-invoice",
+ },
+ {
+ id: 6,
+ title: "Offline Billing",
+ description: "Continue billing even without internet connectivity",
+ icon: "📴",
+ path: "offline-billing",
+ },
+ ];
+
+ const handleSolutionClick = (path) => {
+ navigate(`${subDirectory}solutions/${path}`);
+ };
+
+ return (
+
+
+
+
+
+
Our Solutions
+
Comprehensive retail management solutions for Indian MSMEs
+
+
+
+
+
+ {solutions.map((solution) => (
+
handleSolutionClick(solution.path)}
+ >
+
{solution.icon}
+
{solution.title}
+
{solution.description}
+
+ Learn More →
+
+
+ ))}
+
+
+
+
+
+ );
+};
+
+export default Solutions;
+
diff --git a/src/PozoApp/Pages/Solutions.scss b/src/PozoApp/Pages/Solutions.scss
new file mode 100644
index 0000000..4e3da7f
--- /dev/null
+++ b/src/PozoApp/Pages/Solutions.scss
@@ -0,0 +1,134 @@
+.solutions-page {
+ min-height: 100vh;
+ background: #000;
+ color: #fff;
+ font-family: "NeueMontreal", sans-serif;
+}
+
+.solutions-hero {
+ padding: 120px 2rem 80px;
+ text-align: center;
+ background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
+
+ @media (max-width: 768px) {
+ padding: 100px 1.5rem 60px;
+ }
+
+ .solutions-hero-content {
+ max-width: 800px;
+ margin: 0 auto;
+
+ h1 {
+ font-size: 56px;
+ font-weight: 700;
+ margin: 0 0 1.5rem 0;
+ background: linear-gradient(135deg, #fff 0%, #999 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+
+ @media (max-width: 768px) {
+ font-size: 36px;
+ }
+ }
+
+ p {
+ font-size: 22px;
+ color: #999;
+ margin: 0;
+ line-height: 1.5;
+
+ @media (max-width: 768px) {
+ font-size: 18px;
+ }
+ }
+ }
+}
+
+.solutions-grid-container {
+ padding: 80px 2rem 120px;
+ max-width: 1400px;
+ margin: 0 auto;
+
+ @media (max-width: 768px) {
+ padding: 60px 1.5rem 80px;
+ }
+}
+
+.solutions-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
+ gap: 2rem;
+
+ @media (max-width: 768px) {
+ grid-template-columns: 1fr;
+ gap: 1.5rem;
+ }
+}
+
+.solution-card {
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(20px);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 16px;
+ padding: 2.5rem;
+ cursor: pointer;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+
+ @media (max-width: 768px) {
+ padding: 2rem;
+ }
+
+ &:hover {
+ background: rgba(255, 255, 255, 0.08);
+ border-color: rgba(255, 255, 255, 0.2);
+ transform: translateY(-5px);
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4);
+ }
+
+ .solution-icon {
+ font-size: 48px;
+ margin-bottom: 1.5rem;
+ }
+
+ h3 {
+ font-size: 24px;
+ font-weight: 600;
+ margin: 0 0 1rem 0;
+ color: #fff;
+
+ @media (max-width: 768px) {
+ font-size: 22px;
+ }
+ }
+
+ p {
+ font-size: 16px;
+ color: #999;
+ line-height: 1.6;
+ margin: 0 0 1.5rem 0;
+
+ @media (max-width: 768px) {
+ font-size: 15px;
+ }
+ }
+
+ .solution-btn {
+ background: transparent;
+ border: 1px solid #fff;
+ color: #fff;
+ padding: 0.75rem 1.5rem;
+ border-radius: 6px;
+ font-size: 15px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s;
+ font-family: inherit;
+
+ &:hover {
+ background: #fff;
+ color: #000;
+ }
+ }
+}
+
diff --git a/src/PozoApp/Styles/Footer.scss b/src/PozoApp/Styles/Footer.scss
index ec3e39e..62e2b4d 100644
--- a/src/PozoApp/Styles/Footer.scss
+++ b/src/PozoApp/Styles/Footer.scss
@@ -1,17 +1,24 @@
.Footer-Master {
width: 100%;
background-color: #010101;
- padding: 1.5rem 4rem 0 1.5rem;
+ // padding: 3rem 4rem 2rem 4rem;
+ padding: 2rem 1rem 1rem 1rem;
display: flex;
- align-items: center;
+ align-items: flex-start;
justify-content: space-between;
- gap: 2rem;
+ gap: 4rem;
font-family: "NeueMontreal";
+ @media (max-width: 1024px) {
+ gap: 3rem;
+ padding: 2.5rem 2rem 2rem 2rem;
+ }
+
@media (max-width: 768px) {
flex-direction: column;
align-items: flex-start;
- padding: 1rem 1rem 1rem 1rem;
+ padding: 2rem 1.5rem 1.5rem 1.5rem;
+ gap: 2.5rem;
}
.footerLeft {
@@ -28,12 +35,13 @@
div {
text-align: left;
- font-size: 16px;
+ font-size: 23px !important;
}
}
.clutter {
- font-size: 16px;
+ font-size: 16px !important;
+
text-align: left;
margin-top: 1rem;
@@ -70,53 +78,307 @@
color: #fff;
display: flex;
align-items: flex-start;
- gap: 16px;
- flex-wrap: wrap;
- @media (max-width: 500px) {
+ gap: 2rem;
+ flex: 1;
+ max-width: 1000px;
+
+ @media (max-width: 768px) {
flex-direction: column;
- margin-bottom: 3rem;
+ gap: 2rem;
+ width: 100%;
}
}
.footerProducts {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: 8px;
- column-gap: 2rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ width: 100%;
+ max-width: 1100px;
- @media (max-width: 768px) {
- grid-template-columns: repeat(2, 1fr);
- }
+ // Top Bar - Everything in one line
+ .products-top-bar {
+ display: flex;
+ align-items: center;
+ gap: 2rem;
+ margin-bottom: 1.5rem;
+ flex-wrap: wrap;
- div {
- font-size: 18px;
- font-family: "NeueMontreal";
- font-weight: 400;
- grid-column: span 3;
-
- @media (max-width: 768px) {
- grid-column: span 2;
+ @media (max-width: 900px) {
+ flex-direction: column;
+ align-items: stretch;
+ gap: 1rem;
}
}
- p {
- font-size: 13.5px;
+ // Main "Products" heading
+ .products-heading {
+ font-size: 18px;
font-family: "NeueMontreal";
- font-weight: 400;
- cursor: pointer;
- transition: all 0.3s ease;
+ font-weight: 500;
+ color: #fff;
+ flex-shrink: 0;
- &:hover {
- color: #418df7;
+ @media (max-width: 900px) {
+ margin-bottom: 0;
+ }
+ }
+
+ // Search Box (in top bar)
+ .products-search-box {
+ position: relative;
+ display: flex;
+ align-items: center;
+ flex: 1;
+ max-width: 350px;
+
+ @media (max-width: 900px) {
+ max-width: 100%;
+ }
+
+ .products-search-icon {
+ position: absolute;
+ left: 16px;
+ font-size: 18px;
+ color: rgba(255, 255, 255, 0.5);
+ pointer-events: none;
+ z-index: 1;
+ }
+
+ .products-search-input {
+ width: 100%;
+ padding: 10px 40px 10px 45px;
+ background: rgba(255, 255, 255, 0.1);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 8px;
+ color: #fff;
+ font-family: "NeueMontreal";
+ font-size: 14px;
+ transition: all 0.3s ease;
+ outline: none;
+
+ &::placeholder {
+ color: rgba(255, 255, 255, 0.5);
+ }
+
+ &:focus {
+ background: rgba(255, 255, 255, 0.15);
+ border-color: #3588fd;
+ box-shadow: 0 0 0 3px rgba(53, 136, 253, 0.1);
+ }
+ }
+
+ .products-search-clear {
+ position: absolute;
+ right: 12px;
+ background: none;
+ border: none;
+ color: #fff;
+ font-size: 18px;
+ cursor: pointer;
+ padding: 4px 8px;
+ transition: all 0.2s ease;
+ opacity: 0.6;
+
+ &:hover {
+ opacity: 1;
+ transform: scale(1.1);
+ }
+ }
+ }
+
+ // Search Results Count
+ .products-search-results-count {
+ font-size: 12px;
+ color: #888;
+ margin-bottom: 1rem;
+ font-family: "NeueMontreal";
+ }
+
+ // Search Results
+ .footer-search-results {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 0.5rem 2rem;
+ margin-top: 1rem;
+
+ @media (max-width: 1024px) {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ @media (max-width: 600px) {
+ grid-template-columns: 1fr;
+ }
+
+ .search-result-item {
+ font-size: 14px;
+ font-family: "NeueMontreal";
+ font-weight: 400;
+ color: #fff;
+ cursor: pointer;
+ transition: all 0.25s ease;
+ padding: 8px 12px;
+ border-radius: 6px;
+ background: rgba(53, 136, 253, 0.05);
+ border: 1px solid rgba(53, 136, 253, 0.1);
+
+ &:hover {
+ color: #3588fd;
+ background: rgba(53, 136, 253, 0.15);
+ border-color: rgba(53, 136, 253, 0.3);
+ transform: translateX(3px);
+ }
+ }
+ }
+
+ // No Results
+ .footer-no-results {
+ text-align: center;
+ padding: 2rem;
+ color: #888;
+ font-family: "NeueMontreal";
+ font-size: 14px;
+
+ p {
+ margin: 0;
+ color: #888 !important;
+ cursor: default !important;
+
+ &:hover {
+ color: #888 !important;
+ transform: none !important;
+ }
+ }
+ }
+
+ // Navigation Controls (in top bar)
+ .footer-navigation {
+ display: flex;
+ align-items: center;
+ gap: 0.8rem;
+ margin-left: auto;
+ flex-shrink: 0;
+
+ @media (max-width: 900px) {
+ margin-left: 0;
+ justify-content: center;
+ }
+
+ .footer-nav-btn {
+ background: rgba(255, 255, 255, 0.1);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ color: #fff;
+ width: 36px;
+ height: 36px;
+ border-radius: 6px;
+ font-size: 20px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: 300;
+
+ &:hover:not(:disabled) {
+ background: rgba(53, 136, 253, 0.2);
+ border-color: #3588fd;
+ transform: scale(1.05);
+ }
+
+ &:disabled {
+ opacity: 0.3;
+ cursor: not-allowed;
+ }
+ }
+
+ .footer-page-indicator {
+ font-size: 12px;
+ color: #888;
+ font-family: "NeueMontreal";
+ min-width: 60px;
+ text-align: center;
+ }
+ }
+
+ // Container for columns
+ .footer-columns-wrapper {
+ display: flex;
+ gap: 4rem;
+ // min-height: 300px;
+
+ @media (max-width: 1024px) {
+ gap: 3rem;
+ }
+
+ @media (max-width: 768px) {
+ flex-direction: column;
+ gap: 2rem;
+ }
+ }
+
+ // Individual columns
+ .footer-column {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 0.2rem;
+ min-width: 0;
+
+ // Category headers (Food & Beverages, Wellness, etc.)
+ .footer-category {
+ font-size: 11px;
+ font-family: "NeueMontreal";
+ font-weight: 500;
+ color: #888;
+ text-transform: uppercase;
+ letter-spacing: 0.8px;
+
+ &:first-child {
+ margin-top: 0;
+ }
+
+ @media (max-width: 600px) {
+ font-size: 10px;
+ }
+ }
+
+ // Product links
+ p {
+ font-size: 13px;
+ font-family: "NeueMontreal";
+ font-weight: 400;
+ color: #fff;
+ cursor: pointer;
+ transition: all 0.25s ease;
+ line-height: 1.9;
+ padding: 0px 0;
+ text-wrap: nowrap;
+
+ &:hover {
+ color: #3588fd;
+ transform: translateX(3px);
+ }
+
+ @media (max-width: 600px) {
+ font-size: 13.5px;
+ line-height: 1.8;
+ }
}
}
}
.footerContact {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ min-width: 100px;
+
div {
font-size: 18px;
font-family: "NeueMontreal";
- font-weight: 400;
+ font-weight: 500;
+ color: #fff;
+ margin-bottom: 0.3rem;
}
a {
@@ -126,10 +388,12 @@
cursor: pointer;
color: #fff;
text-decoration: none;
- transition: all 0.3s ease;
+ transition: all 0.25s ease;
+ line-height: 1.8;
&:hover {
- color: #418df7;
+ color: #3588fd;
+ transform: translateX(3px);
}
}
}
@@ -137,25 +401,31 @@
.footePhone {
display: flex;
flex-direction: column;
- align-items: flex-start;
+ gap: 0.5rem;
+ min-width: 100px;
div {
font-size: 18px;
font-family: "NeueMontreal";
- font-weight: 400;
+ font-weight: 500;
+ color: #fff;
+ margin-bottom: 0.3rem;
}
a {
- font-size: 13px;
+ font-size: 14px;
font-family: "NeueMontreal";
font-weight: 400;
cursor: pointer;
color: #fff;
text-decoration: none;
- transition: all 0.3s ease;
+ transition: all 0.25s ease;
+ line-height: 1.8;
+ letter-spacing: 0.3px;
&:hover {
- color: #418df7;
+ color: #3588fd;
+ transform: translateX(3px);
}
}
}
@@ -163,10 +433,9 @@
.policyDiv {
background-color: #010101;
- padding: 0 1rem 2.5rem 1rem;
+ padding: 0 1rem 0.5rem 1rem;
color: #fff;
- display: flex;
- align-items: flex-end;
+ display: flex;
justify-content: space-between;
@media (max-width: 768px) {
diff --git a/src/PozoApp/Styles/Navbar.scss b/src/PozoApp/Styles/Navbar.scss
index ff45df2..d7bc248 100644
--- a/src/PozoApp/Styles/Navbar.scss
+++ b/src/PozoApp/Styles/Navbar.scss
@@ -135,6 +135,82 @@
}
}
+// Solutions Dropdown
+.solutions-dropdown {
+ position: fixed;
+ top: 4.5rem;
+ left: 12%;
+ background-color: #fff;
+ // padding: 1.5rem 2rem;
+ border-radius: 12px;
+ animation: fadeInIndustry 0.3s ease;
+ box-shadow: rgba(149, 157, 165, 0.2) 0px 8px 24px;
+ z-index: 100;
+ min-width: 280px;
+ max-width: 320px;
+
+ .solutions-list {
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+
+ .solution-item {
+ padding: 0.6rem 1rem;
+ cursor: pointer;
+ transition: color 0.2s ease;
+ color: #000;
+ font-size: 14px;
+ font-weight: 400;
+ letter-spacing: 0.3px;
+ border-bottom: 1px solid #f0f0f0;
+
+ &:last-child {
+ border-bottom: none;
+ }
+
+ &:hover {
+ color: #1473f8;
+ }
+
+ span {
+ display: block;
+ }
+ }
+ }
+}
+
+.solutions-dropdown-mobile {
+ padding: 0.5rem 0 0.5rem 1.5rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ margin: 0.5rem 0;
+ background: rgba(255, 255, 255, 0.03);
+ border-radius: 6px;
+
+ .solution-item-mobile {
+ padding: 0.75rem 1rem;
+ cursor: pointer;
+ transition: color 0.2s;
+ color: #e5e5e5;
+ font-size: 13px;
+ letter-spacing: 0.3px;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
+
+ &:last-child {
+ border-bottom: none;
+ }
+
+ &:hover {
+ color: #1473f8;
+ }
+
+ &:active {
+ color: #1473f8;
+ }
+ }
+}
+
.IndustriesTypes {
display: flex;
align-items: flex-start;
@@ -679,6 +755,67 @@
}
}
+// Mobile Sticky Footer for Book Demo & WhatsApp
+.mobile-sticky-footer {
+ display: none;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
+ backdrop-filter: blur(20px);
+ box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.12);
+ padding: 1rem 1.25rem;
+ gap: 1rem;
+ z-index: 999;
+ border-top: 1px solid rgba(0, 0, 0, 0.08);
+
+ @media (max-width: 768px) {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ .mobile-sticky-btn {
+ flex: 1;
+ padding: 1rem 1.75rem;
+ background: linear-gradient(135deg, #000 0%, #1a1a1a 100%);
+ color: #fff;
+ border-radius: 12px;
+ font-size: 15px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-family: "NeueMontreal", sans-serif;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+ letter-spacing: 0.3px;
+
+ &:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);
+ }
+
+ &:active {
+ transform: scale(0.98);
+ }
+
+ &.whatsapp-btn {
+ background: linear-gradient(135deg, #25D366 0%, #1ea952 100%);
+ flex: 0;
+ min-width: 60px;
+ padding: 1rem;
+ box-shadow: 0 4px 12px rgba(37, 211, 102, 0.3);
+
+ &:hover {
+ box-shadow: 0 6px 16px rgba(37, 211, 102, 0.4);
+ }
+ }
+ }
+}
+
@keyframes fadeInMenu {
from {
opacity: 0;
diff --git a/src/PozoApp/Styles/Offering.scss b/src/PozoApp/Styles/Offering.scss
index 5e84645..1bcd315 100644
--- a/src/PozoApp/Styles/Offering.scss
+++ b/src/PozoApp/Styles/Offering.scss
@@ -141,11 +141,12 @@
@media (max-width: 768px) {
.slide {
width: 300px;
- height: 60vh;
+ height: 50vh;
}
.slide-track {
- width: calc(200% + 1rem);
+ width: calc(1000% + 1rem);
+ animation: scroll 12s linear infinite;
}
}
}
diff --git a/src/PozoApp/Styles/OverView.scss b/src/PozoApp/Styles/OverView.scss
index eef03e2..cad3259 100644
--- a/src/PozoApp/Styles/OverView.scss
+++ b/src/PozoApp/Styles/OverView.scss
@@ -1,6 +1,7 @@
.OverView-Master {
width: 100vw;
- height: 115vh;
+ min-height: 100vh;
+ height: auto;
background: #000;
display: flex;
flex-direction: column;
@@ -42,8 +43,9 @@
// Slogan - Hero Title
.overviewSlogan {
- font-size: 5vw;
+ font-size: 4.5vw;
font-weight: 500;
+ width:80vw;
line-height: 1.2;
margin: 6.5rem 1.5rem 0 1.5rem;
position: relative;
@@ -83,9 +85,10 @@
display: flex;
flex-direction: row;
justify-content: space-between;
- align-items: flex-end;
+ align-items: flex-start;
margin: 0 1.5rem;
margin-top: 5.5rem;
+ margin-bottom: 3rem;
position: relative;
z-index: 2;
gap: 3rem;
@@ -125,11 +128,12 @@
display: flex;
flex-direction: column;
gap: 1.2rem;
- justify-content: flex-end;
+ justify-content: flex-start;
flex: 1;
+ min-height: fit-content;
@media (max-width: 600px) {
gap: 1rem;
- padding:16px 0;
+ padding: 16px 0;
}
}
@@ -267,7 +271,7 @@
-webkit-backdrop-filter: blur(30px);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.18);
- padding: 2rem;
+ padding: 1.75rem;
max-width: 500px;
margin-right: 5rem;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
@@ -318,10 +322,10 @@
}
p {
- font-size: 24px;
+ font-size: 22px;
font-family: "NeueMontreal";
- line-height: 1.4;
- margin: 0 0 1.5rem 0;
+ line-height: 1.35;
+ margin: 0 0 1.25rem 0;
color: #fff;
font-weight: 400;
diff --git a/src/PozoApp/Videos/OverView.webm b/src/PozoApp/Videos/OverView.webm
index bc7a782..12ba893 100644
Binary files a/src/PozoApp/Videos/OverView.webm and b/src/PozoApp/Videos/OverView.webm differ
diff --git a/src/PozoApp/Videos/OverView0.webm b/src/PozoApp/Videos/OverView0.webm
new file mode 100644
index 0000000..bc7a782
Binary files /dev/null and b/src/PozoApp/Videos/OverView0.webm differ
diff --git a/src/PozoApp/Videos/OverView1.webm b/src/PozoApp/Videos/OverView1.webm
new file mode 100644
index 0000000..2983be4
Binary files /dev/null and b/src/PozoApp/Videos/OverView1.webm differ
diff --git a/src/check.jsx b/src/check.jsx
index 5f927c5..716c6a7 100644
--- a/src/check.jsx
+++ b/src/check.jsx
@@ -1,599 +1,464 @@
-import { useEffect, useState, useRef } from 'react';
-import './MembershipCard.scss';
-import { useDispatch } from 'react-redux';
-import { useSelector } from 'react-redux';
-import { StoredSessionData } from '../../../../Features/ThemeChange/ThemeChange';
-import { getBranchDetail, getCompBranchData } from '../../../../Features/BrachLogin/BranchLogin';
-import { Button, Input, Modal, message } from 'antd';
-import { PrinterOutlined, ShareAltOutlined } from '@ant-design/icons';
-import html2canvas from 'html2canvas';
-import { FcSportsMode } from "react-icons/fc";
-import defaultuser from "../../../../Images/dashboard/user.jpg";
-import { printDiv } from '../../../../Services/Others';
+import { useState, useEffect, useRef, useCallback } from 'react';
+import { useDispatch, useSelector } from 'react-redux'
+import { useLocation, useNavigate } from 'react-router-dom';
+import { Form, Tooltip, Switch } from "antd";
+import { ArrowRightOutlined, InfoCircleOutlined } from "@ant-design/icons";
+import { InputField } from "../../Components/Forms/InputField.jsx";
+import { TextAreaInput } from "../../Components/Forms/TextArea.jsx";
+import Buttons from "../../Components/Forms/Buttons.jsx";
+import { Messages } from "../../Components/Notifications/Messages";
+import Imageupload from "../../Components/Forms/Upload.jsx";
+import { DropDowns } from '../../Components/Forms/DropDown.jsx';
+import FormHeader from '../pageComponents/FormHeader.jsx';
+import { DefaultModal } from '../../Components/Modal/DefaultModal.jsx';
+import { changeBreadCrumb } from '../../features/appPage/centerPage.js';
+import { onlineimages, uploadImage } from '../../features/applications/bannerImage.js'
+import {
+ getCategoryData,
+ getSubCategoryData,
+ categoryActiveDataSelector,
+ subCategoryActiveDataSelector,
+ postApplicationData,
+ putApplicationData
+} from "../../features/applicationPage/applicationPage.js";
+import { getSession, validateSafeInput } from "../../Services/others";
+
+const subDirectory = import.meta.env.ENV_BASE_URL
+const homepageurl = import.meta.env.ENV_MAIN_REDIRECT_URL;
+
+const ApplicationForm = ({ formType }) => {
+
+ const navigate = useNavigate();
+ const dispatch = useDispatch();
+ const location = useLocation();
+ const formRef = useRef(null);
+ const state = location?.state
+ const editstate = state?.editstate
+ const categoryData = useSelector(categoryActiveDataSelector)
+ const subCategoryData = useSelector(subCategoryActiveDataSelector)
+ const [messageType, setMessageType] = useState(null);
+ const [messageData, setMessageData] = useState(null);
+ const [SelectedCategory, setSelectedCategory] = useState(null);
+ const [SelectedSubCategory, setSelectedSubCategory] = useState(null);
+ const [imageUrl, setImageUrl] = useState('');
+ const [onlineLogo, setOnlineLogo] = useState(false);
+ const [imagedata, setimagedata] = useState();
+ const [selectedImage, setSelectedImage] = useState();
+ const [onlinelogoImage, setOnlinelogoImage] = useState();
+
+
+ const items = [
+ {
+ name: "Home",
+ link: `${subDirectory}landing-page/home`,
+ },
+
+ {
+ name: "Application",
+ link: `${subDirectory}setting/application-master/`,
+ },
+ {
+ name: editstate ? "Edit" : "New",
+ link: null
+ },
+
+ ];
-function safeNumber(v) {
- const n = Number(v);
- return Number.isFinite(n) ? n : 0;
-}
-
-function getCurrentMembership(memberships) {
- if (!memberships?.length) return null;
-
- const sorted = [...memberships].sort(
- (a, b) => new Date(a.CreatedDate) - new Date(b.CreatedDate)
- );
-
- const active = sorted.find(
- (m) => m.RemainingDays > 0 || m.RemainingSessionHrs > 0
- );
- if (active) return active;
-
- const now = new Date();
- const next = sorted.find((m) => new Date(m.CreatedDate) > now);
- return next || null;
-}
-
-function formatAadhaar(aadhaar) {
- if (!aadhaar) return '';
- const str = String(aadhaar);
- if (str.length <= 4) return str;
- const lastFour = str.slice(-4);
- const masked = 'X'.repeat(str.length - 4);
- return `${masked}${lastFour}`;
-}
-
-function formatDate(dateStr) {
- if (!dateStr) return '';
- const date = new Date(dateStr);
- const day = String(date.getDate()).padStart(2, '0');
- const month = date.toLocaleString('en-US', { month: 'short' });
- const year = date.getFullYear();
- return `${day} ${month} ${year}`;
-}
-
-const MembershipCard = ({ MembershipDetail = [], selectedCustomer = {}, showCard = false }) => {
- const dispatch = useDispatch();
- const SessionData = useSelector(StoredSessionData);
- const AppId = SessionData?.AppId;
- const CompId = SessionData?.CompId;
- const BranchId = SessionData?.BranchId;
- const UserId = SessionData?.UserId;
- console.log(selectedCustomer, "selectedCustomer")
- const [activeMembership, setActiveMembership] = useState(null);
- const [branchName, setBranchName] = useState('Guest');
- const [branchLogo, setBranchLogo] = useState(null);
- const [emailModalVisible, setEmailModalVisible] = useState(false);
- const [emailInput, setEmailInput] = useState('');
- const [base64Image, setBase64Image] = useState(null);
- const [base64CustImage, setBase64CustImage] = useState(null);
-
- const cardRef = useRef(null);
-
- const duration = safeNumber(activeMembership?.PlanDuration);
- const remaining = safeNumber(activeMembership?.RemainingDays);
- const usedDays = Math.max(0, duration - remaining);
- const daysPct = duration > 0 ? Math.round((usedDays / duration) * 100) : 0;
-
- const freeHrs = safeNumber(activeMembership?.FreeSessionHrs);
- const remainingHrs = safeNumber(activeMembership?.RemainingSessionHrs);
- const usedHrs = Math.max(0, freeHrs - remainingHrs);
- const hrsPct = freeHrs > 0 ? Math.round((usedHrs / freeHrs) * 100) : 0;
-
- const discountLabel = `${activeMembership?.Discount}${activeMembership?.DiscountType === 'P' ? '%' : ''}`;
-
- useEffect(() => {
- if (MembershipDetail?.length === 0) return;
- const currentActiveMembership = getCurrentMembership(MembershipDetail);
- if (currentActiveMembership) {
- setActiveMembership(currentActiveMembership);
- } else {
- setActiveMembership(null);
- }
- fetchBranchDtls();
- }, [MembershipDetail]);
-
- const fetchBranchDtls = async () => {
- const response = await dispatch(
- getBranchDetail({ BrId: BranchId })
- ).unwrap();
- if (response?.data?.statusCode === 1) {
- setBranchName(
- response?.data?.data?.filter((item) => item?.BrId == BranchId)?.[0]?.BrName || 'Guest'
- );
- setBranchLogo(
- response?.data?.data?.filter((item) => item?.BrId == BranchId)?.[0]?.CompLogo || 'Guest'
- );
- }
- };
-
- useEffect(() => {
- async function fetchImage() {
- try {
- const base64 = await imageUrlToBase64(branchLogo);
- setBase64Image(base64);
- } catch (error) {
- console.log('Error converting image', error.message);
- }
- }
- if (branchLogo) {
- fetchImage();
- }
- }, [branchLogo]);
-
- useEffect(() => {
- async function fetchCustomerImage() {
- try {
- const base64 = await imageUrlToBase64(selectedCustomer?.CustomerProfile);
- setBase64CustImage(base64);
- } catch (error) {
- console.log('Error converting image', error.message);
- }
- }
- if (selectedCustomer?.CustomerProfile) {
- fetchCustomerImage();
- }
- }, [selectedCustomer?.CustomerProfile])
-
- const imageUrlToBase64 = async (url) => {
- try {
- const response = await fetch(url);
- const blob = await response.blob();
- return new Promise((resolve, reject) => {
- const reader = new FileReader();
- reader.onloadend = () => resolve(reader.result);
- reader.onerror = reject;
- reader.readAsDataURL(blob);
- });
- } catch (error) {
- console.error('Error fetching or converting image:', error);
- throw error;
- }
- };
-
- const handlePrint = async () => {
- if (!cardRef.current) return;
- const style = `
-
-`;
- const printStyles = document.createElement('style');
- printStyles.innerHTML = `
- @page { size: A4; margin: 0.5in; }
- @media print {
- * { -webkit-print-color-adjust: exact !important; }
- body * { visibility: hidden; }
- #physicalMembershipCard, #physicalMembershipCard * { visibility: visible; }
- #physicalMembershipCard {
- position: absolute !important;
- left: 0 !important;
- top: 0 !important;
- width: 340px !important;
- height: 225px !important;
- background: linear-gradient(to top, #1e3c72 0%, #2a5298 100%) !important;
- border-radius: 16px !important;
- padding: 20px !important;
- color: white !important;
- font-family: Arial, sans-serif !important;
- box-shadow: none !important;
- }
- .cardHeader { display: flex !important; justify-content: space-between !important; }
- .cardLogo { display: flex !important; align-items: center !important; gap: 8px !important; }
- .logoIcon { background: white !important; border-radius: 50% !important; padding: 5px !important; }
- .brandName { font-size: 14px !important; font-weight: 700 !important; }
- .priorityBadge { background: #ff9800 !important; padding: 4px 12px !important; border-radius: 12px !important; }
- .membership-name { position: absolute !important; right: 20px !important; top: 42px !important; background: #019b01 !important; padding: 4px 12px !important; border-radius: 12px !important; }
- .cardMemberName { font-size: 20px !important; font-weight: 700 !important; }
- .cardDates { display: flex !important; gap: 24px !important; }
- .cardFooter { position: absolute !important; bottom: 22% !important; right: 24px !important; }
+ useEffect(() => {
+ dispatch(changeBreadCrumb({ items: items }));
+ dispatch(getCategoryData()).unwrap()
+ dispatch(getSubCategoryData()).unwrap()
+ OnlineImageCall();
+ if (editstate) {
+ setImageUrl(editstate?.AppLogo)
+ formRef.current?.setFieldsValue({ CateId: editstate.CateId, SubCateId: editstate.SubCateId })
+ setSelectedCategory(editstate.CateId)
+ setSelectedSubCategory(editstate.SubCateId)
}
- `;
-
- document.head.appendChild(printStyles);
- window.print();
- document.head.removeChild(printStyles);
- };
- const handleShare = () => {
- if (selectedCustomer?.CustEmail) {
- shareCard(selectedCustomer.CustEmail);
- } else {
- setEmailModalVisible(true);
+ }, []);
+ const OnlineImageCall = async () => {
+ let Appname = formRef?.current?.getFieldsValue().AppName;
+ if (Appname !== null && Appname !== undefined) {
+ let response = await dispatch(onlineimages(formRef?.current?.getFieldsValue().AppName)).unwrap();
+ setimagedata(response?.data?.data);
+ }
}
- };
- const shareCard = async (email) => {
- try {
- // Your API call here
- // await dispatch(shareCardAction({ email, cardData: ... })).unwrap();
- message.success(`Card shared successfully to ${email}`);
- setEmailModalVisible(false);
- setEmailInput('');
- } catch (error) {
- message.error('Failed to share card');
+
+ const onFinish = async (values) => {
+ let postData = {};
+ postData["AppDescription"] = values.AppDescription;
+ postData["AppId"] = values.AppId;
+ postData["AppURLType"] = SelectedCategory == categoryData?.filter(item => item?.ConfigName == "Retail")[0]?.ConfigId ? 'I' : 'E';;
+ postData["AppLogo"] = imageUrl;
+ postData["AppName"] = values.AppName;
+ postData["AppURL"] = SelectedCategory == categoryData?.filter(item => item?.ConfigName == "Retail")[0]?.ConfigId ? URLToggle ? homepageurl : values.AppURL : values.AppURL;
+ postData["CateId"] = values.CateId;
+ postData["CreatedBy"] = getSession('UserId')
+ postData["SubCateId"] = values.SubCateId;
+ postData["UpdatedBy"] = values.UpdatedBy;
+ let response = {}
+ if (formType === "add") {
+ try {
+ response = await dispatch(postApplicationData(postData)).unwrap()
+ }
+ catch (err) {
+ console.log(err, "err");
+ if (err["message"] == "Request failed with status code 422") {
+ response = {
+ data: {
+ "statusCode": 0,
+ "response": "Please Give Required Fields",
+ 'data': []
+ }
+ }
+ }
+ }
+
+ }
+ else if (formType === "edit") {
+
+ postData["AppId"] = editstate?.AppId
+ postData["UpdatedBy"] = getSession('UserId')
+ try {
+ response = await dispatch(putApplicationData(postData)).unwrap()
+ } catch (err) {
+ console.log(err, "err");
+ if (err["message"] == "Request failed with status code 422") {
+ response = {
+ data: {
+ "statusCode": 0,
+ "response": "Please Give Required Fields",
+ 'data': []
+ }
+ }
+ }
+ }
+ }
+ if (response?.data?.statusCode == 1) {
+ navigate(`${subDirectory}setting/application-master/`, {
+ state: {
+ Notiffy: {
+ messageType: "success",
+ messageData: response?.data?.response,
+
+ }
+ }
+ })
+ } else {
+ setMessageType("error")
+ setMessageData(response?.data?.response)
+ }
+ };
+
+
+ const onComplete = useCallback(() => {
+ setMessageData(null);
+ setMessageType(null);
+
+
+ }, [])
+
+ const selectCategory = async (e) => {
+ formRef.current?.setFieldsValue({ CateId: e })
+ await setSelectedCategory(e)
+
}
- };
-
- const handleEmailSubmit = () => {
- if (!emailInput || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailInput)) {
- message.error('Please enter a valid email address');
- return;
+ const selectSubCategory = async (e) => {
+ formRef.current?.setFieldsValue({ SubCateId: e })
+ await setSelectedSubCategory(e)
}
- shareCard(emailInput);
- };
- if (!showCard) {
- // Original membership details view
+
+
+ const addLogo = () => {
+ let Appname = formRef?.current?.getFieldsValue().AppName
+ if (Appname !== null && Appname !== undefined) {
+ OnlineImageCall()
+ setOnlineLogo(true)
+ }
+ else {
+ setMessageType("error")
+ setMessageData("Eneter Application Name")
+ }
+ }
+
+
+ const Logosubmit = async () => {
+ let response = await fetch(selectedImage.image);
+
+ let data = await response.blob();
+ let metadata = {
+ type: "image/jpeg",
+ };
+
+ let file = new File([data], "image.jpg", metadata);
+ let uploadImgData = await dispatch(uploadImage(file)).unwrap()
+ if (uploadImgData?.data?.status) {
+ setOnlinelogoImage(uploadImgData?.data?.image)
+ setImageUrl(uploadImgData?.data?.image)
+ }
+ setOnlineLogo(false);
+ }
+
+ const [URLToggle, setURLTogglel] = useState(false);
+ const onChange = (checked) => {
+ console.log(`switch to ${checked}`);
+ setURLTogglel(checked);
+ };
+
+ formType == "edit" && editstate?.AppUrlType !== 'I' ? formRef?.current?.setFieldsValue({ AppURL: editstate?.AppUrl }) : '';
return (
-
-
-
{activeMembership?.MemberName || '-'}
-
{activeMembership?.Remarks || ''}
-
+
+
+
+
+
+
+
+
-
{remaining}d left
-
-
-
-
Free Hrs
-
{freeHrs} hrs
-
-
-
-
Sessions left
-
-
{remainingHrs}h
-
-
-
-
-
Discount
-
{discountLabel}
-
-
-
Priority
-
{activeMembership?.Priority === 'Y' ? 'Yes' : 'No'}
-
-
-
-
- {activeMembership?.Priority === 'Y' && (
-
-
- {activeMembership?.Prioritydays || '-'}
-
-
- )}
-
- );
- }
-
- // Card view
- return (
-
-
-
-
-
- {base64Image ?
:
}
-
-
{branchName}
-
- {activeMembership?.Priority === 'Y' && (
-
- PRIORITY
-
- )}
-
- {activeMembership?.MemberName}
-
-
-
-
{selectedCustomer?.CustName || 'Member'}
-
ID: {selectedCustomer?.CustId || '-'}
-
-
-
-
VALID FROM
-
{formatDate(activeMembership?.PlanStartDate)}
-
-
-
VALID UNTIL
-
{formatDate(activeMembership?.PlanEndDate)}
-
-
-
-
-
- MOBILE
- {selectedCustomer?.value || '-'}
-
- {selectedCustomer?.AadhaarNo &&
- AADHAAR
- {formatAadhaar(selectedCustomer?.AadhaarNo)}
-
}
-
-
-
- {/*
-
- {[...Array(16)].map((_, i) => (
-
+
+
+ {imagedata?.map((item, index) => (
+
setSelectedImage(item)}
+ >
+
+
))}
- */}
-
- {base64CustImage ?
:
-
- }
-
+
+ }
+ handleSubmit={Logosubmit}
+ handleCancel={() => { setOnlineLogo(false) }}
+ >
-
+ );
+}
-
- }
- onClick={handlePrint}
- type="default"
- >
- Print
-
- }
- onClick={handleShare}
- type="primary"
- >
- Share
-
-
-
-
{
- setEmailModalVisible(false);
- setEmailInput('');
- }}
- okText="Share"
- >
- setEmailInput(e.target.value)}
- onPressEnter={handleEmailSubmit}
- />
-
-
- );
-};
-
-export default MembershipCard;
\ No newline at end of file
+export default ApplicationForm;
\ No newline at end of file
diff --git a/src/check.scss b/src/check.scss
index 3f7440e..0e34724 100644
--- a/src/check.scss
+++ b/src/check.scss
@@ -15,6 +15,7 @@
align-items: center;
gap: 16px;
position: relative;
+
@media (max-width: 768px) {
display: none;
}
@@ -28,6 +29,7 @@
gap: 3px;
cursor: pointer;
}
+
svg {
margin-top: 4px;
display: flex;
@@ -108,6 +110,7 @@
transform: translate(0, 0);
}
}
+
sup {
font-size: 10px;
background-color: #e68200;
@@ -124,6 +127,7 @@
cursor: pointer;
letter-spacing: 0.2px;
-webkit-text-stroke: 0.2px;
+
@media (max-width: 768px) {
z-index: 50;
position: relative;
@@ -136,7 +140,7 @@
align-items: flex-start;
justify-content: space-between;
width: 80%;
- margin-bottom: 4rem;
+ margin-bottom: 0;
gap: 1rem;
position: fixed;
top: 4rem;
@@ -146,8 +150,12 @@
border-radius: 12px;
animation: fadeInIndustry 0.5s ease;
height: 85vh;
+ max-height: calc(100vh - 5rem);
box-shadow: rgba(149, 157, 165, 0.2) 0px 8px 24px;
z-index: 100;
+ overflow: hidden;
+ isolation: isolate;
+ touch-action: none;
&.closing {
animation: fadeOutIndustry 0.4s ease;
@@ -158,17 +166,41 @@
display: none;
}
}
+
.IndustriesOne,
.IndustriesTwo,
.IndustriesThree {
width: 30%;
font-family: "NeueMontreal";
height: 100%;
+ max-height: calc(85vh - 4rem);
border-right: 2px dashed #9e9e9e;
- height: 80vh;
- overflow: auto;
+ overflow-y: auto;
+ overflow-x: hidden;
scrollbar-width: thin;
- padding-bottom: 4rem;
+ padding-bottom: 2rem;
+ padding-right: 1rem;
+ overscroll-behavior: contain;
+ touch-action: pan-y;
+
+ // Custom scrollbar styling
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-track {
+ background: #f1f1f1;
+ border-radius: 10px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #888;
+ border-radius: 10px;
+
+ &:hover {
+ background: #555;
+ }
+ }
@media (max-width: 768px) {
width: 100%;
@@ -203,6 +235,7 @@
&:hover {
color: #3588fd;
}
+
span {
color: #ffffff;
background-color: rgba(255, 115, 0, 0.966);
@@ -223,6 +256,7 @@
z-index: 100;
position: relative;
display: none;
+
@media (max-width: 768px) {
display: flex;
}
@@ -247,10 +281,12 @@
&.closing {
animation: fadeOutMenu 0.4s ease;
}
+
@media (max-width: 1300px) {
top: 8%;
}
}
+
.ResNavHeader {
width: 100%;
display: flex;
@@ -258,12 +294,14 @@
align-items: center;
justify-content: space-between;
}
+
.ResNavHeaderClose {
display: flex;
align-items: center;
font-family: "NeueMontreal";
gap: 4px;
cursor: pointer;
+
div {
display: flex;
align-items: center;
@@ -271,6 +309,7 @@
font-size: 14px;
}
}
+
.ResnavbarOption {
width: 100%;
font-family: "NeueMontreal";
@@ -279,6 +318,7 @@
display: flex;
flex-direction: column;
gap: 1rem;
+
.indusOpen {
font-size: 16px;
display: flex;
@@ -289,7 +329,38 @@
border-bottom: 2px dashed #868686;
padding-bottom: 10px;
}
+
+ @media (max-width: 768px) {
+ .IndustriesTypes {
+ position: relative;
+ top: unset;
+ left: unset;
+ width: 100%;
+ background-color: #383838;
+ color: #fff;
+ overflow: auto;
+ isolation: unset;
+ touch-action: unset;
+ height: 70vh;
+ box-shadow: unset !important;
+ }
+
+ .IndustriesOne,
+ .IndustriesTwo,
+ .IndustriesThree {
+ border-right: none;
+ height: max-content;
+ max-height: 40vh;
+ margin-bottom: 2rem;
+
+ >div,
+ >p {
+ color: #fff;
+ }
+ }
+ }
}
+
.industryRes {
background-color: #383838;
color: #fff;
@@ -312,12 +383,14 @@
font-size: 16px;
margin: 10px 0;
}
+
p {
font-family: "NeueMontreal";
font-size: 14px;
margin-bottom: 4px;
color: #cecece;
cursor: pointer;
+
&:hover {
color: #3588fd;
}
@@ -331,6 +404,7 @@
margin-bottom: 4px;
cursor: pointer;
transition: all 0.2s;
+
&:hover {
color: #3588fd;
}
@@ -345,6 +419,7 @@
font-family: "NeueMontreal";
margin-top: 3rem;
width: 100%;
+
sup {
font-size: 10px;
background-color: #e68200;
@@ -421,12 +496,14 @@
}
}
}
+
@keyframes fadeInMenu {
from {
opacity: 0;
// transform: translateY(-50px);
height: 0vh;
}
+
to {
opacity: 1;
// transform: translateY(0);
@@ -440,18 +517,21 @@
// transform: translateY(0);
height: 100vh;
}
+
to {
opacity: 0;
// transform: translateY(-50px);
height: 0vh;
}
}
+
@keyframes fadeInIndustry {
from {
opacity: 0;
transform: translateY(-10px);
height: 0vh;
}
+
to {
opacity: 1;
transform: translateY(0);
@@ -465,18 +545,21 @@
height: 80vh;
transform: translateY(0);
}
+
to {
opacity: 0;
height: 0vh;
transform: translateY(-10px);
}
}
+
@keyframes fadeInCompany {
from {
opacity: 0;
transform: translateY(-10px);
height: 0px;
}
+
to {
opacity: 1;
transform: translateY(0);
@@ -490,6 +573,7 @@
height: 250px;
transform: translateY(0);
}
+
to {
opacity: 0;
height: 0px;
@@ -502,6 +586,7 @@
opacity: 0;
transform: translateY(-10px);
}
+
to {
opacity: 1;
transform: translateY(0);
@@ -513,6 +598,7 @@
opacity: 1;
transform: translateY(0);
}
+
to {
opacity: 0;
transform: translateY(-10px);
@@ -524,6 +610,7 @@
opacity: 0;
transform: translateY(-10px);
}
+
to {
opacity: 1;
transform: translateY(0);
@@ -535,6 +622,7 @@
opacity: 1;
transform: translateY(0);
}
+
to {
opacity: 0;
transform: translateY(-10px);
@@ -546,6 +634,7 @@
opacity: 0;
transform: translateX(100%);
}
+
to {
opacity: 1;
transform: translateX(0);
@@ -557,6 +646,7 @@
opacity: 1;
transform: translateX(0);
}
+
to {
opacity: 0;
transform: translateX(100%);
@@ -588,6 +678,7 @@
cursor: pointer;
letter-spacing: 0.2px;
transition: all 0.3s ease;
+
&:hover {
color: #3588fd;
}
@@ -598,4 +689,4 @@
.IndustriesTypes {
display: block;
}
-}
+}
\ No newline at end of file
diff --git a/src/routesConfig.jsx b/src/routesConfig.jsx
index ae08810..eca5b19 100644
--- a/src/routesConfig.jsx
+++ b/src/routesConfig.jsx
@@ -93,11 +93,14 @@ import SignIn from "./PozoApp/Components/SignIn.jsx";
import LiveSession from "./PozoApp/Components/LiveSession.jsx";
import ContactUs from "./PozoApp/Components/ContactUs.jsx";
import PricingPozoApp from "./PozoApp/Components/PricingPozoApp.jsx";
+import Solutions from "./PozoApp/Pages/Solutions.jsx";
+import CaseStudies from "./PozoApp/Pages/CaseStudies.jsx";
import GatewayMasterConfiguration from "./Pages/GatewayMasterConfiguration/GatewayMasterConfiguration.jsx";
import GatewayMasterConfigurationList from "./Pages/GatewayMasterConfiguration/GatewayMasterConfigurationList.jsx";
import AdminPanelWrapper from "./AdminPanel/AdminPanelWrapper.jsx";
import Blog from "./AdminPanel/Blog/Blog.jsx";
import BlogDetail from "./AdminPanel/Blog/BlogDetail.jsx";
+import LandingPageCMS from "./LandingPageCMS/LandingPageCMS.jsx";
import PostEditorPage from "./Pages/PostEditorPage.jsx";
import PrivacyPolicy from "./PozoApp/Company/PrivacyPolicy.jsx";
import CookiePolicy from "./PozoApp/Company/CookiePolicy.jsx";
@@ -117,6 +120,12 @@ export const routesConfig = [
access: "Marketing",
empAccess: "Admin Panel",
},
+ {
+ path: `${subDirectory}landing-cms`,
+ component: LandingPageCMS,
+ access: "Marketing",
+ empAccess: "Admin Panel",
+ },
{ path: `${subDirectory}:appName`, component: Template, access: "Public" },
{ path: `${subDirectory}feature1`, component: Feature1 },
{ path: `${subDirectory}pdf`, component: PdfPage, access: "Admin" },
@@ -168,7 +177,7 @@ export const routesConfig = [
{ path: `${subDirectory}homepage`, component: PublicHome, access: "Public" },
// { path: `${subDirectory}signinnew`, component: SignIn, access: "Public" },
{
- path: `${subDirectory}pricing-pozoapp`,
+ path: `${subDirectory}pricing`,
component: PricingPozoApp,
access: "Public",
},
@@ -178,6 +187,8 @@ export const routesConfig = [
access: "Public",
},
{ path: `${subDirectory}contact-us`, component: ContactUs, access: "Public" },
+ { path: `${subDirectory}solutions`, component: Solutions, access: "Public" },
+ { path: `${subDirectory}case-studies`, component: CaseStudies, access: "Public" },
{ path: `${subDirectory}blog`, component: Blog, access: "Public" },
// {
// path: `${subDirectory}blog/blog-details/:id`,
diff --git a/vite.config.js b/vite.config.js
index 291da17..4561d6d 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -65,13 +65,14 @@ export default defineConfig(({ command, mode, ssrBuild }) => {
// },
// }),
],
- base: "/home/",
+ base: "/", // Changed from "/home/" to "/" for clean SEO URLs
envDir: "src",
envPrefix: "ENV_",
};
} else {
return {
plugins: [react()],
+ base: "/", // Changed from default to "/" for consistency
envDir: "src",
envPrefix: "ENV_",