commit 67dcc2cd73f31749f7d4bf887fe2034a62378731 Author: SridharRajamani <123048029+SridharRajamani@users.noreply.github.com> Date: Wed Nov 5 17:52:07 2025 +0530 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/index.html b/index.html new file mode 100644 index 0000000..c80f94f --- /dev/null +++ b/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + PozoApp - Complete Business Management Solution | POS & Inventory + + + + + +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..b03db30 --- /dev/null +++ b/package.json @@ -0,0 +1,96 @@ +{ + "name": "pozo", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "postbuild": "echo 'Skipping react-snap'", + "lint": "eslint src --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "reactSnap": { + "source": "dist", + "inlineCss": false, + "puppeteerArgs": [ + "--no-sandbox" + ], + "skipThirdPartyRequests": true, + "routes": [ + "/", + "/signin", + "/signup", + "/dashboard", + "/features", + "/pricing", + "/contact-us", + "/blog" + ] + }, + "dependencies": { + "@editorjs/code": "^2.9.3", + "@editorjs/editorjs": "^2.31.0", + "@editorjs/embed": "^2.7.6", + "@editorjs/header": "^2.8.8", + "@editorjs/image": "^2.10.3", + "@editorjs/link": "^2.6.2", + "@editorjs/list": "^2.0.8", + "@editorjs/paragraph": "^2.11.7", + "@editorjs/quote": "^2.7.6", + "@reduxjs/toolkit": "^1.9.5", + "@studio-freight/lenis": "^1.0.42", + "@weekwood/editorjs-video": "^1.0.2", + "antd": "^5.4.4", + "aos": "^2.3.4", + "axios": "^1.4.0", + "bowser": "^2.11.0", + "classnames": "^2.3.2", + "crypto-js": "^4.1.1", + "devtools-detect": "^4.0.2", + "exceljs": "^4.3.0", + "framer-motion": "^12.17.0", + "google-maps-react": "^2.0.6", + "gsap": "^3.13.0", + "html2canvas": "^1.4.1", + "html2pdf.js": "^0.10.3", + "informed": "^4.44.1", + "jquery": "^3.7.1", + "jspdf": "^2.5.1", + "moment": "^2.29.4", + "qrcode.react": "^4.2.0", + "react": "^18.2.0", + "react-color": "^2.19.3", + "react-device-detect": "^2.2.3", + "react-dom": "^18.2.0", + "react-excel-renderer": "^1.1.0", + "react-helmet-async": "^2.0.5", + "react-icons": "^4.8.0", + "react-qr-code": "^2.0.15", + "react-redux": "^8.0.5", + "react-router-dom": "^6.11.0", + "react-slick": "^0.29.0", + "rollup-plugin-terser": "^7.0.2", + "sass": "^1.62.0", + "slick-carousel": "^1.8.1", + "split-type": "^0.3.4", + "swiper": "^10.2.0", + "universal-cookie": "^4.0.4", + "uuid": "^11.1.0", + "webfontloader": "^1.6.28", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@vitejs/plugin-react": "^4.0.0-beta.0", + "eslint": "^8.38.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "react-snap": "^1.23.0", + "vite": "^4.3.0", + "vite-plugin-prerender": "^1.0.8", + "vite-plugin-sitemap": "^0.8.2" + } +} diff --git a/src/.env.development b/src/.env.development new file mode 100644 index 0000000..f5b3b36 --- /dev/null +++ b/src/.env.development @@ -0,0 +1,18 @@ +ENV_BASE_URL='/' +ENV_API_URL='http://192.168.1.37:8013' +ENV_API_URL_TOKEN='http://192.168.1.37:8001' +# ENV_API_URL_TOKEN='https://www.pozo.dev/JwtToken' +# ENV_API_URL='https://www.pozo.dev/pozo-common-api' +# ENV_IMAGE_UPLOAD_API_URL="https://api.pozo.app/pozo-common-image-api/" +ENV_API_URL_RETAIL='http://192.168.1.37:8012/' +# ENV_API_URL_TOKEN='https://api.pozo.app/JwtToken' +# ENV_API_URL='https://api.pozo.app/pozo-common-api' +# ENV_API_URL_RETAIL='https://api.pozo.app/pozo-retail-api' +ENV_IMAGE_UPLOAD_API_URL="http://192.168.1.38/" +ENV_SECRET_KEY="3a939a2eed2cca4b64cd47f51b23b135b2b9b765273f695d47682ea803c8429d" +ENV_URL_SECRET_KEY="f2ef79b8b2d4fc1cc569726a5a753552257b4ff2872d6a71cf3119bce3f07c1b" +ENV_MAIN_BASE_URL='http://192.168.1.16:3000' +ENV_MAIN_REDIRECT_URL='/apps/retail/app-page/home' +ENV_EMAIL_API='http://192.168.1.37:8014' +ENV_IMAGE_UPLOAD_API_URL="http://192.168.1.38/" + diff --git a/src/.env.production b/src/.env.production new file mode 100644 index 0000000..d10dfe2 --- /dev/null +++ b/src/.env.production @@ -0,0 +1,41 @@ +#221 server + +# ENV_BASE_URL='/home/' +# ENV_API_URL='http://api.pozo.co.in/Pozocommonapi_UnderTest' +# # ENV_API_URL='http://api.pozo.co.in/Pozocommonapi' +# ENV_IMAGE_UPLOAD_API_URL="https://api.pozo.app/pozo-common-image-api" +# ENV_SECRET_KEY="3a939a2eed2cca4b64cd47f51b23b135b2b9b765273f695d47682ea803c8429d" +# ENV_URL_SECRET_KEY="f2ef79b8b2d4fc1cc569726a5a753552257b4ff2872d6a71cf3119bce3f07c1b" +# ENV_MAIN_BASE_URL='http://pozo.co.in/' +# ENV_MAIN_REDIRECT_URL='/apps/retail/app-page/home' + +# live server(#173 server) +# ENV_BASE_URL='/home/' +# ENV_API_URL_TOKEN='https://api.pozo.app/JwtToken' +# ENV_API_URL='https://api.pozo.app/pozo-common-api' +# ENV_IMAGE_UPLOAD_API_URL="https://api.pozo.app/pozo-common-image-api" +# ENV_SECRET_KEY="3a939a2eed2cca4b64cd47f51b23b135b2b9b765273f695d47682ea803c8429d" +# ENV_URL_SECRET_KEY="f2ef79b8b2d4fc1cc569726a5a753552257b4ff2872d6a71cf3119bce3f07c1b" +# ENV_MAIN_BASE_URL='https://www.pozo.app' +# ENV_MAIN_REDIRECT_URL='/apps/retail/app-page/home' +# ENV_PAYMENT_URL='https://pozo.app/paymentgateway/PozoPaymentGateway' +# ENV_CUSTOM_PAYMENT_URL='https://pozo.app/CustomPaymentGateway/CustomPaymentGateway' +# ENV_EMAIL_API='https://api.pozo.app/pozo-sms-email-template-api' +# ENV_API_URL_RETAIL='https://api.pozo.app/pozo-retail-api' + +#172 server + +ENV_BASE_URL='/home/' +ENV_API_URL_TOKEN='https://www.pozo.dev/JwtToken' +ENV_API_URL='https://www.pozo.dev/pozo-common-api' +ENV_API_URL_RETAIL='https://www.pozo.dev/pozo-retail-api' +ENV_IMAGE_UPLOAD_API_URL="https://www.pozo.dev/pozo-common-image-api" +ENV_SECRET_KEY="3a939a2eed2cca4b64cd47f51b23b135b2b9b765273f695d47682ea803c8429d" +ENV_URL_SECRET_KEY="f2ef79b8b2d4fc1cc569726a5a753552257b4ff2872d6a71cf3119bce3f07c1b" +ENV_MAIN_BASE_URL='https://www.pozo.dev' +ENV_MAIN_REDIRECT_URL='/apps/retail/app-page/home' +ENV_PAYMENT_URL='https://pozo.app/paymentgateway/PozoPaymentGateway' +ENV_CUSTOM_PAYMENT_URL='https://pozo.app/CustomPaymentGateway/CustomPaymentGateway' +ENV_EMAIL_API='https://www.pozo.dev/pozo-sms-email-template-api' + + diff --git a/src/AdminPanel/AdminPanel.jsx b/src/AdminPanel/AdminPanel.jsx new file mode 100644 index 0000000..4f3e72a --- /dev/null +++ b/src/AdminPanel/AdminPanel.jsx @@ -0,0 +1,298 @@ +import React, { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import "./AdminPanel.scss"; +import { + FaTh, + FaUser, + FaUsers, + FaCalendarAlt, + FaBullseye, + FaVideo, + FaChevronRight, + FaPlus, + FaList, + FaSortDown, + FaArrowLeft, + FaRedo, + FaSignOutAlt, + FaCog, + FaGift, + FaGlobe, + FaImage, + FaMobile, + FaQuestionCircle, + FaBullhorn, + FaFootballBall, + FaBars, + FaTimes, +} from "react-icons/fa"; +import { BsPostcardFill } from "react-icons/bs"; +import { HiOutlineHome } from "react-icons/hi2"; + +import { useAdminPanel } from "./AdminPanelContext"; +import BannerSectionForm from "./AdminPanelForms/BannerSectionForm"; +import CTASectionForm from "./AdminPanelForms/CTASectionForm"; +import EcosystemForm from "./AdminPanelForms/EcosystemForm"; +import FaqSectionForm from "./AdminPanelForms/FaqSectionForm"; +import FooterForm from "./AdminPanelForms/FooterForm"; +import HeroSectionForm from "./AdminPanelForms/HeroSectionForm"; +import OfferingsForm from "./AdminPanelForms/OfferingsForm"; +import TrendingAppsForm from "./AdminPanelForms/TrendingAppsForm"; +import AppDemo from "./AdminPanelForms/AppDemo"; +import BlogForm from "./AdminPanelForms/BlogForm"; +import SeoForm from "./AdminPanelForms/SeoForm"; +import SEO from "../Components/SEO/SEO"; +import { clearSession, getSession } from "../Services/others"; +import { GenerateLogout } from "../features/signInPage/signInPage"; +import { useDispatch } from "react-redux"; +const subDirectory = import.meta.env.BASE_URL; + +const AdminPanel = () => { + // Default to first option (HeroSectionForm) + const [selectedId, setSelectedId] = useState(0); + const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); + const navigate = useNavigate(); + const dispatch = useDispatch(); + + const UserType = getSession("UserType"); + console.log(UserType, "UserTypeUserType") + + const sidebarOptions = [ + // { id: 1, title: "Dashboard", subtitle: "Overview", icon: }, + { + id: 0, + title: "Blog", + subtitle: "Post Content Control", + icon: , + component: BlogForm, + key: "BlogSection", + }, + { + id: 10, + title: "SEO", + subtitle: "Content Management", + icon: , + component: SeoForm, + key: "SEOForm", + }, + // { + // id: 1, + // title: "HeroSection", + // subtitle: "Hero Section Management", + // icon: , + // component: HeroSectionForm, + // key: "HeroSection", + // }, + // { + // id: 2, + // title: "Offerings", + // subtitle: "Offering Section Management", + // icon: , + // component: OfferingsForm, + // key: "OfferingSection", + // }, + // { + // id: 3, + // title: "Industries", + // subtitle: "Ecosystem Management", + // icon: , + // component: EcosystemForm, + // key: "Industries", + // }, + // { + // id: 4, + // title: "AppDemo", + // subtitle: "Video Section Management", + // icon: , + // component: AppDemo, + // key: "VideoDemo", + // }, + // { + // id: 5, + // title: "BannerSection", + // subtitle: "Banner Section Management", + // icon: , + // component: BannerSectionForm, + // key: "BannerSection", + // }, + // { + // id: 6, + // title: "TrendingApps", + // subtitle: "Trending Apps Management", + // icon: , + // component: TrendingAppsForm, + // key: "TrendingApps", + // }, + // { + // id: 7, + // title: "FaqSection", + // subtitle: "FAQ Management", + // icon: , + // component: FaqSectionForm, + // key: "FAQSection", + // }, + // { + // id: 8, + // title: "CTASection", + // subtitle: "Call-to-Action Management", + // icon: , + // component: CTASectionForm, + // key: "CTASection", + // }, + // { + // id: 9, + // title: "Footer", + // subtitle: "Footer Management", + // icon: , + // component: FooterForm, + // key: "FooterSection", + // }, + ]; + + const currentSection = sidebarOptions.find( + (option) => option.id === selectedId + ); + + const handleSideBarSelect = (option) => { + setSelectedId(option?.id); + setIsMobileMenuOpen(false); // Close mobile menu on selection + }; + + const handleSignOut = async () => { + const UserId = getSession("UserId"); + const status = "N"; + const res = await dispatch(GenerateLogout({ UserId, status })).unwrap(); + if (res?.data?.statusCode === 1) { + clearSession(); + navigate(`${subDirectory}`); + } + } + + return ( + <> + +
+ {/* Mobile Menu Toggle */} +
+
+ Admin Panel +
+ +
+ + {/* Sidebar Navigation */} +
+
+
+ +

Admin Panel

+
+
+ + + +
+
+
SA
+
+ + Marketing Administrator + + Super Admin +
+
+ +
+
+ + {/* Mobile Overlay */} + {isMobileMenuOpen && ( +
setIsMobileMenuOpen(false)} + >
+ )} + + {/* Main Content */} +
+ {/* Top Header with Breadcrumbs */} +
+
+ Dashboard + {currentSection && ( + <> + + {currentSection.title} Management + + )} +
+
UserType === "Super Admin" ? navigate(`${subDirectory}landing-page/home`) : navigate(`${subDirectory}`)} + > + Back to Home +
+
+ + {/* Content Area */} +
+ {currentSection?.component ? ( + + ) : ( +
+
+ +
+

Welcome to Admin Panel

+

Select a section from the sidebar to get started

+
+ )} +
+
+
+ + ); +}; + +export default AdminPanel; diff --git a/src/AdminPanel/AdminPanel.scss b/src/AdminPanel/AdminPanel.scss new file mode 100644 index 0000000..b949800 --- /dev/null +++ b/src/AdminPanel/AdminPanel.scss @@ -0,0 +1,1264 @@ +// Modern Admin Panel with Trending UI/UX +.admin-panel-container { + display: flex; + height: 100vh; + font-family: + "NeueMontreal", + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + "Roboto", + "Helvetica Neue", + sans-serif; + background: linear-gradient(135deg, #f5f7fa 0%, #e8eef5 100%); + color: #1a202c; + letter-spacing: -0.01em; + + @media (max-width: 768px) { + flex-direction: column; + } + + // Sidebar Styles - Clean Modern White Theme + .admin-panel-sidebar { + width: 290px; + background: white; + color: #1a202c; + display: flex; + flex-direction: column; + box-shadow: 2px 0 20px rgba(0, 0, 0, 0.08); + position: relative; + border-right: 1px solid #e2e8f0; + + .admin-panel-sidebar-header { + padding: 18px 16px; + border-bottom: 1px solid #e2e8f0; + + .admin-panel-logo { + display: flex; + align-items: center; + gap: 14px; + + svg { + font-size: 1.7rem; + color: #5255c8; + } + + h1 { + margin: 0; + font-size: 1.3rem; + font-weight: 700; + color: #1e293b; + letter-spacing: -0.02em; + font-family: "Poppins", sans-serif; + } + } + } + + .admin-panel-sidebar-nav { + flex: 1; + padding: 12px 9px; + overflow-y: auto; + scrollbar-width: thin; + scroll-behavior: smooth; + + &::-webkit-scrollbar { + width: 4px; + } + + &::-webkit-scrollbar-track { + background: #f1f5f9; + } + + &::-webkit-scrollbar-thumb { + background: #cbd5e1; + border-radius: 4px; + + &:hover { + background: #94a3b8; + } + } + + .admin-panel-nav-item { + display: flex; + align-items: center; + padding: 12px 16px; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + position: relative; + margin: 2px 0; + border-radius: 12px; + background-color: #f8fafc; + + &:hover { + background: #e8f4ff; + transform: translateX(2px); + } + + &.active { + background: #1e40af; + box-shadow: 0 2px 8px rgba(30, 64, 175, 0.15); + transform: translateX(0); + + .admin-panel-nav-icon { + color: white; + transform: scale(1.05); + } + + .admin-panel-nav-content { + .admin-panel-nav-title { + color: white; + font-weight: 500; + } + + .admin-panel-nav-subtitle { + color: rgba(255, 255, 255, 0.9); + } + } + + &::after { + content: ""; + position: absolute; + right: 12px; + top: 50%; + transform: translateY(-50%); + width: 6px; + height: 6px; + background: white; + border-radius: 50%; + box-shadow: 0 0 6px rgba(255, 255, 255, 0.8); + } + } + + .admin-panel-nav-icon { + font-size: 1.35rem; + color: #5255c8; + margin-right: 16px; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: flex; + align-items: center; + justify-content: center; + } + + .admin-panel-nav-content { + flex: 1; + + .admin-panel-nav-title { + display: block; + font-size: 0.9375rem; + font-weight: 500; + color: #374151; + // margin-bottom: 0.25rem; + letter-spacing: -0.01em; + transition: all 0.3s ease; + font-family: "Poppins", sans-serif; + } + + .admin-panel-nav-subtitle { + display: block; + font-size: 0.75rem; + color: #6b7280; + font-weight: 400; + letter-spacing: 0.01em; + transition: all 0.3s ease; + font-family: "NeueMontreal", sans-serif; + } + } + } + } + + .admin-panel-sidebar-footer { + padding: 16px 16px 14px 16px; + border-top: 1px solid #e2e8f0; + + .admin-panel-user-profile { + display: flex; + align-items: center; + padding: 0; + background: #f8fafc; + border-radius: 12px; + + .admin-panel-user-avatar { + width: 40px; + height: 40px; + background: #5255c8; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 500; + font-size: 0.9rem; + color: white; + margin-right: 12px; + } + + .admin-panel-user-info { + flex: 1; + + .admin-panel-user-name { + display: block; + font-size: 0.9rem; + font-weight: 500; + color: #374151; + font-family: "Poppins", sans-serif; + } + + .admin-panel-user-role { + display: block; + font-size: 0.8rem; + color: #6b7280; + font-family: "NeueMontreal", sans-serif; + } + } + } + + .admin-panel-signout-btn { + margin: 16px 0 0 0; + width: 100%; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 10px; + text-align: center; + justify-content: center; + padding: 8px 12px; + font-family: "Poppins"; + border: none; + background-color: #ced0ff; + color: #1c22c5; + border-radius: 6px; + border: 1px solid #b9bbff; + cursor: pointer; + svg { + display: flex; + } + + &:hover { + color: #c91818; + } + } + } + } + + // Main Content Styles + .admin-panel-main-content { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + + // Top Header + .admin-panel-top-header { + background: white; + padding: 10px 16px; + border-bottom: 1px solid #e2e8f0; + display: flex; + justify-content: space-between; + align-items: center; + + .admin-panel-breadcrumbs { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.7rem; + color: #64748b; + font-family: "Poppins", sans-serif; + + .admin-panel-breadcrumb-arrow { + font-size: 0.75rem; + color: #94a3b8; + font-family: "NeueMontreal", sans-serif; + } + + span:last-child { + color: #1e293b; + font-weight: 500; + } + } + + .admin-panel-header-actions { + display: flex; + gap: 12px; + + button { + background: transparent; + border: 1px solid #5255c8; + color: #5255c8; + padding: 6px 12px; + border-radius: 6px; + cursor: pointer; + font-size: 0.775rem; + font-family: "NeueMontreal", sans-serif; + display: flex; + align-items: center; + gap: 8px; + transition: all 0.2s ease; + + &:hover { + background: #f9fafb; + border-color: #9ca3af; + } + } + } + } + + // Main Header - Modern Design + .admin-panel-main-header { + background: white; + padding: 16px 16px; + border-bottom: 1px solid #e5e7eb; + display: flex; + justify-content: space-between; + align-items: center; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02); + + .admin-panel-header-left { + display: flex; + align-items: center; + gap: 20px; + + .admin-panel-header-icon { + width: 50px; + height: 50px; + background: linear-gradient(135deg, #1e40af 0%, #5470cc 100%); + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + color: white; + font-size: 1.5rem; + box-shadow: 0 8px 20px rgba(99, 102, 241, 0.25); + position: relative; + + &::before { + content: ""; + position: absolute; + inset: -2px; + background: linear-gradient(135deg, #5255c8, #8b5cf6, #a855f7); + border-radius: 18px; + z-index: -1; + opacity: 0.3; + filter: blur(8px); + } + } + + .admin-panel-header-content { + h1 { + margin: 0; + font-size: 1.3rem; + font-weight: 800; + color: #000; + letter-spacing: -0.03em; + line-height: 1.4; + font-family: "Poppins", sans-serif; + } + + p { + color: #64748b; + font-size: 0.7rem; + font-weight: 400; + letter-spacing: -0.01em; + font-family: "Poppins", sans-serif; + } + } + } + + .admin-panel-create-btn { + background: linear-gradient(135deg, #5255c8 0%, #7c80f3 100%); + color: white; + border: none; + padding: 10px 16px; + border-radius: 8px; + font-weight: 400; + font-size: 14px; + cursor: pointer; + font-family: "Poppins", sans-serif; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: flex; + align-items: center; + gap: 10px; + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.25); + position: relative; + overflow: hidden; + + &::before { + content: ""; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s; + } + + &:hover { + transform: translateY(-2px); + box-shadow: 0 8px 24px rgba(99, 102, 241, 0.35); + + &::before { + left: 100%; + } + } + + &:active { + transform: translateY(0); + } + } + } + + // Tab Navigation + .admin-panel-tab-navigation { + background: white; + padding: 12px 20px; + border-bottom: 1px solid #e2e8f0; + display: flex; + justify-content: space-between; + align-items: center; + + .admin-panel-tab-buttons { + display: flex; + gap: 8px; + + .admin-panel-tab-btn { + padding: 8px 16px; + border: none; + background: transparent; + color: #64748b; + font-weight: 500; + cursor: pointer; + border-radius: 6px; + transition: all 0.2s ease; + font-family: "Poppins", sans-serif; + + &.active { + background: #f1f5f9; + color: #1e293b; + } + + &:hover:not(.active) { + background: #f8fafc; + color: #475569; + } + } + } + + .admin-panel-tab-controls { + display: flex; + align-items: center; + gap: 16px; + + .admin-panel-sort-dropdown { + position: relative; + display: flex; + align-items: center; + + .admin-panel-dropdown-icon { + position: absolute; + right: 12px; + color: #64748b; + font-size: 0.875rem; + pointer-events: none; + z-index: 1; + font-family: "NeueMontreal", sans-serif; + } + + select { + appearance: none; + background: white; + border: 1px solid #d1d5db; + padding: 8px 32px 8px 12px; + border-radius: 6px; + font-size: 0.875rem; + color: #374151; + cursor: pointer; + min-width: 140px; + font-family: "NeueMontreal", sans-serif; + + &:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); + } + } + } + + .admin-panel-view-toggle { + display: flex; + background: #f1f5f9; + border-radius: 6px; + padding: 2px; + + .admin-panel-view-btn { + background: transparent; + border: none; + padding: 8px; + cursor: pointer; + border-radius: 4px; + color: #64748b; + transition: all 0.2s ease; + + &.active { + background: white; + color: #1e293b; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + } + + &:hover:not(.active) { + color: #475569; + } + } + } + } + } + + // Content Area + .admin-panel-content-area { + flex: 1; + overflow-y: auto; + background: #f8fafc; + + // Remove existing form styling and make it clean + .hero-section-form, + .offerings-form, + .ecosystem-form, + .trending-apps-form, + .faq-form, + .CTASectionFormMaster, + .FooterFormMaster, + .banner-section-form { + background: transparent; + padding: 0; + border-radius: 0; + box-shadow: none; + margin: 0; + + .hero-section-header, + .offerings-header, + .ecosystem-header, + .trending-apps-header, + .faq-header, + .cta-header, + .footer-header, + .banner-section-header { + display: none; + } + + .form-container, + .offeringsContent, + .ecosystemContent, + .form-inputs, + .faq-inputs, + .cta-form, + .footer-form, + .banner-content { + background: transparent; + padding: 0; + border-radius: 0; + box-shadow: none; + border: none; + } + } + } + + // Placeholder Content + .admin-panel-placeholder-content { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 64px 32px; + text-align: center; + + .admin-panel-placeholder-icon { + width: 80px; + height: 80px; + background: linear-gradient(135deg, #e2e8f0, #cbd5e1); + border-radius: 20px; + display: flex; + align-items: center; + justify-content: center; + color: #64748b; + font-size: 2rem; + margin-bottom: 32px; + } + + h2 { + margin: 0 0 16px 0; + font-size: 1.5rem; + font-weight: 600; + color: #1e293b; + font-family: "Poppins", sans-serif; + } + + p { + margin: 0; + color: #64748b; + font-size: 1rem; + font-family: "Poppins", sans-serif; + } + } + + // Modal Overlay + .admin-panel-modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + padding: 32px; + } + + .admin-panel-create-modal { + background: white; + border-radius: 12px; + width: 100%; + max-width: 600px; + max-height: 90vh; + overflow: hidden; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2); + + .admin-panel-modal-header { + padding: 24px 32px; + border-bottom: 1px solid #e2e8f0; + display: flex; + justify-content: space-between; + align-items: center; + background: #f8fafc; + + h2 { + margin: 0; + font-size: 1.25rem; + font-weight: 600; + color: #1e293b; + font-family: "Poppins", sans-serif; + } + + .admin-panel-close-btn { + background: none; + border: none; + font-size: 1.5rem; + color: #64748b; + cursor: pointer; + padding: 4px; + border-radius: 4px; + transition: all 0.2s ease; + + &:hover { + background: #e2e8f0; + color: #374151; + } + } + } + + .admin-panel-modal-content { + padding: 32px; + overflow-y: auto; + max-height: calc(90vh - 80px); + + // Style the form components inside modal + .hero-section-form, + .offerings-form, + .ecosystem-form, + .trending-apps-form, + .faq-form, + .CTASectionFormMaster, + .FooterFormMaster, + .banner-section-form { + .form-container, + .offeringsContent, + .ecosystemContent, + .form-inputs, + .faq-inputs, + .cta-form, + .footer-form, + .banner-content { + background: transparent; + padding: 0; + border: none; + box-shadow: none; + } + + // Hide data display sections in modal + .hero-data-display, + .apps-display, + .added-titles, + .saved-posters, + .added-banners, + .added-faqs, + .apps-display, + .admin-cards-container { + display: none; + } + } + } + } + } + + // Mobile Header (hidden on desktop) + .admin-panel-mobile-header { + display: none; + justify-content: space-between; + align-items: center; + padding: 16px; + background: white; + border-bottom: 1px solid #e2e8f0; + position: sticky; + top: 0; + z-index: 100; + + .admin-panel-mobile-logo { + display: flex; + align-items: center; + gap: 8px; + font-size: 1.1rem; + font-weight: 600; + color: #1e293b; + + svg { + color: #5255c8; + font-size: 1.2rem; + } + } + + .admin-panel-mobile-toggle { + background: none; + border: none; + font-size: 1.2rem; + color: #5255c8; + cursor: pointer; + padding: 6px; + border-radius: 6px; + transition: all 0.2s ease; + + &:hover { + background: #edeeff; + color: #3f45ff; + } + svg { + display: flex; + } + } + } + + // Mobile Overlay + .admin-panel-mobile-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + z-index: 150; + } + + // Responsive Design + @media (max-width: 1024px) { + .admin-panel-sidebar { + width: 240px; + } + + .admin-panel-main-content { + .admin-panel-main-header, + .admin-panel-tab-navigation, + .admin-panel-top-header { + padding: 16px 24px; + } + } + } + + @media (max-width: 768px) { + .admin-panel-mobile-header { + display: flex; + } + + .admin-panel-mobile-overlay { + display: block; + } + + .admin-panel-sidebar { + position: fixed; + top: 0; + left: -290px; + width: 290px; + height: 100vh; + z-index: 200; + transition: left 0.3s ease; + box-shadow: 2px 0 20px rgba(0, 0, 0, 0.15); + + &.mobile-open { + left: 0; + } + } + + .admin-panel-main-content { + width: 100%; + + .admin-panel-top-header { + padding: 12px 16px; + + .admin-panel-breadcrumbs { + font-size: 0.8rem; + } + } + + .admin-panel-main-header { + flex-direction: column; + gap: 1rem; + align-items: stretch; + padding: 16px; + + .admin-panel-header-left { + justify-content: center; + + .admin-panel-header-content { + text-align: center; + + h1 { + font-size: 1.1rem; + } + + p { + font-size: 0.8rem; + } + } + } + + .admin-panel-create-btn { + width: 100%; + justify-content: center; + } + } + + .admin-panel-tab-navigation { + flex-direction: column; + gap: 16px; + align-items: stretch; + padding: 12px 16px; + + .admin-panel-tab-buttons { + overflow-x: auto; + + .admin-panel-tab-btn { + white-space: nowrap; + min-width: 100px; + } + } + + .admin-panel-tab-controls { + justify-content: space-between; + flex-wrap: wrap; + gap: 12px; + } + } + + .admin-panel-modal-overlay { + padding: 16px; + } + + .admin-panel-create-modal { + max-height: 95vh; + + .admin-panel-modal-header { + padding: 16px 20px; + + h2 { + font-size: 1.1rem; + } + } + + .admin-panel-modal-content { + padding: 20px; + } + } + } + } + + @media (max-width: 480px) { + .admin-panel-main-content { + .admin-panel-top-header, + .admin-panel-main-header, + .admin-panel-tab-navigation { + padding: 12px; + } + + .admin-panel-main-header { + .admin-panel-header-left { + .admin-panel-header-icon { + width: 40px; + height: 40px; + font-size: 1.2rem; + } + } + } + } + + .admin-panel-create-modal { + margin: 8px; + max-height: calc(100vh - 16px); + + .admin-panel-modal-content { + padding: 16px; + } + } + } +} + +// Modal Form Styles +.admin-panel-create-modal-form { + .form-group { + margin-bottom: 24px; + + label { + display: block; + margin-bottom: 8px; + font-weight: 600; + color: #374151; + font-size: 0.875rem; + font-family: "NeueMontreal", sans-serif; + } + + input, + textarea, + select { + width: 100%; + padding: 12px; + border: 1px solid #d1d5db; + border-radius: 6px; + font-size: 0.875rem; + transition: all 0.2s ease; + font-family: "NeueMontreal", sans-serif; + + &:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); + } + + &.error { + border-color: #ef4444; + } + + &::placeholder { + color: #9ca3af; + } + } + + textarea { + resize: vertical; + min-height: 100px; + } + + .error-text { + display: block; + color: #ef4444; + font-size: 0.75rem; + margin-top: 4px; + font-family: "NeueMontreal", sans-serif; + } + + .image-mode-toggle { + display: flex; + margin-bottom: 12px; + background: #f3f4f6; + border-radius: 6px; + padding: 2px; + + .mode-btn { + flex: 1; + padding: 8px 16px; + border: none; + background: transparent; + color: #6b7280; + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + border-radius: 4px; + transition: all 0.2s ease; + + &.active { + background: white; + color: #374151; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + } + + &:hover:not(.active) { + color: #374151; + } + } + } + } + + .form-actions { + display: flex; + gap: 16px; + margin-top: 32px; + padding-top: 24px; + border-top: 1px solid #e5e7eb; + + button { + flex: 1; + padding: 12px 24px; + border-radius: 6px; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + font-family: "NeueMontreal", sans-serif; + + &.cancel-btn { + background: #f3f4f6; + color: #374151; + border: 1px solid #d1d5db; + + &:hover { + background: #e5e7eb; + } + } + + &.save-btn { + background: #3b82f6; + color: white; + border: 1px solid #3b82f6; + + &:hover { + background: #2563eb; + } + } + } + } +} + +// Modern Card-based layout for data display +.admin-panel-cards-container { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); + gap: 28px; + margin-top: 24px; + + @media (max-width: 768px) { + grid-template-columns: 1fr; + gap: 20px; + } +} + +.admin-panel-card { + background: white; + border-radius: 16px; + overflow: hidden; + box-shadow: + 0 1px 3px rgba(0, 0, 0, 0.05), + 0 4px 12px rgba(0, 0, 0, 0.03); + border: 1px solid #e5e7eb; + transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); + position: relative; + + &::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 3px; + background: linear-gradient(90deg, #5255c8, #8b5cf6, #a855f7); + opacity: 0; + transition: opacity 0.3s ease; + } + + &:hover { + transform: translateY(-4px); + box-shadow: + 0 8px 20px rgba(0, 0, 0, 0.08), + 0 16px 40px rgba(0, 0, 0, 0.06); + border-color: #d1d5db; + + &::before { + opacity: 1; + } + } + + .card-image { + width: 100%; + height: 180px; + overflow: hidden; + background: #f1f5f9; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + } + + .card-content { + padding: 24px; + + .card-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 16px; + margin-bottom: 16px; + + h3 { + margin: 0; + font-size: 1.125rem; + font-weight: 700; + color: #1e293b; + line-height: 1.4; + letter-spacing: -0.02em; + font-family: "Poppins", sans-serif; + } + + .status-badge { + padding: 6px 14px; + border-radius: 20px; + font-size: 0.75rem; + font-weight: 600; + white-space: nowrap; + text-transform: uppercase; + letter-spacing: 0.5px; + font-family: "NeueMontreal", sans-serif; + + &.active { + background: linear-gradient(135deg, #dcfce7, #bbf7d0); + color: #166534; + box-shadow: 0 2px 8px rgba(22, 101, 52, 0.15); + } + + &.inactive { + background: linear-gradient(135deg, #fef3c7, #fde68a); + color: #92400e; + box-shadow: 0 2px 8px rgba(146, 64, 14, 0.15); + } + } + } + + .card-description { + color: #64748b; + font-size: 0.9375rem; + line-height: 1.6; + margin-bottom: 20px; + display: -webkit-box; + -webkit-line-clamp: 3; + line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + font-weight: 400; + font-family: "Poppins", sans-serif; + } + + .card-meta { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 16px; + padding-top: 12px; + border-top: 1px solid #f1f5f9; + + .priority-badge { + padding: 4px 12px; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 500; + font-family: "NeueMontreal", sans-serif; + + &.high { + background: #fee2e2; + color: #991b1b; + } + + &.medium { + background: #fef3c7; + color: #92400e; + } + + &.low { + background: #dcfce7; + color: #166534; + } + } + + .date { + color: #94a3b8; + font-size: 0.75rem; + font-family: "NeueMontreal", sans-serif; + } + } + + .card-actions { + display: flex; + gap: 10px; + + button { + flex: 1; + padding: 10px 16px; + border: 1.5px solid #e5e7eb; + background: white; + color: #475569; + border-radius: 10px; + font-size: 0.8125rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + font-family: "NeueMontreal", sans-serif; + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + + &:hover { + background: #f8fafc; + border-color: #cbd5e1; + transform: translateY(-1px); + } + + &.primary { + background: linear-gradient(135deg, #5255c8, #8b5cf6); + color: white; + border-color: transparent; + box-shadow: 0 2px 8px rgba(99, 102, 241, 0.25); + + &:hover { + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.35); + transform: translateY(-2px); + } + } + + &.danger { + background: linear-gradient(135deg, #ef4444, #dc2626); + color: white; + border-color: transparent; + box-shadow: 0 2px 8px rgba(239, 68, 68, 0.25); + + &:hover { + box-shadow: 0 4px 12px rgba(239, 68, 68, 0.35); + transform: translateY(-2px); + } + } + + &:active { + transform: translateY(0); + } + } + } + } +} + +.backtohomefromAdminpanel { + font-family: "Poppins"; + font-size: 12px; + gap: 4px; + align-items: center; + display: flex; + cursor: pointer; + svg { + display: flex; + } +} diff --git a/src/AdminPanel/AdminPanel.scss.backup b/src/AdminPanel/AdminPanel.scss.backup new file mode 100644 index 0000000..62060a2 --- /dev/null +++ b/src/AdminPanel/AdminPanel.scss.backup @@ -0,0 +1,976 @@ +// Modern Admin Panel with Trending UI/UX +.admin-panel { + display: flex; + height: 100vh; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', sans-serif; + background: linear-gradient(135deg, #f5f7fa 0%, #e8eef5 100%); + color: #1a202c; + letter-spacing: -0.01em; + + // Sidebar Styles - Modern Dark Theme + .sidebar { + width: 290px; + background: linear-gradient(180deg, #0f172a 0%, #1e1b4b 100%); + color: white; + display: flex; + flex-direction: column; + box-shadow: 8px 0 40px rgba(0, 0, 0, 0.15); + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 4px; + background: linear-gradient(90deg, #5255c8, #8b5cf6, #ec4899); + } + + .sidebar-header { + padding: 2.5rem 1.75rem 1.5rem; + border-bottom: 1px solid rgba(255, 255, 255, 0.08); + + .logo { + display: flex; + align-items: center; + gap: 0.875rem; + + svg { + font-size: 2rem; + color: #818cf8; + filter: drop-shadow(0 0 8px rgba(129, 140, 248, 0.4)); + } + + h1 { + margin: 0; + font-size: 1.5rem; + font-weight: 700; + background: linear-gradient(135deg, #ffffff 0%, #a5b4fc 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + letter-spacing: -0.02em; + } + } + } + + .sidebar-nav { + flex: 1; + padding: 1rem 0; + overflow-y: auto; + + .nav-item { + display: flex; + align-items: center; + padding: 1rem 1.5rem; + cursor: pointer; + transition: all 0.3s ease; + position: relative; + margin: 0.25rem 0; + + &:hover { + background: rgba(255, 255, 255, 0.05); + } + + &.active { + background: linear-gradient(135deg, #5255c8, #8b5cf6); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3); + + .nav-icon { + color: white; + } + + .nav-content { + .nav-title { + color: white; + } + .nav-subtitle { + color: rgba(255, 255, 255, 0.8); + } + } + } + + .nav-icon { + font-size: 1.25rem; + color: #94a3b8; + margin-right: 1rem; + transition: color 0.3s ease; + } + + .nav-content { + flex: 1; + + .nav-title { + display: block; + font-size: 0.95rem; + font-weight: 600; + color: #e2e8f0; + margin-bottom: 0.25rem; + } + + .nav-subtitle { + display: block; + font-size: 0.8rem; + color: #94a3b8; + } + } + + .active-indicator { + width: 4px; + height: 20px; + background: white; + border-radius: 2px; + position: absolute; + right: 0; + } + } + } + + .sidebar-footer { + padding: 1.5rem; + border-top: 1px solid rgba(255, 255, 255, 0.1); + + .user-profile { + display: flex; + align-items: center; + margin-bottom: 1rem; + + .user-avatar { + width: 40px; + height: 40px; + background: linear-gradient(135deg, #8b5cf6, #ec4899); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 600; + font-size: 0.9rem; + margin-right: 0.75rem; + } + + .user-info { + flex: 1; + + .user-name { + display: block; + font-size: 0.9rem; + font-weight: 600; + color: white; + margin-bottom: 0.25rem; + } + + .user-role { + display: block; + font-size: 0.8rem; + color: #94a3b8; + } + } + } + + .signout-btn { + width: 100%; + background: transparent; + border: 1px solid rgba(255, 255, 255, 0.2); + color: white; + padding: 0.75rem 1rem; + border-radius: 8px; + cursor: pointer; + font-size: 0.9rem; + display: flex; + align-items: center; + gap: 0.5rem; + transition: all 0.3s ease; + + &:hover { + background: rgba(255, 255, 255, 0.1); + border-color: rgba(255, 255, 255, 0.3); + } + } + } + } + + // Main Content Styles + .main-content { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + + // Top Header + .top-header { + background: white; + padding: 1rem 2rem; + border-bottom: 1px solid #e2e8f0; + display: flex; + justify-content: space-between; + align-items: center; + + .breadcrumbs { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.9rem; + color: #64748b; + + .breadcrumb-arrow { + font-size: 0.75rem; + color: #94a3b8; + } + + span:last-child { + color: #1e293b; + font-weight: 500; + } + } + + .header-actions { + display: flex; + gap: 0.75rem; + + button { + background: transparent; + border: 1px solid #d1d5db; + color: #374151; + padding: 0.5rem 1rem; + border-radius: 6px; + cursor: pointer; + font-size: 0.875rem; + display: flex; + align-items: center; + gap: 0.5rem; + transition: all 0.2s ease; + + &:hover { + background: #f9fafb; + border-color: #9ca3af; + } + } + } + } + + // Main Header + .main-header { + background: white; + padding: 2rem; + border-bottom: 1px solid #e2e8f0; + display: flex; + justify-content: space-between; + align-items: center; + + .header-left { + display: flex; + align-items: center; + gap: 1rem; + + .header-icon { + width: 48px; + height: 48px; + background: linear-gradient(135deg, #667eea, #764ba2); + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + color: white; + font-size: 1.25rem; + } + + .header-content { + h1 { + margin: 0; + font-size: 1.75rem; + font-weight: 700; + color: #1e293b; + } + + p { + margin: 0.25rem 0 0 0; + color: #64748b; + font-size: 0.95rem; + } + } + } + + .create-btn { + background: linear-gradient(135deg, #1e40af, #1d4ed8); + color: white; + border: none; + padding: 0.875rem 1.5rem; + border-radius: 10px; + font-weight: 600; + font-size: 0.95rem; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + gap: 0.5rem; + + &:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(30, 64, 175, 0.3); + } + } + } + + // Tab Navigation + .tab-navigation { + background: white; + padding: 1rem 2rem; + border-bottom: 1px solid #e2e8f0; + display: flex; + justify-content: space-between; + align-items: center; + + .tab-buttons { + display: flex; + gap: 0.5rem; + + .tab-btn { + padding: 0.5rem 1rem; + border: none; + background: transparent; + color: #64748b; + font-weight: 500; + cursor: pointer; + border-radius: 6px; + transition: all 0.2s ease; + + &.active { + background: #f1f5f9; + color: #1e293b; + } + + &:hover:not(.active) { + background: #f8fafc; + color: #475569; + } + } + } + + .tab-controls { + display: flex; + align-items: center; + gap: 1rem; + + .sort-dropdown { + position: relative; + display: flex; + align-items: center; + + .dropdown-icon { + position: absolute; + right: 0.75rem; + color: #64748b; + font-size: 0.875rem; + pointer-events: none; + z-index: 1; + } + + select { + appearance: none; + background: white; + border: 1px solid #d1d5db; + padding: 0.5rem 2rem 0.5rem 0.75rem; + border-radius: 6px; + font-size: 0.875rem; + color: #374151; + cursor: pointer; + min-width: 140px; + + &:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); + } + } + } + + .view-toggle { + display: flex; + background: #f1f5f9; + border-radius: 6px; + padding: 2px; + + .view-btn { + background: transparent; + border: none; + padding: 0.5rem; + cursor: pointer; + border-radius: 4px; + color: #64748b; + transition: all 0.2s ease; + + &.active { + background: white; + color: #1e293b; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + } + + &:hover:not(.active) { + color: #475569; + } + } + } + } + } + + // Content Area + .content-area { + flex: 1; + padding: 2rem; + overflow-y: auto; + background: #f8fafc; + + // Remove existing form styling and make it clean + .hero-section-form, + .offerings-form, + .ecosystem-form, + .trending-apps-form, + .faq-form, + .CTASectionFormMaster, + .FooterFormMaster, + .banner-section-form { + background: transparent; + padding: 0; + border-radius: 0; + box-shadow: none; + margin: 0; + + .hero-section-header, + .offerings-header, + .ecosystem-header, + .trending-apps-header, + .faq-header, + .cta-header, + .footer-header, + .banner-section-header { + display: none; + } + + .form-container, + .offeringsContent, + .ecosystemContent, + .form-inputs, + .faq-inputs, + .cta-form, + .footer-form, + .banner-content { + background: transparent; + padding: 0; + border-radius: 0; + box-shadow: none; + border: none; + } + } + } + + // Placeholder Content + .placeholder-content { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 4rem 2rem; + text-align: center; + + .placeholder-icon { + width: 80px; + height: 80px; + background: linear-gradient(135deg, #e2e8f0, #cbd5e1); + border-radius: 20px; + display: flex; + align-items: center; + justify-content: center; + color: #64748b; + font-size: 2rem; + margin-bottom: 2rem; + } + + h2 { + margin: 0 0 1rem 0; + font-size: 1.5rem; + font-weight: 600; + color: #1e293b; + } + + p { + margin: 0; + color: #64748b; + font-size: 1rem; + } + } + + // Modal Overlay + .modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + padding: 2rem; + } + + .create-modal { + background: white; + border-radius: 12px; + width: 100%; + max-width: 600px; + max-height: 90vh; + overflow: hidden; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2); + + .modal-header { + padding: 1.5rem 2rem; + border-bottom: 1px solid #e2e8f0; + display: flex; + justify-content: space-between; + align-items: center; + background: #f8fafc; + + h2 { + margin: 0; + font-size: 1.25rem; + font-weight: 600; + color: #1e293b; + } + + .close-btn { + background: none; + border: none; + font-size: 1.5rem; + color: #64748b; + cursor: pointer; + padding: 0.25rem; + border-radius: 4px; + transition: all 0.2s ease; + + &:hover { + background: #e2e8f0; + color: #374151; + } + } + } + + .modal-content { + padding: 2rem; + overflow-y: auto; + max-height: calc(90vh - 80px); + + // Style the form components inside modal + .hero-section-form, + .offerings-form, + .ecosystem-form, + .trending-apps-form, + .faq-form, + .CTASectionFormMaster, + .FooterFormMaster, + .banner-section-form { + .form-container, + .offeringsContent, + .ecosystemContent, + .form-inputs, + .faq-inputs, + .cta-form, + .footer-form, + .banner-content { + background: transparent; + padding: 0; + border: none; + box-shadow: none; + } + + // Hide data display sections in modal + .hero-data-display, + .apps-display, + .added-titles, + .saved-posters, + .added-banners, + .added-faqs, + .apps-display, + .admin-cards-container { + display: none; + } + } + } + } + } + + // Responsive Design + @media (max-width: 1024px) { + .sidebar { + width: 240px; + } + + .main-content { + .main-header, + .tab-navigation, + .top-header { + padding: 1rem 1.5rem; + } + + .content-area { + padding: 1.5rem; + } + } + } + + @media (max-width: 768px) { + flex-direction: column; + + .sidebar { + width: 100%; + height: auto; + flex-direction: row; + overflow-x: auto; + + .sidebar-nav { + flex: 1; + display: flex; + padding: 0; + + .nav-item { + min-width: 150px; + flex-shrink: 0; + } + } + + .sidebar-footer { + display: none; + } + } + + .main-content { + .main-header { + flex-direction: column; + gap: 1rem; + align-items: stretch; + + .header-left { + justify-content: center; + } + + .create-btn { + width: 100%; + justify-content: center; + } + } + + .tab-navigation { + flex-direction: column; + gap: 1rem; + align-items: stretch; + + .tab-controls { + justify-content: space-between; + } + } + + .content-area { + padding: 1rem; + } + + .modal-overlay { + padding: 1rem; + } + + .create-modal { + max-height: 95vh; + } + } + } +} + +// Modal Form Styles +.create-modal-form { + .form-group { + margin-bottom: 1.5rem; + + label { + display: block; + margin-bottom: 0.5rem; + font-weight: 600; + color: #374151; + font-size: 0.875rem; + } + + input, + textarea, + select { + width: 100%; + padding: 0.75rem; + border: 1px solid #d1d5db; + border-radius: 6px; + font-size: 0.875rem; + transition: all 0.2s ease; + font-family: inherit; + + &:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); + } + + &.error { + border-color: #ef4444; + } + + &::placeholder { + color: #9ca3af; + } + } + + textarea { + resize: vertical; + min-height: 100px; + } + + .error-text { + display: block; + color: #ef4444; + font-size: 0.75rem; + margin-top: 0.25rem; + } + + .image-mode-toggle { + display: flex; + margin-bottom: 0.75rem; + background: #f3f4f6; + border-radius: 6px; + padding: 2px; + + .mode-btn { + flex: 1; + padding: 0.5rem 1rem; + border: none; + background: transparent; + color: #6b7280; + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + border-radius: 4px; + transition: all 0.2s ease; + + &.active { + background: white; + color: #374151; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + } + + &:hover:not(.active) { + color: #374151; + } + } + } + } + + .form-actions { + display: flex; + gap: 1rem; + margin-top: 2rem; + padding-top: 1.5rem; + border-top: 1px solid #e5e7eb; + + button { + flex: 1; + padding: 0.75rem 1.5rem; + border-radius: 6px; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; + + &.cancel-btn { + background: #f3f4f6; + color: #374151; + border: 1px solid #d1d5db; + + &:hover { + background: #e5e7eb; + } + } + + &.save-btn { + background: #3b82f6; + color: white; + border: 1px solid #3b82f6; + + &:hover { + background: #2563eb; + } + } + } + } +} + +// Card-based layout for data display +.admin-cards-container { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 1.5rem; + margin-top: 1.5rem; + + @media (max-width: 768px) { + grid-template-columns: 1fr; + } +} + +.admin-card { + background: white; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); + border: 1px solid #e2e8f0; + transition: all 0.3s ease; + + &:hover { + transform: translateY(-2px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); + } + + .card-image { + width: 100%; + height: 180px; + overflow: hidden; + background: #f1f5f9; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + } + + .card-content { + padding: 1.25rem; + + .card-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 1rem; + margin-bottom: 0.75rem; + + h3 { + margin: 0; + font-size: 1.1rem; + font-weight: 600; + color: #1e293b; + line-height: 1.4; + } + + .status-badge { + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 500; + white-space: nowrap; + + &.active { + background: #dcfce7; + color: #166534; + } + + &.inactive { + background: #fef3c7; + color: #92400e; + } + } + } + + .card-description { + color: #64748b; + font-size: 0.875rem; + line-height: 1.5; + margin-bottom: 1rem; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + } + + .card-meta { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + padding-top: 0.75rem; + border-top: 1px solid #f1f5f9; + + .priority-badge { + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 500; + + &.high { + background: #fee2e2; + color: #991b1b; + } + + &.medium { + background: #fef3c7; + color: #92400e; + } + + &.low { + background: #dcfce7; + color: #166534; + } + } + + .date { + color: #94a3b8; + font-size: 0.75rem; + } + } + + .card-actions { + display: flex; + gap: 0.5rem; + + button { + flex: 1; + padding: 0.5rem 0.75rem; + border: 1px solid #d1d5db; + background: white; + color: #374151; + border-radius: 6px; + font-size: 0.75rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + background: #f9fafb; + border-color: #9ca3af; + } + + &.primary { + background: #3b82f6; + color: white; + border-color: #3b82f6; + + &:hover { + background: #2563eb; + } + } + + &.danger { + background: #ef4444; + color: white; + border-color: #ef4444; + + &:hover { + background: #dc2626; + } + } + } + } + } +} \ No newline at end of file diff --git a/src/AdminPanel/AdminPanelContext.jsx b/src/AdminPanel/AdminPanelContext.jsx new file mode 100644 index 0000000..b4b8bb7 --- /dev/null +++ b/src/AdminPanel/AdminPanelContext.jsx @@ -0,0 +1,223 @@ +import React, { createContext, useContext, useState } from 'react' + +const AdminPanelContext = createContext() + +export const useAdminPanel = () => { + const context = useContext(AdminPanelContext) + if (!context) { + throw new Error('useAdminPanel must be used within AdminPanelProvider') + } + return context +} + +export const AdminPanelProvider = ({ children }) => { + const [sectionData, setSectionData] = useState({ + BannerSectionForm: [ + { + id: 1, + title: 'Summer Sale Banner', + description: 'Promotional banner for summer sale campaign', + image: 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400&h=300&fit=crop', + active: true, + priority: 'high', + date: 'Dec 22, 2024' + } + ], + CTASectionForm: [ + { + id: 1, + title: 'Get Started CTA', + description: 'Primary call-to-action for new users', + image: 'https://images.unsplash.com/photo-1559136555-9303baea8ebd?w=400&h=300&fit=crop', + active: true, + priority: 'high', + date: 'Dec 21, 2024' + } + ], + EcosystemForm: [ + { + id: 1, + title: 'Smart City Solutions', + description: 'Comprehensive urban development platform integrating IoT, data analytics, and citizen engagement.', + image: 'https://images.unsplash.com/photo-1449824913935-59a10b8d2000?w=400&h=300&fit=crop', + active: true, + priority: 'high', + date: 'Dec 21, 2024' + }, + { + id: 2, + title: 'Healthcare Innovation Hub', + description: 'Connected healthcare ecosystem with telemedicine, AI diagnostics, and patient management.', + image: 'https://images.unsplash.com/photo-1559757148-5c350d0d3c56?w=400&h=300&fit=crop', + active: true, + priority: 'medium', + date: 'Dec 20, 2024' + } + ], + FaqSectionForm: [ + { + id: 1, + title: 'How to Get Started', + description: 'Step-by-step guide for new users to begin using our platform', + image: 'https://images.unsplash.com/photo-1522202176988-66273c2fd55f?w=400&h=300&fit=crop', + active: true, + priority: 'high', + date: 'Dec 20, 2024' + } + ], + FooterForm: [ + { + id: 1, + title: 'Main Footer', + description: 'Primary footer with contact information and links', + image: 'https://images.unsplash.com/photo-1557804506-669a67965ba0?w=400&h=300&fit=crop', + active: true, + priority: 'medium', + date: 'Dec 19, 2024' + } + ], + HeroSectionForm: [ + { + id: 1, + title: 'Support the Environment', + description: 'Environmental conservation through waste management, and sustainable practices for a better future.', + image: 'https://images.unsplash.com/photo-1542601906990-b4d3fb778b09?w=400&h=300&fit=crop', + active: true, + priority: 'medium', + date: 'Dec 19, 2024' + }, + { + id: 2, + title: 'Water, Sanitation & Hygiene', + description: 'Providing clean water access, sanitation facilities, hygiene education to improve community health and wellbeing.', + image: 'https://images.unsplash.com/photo-1559027615-cd4628902d4a?w=400&h=300&fit=crop', + active: true, + priority: 'high', + date: 'Dec 18, 2024' + } + ], + OfferingsForm: [ + { + id: 1, + title: 'Digital Transformation', + description: 'Comprehensive digital solutions to modernize your business operations and enhance customer experience.', + image: 'https://images.unsplash.com/photo-1551434678-e076c223a692?w=400&h=300&fit=crop', + active: true, + priority: 'high', + date: 'Dec 18, 2024' + }, + { + id: 2, + title: 'Cloud Infrastructure', + description: 'Scalable cloud solutions for secure data storage, processing, and seamless business operations.', + image: 'https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=400&h=300&fit=crop', + active: true, + priority: 'medium', + date: 'Dec 17, 2024' + } + ], + TrendingAppsForm: [ + { + id: 1, + name: 'PozoPay', + description: 'Secure mobile payment solution with advanced encryption and fraud protection.', + icon: 'https://images.unsplash.com/photo-1563013544-824ae1b704d3?w=100&h=100&fit=crop', + category: 'Finance', + rating: 4.8, + downloads: '1.2M', + status: 'active', + priority: 'high', + date: 'Dec 22, 2024' + }, + { + id: 2, + name: 'SmartInventory', + description: 'AI-powered inventory management system with real-time tracking and analytics.', + icon: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=100&h=100&fit=crop', + category: 'Business', + rating: 4.6, + downloads: '850K', + status: 'active', + priority: 'medium', + date: 'Dec 21, 2024' + }, + { + id: 3, + name: 'HealthTracker', + description: 'Comprehensive health monitoring app with wearable device integration.', + icon: 'https://images.unsplash.com/photo-1559757175-0eb30cd8c063?w=100&h=100&fit=crop', + category: 'Health', + rating: 4.9, + downloads: '2.1M', + status: 'active', + priority: 'high', + date: 'Dec 20, 2024' + } + ], + AppDemo: [ + { + id: 1, + title: 'Product Demo Video', + description: 'Comprehensive demonstration of our latest product features and capabilities', + image: 'https://images.unsplash.com/photo-1574717024653-61fd2cf4d44d?w=400&h=300&fit=crop', + active: true, + priority: 'high', + date: 'Dec 19, 2024' + } + ] + }) + + const addItem = (sectionKey, item) => { + setSectionData(prev => ({ + ...prev, + [sectionKey]: [...prev[sectionKey], { ...item, id: Date.now() }] + })) + } + + const updateItem = (sectionKey, itemId, updatedItem) => { + setSectionData(prev => ({ + ...prev, + [sectionKey]: prev[sectionKey].map(item => + item.id === itemId ? { ...item, ...updatedItem } : item + ) + })) + } + + const deleteItem = (sectionKey, itemId) => { + setSectionData(prev => ({ + ...prev, + [sectionKey]: prev[sectionKey].filter(item => item.id !== itemId) + })) + } + + const toggleItemStatus = (sectionKey, itemId) => { + setSectionData(prev => ({ + ...prev, + [sectionKey]: prev[sectionKey].map(item => + item.id === itemId ? { ...item, active: !item.active } : item + ) + })) + } + + const updateSectionData = (sectionKey, newData) => { + setSectionData(prev => ({ + ...prev, + [sectionKey]: newData + })) + } + + const value = { + sectionData, + addItem, + updateItem, + deleteItem, + toggleItemStatus, + updateSectionData + } + + return ( + + {children} + + ) +} diff --git a/src/AdminPanel/AdminPanelForms/AppDemo.jsx b/src/AdminPanel/AdminPanelForms/AppDemo.jsx new file mode 100644 index 0000000..4e358b3 --- /dev/null +++ b/src/AdminPanel/AdminPanelForms/AppDemo.jsx @@ -0,0 +1,280 @@ +import React, { useState, useEffect } from 'react' +import { Popconfirm, message } from 'antd' +import { useAdminPanel } from '../AdminPanelContext' +import { DefaultModal } from '../../Components/Modal/DefaultModal' +import "../Styles/AppDemo.scss" + +const AppDemo = () => { + const { sectionData, updateSectionData } = useAdminPanel() + const videoData = sectionData.AppDemo || [] + const [isModalOpen, setIsModalOpen] = useState(false) + const [title, setTitle] = useState('') + const [file, setFile] = useState(null) + const [editingIndex, setEditingIndex] = useState(-1) + const [fileError, setFileError] = useState('') + const [previewUrls, setPreviewUrls] = useState(new Map()) + + useEffect(() => { + return () => { + previewUrls.forEach(url => URL.revokeObjectURL(url)) + } + }, []) + + const openModal = () => { + setIsModalOpen(true) + } + + const closeModal = () => { + // Clean up preview URL + const prevUrl = previewUrls.get('preview') + if (prevUrl) { + URL.revokeObjectURL(prevUrl) + setPreviewUrls(new Map(previewUrls.delete('preview'))) + } + + setIsModalOpen(false) + setTitle('') + setFile(null) + setEditingIndex(-1) + setFileError('') + } + + const handleClear = () => { + setTitle('') + setFile(null) + setFileError('') + } + + const handleFileChange = (e) => { + const selectedFile = e.target.files[0] + if (selectedFile) { + // Clean up previous preview URL + const prevUrl = previewUrls.get('preview') + if (prevUrl) URL.revokeObjectURL(prevUrl) + + // Create new preview URL + const newUrl = URL.createObjectURL(selectedFile) + setPreviewUrls(new Map(previewUrls.set('preview', newUrl))) + + setFile(selectedFile) + if (fileError) setFileError('') + if (!title) { + setTitle(selectedFile.name.replace(/\.[^/.]+$/, '')) + } + } + } + + const handleSave = () => { + if (!file) { + setFileError('Video file is required') + message.error('Please select a video file') + return + } + setFileError('') + + const newVideo = { + id: editingIndex >= 0 ? videoData[editingIndex].id : Date.now(), + title: title.trim() || file.name, + file: file, + active: true, + createdAt: editingIndex >= 0 ? videoData[editingIndex].createdAt : new Date().toLocaleDateString() + } + + if (editingIndex >= 0) { + const updatedVideos = videoData.map((video, index) => index === editingIndex ? newVideo : video) + updateSectionData('AppDemo', updatedVideos) + setEditingIndex(-1) + message.success('Video updated!') + } else { + updateSectionData('AppDemo', [...videoData, newVideo]) + message.success('Video added!') + } + + closeModal() + } + + const handleDelete = (index) => { + const updatedVideos = videoData.filter((_, i) => i !== index) + updateSectionData('AppDemo', updatedVideos) + message.success('Video deleted') + } + + const handleEdit = (index) => { + const video = videoData[index] + setTitle(video.title) + setFile(video.file) + setEditingIndex(index) + openModal() + } + + const handleToggleActive = (index) => { + const updated = [...videoData] + updated[index].active = !updated[index].active + updateSectionData('AppDemo', updated) + message.success('Status updated') + } + + return ( +
+ {/* Header Section */} +
+
+ {/*
+ 🎥 +
*/} +
+

Video Management

+

Manage and organize your video content.

+
+
+ +
+ + {/* Tab Navigation */} +
+
+ + +
+
+
+ +
+
+ + +
+
+
+ + {/* Content Area */} + {videoData.length > 0 ? ( +
+
+ {videoData.map((video, index) => ( +
+
+

{video.title || video.file?.name || 'Untitled Video'}

+
+ + handleDelete(index)} + okText="Yes" + cancelText="No" + > + + + +
+
+
+
+ {video.file instanceof File ? ( + + ) : ( +
Video not available
+ )} +
+

Created: {video.date || video.createdAt}

+

+ Status: {video.active ? 'Active' : 'Inactive'} +

+
+
+ ))} +
+
+ ) : ( +
+
+ 🎥 +
+

No Videos Found

+

Get started by uploading your first video

+
+ )} + + {/* Modal */} + = 0 ? 'Edit Video' : 'Upload New Video'} + handleCancel={closeModal} + handleSubmit={handleSave} + buttonText={editingIndex >= 0 ? 'Update Video' : 'Add Video'} + width={600} + destroyOnClose={true} + > +
+
+ + setTitle(e.target.value)} + placeholder='Enter video title' + autoFocus + /> +
+ +
+ + + {fileError && {fileError}} + {file && file instanceof File && ( +
+

Selected: {file.name}

+ +
+ )} +
+ +
+ + + +
+
+
+
+ ) +} + +export default AppDemo diff --git a/src/AdminPanel/AdminPanelForms/BannerSectionForm.jsx b/src/AdminPanel/AdminPanelForms/BannerSectionForm.jsx new file mode 100644 index 0000000..629d95c --- /dev/null +++ b/src/AdminPanel/AdminPanelForms/BannerSectionForm.jsx @@ -0,0 +1,259 @@ +import React, { useState } from 'react' +import { Popconfirm, message } from 'antd' +import { useAdminPanel } from '../AdminPanelContext' +import { DefaultModal } from '../../Components/Modal/DefaultModal' +import "../Styles/BannerSectionForm.scss" + +const BannerSectionForm = () => { + const { sectionData, updateSectionData } = useAdminPanel() + const bannerData = sectionData.BannerSectionForm || [] + const [isModalOpen, setIsModalOpen] = useState(false) + const [title, setTitle] = useState('') + const [description, setDescription] = useState('') + const [editingIndex, setEditingIndex] = useState(-1) + const [titleError, setTitleError] = useState('') + const [descriptionError, setDescriptionError] = useState('') + + const openModal = () => { + setIsModalOpen(true) + } + + const closeModal = () => { + setIsModalOpen(false) + setTitle('') + setDescription('') + setEditingIndex(-1) + setTitleError('') + setDescriptionError('') + } + + const handleClear = () => { + setTitle('') + setDescription('') + setTitleError('') + setDescriptionError('') + } + + const handleSave = () => { + let hasError = false + + if (!title.trim()) { + setTitleError('Title is required') + hasError = true + } else { + setTitleError('') + } + + if (!description.trim()) { + setDescriptionError('Description is required') + hasError = true + } else { + setDescriptionError('') + } + + if (hasError) { + message.error('Please fix the highlighted fields') + return + } + + const newBanner = { + id: editingIndex >= 0 ? bannerData[editingIndex].id : Date.now(), + title: title.trim(), + description: description.trim(), + active: true, + createdAt: editingIndex >= 0 ? bannerData[editingIndex].createdAt : new Date().toLocaleDateString() + } + + if (editingIndex >= 0) { + const updatedBanners = bannerData.map((banner, index) => index === editingIndex ? newBanner : banner) + updateSectionData('BannerSectionForm', updatedBanners) + setEditingIndex(-1) + message.success('Banner updated!') + } else { + updateSectionData('BannerSectionForm', [...bannerData, newBanner]) + message.success('Banner added!') + } + + closeModal() + } + + + + const handleDelete = (index) => { + const updatedBanners = bannerData.filter((_, i) => i !== index) + updateSectionData('BannerSectionForm', updatedBanners) + message.success('Banner deleted') + } + + const handleEdit = (index) => { + const banner = bannerData[index] + setTitle(banner.title) + setDescription(banner.description) + setEditingIndex(index) + openModal() + } + + const handleToggleActive = (index) => { + const updated = [...bannerData] + updated[index].active = !updated[index].active + updateSectionData('BannerSectionForm', updated) + message.success('Status updated') + } + + return ( +
+ {/* Header Section */} +
+
+ {/*
+ 🏷️ +
*/} +
+

Banner Management

+

Manage and organize your banner content and settings.

+
+
+ +
+ + {/* Tab Navigation */} +
+
+ + +
+
+
+ +
+
+ + +
+
+
+ + {/* Content Area */} + {bannerData.length > 0 ? ( +
+
+ {bannerData.map((banner, index) => ( +
+
+

{banner.title}

+
+ + handleDelete(index)} + okText="Yes" + cancelText="No" + > + + + +
+
+
+

Description: {banner.description || 'No description'}

+

Created: {banner.date || banner.createdAt}

+

+ Status: {banner.active ? 'Active' : 'Inactive'} +

+
+
+ ))} +
+
+ ) : ( +
+
+ 🏷️ +
+

No Banners Found

+

Get started by creating your first banner

+
+ )} + + {/* Modal */} + = 0 ? 'Edit Banner' : 'Create New Banner'} + handleCancel={closeModal} + handleSubmit={handleSave} + buttonText={editingIndex >= 0 ? 'Update Banner' : 'Add Banner'} + width={700} + destroyOnClose={true} + > +
+
+ + { + setTitle(e.target.value) + if (titleError) setTitleError('') + }} + placeholder='Enter banner title' + className={titleError ? 'error' : ''} + autoFocus + /> + {titleError && {titleError}} +
+ +
+ + +
+ `; + + const input = wrapper.querySelector('.header-input'); + const select = wrapper.querySelector('.header-level'); + const hint = wrapper.querySelector('.seo-hint'); + + const autoResize = () => { + input.style.height = 'auto'; + input.style.height = (input.scrollHeight || 47) + 'px'; + }; + + const updateStyle = () => { + const level = parseInt(select.value); + const fontSize = level === 1 ? '32px' : level === 2 ? '24px' : level === 3 ? '18px' : '16px'; + input.style.fontSize = fontSize; + autoResize(); + + // SEO hints + const hints = { + 1: '⚠️ Use only one H1 per page', + 2: '✅ Great for main sections', + 3: '📝 Perfect for subsections', + 4: '📄 For minor headings' + }; + hint.textContent = hints[level] || ''; + }; + + select.addEventListener('change', updateStyle); + input.addEventListener('input', autoResize); + updateStyle(); + autoResize(); + + this.wrapper = wrapper; + return wrapper; + } + + save(blockContent) { + const input = blockContent.querySelector('.header-input'); + const select = blockContent.querySelector('.header-level'); + + return { + text: input.value, + level: parseInt(select.value) + }; + } + + static get sanitize() { + return { + text: {}, + level: false + }; + } +} \ No newline at end of file diff --git a/src/editor/tools/Bookmark.jsx b/src/editor/tools/Bookmark.jsx new file mode 100644 index 0000000..cc96e59 --- /dev/null +++ b/src/editor/tools/Bookmark.jsx @@ -0,0 +1,287 @@ +import axios from "axios"; +import CryptoJS from "crypto-js"; +import { getSession } from "../../Services/others"; // your session util + +const mainDirectory = import.meta.env.ENV_MAIN_BASE_URL +const commonAPIUrl = import.meta.env.ENV_API_URL + +export default class Bookmark { + constructor({ data } = {}) { + this.data = data || {}; + this.wrapper = null; + } + + /** Fetch SEO data for external URLs */ + async fetchSEOData(url) { + try { + const proxyUrl = `https://api.codetabs.com/v1/proxy?quest=${encodeURIComponent(url)}`; + const response = await fetch(proxyUrl); + const html = await response.text(); + + const parser = new DOMParser(); + const doc = parser.parseFromString(html, "text/html"); + + const title = + doc.querySelector('meta[property="og:title"]')?.content || + doc.querySelector('meta[name="twitter:title"]')?.content || + doc.querySelector("title")?.textContent || + new URL(url).hostname; + + const description = + doc.querySelector('meta[property="og:description"]')?.content || + doc.querySelector('meta[name="twitter:description"]')?.content || + doc.querySelector('meta[name="description"]')?.content || + `Visit ${new URL(url).hostname}`; + + const image = + doc.querySelector('meta[property="og:image"]')?.content || + doc.querySelector('meta[name="twitter:image"]')?.content || + ""; + + return { title: title.trim(), description: description.trim(), image, url }; + } catch (error) { + const hostname = new URL(url).hostname; + return { + title: hostname.replace("www.", "").split(".")[0].toUpperCase(), + description: `Visit ${hostname}`, + image: `https://www.google.com/s2/favicons?domain=${hostname}&sz=64`, + url, + }; + } + } + + static get toolbox() { + return { + title: "Bookmark", + icon: '', + description: "Create link previews with title, description and image", + }; + } + + async loadPublishedBlogs(blogSelect) { + try { + const auth = sessionStorage?.getItem('auth'); + const mobileNo = getSession("MobileNo"); + + const response = await axios.get(`${commonAPIUrl}/Blog?request.published=Y`, { + headers: { + Authorization: auth, + MobileNo: mobileNo, + }, + }); + + const blogs = response?.data?.data || []; + blogSelect.innerHTML = ``; + blogs.forEach((blog) => { + + const option = document.createElement("option"); + option.value = `${mainDirectory}/home/blog/${blog?.Slug}` || "#"; + option.dataset.title = blog?.BlogTitle || "Untitled"; + option.dataset.desc = blog?.BlogSubtitle || "No description"; + option.textContent = `📝 ${blog?.BlogTitle}`; + blogSelect.appendChild(option); + }); + + } catch (error) { + console.error("Error fetching blogs:", error); + blogSelect.innerHTML = ``; + } + } + + render() { + const hasData = this.data.title && this.data.url; + + const w = document.createElement("div"); + + if (hasData) { + w.innerHTML = ` + `; + + const card = w.querySelector(".link-preview-card"); + card.onclick = () => window.open(this.data.url, "_blank"); + } else { + w.innerHTML = ` +
+
+
+ + +
+ +
+ +
+ + + + +
+
`; + + const urlInput = w.querySelector(".b-url"); + const previewCard = w.querySelector(".preview-card"); + const tabExternal = w.querySelector(".tab-external"); + const tabInternal = w.querySelector(".tab-internal"); + const externalForm = w.querySelector(".external-form"); + const internalForm = w.querySelector(".internal-form"); + const blogSelect = w.querySelector(".blog-select"); + + this.loadPublishedBlogs(blogSelect); + + // Tab switching + tabExternal.addEventListener("click", () => { + tabExternal.style.background = "#3b82f6"; + tabExternal.style.color = "white"; + tabInternal.style.background = "white"; + tabInternal.style.color = "#64748b"; + externalForm.style.display = "block"; + internalForm.style.display = "none"; + previewCard.style.display = "none"; + }); + + tabInternal.addEventListener("click", () => { + tabInternal.style.background = "#3b82f6"; + tabInternal.style.color = "white"; + tabExternal.style.background = "white"; + tabExternal.style.color = "#64748b"; + externalForm.style.display = "none"; + internalForm.style.display = "block"; + previewCard.style.display = "none"; + }); + + // Blog post selection + blogSelect.addEventListener("change", async (e) => { + const selectedOption = e.target.selectedOptions[0]; + if (!selectedOption.value) return; + + const url = selectedOption.value; + + const previewCard = w.querySelector(".preview-card"); + const titleEl = w.querySelector(".preview-title"); + const descEl = w.querySelector(".preview-desc"); + const urlEl = w.querySelector(".preview-url"); + const imgEl = w.querySelector(".preview-img"); + const placeholder = w.querySelector(".img-placeholder"); + + previewCard.style.display = "flex"; + titleEl.textContent = "Loading SEO data..."; + descEl.textContent = "Please wait..."; + urlEl.textContent = new URL(url).hostname; + + try { + // 🧠 Fetch SEO metadata manually + const seoData = await this.fetchSEOData(url); + + titleEl.textContent = seoData.title; + descEl.textContent = seoData.description; + urlEl.textContent = new URL(url).hostname; + + if (seoData.image) { + imgEl.src = seoData.image; + imgEl.style.display = "block"; + placeholder.style.display = "none"; + } else { + imgEl.style.display = "none"; + placeholder.style.display = "flex"; + } + + // Allow user to open the URL + previewCard.onclick = () => window.open(url, "_blank"); + } catch (err) { + console.error("SEO fetch failed:", err); + titleEl.textContent = selectedOption.dataset.title || "Unknown Title"; + descEl.textContent = selectedOption.dataset.desc || "No description available"; + imgEl.style.display = "none"; + placeholder.style.display = "flex"; + } + }); + + // External link SEO fetching + let debounceTimer; + urlInput.addEventListener("input", (e) => { + const url = e.target.value.trim(); + clearTimeout(debounceTimer); + + if (url && url.match(/^https?:\/\/.+/)) { + const hostname = new URL(url).hostname; + + previewCard.style.display = "flex"; + w.querySelector(".preview-title").textContent = "Loading..."; + w.querySelector(".preview-desc").textContent = "Fetching SEO data..."; + w.querySelector(".preview-url").textContent = hostname; + + debounceTimer = setTimeout(async () => { + try { + const seoData = await this.fetchSEOData(url); + + w.querySelector(".preview-title").textContent = seoData.title; + w.querySelector(".preview-desc").textContent = seoData.description; + w.querySelector(".preview-url").textContent = hostname; + + const img = w.querySelector(".preview-img"); + const placeholder = w.querySelector(".img-placeholder"); + + if (seoData.image) { + img.src = seoData.image; + img.style.display = "block"; + placeholder.style.display = "none"; + } + + previewCard.onclick = () => window.open(url, "_blank"); + } catch { + w.querySelector(".preview-title").textContent = "Failed to load SEO data"; + w.querySelector(".preview-desc").textContent = `Visit ${hostname}`; + } + }, 1500); + } else { + previewCard.style.display = "none"; + } + }); + } + + this.wrapper = w; + return w; + } + + save(el) { + const urlInput = el.querySelector(".b-url"); + const titleEl = el.querySelector(".preview-title"); + const descEl = el.querySelector(".preview-desc"); + const imgEl = el.querySelector(".preview-img"); + + return { + url: urlInput ? urlInput.value : this.data.url || "", + title: titleEl ? titleEl.textContent : this.data.title || "", + description: descEl ? descEl.textContent : this.data.description || "", + image: imgEl ? imgEl.src : this.data.image || "", + }; + } +} diff --git a/src/editor/tools/CTA.js b/src/editor/tools/CTA.js new file mode 100644 index 0000000..393b2a1 --- /dev/null +++ b/src/editor/tools/CTA.js @@ -0,0 +1,32 @@ +export default class CTA { + constructor({ data } = {}) { this.data = data || {}; this.wrapper = null; } + static get toolbox() { return { title: "Call to action", icon: '' }; } + render() { + const w = document.createElement("div"); + w.className = "editor-cta"; + w.innerHTML = ` +
+ + +
+ + + +
+
`; + this.wrapper = w; return w; + } + save(el) { + return { + heading: (el.querySelector(".e-cta-heading") || {}).value || "", + subheading: (el.querySelector(".e-cta-subheading") || {}).value || "", + buttonText: (el.querySelector(".e-cta-btntext") || {}).value || "", + buttonUrl: (el.querySelector(".e-cta-btnurl") || {}).value || "", + style: (el.querySelector(".e-cta-style") || {}).value || "primary" + }; + } + validate(d) { return (d.heading && d.buttonText && d.buttonUrl); } +} \ No newline at end of file diff --git a/src/editor/tools/Callout.js b/src/editor/tools/Callout.js new file mode 100644 index 0000000..9ee726c --- /dev/null +++ b/src/editor/tools/Callout.js @@ -0,0 +1,21 @@ +export default class Callout { + constructor({ data } = {}) { this.data = data || {}; this.wrapper = null; } + static get toolbox() { return { title: "Callout", icon: '' }; } + render() { + const w = document.createElement("div"); + w.innerHTML = ` +
+
+ + +
+
`; + this.wrapper = w; return w; + } + save(el) { + return { + emoji: (el.querySelector(".e-call-emoji") || {}).value || "💡", + text: (el.querySelector(".e-call-text") || {}).value || "" + }; + } +} diff --git a/src/editor/tools/EmailContent.js b/src/editor/tools/EmailContent.js new file mode 100644 index 0000000..56a0312 --- /dev/null +++ b/src/editor/tools/EmailContent.js @@ -0,0 +1,19 @@ +export default class EmailContent { + constructor({ data } = {}) { this.data = data || {}; this.wrapper = null; } + static get toolbox() { return { title: "Email content", icon: '' }; } + render() { + const w = document.createElement("div"); + w.innerHTML = ` +
+ + +
`; + this.wrapper = w; return w; + } + save(el) { + return { + subject: (el.querySelector(".e-email-subject") || {}).value || "", + bodyHtml: (el.querySelector(".e-email-body") || {}).value || "" + }; + } +} \ No newline at end of file diff --git a/src/editor/tools/InlineLink.js b/src/editor/tools/InlineLink.js new file mode 100644 index 0000000..1d6c652 --- /dev/null +++ b/src/editor/tools/InlineLink.js @@ -0,0 +1,87 @@ +export default class InlineLink { + static get isInline() { + return true; + } + + static get shortcut() { + return 'CMD+SHIFT+L'; + } + + static get sanitize() { + return { + a: { + href: true, + target: '_blank', + rel: 'noopener noreferrer' + } + }; + } + + constructor({ api }) { + this.api = api; + this.button = null; + this.state = false; + } + + render() { + this.button = document.createElement('button'); + this.button.type = 'button'; + this.button.innerHTML = ''; + this.button.classList.add('ce-inline-tool'); + + return this.button; + } + + surround(range) { + if (this.state) { + this.unwrap(range); + return; + } + + this.wrap(range); + } + + wrap(range) { + const selectedText = range.extractContents(); + const url = prompt('Enter URL:', 'https://'); + + if (url && url !== 'https://') { + const link = document.createElement('a'); + link.href = url; + link.target = '_blank'; + link.rel = 'noopener noreferrer'; + link.appendChild(selectedText); + + range.insertNode(link); + + this.api.selection.expandToTag(link); + } else { + range.insertNode(selectedText); + } + } + + unwrap(range) { + const link = this.api.selection.findParentTag('A'); + const text = range.extractContents(); + + link.remove(); + range.insertNode(text); + } + + checkState() { + const link = this.api.selection.findParentTag('A'); + this.state = !!link; + + if (this.state) { + this.button.classList.add('ce-inline-tool--active'); + } else { + this.button.classList.remove('ce-inline-tool--active'); + } + + return this.state; + } + + static get title() { + return 'Link'; + } +} \ No newline at end of file diff --git a/src/editor/tools/Separator.js b/src/editor/tools/Separator.js new file mode 100644 index 0000000..08f90bf --- /dev/null +++ b/src/editor/tools/Separator.js @@ -0,0 +1,60 @@ +export default class Separator { + constructor({ data } = {}) { + this.data = data || {}; + } + + static get toolbox() { + return { title: "Separator", icon: '' }; + } + + render() { + const wrapper = document.createElement("div"); + wrapper.innerHTML = ` +
+ +
+ ${this.getPreview(this.data.style || 'line')} +
+
+ `; + + const select = wrapper.querySelector('.separator-style'); + const preview = wrapper.querySelector('.separator-preview'); + + select.addEventListener('change', (e) => { + preview.innerHTML = this.getPreview(e.target.value); + }); + + return wrapper; + } + + getPreview(style) { + switch (style) { + case 'dots': + return '
• • •
'; + case 'stars': + return '
★ ★ ★
'; + case 'space': + return '
'; + case 'line': + default: + return '
'; + } + } + + save(blockContent) { + const select = blockContent.querySelector('.separator-style'); + return { + style: select ? select.value : 'line' + }; + } + + static get isReadOnlySupported() { + return true; + } +} \ No newline at end of file diff --git a/src/editor/tools/SimpleLink.js b/src/editor/tools/SimpleLink.js new file mode 100644 index 0000000..f8d3334 --- /dev/null +++ b/src/editor/tools/SimpleLink.js @@ -0,0 +1,71 @@ +export default class SimpleLink { + constructor({ data } = {}) { + this.data = data || {}; + } + + static get toolbox() { + return { title: 'Link', icon: '' }; + } + + render() { + const wrapper = document.createElement('div'); + wrapper.innerHTML = ` +
+ + +
+ +
+ +
+ `; + + const textInput = wrapper.querySelector('.link-text'); + const urlInput = wrapper.querySelector('.link-url'); + const targetInput = wrapper.querySelector('.link-target'); + const preview = wrapper.querySelector('.preview-text'); + + const updatePreview = () => { + const text = textInput.value || 'Link text'; + const url = urlInput.value || '#'; + preview.innerHTML = `${text}`; + }; + + textInput.addEventListener('input', updatePreview); + urlInput.addEventListener('input', updatePreview); + updatePreview(); + + return wrapper; + } + + save(blockContent) { + const textInput = blockContent.querySelector('.link-text'); + const urlInput = blockContent.querySelector('.link-url'); + const targetInput = blockContent.querySelector('.link-target'); + + return { + text: textInput.value, + url: urlInput.value, + target: targetInput.checked ? '_blank' : '_self' + }; + } + + validate(data) { + return data.text && data.url; + } +} \ No newline at end of file diff --git a/src/editor/tools/TableOfContents.js b/src/editor/tools/TableOfContents.js new file mode 100644 index 0000000..7ae3c89 --- /dev/null +++ b/src/editor/tools/TableOfContents.js @@ -0,0 +1,83 @@ +export default class TableOfContents { + constructor({ data, api } = {}) { + this.data = data || {}; + this.api = api; + this.wrapper = null; + } + + static get toolbox() { + return { title: "Index", icon: '' }; + } + + render() { + const w = document.createElement("div"); + w.innerHTML = ` +
+
+
+ 📑 Table of Contents + +
+ +
+ ${this.generatePreview()} +
+
+
`; + + const generateBtn = w.querySelector('.i-generate'); + generateBtn.addEventListener('click', () => { + this.generateFromContent(); + }); + + this.wrapper = w; + return w; + } + + generatePreview() { + if (!this.data.items || this.data.items.length === 0) { + return 'Click Generate to create index from bookmarks and headings'; + } + + const style = this.data.style || 'numbered'; + const listItems = this.data.items.map((item, i) => { + const prefix = style === 'numbered' ? `${i + 1}. ` : '• '; + return `
${prefix}${item.title}
`; + }).join(''); + + return listItems; + } + + generateFromContent() { + if (!this.api) return; + + const blocks = this.api.blocks.getBlocksCount(); + const items = []; + + for (let i = 0; i < blocks; i++) { + const block = this.api.blocks.getBlockByIndex(i); + const blockData = block.save(); + + if (blockData.tool === 'header' && blockData.data.text) { + const anchor = blockData.data.text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''); + items.push({ title: blockData.data.text, anchor }); + } else if (blockData.tool === 'bookmark' && blockData.data.title && blockData.data.anchor) { + items.push({ title: blockData.data.title, anchor: blockData.data.anchor }); + } + } + + this.data.items = items; + const preview = this.wrapper.querySelector('.i-preview'); + preview.innerHTML = this.generatePreview(); + } + + save(el) { + return { + style: (el.querySelector(".i-style") || {}).value || "numbered", + items: this.data.items || [] + }; + } +} \ No newline at end of file diff --git a/src/editor/tools/Video.js b/src/editor/tools/Video.js new file mode 100644 index 0000000..179d995 --- /dev/null +++ b/src/editor/tools/Video.js @@ -0,0 +1,40 @@ +export default class Video { + constructor({ data } = {}) { + this.data = data || {}; + this.wrapper = null; + } + + static get toolbox() { + return { title: "Video", icon: '' }; + } + + render() { + const w = document.createElement("div"); + w.innerHTML = ` +
+
+ + +
+ + +
+
+
`; + this.wrapper = w; + return w; + } + + save(el) { + return { + url: (el.querySelector(".v-url") || {}).value || "", + caption: (el.querySelector(".v-caption") || {}).value || "", + autoplay: (el.querySelector(".v-autoplay") || {}).checked || false, + controls: (el.querySelector(".v-controls") || {}).checked !== false + }; + } +} \ No newline at end of file diff --git a/src/editor/tools/index.js b/src/editor/tools/index.js new file mode 100644 index 0000000..c40dd5c --- /dev/null +++ b/src/editor/tools/index.js @@ -0,0 +1,9 @@ +export { default as Callout } from './Callout.js'; +export { default as CTA } from './CTA.js'; +export { default as EmailContent } from './EmailContent.js'; +export { default as Separator } from './Separator.js'; +export { default as BetterHeader } from './BetterHeader.js'; +export { default as SimpleLink } from './SimpleLink.js'; +export { default as Bookmark } from './Bookmark.jsx'; +export { default as Video } from './Video.js'; +export { default as TableOfContents } from './TableOfContents.js'; \ No newline at end of file diff --git a/src/features/ActivationKeyGeneration/ActivationkeyGeneration.js b/src/features/ActivationKeyGeneration/ActivationkeyGeneration.js new file mode 100644 index 0000000..255c6ee --- /dev/null +++ b/src/features/ActivationKeyGeneration/ActivationkeyGeneration.js @@ -0,0 +1,51 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; + +export const getActiveAppCompanyData = createAsyncThunk('appAccess/getActiveAppCompanyData', async (AppId) => { + + return await axiosInstanceData.get(`/appAccess?AppId=${AppId?.AppId}`) + +}); + +export const getActiveBranchData = createAsyncThunk('appAccess/getActiveBranchData', async ({AppId,CompId}) => { + + return await axiosInstanceData.get(`/appAccess?AppId=${AppId}&CompId=${CompId}`) + +}); + +export const getAppCompanyDataUsers = createAsyncThunk('appAccess/getAppCompanyData', async ({AppId,CompId,BranchId}) => { + return await axiosInstanceData.get(`/appAccess?AppId=${AppId}&CompId=${CompId}&BranchId=${BranchId}`) + +}); + +//---changes Due To All Users Needed Including the Admin + +export const getBranchBasedUsers = createAsyncThunk('appAccess/getAppCompanyData', async ({Type,BranchId}) => { + return await axiosInstanceData.get(`/login?Type=${Type}&BranchId=${BranchId}`) + +}); + +export const ActivationKeyGenerationpost = createAsyncThunk('ActivationKeyGeneration', async (PostData) => { + return await axiosInstanceData.post(`/UserKeyGeneration`,PostData) +}); + +export const getActivationKeyGeneration = createAsyncThunk('getActivationKeyGeneration', async () => { + return await axiosInstanceData.get(`/UserKeyGeneration`) +}); + +export const getConfigNames = createAsyncThunk('configMaster/getConfigNames', async ({TypeName}) => { + if(TypeName != null && TypeName != undefined){ + return await axiosInstanceData.get(`/configMaster?TypeName=${TypeName}`); + } +}) + +export const ActivationKeyGenerationput = createAsyncThunk('ActivationKeyGenerationput',async(Putdata) =>{ + return await axiosInstanceData.put(`/UserKeyGeneration`,Putdata) +}) + +export const ActivationKeyGenerationdelete = createAsyncThunk('ActivationKeyGenerationdelete',async(Deletedata) =>{ + return await axiosInstanceData.delete(`/UserKeyGeneration?UniqueId=${Deletedata?.UniqueId}&ActiveStatus=${Deletedata?.ActiveStatus}&Reason=${Deletedata.Reason}&updatedBy=${Deletedata.updatedBy}`) +}) \ No newline at end of file diff --git a/src/features/AdminPanel/AdminPanel.js b/src/features/AdminPanel/AdminPanel.js new file mode 100644 index 0000000..ef1e714 --- /dev/null +++ b/src/features/AdminPanel/AdminPanel.js @@ -0,0 +1,42 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import { axiosInstanceData, axiosRetailInstanceData } from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; + +export const postAdminPanel = createAsyncThunk('adminPanel/postAdminPanel', async (data) => { + return await axiosInstanceData.post(`/HomePage`, data) +}) + +export const putAdminPanel = createAsyncThunk('adminPanel/putAdminPanel', async (data) => { + return await axiosInstanceData.put(`/HomePage`, data) +}) + +export const getAdminPanel = createAsyncThunk('adminPanel/getAdminPanel', async ({ sectionName }) => { + if (sectionName !== null && sectionName !== undefined) { + return await axiosInstanceData.get(`/HomePage?SectionName=${sectionName}`) + } +}) + +// const initialState = { +// 'breadCrumb': [] +// } + +// const centerPageSlice = createSlice({ +// name: 'centerPage', +// initialState, +// reducers: { +// changeBreadCrumb: (state, action) => { +// const { items } = action?.payload +// state.breadCrumb = items +// }, +// emptyBreadCrumb: (state, action) => { +// state.breadCrumb = [] +// } +// } +// }) + +// export const { changeBreadCrumb, emptyBreadCrumb } = centerPageSlice.actions; + +// export const breadCrumbSelector = state => state.centerPage?.breadCrumb; + +// export default centerPageSlice.reducer; \ No newline at end of file diff --git a/src/features/ApplicationPreferenceMapping/applicationPreference.js b/src/features/ApplicationPreferenceMapping/applicationPreference.js new file mode 100644 index 0000000..2a3abb3 --- /dev/null +++ b/src/features/ApplicationPreferenceMapping/applicationPreference.js @@ -0,0 +1,19 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import { axiosInstanceData } from "../AuthenticationTokens/AuthenticationToken"; + +export const postapplicationPrefernce = createAsyncThunk( + "applicationPrefernce/postapplicationPrefernce", + async (postData) => { + return await axiosInstanceData.post( + `/ApplicationPreferenceMapping`, + postData + ); + } +); +export const getapplicationPrefernce = createAsyncThunk( + "applicationPrefernce/postapplicationPrefernce", + async () => { + return await axiosInstanceData.get(`/ApplicationPreferenceMapping`); + } +); diff --git a/src/features/AuthenticationTokens/AuthenticationToken.js b/src/features/AuthenticationTokens/AuthenticationToken.js new file mode 100644 index 0000000..1dba8f4 --- /dev/null +++ b/src/features/AuthenticationTokens/AuthenticationToken.js @@ -0,0 +1,169 @@ +import axios from "axios"; +import { getSession, clearSession, TokendecryptedValuesFun } from "../../Services/others"; + +const apiUrl = import.meta.env.ENV_API_URL; +const ApiUrlRetail = import.meta.env.ENV_API_URL_RETAIL; + + +const subDirectory = import.meta.env.BASE_URL; +const EmailApiUrl = import.meta.env.ENV_EMAIL_API; + + + +const axiosInstance = axios.create({ + baseURL: apiUrl, +}); + +const axiosRetailInstance = axios.create({ + baseURL: ApiUrlRetail, +}); + + +const axiosInstanceEMAIL_SMS = axios.create({ + baseURL: EmailApiUrl, +}); + +const getToken = () => { + return new Promise((resolve) => { + let token = sessionStorage.getItem("auth"); + + if (token) { + resolve(token); + } else { + const tokenInterval = setInterval(() => { + token = sessionStorage.getItem("auth"); + if (token) { + clearInterval(tokenInterval); + resolve(token); + } + }, 100); + } + }); +}; + +const addAuthHeader = async (config) => { + + const token = await getToken(); + + if (token) { + config.headers["Authorization"] = `Bearer ${token}`; + } + + let encryptedMobileno = sessionStorage.getItem("MobileNo"); + let encryptedSessionId = sessionStorage.getItem("SessionId"); + + + let Mobileno = encryptedSessionId + ? TokendecryptedValuesFun(encryptedMobileno) + : "1000000001"; + + + config.headers["Mobileno"] = Mobileno != null && Mobileno != undefined ? Mobileno : "1000000001"; + console.log("addAuthHeader", config) + return config; +}; + +axiosInstance.interceptors.request.use(addAuthHeader, (error) => { + return Promise.reject(error); +}); +axiosInstanceEMAIL_SMS.interceptors.request.use(addAuthHeader, (error) => { + return Promise.reject(error); +}); +axiosRetailInstance.interceptors.request.use(addAuthHeader, (error) => { + console.error('Error in request interceptor:', error); + return Promise.reject(error); +}); +function showNotification(message) { + const notification = document.createElement('div'); + notification.innerText = message; + notification.style.cssText = ` + position: fixed; + top: 10%; + left: 50%; + transform: translate(-50%, -50%); + background-color: #f03e3e; + color: white; + padding: 15px 30px; + border-radius: 8px; + font-family: Arial, sans-serif; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + z-index: 1000; + opacity: 0; + transition: opacity 0.3s ease; + `; + + document.body.appendChild(notification); + + // Show the notification + setTimeout(() => { + notification.style.opacity = 1; + }, 10); + + // Remove the notification after 3 seconds + setTimeout(() => { + notification.style.opacity = 0; + setTimeout(() => notification.remove(), 300); + }, 2000); +} +const responseErrorHandler = async (error) => { + if ((error.response && error.response.status === 401)) { + showNotification("Your session has expired. Please log in again to continue."); + + setTimeout(() => { + if (getSession('UserId')) { + const Generate = "N"; + fetch(`${apiUrl}/Logout`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + "Authorization": sessionStorage.getItem("auth") ? sessionStorage.getItem("auth") : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9", + "Mobileno": getSession('MobileNo') ? getSession('MobileNo') : "1000000001", + }, + body: JSON.stringify({ "UserId": getSession('UserId'), "Generate": Generate, "RequestMode":"DW" }), + }) + .then((response) => { + if (!response.ok) { + throw new Error(`Error: ${response.status}`); + } + return response.json(); + }) + .then((data) => { + if (data?.statusCode === 1) { + clearSession(); + window.location.href = `${subDirectory}`; + } + }) + .catch((error) => { + console.error("Error:", error); + }); + } + // else { + // clearSession(); + // window.location.href = `${subDirectory}`; + // } + }, 2000); + + } + // else { + // alert("An error occurred. Please try again later."); + // } + return Promise.reject(error); +}; + +axiosInstance.interceptors.response.use( + (response) => response, // On success, just return the response + responseErrorHandler // Handle errors +); +axiosInstanceEMAIL_SMS.interceptors.response.use( + (response) => response, // On success, just return the response + responseErrorHandler // Handle errors +); + +axiosRetailInstance.interceptors.response.use( + (response) => response, // On success, just return the response + responseErrorHandler // Handle errors +); + +export const axiosRetailInstanceData = axiosRetailInstance; +export const axiosInstanceData = axiosInstance; +export const axiosInstanceEMAIL_SMSData = axiosInstanceEMAIL_SMS; diff --git a/src/features/Blog/Blog.js b/src/features/Blog/Blog.js new file mode 100644 index 0000000..a23f402 --- /dev/null +++ b/src/features/Blog/Blog.js @@ -0,0 +1,50 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import { axiosInstanceData } from "../AuthenticationTokens/AuthenticationToken"; +import axios from "axios"; +const apiUrl = import.meta.env.ENV_API_URL; +const uploadApiUrl = import.meta.env.ENV_IMAGE_UPLOAD_API_URL; +const axiosInstance = axios.create({ + baseURL: apiUrl, + headers: { + "Content-Type": "application/json", + }, +}); +export const postBlog = createAsyncThunk("blog/postBlog", async (data) => { + return await axiosInstanceData.post("/Blog", data); +}); + +export const putBlog = createAsyncThunk("blog/putBlog", async (data) => { + return await axiosInstanceData.put("/Blog", data); +}); + +export const deleteBlog = createAsyncThunk("blog/deleteBlog", async (data) => { + return await axiosInstanceData.delete( + `/Blog?blogId=${data?.blogId}&activeStatus=${data?.activeStatus + }&updatedBy=${data?.updatedBy || 1}` + ); +}); + +export const getBlog = createAsyncThunk("blog/getBlog", async () => { + return await axiosInstanceData.get("/Blog"); +}); + +export const getPublishedBlogs = createAsyncThunk( + "blog/getPublishedBlogs", + async () => { + return await axiosInstance.get("/Blog?published=Y"); + } +); + +export const getPublishedBlogsBySlug = createAsyncThunk( + "blog/getPublishedBlogs", + async ({ slug }) => { + return await axiosInstance.get(`/Blog?slug=${slug}`); + } +); + +export const postComments = createAsyncThunk( + "blog/postComments", + async (data) => { + return await axiosInstance.post(`/Comments`, data); + } +); diff --git a/src/features/DeviceAppName/Appversion.js b/src/features/DeviceAppName/Appversion.js new file mode 100644 index 0000000..0c84b95 --- /dev/null +++ b/src/features/DeviceAppName/Appversion.js @@ -0,0 +1,34 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +export const getConfigDeviceNames = createAsyncThunk('AppVersion/getConfigNames', async () => { + + return await axiosInstanceData.get(`/configMaster?TypeName=Device App Name`); +}) + + +export const postDeviceVersion = createAsyncThunk('AppVersion/postDeviceVersion', async (postData) => { + + return await axiosInstanceData.post(`/AppVersions`, postData) +}) + + + +export const getDeviceVersion = createAsyncThunk('AppVersion/getDeviceVersion', async () => { + + return await axiosInstanceData.get(`/AppVersions?activeStatus=A`); +}) + + +export const getDeviceVersionManagement = createAsyncThunk('AppVersion/getDeviceVersionManagement', async (values) => { + + return await axiosInstanceData.get(`/AppVersionManagement?appId=${values?.appId}&compId=${values?.compId}&branchId=${values?.branchId}&appType=${values?.appType}`); +}) + +export const AppVersionManagementPost = createAsyncThunk('AppVersion/AppVersionManagementPost', async (putData) => { + + return await axiosInstanceData.put(`/AppVersionManagement`, putData) +}) + + + diff --git a/src/features/EmpRelieve/EmpRelieve.js b/src/features/EmpRelieve/EmpRelieve.js new file mode 100644 index 0000000..912aae4 --- /dev/null +++ b/src/features/EmpRelieve/EmpRelieve.js @@ -0,0 +1,26 @@ +import { createAsyncThunk } from '@reduxjs/toolkit'; +import { axiosRetailInstanceData } from '../AuthenticationTokens/AuthenticationToken'; + +export const getEmpRelieve = createAsyncThunk('Emp/getEmpRelieve', async ({CompId,UserId,AppId,BranchId}) => { + if (CompId != null && CompId != undefined && UserId != null && UserId != undefined && AppId != null && AppId != undefined && BranchId != null && BranchId != undefined) { + return await axiosRetailInstanceData.get(`/EmployeeRelieveInfo?appId=${AppId}&compId=${CompId}&branchId=${BranchId}&userId=${UserId}`); + } + } +); + +export const deleteEmpRelieve = createAsyncThunk('Emp/getEmpRelieve', async ({uniqueId,updatedBy,activeStatus}) => { + if (uniqueId != null && uniqueId != undefined && updatedBy != null && updatedBy != undefined && activeStatus != null && activeStatus != undefined ) { + return await axiosRetailInstanceData.delete(`/EmployeeRelieveInfo?uniqueId=${uniqueId}&updatedBy=${updatedBy}&activeStatus=${activeStatus}`); + } + } +); + +export const postEmpRelieve = createAsyncThunk('Emp/postEmpRelieve', async (postData) => { + return await axiosRetailInstanceData.post(`/EmployeeRelieveInfo`,postData); + } +); + +export const putEmpRelieve = createAsyncThunk('Emp/putEmpRelieve', async (putData) => { + return await axiosRetailInstanceData.put(`/EmployeeRelieveInfo`,putData); + } +); \ No newline at end of file diff --git a/src/features/LoyaltySettings/Loyaltysetting.js b/src/features/LoyaltySettings/Loyaltysetting.js new file mode 100644 index 0000000..be96e7a --- /dev/null +++ b/src/features/LoyaltySettings/Loyaltysetting.js @@ -0,0 +1,47 @@ +import axios from "axios"; +import { createAsyncThunk } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +export const getLoyaltyname = createAsyncThunk('Loyaltynamepost/LoyaltySettings',async() => { + return await axiosInstanceData.get('/LoyaltySettings',) +}) + +export const Loyaltynamepost = createAsyncThunk('Loyaltynamepost/LoyaltySettings',async(Postdata) => { + return await axiosInstanceData.post('/LoyaltySettings',Postdata) +}) + +export const Loyaltynameput = createAsyncThunk('Loyaltynamepost/LoyaltySettings',async(Postdata) => { + return await axiosInstanceData.put('/LoyaltySettings',Postdata) +}) + +export const delLoyaltyname = createAsyncThunk('Loyaltynamepost/LoyaltySettings',async(Deletedata) => { + return await axiosInstanceData.delete('/LoyaltySettings',{ params: Deletedata }) +}) + +export const getEmployeerefferal = createAsyncThunk('Employeerefferalpost',async()=>{ + return await axiosInstanceData.get('RefAppCommissions',) +}) + +export const Employeerefferalpost = createAsyncThunk('Employeerefferalpost',async(postData)=>{ + return await axiosInstanceData.post('RefAppCommissions',postData) +}) + +export const Employeerefferalput = createAsyncThunk('Employeerefferalpost',async(Postdata)=>{ + return await axiosInstanceData.put('RefAppCommissions',Postdata) +}) + +export const delEmployeerefferal = createAsyncThunk('Loyaltynamepost/LoyaltySettings',async(Deletedata) => { + return await axiosInstanceData.delete('/RefAppCommissions',{ params: Deletedata }) +}); + +export const RefferedEmployeeList = createAsyncThunk('RefPayments/RefferedEmployeeList',async()=>{ +return await axiosInstanceData.get('/RefPayments/UserList') +}); + +export const getPricingType = createAsyncThunk('getPricingType/getPricingType', async () => { + return await axiosInstanceData.get('/configMaster?TypeName=Payment Type&ActiveStatus=A') +}); + +export const ReferredEmployePayPost = createAsyncThunk('ReferredEmployePayPost',async(PostData)=>{ + return await axiosInstanceData.post('RefPayments',PostData) +}); \ No newline at end of file diff --git a/src/features/LoyaltySettings/sss.js b/src/features/LoyaltySettings/sss.js new file mode 100644 index 0000000..dc36881 --- /dev/null +++ b/src/features/LoyaltySettings/sss.js @@ -0,0 +1,70 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import { axiosInstanceData, axiosInstanceEMAIL_SMSData } from '../AuthenticationTokens/AuthenticationToken'; + + + +export const getPricingType = createAsyncThunk('getPricingType/getPricingType', async (PricingId) => { + if (PricingId != null && PricingId != undefined) { + return await axiosInstanceData.get(`/pricingType?PricingId=${PricingId}`); + } +}); + +export const postInvoice = createAsyncThunk('postInvoice/userAppMap', async (postData) => { + + return await axiosInstanceData.post('/userAppMap', postData) +}) + + +export const postCCAvenuePaymentDetails = createAsyncThunk('postCCAvenuePaymentDetails/payment', async (postData) => { + + return await axiosInstanceData.post('/ccavenuePaymentDetails', postData) +}) + +export const getccavenuePaymentDetails = createAsyncThunk('getccavenuePaymentDetails', async () => { + return await axiosInstanceData.get('/ccavenuePaymentDetails?activeStatus=A') +}) + +export const getPaymentMethod = createAsyncThunk('getPaymentMethod/getPaymentMethod', async () => { + return await axiosInstanceData.get('/ccavenuePaymentDetails'); +}); +// +export const getallplanDtl = createAsyncThunk('getallplanDtl', async (data) => { + if (data?.AppId != null && data?.AppId != undefined && data?.UserId != null && data?.UserId != undefined) { + return await axiosInstanceData.get(`/AllDetailPlanMod?AppId=${data?.AppId}&UserId=${data?.UserId}`); + } +}); + +export const postDowngrade = createAsyncThunk('postDowngrade', async (postData) => { + + return await axiosInstanceData.post('/ModifySubcription', postData) +}) +export const putFeaturechange = createAsyncThunk('putFeaturechange', async (postData) => { + +return await axiosInstanceData.put('/ModifySubcription', postData) +}) + +export const getUsedplandata = createAsyncThunk('getUsedplandata', async (data) => { + if (data.AppId != null && data.AppId != undefined && data.UserId != null && data.UserId != undefined && data.type != null && data.type != undefined) { + return await axiosInstanceData.get(`/UserAppMap?AppId=${data.AppId}&UserId=${data.UserId}&type=${data.type}`) + } +}) + +export const putPaymentMethod = createAsyncThunk('putPaymentMethod/putPaymentMethod', async (putData) => { + return await axiosInstanceData.put('/PaymentSuccess', putData); +}); +export const postEmailApi = createAsyncThunk('postEmailApi/Email', async (postData) => { + + return await axiosInstanceEMAIL_SMSData.post(`/Email`, postData) +}) +export const getEmployeRefferal = createAsyncThunk('getEmployeRefferal',async(data)=>{ + if (data.AppId != null && data.AppId != undefined && data.UserId != null && data.UserId != undefined && data.Type != null && data.Type != undefined) { + + return await axiosInstanceData.get(`/UserAppMap?AppID=${data.AppId}&UserId=${data.UserId}&Type=${data.Type}`) + + } +}) + + +export const getReferaluserdata = createAsyncThunk('getReferaluserdata',async(data)=>{ +return await axiosInstanceData.get(`/User?referralCode=${data.referralCode}`) +}) \ No newline at end of file diff --git a/src/features/MessageTemplates/MessageTemplate.js b/src/features/MessageTemplates/MessageTemplate.js new file mode 100644 index 0000000..3096460 --- /dev/null +++ b/src/features/MessageTemplates/MessageTemplate.js @@ -0,0 +1,44 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + + + +export const getMessagetemplateData = createAsyncThunk('messagetemplates/getBranchData', async () => { + return await axiosInstanceData.get('/messagetemplates') +}) + +export const postMessageTemplates = createAsyncThunk('messagetemplates/postMessageTemplates', async (postData) => { + + return await axiosInstanceData.post('/messagetemplates', postData) +}) + +export const putMessageTemplates = createAsyncThunk('messagetemplates/putMessageTemplates', async (putData) => { + + return await axiosInstanceData.put('/messagetemplates', putData) +}) + +const initialState = { + MessagetemplateData: [] +} + +const messagetemplateSlice = createSlice({ + name:'messagetemplate', + initialState, + extraReducers: builder => { + builder.addCase(getMessagetemplateData.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.MessagetemplateData = action?.payload?.data?.data + } + else { + state.MessagetemplateData = [] + } + + }) + + } + +}) + +export const messagetemplateSelector = state => state.MessageTemplate?.MessagetemplateData +export default messagetemplateSlice.reducer; + diff --git a/src/features/ModuleAccess/moduleAccessApiSlice.js b/src/features/ModuleAccess/moduleAccessApiSlice.js new file mode 100644 index 0000000..f0ecff3 --- /dev/null +++ b/src/features/ModuleAccess/moduleAccessApiSlice.js @@ -0,0 +1,63 @@ +import { createEntityAdapter, createSelector } from "@reduxjs/toolkit"; +import { apiSlice } from '../api/apiSlice'; + +const moduleAccessDataAdapter = createEntityAdapter({ + sortComparer: (a,b) => b?.CreatedDate?.localeCompare(a?.CreatedDate) +}) + +const initialState = moduleAccessDataAdapter.getInitialState() + +const moduleAccessApi = apiSlice.injectEndpoints({ + + endpoints: (builder) => ({ + getStoreData: builder.query({ + query: () => '/company?ActiveStatus=A', + transformResponse: responseData => { + const data = responseData.data?.map((eachData, index) => { + eachData.id = index + return eachData + }) + // let data = [...responseData.data, {"hi": 'hello', CreatedDate: '2022-04-13T23:02:19.248Z'}] + return moduleAccessDataAdapter.setAll(initialState, data) + } + }), + getBranchData: builder.query({ + query: ( storeId ) => `/getBranchMaster?StoreId=${storeId}`, + transformResponse: responseData => { + const result = responseData.data?.map((eachBranch, index) => { + eachBranch.id = index + return eachBranch + }) + + return moduleAccessDataAdapter.setAll(initialState, result) + } + }) + }) + +}) + +export const { useGetStoreDataQuery, useGetBranchDataQuery } = moduleAccessApi; + +const getStoreDataResult = moduleAccessApi.endpoints.getStoreData.select() + +const getStoreDataSelector = createSelector(getStoreDataResult , storeData => storeData.data) + +export const { selectAll: storeDataSelector } = moduleAccessDataAdapter.getSelectors(state => getStoreDataSelector(state) ?? initialState) + +const getBranchDataResult = moduleAccessApi.endpoints.getBranchData.select() + +const getBranchDataSelector = createSelector(getBranchDataResult, branchData => branchData.data) + +export const { selectAll: branchDataSelector, selectEntities: branchDataSelectorData } = moduleAccessDataAdapter.getSelectors(state => getBranchDataSelector(state) ?? initialState) + +// export const selectModuleAccessData = state => { +// const adapterSelectors = moduleAccessDataAdapter.getSelectors(); +// return adapterSelectors.selectAll(state); +// } + + + + + + + diff --git a/src/features/ModuleAccess/moduleAccessSlice.js b/src/features/ModuleAccess/moduleAccessSlice.js new file mode 100644 index 0000000..43312dd --- /dev/null +++ b/src/features/ModuleAccess/moduleAccessSlice.js @@ -0,0 +1,713 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import { axiosInstanceData } from '../AuthenticationTokens/AuthenticationToken'; +import { getSession } from "../../Services/others"; +import axios from "axios"; + +const apiUrl = import.meta.env.ENV_API_URL; + +const initialState = { + selectedRole: getSession("UserType") === 'Admin' ? "Branch Admin" : "Sadmin", + selectedStore: null, + selectedAppName: null, + selectedBranch: null, + selectedApp: null, + selectedUser: null, + selectedEmpdesig: null, + allModules: [], + branchData: [], + appData: [], + userData: [], + AdminData: [], + EmpDesigData: [], + selectedUserData: {}, + selectedModuleBranch: [], + UserId: null, + AppAccess: {}, + CompAccess: {}, + BranchAccess: {}, + AppListData: {}, + CmpListData: {}, + BranchListData: {}, + PostDataValue: [], + // UserCount:null, + // FeatUserCount:null +}; + +export const getBranchDropModule = createAsyncThunk( + "moduleAccess/getBranchDropModule", + async ({ storeId }) => { + if (storeId != null && storeId != undefined) { + return await axiosInstanceData.get(`/branch?CompId=${storeId}`); + } + } +); + +export const getSadminUser = createAsyncThunk( + "moduleAccess/getSadminUser", + async () => { + return await axiosInstanceData.get('/login?Type=Super Admin User'); + } +); + +export const getStoreAdmin = createAsyncThunk( + "moduleAccess/getStoreAdmin", + async ({ storeId }) => { + if (storeId != null && storeId != undefined) { + return await axios.get(`${apiUrl}/company?UserId=${storeId}`); + } + } +); + +export const gettingAdminDropDown = createAsyncThunk( + "moduleAccess/gettingAdminDropDown", + async () => { + return await axiosInstanceData.get('/user?UserType=A'); + } +); + +export const getBranchAdmin = createAsyncThunk( + "moduleAccess/getBranchUser", + async ({ BranchId }) => { + if (BranchId != null && BranchId != undefined) { + return await axiosInstanceData.get(`/login?BranchId=${BranchId}&Type=E`); + } + } +); + +export const getAllModule = createAsyncThunk( + "moduleAccess/getAllModule", + async () => { + return await axiosInstanceData.get('/configMaster?TypeName=Sub Module'); + // return await axios.get(`${config}/getModuleMaster`) + } +); + +export const getAllModuleActive = createAsyncThunk( + "moduleAccess/getAllModule", + async (AdminId) => { + if (AdminId != null && AdminId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UserId=${AdminId}&Type=A`); + } else { + return await axiosInstanceData.get( + '/configMaster?ActiveStatus=A&TypeName=Sub Module' + ); + } + // return await axios.get(`${config}/getModuleMaster?ActiveStatus=A`) + } +); + +export const getUserCount = createAsyncThunk( + "moduleAccess/getUserCount", + async ({ AppId, UserId }) => { + if (AppId != null && AppId != undefined && UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UserId=${UserId}&AppId=${AppId}`) + } + } +); + +export const getUserData = createAsyncThunk( + "moduleAccess/getUserData", + async ({ userId, BranchId }) => { + if (userId != null && userId != undefined && BranchId != null && BranchId != undefined) { + return await axiosInstanceData.get(`/login?UserId=${userId}&BranchId=${BranchId}`) + } else { + return await axiosInstanceData.get(`/login?UserId=${userId}`); + } + } +); + + +export const getAppDetails = createAsyncThunk( + "moduleAccess/getAppDetails", + async ({ UserId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&Type=AD`); + } + } +); + +export const getCompDetails = createAsyncThunk( + "moduleAccess/getCompDetails", + async ({ UserId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}`); + } + } +); + +export const getUserAppDetails = createAsyncThunk( + "moduleAccess/getUserAppDetails", + async ({ UserId, AppId }) => { + if (UserId != null && UserId != undefined && AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&AppId=${AppId}`); + } + } +); + +export const postGateWayMaster = createAsyncThunk( + "moduleAccess/postGateWayMaster", + async (data) => { + if (data) { + return await axiosInstanceData.post(`/GatewayConfigMaster`, data); + } + } +); + +export const putGateWayMaster = createAsyncThunk( + "moduleAccess/putGateWayMaster", + async (data) => { + if (data) { + return await axiosInstanceData.put(`/GatewayConfigMaster`, data); + } + } +); + +export const getGateWayConfigData = createAsyncThunk( + "moduleAccess/getGateWayConfigData", + async (data) => { + const { ServiceType } = data + if (ServiceType !== null || ServiceType !== undefined) { + return await axiosInstanceData.get(`/GatewayConfigMaster?ServiceType=${ServiceType}&Type=S`); + } + } +); + +export const getActiveUserAppDetails = createAsyncThunk( + "moduleAccess/getActiveUserAppDetails", + async ({ UserId, AppId }) => { + if (UserId != null && UserId != undefined && AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&AppId=${AppId}&ActiveStatus=A`); + } + } +); + +export const getUserAppStoreDetails = createAsyncThunk( + "moduleAccess/getUserAppStoreDetails", + async ({ StoreId, UserId, AppId }) => { + if (StoreId != null && StoreId != undefined && UserId != null && UserId != undefined && AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&AppId=${AppId}&CompId=${StoreId}`); + } + } +); + +export const getActiveUserAppStoreDetails = createAsyncThunk( + "moduleAccess/getActiveUserAppStoreDetails", + async ({ StoreId, UserId, AppId }) => { + if (StoreId != null && StoreId != undefined && UserId != null && UserId != undefined && AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&AppId=${AppId}&CompId=${StoreId}&ActiveStatus=A`); + } + + } +); + +export const getCmpDetails = createAsyncThunk( + "moduleAccess/getCmpDetails", + async ({ AppId, UserId }) => { + if (UserId != null && UserId != undefined && AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppId}&UserId=${UserId}`); + } + else if (AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppId}`); + } + + } +); + +export const getDesigDetails = createAsyncThunk( + "moduleAccess/getDesigDetails", + async ({ AppName, CompId, BranchId }) => { + if (AppName != null && AppName != undefined && CompId != null && CompId != undefined && BranchId != null && BranchId != undefined) { + return await axiosInstanceData.get(`/designation?AppName=${AppName}&CompId=${CompId}&BranchId=${BranchId}`); + } + + } +); +export const getAppDesigDetails = createAsyncThunk( + "moduleAccess/getAppDesigDetails", + async ({ AppId }) => { + if (AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppId}`); + } + + } +); + +export const getDesigUserDetails = createAsyncThunk( + "moduleAccess/getDesigUserDetails", + async ({ AppName, EmpDesig, CompId, BranchId }) => { + if (AppName != null && AppName != undefined && EmpDesig != null && EmpDesig != undefined && CompId != null && CompId != undefined && BranchId != null && BranchId != undefined) { + return await axiosInstanceData.get(`/designation?AppName=${AppName}&EmpDesig=${EmpDesig}&CompId=${CompId}&BranchId=${BranchId}`); + } + + } +); + + + +export const getBranchDetails = createAsyncThunk( + "moduleAccess/getBranchDetails", + async ({ CompId, AppId, UserId }) => { + if (AppId != null && AppId != undefined && UserId != null && UserId != undefined && CompId != null && CompId != undefined) { + return await axiosInstanceData.get(`/appAccess?CompId=${CompId}&AppId=${AppId}&UserId=${UserId}`); + } else if (AppId != null && AppId != undefined && CompId != null && CompId != undefined) { + return await axiosInstanceData.get(`/appAccess?CompId=${CompId}&AppId=${AppId}`); + } + } +); + + + +export const getBranchBasedOnStoreAndType = createAsyncThunk( + "moduleAccess/getBranchBasedOnStoreAndType", + async ({ storeId, BranchType, UserId }) => { + if (BranchType != null && BranchType != undefined && UserId != null && UserId != undefined) { + return await axios.get(`${apiUrl}/application?SubId=${BranchType}&UserId=${UserId}`); + } + else if (BranchType != null && BranchType != undefined) { + return await axios.get(`${apiUrl}/application?SubId=${BranchType}`); + + } + } +); + +export const getBranchBasedOnStoreAndTypeSadmin = createAsyncThunk( + "moduleAccess/getBranchBasedOnStoreAndType", + async ({ BranchType, UserId, Type, BranchId }) => { + if (UserId != null && UserId != undefined && BranchType != null && BranchType != undefined && Type != null && Type != undefined) { + return await axios.get(`${apiUrl}/application?SubId=${BranchType}&UserId=${UserId}&Type=${Type}` + ); + } + + else if (UserId != null && UserId != undefined && BranchType != null && BranchType != undefined && BranchId != null && BranchId != undefined) { + return await axios.get(`${apiUrl}/application?SubId=${BranchType}&UserId=${UserId}&BranchId=${BranchId}` + ); + } + else if (UserId != null && UserId != undefined && BranchType != null && BranchType != undefined) { + return await axios.get(`${apiUrl}/application?SubId=${BranchType}&UserId=${UserId}` + ); + } + else { + return await axios.get(`${apiUrl}/application?SubId=${BranchType}`); + } + } +); + +export const postModuleRights = createAsyncThunk( + "moduleAccess/postModuleRights", + async (postData) => { + + return await axiosInstanceData.post('/appAccess', postData); + } +); +export const postBranchModuleRights = createAsyncThunk( + "moduleAccess/postBranchModuleRights", + async (postData) => { + + return await axiosInstanceData.post('/appAccessBranch', postData); + } +); +export const deleteModuleRights = createAsyncThunk('moduleAccess/deleteModuleRights', async (deleteData) => { + + return await axiosInstanceData.delete('/appAccess', { params: deleteData }) +}) +export const deleteBranchModuleRights = createAsyncThunk('moduleAccess/deleteBranchModuleRights', async (deleteData) => { + + return await axiosInstanceData.delete('/appAccessBranch', { params: deleteData }) +}) + +export const getstoreData = createAsyncThunk( + "moduleAccess/getstoreData", + async (storeId) => { + if (storeId != null && storeId != undefined) { + return await axios.get(`${apiUrl}/company?UserId=${storeId}`); + } + } +); + + + +// export const + +const moduleAccess = createSlice({ + name: "moduleAccess", + initialState, + reducers: { + changeRole: (state, action) => { + const { id } = action?.payload; + state.selectedRole = id; + state.UserId = null; + state.selectedUser = null; + state.AppListData = {}; + state.CmpListData = {}; + state.BranchListData = {}; + }, + changeIntialRole: (state, action) => { + state.selectedRole = getSession("UserType") === 'Admin' ? "Branch Admin" : "Sadmin"; + }, + AddAppList: (state, action) => { + const { AppList } = action?.payload; + state.AppListData = AppList; + }, + + changeUserId: (state, action) => { + state.UserId = action?.payload; + }, + + changeAppAccess: (state, action) => { + state.AppAccess = action?.payload; + }, + + changePostData: (state, action) => { + state.PostDataValue = action?.payload; + }, + + changeCompAccess: (state, action) => { + state.CompAccess = action?.payload; + }, + changeBranchAccess: (state, action) => { + state.BranchAccess = action?.payload; + }, + + changeStore: (state, action) => { + const { storeId } = action?.payload; + state.selectedStore = storeId; + }, + + changeAppName: (state, action) => { + const { AppName } = action?.payload; + state.selectedAppName = AppName; + }, + + changeBranch: (state, action) => { + const { BranchId } = action?.payload; + state.selectedBranch = BranchId; + }, + changeApp: (state, action) => { + const { AppId } = action?.payload; + state.selectedApp = AppId; + }, + changeUser: (state, action) => { + + const { userId } = action?.payload; + state.selectedUser = userId; + }, + + changeEmpDesig: (state, action) => { + const { EmpDesig } = action?.payload; + state.selectedEmpdesig = EmpDesig; + }, + + emptyUserData: (state, action) => { + state.userData = []; + state.EmpDesigData = []; + }, + emptySelectedModule: (state, action) => { + state.selectedModuleBranch = []; + }, + emptyDataList: (state, action) => { + state.AppListData = {}; + state.CmpListData = {}; + state.BranchListData = {}; + }, + emptySelectedModuleBranch: (state, action) => { + state.AppListData = {}; + state.CmpListData = {}; + state.BranchListData = {}; + state.allModules = []; + state.selectedModuleBranch = []; + + }, + emptyModuleBranch: (state, action) => { + state.AppListData = {}; + state.CmpListData = {}; + state.BranchListData = {}; + // state.allModules=[]; + state.selectedModuleBranch = []; + + }, + emptyPostData: (state, action) => { + state.selectedUser = null; + state.selectedApp = null; + state.selectedBranch = null; + state.selectedStore = null; + state.selectedAppName = null; + state.selectedEmpdesig = null; + state.UserId = null; + state.userData = []; + state.EmpDesigData = []; + state.selectedUserData = {}; + state.selectedModuleBranch = []; + state.AppListData = {}; + state.CmpListData = {} + state.BranchListData = {} + state.appData = []; + state.branchData = []; + state.AppAccess = {}; + state.CompAccess = {}; + state.BranchAccess = {}; + state.PostDataValue = []; + + }, + emptySelectedIds: (state, action) => { + state.selectedApp = null; + state.selectedBranch = null; + state.selectedStore = null; + state.selectedEmpdesig = null; + state.selectedUser = null; + state.UserId = null; + }, + getSelectedBranch: (state, action) => { + state.selectedModuleBranch = state.selectedUserData[0]?.ModuleDetails; + }, + updateModuleAccessByModuleTypeId: (state, action) => { + const { AppId } = action?.payload; + + state.selectedModuleBranch = state.selectedModuleBranch.filter( + (eachData) => parseInt(eachData.AppId) != parseInt(AppId) + ); + }, + addModuleAccess: (state, action) => { + state.selectedModuleBranch.push(action?.payload); + }, + updateModuleAccessByBranchId: (state, action) => { + const { BranchId } = action?.payload; + state.selectedModuleBranch = state.selectedModuleBranch.filter( + (eachData) => eachData.AppId != BranchId + ); + }, + removeAppList: (state, action) => { + const { subCat } = action?.payload; + state.AppListData[subCat]?.map((eachApp) => { + + state.CmpListData[eachApp.AppName]?.map((eachCompany) => { + delete state.BranchListData[`${eachApp?.AppName}-${eachCompany?.CompName}`] + }) + delete state.CmpListData[eachApp.AppName] + }) + delete state.AppListData[subCat] + + + + + }, + removeCmpList: (state, action) => { + const { AppName } = action?.payload; + state.CmpListData[AppName]?.map((eachComp) => { + delete state.BranchListData[`${AppName}-${eachComp?.CompName}`] + }) + delete state.CmpListData[AppName] + }, + removeBranchList: (state, action) => { + const { CompName } = action?.payload; + delete state.BranchListData[CompName] + }, + removeBranchAccess: (state, action) => { + const { branchAccessData } = action?.payload; + delete state.BranchAccess[branchAccessData] + }, + removeCompanyAccess: (state, action) => { + const { companyAccessData } = action?.payload; + delete state.CompAccess[companyAccessData] + }, + removeAppAccess: (state, action) => { + const { appAccessData } = action?.payload; + delete state.AppAccess[appAccessData] + }, + + removePostDataValue: (state, action) => { + const postDatas = action?.payload; + if (postDatas.CompId && postDatas.AppId) { + state.PostDataValue.map((deleteData, index) => { + + if (deleteData?.AppId == postDatas.AppId && deleteData?.CompId == postDatas.CompId) { + delete state.PostDataValue[index] + } + }) + + } + + else if (postDatas.AppId) { + state.PostDataValue.map((deleteData, index) => { + if (deleteData?.AppId == postDatas.AppId) { + delete state.PostDataValue[index] + } + }) + } + else if (postDatas.CompId && postDatas.BranchId) { + state.PostDataValue.map((deleteData, index) => { + if (deleteData?.BranchId == postDatas.BranchId && deleteData?.CompId == postDatas.CompId) { + delete state.PostDataValue[index] + } + }) + + } + } + // gettingAdmin : (state, action) => { + // state.AdminData = state.AdminData.filter((eachData) => eachData.ActiveStatus=='A') + // } + }, + extraReducers: (builder) => { + builder.addCase(getBranchDropModule.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.branchData = action?.payload?.data?.data; + } else { + state.branchData = []; + } + }); + + builder.addCase(getAppDetails.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.appData = action?.payload?.data?.data; + } else { + state.appData = []; + } + }); + + builder.addCase(gettingAdminDropDown.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.AdminData = action?.payload?.data?.data; + } else { + state.AdminData = []; + } + }); + + builder.addCase(getDesigUserDetails.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.EmpDesigData = action?.payload?.data?.data; + } else { + state.EmpDesigData = []; + } + }); + + builder.addCase(getSadminUser.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.userData = action?.payload?.data?.data; + } else { + state.userData = []; + } + }); + builder.addCase(getAllModuleActive.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.allModules = action?.payload?.data?.data; + } else { + state.allModules = []; + } + }); + builder.addCase(getStoreAdmin.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.userData = action?.payload?.data?.data; + } else { + state.userData = []; + } + }); + builder.addCase(getBranchAdmin.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.userData = action?.payload?.data?.data; + } else { + state.userData = []; + } + }); + builder.addCase(getUserData.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.selectedUserData = action?.payload?.data?.data; + state.selectedModuleBranch = action?.payload?.data?.data[0]?.ModuleDetails + ? action?.payload?.data?.data[0]?.ModuleDetails + : []; + // .filter( (eachData) => eachData.moduleAccess == 'Y') + } else { + state.selectedUserData = {}; + state.selectedModuleBranch = []; + } + }); + builder.addCase(getBranchBasedOnStoreAndType.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.AppListData[action?.payload?.data?.data[0]['SubCategoryName']] = action?.payload?.data?.data + } + }); + + builder.addCase(getCmpDetails.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.CmpListData[action?.payload?.data?.data[0]['AppName']] = action?.payload?.data?.data + } + }); + + builder.addCase(getBranchDetails.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.BranchListData[`${action?.payload?.data?.data[0]['AppName']}-${action?.payload?.data?.data[0]['CompName']}`] = action?.payload?.data?.data + } + }); + + + + }, +}); + +export const { + changeRole, + changeAppName, + changeStore, + changeBranch, + changeApp, + changeUser, + changeEmpDesig, + emptyUserData, + emptySelectedModule, + emptyPostData, + changeIntialRole, + emptySelectedModuleBranch, + emptyModuleBranch, + emptyDataList, + emptySelectedIds, + updateModuleAccessByModuleTypeId, + addModuleAccess, + updateModuleAccessByBranchId, + changeUserId, + changeAppAccess, + changePostData, + changeCompAccess, + changeBranchAccess, + AddAppList, + removeAppList, + removeCmpList, + removeBranchList, + removePostDataValue, + removeBranchAccess, + removeCompanyAccess, + removeAppAccess, +} = moduleAccess.actions; + + +export const selectRoleSelector = (state) => state.moduleAccess?.selectedRole; +export const selectedStoreSelector = (state) => + state.moduleAccess?.selectedStore; +export const selectedAppNameSelector = (state) => + state.moduleAccess?.selectedAppName; +export const selectedEmpDesigSelector = (state) => + state.moduleAccess?.selectedEmpdesig; +export const selectedBranchIdSelector = (state) => + state.moduleAccess?.selectedBranch; +export const selectedAppIdSelector = (state) => + state.moduleAccess?.selectedApp; +export const selectedUserSelector = (state) => state.moduleAccess?.selectedUser; +export const selectBranchData = (state) => state.moduleAccess?.branchData; +export const selectAppData = (state) => state.moduleAccess?.appData; +export const userDataSelector = (state) => state.moduleAccess?.userData; +export const allModuleSelector = (state) => state.moduleAccess?.allModules; +export const selectedUserDataSelector = (state) => + state.moduleAccess?.selectedUserData; +export const selectedModuleBranchSelector = (state) => + state.moduleAccess?.selectedModuleBranch; +export const gettingAdminSelector = (state) => state.moduleAccess?.AdminData; +export const gettingEmpDesigSelector = (state) => state.moduleAccess?.EmpDesigData; +export const gettingUserId = (state) => state.moduleAccess?.UserId; +export const gettingAppAccess = (state) => state.moduleAccess?.AppAccess; +export const gettingCompAccess = (state) => state.moduleAccess?.CompAccess; +export const gettingBranchAccess = (state) => state.moduleAccess?.BranchAccess; +export const gettingAppListSelector = (state) => state.moduleAccess?.AppListData; +export const gettingCmpListSelector = (state) => state.moduleAccess?.CmpListData; +export const gettingBranchListSelector = (state) => state.moduleAccess?.BranchListData; +export const gettingPostDataValue = (state) => state.moduleAccess?.PostDataValue; +// export const gettingUserCount = (state) => state.moduleAccess?.UserCount; +// export const gettingFeatUserCount = (state) => state.moduleAccess?.FeatUserCount; + +export default moduleAccess.reducer; diff --git a/src/features/Navbar/Navbar.js b/src/features/Navbar/Navbar.js new file mode 100644 index 0000000..ed27c8a --- /dev/null +++ b/src/features/Navbar/Navbar.js @@ -0,0 +1,35 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + + + +export const getNavListData = createAsyncThunk('navbar/getNavlist', async () => { + return await axiosInstanceData.get('/configMaster?ActiveStatus=A&TypeName=Navbar') +}) + + +const initialState = { + Navlist: [] +} + +const getNavListDataSlice = createSlice({ + name:'Navlist', + initialState, + extraReducers: builder => { + builder.addCase(getMessagetemplateData.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.MessagetemplateData = action?.payload?.data?.data + } + else { + state.MessagetemplateData = [] + } + + }) + + } + +}) + +export const NavlistSelector = state => state.Navlist?.Navlist +export default getNavListDataSlice.reducer; + diff --git a/src/features/PaymentPdfPageCommon/paymentPdfPageCommon.jsx b/src/features/PaymentPdfPageCommon/paymentPdfPageCommon.jsx new file mode 100644 index 0000000..a69d32b --- /dev/null +++ b/src/features/PaymentPdfPageCommon/paymentPdfPageCommon.jsx @@ -0,0 +1,37 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +export const getUserMappDetails = createAsyncThunk('getUserMappDetails/getUserMappDetails', async (BookingId) => { + if(BookingId !=null && BookingId !=undefined){ + return await axiosInstanceData.get(`/userAppMap?UniqueId=${BookingId}`); + } + }); + + +const initialState = { + UserMappDetails: [] +} + +const UserMappDetailsSlice = createSlice({ + name:'getUserMappDetails', + initialState, + extraReducers: builder => { + builder.addCase(getUserMappDetails.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.priceData = action?.payload?.data?.data + } + else { + state.UserMappDetails = [] + } + + }) + } + +}) + +export const UserMappDetailsSelector = state => state.UserMappDetails?.UserMappDetails + + + + +export default UserMappDetailsSlice.reducer; \ No newline at end of file diff --git a/src/features/SEO/seo.js b/src/features/SEO/seo.js new file mode 100644 index 0000000..e487db3 --- /dev/null +++ b/src/features/SEO/seo.js @@ -0,0 +1,59 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import { axiosInstanceData } from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; +const uploadApiUrl = import.meta.env.ENV_IMAGE_UPLOAD_API_URL; + +export const postSeo = createAsyncThunk('Seo/postSeo', async (data) => { + return await axiosInstanceData.post('/Seo', data) +}) + +export const putSeo = createAsyncThunk('Seo/putSeo', async (data) => { + return await axiosInstanceData.put('/Seo', data) +}) + +export const getSeo = createAsyncThunk('Seo/getSeo', async ({ PageId }) => { + return await axiosInstanceData.get(`/Seo?pageId=${PageId}`) +}) + +export const getSeoByTitle = createAsyncThunk('Seo/getSeoByTitle', async ({ MetaTitle }) => { + return await axiosInstanceData.get(`/Seo?metaTitle=${MetaTitle}`) +}) + +export const getAllSeo = createAsyncThunk('Seo/getAllSeo', async () => { + return await axiosInstanceData.get(`/Seo`) +}) + +const initialState = { + seoData: [], + loading: false, + error: null +} + +const seoSlice = createSlice({ + name: 'seo', + initialState, + reducers: {}, + extraReducers: (builder) => { + builder + .addCase(getSeo.pending, (state) => { + state.loading = true; + }) + .addCase(getSeo.fulfilled, (state, action) => { + state.loading = false; + state.seoData = action.payload?.data?.data || []; + }) + .addCase(getSeo.rejected, (state, action) => { + state.loading = false; + state.error = action.error.message; + }) + .addCase(postSeo.fulfilled, (state, action) => { + state.loading = false; + }) + .addCase(putSeo.fulfilled, (state, action) => { + state.loading = false; + }); + } +}) + +export default seoSlice.reducer; diff --git a/src/features/SmsCountAssigned/smsCountassign.js b/src/features/SmsCountAssigned/smsCountassign.js new file mode 100644 index 0000000..30141b6 --- /dev/null +++ b/src/features/SmsCountAssigned/smsCountassign.js @@ -0,0 +1,23 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; + + +export const getSMSCount = createAsyncThunk('SMSCount/getSMSCount', async () => { + return await axiosInstanceData.get(`/SMSAssign`) +}) + + +export const postSMSCount = createAsyncThunk('SMSCount/postSMSCount', async (postData) => { + + return await axiosInstanceData.post(`/SMSAssign`, postData) +}) + +export const putSMSCount = createAsyncThunk('SMSCount/putSMSCount', async (putData) => { + + return await axiosInstanceData.put(`/SMSAssign`, putData) +}) + + diff --git a/src/features/api/apiSlice.js b/src/features/api/apiSlice.js new file mode 100644 index 0000000..b6c1bd3 --- /dev/null +++ b/src/features/api/apiSlice.js @@ -0,0 +1,11 @@ +import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' + +const apiUrl = import.meta.env.ENV_API_URL + +export const apiSlice = createApi({ + baseQuery: fetchBaseQuery({baseUrl: apiUrl}), + tagTypes: ['Post', 'User'], + endpoints: builder => ({}) +}) + + diff --git a/src/features/appAccessPage/appAccessPage.js b/src/features/appAccessPage/appAccessPage.js new file mode 100644 index 0000000..d56c5ac --- /dev/null +++ b/src/features/appAccessPage/appAccessPage.js @@ -0,0 +1,106 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; + + +export const getActiveAppCompanyData = createAsyncThunk('appAccess/getActiveAppCompanyData', async (AppAccessData) => { + if (AppAccessData?.AppId != null && AppAccessData?.AppId != undefined && AppAccessData?.UserId != null && AppAccessData?.UserId != undefined) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppAccessData?.AppId}&UserId=${AppAccessData?.UserId}&ActiveStatus=A`) + } + else if (AppAccessData?.AppId != null && AppAccessData?.AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppAccessData?.AppId}`) + } +}) + +export const getActiveAppBranchData = createAsyncThunk('appAccess/getActiveAppBranchData', async (AppAccessData) => { + if (AppAccessData?.AppId != null && AppAccessData?.AppId != undefined && AppAccessData?.UserId != null && AppAccessData?.UserId != undefined && AppAccessData?.CompId != null && AppAccessData?.CompId != undefined) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppAccessData?.AppId}&UserId=${AppAccessData?.UserId}&CompId=${AppAccessData?.CompId}&ActiveStatus=A`) + } +}) + +export const getCompanyData = createAsyncThunk('appAccess/getCompanyData', async ({ CompId }) => { + if (CompId != null && CompId != undefined) { + return await axios.get(`${apiUrl}/company?CompId=${CompId}`) + } +}) +export const getfeatconstrains = createAsyncThunk('getfeatconstrains', async (data) => { + if(data?.AppId != null && data?.AppId != undefined && data?.UserId != null && data?.UserId != undefined && data?.UniqueId != null && data?.UniqueId != undefined && data?.PricingId != null && data?.PricingId != undefined){ + return await axiosInstanceData.get(`/UserAppMap?AppId=${data?.AppId}&UserId=${data?.UserId}&UniqueId=${data?.UniqueId}&PricingId=${data?.PricingId}`); + } +}); + +export const getallplanDtl = createAsyncThunk('getallplanDtl', async (datas) => { + if(datas?.AppId != null && datas?.AppId != undefined && datas?.UserId != null && datas?.UserId != undefined){ + return await axiosInstanceData.get(`/AllDetailPlanMod?AppId=${datas?.AppId}&UserId=${datas?.UserId}`); + + } +}); + +export const postDowngrade = createAsyncThunk('postDowngrade', async (postData) => { + return await axiosInstanceData.post(`/ModifySubcription`, postData) +}) + +export const putFeaturechange = createAsyncThunk('putFeaturechange', async (putData) => { + return await axiosInstanceData.put(`/ModifySubcription`, putData) +}) +export const getAppCompanyData = createAsyncThunk('appAccess/getAppCompanyData', async (AppAccessData) => { +if(AppAccessData?.AppId != null && AppAccessData?.AppId != undefined && AppAccessData?.UserId != null && AppAccessData?.UserId != undefined && AppAccessData?.CompId != undefined && AppAccessData?.CompId != null&& AppAccessData?.BrId != null ) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppAccessData?.AppId}&UserId=${AppAccessData?.UserId}&CompId=${AppAccessData?.CompId}&BrId=${AppAccessData?.BrId} `) +} +else if(AppAccessData?.AppId != null && AppAccessData?.AppId != undefined && AppAccessData?.UserId != null && AppAccessData?.UserId != undefined && AppAccessData?.CompId != undefined && AppAccessData?.CompId != null) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppAccessData?.AppId}&UserId=${AppAccessData?.UserId}&CompId=${AppAccessData?.CompId}`) +} +else if (AppAccessData?.AppId != null && AppAccessData?.AppId != undefined && AppAccessData?.UserId != null && AppAccessData?.UserId != undefined && AppAccessData?.Type !=null) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppAccessData?.AppId}&UserId=${AppAccessData?.UserId}&Type=A`) + } +else if ( AppAccessData?.UserId != null && AppAccessData?.UserId != undefined ) { + return await axiosInstanceData.get(`/appAccess?userId=${AppAccessData?.UserId}`) +} +}) +export const getAppCompanyDataUsers = createAsyncThunk('appAccess/getAppCompanyData', async (AppAccessData) => { + if(AppAccessData?.AppId != null && AppAccessData?.AppId != undefined && AppAccessData?.UserId != null && AppAccessData?.UserId != undefined && AppAccessData?.CompId != undefined && AppAccessData?.CompId != null&& AppAccessData?.BrId != null ) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppAccessData?.AppId}&CompId=${AppAccessData?.CompId}&BranchId=${AppAccessData?.BrId}`) + +} + +}) +const initialState = { + appCompanyData: [], + appBranchData: [], +} + +const appAccessSlice = createSlice({ + name: 'appAccess', + initialState, + extraReducers: builder => { + builder.addCase(getActiveAppCompanyData.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.appCompanyData = action?.payload?.data?.data + } + else { + state.appCompanyData = [] + } + + }) + builder.addCase(getActiveAppBranchData.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.appBranchData = action?.payload?.data?.data + } + else { + state.appBranchData = [] + } + + }) + + + } + +}) + + +export const appCompanyDataSelector = state => state.appAccessPage?.appCompanyData +export const appBranchDataSelector = state => state.appAccessPage?.appBranchData + +export default appAccessSlice.reducer; \ No newline at end of file diff --git a/src/features/appMenu/appMenu.js b/src/features/appMenu/appMenu.js new file mode 100644 index 0000000..e7b318f --- /dev/null +++ b/src/features/appMenu/appMenu.js @@ -0,0 +1,93 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; + + +export const getAppMenu = createAsyncThunk('appMenu/getAppMenu', async (AppId) => { + if(AppId != null && AppId != undefined){ + return await axiosInstanceData.get(`/appMenu?AppId=${AppId}`) + } +}) + +export const getLevelOneMenu = createAsyncThunk('appMenu/getLevelOneMenu', async ({AppId,Level}) => { + if(AppId != null && AppId != undefined && Level != null && Level != undefined){ + return await axiosInstanceData.get(`/appMenu?AppId=${AppId}&Level=${Level}`) + } +}) + +export const getLevelTwoMenu = createAsyncThunk('appMenu/getLevelTwoMenu', async ({AppId,Level,Level1Id}) => { + if(AppId != null && AppId != undefined && Level != null && Level != undefined && Level1Id != null && Level1Id != undefined){ + return await axiosInstanceData.get(`/appMenu?AppId=${AppId}&Level=${Level}&Level1Id=${Level1Id}`) + } +}) + +export const getLevelThreeMenu = createAsyncThunk('appMenu/getLevelThreeMenu', async ({AppId,Level,Level1Id,Level2Id}) => { + if(AppId != null && AppId != undefined && Level != null && Level != undefined && Level1Id != null && Level1Id != undefined && Level2Id != null && Level2Id != undefined){ + return await axiosInstanceData.get(`/appMenu?AppId=${AppId}&Level=${Level}&Level1Id=${Level1Id}&Level2Id=${Level2Id}`) + } +}) + +export const getAppMenuList = createAsyncThunk('appMenu/getAppMenuList', async () => { + return await axiosInstanceData.get(`/appMenu`) +}) + +export const getApplication = createAsyncThunk('appMenu/application', async () => { + return await axios.get(`${apiUrl}/application`) +}) + +export const postAppMenu = createAsyncThunk('appMenu/postCompanyData', async (postData) => { + + return await axiosInstanceData.post(`/appMenu`, postData) +}) + +export const putAppMenu= createAsyncThunk('appMenu/putCompanyData', async (putData) => { + + return await axiosInstanceData.put(`/appMenu`, putData) +}) + +export const deleteAppMenu = createAsyncThunk('appMenu/deleteCompanyData', async (deleteData) => { + if(deleteData?.MenuId && deleteData?.ActiveStatus && deleteData?.UpdatedBy){ + return await axiosInstanceData.delete(`/appMenu?MenuId=${deleteData?.MenuId}&ActiveStatus=${deleteData?.ActiveStatus}&UpdatedBy=${deleteData?.UpdatedBy}`) + } +}) + + +const initialState = { + appData: [], + appListData:[], +} + +const appMenuSlice = createSlice({ + name:'appMenu', + initialState, + extraReducers: builder => { + builder.addCase(getAppMenu.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.appData = action?.payload?.data?.data + } + else { + state.appData = [] + } + + }) + builder.addCase(getAppMenuList.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.appListData = action?.payload?.data?.data + } + else { + state.appListData = [] + } + + }) + } + +}) + +export const appDataSelector = state => state.appData?.appData +export const appMenuListDataSelector = state => state.appListData?.appListData + + + +export default appMenuSlice.reducer; \ No newline at end of file diff --git a/src/features/appMenuAccess/appMenuAccess.js b/src/features/appMenuAccess/appMenuAccess.js new file mode 100644 index 0000000..355f69c --- /dev/null +++ b/src/features/appMenuAccess/appMenuAccess.js @@ -0,0 +1,47 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + + +export const getSadminUser = createAsyncThunk( + "appMenuAccess/getSadminUser", + async () => { + return await axiosInstanceData.get('/login?Type=Super Admin User'); + } +); + +export const getApplications = createAsyncThunk( + "appMenuAccess/getApplications", + async ({ UserId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}`); + } + } +); + +export const getMenu = createAsyncThunk( + "appMenuAccess/getMenu", + async ({ AppId }) => { + if (AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appMenu?AppId=${AppId}`); + } + } +); + +export const getPreviousMenu = createAsyncThunk( + "appMenuAccess/getPreviousMenu", + async ({ AppId, UserId }) => { + if (AppId != null && AppId != undefined && UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/AppMenuAccess?AppId=${AppId}&UserId=${UserId}`); + } + } +); + +export const postAppMenuAccess = createAsyncThunk('appMenuAccess/postAppMenuAccess', async (postData) => { + + return await axiosInstanceData.post(`/AppMenuAccess`, postData) +}) + +export const putAppMenuAccess = createAsyncThunk('appMenuAccess/putAppMenuAccess', async (putData) => { + + return await axiosInstanceData.put(`/AppMenuAccess`, putData) +}) diff --git a/src/features/appPage/centerPage.js b/src/features/appPage/centerPage.js new file mode 100644 index 0000000..e945bb9 --- /dev/null +++ b/src/features/appPage/centerPage.js @@ -0,0 +1,34 @@ +import { createSlice } from '@reduxjs/toolkit'; + + +const initialState = { + 'breadCrumb': [] +} + +const centerPageSlice = createSlice({ + name:'centerPage', + initialState, + reducers: { + changeBreadCrumb: (state, action) => { + const { items } =action?.payload + state.breadCrumb = items + }, + emptyBreadCrumb:(state,action)=>{ + state.breadCrumb = [] + } + } +}) + +export const { changeBreadCrumb,emptyBreadCrumb } = centerPageSlice.actions; + +export const breadCrumbSelector = state => state.centerPage?.breadCrumb; + +export default centerPageSlice.reducer; + + + + + + + + diff --git a/src/features/applicationImagePage/applicationImagePage.js b/src/features/applicationImagePage/applicationImagePage.js new file mode 100644 index 0000000..8e18f5f --- /dev/null +++ b/src/features/applicationImagePage/applicationImagePage.js @@ -0,0 +1,49 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; +const apiUrl = import.meta.env.ENV_API_URL; + +export const getApplicationImageData = createAsyncThunk('applicationImage/getApplicationImageData', async () => { + return await axiosInstanceData.get('/appImage') +}) + +export const postApplicationImageData = createAsyncThunk('applicationImage/postApplicationImageData', async (postData) => { + + return await axiosInstanceData.post('/appImage', postData) +}) + +export const putApplicationImageData = createAsyncThunk('applicationImage/putApplicationImageData', async (putData) => { + + return await axiosInstanceData.put('/appImage', putData) +}) + +export const deleteApplicationImageData = createAsyncThunk('applicationImage/deleteApplicationImageData', async (deleteData) => { + + return await axiosInstanceData.delete('/appImage', { params: deleteData }) +}) + +const initialState = { + applicationImageData: [] +} + +const applicationImageSlice = createSlice({ + name:'applicationImage', + initialState, + extraReducers: builder => { + builder.addCase(getApplicationImageData.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.applicationImageData = action?.payload?.data?.data + } + else { + state.applicationImageData = [] + } + }) + } + +}) + +export const applicationImageDataSelector = state => state.applicationImagePage?.applicationImageData + + + +export default applicationImageSlice.reducer; \ No newline at end of file diff --git a/src/features/applicationPage/applicationPage.js b/src/features/applicationPage/applicationPage.js new file mode 100644 index 0000000..557f767 --- /dev/null +++ b/src/features/applicationPage/applicationPage.js @@ -0,0 +1,99 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; +import axios from "axios"; + +const apiUrl = import.meta.env.ENV_API_URL; + +export const getApplicationData = createAsyncThunk('application/getApplicationData', async () => { + return await axios.get(`${apiUrl}/application`) +}) + +export const getActiveApplicationData = createAsyncThunk('application/getActiveApplicationData', async () => { + return await axios.get(`${apiUrl}/application?ActiveStatus=A`) +}) + +export const postApplicationData = createAsyncThunk('application/postApplicationData', async (postData) => { + + return await axiosInstanceData.post('/application', postData) +}) + +export const putApplicationData = createAsyncThunk('application/putApplicationData', async (putData) => { + + return await axiosInstanceData.put('/application', putData) +}) + +export const deleteApplicationData = createAsyncThunk('application/deleteApplicationData', async (deleteData) => { + + return await axiosInstanceData.delete('/application', { params: deleteData }) +}) + +export const getCategoryData = createAsyncThunk('configMaster/getCategoryData', async () => { + return await axiosInstanceData.get('/configMaster?ActiveStatus=A&TypeName=Module') +}) + +export const getSubCategoryData = createAsyncThunk('configMaster/getSubCategoryData', async () => { + return await axiosInstanceData.get('/configMaster?ActiveStatus=A&TypeName=Sub Module') +}) +export const getMasterData = createAsyncThunk('configMaster/getSubCategoryData', async () => { + return await axiosInstanceData.get('/configMaster?ActiveStatus=A&TypeName=Master Access') +}) + +const initialState = { + applicationData: [], + applicationActiveData: [], + categoryData:[], + subCategoryData:[] +} + +const applicationSlice = createSlice({ + name:'application', + initialState, + extraReducers: builder => { + builder.addCase(getApplicationData.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.applicationData = action?.payload?.data?.data + } + else { + state.applicationData = [] + } + + }) + builder.addCase(getActiveApplicationData.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.applicationActiveData = action?.payload?.data?.data + } + else { + state.applicationActiveData = [] + } + + }) + builder.addCase(getCategoryData.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.categoryData = action?.payload?.data?.data + } + else { + state.categoryData = [] + } + + }) + builder.addCase(getSubCategoryData.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.subCategoryData = action?.payload?.data?.data + } + else { + state.subCategoryData = [] + } + + }) + } + +}) + +export const applicationDataSelector = state => state.applicationPage?.applicationData +export const applicationActiveDataSelector = state => state.applicationPage?.applicationActiveData +export const categoryActiveDataSelector = state => state.applicationPage?.categoryData +export const subCategoryActiveDataSelector = state => state.applicationPage?.subCategoryData + + + +export default applicationSlice.reducer; \ No newline at end of file diff --git a/src/features/applications/applications.js b/src/features/applications/applications.js new file mode 100644 index 0000000..b0b8849 --- /dev/null +++ b/src/features/applications/applications.js @@ -0,0 +1,31 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + + +const apiUrl = import.meta.env.ENV_API_URL + +export const getAllApplications = createAsyncThunk('application/getApplicationData', async({userId})=> { + if(userId != null && userId != undefined){ + return axios.get(`${apiUrl}/application?UserId=${userId}&Type=H`) + } +}) + +export const getUserData = createAsyncThunk('application/getApplicationData', async({userId})=> { + if(userId != null && userId != undefined){ + return axiosInstanceData.get(`/user?UserId=${userId}&ActiveStatus=A`) + } +}) + +const initialState = { + allApplications : [] +} + +const applicationSlice = createSlice({ + name: 'applications', + initialState, +}) + +export const allApplicationsSelector = state => state.applications? state.applications.allApplications: initialState.allApplications + +export default applicationSlice.reducer \ No newline at end of file diff --git a/src/features/applications/bannerImage.js b/src/features/applications/bannerImage.js new file mode 100644 index 0000000..8820bff --- /dev/null +++ b/src/features/applications/bannerImage.js @@ -0,0 +1,111 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; +const uploadApiUrl = import.meta.env.ENV_IMAGE_UPLOAD_API_URL; + +export const getBannerImage = createAsyncThunk('application/getBannerImage', async () => { + return await axios.get(`${apiUrl}/application?ActiveStatus=A`); +}); + +export const getApplication = createAsyncThunk('application/getApplication', async () => { + return await axios.get(`${apiUrl}/application?Type=A`); +}); +export const getApplicationPreferenceMapping = createAsyncThunk('application/getApplication', async () => { + return await axios.get(`${apiUrl}/application`); +}); +export const getApplicationCategory = createAsyncThunk('application/getApplicationCategory', async (CateId) => { + if (CateId != null && CateId != undefined) { + return await axios.get(`${apiUrl}/application?CateId=${CateId}`); + } +}); + +export const getApplicationSubCategory = createAsyncThunk('application/getApplicationSubCategory', async (SubId) => { + if (SubId != null && SubId != undefined) { + return await axios.get(`${apiUrl}/application?SubId=${SubId}`); + } +}); + +export const onlineimages = createAsyncThunk('application/onlineimages', async (data) => { + if (data != null && data != undefined) { + return await axiosInstanceData.get(`/Image?Name=${data}`); + } +}) + +export const uploadImage = createAsyncThunk('upload/uploadImage', async (file) => { + let formdata = new FormData(); + formdata.append("file", file); + return await axiosInstanceData.post(`${uploadApiUrl}/upload`, formdata) +}) + + + +const initialState = { + BannerImage: [], + Applications: [], + ApplicationCategory: [], + ApplicationSubCategory: [], +} + +const BannerImageSlice = createSlice({ + name: 'bannerImage', + initialState, + extraReducers: builder => { + + builder.addCase(getBannerImage.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.BannerImage = action?.payload?.data; + + } + else { + state.BannerImage = null; + } + + }) + + builder.addCase(getApplication.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.Applications = action?.payload?.data; + + } + else { + state.Applications = null; + } + + }) + + builder.addCase(getApplicationCategory.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.ApplicationCategory = action?.payload?.data; + + } + else { + state.ApplicationCategory = null; + } + + }) + + builder.addCase(getApplicationSubCategory.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.ApplicationSubCategory = action?.payload?.data; + + } + else { + state.ApplicationSubCategory = null; + } + + }) + } + +}) + +export const BannerImageSelector = (state) => state.bannerImage?.BannerImage +export const ApplicationsSelector = (state) => state.bannerImage?.Applications +export const ApplicationCategorySelector = (state) => state.bannerImage?.ApplicationCategory +export const ApplicationSubCategorySelector = (state) => state.bannerImage?.ApplicationSubCategory + + + + +export default BannerImageSlice.reducer; \ No newline at end of file diff --git a/src/features/branchPage/branchPage.js b/src/features/branchPage/branchPage.js new file mode 100644 index 0000000..224f8fd --- /dev/null +++ b/src/features/branchPage/branchPage.js @@ -0,0 +1,272 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import { getSession } from "../../Services/others"; +import { axiosInstanceData } from '../AuthenticationTokens/AuthenticationToken'; + + +const UserType = getSession("UserType") +export const getBranchData = createAsyncThunk('branch/getBranchData', async () => { + return await axiosInstanceData.get('/branch') +}) +export const getBranchDataUsingCompId= createAsyncThunk('branch/getBranchData', async ({CompId,AppId}) => { + return await axiosInstanceData.get(`/branch?compId=${CompId}&appId=${AppId}`) +}) + +export const postBranchData = createAsyncThunk('branch/postBranchData', async (postData) => { + + return await axiosInstanceData.post('/branch', postData) +}) + +export const putBranchData = createAsyncThunk('branch/putBranchData', async (putData) => { + + return await axiosInstanceData.put('/branch', putData) +}) + +export const deleteBranchData = createAsyncThunk('branch/deleteBranchData', async (deleteData) => { + + return await axiosInstanceData.delete('/branch', { params: deleteData }) +}) + +export const getActiveBranchData = createAsyncThunk('branch/getActiveBranchData', async () => { + return await axiosInstanceData.get('/branch?ActiveStatus=A') +}) + +export const getActiveAdminData = createAsyncThunk('branch/getActiveAdminData', async () => { + return await axiosInstanceData.get('/user?UserType=A') +}) + +export const getAdminNames = createAsyncThunk('login/getAdminNames', async () => { + return await axiosInstanceData.get('/login?Type=Admin') +}) + +export const getBranchAdminUsers = createAsyncThunk('branch/getBranchAdminUsers', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/branch?UserId=${UserId}`) + } + +}) +export const getWarehouseUsers = createAsyncThunk('branch/getBranchAdminUsers', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/branch?UserId=${UserId}&Type=W`) + } + else { + return await axiosInstanceData.get(`/branch?Type=W`) + + } + +}) + +export const getBranchApplications = createAsyncThunk('userAppMap/getBranchApplications', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UserId=${UserId}`) + } + else { + return await axiosInstanceData.get('/userAppMap') + } +}) + +export const getApplicationCompany = createAsyncThunk('appAccess/getApplicationCompany', async (AppId) => { + if (AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppId}`) + } +}) + +export const getUserAppCompany = createAsyncThunk('appAccess/getUserAppCompany', async (getCompData) => { + if (getCompData.UserId != null && getCompData.UserId != undefined && getCompData.AppId != null && getCompData.AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${getCompData.UserId}&AppId=${getCompData.AppId}`) + } +}) +export const checkTrialBranch = createAsyncThunk('appAccess/checkTrialBranch', async (getCompData) => { + if (getCompData.UserId != null && getCompData.UserId != undefined && getCompData.AppId != null && getCompData.AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${getCompData.UserId}&AppId=${getCompData.AppId}&Type=T`) + } +}) + +export const getBranchDataBasedOnCompany = createAsyncThunk('branch/getCompanyDataBasedOnApp', async ({ UserId, AppId, CompId }) => { + if (UserId != null && UserId != undefined && AppId != null && AppId != undefined && CompId != null && CompId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&AppId=${AppId}&CompId=${CompId}`) + } +}) +export const getCompanyDataBasedOnApp = createAsyncThunk('branch/getCompanyDataBasedOnApp', async ({ UserId, AppId }) => { + if (UserId != null && UserId != undefined && AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&AppId=${AppId}`) + } +}) +export const getActiveAppData = createAsyncThunk('branch/getActiveAppData', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&Type=AD&ActiveStatus=A`) + } +}) +export const getActiveAdminDatauserapp = createAsyncThunk('branch/getActiveAdminData', async () => { + return await axiosInstanceData.get('/user?UserType=NA') +}) + +export const getUseridbasedbranchdata = createAsyncThunk('branch/getUseridbasedbranchdata', async ({ UserId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}`) + } +}); + +export const postWarehouseData = createAsyncThunk('wareHouse/postWarehouseData', async (data) => { + return await axiosInstanceData.post(`/warehouse`, data) +}); + +const initialState = { + branchData: [], + branchActiveData: [], + AdminNames: [], + BranchAdminUsers: [], + BranchApplicationNames: [], + ApplicationCompany: [], + UserAppCompany: [], + BranchCounts: [], + AppPreferences: [] +} + +const branchSlice = createSlice({ + name: 'branch', + initialState, + reducers: { + companyname: (state, action) => { + state.UserAppCompany = [] + }, + }, + extraReducers: builder => { + builder.addCase(getCommonAppPreference.fulfilled, (state, action) => { + if (action?.payload?.status === 200) { + const { data: result } = action?.payload; + if (result?.data?.length > 0) { + state.AppPreferences = result?.data; + } else { + state.AppPreferences = []; + } + } + }); + builder.addCase(getBranchData.fulfilled, (state, action) => { + + if (action?.payload?.status) { + state.branchData = action?.payload?.data?.data + } + else { + + state.branchData = [] + } + + }) + + builder.addCase(getActiveBranchData.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.branchActiveData = action?.payload?.data?.data + } + else { + state.branchActiveData = [] + } + + }) + + builder.addCase(getAdminNames.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.AdminNames = action?.payload?.data?.data + } + else { + state.AdminNames = [] + } + + }) + + builder.addCase(getBranchAdminUsers.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.BranchAdminUsers = action?.payload?.data?.data + } + else { + state.BranchAdminUsers = [] + } + + }) + builder.addCase(getBranchApplications.fulfilled, (state, action) => { + if (action?.payload?.status) { + if (UserType === "Admin" || UserType === "Admin User") { + let currentDate = new Date(); + let filteredData = action?.payload?.data?.data?.filter(item => { + let validityEnd = new Date(item.ValidityEnd); + return validityEnd >= currentDate; + }); + state.BranchApplicationNames = filteredData + } else { + state.BranchApplicationNames = action?.payload?.data?.data + } + + } + else { + state.BranchApplicationNames = [] + } + + }) + + builder.addCase(getApplicationCompany.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.ApplicationCompany = action?.payload?.data?.data + state.UserAppCompany = [] + } + else { + state.ApplicationCompany = [] + state.UserAppCompany = [] + } + + }) + + builder.addCase(getUserAppCompany.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.UserAppCompany = action?.payload?.data?.data + } + else { + state.UserAppCompany = [] + } + + }) + builder.addCase(checkTrialBranch.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.BranchCounts = action?.payload?.data?.data + } + else { + state.BranchCounts = [] + } + + }) + + } + +}) + +export const getCommonAppPreference = createAsyncThunk( + '/getAppPreference', + async (AppId) => { + if ( + AppId != null && + AppId != undefined + ) { + return await axiosInstanceData.get( + `/ApplicationPreferenceMapping?AppId=${AppId}` + ); + } + } +); + + + +export const { + companyname, +} = branchSlice.actions; + +export const branchDataSelector = state => state.branchPage?.branchData +export const branchActiveDataSelector = state => state.branchPage?.branchActiveData +export const AdminNamesSelector = state => state.branchPage?.AdminNames +export const BranchAdminSelector = state => state.branchPage?.BranchAdminUsers +export const BranchApplicationNamesSelector = state => state.branchPage?.BranchApplicationNames +export const ApplicationCompanySelector = state => state.branchPage?.ApplicationCompany +export const UserAppCompanySelector = state => state.branchPage?.UserAppCompany +export const checkTrialBranchSelector = state => state.branchPage?.BranchCounts +export const ApplicationPreferences = state => state.branchPage?.AppPreferences + +export default branchSlice.reducer; + + diff --git a/src/features/carouselPage/carouselPage.js b/src/features/carouselPage/carouselPage.js new file mode 100644 index 0000000..b08f33f --- /dev/null +++ b/src/features/carouselPage/carouselPage.js @@ -0,0 +1,69 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + + + +export const getCarouselData = createAsyncThunk('carousel/getCarouselData', async () => { + return await axiosInstanceData.get('/carousel') +}) + +export const deleteCarouselData = createAsyncThunk('carousel/deleteCarouselData', async (deleteData) => { + + return await axiosInstanceData.delete('/carousel', { params: deleteData }) +}) + +export const postCarouselData = createAsyncThunk('carousel/postCarouselData', async (postData) => { + + return await axiosInstanceData.post('/carousel', postData) +}) + +export const putCarouselData = createAsyncThunk('carousel/putCarouselData', async (putData) => { + + return await axiosInstanceData.put('/carousel', putData) +}) + +export const getConfigNames = createAsyncThunk('configMaster/getConfigNames', async () => { + return await axiosInstanceData.get('/configMaster?ActiveStatus=A&TypeName=Screen Name') +}) + + + + +const initialState = { + carouselData: [], + ConfigNames:[], +} + +const carouselSlice = createSlice({ + name:'carousel', + initialState, + extraReducers: builder => { + builder.addCase(getCarouselData.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.carouselData = action?.payload?.data?.data + } + else { + state.carouselData = [] + } + + }) + + builder.addCase(getConfigNames.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.ConfigNames = action?.payload?.data?.data + } + else { + state.ConfigNames = [] + } + + }) + } + +}) + +export const carouselDataSelector = state => state.carouselPage?.carouselData +export const ConfigNamesSelector = state => state.carouselPage?.ConfigNames + + + +export default carouselSlice.reducer; \ No newline at end of file diff --git a/src/features/companyPage/companyPage.js b/src/features/companyPage/companyPage.js new file mode 100644 index 0000000..c50ed58 --- /dev/null +++ b/src/features/companyPage/companyPage.js @@ -0,0 +1,173 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import { getSession } from "../../Services/others"; +import {axiosInstanceData, axiosRetailInstanceData} from '../AuthenticationTokens/AuthenticationToken'; +import axios from "axios"; + +const apiUrl = import.meta.env.ENV_API_URL; + +const UserType = getSession("UserType") + +export const getCompanyData = createAsyncThunk('company/getCompanyData', async () => { + return await axios.get(`${apiUrl}/company`) +}) +export const getCompanyDataUsingAppId = createAsyncThunk('company/getCompanyDataUsingAppId', async (appId) => { + return await axios.get(`${apiUrl}/company?appId=${appId}&Type=A`) +}) + +export const getUserRoles = createAsyncThunk('company/getUserRoles', async () => { + return await axiosInstanceData.get('/configMaster?ActiveStatus=A&TypeName=User Role') +}) + +export const getActiveCompanyData = createAsyncThunk('company/getActiveCompanyData', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axios.get(`${apiUrl}/company?UserId=${UserId}`) + + } + else { + return await axios.get(`${apiUrl}/company?ActiveStatus=A`) + + } +}) + +export const postCompanyData = createAsyncThunk('company/postCompanyData', async (postData) => { + + return await axiosInstanceData.post('/company', postData) +}) + +export const putCompanyData = createAsyncThunk('company/putCompanyData', async (putData) => { + + return await axiosInstanceData.put('/company', putData) +}) + +export const deleteCompanyData = createAsyncThunk('company/deleteCompanyData', async (deleteData) => { + + return await axiosInstanceData.delete('/company', { params: deleteData }) +}) + +export const getAdminNames = createAsyncThunk('login/getAdminNames', async () => { + return await axiosInstanceData.get('/login?Type=Admin') +}) + +export const getAdminUsers = createAsyncThunk('company/getAdminUsers', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axios.get(`${apiUrl}/company?UserId=${UserId}`) + } +}) + +export const getApplications = createAsyncThunk('userAppMap/getApplications', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UserId=${UserId}`) + + }else { + return await axiosInstanceData.get('/userAppMap') + + } +}) + +export const checkTrialCompany = createAsyncThunk('userAppMap/checkTrialCompany', async (getTrialCompany) => { + if (getTrialCompany.AppId != null && getTrialCompany.AppId != undefined && getTrialCompany.UserId != null && getTrialCompany.UserId != undefined) { + return await axiosInstanceData.get(`/userAppMap?AppId=${getTrialCompany.AppId}&UserId=${getTrialCompany.UserId}`) + } +}) + +export const getGstnumberDetails = createAsyncThunk('Gst/gstNumberDetail', async (gstNo) => { + return await axiosRetailInstanceData.get(`/Gst?gstNo=${gstNo}`) +}) + +const initialState = { + companyData: [], + companyActiveData: [], + AdminNames: [], + AdminUsers: [], + ApplicationNames: [], + CompanyCounts: [] +} + +const companySlice = createSlice({ + name: 'company', + initialState, + extraReducers: builder => { + builder.addCase(getCompanyData.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.companyData = action?.payload?.data?.data + } + else { + state.companyData = [] + } + + }) + builder.addCase(getActiveCompanyData.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.companyActiveData = action?.payload?.data?.data + } + else { + state.companyActiveData = [] + } + + }) + builder.addCase(getAdminNames.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.AdminNames = action?.payload?.data?.data + } + else { + state.AdminNames = [] + } + + }) + + builder.addCase(getAdminUsers.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.AdminUsers = action?.payload?.data?.data + } + else { + state.AdminUsers = [] + } + + }) + + builder.addCase(getApplications.fulfilled, (state, action) => { + if (action?.payload?.status) { + if (UserType === "Admin" || UserType === "Admin User") { + let currentDate = new Date(); + let filteredData = action?.payload?.data?.data?.filter(item => { + let validityEnd = new Date(item.ValidityEnd); + return validityEnd >= currentDate; + }); + state.ApplicationNames = filteredData + } else { + state.ApplicationNames = action?.payload?.data?.data + } + + } + else { + state.ApplicationNames = [] + } + + }) + builder.addCase(checkTrialCompany.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.CompanyCounts = action?.payload?.data?.data + + } + else { + + state.CompanyCounts = [] + + } + + }) + + } + +}) + +export const companyDataSelector = state => state.companyPage?.companyData +export const companyActiveDataSelector = state => state.companyPage?.companyActiveData +export const AdminNamesSelector = state => state.companyPage?.AdminNames +export const AdminUsersSelector = state => state.companyPage?.AdminUsers +export const ApplicationNamesSelector = state => state.companyPage?.ApplicationNames +export const checkTrialCompanySelector = state => state.companyPage?.CompanyCounts + + + +export default companySlice.reducer; \ No newline at end of file diff --git a/src/features/configmasterPage/configmasterPage.js b/src/features/configmasterPage/configmasterPage.js new file mode 100644 index 0000000..7b5b0b5 --- /dev/null +++ b/src/features/configmasterPage/configmasterPage.js @@ -0,0 +1,92 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; + + export const getAllSetupHeaderName = createAsyncThunk('configMaster/getAllSetupHeaderName', async (TypeName) => { + if(TypeName != null && TypeName != undefined){ + return await axiosInstanceData.get(`/configMaster?TypeName=${TypeName}&ActiveStatus=A`); + } +}) + +export const getConfiguration = createAsyncThunk('configMaster/getConfiguration', async () => { + return await axiosInstanceData.get(`/configMaster`) +}) + + +export const getActiveConfigNames = createAsyncThunk('configMaster/getActiveConfigNames', async () => { + return await axiosInstanceData.get(`/configMaster?ActiveStatus=A`) +}) + +export const getConfigNames = createAsyncThunk('configMaster/getConfigNames', async ({TypeName}) => { + if(TypeName != null && TypeName != undefined){ + return await axiosInstanceData.get(`/configMaster?TypeName=${TypeName}`); + } +}) +export const getConfigNamesWithActiveStatus = createAsyncThunk('configMaster/getConfigNames', async ({TypeName}) => { + if(TypeName != null && TypeName != undefined){ + return await axiosInstanceData.get(`/configMaster?TypeName=${TypeName}&ActiveStatus=A`); + } +}) + +export const deleteConfiguration = createAsyncThunk('configMaster/deleteConfiguration', async (deleteData) => { + + return await axiosInstanceData.delete(`/configMaster`, { params: deleteData }) +}) + +export const postConfiguration = createAsyncThunk('configMaster/postConfiguration', async (postData) => { + + return await axiosInstanceData.post(`/configMaster`, postData) +}) + +export const putConfiguration = createAsyncThunk('configMaster/putConfiguration', async (putData) => { + + + return await axiosInstanceData.put(`/configMaster`, putData) +}) + +export const postBulkConfiguration = createAsyncThunk('configMaster/postBulkConfiguration', async(postData) =>{ + + return await axiosInstanceData.post(`/configMaster/BulkUpload`, postData) +}) + + +const initialState = { + configData: [], + ActiveConfigNames:[], +} + +const configmaster = createSlice({ + name:'configmaster', + initialState, + extraReducers: builder => { + builder.addCase(getConfiguration.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.configData = action?.payload?.data?.data + } + else { + state.configData = [] + } + + }) + builder.addCase(getActiveConfigNames.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.ActiveConfigNames = action?.payload?.data?.data + } + else { + state.ActiveConfigNames = [] + } + + }) + } + +}) + + +export const configDataSelector = state => state.configmasterPage?.configData +export const ActiveConfigNamesSelector = state => state.configmasterPage?.ActiveConfigNames + + + +export default configmaster.reducer; \ No newline at end of file diff --git a/src/features/configtypePage/configtypePage.js b/src/features/configtypePage/configtypePage.js new file mode 100644 index 0000000..39d504f --- /dev/null +++ b/src/features/configtypePage/configtypePage.js @@ -0,0 +1,76 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + + + +export const getConfigurationType = createAsyncThunk('configType/getConfigurationType', async () => { + return await axiosInstanceData.get(`/configType`) +}) + + +export const postConfigurationType = createAsyncThunk('configType/postConfigurationType', async (postData) => { + + return await axiosInstanceData.post(`/configType`, postData) +}) + +export const putConfigurationType = createAsyncThunk('configType/putConfigurationType', async (putData) => { + + return await axiosInstanceData.put(`/configType`, putData) +}) + +export const deleteConfigTypeData = createAsyncThunk('configType/deleteConfigTypeData', async (deleteData) => { + + return await axiosInstanceData.delete(`/configType`, { params: deleteData }) +}) + +export const getActiveConfigTypeNames = createAsyncThunk('configType/getActiveConfigTypeNames', async () => { + return await axiosInstanceData.get(`/configType?ActiveStatus=A`) +}) + +export const getConfigTypeNames = createAsyncThunk('configType/getActiveConfigTypeNames', async (data) => { + return await axiosInstanceData.get(`/configMaster?typeName=${data?.typeName}`) +}) + +export const Postplanextend = createAsyncThunk('Postplanextend',async(postData)=>{ + + return await axiosInstanceData.post(`/UserAppMap`,postData) +}) + +const initialState = { + configTypeData: [], + configTypeActiveData:[] +} + +const configTypeSlice = createSlice({ + name:'configType', + initialState, + extraReducers: builder => { + builder.addCase(getConfigurationType.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.configTypeData = action?.payload?.data?.data + } + else { + state.configTypeData = [] + } + + }) + + builder.addCase(getActiveConfigTypeNames.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.configTypeActiveData = action?.payload?.data?.data + } + else { + state.configTypeActiveData = [] + } + + }) + + + } + +}) + +export const configTypeDataSelector = state => state.configtypePage?.configTypeData +export const configTypeActiveDataSelector = state => state.configtypePage?.configTypeActiveData + +export default configTypeSlice.reducer; \ No newline at end of file diff --git a/src/features/currencyPage/currencyPage.js b/src/features/currencyPage/currencyPage.js new file mode 100644 index 0000000..1735e5f --- /dev/null +++ b/src/features/currencyPage/currencyPage.js @@ -0,0 +1,54 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; + + +export const getCurrency = createAsyncThunk('currency/getCurrency', async () => { + return await axiosInstanceData.get(`/currency`) +}) + + +export const postCurrency = createAsyncThunk('currency/postCurrency', async (postData) => { + + return await axiosInstanceData.post(`/currency`, postData) +}) + +export const putCurrency = createAsyncThunk('currency/putCurrency', async (putData) => { + + return await axiosInstanceData.put(`/currency`, putData) +}) + +export const deleteCurrency = createAsyncThunk('currency/deleteCurrency', async (deleteData) => { + + return await axiosInstanceData.delete(`/currency`, { params: deleteData }) +}) + +const initialState = { + currencyData: [] +} + +const currencySlice = createSlice({ + name:'curency', + initialState, + extraReducers: builder => { + builder.addCase(getCurrency.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.currencyData = action?.payload?.data?.data + } + else { + state.currencyData = [] + } + + }) + } + +}) + +export const currencyDataSelector = state => state.currencyPage?.currencyData + + + + +export default currencySlice.reducer; \ No newline at end of file diff --git a/src/features/exceluploadPage/exceluploadPage.js b/src/features/exceluploadPage/exceluploadPage.js new file mode 100644 index 0000000..83073b7 --- /dev/null +++ b/src/features/exceluploadPage/exceluploadPage.js @@ -0,0 +1,40 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; + + + + +const initialState = { + excelFile: null, + excelFileError: null, + excelData:null, + fileInputRef: " " +} + +const excelupload = createSlice({ + name:'excelupload', + initialState, + reducers :{ + emptyExcelData: (state, action) => { + state.excelFile = null + state.excelFileError = null + state.excelData = null + state.fileInputRef = " " + }, + uploadExcel: (state, action) =>{ + const { file, jsonData } = action?.payload; + state.excelFile=file; + state.excelData=jsonData; + } + } + +}) + +export const {emptyExcelData, uploadExcel} = excelupload.actions; + +export const excelDataSelector = state => state.exceluploadPage.excelData +export const excelFileSelector = state => state.exceluploadPage.excelFile +export const excelFileErrorSelector = state => state.exceluploadPage.excelFileError +export const fileInputRefSelector = state => state.exceluploadPage.fileInputRef + +export default excelupload.reducer; \ No newline at end of file diff --git a/src/features/feature/feature.js b/src/features/feature/feature.js new file mode 100644 index 0000000..26bc48f --- /dev/null +++ b/src/features/feature/feature.js @@ -0,0 +1,107 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; +const apiUrl = import.meta.env.ENV_API_URL; + +export const getFeatureCategory = createAsyncThunk( + "feature/featureCategory", + async () => { + return await axiosInstanceData.get('/configMaster?TypeName=Feature Category'); + } +); + +export const getFeatureType = createAsyncThunk( + "feature/FeatureType", + async () => { + return await axiosInstanceData.get('/configMaster?TypeName=Feature Type'); + } +); + +export const getFeature = createAsyncThunk("feature/getFeature", async () => { + return await axiosInstanceData.get('/feature'); +}); +export const getFeatureDetails = createAsyncThunk( + "feature/getFeature", + async (data) => { + if(data != null && data != undefined){ + return await axiosInstanceData.get(`/feature?appId=${data}&activeStatus=A`); + } + } +); + +export const getAppNames = createAsyncThunk("feature/getUserData", async () => { + return axios.get(`${apiUrl}/application?activeStatus=A`); +}); + +export const postFeature = createAsyncThunk( + "feature/postFeature", + async (postData) => { + + return await axiosInstanceData.post('/feature', postData); + } +); + +export const putFeature = createAsyncThunk( + "feature/putFeature", + async (putData) => { + + return await axiosInstanceData.put('/feature', putData); + } +); + +export const deleteFeature = createAsyncThunk( + "feature/deleteFeature", + async (deleteData) => { + if (deleteData?.FeatId && deleteData?.ActiveStatus && deleteData?.UpdatedBy) { + return await axiosInstanceData.delete( + `/feature?FeatId=${deleteData?.FeatId}&ActiveStatus=${deleteData?.ActiveStatus}&UpdatedBy=${deleteData?.UpdatedBy}` + ); + } + } +); + +export const postFeatureAddon = createAsyncThunk( + "feature/postFeatureAddon", + async (postData) => { + + return await axiosInstanceData.post('/UAMFeatAddon', postData); + } +); + +export const NewGetFeatAddon = createAsyncThunk( + "feature/NewGetFeatAddon", + async (data) => { + if(data?.UserId != null && data?.UserId != undefined){ + return axiosInstanceData.get(`/UserAppMap?userId=${data?.UserId}&type=IE`); + } + } +); +const initialState = { + featureData: [], + featureDataDetails: [], +}; +const featureSlice = createSlice({ + name: "feature", + initialState, + extraReducers: (builder) => { + builder.addCase(getFeature.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.featureData = action?.payload?.data?.data; + } else { + state.featureData = []; + } +}), + builder.addCase(getFeatureDetails.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.featureDataDetails = action?.payload?.data?.data; + } else { + state.featureDataDetails = []; + } + }); +}, +}); + +export const featureSelector = (state) => state.featureData?.featureData; +export const featureSelectorDetail = (state) => + state.featureDataDetails?.featureDataDetails; +export default featureSlice.reducer; diff --git a/src/features/featureMapping/featureMapping.js b/src/features/featureMapping/featureMapping.js new file mode 100644 index 0000000..def8437 --- /dev/null +++ b/src/features/featureMapping/featureMapping.js @@ -0,0 +1,70 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; +const apiUrl = import.meta.env.ENV_API_URL; + + +export const getApplication = createAsyncThunk('featureMapping/application', async () => { + return await axios.get(`${apiUrl}/application`) +}) + +export const getpricingAppFeatMap = createAsyncThunk('featureMapping/pricingAppFeatMap', async () => { + return await axios.get(`${apiUrl}/pricingAppFeatMap`) +}) + +export const getPricingType = createAsyncThunk('featureMapping/getPricingType', async (AppId) => { + if (AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/pricingType?AppId=${AppId}`) + } +}) + +export const getFeatureList = createAsyncThunk('featureMapping/getFeatureList', async (AppId) => { + if (AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/feature?AppId=${AppId}`) + } +}) + +export const postFeatureMapping = createAsyncThunk('featureMapping/postFeatureMapping', async (postData) => { + + return await axiosInstanceData.post('/pricingAppFeatMap', postData) +}) + +export const putFeatureMapping = createAsyncThunk('featureMapping/putFeatureMapping', async (putData) => { + + return await axiosInstanceData.put('/pricingAppFeatMap', putData) +}) + +export const deleteFeatureMapping = createAsyncThunk('featureMapping/deleteFeatureMapping', async (deleteData) => { + if (deleteData?.AppId && deleteData?.PricingId && deleteData?.ActiveStatus && deleteData?.UpdatedBy) { + return await axiosInstanceData.delete(`/pricingAppFeatMap?AppId=${deleteData?.AppId}&PricingId=${deleteData?.PricingId}&ActiveStatus=${deleteData?.ActiveStatus}&UpdatedBy=${deleteData?.UpdatedBy}`) + } +}) + + +const initialState = { + featureData: [] +} + +const featureMappSlice = createSlice({ + name: 'featureMapping', + initialState, + extraReducers: builder => { + builder.addCase(getApplication.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.featureData = action?.payload?.data?.data + } + else { + state.featureData = [] + } + + }) + } + +}) + +export const featureMappSelector = state => state.featureData?.featureData + + + + +export default featureMappSlice.reducer; \ No newline at end of file diff --git a/src/features/homePage/homePage.js b/src/features/homePage/homePage.js new file mode 100644 index 0000000..7e0f317 --- /dev/null +++ b/src/features/homePage/homePage.js @@ -0,0 +1,214 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +export const getPurchasedApp = createAsyncThunk( + "homePage/getPurchasedApp", + async ({ UserId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UserId=${UserId}`); + } + } +); + +export const getPurchasedAppFeatures = createAsyncThunk( + "homePage/getPurchasedAppFeatures", + async ({ UserId, AppId }) => { + if (UserId != null && UserId != undefined && AppId != null && AppId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UserId=${UserId}&AppId=${AppId}&Type=IE`); + } + } +); + +export const getAllPurchasedDetails = createAsyncThunk( + "homePage/getAllPurchasedDetails", + async () => { + return await axiosInstanceData.get('/userAppMap'); + } +); + +export const getAllFailedPurchasedDetails = createAsyncThunk( + "homePage/getAllFailedPurchasedDetails", + async () => { + return await axiosInstanceData.get('/userAppMap?paymentStatus=F'); + } +); + +export const getAllFailedPurchasedDetailsFilter = createAsyncThunk( + "homePage/getAllFailedPurchasedDetailsFilter", + async (data) => { + let urlData; + if (data?.Year != null && data?.Year != undefined) { + urlData = `userAppMap?paymentStatus=F&year=${data?.Year}`; + } + if (data?.Month != null && data?.Month != undefined) { + urlData = `userAppMap?paymentStatus=F&monthYear=${data?.Month}`; + } + if (data?.Fromdate != null && data?.Fromdate != undefined && data?.Todate != null && data?.Todate != undefined) { + urlData = `userAppMap?paymentStatus=F&fromDate=${data?.Fromdate}&toDate=${data?.Todate}`; + } + return await axiosInstanceData.get(`/${urlData}`); + } +); + +export const getAllPurchasedDetailsFilter = createAsyncThunk( + "homePage/getAllPurchasedDetailsFilter", + async (data) => { + let urlData; + if (data?.Year != null && data?.Year != undefined) { + urlData = `userAppMap?year=${data?.Year}`; + } + if (data?.Month != null && data?.Month != undefined) { + urlData = `userAppMap?monthYear=${data?.Month}`; + } + if (data?.Fromdate != null && data?.Fromdate != undefined && data?.Todate != null && data?.Todate != undefined) { + urlData = `userAppMap?fromDate=${data?.Fromdate}&toDate=${data?.Todate}`; + } + return await axiosInstanceData.get(`/${urlData}`); + } +); + +export const getTypePurchasedApp = createAsyncThunk( + "homePage/getTypePurchasedApp", + async ({ UserId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UserId=${UserId}&Type=P`); + } + } +); + +export const getAppAccess = createAsyncThunk( + "homePage/getAppAccess", + async ({ UserId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}`); + } + } +); + +export const putDeafaulBranch = createAsyncThunk( + "putDeafaulBranch/putDeafaulBranch", + async (putData) => { + + return await axiosInstanceData.put('/appAccess', putData); + } +); + +export const getDeafaulBranch = createAsyncThunk( + "getDeafaul/getDeafaulBranch", + async (DefaultBranch) => { + if(DefaultBranch.UserId != null && DefaultBranch.UserId != undefined && DefaultBranch.AppId != null && DefaultBranch.AppId != undefined){ + return await axiosInstanceData.get( + `/appAccess?UserId=${DefaultBranch.UserId}&AppId=${DefaultBranch.AppId}&Type=DB` + ); + } + + } +); + +export const getPurchasedAppFilter = createAsyncThunk( + "homePage/getPurchasedAppFilter", + async (data) => { + let urlData; + if (data?.UserId != null && data?.UserId != undefined) { + if (data?.Year != null && data?.Year != undefined) { + urlData = `userAppMap?UserId=${data?.UserId}&year=${data?.Year}&Type=P`; + } + if (data?.Month != null && data?.Month != undefined) { + urlData = `userAppMap?UserId=${data?.UserId}&monthYear=${data?.Month}&Type=P`; + } + if (data?.Fromdate != null && data?.Fromdate != undefined && data?.Todate != null && data?.Todate != undefined) { + urlData = `userAppMap?UserId=${data?.UserId}&fromDate=${data?.Fromdate}&toDate=${data?.Todate}&Type=P`; + } + } + return await axiosInstanceData.get(`/${urlData}`); + } +); + +const initialState = { + purchasedApp: [], + purchasedTypeApp: [], + AppAccess: [], + failedpurchasedTypeApp: [], + purchasedTypeAppFilter: [], +}; + +const homePageSlice = createSlice({ + name: "homePage", + initialState, + extraReducers: (builder) => { + builder.addCase(getPurchasedApp.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.purchasedApp = action?.payload?.data?.data; + } else { + state.purchasedApp = []; + } + }); + + builder.addCase(getTypePurchasedApp.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.purchasedTypeApp = action?.payload?.data?.data; + state.purchasedTypeAppFilter = action?.payload?.data?.data; + } else { + state.purchasedTypeApp = []; + state.purchasedTypeAppFilter = []; + } + }); + + builder.addCase(getAllPurchasedDetails.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.purchasedTypeApp = action?.payload?.data?.data; + state.purchasedTypeAppFilter = action?.payload?.data?.data; + } else { + state.purchasedTypeApp = []; + state.purchasedTypeAppFilter = []; + } + }); + + builder.addCase(getAllPurchasedDetailsFilter.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.purchasedTypeAppFilter = action?.payload?.data?.data; + } else { + state.purchasedTypeAppFilter = []; + } + }); + + builder.addCase(getPurchasedAppFilter.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.purchasedTypeAppFilter = action?.payload?.data?.data; + } else { + state.purchasedTypeAppFilter = []; + } + }); + + builder.addCase(getAllFailedPurchasedDetails.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.failedpurchasedTypeApp = action?.payload?.data?.data; + } else { + state.failedpurchasedTypeApp = []; + } + }); + builder.addCase(getAllFailedPurchasedDetailsFilter.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.failedpurchasedTypeApp = action?.payload?.data?.data; + } else { + state.failedpurchasedTypeApp = []; + } + }); + + builder.addCase(getAppAccess.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.AppAccess = action?.payload?.data?.data; + } else { + state.AppAccess = []; + } + }); + }, +}); + +export const purchasedAppSelector = (state) => state.homePage.purchasedApp; +export const purchasedTypeAppSelector = (state) => state.homePage.purchasedTypeApp; +export const failedpurchasedTypeAppSelector = (state) => state.homePage.failedpurchasedTypeApp; +export const purchasedTypeAppSelectorFilter = (state) => state.homePage.purchasedTypeAppFilter; +export const AppAccessSelector = (state) => state.homePage.AppAccess; + +export default homePageSlice.reducer; diff --git a/src/features/invoiceDetail/invoiceDetail.js b/src/features/invoiceDetail/invoiceDetail.js new file mode 100644 index 0000000..5088fb8 --- /dev/null +++ b/src/features/invoiceDetail/invoiceDetail.js @@ -0,0 +1,71 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import { axiosInstanceData, axiosInstanceEMAIL_SMSData } from '../AuthenticationTokens/AuthenticationToken'; + + + +export const getPricingType = createAsyncThunk('getPricingType/getPricingType', async (PricingId) => { + if (PricingId != null && PricingId != undefined) { + return await axiosInstanceData.get(`/pricingType?PricingId=${PricingId}`); + } +}); + +export const postInvoice = createAsyncThunk('postInvoice/userAppMap', async (postData) => { + + return await axiosInstanceData.post('/userAppMap', postData) +}) + + +export const postCCAvenuePaymentDetails = createAsyncThunk('postCCAvenuePaymentDetails/payment', async (postData) => { + + return await axiosInstanceData.post('/ccavenuePaymentDetails', postData) +}) + +export const getccavenuePaymentDetails = createAsyncThunk('getccavenuePaymentDetails', async () => { + return await axiosInstanceData.get('/ccavenuePaymentDetails?activeStatus=A') +}) + +export const getPaymentMethod = createAsyncThunk('getPaymentMethod/getPaymentMethod', async () => { + return await axiosInstanceData.get('/ccavenuePaymentDetails'); +}); +// +export const getallplanDtl = createAsyncThunk('getallplanDtl', async (data) => { + if (data?.AppId != null && data?.AppId != undefined && data?.UserId != null && data?.UserId != undefined) { + return await axiosInstanceData.get(`/AllDetailPlanMod?AppId=${data?.AppId}&UserId=${data?.UserId}`); + } +}); + +export const postDowngrade = createAsyncThunk('postDowngrade', async (postData) => { + + return await axiosInstanceData.post('/ModifySubcription', postData) +}) +export const putFeaturechange = createAsyncThunk('putFeaturechange', async (putData) => { + + return await axiosInstanceData.put('/ModifySubcription', putData) +}) + +export const getUsedplandata = createAsyncThunk('getUsedplandata', async (data) => { + if (data?.AppId != null && data?.AppId != undefined && data?.UserId != null && data?.UserId != undefined && data?.type != null && data?.type != undefined) { + return await axiosInstanceData.get(`/UserAppMap?AppId=${data?.AppId}&UserId=${data?.UserId}&type=${data?.type}`) + } +}) + +export const putPaymentMethod = createAsyncThunk('putPaymentMethod/putPaymentMethod', async (putData) => { + + return await axiosInstanceData.put('/PaymentSuccess', putData); +}); +export const postEmailApi = createAsyncThunk('postEmailApi/Email', async (postData) => { + + return await axiosInstanceEMAIL_SMSData.post(`/Email`, postData) +}) +export const getEmployeRefferal = createAsyncThunk('getEmployeRefferal',async(data)=>{ + if (data.AppId != null && data.AppId != undefined && data.UserId != null && data.UserId != undefined && data.Type != null && data.Type != undefined) { + + return await axiosInstanceData.get(`/UserAppMap?AppId=${data.AppId}&UserId=${data.UserId}&Type=${data.Type}`) + + } +}) + + +export const getReferaluserdata = createAsyncThunk('getReferaluserdata',async(data)=>{ +return await axiosInstanceData.get(`/ReferralSetup?referralCode=${data.referralCode}`) +}) \ No newline at end of file diff --git a/src/features/kisokDevice/kisokDevice.js b/src/features/kisokDevice/kisokDevice.js new file mode 100644 index 0000000..bc93498 --- /dev/null +++ b/src/features/kisokDevice/kisokDevice.js @@ -0,0 +1,63 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; +import axios from "axios"; + +const apiUrl = import.meta.env.ENV_API_URL; + +export const GetAdminData = createAsyncThunk('GetAdminData', async (data) => { + if(data?.Type != null && data?.Type != undefined && data?.AppId != null && data?.AppId != undefined){ + return await axios.get(`${apiUrl}/UAMFeatAddon?Type=${data?.Type}&AppId=${data?.AppId}`) + } + +}) + +export const GetMacAddress = createAsyncThunk('GetAdminData', async () => { + return await axiosInstanceData.get('/DeviceInfo') + +}) +export const GetMacAddressnotallocated = createAsyncThunk('GetMacAddressnotallocated', async () => { + return await axiosInstanceData.get('/DeviceInfo?type="DI"') + + }) +export const PostMacAddress = createAsyncThunk('PostMacAddress', async (postData) => { + + return await axiosInstanceData.post('/DeviceInfo',postData) + +}) +export const PutMacAddress = createAsyncThunk('PostMacAddress', async (putData) => { + + return await axiosInstanceData.put('/DeviceInfo',putData) + +}) + +export const DeleteMacAddress = createAsyncThunk('PostMacAddress', async (data) => { + return await axiosInstanceData.delete(`/DeviceInfo?activeStatus=${data?.ActiveStatus}&deviceId=${data?.deviceId}&updatedBy=${data?.UpdatedBy}`) + +}) + +export const Postdeviceallocation = createAsyncThunk('Postdeviceallocation',async (postData) =>{ + + return await axiosInstanceData.post('/DeviceAllocation',postData) +}) + +export const GetDeviceallocation = createAsyncThunk('GetDeviceallocation', async () => { + return await axiosInstanceData.get('/DeviceAllocation') +}) + +export const getUserAppDetails = createAsyncThunk( + "moduleAccess/getUserAppDetails", + async ({ UserId, AppId }) => { + if(UserId != null && UserId != undefined && AppId != null && AppId != undefined){ + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&AppId=${AppId}`); + } + } + ); + +export const PutDeviceAllocation = createAsyncThunk('PutDeviceAllocation', async (putData) => { + + return await axiosInstanceData.put('/DeviceAllocation',putData) +}) + +export const DeleteDeviceAllocation = createAsyncThunk('DeleteDeviceAllocation', async (deleteData) => { + return await axiosInstanceData.delete(`/DeviceAllocation?activeStatus=${deleteData?.ActiveStatus}&uniqueId=${deleteData?.uniqueId}&updatedBy=${deleteData?.UpdatedBy}`) +}) \ No newline at end of file diff --git a/src/features/paymentDeviceConfig/paymentDeviceConfig.js b/src/features/paymentDeviceConfig/paymentDeviceConfig.js new file mode 100644 index 0000000..a71afdf --- /dev/null +++ b/src/features/paymentDeviceConfig/paymentDeviceConfig.js @@ -0,0 +1,55 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; +import axios from "axios"; + +const apiUrl = import.meta.env.ENV_API_URL; + +export const getApplicationNames = createAsyncThunk("getApplicationNames", async () => { + return axios.get(`${apiUrl}/application?activeStatus=A`); +}); + +export const GetAdminData = createAsyncThunk('GetAdminData', async ({AppId,Type}) => { + if(AppId != null && AppId != undefined && Type != null && Type != undefined){ + return await axios.get(`${apiUrl}/UAMFeatAddon?Type=${Type}&AppId=${AppId}`) + } +}) + + +export const getStoreData = createAsyncThunk("getStoreData", + async ({ UserId, AppId }) => { + if(UserId !=null && UserId !=undefined && AppId != null && AppId != undefined){ + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&AppId=${AppId}`); + } + } + ); + + +export const getBranchData = createAsyncThunk( + "getBranchData", + async ({ storeId }) => { + if (storeId != null && storeId != undefined) { + return await axiosInstanceData.get(`/branch?CompId=${storeId}`); + } + } +); + + +export const getPaymentDeviceConfig = createAsyncThunk('GetPaymentDeviceConfig', async () => { + return await axiosInstanceData.get('/PaymentDeviceconfig') +}) + +export const postPaymentDeviceConfig = createAsyncThunk('postPaymentDeviceConfig', async (postData) => { + + return await axiosInstanceData.post('/PaymentDeviceconfig', postData) +}) + +export const putPaymentDeviceConfig = createAsyncThunk('putPaymentDeviceConfig', async (putData) => { + + return await axiosInstanceData.put('/PaymentDeviceconfig', putData) +}) + +export const deletePaymentDeviceConfig = createAsyncThunk('deletePaymentDeviceConfig', async (deleteData) => { + return await axiosInstanceData.delete(`/PaymentDeviceconfig?uniqueId=${deleteData?.UniqueId}&updatedBy=${deleteData?.UpdatedBy}&activeStatus=${deleteData?.ActiveStatus}`) +}) + + diff --git a/src/features/paymentPage/paymentPage.js b/src/features/paymentPage/paymentPage.js new file mode 100644 index 0000000..fcfe819 --- /dev/null +++ b/src/features/paymentPage/paymentPage.js @@ -0,0 +1,52 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; +import axios from "axios"; + +const apiUrl = import.meta.env.ENV_API_URL; + +export const getPaymentMethod = createAsyncThunk('getPaymentMethod/getPaymentMethod', async () => { + return await axiosInstanceData.get('/ccavenuePaymentDetails'); +}); +export const getPaymentMethodWithActiveStatus = createAsyncThunk('getPaymentMethod/getPaymentMethod', async () => { + return await axiosInstanceData.get('/ccavenuePaymentDetails?activeStatus=A'); +}); +export const PostPaymentMethod = createAsyncThunk('PostPaymentMethod/PostPaymentMethod', async (postData) => { + + return await axiosInstanceData.post('/ccavenueDetails',postData) +}) +export const PutPaymentMethod = createAsyncThunk('PostPaymentMethod/PutPaymentMethod', async (putData) => { + + return await axiosInstanceData.put('/ccavenueDetails',putData) +}) + +export const GetPaymentGatewayconfig = createAsyncThunk('GetPaymentMethod/GetPaymentGatewayconfig', async () => { + return await axiosInstanceData.get('/PaymentGatewayConfig') +}) + +export const GetAdminData = createAsyncThunk('GetAdminData', async ({AppId,Type}) => { + if(AppId != null && AppId != undefined && Type != null && Type != undefined){ + return await axios.get(`${apiUrl}/UAMFeatAddon?Type=${Type}&AppId=${AppId}`) + } +}) + +export const PostPaymentGatewayconfig = createAsyncThunk('PostPaymentMethod/PostPaymentGatewayconfig', async (postData) => { + + return await axiosInstanceData.post('/PaymentGatewayConfig',postData) +}) +export const DeletePaymentGatewayconfig = createAsyncThunk('PostPaymentMethod/DeletePaymentGatewayconfig', async (deleteData) => { + return await axiosInstanceData.delete(`/PaymentGatewayConfig?uniqueId=${deleteData?.uniqueId}&updatedBy=${deleteData?.UpdatedBy}&activeStatus=${deleteData?.ActiveStatus}`,) +}) + +export const PutPaymentGatewayconfig = createAsyncThunk('PutPaymentGatewayconfig/PutPaymentGatewayconfig', async (putData) => { + return await axiosInstanceData.put('/PaymentGatewayconfig',putData) +}) +export const deletePaymentMethod = createAsyncThunk('deletePaymentMethod/deletePaymentMethod', async (deleteData) => { + if(deleteData?.MethodId && deleteData?.ActiveStatus){ + return await axiosInstanceData.delete(`/ccavenuePaymentMethod?methodId=${deleteData?.MethodId}&activeStatus=${deleteData?.ActiveStatus}`) + } +}) +export const deletePaymentDetail = createAsyncThunk('deletePaymentMethod/deletePaymentMethod', async (deleteData) => { + if(deleteData?.UniqueId && deleteData?.ActiveStatus){ + return await axiosInstanceData.delete(`/ccavenueDetails?uniqueId=${deleteData?.UniqueId}&activeStatus=${deleteData?.ActiveStatus}`) + } +}) diff --git a/src/features/paymentUPIdetails/paymentUPIdetails.js b/src/features/paymentUPIdetails/paymentUPIdetails.js new file mode 100644 index 0000000..75ad194 --- /dev/null +++ b/src/features/paymentUPIdetails/paymentUPIdetails.js @@ -0,0 +1,94 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + + +export const getCmpanyBranch = createAsyncThunk('branch/getCmpanyBranch',async(CompId) =>{ + if(CompId != null && CompId !=undefined){ + return await axiosInstanceData.get(`/branch?CompId=${CompId}`) + } + +}) + +export const getPricingMode = createAsyncThunk('getPricingMode/getPricingMode', async () => { + return await axiosInstanceData.get('/configMaster?TypeName=Payment Mode&ActiveStatus=A') +}) + +export const getPaymentUPIDetails = createAsyncThunk('paymentUpiDetails/getPaymentUPIDetails',async() =>{ + return await axiosInstanceData.get('/paymentUpiDetails?') + +}) + +export const getAdminPaymentUPIDetails = createAsyncThunk('paymentUpiDetails/getAdminPaymentUPIDetails',async(UserId) =>{ + if(UserId != null && UserId != undefined){ + return await axiosInstanceData.get(`/paymentUpiDetails?UserId=${UserId}&type=O`) + } + +}) + +export const postPaymentUpiDetails = createAsyncThunk('paymentUpiDetails/postPaymentUpiDetails',async(postData) =>{ + + return await axiosInstanceData.post('/paymentUpiDetails', postData) + +}) + +export const putPaymentUpiDetails = createAsyncThunk('paymentUpiDetails/putPaymentUpiDetails', async (putData) => { + + return await axiosInstanceData.put('/paymentUpiDetails', putData) +}) + +export const deletePaymentUPIDetails = createAsyncThunk('paymentUpiDetails/deletePaymentUPIDetails', async (deleteData) => { + + return await axiosInstanceData.delete('/paymentUpiDetails', { params: deleteData }) +}) + + + +const initialState = { + CmpanyBranchData: [], + PaymentUPIData: [], + AdminPaymentUPIData: [] +} + +const paymentUPIdetailsSlice = createSlice({ + name:'messagetemplate', + initialState, + extraReducers: builder => { + builder.addCase(getCmpanyBranch.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.CmpanyBranchData = action?.payload?.data?.data + } + else { + state.CmpanyBranchData = [] + } + + }) + + builder.addCase(getPaymentUPIDetails.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.PaymentUPIData = action?.payload?.data?.data + } + else { + state.PaymentUPIData = [] + } + + }) + + builder.addCase(getAdminPaymentUPIDetails.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.AdminPaymentUPIData = action?.payload?.data?.data + } + else { + state.AdminPaymentUPIData = [] + } + + }) + + } + +}) + + +export const CmpanyBranchDataSelector = state => state.paymentUPIdetails?.CmpanyBranchData +export const PaymentUPIDetailsSelector = state => state.paymentUPIdetails?.PaymentUPIData +export const AdminPaymentUPIDataSelector = state => state.paymentUPIdetails?.AdminPaymentUPIData +export default paymentUPIdetailsSlice.reducer; \ No newline at end of file diff --git a/src/features/priceType/priceType.js b/src/features/priceType/priceType.js new file mode 100644 index 0000000..2993f56 --- /dev/null +++ b/src/features/priceType/priceType.js @@ -0,0 +1,144 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +export const getPricingType = createAsyncThunk( + "priceType/pricingType", + async (AppId) => { + return await axiosInstanceData.get('/pricingType'); + } +); + +export const getPricingTypeForm = createAsyncThunk( + "priceType/getPricingTypeForm", + async (data) => { + if (data?.appId != null && data?.appId != undefined && data?.pricingName != null && data?.pricingName != undefined) { + return await axiosInstanceData.get( + `/PricingType?appId=${data?.appId}&pricingName=${data?.pricingName}` + ); + } + } +); + +export const getPricingTag = createAsyncThunk( + "priceType/getPricingTag", + async () => { + return await axiosInstanceData.get('/configMaster?TypeName=Pricing Type'); + } +); + +export const getTaxdata = createAsyncThunk("priceType/getTaxdata", async () => { + return await axiosInstanceData.get('/adminTax?ActiveStatus=A'); +}); + +export const getCurrData = createAsyncThunk( + "priceType/getCurrData", + async () => { + return await axiosInstanceData.get('/currency?ActiveStatus=A'); + } +); + +export const postPriceType = createAsyncThunk( + "priceType/postPriceType", + async (postData) => { + + return await axiosInstanceData.post('/pricingType', postData); + } +); + +export const putPriceType = createAsyncThunk( + "priceType/putPriceType", + async (putData) => { + + return await axiosInstanceData.put('/pricingType', putData); + } +); + +export const deletePriceType = createAsyncThunk( + "priceType/deletePriceType", + async (deleteData) => { + return await axiosInstanceData.delete( + `/pricingType?PricingId=${deleteData?.PricingId}&ActiveStatus=${deleteData?.ActiveStatus}&UpdatedBy=${deleteData?.UpdatedBy}` + ); + } +); +//http://192.168.1.37/userAppMap/PlanChange +export const postPlanChange = createAsyncThunk( + "postPlanChange/userAppMap", + async (postData) => { + + return await axiosInstanceData.post('/userAppMap/PlanChange', postData); + } +); +export const putplanchange = createAsyncThunk( + "putplanchange/userAppMap", + async (putData) => { + + return await axiosInstanceData.put('/userAppMap/PlanChange', putData); + } +); + +export const getUserCredit = createAsyncThunk( + "getUserCredit/userAppMap", + async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get( + `/userAppMap/UserCredit?request.userId=${UserId}` + ); + } + } +); + +export const getFeatureonType = createAsyncThunk( + "feature/getFeatureonType", + async (data) => { + return await axiosInstanceData.get('/FeatureAddon'); + } +); +export const putFeatureonType = createAsyncThunk( + "feature/getFeatureonType", + async (putData) => { + + return await axiosInstanceData.put('/FeatureAddon', putData); + } +); +export const getFeatureonTypeApp = createAsyncThunk( + "feature/getFeatureonType", + async (data) => { + if (data != null && data != undefined) { + return await axiosInstanceData.get(`/FeatureAddon?request.appId=${data}`); + } + } +); + +export const deleteFeatureonType = createAsyncThunk('feature/deleteFeatureonType', async (deleteData) => { + return await axiosInstanceData.delete(`/FeatureAddon?request.appId=${deleteData?.appId}&request.updatedBy=${deleteData?.updatedBy}&request.activeStatus=${deleteData?.activeStatus}`) +}); +export const PostFeatureonType = createAsyncThunk('feature/PostFeatureonType', async (postData) => { + + return await axiosInstanceData.post('/FeatureAddon',postData) +}) +export const PostOnlineUserTracking = createAsyncThunk('feature/PostOnlineUserTracking', async (postData) => { + + return await axiosInstanceData.post('/OnlineUserTracking',postData) +}) +const initialState = { + priceData: [], +}; + +const priceSlice = createSlice({ + name: "priceType", + initialState, + extraReducers: (builder) => { + builder.addCase(getPricingType.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.priceData = action?.payload?.data?.data; + } else { + state.priceData = []; + } + }); + }, +}); + +export const priceSelector = (state) => state.priceData?.priceData; + +export default priceSlice.reducer; diff --git a/src/features/pricingType/pricingType.js b/src/features/pricingType/pricingType.js new file mode 100644 index 0000000..dc1205d --- /dev/null +++ b/src/features/pricingType/pricingType.js @@ -0,0 +1,227 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import { axiosInstanceData, axiosInstanceEMAIL_SMSData } from '../AuthenticationTokens/AuthenticationToken'; +import axios from "axios"; + +const apiUrl = import.meta.env.ENV_API_URL; + +export const getPricingType = createAsyncThunk( + "pricingAppFeatMap/getPricingType", + async ({ toggleValue, AppId, UserId }) => { + if (toggleValue != null && toggleValue != undefined && AppId != null && AppId != undefined && UserId != null && UserId != undefined) { + return await axios.get( + `${apiUrl}/pricingAppFeatMap?Type=${toggleValue}&AppId=${AppId}&UserId=${UserId}` + ); + } + } +); + +export const getPricingType2 = createAsyncThunk( + "pricingAppFeatMap/getPricingType", + async ({ toggleValue, AppId, UserId }) => { + if (toggleValue != null && toggleValue != undefined && AppId != null && AppId != undefined && UserId != null && UserId != undefined) { + return await axios.get( + `${apiUrl}/pricingAppFeatMap?Type=${toggleValue}&AppId=${AppId}&UserId=${UserId}` + ); + } + } +); + +export const getPricingTypeAppId = createAsyncThunk( + "pricingType/getPricingTypeAppId", + async ({ toggleValue, AppId }) => { + if (toggleValue != null && toggleValue != undefined && AppId != null && AppId != undefined) { + return await axiosInstanceData.get( + `/pricingType?Type=${toggleValue}&AppId=${AppId}` + ); + } + } +); + +export const postFreeOption = createAsyncThunk( + "userAppMap/postFreeOption", + async (postData) => { + + return await axiosInstanceData.post('/userAppMap/FreeOption', postData); + } +); + +export const getUserDetails = createAsyncThunk( + "getUserDetail/getUserDetails", + async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/user?UserId=${UserId}`); + } + } +); + +export const SendPaymentLink = createAsyncThunk( + "SendPaymentLink/SendPaymentLink", + async ({ MobileNo, url }) => { + if (MobileNo != null && MobileNo != undefined && url != null && url != undefined) { + return await axiosInstanceData.post('/verifyOTP/SendPaymentLink', { + MobileNo: MobileNo, + MessageHeader: "PaymentLink", + Link: url + }); + } + } +); + +export const CheckPaymentStatus = createAsyncThunk( + "SendPaymentLink/SendPaymentLink", + async (BookingId) => { + if (BookingId != null && BookingId != undefined) { + return await axiosInstanceData.get( + `/userAppMap?UniqueId=${BookingId}&PaymentStatus=S` + ); + } + } +); + +export const UpdatePayment = createAsyncThunk( + "UpdatePayment/UpdatePayment", + async (putdata) => { + + return await axiosInstanceData.put('/userAppMap/paymentStatus', putdata); + } +); + +export const getPaymentUpiDetails = createAsyncThunk( + "getPaymentUpiDeatils/getPaymentUpiDeatils", + async () => { + return await axiosInstanceData.get('/paymentUpiDetails?activeStatus=A&type=I'); + } +); + +export const getPaymentModeDetails = createAsyncThunk( + "getPaymentUpiDeatils/getPaymentModeDeatils", + async (Id) => { + if (Id != null && Id != undefined) { + return await axiosInstanceData.get( + `/paymentUpiDetails?PaymentUPIDetailsId=${Id}` + ); + } + } +); + +export const getUserMappDetails = createAsyncThunk( + "getUserMappDetails/getUserMappDetails", + async (BookingId) => { + if (BookingId != null && BookingId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UniqueId=${BookingId}`); + } + } +); + +export const sharePdfDocument = createAsyncThunk( + "sharePdfDocument/sharePdfDocument", + async ({ data }) => { + + return await axiosInstanceData.post('/userAppMap/send-invoicedetail', data); + } +); +export const sendSms = createAsyncThunk('postEmailApi/SMS', async (postData) => { + + return await axiosInstanceEMAIL_SMSData.post(`/SMS`, postData) +}) +export const getPricingFeatures = createAsyncThunk( + "pricingAppFeatureMap/getPricingFeatures", + async ({ toggleValue, AppId }) => { + if (toggleValue != null && toggleValue != undefined && AppId != null && AppId != undefined) { + return await axios.get( + `${apiUrl}/pricingAppFeatMap?AppId=${AppId}&Type=${toggleValue}` + ); + } + } +); +export const getPurchasedPlan = createAsyncThunk( + "pricingAppFeatureMap/getPurchasedPlan", + async ({ UserId, AppId }) => { + if (UserId != null && UserId != undefined && AppId != null && AppId != undefined) { + return await axios.get( + `${apiUrl}/pricingAppFeatMap?AppId=${AppId}&UserId=${UserId}` + ); + } + } +); + +export const getPurchasedAppDetails = createAsyncThunk( + "homePage/PlanChanges", + async ({ UserId, AppId }) => { + if (UserId != null && UserId != undefined && AppId != null && AppId != undefined) { + return await axiosInstanceData.get( + `/userAppMap/PlanChange?AppId=${AppId}&UserId=${UserId}` + ); + } + } +); +export const getUsedplandata = createAsyncThunk('getUsedplandata', async (data) => { + if (data?.UserId != null && data?.UserId != undefined && data?.AppId != null && data?.AppId != undefined && data?.type != null && data?.type != undefined) { + return await axiosInstanceData.get(`/UserAppMap?AppId=${data?.AppId}&UserId=${data?.UserId}&type=${data?.type}`) + } +}) +export const getUserBasedConstraint = createAsyncThunk( + "userAppMap/UserBasedConstraint", + async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/userAppMap/UserBasedConstraint?UserId=${UserId}`); + } + } +) +const initialState = { + PricingType: [], + PricingTypeFeat: [], + Adminplanschanges: false, + NewPlandata: [] +}; + +const pricingTypeSlice = createSlice({ + name: "pricingType", + initialState, + reducers: { + ChangeAdminplanschanges: (state, action) => { + + state.Adminplanschanges = action?.payload + }, + changeNewPlandata: (state, action) => { + + state.NewPlandata = action?.payload + }, + }, + extraReducers: (builder) => { + builder.addCase(getPricingType.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.PricingType = action?.payload?.data?.data; + } else { + state.PricingType = []; + } + }); + + builder.addCase(getPricingTypeAppId.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.PricingType = action?.payload?.data?.data; + } else { + state.PricingType = []; + } + }); + + builder.addCase(getPricingFeatures.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.PricingTypeFeat = action?.payload?.data?.data; + } else { + state.PricingTypeFeat = []; + } + }); + }, +}); +export const { + ChangeAdminplanschanges, + changeNewPlandata +} = pricingTypeSlice.actions + +export const pricingTypeSelector = (state) => state.PricingType?.PricingType; +export const pricingTypeFeatSelector = (state) => state.PricingType?.PricingTypeFeat; +export const GlobalAdminplanschanges = (state) => state.pricingType?.Adminplanschanges; +export const GlobalNewPlandata = (state) => state.pricingType?.NewPlandata; + +export default pricingTypeSlice.reducer; diff --git a/src/features/publicHome/publicHome.js b/src/features/publicHome/publicHome.js new file mode 100644 index 0000000..b85dac6 --- /dev/null +++ b/src/features/publicHome/publicHome.js @@ -0,0 +1,97 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import { axiosInstanceData } from '../AuthenticationTokens/AuthenticationToken'; +const apiUrl = import.meta.env.ENV_API_URL; + + +const apiUrlToken = import.meta.env.ENV_API_URL_TOKEN; + + +export const getCategoryData = createAsyncThunk('publicHome/pricingType', async () => { + return await axios.get(`${apiUrl}/application?Type=A`) +}) + +export const getMainModuleData = createAsyncThunk('publicHome/getMainModuleData', async ({ TypeName }) => { + if (TypeName != null && TypeName != undefined) { + return await axiosInstanceData.get(`/configMaster?TypeName=${TypeName}`) + } +}) +export const getModuleData = createAsyncThunk('publicHome/getModuleData', async ({ AlphaNumFId }) => { + if (AlphaNumFId != null && AlphaNumFId != undefined) { + return await axiosInstanceData.get(`/configMaster?AlphaNumFId=${AlphaNumFId}`) + } +}) + +export const getSubCategoryData = createAsyncThunk('publicHome/getSubCategoryData', async (CatId) => { + if (CatId != null && CatId != undefined) { + return await axios.get(`${apiUrl}/application?CateId=${CatId}`) + } +}) + +export const getApplicationData = createAsyncThunk('publicHome/getApplicationData', async (SubCatId) => { + if (SubCatId != null && SubCatId != undefined) { + return await axios.get(`${apiUrl}/application?SubId=${SubCatId}`) + } +}); + +export const getAllApplicationData = createAsyncThunk('publicHome/getApplicationData', async () => { + return await axios.get(`${apiUrl}/application`) +}); +export const getAllApplicationPlan = createAsyncThunk('publicHome/getApplicationData', async () => { + return await axios.get(`${apiUrl}/application?Type=D`) +}); + +export const postApplicationData = createAsyncThunk('application/postApplicationData', async (postData) => { + + return await axiosInstanceData.post('/application', postData) +}) +export const PostToken = createAsyncThunk('publicHome/PostToken', async (data) => { + + const params = new URLSearchParams(); + for (const key in data) { + params.append(key, data[key]); + } + try { + const response = await axios.post(`${apiUrlToken}/jwtTokenGenerator`, data, { + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, + }); + + const { token } = response?.data; + if (!sessionStorage.getItem('auth')) { + sessionStorage.setItem('auth', token) + } + } catch (error) { + console.error('Error:', error); + } +}); + +const initialState = { + homeData: [] +} + +const publicHomeSlice = createSlice({ + name: 'publicHome', + initialState, + extraReducers: builder => { + builder.addCase(getCategoryData.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.homeData = action?.payload?.data?.data + } + else { + state.homeData = [] + } + + }) + } + +}) + +export const publicHomeSelector = state => state.homeData?.homeData + + + + +export default publicHomeSlice.reducer; \ No newline at end of file diff --git a/src/features/purcheseInfo/purcheseInfo.js b/src/features/purcheseInfo/purcheseInfo.js new file mode 100644 index 0000000..4cf5c08 --- /dev/null +++ b/src/features/purcheseInfo/purcheseInfo.js @@ -0,0 +1,21 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +const apiUrl = import.meta.env.ENV_API_URL; + +export const getPurcheseInfo = createAsyncThunk("getPurcheseInfo", async () => { + return await axiosInstanceData.get(`${apiUrl}/UserPurchaseHistory`); +}); + + +export const getPurcheseInfoCount = createAsyncThunk("getPurcheseInfo", async () => { + return await axiosInstanceData.get(`${apiUrl}/UserPurchaseHistory/Count`); +}); + + +export const getPurcheseInfoFilter = createAsyncThunk("getPurcheseInfoFilter", async (data) => { + return await axiosInstanceData.get(`${apiUrl}/UserPurchaseHistory?type=${data}`); +}); + + + diff --git a/src/features/signInPage/signInPage.js b/src/features/signInPage/signInPage.js new file mode 100644 index 0000000..bb87df2 --- /dev/null +++ b/src/features/signInPage/signInPage.js @@ -0,0 +1,120 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import axios from "axios"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; +const subDirectory = import.meta.env.ENV_API_URL + + +export const GenerateLogout = createAsyncThunk('signInPage/GenerateLogout', async ({ UserId,status }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.put('/Logout',{ "UserId": UserId,"Generate": status,"RequestMode":"DW" }) + } +}) +export const checkSession = createAsyncThunk('signInPage/checkSession', async ({ UserId,SessionId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/UserSessionId?UserId=${UserId}&SessionId=${SessionId}`) + } +}) +export const getUserData = createAsyncThunk('signInPage/getUserData', async ({ MobileNo,deviceId }) => { + if (MobileNo != null && MobileNo != undefined) { + return await axiosInstanceData.get(`/user?MobileNo=${MobileNo}&deviceId=${deviceId}`) + } +}) +export const verifyUserLoginPassword = createAsyncThunk('signInPage/verifyUserLogin', async ({ MobileNo, Password, IP, Browser, Version, OS, LoginType,AnotherWindow,deviceId,SessionId}) => { + if (MobileNo != null && MobileNo != undefined && Password != null && Password != undefined && AnotherWindow != undefined ) { + return await axiosInstanceData.get(`/login?UserName=${MobileNo}&Password=${Password}&IP=${IP}&Browser=${Browser}&Version=${Version}&OS=${OS}&LoginType=${LoginType}&AnotherWindow=${AnotherWindow}&RequestMode=DW&deviceId=${deviceId}&SessionId=${SessionId}`) + } +}) + +export const verifyUserLoginPin = createAsyncThunk('signInPage/verifyUserLogin', async ({ MobileNo, Pin, IP, Browser, Version, OS, LoginType,AnotherWindow,deviceId,SessionId}) => { + if (MobileNo != null && MobileNo != undefined && Pin != null && Pin != undefined && AnotherWindow != undefined) { + return await axiosInstanceData.get(`/login?UserName=${MobileNo}&Pin=${Pin}&IP=${IP}&Browser=${Browser}&Version=${Version}&OS=${OS}&LoginType=${LoginType}&AnotherWindow=${AnotherWindow}&RequestMode=DW&deviceId=${deviceId}&SessionId=${SessionId}`) + } +}) +export const sendOtp = createAsyncThunk('signInPage/verifyOTP', async ({ MobileNo }) => { + return await axiosInstanceData.post(`/verifyOTP`, { "UserName": MobileNo}) + +}) +export const sendOtpMobileNo = createAsyncThunk('signInPage/sendOtpMobileNo', async ({ MobileNo }) => { + return await axiosInstanceData.post('/verifyOTP/getOTP', { "UserName": MobileNo, "Type": "N" }) + +}) +export const setUser = createAsyncThunk('signInPage/setUser', async ({ MobileNo,deviceId }) => { + return await axiosInstanceData.post('/verifyOTP/setUser', { "UserName": MobileNo, "Type": "N","RequestMode":"DW","deviceId":deviceId}) + +}) +export const VerifyOtp = createAsyncThunk('signInPage/AccessTokenByOTP', async ({ MobileNo,OTP, IP, Browser, Version, OS, LoginType,deviceId,SessionId }) => { + if(MobileNo != null && MobileNo != undefined && OTP != null && OTP != undefined){ + return await axiosInstanceData.get(`/AccessTokenByOTP?userName=${MobileNo}&OTP=${OTP}&IP=${IP}&Browser=${Browser}&Version=${Version}&OS=${OS}&LoginType=${LoginType}&RequestMode=DW&deviceId=${deviceId}&SessionId=${SessionId}`) + } +}) +export const getAppAccess = createAsyncThunk('homePage/getAppAccess', async ({ UserId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/appAccess?UserId=${UserId}&Type=UC`) + } +}) +export const getuserAppMap = createAsyncThunk('signInPage/getuserAppMap', async ({ UserId }) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UserId=${UserId}`) + } + +}) +export const getAppName = createAsyncThunk('AppName/getAppName', async ({ AppId }) => { + if (AppId != null && AppId != undefined) { + return await axios.get(`${subDirectory}/application?AppId=${AppId}`) + } +}) + +export const getAuthorizedSession = createAsyncThunk('AuthorizedSession/getAuthorizedSession', async ({ UserId,SessionId }) => { + console.log("getAuthorizedSession",UserId,SessionId) + if (UserId != null && UserId != undefined && SessionId != null && SessionId != undefined) { + console.log("getAuthorizedSession1",UserId,SessionId) + return await axios.get(`${subDirectory}/AuthorizedSession?UserId=${UserId}&SessionId=${SessionId}`) + // return await axiosInstanceData.get(`/AuthorizedSession?UserId=${UserId}&SessionId=${SessionId}`) + } +}) + +// export const getAuthorizedSession = createAsyncThunk('AuthorizedSession/getAuthorizedSession', async ({ UserId, SessionId, Mobileno }) => { +// if (UserId != null && UserId != undefined && SessionId != null && SessionId != undefined) { +// try { +// const response = await axios.get(`${subDirectory}/AuthorizedSession`, { +// headers: { +// 'Authorization': `Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9`, // Add the Authorization header +// 'Mobileno': Mobileno, // Add the Mobileno header +// }, +// params: { +// UserId, +// SessionId +// } +// }); +// console.log("responseresponse",response) +// return response; // Return the response data from the API +// } catch (error) { +// console.error("Error fetching authorized session:", error); +// throw error; // You can throw an error here to handle it in the thunk +// } +// } +// }); + +const initialState = { + UserData: [] +} + + +const signInPageSlice = createSlice({ + name: 'signInPage', + initialState, + extraReducers: builder => { + builder.addCase(getUserData.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode === 1) { + state.UserData = action?.payload?.data?.data + } else { + state.UserData = [] + } + }) + } + +}) +export const getUserDataSelector = state => state.signInPage.UserData + +export default signInPageSlice.reducer; + diff --git a/src/features/signinDetails/signinDetails.js b/src/features/signinDetails/signinDetails.js new file mode 100644 index 0000000..3768efa --- /dev/null +++ b/src/features/signinDetails/signinDetails.js @@ -0,0 +1,69 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +// export const getSigninDetails = createAsyncThunk('signinDetails/getSigninDetails', async (data) => { + +// if (data?.Fromdate != null && data?.Fromdate != undefined && data?.Todate != null && data?.Todate != undefined) { +// return await axiosInstanceData.get(`/UserLoginLog?FromDate=${data?.Fromdate}&ToDate=${data?.Todate}`) +// } +// else{ + +// return await axiosInstanceData.get(`/UserLoginLog`) +// } +// }) +export const getSigninDetails = createAsyncThunk('signinDetails/getSigninDetails', async (data) => { + + // if (data?.Fromdate != null && data?.Fromdate != undefined && data?.Todate != null && data?.Todate != undefined) { + // return await axiosInstanceData.get(`/UserLoginLog?FromDate=${data?.Fromdate}&ToDate=${data?.Todate}`) + // } + if(data?.role != null && data?.role != undefined && data?.pageNumber) { + return await axiosInstanceData.get(`/UserLoginLog?pageNumber=${data?.pageNumber}&role=${data?.role}`) + + + } + else { + + return await axiosInstanceData.get(`/UserLoginLog?pageNumber=${data?.pageNumber}`) + } +}) +export const getSigninDetailswithUserId = createAsyncThunk('signinDetails/getSigninDetails', async ({ Fromdate,Todate, userId}) => { + + + if (Fromdate != null && Fromdate != undefined && Todate != null && Todate != undefined && userId != null && userId != undefined) { + return await axiosInstanceData.get(`/UserLoginLog?FromDate=${Fromdate}&ToDate=${Todate} &userId=${userId}`) + } + + // else + else if (userId != null && userId != undefined ) { + return await axiosInstanceData.get(`/UserLoginLog?userId=${userId}`) + } + // else { + + // return await axiosInstanceData.get(`/UserLoginLog?pageNumber=${data?.pageNumber}`) + // } +}) +export const getOnlineUserTracking = createAsyncThunk( + "feature/getOnlineUserTracking", + async (data) => { + return await axiosInstanceData.get(`/OnlineUserTracking?pageNumber=${data?.pageNumber}`); + } +); + +export const getUserOtp = createAsyncThunk('signinDetails/getUserOtp',async ({ AppId, BranchId, CompId, userTypeName, pageNumber }) => { + const queryParams = new URLSearchParams(); + + if (AppId) queryParams.append("AppId", AppId); + if (BranchId) queryParams.append("BranchId", BranchId); + if (CompId) queryParams.append("CompId", CompId); + if (userTypeName) queryParams.append("userTypeName", userTypeName); + if (pageNumber) queryParams.append("pageNumber", pageNumber); + + return await axiosInstanceData.get(`/UserOtp?${queryParams.toString()}`); + } +); + + +export const PostUserOtp = createAsyncThunk('signinDetails/PostUserOtp', async (postData) => { + + return await axiosInstanceData.post('/VerifyOtp', postData) +}) \ No newline at end of file diff --git a/src/features/superAdminAccess/superAdminAccess.js b/src/features/superAdminAccess/superAdminAccess.js new file mode 100644 index 0000000..02d5397 --- /dev/null +++ b/src/features/superAdminAccess/superAdminAccess.js @@ -0,0 +1,74 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import { axiosInstanceData } from '../AuthenticationTokens/AuthenticationToken'; + +// POST request for creating new Super Admin User Access +export const postSuperAdminUserAccess = createAsyncThunk( + "superAdminAccess/postSuperAdminUserAccess", + async (postData) => { + + return await axiosInstanceData.post('/SuperAdminUserAccess', postData); + } +); + +// GET request for fetching Super Admin User Access by UserId +export const getSuperAdminUserAccess = createAsyncThunk( + "superAdminAccess/getSuperAdminUserAccess", + async ({ UserId }) => { + return await axiosInstanceData.get(`/SuperAdminUserAccess?userId=${UserId}`); + } + + + +); + +export const getSuperAllAdminUserAccess = createAsyncThunk("superAdminAccess/getSuperAllAdminUserAccess", async () => { + return await axiosInstanceData.get(`/SuperAdminUserAccess`); + +} + + + +); + +// PUT request for updating Super Admin User Access +export const putSuperAdminUserAccessData = createAsyncThunk( + "superAdminAccess/putSuperAdminUserAccessData", + async (putData) => { + + return await axiosInstanceData.put('/SuperAdminUserAccess', putData); + } +); + +// GET request to fetch Super Admin User +export const getSadminUser = createAsyncThunk( + "moduleAccess/getSadminUser", + async ({ UserType = "Super Admin User" }) => { + return await axiosInstanceData.get(`/login?Type=${UserType}`); + } +); + +const initialState = { + SuperAdminUserAccessData: [], + loading: false, + error: null, +}; + +const SuperAdminUserAccessSlice = createSlice({ + name: 'superAdminUserAccess', + initialState, + extraReducers: (builder) => { + builder.addCase(getSuperAdminUserAccess.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.SuperAdminUserAccessData = action?.payload?.data?.data?.[0]?.SuperAdminUserAccessDetails || []; + } else { + state.SuperAdminUserAccessData = []; + } + state.loading = false; + }) + + }, +}); + +export const SuperAdminUserAccessDataSelector = state => state?.superAdminUserAccess?.SuperAdminUserAccessData; + +export default SuperAdminUserAccessSlice.reducer; diff --git a/src/features/tax/tax.js b/src/features/tax/tax.js new file mode 100644 index 0000000..55669e0 --- /dev/null +++ b/src/features/tax/tax.js @@ -0,0 +1,47 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + + + +export const getAdmin = createAsyncThunk('tax/adminTax', async () => { + return await axiosInstanceData.get('/adminTax?ActiveStatus=A') +}) + +export const postTax = createAsyncThunk('tax/postFeature', async (postData) => { + + return await axiosInstanceData.post('/adminTax', postData) +}) + +export const deleteTax = createAsyncThunk('tax/deleteTax', async (deleteData) => { + return await axiosInstanceData.delete(`/adminTax?TaxId=${deleteData?.TaxId}&ActiveStatus=${deleteData?.ActiveStatus}&UpdatedBy=${deleteData?.UpdatedBy}`) +}) + + +const initialState = { + taxData: [] +} + +const taxSlice = createSlice({ + name:'tax', + initialState, + extraReducers: builder => { + builder.addCase(getAdmin.fulfilled, (state, action)=> { + if (action?.payload?.status) { + state.taxData = action?.payload?.data?.data + } + else { + state.taxData = [] + } + + }) + } + +}) + +export const taxSelector = state => state.taxData?.taxData + + + + +export default taxSlice.reducer; + diff --git a/src/features/testimonials/testimonials.js b/src/features/testimonials/testimonials.js new file mode 100644 index 0000000..6cba691 --- /dev/null +++ b/src/features/testimonials/testimonials.js @@ -0,0 +1,51 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +export const getAdminNames = createAsyncThunk('login/getAdminNames', async () => { + return await axiosInstanceData.get('/login?Type=Admin') +}) + +export const getApplications = createAsyncThunk('userAppMap/getApplications', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/userAppMap?UserId=${UserId}`) + + } +}) + +export const getActiveAppCompanyData = createAsyncThunk('appAccess/getActiveAppCompanyData', async (AppAccessData) => { + if (AppAccessData?.AppId != null && AppAccessData?.AppId != undefined && AppAccessData?.UserId != null && AppAccessData?.UserId != undefined) { + return await axiosInstanceData.get(`/appAccess?AppId=${AppAccessData?.AppId}&UserId=${AppAccessData?.UserId}&ActiveStatus=A`) + } + +}) + + +export const PostCustomerTestimonials = createAsyncThunk('company/postCompanyData', async (postData) => { + if(postData){ + + return await axiosInstanceData.post('/CustomerTestimonials', postData) + + } +}) + + +export const getCustomertestimonials= createAsyncThunk('appAccess/getActiveAppCompanyData', async () => { + + return await axiosInstanceData.get(`/CustomerTestimonials`) + +}) + + +export const PutCustomerTestimonials = createAsyncThunk('company/postCompanyData', async (putData) => { + if(putData){ + + return await axiosInstanceData.put('/CustomerTestimonials', putData) + + } +}) + + +export const deleteCustomertestimonials = createAsyncThunk('company/deleteCompanyData', async (deleteData) => { + return await axiosInstanceData.delete(`/CustomerTestimonials?activeStatus=${deleteData?.activeStatus}&uniqueId=${deleteData?.uniqueId}&updatedBy=${deleteData?.updatedBy}`) + +}) diff --git a/src/features/themeChange/themeChange.js b/src/features/themeChange/themeChange.js new file mode 100644 index 0000000..4f4a306 --- /dev/null +++ b/src/features/themeChange/themeChange.js @@ -0,0 +1,274 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; + +import { axiosInstanceData } from "../AuthenticationTokens/AuthenticationToken"; +import axios from "axios"; + +const apiUrl = import.meta.env.ENV_API_URL; + +export const getAllApplications = createAsyncThunk( + "theme/getAllApplications", + async () => { + return axios.get(`${apiUrl}/application?ActiveStatus=A`); + } +); + +export const getColors = createAsyncThunk("theme/getColors", async () => { + return axiosInstanceData.get("/color?ActiveStatus=A"); +}); + +export const getFonts = createAsyncThunk("theme/getFonts", async () => { + return axiosInstanceData.get("/font?ActiveStatus=A"); +}); + +export const getTemplate = createAsyncThunk( + "theme/getTemplate", + async (AppName) => { + if (AppName != null && AppName != undefined) { + return axiosInstanceData.get(`/template?AppName=${AppName}`); + } + } +); + +export const postColorData = createAsyncThunk( + "theme/postColorData", + async (postData) => { + return await axiosInstanceData.post("/color", postData); + } +); + +export const postFontData = createAsyncThunk( + "theme/postFontData", + async (postData) => { + return await axiosInstanceData.post("/font", postData); + } +); + +export const getComponentName = createAsyncThunk( + "Component/component", + async () => { + return await axiosInstanceData.get("/component"); + } +); + +export const postOverAllData = createAsyncThunk( + "theme/postOverAllData", + async (postData) => { + return await axiosInstanceData.post("/template", postData); + } +); + +export const putOverAllData = createAsyncThunk( + "theme/putOverAllData", + async (putData) => { + return await axiosInstanceData.put("/template", putData); + } +); + +const initialState = { + allApplications: [], + allColors: [], + allFonts: [], + CurrentColor: { + darkColor: "#37943C", + lightColor: "#b2eb9b", + }, + CurrentText: { + head: "Gilroy", + para: "Poppins", + }, + OverviewData: [], + Overview1Img: "", + Overview2Img: "", + Overview2Video: null, + FaqDetails: [], + navList1: [], + SelectedApplication: null, + AppName: "", + FeatureList: [], + FooterDetails: [], + templateData: [], + colorId: null, + fontId: null, + PricingData: [], + PageAppId: "", + showCaseDetails: [], + appViewDetails: [], + testimonialDetails: [], + CtaData: [], +}; + +const ThemeSlice = createSlice({ + name: "theme", + initialState, + reducers: { + changeShowCaseDetails: (state, action) => { + state.showCaseDetails = action?.payload; + }, + changeAppViewDetails: (state, action) => { + state.appViewDetails = action?.payload; + }, + changeTestimonialDetails: (state, action) => { + state.testimonialDetails = action?.payload; + }, + changeCurrentColor: (state, action) => { + const { color } = action?.payload + state.CurrentColor = color + }, + changeCurrentText: (state, action) => { + const { text } = action?.payload + state.CurrentText = text + }, + changeOverviewData: (state, action) => { + const { postData } = action?.payload + state.OverviewData = postData + }, + changeOverview1Img: (state, action) => { + const { overview1Img } = action?.payload + state.Overview1Img = overview1Img + }, + changeOverview2Img: (state, action) => { + const { overview2Img } = action?.payload + state.Overview2Img = overview2Img + }, + changeOverview2Video: (state, action) => { + const { overview2Video } = action?.payload + state.Overview2Video = overview2Video + }, + changeFaqDetails: (state, action) => { + const data = action?.payload + state.FaqDetails = data + }, + changeNavList1: (state, action) => { + const navList = action?.payload + state.navList1 = navList + }, + changeSelectedApplication: (state, action) => { + const AppId = action?.payload + state.SelectedApplication = AppId + }, + changeFeatureList: (state, action) => { + const { featureList } = action?.payload + state.FeatureList = featureList + }, + changeFooterDetails: (state, action) => { + state.FooterDetails = action?.payload; + }, + + changeCtaDetails: (state, action) => { + state.CtaData = action?.payload; + }, + changePricingData: (state, action) => { + const { postData } = action?.payload + state.PricingData = postData + }, + changePageAppId: (state, action) => { + state.PageAppId = action?.payload + }, + emptyTemplateData: (state, action) => { + state.SelectedApplication = null + state.AppName = '' + state.templateData = [] + }, + emptyPostData: (state, action) => { + state.navList1 = [] + state.OverviewData = [] + state.FeatureList = [] + state.PricingData = [] + state.FaqDetails = [] + state.FooterDetails = [] + state.CurrentColor = { darkColor: '#37943C', lightColor: '#b2eb9b' } + state.CurrentText = { head: 'Gilroy', para: 'Poppins' } + state.Overview1Img = "" + state.Overview2Img = "" + state.Overview2Video = null + + } + + }, + extraReducers: (builder) => { + builder.addCase(getAllApplications.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode == 1) { + state.allApplications = action?.payload?.data?.data + } + + }), + builder.addCase(getColors.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode == 1) { + state.allColors = action?.payload?.data?.data + } + }), + builder.addCase(getFonts.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode == 1) { + state.allFonts = action?.payload?.data?.data + } + + }), + builder.addCase(getTemplate.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode == 1) { + let tempDic = {} + state.SelectedApplication = { AppId: action?.payload?.data?.data[0]?.AppId } + state.AppName = action?.payload?.data?.data[0]?.AppName + state.CurrentColor = { darkColor: action?.payload?.data?.data[0]?.DarkColor, lightColor: action?.payload?.data?.data[0]?.LightColor } + state.CurrentText = { head: action?.payload?.data?.data[0]?.HeadFont, para: action?.payload?.data?.data[0]?.ParaFont } + state.fontId = action?.payload?.data?.data[0]?.FontId + state.colorId = action?.payload?.data?.data[0]?.ColorId + for (let eachData of action?.payload?.data?.data[0]?.ComponentDetails) { + tempDic[eachData.SectionName] = [eachData.ComponentName, eachData.FieldDetails] + } + state.templateData = tempDic + } else { + state.templateData = {} + } + }) + } +}) + + +export const { + changeCurrentColor, + changeCurrentText, + changeOverviewData, + changeOverview1Img, + changeOverview2Img, + changeOverview2Video, + changeFaqDetails, + changeNavList1, + changeSelectedApplication, + changeFeatureList, + changeFooterDetails, + changeCtaDetails, + changePricingData, + changePageAppId, + emptyTemplateData, + emptyPostData, + changeShowCaseDetails, + changeAppViewDetails, + changeTestimonialDetails, +} = ThemeSlice.actions; + +export const globalshowCaseDetails = (state) => state.theme?.showCaseDetails; +export const globalappViewDetails = (state) => state.theme?.appViewDetails; +export const globaltestimonialDetails = (state) => state.theme?.testimonialDetails; +export const changeCurrentColorValue = (state) => state.theme?.CurrentColor +export const changeCurrentTextValue = (state) => state.theme?.CurrentText +export const getAllApplicationsData = (state) => state.theme?.allApplications +export const getColorsData = (state) => state.theme?.allColors +export const getFontsData = (state) => state.theme?.allFonts +export const overviewPostData = (state) => state.theme?.OverviewData +export const overview1Img = (state) => state.theme?.Overview1Img +export const overview2Img = (state) => state.theme?.Overview2Img +export const overview2Video = (state) => state.theme?.Overview2Video +export const navList1Selector = (state) => state.theme?.navList1 +export const FaqDetailsSelector = (state) => state?.theme?.FaqDetails +export const selectedApplication = (state) => state?.theme?.SelectedApplication +export const selectedApplicationName = (state) => state?.theme?.AppName +export const selectedFontId = (state) => state?.theme?.fontId +export const selectedColorId = (state) => state?.theme?.colorId +export const selectedFeatureListSelector = (state) => state?.theme?.FeatureList +export const getFooterDetails = (state) => state?.theme?.FooterDetails +export const getPageAppId = (state) => state?.theme?.PageAppId +export const pricingPostData = (state) => state.theme.PricingData +export const getTemplateData = (state) => state.theme.templateData +export const getCtaDatas = (state) => state.theme.CtaData; + +export default ThemeSlice.reducer; \ No newline at end of file diff --git a/src/features/ticketsDetails/ticketsDetails.js b/src/features/ticketsDetails/ticketsDetails.js new file mode 100644 index 0000000..d1a2fbb --- /dev/null +++ b/src/features/ticketsDetails/ticketsDetails.js @@ -0,0 +1,47 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import { axiosInstanceData } from '../AuthenticationTokens/AuthenticationToken'; + +export const getTicketMaster = createAsyncThunk( + "ticketDetails/getTicketMaster", + async ({ AppId, BranchId, CompId, status, pageNumber }) => { + const params = new URLSearchParams(); + + if (AppId) params.append("appId", AppId); + if (BranchId) params.append("branchId", BranchId); + if (CompId) params.append("compId", CompId); + if (status) params.append("status", status); + params.append("pageNumber", pageNumber); + + return await axiosInstanceData.get(`/TicketMaster?${params.toString()}`); + } +); + + +export const getBranch = createAsyncThunk('ticketDetails/getBranch', async ({ AppId,CompId }) => { + if( AppId != null && AppId != undefined && CompId != null && CompId != undefined){ + return await axiosInstanceData.get(`/branch?appId=${AppId}&compId=${CompId}`) + } +}) + +export const getCompany = createAsyncThunk('ticketDetails/getCompany', async ({ AppId }) => { + if( AppId != null && AppId != undefined ){ + return await axiosInstanceData.get(`/Company?appId=${AppId}&activeStatus=A`) + } +}) + +export const gettypeStatus= createAsyncThunk('ticketDetails/getConfigurationType', async () => { + return await axiosInstanceData.get(`/ConfigMaster?typeName=Ticket Status`) +}) +export const postTicketmaster= createAsyncThunk('ticketDetails/getConfigurationType', async (postData) => { + + return await axiosInstanceData.post('/TicketMaster',postData) +}) + +export const putTicketmaster= createAsyncThunk('ticketDetails/getConfigurationType', async (putData) => { + + return await axiosInstanceData.put('/TicketMaster',putData) +}) + +export const getStatusCount= createAsyncThunk('ticketDetails/getStatusCount', async () => { + return await axiosInstanceData.get(`/TicketLogHistory/Count`) +}) diff --git a/src/features/upload/upload.js b/src/features/upload/upload.js new file mode 100644 index 0000000..13bf775 --- /dev/null +++ b/src/features/upload/upload.js @@ -0,0 +1,17 @@ +import { createAsyncThunk } from "@reduxjs/toolkit"; +import axios from "axios"; +import { axiosInstanceData } from '../AuthenticationTokens/AuthenticationToken'; +const uploadApiUrl = import.meta.env.ENV_IMAGE_UPLOAD_API_URL; + + +export const uploadImage = createAsyncThunk('upload/uploadImage', async (file) => { + let formdata = new FormData(); + formdata.append("file", file); + return await axiosInstanceData.post(`${uploadApiUrl}/upload`, formdata) +}) + +export const uploadApk = createAsyncThunk('upload/ApkUpload', async (file) => { + let formdata = new FormData(); + formdata.append("file", file); + return await axiosInstanceData.post(`${uploadApiUrl}/upload/ApkUpload`, formdata) +}) \ No newline at end of file diff --git a/src/features/userAccount/userAccount.js b/src/features/userAccount/userAccount.js new file mode 100644 index 0000000..e57e518 --- /dev/null +++ b/src/features/userAccount/userAccount.js @@ -0,0 +1,64 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import {axiosInstanceData} from '../AuthenticationTokens/AuthenticationToken'; + +export const getUserDataByUserId = createAsyncThunk('userAccount/getUserData', async ({ userId }) => { + if(userId != null && userId != undefined){ + return axiosInstanceData.get(`/user?UserId=${userId}`) + } +}) + +export const updateUserData = createAsyncThunk('userAccount/updateUserData', async (putData) => { + + return axiosInstanceData.put('/user/updateUserProfile', putData) +}) + +export const putPassword = createAsyncThunk('password/putPriceType', async (putData) => { + + return await axiosInstanceData.put('/user/setPassword', putData) +}) +export const putPin = createAsyncThunk('password/putPriceType', async (putData) => { + + return await axiosInstanceData.put('/user/setPin', putData) +}) + +export const getPassword = createAsyncThunk('password/getPassword', async (data) => { + if (data?.UserId != null && data?.UserId != undefined && data?.ActiveStatus != null && data?.ActiveStatus != undefined) { + return await axiosInstanceData.get(`/user?UserId=${data?.UserId}&ActiveStatus=${data?.ActiveStatus}`) + } +}) + +export const postReferralSetup = createAsyncThunk('referral/postReferralSetup', async (postData) => { + + return await axiosInstanceData.post('/ReferralSetup', postData) +}) + + +const initialState = { + userData: [] +} + +const userAccountSlice = createSlice({ + name: 'userAccount', + initialState, + reducers: { + changeUserData: (state, action) => { + const { userData } = action?.payload + state.userData = { ...state.userData, ...userData } + } + }, + extraReducers: builder => { + builder.addCase(getUserDataByUserId.fulfilled, (state, action) => { + if (action?.payload?.data?.statusCode) { + state.userData = action?.payload?.data?.data[0] + } + }) + } +}) + +export const userDataByUserId = state => state.userAccount ? state.userAccount.userData : initialState.userData; + +export const { changeUserData } = userAccountSlice.actions; + +export default userAccountSlice.reducer; + + diff --git a/src/features/userPage/userPage.js b/src/features/userPage/userPage.js new file mode 100644 index 0000000..e016eb5 --- /dev/null +++ b/src/features/userPage/userPage.js @@ -0,0 +1,120 @@ +import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; +import { axiosInstanceEMAIL_SMSData, axiosInstanceData,axiosRetailInstanceData } from '../AuthenticationTokens/AuthenticationToken'; + +export const getFilterUserDataBasedOnLocation = createAsyncThunk('user/getFilterUserDataBasedOnLocation', async (data) => { + return await axiosInstanceData.get(`/User/UserLocation?branchId=${data.branchId}&latitude=${data.latitude}&longitude=${data.longitude}`) +}) + +export const getUserData = createAsyncThunk('user/getUserData', async () => { + return await axiosInstanceData.get('/user?UserType=E') +}) +export const getAllUserData = createAsyncThunk('user/getAllUserData', async (type) => { + return await axiosInstanceData.get(`/user?UserType=${type}`) +}) + +export const getBasedUserData = createAsyncThunk('user/getUserData', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/user?UserType=A&UserId=${UserId}`) + } +}) +export const getBasedAdminUserData = createAsyncThunk('user/getBasedAdminUserData', async (UserId) => { + if (UserId != null && UserId != undefined) { + return await axiosInstanceData.get(`/user?UserType=A&UserId=${UserId}`) + } +}) + +export const postUserData = createAsyncThunk('user/postUserData', async (postData) => { + + return await axiosInstanceData.post('/user', postData) +}) + +export const putUserData = createAsyncThunk('user/putUserData', async (putData) => { + + return await axiosInstanceData.put('/user', putData) +}) + +export const deleteUserData = createAsyncThunk('user/deleteUserData', async (deleteData) => { + + return await axiosInstanceData.delete('/user', { params: deleteData }) +}) +export const putResetUserData = createAsyncThunk('user/putResetUserData', async (putData) => { + + return await axiosInstanceData.put('/User/ResetPinPassword', putData) +}) + +export const postResetPinPasswordSms = createAsyncThunk('user/postResetPinPasswordSms', async (postData) => { + + return await axiosInstanceEMAIL_SMSData.post(`/ResetPinPasswordSms`, postData) +}) +export const postResetPinPasswordEmail = createAsyncThunk('user/postResetPinPasswordEmail', async (postData) => { + + return await axiosInstanceEMAIL_SMSData.post(`/ResetPinPasswordEmail`, postData) +}) + +export const sendSms = createAsyncThunk("sendSms/sendSms", async (postData) => { + + return await axiosInstanceEMAIL_SMSData.post("/OTPSms", postData); +}); +export const sendEmail = createAsyncThunk("OTPEmail/OTPEmail", async (postData) => { + + return await axiosInstanceEMAIL_SMSData.post("/OTPEmail", postData); +}); + +export const checkUserExistsAsEmployeeInOther = createAsyncThunk("UserExistCheck/checkUserExistsAsEmployeeInOther", async (data) => { + if (data?.MobileNo && data?.BranchId) { + return await axiosInstanceData.get(`/UserRelievInfo?mobileNo=${data?.MobileNo}&BranchId=${data?.BranchId}`); + } +}); + +export const postReleiveRequest = createAsyncThunk("postReleiveRequest/postReleiveRequest", async (data) => { + if (data) { + return await axiosInstanceData.post(`/UserRelievInfo`, data); + } +}); + +export const getupiotp = createAsyncThunk('getupiotp', async (data) => { + if ( + data?.MobileNo != null && + data?.MobileNo != undefined && + data?.OTP != null && + data?.OTP != undefined + ) { + return await axiosRetailInstanceData.get( + `/upiVerify?MobileNo=${data?.MobileNo}&OTP=${data?.OTP}` + ); + } +}); + +export const sendupiotp = createAsyncThunk('sendupiotp', async (postData) => { + return await axiosRetailInstanceData.post(`/upiVerify`, postData); +}); + + + +const initialState = { + userData: [], +} + +const userSlice = createSlice({ + name: 'user', + initialState, + extraReducers: builder => { + builder.addCase(getUserData.fulfilled, (state, action) => { + if (action?.payload?.status) { + state.userData = action?.payload?.data?.data + } + else { + state.userData = [] + } + + }) + } + +}) + +export const userDataSelector = state => state.userPage?.userData + + + + +export default userSlice.reducer; \ No newline at end of file diff --git a/src/fonts/Gilroy/Gilroy-Black.woff b/src/fonts/Gilroy/Gilroy-Black.woff new file mode 100644 index 0000000..d76b8e1 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Black.woff differ diff --git a/src/fonts/Gilroy/Gilroy-Black.woff2 b/src/fonts/Gilroy/Gilroy-Black.woff2 new file mode 100644 index 0000000..357c4a9 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Black.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-BlackItalic.woff b/src/fonts/Gilroy/Gilroy-BlackItalic.woff new file mode 100644 index 0000000..1238aef Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-BlackItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-BlackItalic.woff2 b/src/fonts/Gilroy/Gilroy-BlackItalic.woff2 new file mode 100644 index 0000000..6b6e70c Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-BlackItalic.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-Bold.woff b/src/fonts/Gilroy/Gilroy-Bold.woff new file mode 100644 index 0000000..3cf2d5f Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Bold.woff differ diff --git a/src/fonts/Gilroy/Gilroy-Bold.woff2 b/src/fonts/Gilroy/Gilroy-Bold.woff2 new file mode 100644 index 0000000..03776c6 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Bold.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-BoldItalic.woff b/src/fonts/Gilroy/Gilroy-BoldItalic.woff new file mode 100644 index 0000000..1590225 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-BoldItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-BoldItalic.woff2 b/src/fonts/Gilroy/Gilroy-BoldItalic.woff2 new file mode 100644 index 0000000..7a125e9 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-BoldItalic.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-ExtraBold.woff b/src/fonts/Gilroy/Gilroy-ExtraBold.woff new file mode 100644 index 0000000..96b2b47 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-ExtraBold.woff differ diff --git a/src/fonts/Gilroy/Gilroy-ExtraBold.woff2 b/src/fonts/Gilroy/Gilroy-ExtraBold.woff2 new file mode 100644 index 0000000..b13b60a Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-ExtraBold.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-ExtraBoldItalic.woff b/src/fonts/Gilroy/Gilroy-ExtraBoldItalic.woff new file mode 100644 index 0000000..aa158ea Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-ExtraBoldItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-ExtraBoldItalic.woff2 b/src/fonts/Gilroy/Gilroy-ExtraBoldItalic.woff2 new file mode 100644 index 0000000..51a1772 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-ExtraBoldItalic.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-Heavy.woff b/src/fonts/Gilroy/Gilroy-Heavy.woff new file mode 100644 index 0000000..9d9db16 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Heavy.woff differ diff --git a/src/fonts/Gilroy/Gilroy-Heavy.woff2 b/src/fonts/Gilroy/Gilroy-Heavy.woff2 new file mode 100644 index 0000000..9805de6 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Heavy.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-HeavyItalic.woff b/src/fonts/Gilroy/Gilroy-HeavyItalic.woff new file mode 100644 index 0000000..80f9143 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-HeavyItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-HeavyItalic.woff2 b/src/fonts/Gilroy/Gilroy-HeavyItalic.woff2 new file mode 100644 index 0000000..0c9672c Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-HeavyItalic.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-Light.woff b/src/fonts/Gilroy/Gilroy-Light.woff new file mode 100644 index 0000000..a5189cf Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Light.woff differ diff --git a/src/fonts/Gilroy/Gilroy-Light.woff2 b/src/fonts/Gilroy/Gilroy-Light.woff2 new file mode 100644 index 0000000..bc5a5c1 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Light.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-LightItalic.woff b/src/fonts/Gilroy/Gilroy-LightItalic.woff new file mode 100644 index 0000000..e4748c0 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-LightItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-LightItalic.woff2 b/src/fonts/Gilroy/Gilroy-LightItalic.woff2 new file mode 100644 index 0000000..1bfa5f6 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-LightItalic.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-Medium.woff b/src/fonts/Gilroy/Gilroy-Medium.woff new file mode 100644 index 0000000..987583a Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Medium.woff differ diff --git a/src/fonts/Gilroy/Gilroy-Medium.woff2 b/src/fonts/Gilroy/Gilroy-Medium.woff2 new file mode 100644 index 0000000..2764710 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Medium.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-MediumItalic.woff b/src/fonts/Gilroy/Gilroy-MediumItalic.woff new file mode 100644 index 0000000..e47e0fc Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-MediumItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-MediumItalic.woff2 b/src/fonts/Gilroy/Gilroy-MediumItalic.woff2 new file mode 100644 index 0000000..4e53ac1 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-MediumItalic.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-Regular.woff b/src/fonts/Gilroy/Gilroy-Regular.woff new file mode 100644 index 0000000..c0e4821 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Regular.woff differ diff --git a/src/fonts/Gilroy/Gilroy-Regular.woff2 b/src/fonts/Gilroy/Gilroy-Regular.woff2 new file mode 100644 index 0000000..64fd436 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Regular.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-RegularItalic.woff b/src/fonts/Gilroy/Gilroy-RegularItalic.woff new file mode 100644 index 0000000..ea4e209 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-RegularItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-RegularItalic.woff2 b/src/fonts/Gilroy/Gilroy-RegularItalic.woff2 new file mode 100644 index 0000000..928cd6f Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-RegularItalic.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-SemiBold.woff b/src/fonts/Gilroy/Gilroy-SemiBold.woff new file mode 100644 index 0000000..d748f19 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-SemiBold.woff differ diff --git a/src/fonts/Gilroy/Gilroy-SemiBold.woff2 b/src/fonts/Gilroy/Gilroy-SemiBold.woff2 new file mode 100644 index 0000000..d193f13 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-SemiBold.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-SemiBoldItalic.woff b/src/fonts/Gilroy/Gilroy-SemiBoldItalic.woff new file mode 100644 index 0000000..67fd476 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-SemiBoldItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-SemiBoldItalic.woff2 b/src/fonts/Gilroy/Gilroy-SemiBoldItalic.woff2 new file mode 100644 index 0000000..b3f1003 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-SemiBoldItalic.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-Thin.woff b/src/fonts/Gilroy/Gilroy-Thin.woff new file mode 100644 index 0000000..de7fe31 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Thin.woff differ diff --git a/src/fonts/Gilroy/Gilroy-Thin.woff2 b/src/fonts/Gilroy/Gilroy-Thin.woff2 new file mode 100644 index 0000000..395956c Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-Thin.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-ThinItalic.woff b/src/fonts/Gilroy/Gilroy-ThinItalic.woff new file mode 100644 index 0000000..a58b56e Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-ThinItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-ThinItalic.woff2 b/src/fonts/Gilroy/Gilroy-ThinItalic.woff2 new file mode 100644 index 0000000..f0ff62b Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-ThinItalic.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-UltraLight.woff b/src/fonts/Gilroy/Gilroy-UltraLight.woff new file mode 100644 index 0000000..dccc924 Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-UltraLight.woff differ diff --git a/src/fonts/Gilroy/Gilroy-UltraLight.woff2 b/src/fonts/Gilroy/Gilroy-UltraLight.woff2 new file mode 100644 index 0000000..b96c8ad Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-UltraLight.woff2 differ diff --git a/src/fonts/Gilroy/Gilroy-UltraLightItalic.woff b/src/fonts/Gilroy/Gilroy-UltraLightItalic.woff new file mode 100644 index 0000000..d200b1c Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-UltraLightItalic.woff differ diff --git a/src/fonts/Gilroy/Gilroy-UltraLightItalic.woff2 b/src/fonts/Gilroy/Gilroy-UltraLightItalic.woff2 new file mode 100644 index 0000000..0a4014f Binary files /dev/null and b/src/fonts/Gilroy/Gilroy-UltraLightItalic.woff2 differ diff --git a/src/fonts/Gilroy/demo.html b/src/fonts/Gilroy/demo.html new file mode 100644 index 0000000..ca25daa --- /dev/null +++ b/src/fonts/Gilroy/demo.html @@ -0,0 +1,743 @@ + + + + + + + + + Transfonter demo + + + + +
+
+

☞Gilroy-Bold

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: bold;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-Bold.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-BlackItalic

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 900;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-BlackItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-Black

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 900;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-Black.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-BoldItalic

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: bold;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-BoldItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-LightItalic

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 300;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-LightItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-Medium

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 500;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-Medium.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-HeavyItalic

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 900;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-HeavyItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-Light

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 300;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-Light.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-ExtraBoldItalic

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: bold;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-ExtraBoldItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-Heavy

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 900;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-Heavy.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-ExtraBold

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: bold;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-ExtraBold.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-MediumItalic

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 500;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-MediumItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-UltraLightItalic

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 200;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-UltraLightItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-ThinItalic

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 100;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-ThinItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-Thin

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 100;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-Thin.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-SemiBold

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 600;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-SemiBold.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-RegularItalic

+
.your-style {
+    font-family: 'Gilroy-RegularItalic';
+    font-weight: normal;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-RegularItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-Regular

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: normal;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-Regular.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-SemiBoldItalic

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 600;
+    font-style: italic;
+}
+
+<link rel="preload" href="Gilroy-SemiBoldItalic.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+

☞Gilroy-UltraLight

+
.your-style {
+    font-family: 'Gilroy';
+    font-weight: 200;
+    font-style: normal;
+}
+
+<link rel="preload" href="Gilroy-UltraLight.woff2" as="font" type="font/woff2" crossorigin>
+
+

+ abcdefghijklmnopqrstuvwxyz
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ 0123456789.:,;()*!?'@#<>$%&^+-=~ +

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+

The quick brown fox jumps over the lazy dog.

+
+
+ +
+ + diff --git a/src/fonts/Gilroy/gilroy-20230427-124910.zip b/src/fonts/Gilroy/gilroy-20230427-124910.zip new file mode 100644 index 0000000..6f36234 Binary files /dev/null and b/src/fonts/Gilroy/gilroy-20230427-124910.zip differ diff --git a/src/fonts/Gilroy/stylesheet.css b/src/fonts/Gilroy/stylesheet.css new file mode 100644 index 0000000..e425e01 --- /dev/null +++ b/src/fonts/Gilroy/stylesheet.css @@ -0,0 +1,249 @@ +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-Bold.woff2') format('woff2'), + url('Gilroy-Bold.woff') format('woff'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-BlackItalic.woff2') format('woff2'), + url('Gilroy-BlackItalic.woff') format('woff'); + font-weight: 900; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-Black.woff2') format('woff2'), + url('Gilroy-Black.woff') format('woff'); + font-weight: 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-BoldItalic.woff2') format('woff2'), + url('Gilroy-BoldItalic.woff') format('woff'); + font-weight: bold; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-LightItalic.woff2') format('woff2'), + url('Gilroy-LightItalic.woff') format('woff'); + font-weight: 300; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-Medium.woff2') format('woff2'), + url('Gilroy-Medium.woff') format('woff'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-HeavyItalic.woff2') format('woff2'), + url('Gilroy-HeavyItalic.woff') format('woff'); + font-weight: 900; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-Light.woff2') format('woff2'), + url('Gilroy-Light.woff') format('woff'); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-ExtraBoldItalic.woff2') format('woff2'), + url('Gilroy-ExtraBoldItalic.woff') format('woff'); + font-weight: bold; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-Heavy.woff2') format('woff2'), + url('Gilroy-Heavy.woff') format('woff'); + font-weight: 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-ExtraBold.woff2') format('woff2'), + url('Gilroy-ExtraBold.woff') format('woff'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-MediumItalic.woff2') format('woff2'), + url('Gilroy-MediumItalic.woff') format('woff'); + font-weight: 500; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-UltraLightItalic.woff2') format('woff2'), + url('Gilroy-UltraLightItalic.woff') format('woff'); + font-weight: 200; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-ThinItalic.woff2') format('woff2'), + url('Gilroy-ThinItalic.woff') format('woff'); + font-weight: 100; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-Thin.woff2') format('woff2'), + url('Gilroy-Thin.woff') format('woff'); + font-weight: 100; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-SemiBold.woff2') format('woff2'), + url('Gilroy-SemiBold.woff') format('woff'); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy-RegularItalic'; + src: url('Gilroy-RegularItalic.woff2') format('woff2'), + url('Gilroy-RegularItalic.woff') format('woff'); + font-weight: normal; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-Regular.woff2') format('woff2'), + url('Gilroy-Regular.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-SemiBoldItalic.woff2') format('woff2'), + url('Gilroy-SemiBoldItalic.woff') format('woff'); + font-weight: 600; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'Gilroy'; + src: url('Gilroy-UltraLight.woff2') format('woff2'), + url('Gilroy-UltraLight.woff') format('woff'); + font-weight: 200; + font-style: normal; + font-display: swap; +} + + + +/* New Font NeueMontreal */ + +@font-face { + font-family: 'NeueMontreal'; + src: url('../Neue Montreal/NeueMontreal-Regular.otf') format('opentype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'NeueMontreal'; + src: url('../Neue Montreal/NeueMontreal-Bold.otf') format('opentype'); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'NeueMontreal'; + src: url('../Neue Montreal/NeueMontreal-BoldItalic.otf') format('opentype'); + font-weight: 700; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'NeueMontreal'; + src: url('../Neue Montreal/NeueMontreal-Italic.otf') format('opentype'); + font-weight: 400; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'NeueMontreal'; + src: url('../Neue Montreal/NeueMontreal-Light.otf') format('opentype'); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'NeueMontreal'; + src: url('../Neue Montreal/NeueMontreal-LightItalic.otf') format('opentype'); + font-weight: 300; + font-style: italic; + font-display: swap; +} + +@font-face { + font-family: 'NeueMontreal'; + src: url('../Neue Montreal/NeueMontreal-Medium.otf') format('opentype'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'NeueMontreal'; + src: url('../Neue Montreal/NeueMontreal-MediumItalic.otf') format('opentype'); + font-weight: 500; + font-style: italic; + font-display: swap; +} + + \ No newline at end of file diff --git a/src/fonts/Neue Montreal/Neue Montreal.zip b/src/fonts/Neue Montreal/Neue Montreal.zip new file mode 100644 index 0000000..43c649c Binary files /dev/null and b/src/fonts/Neue Montreal/Neue Montreal.zip differ diff --git a/src/fonts/Neue Montreal/NeueMontreal-Bold.otf b/src/fonts/Neue Montreal/NeueMontreal-Bold.otf new file mode 100644 index 0000000..a1c6974 Binary files /dev/null and b/src/fonts/Neue Montreal/NeueMontreal-Bold.otf differ diff --git a/src/fonts/Neue Montreal/NeueMontreal-BoldItalic.otf b/src/fonts/Neue Montreal/NeueMontreal-BoldItalic.otf new file mode 100644 index 0000000..798048d Binary files /dev/null and b/src/fonts/Neue Montreal/NeueMontreal-BoldItalic.otf differ diff --git a/src/fonts/Neue Montreal/NeueMontreal-Italic.otf b/src/fonts/Neue Montreal/NeueMontreal-Italic.otf new file mode 100644 index 0000000..a8c17e7 Binary files /dev/null and b/src/fonts/Neue Montreal/NeueMontreal-Italic.otf differ diff --git a/src/fonts/Neue Montreal/NeueMontreal-Light.otf b/src/fonts/Neue Montreal/NeueMontreal-Light.otf new file mode 100644 index 0000000..4cc9587 Binary files /dev/null and b/src/fonts/Neue Montreal/NeueMontreal-Light.otf differ diff --git a/src/fonts/Neue Montreal/NeueMontreal-LightItalic.otf b/src/fonts/Neue Montreal/NeueMontreal-LightItalic.otf new file mode 100644 index 0000000..b0dd573 Binary files /dev/null and b/src/fonts/Neue Montreal/NeueMontreal-LightItalic.otf differ diff --git a/src/fonts/Neue Montreal/NeueMontreal-Medium.otf b/src/fonts/Neue Montreal/NeueMontreal-Medium.otf new file mode 100644 index 0000000..43030e8 Binary files /dev/null and b/src/fonts/Neue Montreal/NeueMontreal-Medium.otf differ diff --git a/src/fonts/Neue Montreal/NeueMontreal-MediumItalic.otf b/src/fonts/Neue Montreal/NeueMontreal-MediumItalic.otf new file mode 100644 index 0000000..78b2fc5 Binary files /dev/null and b/src/fonts/Neue Montreal/NeueMontreal-MediumItalic.otf differ diff --git a/src/fonts/Neue Montreal/NeueMontreal-Regular.otf b/src/fonts/Neue Montreal/NeueMontreal-Regular.otf new file mode 100644 index 0000000..0265060 Binary files /dev/null and b/src/fonts/Neue Montreal/NeueMontreal-Regular.otf differ diff --git a/src/fonts/wasted-vindey-cdnfonts/wasted-vindey-cdnfonts.zip b/src/fonts/wasted-vindey-cdnfonts/wasted-vindey-cdnfonts.zip new file mode 100644 index 0000000..ba385d0 Binary files /dev/null and b/src/fonts/wasted-vindey-cdnfonts/wasted-vindey-cdnfonts.zip differ diff --git a/src/fonts/wasted-vindey-cdnfonts/wasted-vindey.ttf b/src/fonts/wasted-vindey-cdnfonts/wasted-vindey.ttf new file mode 100644 index 0000000..a2b94b8 Binary files /dev/null and b/src/fonts/wasted-vindey-cdnfonts/wasted-vindey.ttf differ diff --git a/src/fonts/wasted-vindey-serif-font/Wasted Vindey.otf b/src/fonts/wasted-vindey-serif-font/Wasted Vindey.otf new file mode 100644 index 0000000..3ebb05b Binary files /dev/null and b/src/fonts/wasted-vindey-serif-font/Wasted Vindey.otf differ diff --git a/src/fonts/wasted-vindey-serif-font/Wasted Vindey.ttf b/src/fonts/wasted-vindey-serif-font/Wasted Vindey.ttf new file mode 100644 index 0000000..a2b94b8 Binary files /dev/null and b/src/fonts/wasted-vindey-serif-font/Wasted Vindey.ttf differ diff --git a/src/fonts/wasted-vindey-serif-font/wasted-vindey-serif-font.zip b/src/fonts/wasted-vindey-serif-font/wasted-vindey-serif-font.zip new file mode 100644 index 0000000..d014466 Binary files /dev/null and b/src/fonts/wasted-vindey-serif-font/wasted-vindey-serif-font.zip differ diff --git a/src/hooks/useToast.js b/src/hooks/useToast.js new file mode 100644 index 0000000..375c185 --- /dev/null +++ b/src/hooks/useToast.js @@ -0,0 +1,14 @@ +import { useState } from 'react'; + +export const useToast = () => { + const [show, setShow] = useState(false); + const [msg, setMsg] = useState(''); + + const toast = (message) => { + setMsg(message); + setShow(true); + setTimeout(() => setShow(false), 3000); + }; + + return { toast, show, msg }; +}; \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..4b9268d --- /dev/null +++ b/src/index.css @@ -0,0 +1,543 @@ +:root { + + /* component variables */ + + --INPUT_FIELD_WIDTH: min(60vw, 250px); + + /* application common variables */ + --HEADING_COLOR: #000000; + --HEADING_FONT_FAMILY: 'Gilroy'; + + --PARA_FONT_FAMILY: 'Poppins'; + --PARA_COLOR: #3F3F3F; + + --PRIMARY_BUTTON_BG_COLOR: #8F1E78; + --PRIMARY_BUTTON_COLOR: #FFFFFF; + --PRIMARY_BUTTON_BORDER_RADIUS: 6px; + + --SECONDRY_BUTTON_BG_COLOR: white; + --SECONDRY_BUTTON_COLOR: #000000; + --SECONDRY_BUTTON_BORDER_RADIUS: 25.6853px; + + --THIRD_BUTTON_BG_COLOR: #060606; + --THIRD_BUTTON_COLOR: #EFEFEF; + --THIRD_BUTTON_BORDER_RADIUS: 6.53329px; + + --BOX_SHADOW_LEVEL1: 0px 4px 15px rgba(0, 0, 0, 0.1); + --BOX_SHADOW_LEVEL2: 0px 4px 25px rgba(0, 0, 0, 0.2); + --BOX_SHADOW_LEVEL3: 0px 5.25331px 26.3077px rgba(0, 0, 0, 0.08); + + --CARD_BG_COLOR: rgba(255, 255, 255, 0.6); + --CARD_COLOR: #000000; + --CARD_FONT_FAMILY: 'Gilroy-Medium'; + --CARD_BORDER_RADIUS: 10px; + + --ANCHOR_FONT_FAMILY: 'Manrope'; + --ANCHOR_COLOR: #314259; + + --BUTTON_FONT_FAMILY: 'Gilroy-Medium'; + + --BREAD_CRUMB_PADDING: 1rem; + + --TABLE_PAGE_PADDING: 1rem; + + /* Page common funtion */ + --PAGE_BODY_BACKGROUND_COLOR: #E8ECF1; + + --SELECTED_COLOR: #52C41A; + + --ERROR_COLOR: #FF4D4F; + + --DEFAULT_SELECTED_COLOR: #1292EE; + + overflow-x: hidden; + +} + +* { +padding: 0px; +margin: 0px; +box-sizing: border-box; +} + +p { +font-family: VAR(--PARA_FONT_FAMILY); +} + +button { +font-family: var(--BUTTON_FONT_FAMILY); +} + + +header { +font-family: VAR(--HEADING_FONT_FAMILY); +} + +a { +font-family: var(--ANCHOR_FONT_FAMILY); +} + + +.ant-collapse { + /* width:clamp(55dvw,50dvw,50dvw); */ + /* width: min(100vw,572px); */ + font-style: normal; + font-weight: 600; + font-size: 15.2968px; + /* // line-height: 149.5%; + // color: #000000; + // padding: 0px 39px; */ +} + + +.ant-collapse-large >.ant-collapse-item >.ant-collapse-header { + padding: 16px 24px; + background: white; +} + +.ant-collapse-item-active > .ant-collapse-header { + box-sizing: border-box; + /* border: 0.3px solid #252222; */ + border-radius: 6px; +} + + + + +.Home-navbar { + position: sticky; + z-index: 2; + align-items: baseline; + justify-content: space-evenly; + align-items: center; + display: flex; + width: 100vw; + top:0rem; + left:0rem; + height:9vh; + margin: 0vw 0vh; + /* padding: 1vw 8vh; */ + font-size: 23px; + font-family: var(--HEADING_FONT_FAMILY); + /* font-weight: 550; */ + background-color:#ffffffa4; + backdrop-filter: blur(10px); + box-shadow: 0px 4px 150px rgba(0, 0, 0, 0.1); + +} + + + + +.extra_small_nav{ + margin:0vw 0vh; + width:70vw; + display: flex; + justify-content:space-around; + font-size: 13.2px; +} + +.extra_small_div{ + display: flex; + flex-wrap: wrap; + flex-direction: row; + row-gap: 0rem !important; + justify-content: space-around; + text-transform: uppercase; + align-items: center !important; +} + + +@media (min-width:279px) and (max-width: 999px) { + + + + .toggle-container{ + /* padding: 2vw 2vh !important; */ + display: flex !important; + position: fixed !important; + /* width: 100% !important; */ + /* display: none !important; */ + } + + .extra_small_nav{ + display: none !important; + } + .tgle-icons{ + display:flex; + width: 25%; + justify-content:space-around; + } + + .small-nav{ + opacity: 12% !important; + } + .extranav{ + display: none; + } + } + +@media (min-width: 390px) and (max-width: 498px) { + + .collapsed-menu{ + padding: 1vw 1vh; + } + +} + + +@media all and (max-width: 499px){ + + .Home-navbar { + display: none; + } + + .extranav{ + display: none; + } + + + .extra_small_div{ + font-size: 14px !important; + text-transform: uppercase; + } + +.extra_small_nav{ + margin:0vw 0vh; + width:70vw; + display: flex; + justify-content:space-around; + font-size: 13.2px; + } + + + + /* .ant-collapse { + width: 75vh !important; + } */ + + .content_container{ + +} +} + + +@media (max-width: 1024px){ + .Home-navbar{ + display: flex; + height: 50px; + align-items: center; + justify-content: space-between; + } +} + + +@media (min-width: 899px) and (max-width: 1072px){ + .Home-navbar { + /* display: none; */ + padding: 3rem 0rem !important; + } + + + .extranav{ + display: none; + } + + + .extra_small_div{ + font-size: 14px !important; + color: #000000; + font-family: var(--PARA_FONT_FAMILY); + } + +} + +@media (min-width: 500px) and (max-width: 600px) { + + .extra_small_nav{ + display: none; + } +} + + + + +/* // .logo { +// margin-right: 10px; +// } */ + +.menu-container { + display: flex; + justify-content: space-evenly; + flex-direction: row; + color:#000000 !important; + row-gap: 23rem; +} + +.toggle-container { + display:none; + top: 0; + flex-wrap: wrap; + flex-direction: row; + /* padding: 2vw 3vh; */ + width: 100vw; + align-items: center; + justify-content:space-between; + position:fixed; + z-index: 23; + background-color:#f7f7f7; + box-shadow: 0px 4px 150px rgba(0, 0, 0, 0.1); +} + +.tgle-icons{ + display:flex; + width: 25%; + justify-content:space-around; +} +.toggle-button { + cursor: pointer; + font-size: 16px; +} + + +.ant-collapse { + /* width: min(91vw, 780px); */ + /* width: 100% !important; */ + /* font-style: normal; */ + margin: 2vw 2vh; +} + +.Dept_side{ + margin: 2vw 4vh; + /* padding: 2vw 4vh; */ + width:40vw; + /* height: min(40vw, 700px); */ + display: flex; + flex-direction: column; + flex-wrap: wrap; + justify-content: space-between; +} + +.Acc_btn{ + + background-color: #000; + width:45vw; + height:7vh; + align-items: center; + font-size:14px; + display:flex; + border-radius:6px; + justify-content:center; + color:#fff; + cursor: pointer; + +} + +.collapsed-menu { + /* width: 100vw; + /* height:100vh; */ + + background-color:#31313154; + transition: 0.1s ease-out; + overflow-y: scroll; + overflow-x: hidden; + width: 100%; + height: 100vh; + position: fixed; + top: 4rem; + z-index: 1; + backdrop-filter: blur(10px); +} + +.anticon{ + /* display: flex; + flex-wrap: wrap; + flex-direction: row; + justify-content: flex-end; */ + cursor: pointer; + +} + + +.ant-select-single.ant-select-show-arrow .ant-select-selection-item, .ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder { + padding-inline-end: 54px; + text-align: initial; + padding: 0.3vw; + font-size: 14px; + color: #626262; + font-weight: 400; + font-family: "Poppins", sans-serif; +} + + + +.ant-menu-light.ant-menu-horizontal >.ant-menu-item{ + margin: 1.5vw 1.4vh; + font-size: 2.6vh; + /* font-family: 'Poppins'; */ + font-family: var(--HEADING_FONT_FAMILY) !important; +} + +.ant-menu-light { + /* background: #fff !important; */ + border-radius: 12.9916px; + padding-inline: 0rem; + /* margin-inline: 1rem; */ +} + +.nav_right_items{ + display: flex; + justify-content: space-between +} +.ant-menu-title-content { + flex-direction: column; + display: flex; + /* align-items: center; */ + /* font-size: 14px; + font-weight: 400; */ + text-transform: uppercase; +} + +.ico{ + font-size:12px !important; + align-items: center; + margin: 0.4vw 0vh; +} + +.ico-menu{ + display: flex; + text-align: center; +} + .nav-btn { + font-size: 15px !important; + height: 54px; + /* text-transform: uppercase; */ + font-weight: 510; + letter-spacing: 0.1px; + border: none; + color: #11181c; + padding: 4px 0px; +} + +.nav-btn:hover { + font-size: 15px !important; + height: 54px; + /* text-transform: uppercase; */ + /* font-weight: 500; */ + letter-spacing: 0.1px; + border: none; + color: #0f67da; + padding: 4px 0px; +} + + + + + +.FreeAccBtn{ + width: 220px; + height:45px; + display:flex; + justify-content: center; + border-radius:6px; + /* background-color: #f0f0f0; */ + background-color: #8F1E78; + /* border: #000 solid 1.5px; */ + color: #ffffff; + font-weight: 550; + margin: 0.2vw 0vh; + font-size: 15px; + align-items: center; + align-content: center; + text-align: center; + transition-duration:0.20s; +} + +.FreeAccBtn:hover{ + width: 220px; + height:45px; + display:flex; + justify-content: center; + border-radius:6px; + background-color: #ffffff; + border: #8F1E78 solid 1.5px; + color: #8F1E78; + margin: 0.2vw 0vh; + font-size: 15px; + align-items: center; + align-content: center; + text-align: center; + text-decoration: none; + transition-duration:0.20s; +} + + +.sml_icons{ + display: flex; + align-items: space-around; + +} + + +/* '''''''''''''''''''''''''''''?'? */ + +/* ScrollBar */ + +::-webkit-scrollbar { + width: 2px; +} + +/* Track */ +::-webkit-scrollbar-track { + background: #f1f1f1; +} + +/* Handle */ +::-webkit-scrollbar-thumb { + background: #999999; +} + +/* Handle on hover */ +::-webkit-scrollbar-thumb:hover { + /* background: #8F1E78; */ +} + + +::-webkit-scrollbar { + display: none; +} + +/* EditorJS Custom Styles */ +.ce-toolbar__plus.custom-cursor-on-hover { + cursor: pointer !important; + transition: all 0.2s ease; +} + +.ce-toolbar__plus.custom-cursor-on-hover:hover { + transform: scale(1.1); + background: #3b82f6 !important; + color: white !important; +} + +.ce-block--selected .ce-block__content { + background: rgba(59, 130, 246, 0.1) !important; + border-radius: 8px; +} + +.codex-editor { + border-radius: 12px; + border: 1px solid #e5e7eb; +} + +.ce-toolbar__content { + max-width: none !important; +} + +.ce-popover { + border-radius: 12px !important; + box-shadow: 0 10px 25px rgba(0,0,0,0.15) !important; +} + + + + diff --git a/src/lib/seoConfig.js b/src/lib/seoConfig.js new file mode 100644 index 0000000..f55d3c2 --- /dev/null +++ b/src/lib/seoConfig.js @@ -0,0 +1,14 @@ +export const BASE_URL = 'https://pozo.app'; // Replace with your actual base URL +export const SITE = { + name: 'PozoApp', + twitterHandle: '@PozoApp', // Replace with your Twitter handle if available + locale: 'en_US', + defaultOg: '/og/home.jpg', // Path to default OG image +}; +// export const BASE_URL = 'https://pozo.app'; // Replace with your actual base URL +// export const SITE = { +// name: 'PozoApp', +// twitterHandle: '@PozoApp', // Replace with your Twitter handle if available +// locale: 'en_US', +// defaultOg: '/og/home.jpg', // Path to default OG image +// }; diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..6782bd4 --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,51 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' +import './fonts/Gilroy/stylesheet.css'; +import './index.css' +import { BrowserRouter } from 'react-router-dom'; +import { Provider } from 'react-redux' +import store from './app/store.js' +import AppRoutes from './AppTest.jsx' +import GlobalErrorHandler from './GlobalErrorHandler'; +import { HelmetProvider } from 'react-helmet-async'; +import "./theme/pozo.css"; +ReactDOM.createRoot(document.getElementById('root')).render( + // + + + + {/* */} + {/* */} + + {/* */} + + + + // , +) + + +// import React from 'react' +// import ReactDOM from 'react-dom/client' +// import App from './App.jsx' +// import './fonts/Gilroy/stylesheet.css'; +// import './index.css' +// import { BrowserRouter } from 'react-router-dom'; +// import { Provider } from 'react-redux' +// import store from './app/store.js' +// import AppRoutes from './AppTest.jsx' +// import GlobalErrorHandler from './GlobalErrorHandler'; + +// ReactDOM.createRoot(document.getElementById('root')).render( +// // +// +// +// {/* */} +// {/* */} +// +// {/* */} +// +// +// // , +// ) diff --git a/src/preview/RenderBlocks.jsx b/src/preview/RenderBlocks.jsx new file mode 100644 index 0000000..6f8aaa4 --- /dev/null +++ b/src/preview/RenderBlocks.jsx @@ -0,0 +1,29 @@ +function RenderBlocks({ data }) { + return ( +
+ {data.blocks?.map((b, i) => { + switch (b.type) { + case "paragraph": return

; + case "header": return React.createElement(`h${b.data.level}`, { key: i, dangerouslySetInnerHTML: { __html: b.data.text } }); + case "image": return {b.data.caption; + case "list": + return b.data.style === "ordered" + ?

    {b.data.items.map((it, idx)=>
  1. )}
+ :
    {b.data.items.map((it, idx)=>
  • )}
; + case "delimiter": return
; + case "cta": + return ( +
+

{b.data.heading}

+ {b.data.subheading &&

{b.data.subheading}

} + {b.data.buttonText && {b.data.buttonText}} +
+ ); + case "callout": return
{b.data.emoji} {b.data.text}
; + case "emailContent": return

{b.data.subject}

; + default: return null; + } + })} +
+ ); +} \ No newline at end of file diff --git a/src/routesConfig.jsx b/src/routesConfig.jsx new file mode 100644 index 0000000..ae08810 --- /dev/null +++ b/src/routesConfig.jsx @@ -0,0 +1,758 @@ +import AppPage from "./Pages/appPage/AppPage.jsx"; +import CompanyForm from "./Pages/company/companyForm.jsx"; +import CompanyList from "./Pages/company/companyList.jsx"; +import AdminTax from "./Pages/adminTax/adminTaxForm.jsx"; +import BranchForm from "./Pages/branch/branchForm.jsx"; +import BranchList from "./Pages/branch/branchList.jsx"; +import MappingFeatures from "./Pages/ApplicationPreference/ApplicationPreferenceForm.jsx"; +import ApplicationPreferenceList from "./Pages/ApplicationPreference/ApplicationPrefernceList.jsx"; +import ApplicationForm from "./Pages/application/applicationForm.jsx"; +import ApplicationList from "./Pages/application/applicationList.jsx"; +import CommonMaster from "./Pages/commonMaster/CommonMaster.jsx"; +import ConfigTypeForm from "./Pages/configType/configtypeForm.jsx"; +import ApplicationImageForm from "./Pages/applicationImage/applicationImageForm.jsx"; +import AppPriceFeatureMapping from "./Pages/appPriceFeatureMapping/appPriceFeatureMappingList.jsx"; +import AppPriceFeatureMappingForm from "./Pages/appPriceFeatureMapping/appPriceFeatureMappingForm.jsx"; +import AppMenu from "./Pages/appMenu/appMenuList.jsx"; +import AppMenuForm from "./Pages/appMenu/appMenuForm.jsx"; +import Pricing from "./Pages/pricingType/pricingTypeList.jsx"; +import PricingForm from "./Pages/pricingType/pricingTypeForm.jsx"; +import CarouselForm from "./Pages/carousel/carouselForm.jsx"; +import FeatureList from "./Pages/feature/featureList.jsx"; +import FeatureForm from "./Pages/feature/featureForm.jsx"; +import UserForm from "./Pages/user/userForm.jsx"; +import UserList from "./Pages/user/userList.jsx"; +import SuperAdminuserList from "./Pages/SuperAdminUser/SuperAdminUserList.jsx"; +import SuperAdminuserForm from "./Pages/SuperAdminUser/SuperAdminUserForm.jsx"; +import LandignPageLayout from "./Pages/LandingPage/landingPageLayout.jsx"; +import Home from "./Pages/homeApp/home.jsx"; +import PublicSignup from "../src/Pages/PublicSignup/Signup.jsx"; +import PublicHome from "../src/Pages/publichome/HomePage.jsx"; +import Signin from "../src/Pages/publicsignin/Signin.jsx"; +import ModuleAccess from "../src/Pages/ModuleAccess/ModuleAccess.jsx"; +import AppMenuAccess from "../src/Pages/appMenuAccess/appMenuAccess.jsx"; +import Application from "./Pages/applications/application.jsx"; +import UserAccount from "./Pages/userAccount/userAccount.jsx"; +import MessageTemplateForm from "./Pages/MessageTemplate/MessageTemplateForm.jsx"; +import MessageTemplateList from "./Pages/MessageTemplate/MessageTemplateList.jsx"; +import PaymentUPIDetailsForm from "./Pages/PaymentUPIDetails/PaymentUPIDetailsForm.jsx"; +import PaymentUPIDetailsList from "./Pages/PaymentUPIDetails/PaymentUPIDetailsList.jsx"; +import PdfPageCommon from "./Pages/paymentpdfPage/PaymentPdfCommon.jsx"; +import PricingDetails from "./Pages/pricingTypeRestaurant/Pricing.jsx"; +import InvoiceDetail from "../src/Pages/InvoiceDetail/InvoiceDetail"; +import PaymentPage from "../src/Pages/PaymentMobilePage/PaymentPage"; +import AppTemplate from "../src/Pages/themeTemplate/AppTemplate.jsx"; +import Feature1 from "./Pages/themeTemplate/TemplateComps/Features/Features1.jsx"; +import OverView2 from "../src/Pages/themeTemplate/TemplateComps/OverVIews/OverView2.jsx"; +import Template from "./Pages/themeTemplate/Template.jsx"; +import AllTemplates from "./Pages/themeTemplate/AllTemplates.jsx"; +import AllTemplatesEdit from "./Pages/themeTemplate/AllTemplateEdit.jsx"; +import PdfPage from "./Pages/paymentpdfPage/paymentpdfpage.jsx"; +import PdfPageDownload from "./Pages/PdfDoc/PdfDocDownload.jsx"; +import CurrencyForm from "./Pages/currency/currencyForm.jsx"; +import ComingSoon from "./Pages/comingSoon.jsx"; +import PaymentMethod from "./Pages/ccavenueCustom/paymentMethod.jsx"; +import PaymentDetail from "./Pages/ccavenueCustom/paymentDetails.jsx"; +import CustomPaymentGateway from "../src/Pages/InvoiceDetail/customPaymentGateway"; +import PaymentHistory from "./Pages/Payment/PaymentHistory.jsx"; +import FeatureAddon from "./Pages/FeaturesPricing/FeatureAddon.jsx"; +import FeatureAddonForm from "./Pages/FeaturesPricing/FeatureAddonForm.jsx"; +import FeatureInvoice from "./Pages/FeaturesPricing/FeatureInvoice.jsx"; +import FeaturesPricing from "./Pages/FeaturesPricing/featurespricing.jsx"; +import FeaturesPricingForm from "./Pages/FeaturesPricing/FeaturePriceForm.jsx"; +import SmsAssignedDetailForm from "./Pages/SmsAssignDetail/SmsAssignedDetailForm.jsx"; +import SmsAssignedDetailList from "./Pages/SmsAssignDetail/SmsAssignedDetailList.jsx"; +import FailedPaymentHistory from "./Pages/Payment/FailedPaymentHistory.jsx"; +import { PaymentGatewayConfigForm } from "./Pages/paymentGatewayConfig/PaymentGatewayConfigForm.jsx"; +import PaymentGatewayConfigList from "./Pages/paymentGatewayConfig/PaymentGatewayConfigList.jsx"; +import PaymentDeviceConfigList from "./Pages/paymentDeviceConfig/PaymentDeviceConfigList.jsx"; +import PaymentDeviceConfigForm from "./Pages/paymentDeviceConfig/PaymentDeviceConfigForm.jsx"; +import DeviceAllocationlist from "./Pages/kisokDevice/DeviceAllocationList.jsx"; +import DeviceAllocationform from "./Pages/kisokDevice/DeviceAllocationForm.jsx"; +import DeviceInformation from "./Pages/kisokDevice/DeviceInformation.jsx"; +import TestimonialsList from "./Pages/testimonials/TestimonialsList.jsx"; +import TestimonialsForm from "./Pages/testimonials/TestimonialsForm.jsx"; +import POZOTestimonials from "./Pages/testimonials/TestimonialsForPublic.jsx"; +import Andriod_version from "./Pages/Andriod_version/deviceversion.jsx"; +import Andriod_versionManagment from "./Pages/Andriod_version/versionManagement.jsx"; +import SigninDetailsList from "./Pages/signinDetails/signinDetailsList.jsx"; +import PurchaseInfo from "./Pages/purchaseInfo/purchaseInfo.jsx"; +import LoyaltysettingList from "./Pages/LoyaltySetting/LoyaltysettingList.jsx"; +import LoyaltysettingsForm from "./Pages/LoyaltySetting/LoyaltysettingsForm.jsx"; +import TicketsDetails from "./Pages/ticketsDetails/ticketDetails.jsx"; +import UserOtp from "./Pages/userOtp/userotp.jsx"; +import CompanyBranchDetails from "./Pages/abstract/abstract.jsx"; +import RefferedEmployeelist from "./Pages/RefferedEmployee/RefferedEmployeelist.jsx"; +import VisitTrackingLog from "./Pages/SiteVisiteLog/VisitTrackingLog.jsx"; +import ActivationkeyGeneration from "./Pages/ActivationkeyGeneration/ActivationkeyGeneration.jsx"; +import FaqShow from "./Pages/themeTemplate/TemplateComps/Faq/FaqShow.jsx"; +import GodownForm from "./Pages/WareHouse/WareHouseForm.jsx"; +import GodownList from "./Pages/WareHouse/WareHouseList.jsx"; +import HomePage from "./PozoApp/Pages/HomePage.jsx"; +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 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 PostEditorPage from "./Pages/PostEditorPage.jsx"; +import PrivacyPolicy from "./PozoApp/Company/PrivacyPolicy.jsx"; +import CookiePolicy from "./PozoApp/Company/CookiePolicy.jsx"; +import AboutUs from "./PozoApp/Company/AboutUs.jsx"; + +const subDirectory = import.meta.env.ENV_BASE_URL; +export const routesConfig = [ + { path: `${subDirectory}`, component: HomePage, access: "Public" }, + { + path: `${subDirectory}development`, + component: ComingSoon, + access: "Public", + }, + { + path: `${subDirectory}adminpanel`, + component: AdminPanelWrapper, + access: "Marketing", + empAccess: "Admin Panel", + }, + { path: `${subDirectory}:appName`, component: Template, access: "Public" }, + { path: `${subDirectory}feature1`, component: Feature1 }, + { path: `${subDirectory}pdf`, component: PdfPage, access: "Admin" }, + { + path: `${subDirectory}payment-page-download`, + component: PdfPageDownload, + access: "Admin", + }, + { + path: `${subDirectory}public-signup`, + component: PublicSignup, + access: "Public", + }, + { path: `${subDirectory}signinOld`, component: Signin, access: "Public" }, + { path: `${subDirectory}signin`, component: SignIn, access: "Public" }, + { + path: `${subDirectory}payment-pdf`, + component: PdfPageCommon, + access: "Admin", + }, + { + path: `${subDirectory}pricing-details`, + component: PricingDetails, + access: "Public", + }, + { + path: `${subDirectory}invoice-detail`, + component: InvoiceDetail, + access: "Admin", + }, + { + path: `${subDirectory}payment-page`, + component: PaymentPage, + access: "Admin", + }, + // { path: `${subDirectory}overview2`, component: OverView2, props: { data: fieldData } }, + { + path: `${subDirectory}FeatureInvoice`, + component: FeatureInvoice, + access: "Admin", + }, + { + path: `${subDirectory}testimonials`, + component: POZOTestimonials, + access: "Public", + }, + { path: `${subDirectory}Faq`, component: FaqShow, access: "Public" }, + + { path: `${subDirectory}homepage`, component: PublicHome, access: "Public" }, + // { path: `${subDirectory}signinnew`, component: SignIn, access: "Public" }, + { + path: `${subDirectory}pricing-pozoapp`, + component: PricingPozoApp, + access: "Public", + }, + { + path: `${subDirectory}live-Session`, + component: LiveSession, + access: "Public", + }, + { path: `${subDirectory}contact-us`, component: ContactUs, access: "Public" }, + { path: `${subDirectory}blog`, component: Blog, access: "Public" }, + // { + // path: `${subDirectory}blog/blog-details/:id`, + // component: BlogDetail, + // access: "Public", + // }, + { + path: `${subDirectory}blog/:slug`, + component: BlogDetail, + access: "Public", + }, + { + path: `${subDirectory}PostEditorPage`, + component: PostEditorPage, + access: "Public", + }, + { + path: `${subDirectory}privacy-policy`, + component: PrivacyPolicy, + access: "Public", + }, + { + path: `${subDirectory}cookie-policy`, + component: CookiePolicy, + access: "Public", + }, + { + path: `${subDirectory}about-us`, + component: AboutUs, + access: "Public", + }, + // { path: `${subDirectory}customPayment`, component: CustomPaymentGateway }, + + { + path: `${subDirectory}landing-page`, + component: AppPage, + access: "Admin", + empAccess: "Super Admin User", + children: [ + { + path: "home", + component: Home, + access: "Admin", + empAccess: "Super Admin User", + employeeAccess: true, + }, + { + path: "apps", + component: Application, + access: "Admin", + empAccess: "Super Admin User", + }, + { + path: "user-account", + component: UserAccount, + access: "Admin", + empAccess: "Super Admin User", + }, + { + path: "user-account-edit", + component: () => , + access: "Admin", + empAccess: "Super Admin User", + employeeAccess: true, + }, + ], + }, + { + path: `${subDirectory}setting`, + component: AppPage, + access: "Admin", + children: [ + { + path: "tickets-details", + component: TicketsDetails, + empAccess: "Tickets", + }, + { path: "themes", component: AppTemplate, empAccess: "Templates" }, + { + path: "all-templates", + component: AllTemplates, + empAccess: "Templates", + }, + { + path: "all-templates/update", + component: AllTemplatesEdit, + empAccess: "Templates", + }, + { + path: "payment-gateway-config", + component: PaymentGatewayConfigList, + empAccess: "Payment Gateway Config", + }, + { + path: "payment-gateway-config/new", + component: (props) => ( + + ), + empAccess: "Payment Gateway Config", + }, + { + path: "payment-gateway-config/update", + component: (props) => ( + + ), + empAccess: "Payment Gateway Config", + }, + { + path: "payment-device-config", + component: PaymentDeviceConfigList, + empAccess: "Payment Device Config", + }, + { + path: "payment-device-config/new", + component: (props) => ( + + ), + empAccess: "Payment Device Config", + }, + { + path: "payment-device-config/update", + component: (props) => ( + + ), + empAccess: "Payment Device Config", + }, + { + path: "company-master", + component: CompanyList, + empAccess: "Company", + access: "Admin", + }, + { + path: "application-preference-mapping/new", + component: (props) => , + empAccess: "MappingFeatures", + access: "Admin", + }, + { + path: "application-preference-mapping/update", + component: (props) => , + empAccess: "MappingFeatures", + access: "Admin", + }, + { + path: "application-preference-mapping", + component: ApplicationPreferenceList, + empAccess: "MappingFeatures", + access: "Admin", + }, + { + path: "company-master/new", + component: (props) => , + empAccess: "Company", + access: "Admin", + }, + { + path: "company-master/update", + component: (props) => , + empAccess: "Company", + access: "Admin", + }, + { + path: "branch-master", + component: BranchList, + empAccess: "Branch", + access: "Admin", + }, + { + path: "branch-master/new", + component: (props) => , + empAccess: "Branch", + access: "Admin", + }, + { + path: "branch-master/update", + component: (props) => , + empAccess: "Branch", + access: "Admin", + }, + { + path: "warehouse-master", + component: GodownList, + empAccess: "Warehouse", + access: "Admin", + }, + { + path: "warehouse-master/new", + component: (props) => , + empAccess: "Warehouse", + access: "Admin", + }, + { + path: "warehouse-master/update", + component: (props) => , + empAccess: "Warehouse", + access: "Admin", + }, + { + path: "application-master", + component: ApplicationList, + empAccess: "Application", + }, + { + path: "application-master/new", + component: (props) => , + empAccess: "Application", + }, + { + path: "application-master/update", + component: (props) => , + empAccess: "Application", + }, + { + path: "app-menu", + component: AppMenu, + empAccess: "Application Menu", + }, + { + path: "app-menu/new", + component: (props) => , + empAccess: "Application Menu", + }, + { + path: "app-menu/update", + component: (props) => , + empAccess: "Application Menu", + }, + { + path: "feature-mapping", + component: AppPriceFeatureMapping, + empAccess: "Feature Mapping", + }, + { + path: "feature-mapping/new", + component: (props) => ( + + ), + empAccess: "Feature Mapping", + }, + { + path: "feature-mapping/update", + component: (props) => ( + + ), + empAccess: "Feature Mapping", + }, + { + path: "device-allocation", + component: DeviceAllocationlist, + empAccess: "Device Allocation", + }, + { + path: "device-allocation/new", + component: (props) => ( + + ), + empAccess: "Device Allocation", + }, + { + path: "device-allocation/update", + component: (props) => ( + + ), + empAccess: "Device Allocation", + }, + { + path: "device-information", + component: DeviceInformation, + empAccess: "Device Information", + }, + { + path: "feat-addon", + component: FeatureAddon, + empAccess: "Feature Addon", + access: "Admin", + }, + { + path: "feat-addon-form", + component: FeatureAddonForm, + empAccess: "Feature Addon", + access: "Admin", + }, + { + path: "pricing", + component: Pricing, + empAccess: "Pricing Type", + }, + { + path: "pricing/new", + component: (props) => , + empAccess: "Pricing Type", + }, + { + path: "pricing/update", + component: (props) => , + empAccess: "Pricing Type", + }, + { + path: "feature-master", + component: FeatureList, + empAccess: "Feature", + }, + { + path: "feature-master/new", + component: (props) => , + empAccess: "Feature", + }, + { + path: "feature-master/update", + component: (props) => , + empAccess: "Feature", + }, + { + path: "user-master", + component: UserList, + empAccess: "User Creation", + access: "Admin", + }, + { + path: "user-master/new", + component: (props) => , + empAccess: "User Creation", + access: "Admin", + }, + { + path: "user-master/update", + component: (props) => , + empAccess: "User Creation", + access: "Admin", + }, + + { + path: "payment/payment-history", + component: PaymentHistory, + empAccess: "Payment History", + access: "Admin", + }, + { + path: "payment/failed-payment-history", + component: FailedPaymentHistory, + empAccess: "Failed Payment History", + }, + { + path: "message-template", + component: MessageTemplateList, + empAccess: "Message Template", + }, + { + path: "message-template/new", + component: (props) => , + empAccess: "Message Template", + }, + { + path: "message-template/update", + component: (props) => ( + + ), + empAccess: "Message Template", + }, + { + path: "PaymentUPIDetails", + component: PaymentUPIDetailsList, + empAccess: "Payment UPI Details", + }, + { + path: "PaymentUPIDetails/new", + component: (props) => ( + + ), + empAccess: "Payment UPI Details", + }, + { + path: "PaymentUPIDetails/update", + component: (props) => ( + + ), + empAccess: "Payment UPI Details", + }, + { + path: "featurepricing", + component: FeaturesPricing, + empAccess: "Feature Pricing", + }, + { + path: "featurepricing/new", + component: (props) => , + empAccess: "Feature Pricing", + }, + { + path: "featurepricing/update", + component: (props) => ( + + ), + empAccess: "Feature Pricing", + }, + { + path: "sms-assigned-detail", + component: (props) => ( + + ), + empAccess: "Feature Pricing", + }, + { + path: "sms-assigned-detail/new", + component: (props) => ( + + ), + empAccess: "Feature Pricing", + }, + { + path: "sms-assigned-detail/update", + component: (props) => ( + + ), + empAccess: "Feature Pricing", + }, + { + path: "testimonials", + component: TestimonialsList, + empAccess: "Testimonials", + }, + { + path: "abstract", + component: CompanyBranchDetails, + empAccess: "User App Info", + }, + { + path: "testimonials/new", + component: (props) => , + empAccess: "Testimonials", + }, + { + path: "testimonials/update", + component: (props) => , + empAccess: "Testimonials", + }, + { + path: "super-admin-user-menu-access", + component: SuperAdminuserList, + empAccess: "Common Menu Access", + access: "Admin", + }, + { + path: "super-admin-user-menu-access/new", + component: (props) => , + empAccess: "Common Menu Access", + access: "Admin", + }, + { + path: "super-admin-user-menu-access/update", + component: (props) => , + empAccess: "Common Menu Access", + access: "Admin", + }, + { + path: "updated-version", + component: Andriod_version, + empAccess: "Updated Version", + }, + { + path: "version-management", + component: Andriod_versionManagment, + empAccess: "Version Management", + }, + + { + path: "purchaseinfo", + component: PurchaseInfo, + empAccess: "Purchase Info", + }, + { + path: "SiteVisitRecords", + component: VisitTrackingLog, + empAccess: "Loyalty setting", + }, + { + path: "referral-setting", + component: LoyaltysettingList, + empAccess: "Loyalty Setting", + }, + { + path: "referral-setting/new", + component: (props) => , + empAccess: "Loyalty Setting", + access: "Admin", + }, + { + path: "referral-setting/update", + component: (props) => ( + + ), + empAccess: "Loyalty Setting", + access: "Admin", + }, + + { + path: "app-access", + component: ModuleAccess, + access: "Admin", + empAccess: "Application Access", + }, + { + path: "app-menu-access", + component: AppMenuAccess, + empAccess: "Application Menu Access", + }, + { + path: "signin-details", + component: SigninDetailsList, + empAccess: "Signin Details", + }, + { path: "user-otp", component: UserOtp, empAccess: "User OTP" }, + { + path: "config-master", + component: CommonMaster, + empAccess: "Config Master", + }, + { + path: "config-type", + component: ConfigTypeForm, + empAccess: "Config Type", + }, + { path: "admin-tax", component: AdminTax, empAccess: "Tax" }, + { + path: "application-image", + component: ApplicationImageForm, + empAccess: "Application Image", + }, + { path: "carousel", component: CarouselForm, empAccess: "Carousel" }, + { path: "currency", component: CurrencyForm, empAccess: "Currency" }, + { + path: "payment-data", + component: CustomPaymentGateway, + empAccess: "Payment Data", + }, + { + path: "payment-method", + component: PaymentMethod, + empAccess: "Payment Method", + }, + { + path: "payment-details", + component: PaymentDetail, + empAccess: "Payment Details", + }, + { + path: "reffered-employee", + component: RefferedEmployeelist, + empAccess: "Employee Referrer", + }, + { + path: "activationkey-generation", + component: ActivationkeyGeneration, + empAccess: "Activationkey Generation", + }, + { + path: "gateway-master-configuration/new", + component: (props) => ( + + ), + empAccess: "Gateway Master Configuration", + }, + { + path: "gateway-master-configuration/update", + component: (props) => ( + + ), + empAccess: "Gateway Master Configuration", + }, + { + path: "gateway-master-configuration/list", + component: GatewayMasterConfigurationList, + empAccess: "Gateway Master Configuration", + }, + ], + }, +]; diff --git a/src/styles/BranchForm/BranchForm.scss b/src/styles/BranchForm/BranchForm.scss new file mode 100644 index 0000000..ab0aaf0 --- /dev/null +++ b/src/styles/BranchForm/BranchForm.scss @@ -0,0 +1,34 @@ +.branchForms { + display: flex; + align-items: flex-start; + flex-wrap: wrap !important; + width: 90% !important; +} + +.branchformDivAnt { + width: 100% !important; +} + +.branchformDivS { + overflow: hidden !important; +} + +.subinputForm2 { + flex-wrap: wrap; + width: 100%; +} + +.subinputForm2 { + @media screen and (max-width:768px) { + flex-direction: column !important; + } +} + +.financial-switch { + >button { + + width: max-content; + height: max-content; + border-radius: 50px; + } +} \ No newline at end of file diff --git a/src/styles/LandingPage/home.scss b/src/styles/LandingPage/home.scss new file mode 100644 index 0000000..9b0e677 --- /dev/null +++ b/src/styles/LandingPage/home.scss @@ -0,0 +1,402 @@ +.homePageDivP { + // margin: 0px max(10px, 4vw); + // margin-left: max(10px, 3.5vw); + display: flex; + flex-direction: column; + flex-grow: 1; + // flex-wrap: wrap; + column-gap: 1rem; + // padding: 1.5rem 0px; + // row-gap: 2rem; + overflow-x: hidden; + // grid-template-columns: 2fr 1fr; + // background-color: black; + width: 100%; +} + +.homePageDiv { + // margin: 0px max(10px, 4vw); + // margin-left: max(10px, 2.5vw); + display: flex; + flex-grow: 1; + flex-wrap: wrap; + column-gap: 1rem; + padding: 0.5rem 0px; + row-gap: 2rem; + overflow: auto; + // grid-template-columns: 2fr 1fr; + // background-color: black; + width: 100%; +} + +.AppsCardParentDiv { + background-color: white; + flex-grow: 2.5; + // max-width: min(80vw, 670px); + min-height: 500px; + border-radius: var(--CARD_BORDER_RADIUS); + width: 100%; +} + +.homePageRightSideCards { + // background-color: white; + flex-grow: 1; + min-width: 300px; + display: flex; + justify-content: flex-start; + flex-wrap: wrap; + // align-items: center; + overflow-x: auto; + flex-direction: column; + row-gap: 5rem; + // flex-direction: ; +} + +.homePageRightSideCard { + background-color: white; + width: min(80vw, 450px); + height: 250px; + border-radius: var(--CARD_BORDER_RADIUS); + overflow-y: auto; + overflow-x: hidden; +} + +.homeAppHeadder { + display: flex; + margin: 2rem 2rem; + column-gap: 1rem; +} + +.homePageAppIcon { + display: grid; + place-content: center; + padding: auto; +} + +.homeAppHeadder p { + font-size: 12px; + line-height: 14.06px; +} + + + + + +.appList { + // margin: min(); + // display: flex; + flex-wrap: wrap; + // height: 60vh; + overflow: auto; + width: 100%; +} +.appListComponent { + display: flex; + flex-direction: column; + flex-wrap: wrap; + column-gap: 3rem; + row-gap: 1rem; + // margin: 1rem max(10px, 3vw); + margin: 6px 1.5rem; + flex-grow: 1; + justify-content: center; + width: 100%; +} + +.appListComponentSub { + display: flex; + flex-wrap: wrap; + column-gap: 2rem; + row-gap: 1rem; + // margin: 1rem max(10px, 3vw); + flex-grow: 1; + justify-content: center; + width: 95%; + padding-bottom: 3rem; +} + +.appCard { + // border: 1px solid #C9C9C9; + border: 1px solid #1c1e1d; + border-radius: 4.55px; + width: 137.93px; + height: 126.79px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + font-size: 2vh; + font-weight: 500; + line-height: 13.71px; + cursor: pointer; + + & p { + padding: 1rem 0px; + } + + &:hover { + background-color: #F4EAF2; + border-color: #F4EAF2; + color: #8F1E78; + } +} + +//naresh 27/12/23 AppCard-Name implementation + +.AppCard-Name{ + width: 120px !important; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + text-align: center; +} + +.appCardexpire { + border: 1px solid #df1919; + border-radius: 4.55px; + width: 137.93px; + height: 126.79px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + font-size: 2vh; + font-weight: 500; + line-height: 13.71px; + cursor: pointer; + + & p { + padding: 0.47rem 0px; + } + + &:hover { + background-color: #F4EAF2; + border-color: #F4EAF2; + color: #8F1E78; + } +} +.appCardActive { + border: 1px solid #52C41A; + border-radius: 4.55px; + width: 137.93px; + height: 126.79px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + font-size: 2vh; + font-weight: 500; + line-height: 0.71px; + cursor: pointer; + & p { + padding: 0.9rem 0px; + } + + &:hover { + background-color: #F4EAF2; + border-color: #F4EAF2; + color: #8F1E78; + } +} + + +.appCardexpired { + border: 1px solid #ff8400; + border-radius: 4.55px; + width: 137.93px; + height: 126.79px; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + font-size: 2vh; + font-weight: 500; + line-height: 13.71px; + cursor: pointer; + + & p { + padding: 0.6rem 0px; + } + + &:hover { + background-color: #F4EAF2; + border-color: #F4EAF2; + color: #8F1E78; + } +} + +.divExpire{ + padding: 0.4rem; + padding-bottom: 0.4rem; + border-radius: 0.1rem; + color: #ff8400; + font-size: 0.7rem; + font-family: VAR(--PARA_FONT_FAMILY); + font-weight: 600; +} + +.divActive { + padding: 0.4rem 0.6rem; + padding-bottom: 0.4rem; + border-radius: 0.1rem; + color: #10ac10; + font-size: 0.8rem; + font-family: VAR(--PARA_FONT_FAMILY); + font-weight: 500; + background-color: #5ab95a4d; + border-radius: 4px; + border: 1px solid #5ab95a4d; +} + +.divExpired{ + padding: 0.4rem; + padding-bottom: 0.4rem; + border-radius: 0.1rem; + color: #FF4D4F; + font-size: 0.7rem; + font-family: VAR(--PARA_FONT_FAMILY); + font-weight: 600; +} + +.homePaymentParent { + overflow-y: auto; + overflow-x: hidden; + height: 100%; +} +.Pdf-Table-Div .ant-table-thead th{ + font-size: 0.6rem !important; +} + +.paymentHistoryTable { + overflow: auto; + height: 100%; + +} +.paymentHistoryTable::-webkit-scrollbar { + display: block !important; +} +.paymentHistoryTable .ant-table-thead th { + font-size: 0.6rem !important; + // color:black; +} +.paymentHistoryTable .ant-table-wrapper .ant-table-thead>tr>th { + color: black; + font-size: 13px; +} + +.tableText { + color: black; + font-size: 0.8rem; +} + +// .tableText:hover { +// // color: black; +// } + +.Pending { + color: orange; + // filter: brightness(70%); +} + +.tableText:has(.Pending):hover { + color: orange; + // filter: brightness(70%); +} + +.Success { + color: #52C41A; +} + +.tableText:has(.Success):hover { + color: #52C41A; +} + +.Cancelled { + color: #FF4D4F; +} + +.tableText:has(.Cancelled):hover { + color: #FF4D4F; +} + + +.homeNotification { + display: flex; + justify-content: flex-start; + align-items: center; + margin-left: 2rem; + font-family: var(--PARA_FONT_FAMILY); + font-size: 14px !important; + padding: 2rem; + padding-top: 1rem; +} + + + + + +::-webkit-scrollbar { + width: 3px; + height: 3px; +} + +::-webkit-scrollbar-thumb { + background: #c7c6c6; + border-radius: 16px; + box-shadow: + inset 2px 2px 2px hsla(0, 0%, 100%, 0.25), + inset -2px -2px 2px rgba(0, 0, 0, 0.25); +} +::-webkit-scrollbar-track { + border-radius: 25px; + background: linear-gradient(90deg, #ffffff, #c9c9c9 1px, #ffffff 0, #ffffff); +} + + + +.tooltip { + position: relative; + display: inline-block; + font-family: 'Gilroy'; + // border-bottom: 1px dotted black; + } + + .tooltip .tooltiptext { + visibility: hidden; + font-size: 14px; + font-family: 'Gilroy'; + width: 120px; + background-color: black; + color: #fff; + text-align: center; + border-radius: 6px; + padding: 5px 0; + + /* Position the tooltip */ + position: absolute; + z-index: 1; + top: 100%; + left: 50%; + margin-left: -60px; + } + + .tooltip:hover .tooltiptext { + font-family: 'Gilroy'; + visibility: visible; + } + + + .viewdiv{ + text-decoration: underline; + text-align: end; + cursor: pointer; + color: #3e99ed; + +} + + + + + + + diff --git a/src/styles/OtpVerify/OtpVerify.scss b/src/styles/OtpVerify/OtpVerify.scss new file mode 100644 index 0000000..617c220 --- /dev/null +++ b/src/styles/OtpVerify/OtpVerify.scss @@ -0,0 +1,64 @@ +.otpModule { + display: flex; + justify-content: center; + gap: 10px; + margin: 16px 0; +} + +.otpModuleInput { + width: 40px; + height: 40px; + text-align: center; + font-size: 18px; + border: 1px solid #ccc; + border-radius: 6px; +} + +.otpWrapper { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.user-password { + .ant-form-item-additional { + width: 250px !important; + font-size: 10px !important; + } + + .ant-form-item-explain-error { + font-size: 12px; + } +} + +.userPin { + .ant-input { + padding: 6px 14px 6px 11px !important; + } + +} + +// .otp-verified-icon { + +// right: 10px; +// // top: 35%; +// font-size: 23px; +// color: #52c41a; +// text-align: right; +// margin: 9px 116px; +// } + + +.showMap11 { + display: flex; + align-items: center; + gap: 1rem; + flex-wrap: wrap; + width: 100%; +} + +.showMap22 { + flex-direction: column; + width: unset !important; +} \ No newline at end of file diff --git a/src/styles/OverAllStyle/OverAllStyle.scss b/src/styles/OverAllStyle/OverAllStyle.scss new file mode 100644 index 0000000..5f9c7dd --- /dev/null +++ b/src/styles/OverAllStyle/OverAllStyle.scss @@ -0,0 +1,40 @@ +.appUrlInput { + .ant-input { + padding: 18px 10px 6px 2px !important; + } +} + +.reportTableCompany { + width: 100%; + overflow: scroll; + height: 65vh !important; + @media (max-width: 500px) { + width: 82%; + } +} + +.handleSubmitSMS { + width: 85%; + .ant-form-item { + width: 250px !important; + + } + + .ant-form { + flex: unset !important; + display: flex; + flex-wrap: wrap; + gap: 2rem; + row-gap: 0; + } + + .ant-row { + gap: 2rem; + } +} + +.submitButtonDiv{ + display: flex; + justify-content: flex-end; + width: 100%; +} \ No newline at end of file diff --git a/src/styles/PurchaseInfo/purchaseInfo.scss b/src/styles/PurchaseInfo/purchaseInfo.scss new file mode 100644 index 0000000..6a99123 --- /dev/null +++ b/src/styles/PurchaseInfo/purchaseInfo.scss @@ -0,0 +1,187 @@ + +.purchase-info-model { + .reportTable { + width: 100% !important; + height: max-content !important; + } + + .ant-table-cell { + text-align: left !important; + } + + .ant-empty-normal { + margin-block: 0 !important; + } +} + +.Planchanges { + display: flex; + padding: 15px; + gap: 15px; +} + +// vicky +.ModalOFpurchaseInfo { + .ant-modal-content { + padding: 30px 30px !important; + } + + .ant-modal-title { + font-size: 20px; + } +} + + +.PurchaseExtendModal { + display: flex; + flex-direction: column; + gap: 10px; + height: max-content; + max-height: 80vh; + overflow: scroll; + padding-bottom: 3rem; +} + +.appnameAndPlan { + display: inline-flex; + align-items: center; + gap: 10px; + font-family: 14px; + font-family: 'Gilroy'; + font-weight: 500; + >p:nth-child(1) { + display: inline-flex; + align-items: center; + gap: 4px; + } + + >p:nth-child(2) { + display: inline-flex; + align-items: center; + gap: 4px; + color: #000 !important; + font-weight: 600; + font-size: 14px; + } +} + +.StyleType-Container { + display: flex; + align-items: center; + gap: 10px; + font-size: 14px; + color: #000; + width: max-content; + background-color: #dadada; + padding: 4px 4px; + margin: 0px 0 10px 0; + border-radius: 6px; + font-family: 'Poppins'; + font-weight: 500; + + >div { + cursor: pointer; + } +} + +.addfeatInput { + display: flex; + align-items: flex-start; + gap: 1rem; + + .ant-form-item { + margin-bottom: 0px !important; + } +} + +//Srinath Changes +.purchase-info-model .reportTable .ant-table-thead{ + position: sticky; + top: 0; + background-color: #bad4f9; + z-index: 1; +} + +.purchaseInfoBtn { + background-color: #fff; + padding: 3px; + border-radius: 4px; + + .status-button { + padding: 5px 12px; + border: none; + border-radius: 4px; + font-size: 13px; + cursor: pointer; + transition: background 0.3s ease; + font-family: "Poppins"; + width: 130px; + } + + .active-btn { + background-color: rgb(0, 126, 28); + color: white; + } + + .expired-btn { + background-color: #ff0000; + color: white; + } + + .free-btn { + background-color: #1292ee; + color: white; + } + + .all-btn { + background-color: #0000008a; + color: white; + } + + .inactive-btn { + background-color: unset; + color: black; + } +} +.searchAddDiv1 { + display: flex; + align-items: center; + // gap: 10px; + flex-wrap: wrap; + white-space: nowrap; +} +.purchaseInfoDD { + .ant-select-selector, + .ant-select-single { + width: 160px !important; + } + .ant-select-selector { + height: 40px !important; + } +} +@media (max-width: 768px) { + .searchAddDiv1 { + height: 11rem; + } +} + +//Sajid + +.Adminnewplan{ + width:10vw; + height:6vh; + background-color:rgb(18, 146, 238); + border: none +} + +.purchase-div{ + .primary_Button{ + width: 140px !important; + } +} + +.purchase-submit{ + display: flex; + justify-content: flex-end; + margin-right: 60px; +} \ No newline at end of file diff --git a/src/styles/Warehouse/warehouse.scss b/src/styles/Warehouse/warehouse.scss new file mode 100644 index 0000000..2041532 --- /dev/null +++ b/src/styles/Warehouse/warehouse.scss @@ -0,0 +1,21 @@ +.warehouse-form-items{ + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +.warehouse-add-with-map{ + display: block; +} + +.warehouse-add-without-map{ + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +@media (max-width:768px){ + .MapDiv{ + display: none !important; + } +} \ No newline at end of file diff --git a/src/styles/appMenuAccess/appMenuAccess.scss b/src/styles/appMenuAccess/appMenuAccess.scss new file mode 100644 index 0000000..d986415 --- /dev/null +++ b/src/styles/appMenuAccess/appMenuAccess.scss @@ -0,0 +1,18 @@ +.reportTableSub{ + & .ant-checkbox .ant-checkbox-inner:after{ + background: black; + display: inline; + } +} +.formDivappMenu { + display: flex; + flex-wrap: wrap; + column-gap: 2rem; + // row-gap: 0.5rem; +} + +.reportTable-appMenu{ + height: 48vh !important; + overflow: auto; + width: 80vw; +} \ No newline at end of file diff --git a/src/styles/appPage/appPage.scss b/src/styles/appPage/appPage.scss new file mode 100644 index 0000000..a6b8d16 --- /dev/null +++ b/src/styles/appPage/appPage.scss @@ -0,0 +1,317 @@ +.appPage { + min-width: 100vw; + height: 100vh; + display: flex; + overflow: hidden; +} + +.sideNaveParent { + // width: clamp(43px, 9vw, 2000px); + // background-color: black; + // color: white +} + +.centerPage { + flex-grow: 1; + display: flex; + // width: calc(100vw - clamp(43px, 9vw, 2000px)); + height: 100vh; + background-color: var(--PAGE_BODY_BACKGROUND_COLOR); + width: 100%; +} + +.centerPageSub { + margin: 0px max(10px, 2vw); + // background-color: white; + flex-grow: 1; + width: 100%; + overflow: auto; + + @media (max-width: 500px) { + margin: 0px max(10px, 1vw) !important; + } +} + +.breadCrumbClass { + display: flex; + padding: 0.3rem 1rem 0.3rem 1rem; + justify-content: space-between; +} + +[data-letters]:before { + content: attr(data-letters); + display: inline-block; + font-size: 0.8em; + width: 2.5em; + // height:2.5em; + line-height: 2.4em; + text-align: center; + border-radius: 50%; + background: gray; + vertical-align: middle; + margin-right: 1em; + color: white; +} + +.UserNameBadge { + display: flex; + justify-content: flex-end; + flex-grow: 1; + // padding-right: 2rem; + // width: 96% +} + + +.tooltip { + position: relative; + display: inline-block; + font-family: 'Gilroy'; + // border-bottom: 1px dotted black; +} + +.tooltip .tooltiptext { + visibility: hidden; + font-size: 14px; + font-family: 'Gilroy'; + width: max-content; + background-color: black; + color: #fff; + text-align: center; + border-radius: 6px; + padding: 5px 10px; + + /* Position the tooltip */ + position: absolute; + z-index: 1; + top: 100%; + left: 50%; + margin-left: -60px; +} + +.tooltip:hover .tooltiptext { + font-family: 'Gilroy'; + visibility: visible; +} + +.content { + display: flex; + justify-content: center; + // background-color: white; + border-radius: 12px; + flex-direction: row; + height: 90vh; + overflow: auto; + width: 100%; +} + +.userPage { + height: 100%; + width: 100%; + padding: 10px max(10px, 1.5vw); + // padding: 0px max(10px, 9vw); + overflow: auto; +} + +.userPageContent { + height: 100%; + width: 100%; + padding-bottom: 1rem; + +} + +.formDiv { + display: flex; + flex-wrap: wrap; + column-gap: 3rem; + padding-top: 2rem; + // Sridhar + height: 74vh; + overflow: auto; + // + row-gap: 1.5rem; +} + +//naresh +.noheight { + height: auto !important; +} + +.formDivAnt { + display: flex; + flex-wrap: wrap; + column-gap: 3rem; + // padding-top: 2rem; + row-gap: 1.5rem; + // flex-direction: column; +} + +.formDivS { + display: flex; + flex-wrap: wrap; + flex-direction: column; + row-gap: 1.5rem; + // column-gap: 2rem; + // padding-top: 2rem; + // row-gap: 0.5rem; + // padding-top: 2rem; + // row-gap: 1.5rem; +} + +.formAddressDiv { + display: flex; + flex-wrap: wrap; + column-gap: 0.5rem; + +} + +.formAddressDiv p { + color: deepskyblue; +} + +.upload_btn p { + color: deepskyblue; +} + +.required:after { + content: " *"; + color: #FF4D4F; +} + +.TimePickerDiv { + width: var(--INPUT_FIELD_WIDTH); + padding: 18px 14px 6px 11px; + font-size: 16px; + font-weight: 490; +} + +.MapDiv { + position: relative; + // height: 55%; + flex-grow: 1; + // width: var(--INPUT_FIELD_WIDTH); + overflow: hidden; + border: none; +} + +.formdes { + font-style: normal; + color: var(--PARA_COLOR); + font-family: var(--PARA_FONT_FAMILY); + font-size: 2.1vh; + +} + +.submitButton { + display: flex; + flex-grow: 1; + justify-content: flex-end; + position: fixed; + bottom: 10px; + right: 100px; +} + + + +.formAddNew { + display: flex; + flex-direction: column; + row-gap: 1rem; +} + +.inputForm { + display: flex; + flex-wrap: wrap; + column-gap: 2rem; +} + +.subinputForm { + display: flex; + column-gap: 2rem; +} + +// .formSearch{ +// // display: flex; +// // justify-content: flex-end; +// margin-top: 2.5rem; +// } + +.userPageTable { + height: 100%; + width: 100%; + // padding: 0px max(10px, 3vw); + padding-left: var(--TABLE_PAGE_PADDING); + // overflow: hidden; + overflow: auto; + + @media (max-width: 500px) { + padding-left: 0; + } +} + +.searchAddDiv { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + row-gap: 1rem; + padding-bottom: 10px; + // height: 4rem; +} + +.reportTable { + overflow: auto; + // width: 80vw; + width: 100%; + //Sridhar + height: 70vh !important; + + // + @media (max-width: 500px) { + width: 100%; + } +} + +.pageOverAll { + background-color: white; + // width: 80vw; + width: 100%; +} + +.paypreLogoDiv { + display: flex; + justify-content: center; + align-items: center; + margin: 2.5rem 0px; + // row-gap: 1rem; +} + +//Sridhar + +.reportTable .ant-table-thead { + position: sticky; + top: 0; + background-color: #f3f3f3; + z-index: 1; +} + + +.reportTable .ant-pagination { + position: sticky; + bottom: 0; + margin: 0 !important; + padding: 0.5rem; + background-color: #fafafa; +} + +.selected { + border: 2px solid #52C41A; +} + +.productonlineImg { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + row-gap: 0.5rem; + // height: 50%; + overflow: auto; + // width:100% +} \ No newline at end of file diff --git a/src/styles/applications/applicationList.scss b/src/styles/applications/applicationList.scss new file mode 100644 index 0000000..eb0f776 --- /dev/null +++ b/src/styles/applications/applicationList.scss @@ -0,0 +1,821 @@ +// Enhanced Application List Styles +.application-list-container { + min-height: 100vh; + background: #f8fafc; + padding: 0; + overflow: auto; + border-radius: 12px; + font-family: "Poppins", sans-serif; +} + +.moreappsTitle { + width: inherit; + text-align: left; + margin: 8px 16px 16px 16px; + + div { + font-size: 28px; + color: #23378a; + font-weight: 500; + -webkit-text-stroke-width: 0.1px; + } + + p { + font-size: 12.5px; + color: #4a5565; + font-weight: 400; + } +} + +.LRScrollBTN { + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + z-index: 2; + transition: opacity 0.3s ease; + + &:hover { + opacity: 0.8; + } + + svg { + width: 40px; + color: #213088; + padding: 11px; + height: 40px; + background-color: #d1d5db; + display: flex; + border-radius: 8px; + transition: background-color 0.3s ease; + + &:hover { + background-color: #9ca3af; + color: #ffffff; + } + } +} + +// Category Filter Bar +.category-filter-bar { + background: white; + // border-radius: 12px; + margin: 0 1rem 0 1rem; + // border: 1px solid #e0e2e4; + display: flex; + align-items: center; + gap: 12px; + position: relative; + + .category-filters { + display: flex; + gap: 1rem; + white-space: nowrap; + overflow-x: auto; + overflow-y: hidden; + scroll-behavior: smooth; + flex: 1; + padding: 8px 0; + + // Hide scrollbar but keep functionality + &::-webkit-scrollbar { + display: none; + } + + -ms-overflow-style: none; + scrollbar-width: none; + + .category-filter-item { + display: flex; + flex-direction: row; + align-items: center; + gap: 4px; + padding: 8px 16px; + border-radius: 12px; + cursor: pointer; + transition: all 0.3s ease; + min-width: max-content; + flex-shrink: 0; + font-family: "Poppins", sans-serif; + background-color: #e9edff; + border: 1px solid #dbe2ff; + + &:hover { + background: #f8f9ff; + border-color: #e0e7ff; + } + + &.active { + background-color: #4b5ec7; + color: white; + border-color: #ffffff; + box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3); + } + + .category-icon { + font-size: 1.3rem; + display: flex; + } + + .category-name { + font-size: 14px; + font-weight: 400; + text-align: center; + line-height: 1.2; + } + + .category-count { + font-size: 0.8rem; + background: rgba(255, 255, 255, 0.2); + padding: 6px; + height: 30px; + text-align: center; + width: 30px; + border-radius: 8px; + font-weight: 500; + } + } + } +} + +// Header Section +.apps-section-header { + margin: 1rem; + margin-bottom: 1.5rem; + + .header-actions { + display: flex; + align-items: center; + gap: 1rem; + flex-wrap: nowrap; + // width: 100%; + flex-grow: 1; + justify-content: space-between; + + .searchBar { + display: flex; + align-items: center; + gap: 12px; + width: 100%; + flex: 1; + background: #ffffff; + border: 1px solid #e5e7eb; + border-radius: 12px; + padding: 0 14px; + } + + .searchInput { + height: 48px; + box-shadow: 0 8px 24px rgba(16, 24, 40, 0.06); + font-size: 14px; + color: #111827; + outline: none; + border: none; + width: 100%; + background-color: transparent; + font-family: "Poppins", sans-serif; + } + + .filterBtn { + background: #ffffff; + border: 1px solid #e5e7eb; + border-radius: 12px; + height: 50px; + padding: 0 14px; + display: inline-flex; + align-items: center; + font-family: "Poppins", sans-serif; + gap: 8px; + box-shadow: 0 8px 24px rgba(16, 24, 40, 0.06); + cursor: pointer; + color: #23378a; + font-weight: 400; + transition: all 0.3s ease; + + &:hover { + background: #f8f9ff; + border-color: #667eea; + } + } + } +} + +.sort-controls { + display: flex; + align-items: center; + gap: 0.5rem; + + label { + font-weight: 400; + color: #333; + font-size: 0.9rem; + } + + select { + padding: 0.5rem 1rem; + border: 2px solid #e0e0e0; + border-radius: 10px; + background: white; + font-size: 0.9rem; + cursor: pointer; + transition: all 0.3s ease; + + &:focus { + outline: none; + border-color: #667eea; + box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); + } + } +} + +.view-controls { + display: flex; + gap: 0.5rem; + + .view-btn { + padding: 6px 10px; + border: 2px solid #e0e0e0; + background: white; + border-radius: 6px; + cursor: pointer; + font-size: 18px; + transition: all 0.3s ease; + + &:hover { + border-color: #ffffff; + background: rgba(102, 126, 234, 0.1); + } + + &.active { + background: #3d5ace; + color: white; + border-color: #ffffff; + } + } +} + + +// Applications Grid +.applicationList { + padding: 0 1rem 2rem 1rem; + min-height: calc(100dvh - 4rem); + overflow-y: auto; + + // Custom scrollbar + &::-webkit-scrollbar { + width: 8px; + } + + &::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); + border-radius: 4px; + } + + &::-webkit-scrollbar-thumb { + background: rgba(102, 126, 234, 0.3); + border-radius: 4px; + + &:hover { + background: rgba(102, 126, 234, 0.5); + } + } +} + +.apps-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 1.5rem; + margin-bottom: 2rem; + + &.list { + grid-template-columns: 1fr; + + .enterprise-card { + display: flex; + flex-direction: row; + height: 300px; + + .card-header { + width: 300px; + height: 100%; + flex-shrink: 0; + } + + .card-content { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + } + } + } +} + +// Enterprise Card Styles (matching the detailed design) +.enterprise-card { + background: white; + border-radius: 16px; + overflow: hidden; + cursor: pointer; + transition: all 0.3s ease; + font-family: "Poppins", sans-serif; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08); + border: 1px solid #eef0f3; + + &:hover { + transform: translateY(-4px); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); + } + + + + + + + // Header Section + .card-header { + position: relative; + height: 200px; + background: #f5f7fb; + overflow: hidden; + + .header-bg-image { + width: 100%; + height: 100%; + object-fit: cover; + filter: brightness(0.9); + } + + // .setup-time-badge { + // position: absolute; + // top: 12px; + // left: 12px; + // background: rgba(0, 0, 0, 0.8); + // color: white; + // padding: 6px 12px; + // border-radius: 20px; + // font-size: 12px; + // font-weight: 500; + // display: flex; + // align-items: center; + // gap: 4px; + // } + + .header-actions { + position: absolute; + top: 12px; + right: 12px; + display: flex; + flex-direction: column; + gap: 8px; + + .action-btn { + width: 36px; + height: 36px; + border-radius: 50%; + border: 1px solid rgba(255, 255, 255, 0.3); + background: rgba(255, 255, 255, 0.9); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s ease; + backdrop-filter: blur(10px); + + &:hover { + background: white; + transform: scale(1.1); + } + + &.favorite { + color: #ff6b6b; + + &.favorited { + background: #ff6b6b; + color: white; + border-color: #ff6b6b; + } + } + } + } + } + + // Content Section + .card-content { + padding: 16px; + height: 250px; + display: flex; + flex-direction: column; + justify-content: space-between; + + .category-type { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 6px; + + .category { + color: #8b5cf6; + font-size: 12px; + font-weight: 500; + } + + .type-indicator { + display: flex; + align-items: center; + gap: 6px; + color: #8b5cf6; + font-size: 10px; + font-weight: 500; + + .dot { + width: 6px; + height: 6px; + background: #8b5cf6; + border-radius: 50%; + } + } + } + + .app-title { + font-size: 18px; + font-weight: 500; + color: #000000; + margin: 0 0 8px 0; + line-height: 1.2; + } + + .app-description { + font-size: 12px; + color: #4a5565; + line-height: 1.5; + margin: 0 0 6px 0; + } + + .rating-section { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; + + .stars { + display: flex; + gap: 2px; + + .star { + font-size: 16px; + + &.filled { + color: #fbbf24; + } + + &.half { + color: #fbbf24; + opacity: 0.7; + } + + &.empty { + color: #d1d5db; + } + } + } + + .rating-text { + font-size: 12px; + color: #4a5565; + } + } + + .key-metrics { + display: flex; + gap: 16px; + justify-content: space-around; + margin-bottom: 16px; + background-color: #ebf2fc; + padding: 10px; + border-radius: 8px; + + .metric-item { + display: flex; + align-items: center; + gap: 8px; + + .metric-icon { + color: #8b5cf6; + font-size: 16px; + } + + .metric-content { + display: flex; + flex-direction: column; + + .metric-value { + font-size: 14px; + font-weight: 400; + color: #000000; + line-height: 1; + } + + .metric-label { + font-size: 12px; + color: #4a5565; + line-height: 1; + } + } + } + } + + .feature-tags { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 16px; + + .feature-tag { + padding: 4px 12px; + border: 1px solid #e0e7ff; + border-radius: 20px; + font-size: 12px; + color: #8b5cf6; + background: #f8faff; + font-weight: 500; + } + } + + // .certifications-support { + // display: flex; + // flex-wrap: wrap; + // gap: 12px; + // margin-bottom: 16px; + + // .cert-item { + // display: flex; + // align-items: center; + // gap: 6px; + // font-size: 13px; + // color: #374151; + + // .cert-icon { + // font-size: 14px; + + // &:first-child { + // color: #10b981; + // } + // } + // } + // } + + .pricing-section1 { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 16px; + + .monthly-price { + font-size: 18px; + font-weight: 500; + color: #000000; + } + + .annual-price { + font-size: 12px; + color: #4a5565; + text-align: right; + } + } + + .cta-section1 { + display: flex; + gap: 12px; + margin-bottom: 12px; + flex-direction: column; + + .primary-cta { + flex: 1; + background-color: #7c3aed; + color: white; + border: none; + border-radius: 8px; + padding: 8px 16px; + font-size: 13px; + font-weight: 400; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + transition: all 0.3s ease; + font-family: "Poppins", sans-serif; + + &:hover { + transform: translateY(-1px); + } + } + + .secondary-cta { + width: 44px; + height: 44px; + border: 1px solid #d1d5db; + background: white; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s ease; + + svg { + font-size: 14px; + } + } + } + + .trial-info { + display: flex; + align-items: center; + gap: 6px; + font-size: 10px; + color: #4a5565; + text-align: center; + font-weight: 400; + justify-content: center; + } + } +} + +// Loading States +.loading-container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 50vh; + color: #667eea; + + .loading-spinner { + width: 50px; + height: 50px; + border: 4px solid rgba(102, 126, 234, 0.3); + border-top: 4px solid #667eea; + border-radius: 50%; + animation: spin 1s linear infinite; + margin-bottom: 1rem; + } + + p { + font-size: 1.2rem; + font-weight: 500; + } +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +// No Results State +.no-results { + text-align: center; + color: #667eea; + padding: 4rem 2rem; + + .no-results-icon { + font-size: 4rem; + margin-bottom: 1rem; + opacity: 0.7; + } + + h3 { + font-size: 2rem; + margin-bottom: 1rem; + font-weight: 600; + } + + p { + font-size: 1.1rem; + opacity: 0.8; + max-width: 500px; + margin: 0 auto; + } +} + +// Responsive Design +@media (max-width: 768px) { + .category-filter-bar { + margin: 0.5rem; + padding: 0.5rem; + + .category-filters { + gap: 0.5rem; + + .category-filter-item { + min-width: 100px; + padding: 0.75rem; + + .category-name { + font-size: 0.8rem; + } + } + } + } + + .apps-section-header { + margin: 0.5rem; + + .header-actions { + flex-direction: column; + gap: 0.5rem; + + .searchBar { + width: 100%; + } + + .filterBtn { + width: 100%; + justify-content: center; + } + } + } + + .controls-section { + margin: 0 0.5rem 1rem 0.5rem; + flex-direction: column; + gap: 1rem; + align-items: stretch; + + .sort-controls, + .view-controls { + justify-content: center; + } + } + + .apps-grid { + grid-template-columns: 1fr; + gap: 1rem; + + &.list .enterprise-card { + flex-direction: column; + height: auto; + + .card-header { + width: 100%; + height: 200px; + } + } + } + + .applicationList { + padding: 0 0.5rem 1rem 0.5rem; + } + + .enterprise-card { + .card-content { + padding: 16px; + + .app-title { + font-size: 20px; + } + + + .pricing-section1 { + flex-direction: column; + align-items: flex-start; + gap: 4px; + } + } + } +} + +@media (max-width: 480px) { + .category-filter-item { + min-width: 80px !important; + padding: 0.5rem !important; + + .category-name { + font-size: 0.7rem !important; + } + + .category-count { + font-size: 0.7rem !important; + } + } + + .enterprise-card { + .card-content { + padding: 12px; + + .app-title { + font-size: 18px; + } + + .monthly-price { + font-size: 20px; + } + } + } +} \ No newline at end of file diff --git a/src/styles/applications/applications.scss b/src/styles/applications/applications.scss new file mode 100644 index 0000000..37712fc --- /dev/null +++ b/src/styles/applications/applications.scss @@ -0,0 +1,48 @@ +.homeApplication { + // background-image: url('../../Images/appBackground.png'); + background-repeat: no-repeat; + background-size: contain; + display: flex; + flex-direction: column; + flex-grow: 1; + height: 100dvh; + width: 80vw; + +} + +.applicationSearch { + display: flex; + justify-content: center; + align-items: center; + // flex-grow: 1; + height: 4rem; + font-family: "Poppins", sans-serif; + h1{ + font-size: 24px; + margin: 10px 0; + color: #000000; + font-weight: 600; + } + + & .ant-input-search { + width: 50% !important; + text-align: center; + // padding: 0px 100px; + } + + & .ant-input-group-addon { + display: none; + } + + & ::placeholder { + text-align: center; + color: black; + font-weight: 500; + } + + & .searchDiv .ant-input { + border-radius: 23px !important; + padding: 0px; + // width: 75%; + } +} \ No newline at end of file diff --git a/src/styles/pageComponents/FormHeader.scss b/src/styles/pageComponents/FormHeader.scss new file mode 100644 index 0000000..4339af1 --- /dev/null +++ b/src/styles/pageComponents/FormHeader.scss @@ -0,0 +1,8 @@ +.formHeader { + font-size: 25px; + font-weight: 600; + color: #000000; + font-family: var(--HEADING_FONT_FAMILY); + // padding-top: 0.5rem; + // padding-top: min(); +} \ No newline at end of file diff --git a/src/styles/template/Faq/Modal4.css b/src/styles/template/Faq/Modal4.css new file mode 100644 index 0000000..fa5b8b7 --- /dev/null +++ b/src/styles/template/Faq/Modal4.css @@ -0,0 +1,354 @@ +.noImage { + width: 150%; + height: 300px; + background-color: rgb(194, 194, 194); +} +.modalContainer { + display: flex; + padding: 55px; + column-gap: 2rem; + row-gap: 2rem; +} +.modalContainer2 { + /* padding: 7rem 16rem; */ + display: flex; + flex-direction: column; + justify-content: center; + row-gap: 1rem; + margin: 45px; +} +.left { + width: 40%; + display: flex; + justify-content: center; + padding: 15px 0 0 0; +} + +.right { + display: flex; + flex-direction: column; + row-gap: 1rem; + padding: 50px 0 0 0; +} +.faqstext1 { + font-style: normal; + font-weight: 500; + font-size: 26px !important; + color: #000; +} +.h1faq { + width: 30rem; + font-size: 26px; + font-family: Gilroy; +} + +@media (min-width: 220px) and (max-width: 499px) { + .preTitleData { + padding: 0 50px; + width: 20rem !important; + } + .faqimgContainer { + width: 69% !important; + } +} + +@media only screen and (min-width: 858px) { + .master1 { + width: 50%; + } +} +@media only screen and (max-width: 859px) { + .modalContainer { + flex-wrap: wrap; + } + .master1 { + width: 100% !important; + } + .modalContainer2 { + padding: 0rem 0rem !important; + } +} +@media only screen and (max-width: 280px) { + .modalContainer2 { + padding: 10px 10px !important; + } +} +@media only screen and (max-width: 576px) { + .h1faq { + width: auto; + } + .faqimgContainer { + margin: auto !important; + flex-direction: row !important; + } + .faqCollapseContainer { + justify-content: center; + margin: auto; + /* width: 90%; */ + } + .modalContainer { + padding: 10px 10px; + } +} + +.range0 { + width: 10vw; + height: 2vh; + background-color: lightgray; +} +.swaiperimage { + width: 15rem; +} + +.swaiper-div-one { + display: flex; + flex-direction: column; + row-gap: 1rem; +} + +.skeletondiv2 { + background-color: #fff; + width: 28vw; + height: 17vh; + display: flex; + flex-direction: column; + justify-content: space-around; +} +.headingSkeleton2 { + width: 20vw; + height: 1.5vh; + background-color: lightgray; +} +.headingSkeleton3 { + width: 15vw; + height: 1.5vh; + background-color: lightgray; +} +.SkeletonDiv { + display: flex; + flex-direction: column; + justify-content: space-evenly; + float: left; + background-color: rgb(243, 243, 243); + width: 15vw; + height: 20vh; + padding: 10px; + margin-bottom: 12px; +} + +.modalContainer { + display: flex; + flex-direction: row; + justify-content: center; + /* flex-wrap: wrap; */ +} + +.secondfq { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.master-range8 { + border: 0.5px solid gray; + padding: 10px; + width: 60%; + box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px; +} +.Range9 { + width: 10vw; + height: 1vh; + background-color: rgb(143, 141, 141); +} + +.Heading_container { + display: flex; + flex-direction: column; + gap: 0.2rem; +} +.Rengegroup { + display: flex; + flex-direction: column; + gap: 0.2rem; + background-color: rgb(225, 233, 236); + width: 57%; + padding: 10px; +} + +.master-range1 { + border: 0.5px solid gray; + padding: 10px; + width: 100%; + box-shadow: rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px; +} + +.Rengegroup1 { + display: flex; + flex-direction: column; + gap: 0.2rem; + background-color: rgb(225, 233, 236); + width: 100%; + padding: 10px; +} + +.Skeleton-container { + display: flex; + flex-direction: column !important; +} +.range10 { + margin: 10px 0; + width: 10vw; + height: 2vh; + background-color: lightgray; +} +.FaqempTitleData { + background-color: #929292; + width: 5rem; + height: 0.5rem; +} +/* .FaqempImageData{ +} */ +.Faq1EmptyBox { + background-color: #929292; + width: 6rem; + height: 1rem; + margin: 5px; +} + +.preTitleData { + width: 24rem; + font-family: "Gilroy"; + font-size: 22px; + text-align: left; + font-weight: 600; +} +.preTitleData2 { + font-family: "Gilroy"; + font-size: 22px; + text-align: left; + font-weight: 600; +} +.Faq1Box { + font-size: 16px; + font-weight: 400; + padding: 3px 40px; +} +.Faq2Box { + font-size: 16px; + font-weight: 400; + padding: 3px 40px; +} +.FaqImageData { + width: 18rem !important; + margin: 1rem; +} +.faqimgContainer { + width: 100%; +} +/* .faqlistcont{ + width: 32rem; +} */ +@media (min-width: 250px) and (max-width: 859px) { + /* .faqlistcont{ + width: 93vw !important; + } */ + .FaqImageData { + width: 10rem !important; + margin: 0.4rem; + } +} + +/* collapse */ + +.preTitleData { + width: auto !important; +} + +.firstFaqList { + padding: 7px; + border: 1.5px solid #dbdbdb; + border-left: none; + border-radius: 3px; +} +.subfirstFaqList { + background-color: #cac9c9; + width: 8rem; + height: 0.2rem; +} +.seconfFaqList { + padding: 10px; + background-color: #f7fcff; +} +.thirdfaqList { + width: 7rem; + height: 0.3rem; + background-color: #cac8c8; + + margin: 4px auto; +} + +.faqCollapseContainer .ant-collapse { + width: 40rem !important; + margin: 1vw 1vh; +} + +@media only screen and (max-width: 1068px) { + .faqCollapseContainer .ant-collapse { + width: auto !important; + } +} + +/* .withoutaData { + width: 10vw; + height: 3vh; + background-color: rgb(143, 141, 141); +} +.withoutaData2 { + width: 9.5vw; + height: 3vh; + background-color: rgb(223, 251, 255); + margin: auto; +} +.withoutaData3 { + width: 10vw; + height: 3vh; + background-color: rgb(143, 141, 141); + margin: 2px 0px; +} */ + +.faqCollapseContainer .ant-collapse-content-box { + background-color: #e9e9e9; + border-radius: 0 0 5px 5px; +} +.faqCollapseContainer { + display: flex; + flex-direction: column; + justify-content: flex-start; +} + +/* .withoutaData { + width: 10vw; + height: 3vh; + background-color: rgb(143, 141, 141); +} +.withoutaData2 { + width: 9.5vw; + height: 3vh; + background-color: rgb(223, 251, 255); + margin: auto; +} +.withoutaData3 { + width: 10vw; + height: 3vh; + background-color: rgb(143, 141, 141); + margin: 2px 0px; +} */ + +.faqCollapseContainer .ant-collapse-content-box { + background-color: #e9e9e9; + border-radius: 0 0 5px 5px; +} + +/* .modalContainer .ant-collapse-header{ +border: 1px solid ; +} */ diff --git a/src/styles/template/Feature/feature1.css b/src/styles/template/Feature/feature1.css new file mode 100644 index 0000000..c946a34 --- /dev/null +++ b/src/styles/template/Feature/feature1.css @@ -0,0 +1,141 @@ +.features1Body { + display: flex; + /* grid-template-columns: repeat(2, 1fr); + */ + column-gap: 4rem; + padding: min(2rem, 5%); + overflow: auto; + /* background-color: fff; */ + background: #e8e8e8b2; +} + +.feature1mainImage { + width: min(50%, 10rem); +} + +.feature1subImage { + /* width: min(50%, 5rem); */ + break-inside: avoid; + /* box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; */ + width: 2.4rem; +} + +.feature1Card { + box-shadow: rgba(149, 157, 165, 0.2) 0px 8px 24px; + padding: 2rem 2rem; + margin: 2rem; + display: flex; + flex-direction: column; + row-gap: 1rem; + border-radius: 11px; + width: 22rem; + /* border: 1px solid; */ + background-color: #fff; +} + +/* .feature1mainImage { + box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; + border-radius: 10px; +} */ + +.feature1SubCatP { + display: flex; + /* flex-wrap: wrap; */ + row-gap: 1rem; + column-gap: 1rem; + align-items: center; +} +/* .feature1Des { +text-wrap: nowrap;} */ + +.feature1SubCat { + display: flex; + column-gap: 0.2rem; + align-items: center; +} + +.feature1Card:nth-child(even) { + /* & .feature1mainImage { + margin-left: auto; + } */ + + /* .feature1SubCatP { + justify-content: flex-end; + } */ + + /* .feature1Des { + text-align: right; + } */ + /* + .feature1EmptyBox { + margin-left: auto; + } */ +} + +.formSubDiv { + display: flex; +} + +.feature1EmptyBox { + display: flex; + /* align-items: center; */ + background-color: #929292; + width: 5rem; + height: 1rem; +} + +.feature1DesEmpty { + width: min(10rem, 60%); +} + +.feature1SingleGrid { + grid-template-columns: repeat(1, 1fr); +} + +.featureButton { + width: 100%; + display: flex; + justify-content: flex-end; +} + +@media screen and (max-width: 450px) { + /* .features1Body { + display: grid; + grid-template-columns: repeat(1, 1fr); + row-gap: 2rem; + } */ + .feature1Card { + margin: 0 !important; + padding: 0.5rem !important; + + transform: scale(1); + width: 14.5rem; + justify-content: center; + } + .feature1SubCatP { + transform: scale(0.7); + justify-content: center; + } +} + +.features1Body::-webkit-scrollbar { + display: flex !important; /* Width of the scrollbar */ +} + +.features1Body::-webkit-scrollbar { + width: 10px; + height: 4px; + cursor: pointer; +} + +.features1Body::-webkit-scrollbar-track { + background: #f1f1f1; /* Color of the track */ +} + +.features1Body::-webkit-scrollbar-thumb { + background: #888; /* Color of the scroll thumb */ +} + +.features1Body::-webkit-scrollbar-thumb:hover { + background: #555; /* Color of the scroll thumb on hover */ +} diff --git a/src/styles/template/Feature/feature2.css b/src/styles/template/Feature/feature2.css new file mode 100644 index 0000000..b0b35dd --- /dev/null +++ b/src/styles/template/Feature/feature2.css @@ -0,0 +1,431 @@ +.overallfeaturediv { + display: flex; + flex-wrap: wrap; + flex-direction: row; + align-items: center; + width: 490px; + gap: 1rem; + } + + + + .feature-demo-div1 { + display: flex; + flex-direction: row; + align-items: center; + width: 100%; + justify-content: space-evenly; + gap: 0.5rem; + margin-top: 18px; + } + + .feature-real-div1 { + display: flex; + flex-wrap: wrap; + align-items: center; + margin-bottom: 20px; + } + + .feature-demo-img1 { + width: 140px; + height: 100px; + margin-top: 10px; + } + + .feature-demo-range1 { + width: 250px; + height: 15px; + margin: 30px 0px 10px 10px; + background-color: gray; + } + + .feature-demo-range2 { + width: 220px; + height: 15px; + background-color: gray; + } + + .feature-demo-master-div2 { + display: flex; + margin-left: 50px; + gap: 1rem; + } + + .feature-real-div2 { + display: flex; + justify-content: space-evenly; + } + + .feature-demo-div2 { + display: flex; + flex-direction: row; + gap: 1rem; + } + + .feature-real-img2 { + width: 5vw; + height: 10vh; + } + + .feature-demo-img2 { + width: 60px; + height: 40px; + } + + .feature-demo-lightgray-range { + width: 80px; + height: 10px; + margin-top: 15px; + background-color: lightgray; + margin-bottom: 10px; + } + + .feature-real-lightgray-range { + width: 100%; + height: 10px; + margin-top: 15px; + background-color: #fff; + margin-bottom: 2rem; + font-size: 22px; + font-weight: 600; + } + + .feature-real-div3 { + display: flex; + justify-content: space-evenly; + } + + .feature-demo-div3 { + display: flex; + gap: 1rem; + } + + .feature-real-img3 { + width: 5vw; + height: 10vh; + } + + .feature-demo-img3 { + width: 60px; + height: 40px; + } + + /* ----------------------------------------------------EDIT------------------------------------------------------------------------*/ + + .feature-model1-div1 { + display: flex; + flex-direction: row; + } + .feature-model1-div1-input { + margin-top: 15px; + } + .feature-model1-div1-img { + margin: 15px; + } + .feature-model1-div2 { + display: flex; + flex-direction: row; + gap: 1.5rem; + margin-left: 17px; + } + .feature-model1-subdiv2 { + display: flex; + flex-direction: row; + } + .feature-model1-subdiv2-input { + margin: 1rem 0rem 0rem 0.5rem; + } + .model1-submit { + display: flex; + flex-wrap: wrap; + justify-content: right; + } + + /* .ant-space { + flex-direction: column; + } */ + /* ----------------------------------------------------VIEW---------------------------------------------------------------------- */ + .featureMaindiv { + display: flex; + flex-direction: row; + } + + .feature-demo-view-div1 { + display: flex; + gap: 15rem; + } + .feature-demo-view-range1 { + width: 450px; + height: 25px; + margin-top: 35px; + background-color: gray; + margin-bottom: 10px; + } + + .feature-demo-view-range2 { + width: 420px; + height: 25px; + background-color: gray; + } + + .feature-demo-master-view-div2 { + display: flex; + gap: 5rem; + margin: 10rem 0rem 2rem 4rem; + } + + .feature-demo-view-div2 { + display: flex; + gap: 6rem; + } + + .feature-demo-view-div3 { + display: flex; + gap: 6rem; + } + + .feature-demo-view-sub-range { + width: 180px; + height: 20px; + margin-top: 15px; + background-color: lightgray; + margin-bottom: 10px; + } + + .model2-submit { + margin: 0rem 0rem 0rem 32rem; + } + + .feature-demo-rally-range1 { + width: 450px; + height: 25px; + margin-left: 50px; + margin-top: 35px; + background-color: #fff; + margin-bottom: 10px; + } + + .feature-rally-range1 { + width: 100%; + background-color: #fff; + font-weight: 600; + font-size: 19px; + margin-left: 20px; + } + + .ant-btn-dashed { + border-color: #008000; + } + + .Add-button { + margin: 0rem 0rem 9rem 22rem; + color: #008000; + border: solid 1px #008000; + border-radius: 50%; + padding: 10px; + position: absolute; + bottom: 170px; + left: 44px; + } + + /* media queries */ + /* For screens smaller than 768px (e.g., smartphones) */ + @media (max-width: 768px) { + .feature-real-div2 { + flex-wrap: wrap; + } + .feature-real-div3 { + flex-wrap: wrap; + } + + /* .ant-btn { + position: absolute; + right: 82px; + bottom: 50px; + } */ + .feature-demo-master-div2 { + display: block; + gap: 0rem; + margin-left: 0px; + flex-direction: column; + } + .feature-demo-div1 { + display: block; + gap: 0rem; + } + .feature-demo-div2 { + display: block; + gap: 0rem; + } + .feature-demo-div3 { + display: block; + gap: 0rem; + } + .feature-demo-img1 { + width: 60px; + height: 40px; + } + .feature-demo-img2 { + width: 45px; + height: 35px; + } + .feature-demo-img3 { + width: 45px; + height: 35px; + } + .feature-demo-range1 { + width: 50px; + height: 15px; + } + .feature-model1-subdiv2 { + flex-direction: column; + margin-left: 0rem; + } + } + + /* For screens between 768px and 991px (e.g., tablets) */ + @media (min-width: 768px) and (max-width: 991px) { + .feature-demo-master-div2 { + flex-wrap: wrap; + flex-direction: column; + margin-left: 0px; + } + /* .ant-btn { + position: absolute; + right: 82px; + bottom: 50px; + } */ + .feature-demo-div1 { + display: block; + gap: 0rem; + } + .feature-demo-div2 { + display: block; + gap: 0rem; + } + .feature-demo-div3 { + display: block; + gap: 0rem; + } + .feature-demo-range1 { + width: 100px; + height: 15px; + } + .feature-model1-div2 { + flex-wrap: wrap; + margin: -1rem 0rem 0rem 0rem; + } + .Add-button { + margin: 0rem 0rem -0.5rem 10rem; + } + } + + @media (max-width: 542px) { + .feature-demo-master-div2 { + flex-wrap: wrap; + margin-left: 0px; + } + .feature-demo-div1 { + display: block; + gap: 0rem; + } + .feature-demo-div2 { + display: block; + gap: 0rem; + } + .feature-demo-div3 { + display: block; + gap: 0rem; + } + .feature-demo-img1 { + width: 60px; + height: 40px; + } + .feature-demo-img2 { + width: 45px; + height: 35px; + } + .feature-demo-img3 { + width: 45px; + height: 35px; + } + .feature-model1-div2 { + gap: 0rem; + flex-wrap: wrap; + margin: -1rem 0rem 0rem 0rem; + } + .Add-button { + margin: 0rem 0rem -0.5rem 10rem; + } + .feature-demo-rally-range2 { + margin-left: 40px; + } + .feature-real-div2 { + flex-direction: column; + margin-bottom: 1rem; + padding: 0px; + } + .feature-real-div3 { + flex-direction: column; + padding: 0px; + } + .featureMaindiv { + display: block; + } + } + + @media (max-width: 375px) { + .feature-demo-master-div2 { + flex-wrap: wrap; + flex-direction: column; + margin-left: 0px; + } + .feature-demo-div1 { + display: block; + gap: 0rem; + } + .feature-demo-div2 { + display: block; + gap: 0rem; + } + .feature-demo-div3 { + display: block; + gap: 0rem; + } + /* .ant-btn { + position: absolute; + right: 40px; + bottom: 50px; + } */ + .feature-model1-div2 { + gap: 0rem; + flex-wrap: wrap; + margin: -1rem 0rem 0rem 0rem; + } + .Add-button { + margin: 1rem 0rem -9rem 5rem; + } + .ImageWithData { + width: 170px; + } + } + + .ImageWithOutData { + width: 160px !important; + } + + .ImageWithData { + width: 250px; + } + + .SubImageWithData + { + width: 60px; + height: 60px; + } + + .SubImageWithOutData + { + width: 60px !important; + } + \ No newline at end of file diff --git a/src/styles/template/Feature/feature3.css b/src/styles/template/Feature/feature3.css new file mode 100644 index 0000000..a7da6c0 --- /dev/null +++ b/src/styles/template/Feature/feature3.css @@ -0,0 +1,141 @@ +.features3Body { + display: flex; + /* grid-template-columns: repeat(2, 1fr); + */ + /* column-gap: 4rem; */ + /* padding: min(2rem, 5%); */ + overflow: auto; + /* background-color: fff; */ + /* background: #e8e8e8b2; */ +} + +.feature3mainImage { + width: min(50%, 10rem); +} + +.feature3subImage { + /* width: min(50%, 5rem); */ + break-inside: avoid; + /* box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; */ + width: 2.4rem; +} + +.feature3Card { + box-shadow: rgba(149, 157, 165, 0.2) 0px 8px 24px; + padding: 2rem 2rem; + margin: 1rem; + display: flex; + flex-direction: column; + row-gap: 1rem; + border-radius: 11px; + width: 18rem; + /* border: 1px solid; */ + background-color: #fff; +} + +/* .feature3mainImage { + box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; + border-radius: 10px; + } */ + +.feature3SubCatP { + display: flex; + /* flex-wrap: wrap; */ + row-gap: 1rem; + column-gap: 1rem; + align-items: center; +} +/* .feature3Des { + text-wrap: nowrap;} */ + +.feature3SubCat { + display: flex; + column-gap: 0.2rem; + align-items: center; +} + +.formSubDiv { + display: flex; +} + +.feature3EmptyBox { + display: flex; + /* align-items: center; */ + background-color: #929292; + width: 5rem; + height: 1rem; +} + +.feature3DesEmpty { + width: min(10rem, 60%); +} + +.feature3SingleGrid { + grid-template-columns: repeat(1, 1fr); +} + +.featureButton { + width: 100%; + display: flex; + justify-content: flex-end; +} + +@media screen and (max-width: 450px) { + /* .features3Body { + display: grid; + grid-template-columns: repeat(1, 1fr); + row-gap: 2rem; + } */ + .feature3Card { + margin: 0 !important; + padding: 0.5rem !important; + + transform: scale(1); + width: 14.5rem; + justify-content: center; + } + .feature3SubCatP { + transform: scale(0.7); + justify-content: center; + } +} + +.features3Body::-webkit-scrollbar { + display: flex !important; /* Width of the scrollbar */ +} + +.features3Body::-webkit-scrollbar { + width: 10px; + height: 4px; + cursor: pointer; +} + +.features3Body::-webkit-scrollbar-track { + background: #f1f1f1; /* Color of the track */ +} + +.features3Body::-webkit-scrollbar-thumb { + background: #888; /* Color of the scroll thumb */ +} + +.features3Body::-webkit-scrollbar-thumb:hover { + background: #555; /* Color of the scroll thumb on hover */ +} + +/* .feature3Card{ + width: 7rem; + height: 5rem; + } */ + +.features3Body { + display: flex; + flex-wrap: wrap; + transform: scale(0.9); + row-gap: 1.3rem; + +} + +.feature3Card:hover { + transform: scale(0.9); +} + diff --git a/src/styles/template/Navbar/NavbarHorizontal.scss b/src/styles/template/Navbar/NavbarHorizontal.scss new file mode 100644 index 0000000..1face24 --- /dev/null +++ b/src/styles/template/Navbar/NavbarHorizontal.scss @@ -0,0 +1,575 @@ +.rt-nav-list { + display: none; + list-style-type: none; +} + +.ant-menu-overflow { + justify-content: flex-end; +} + +.ant-menu-light { + background: rgba(255, 255, 255, 0) !important; + border-radius: 12.9916px; + padding-inline: 0rem; + /* margin-inline: 1rem; */ +} + +.ant-menu-horizontal { + border-bottom: none; +} + +.dispflex { + display: flex; + justify-content: space-evenly; + align-items: center; + + // background: white !important; +} + +.nav-offer { + font-size: 16px !important; + cursor: pointer; + text-transform: uppercase; + font-weight: 550; + border: none; + color: #333; + padding: 12px 0px; + border-radius: 6px; +} + +.nav-offer:hover { + // border-bottom: 2px solid #0f67da; + border-radius: 0; + color: #0f67da; + padding: 12px 0px; +} + +.divApplogo { + padding: 0.5rem; + display: flex; +} + +.divAppname { + display: flex; + width: min-content; + align-items: center; + flex-wrap: wrap; +} + +.PayPreFont { + // font-family: 'Playball', cursive; +} + +.toggleuppernav { + display: none; +} + +.upmenuList { + display: flex; + font-size: 14px; + flex-direction: row; + column-gap: 2rem; + font-weight: 600; + // font-family: var(--HEADING_FONT_FAMILY) +} + +.user-nav-opt { + flex-direction: column; + display: flex; + row-gap: 0.6rem; + padding: 0.3rem; +} + +/* For screens smaller than 414px (smartphones) */ +@media (min-width: 360px) and (max-width: 459px) { + .upmenuList { + display: none !important; + } + + .scroluppernav { + display: none; + } + + .toggleuppernav { + display: flex; + flex-direction: row; + column-gap: 2rem; + } + + .dispflex { + justify-content: space-around; + } + + .toggle-container { + display: none; + } + + .nav-toggle { + position: absolute; + top: 5rem; + z-index: 1; + text-align: right; + background-color: #fff; + height: auto; + // font-family: var(--HEADING_FONT_FAMILY); + font-size: 14px; + font-weight: 600; + transition-duration: 0.6s; + } + + .rt-nav-list { + // padding: 1rem 16rem; + padding: 0rem 3rem; + line-height: 2rem; + flex-direction: column; + display: flex; + transition-duration: 0.6s; + box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1) !important; + align-content: center; + } + + .rt-nav-list:hover { + color: #c50909; + } + + // .nav-user-toggle{ + // position: absolute; + // top: 3rem; + // right: 0; + // z-index: -1; + // background-color: #fff; + // // font-family: var(--HEADING_FONT_FAMILY); + // font-size: 14px; + // font-weight: 600; + + // } + + // .user-nav-opt{ + + // padding: 1rem 0rem; + // line-height: 2rem; + // flex-direction: column; + // display: flex; + // background-color: #ffffff; + // box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1) !important; + // } + + .nav-user-fullview { + position: absolute; + top: 10rem; + right: 0; + z-index: -1; + background-color: #fff; + // font-family: var(--HEADING_FONT_FAMILY); + font-size: 14px; + font-weight: 600; + } + + .user-nav-opt-fullview { + // padding: 1rem 0rem; + // position: absolute !important; + // line-height: 2rem; + // flex-direction: column; + // background-color: #ffffff; + // box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1) !important; + } +} + +/* For screens smaller than 768px (smartphones) */ +@media (min-width: 460px) and (max-width: 767px) { + .scroluppernav { + display: none; + } + + .Home-navbar { + display: none !important; + } + + .toggleuppernav { + display: flex; + justify-content: space-around; + flex-direction: row; + column-gap: 2rem; + } + + // .nav-user-toggle{ + // position: absolute; + // top: 3rem; + // right: 0; + // z-index: -1; + // background-color: #fff; + // // font-family: var(--HEADING_FONT_FAMILY); + // font-size: 14px; + // font-weight: 600; + + // } + + // .user-nav-opt{ + // padding: 1rem 1rem; + // line-height: 2rem; + // flex-direction: column; + // display: flex; + // align-items: center; + // background-color: #ffffff; + // box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1); + // } + + .dispflex { + justify-content: space-around; + column-gap: 10rem; + } + + .nav-toggle { + top: 5rem; + right: 0; + z-index: 1; + // width: 100%; + position: absolute; + height: auto; + // font-family: var(--HEADING_FONT_FAMILY); + font-size: 14px; + font-weight: 600; + } + + .rt-nav-list { + // padding: 1rem 22rem; + padding: 0rem 3rem; + width: 100%; + right: 0; + text-align: left; + display: flex; + flex-wrap: wrap; + flex-direction: column; + background-color: #ffffff; + box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1); + line-height: 2rem; + align-content: center; + } + + .rt-list { + cursor: pointer; + width: 100%; + text-align: left; + color: #000; + + & li { + display: inline; + margin: 0 1rem; + color: #000000; + } + } + + .rt-list:hover { + cursor: pointer; + color: #009719 !important; + } + + .usr-acc { + cursor: pointer; + width: 100%; + text-align: center; + + & li { + display: inline; + margin: 0 1rem; + color: #000000; + } + } + + .usr-acc:hover { + cursor: pointer; + color: #009719; + } + + // .nav-user-toggle{ + // position: absolute; + // top: 3rem; + // right: 0; + // z-index: 1; + // // font-family: var(--HEADING_FONT_FAMILY); + // font-size: 14px; + // font-weight: 600; + + // } +} + +.divApplication { + text-align: center; + line-height: 2px; + // width: 10px; + display: flex; + justify-content: space-around; +} + +.divAppname { + display: flex; + flex-direction: row; + // row-gap: 0.1rem; +} + +@media (min-width: 280px) and (max-width: 459px) { + .Home-navbar { + display: none; + } + + .Uppernav { + display: none; + } + + .extranav { + display: none; + } + + .small_nav { + width: 0vh !important; + } + + .extra_small_div { + font-size: 14px !important; + text-transform: uppercase; + } + + .faqsimg { + display: none !important; + } + + .extra_small_nav { + margin: 0vw 0vh; + width: 70vw; + display: flex; + justify-content: space-around; + font-size: 13.2px; + } + + // .toggle-container{ + // width: 80vh !important; + // } + + .collapsed-menu { + width: 80vh !important; + margin: 1vw 0vh !important; + } + + .ant-collapse { + width: 75vh !important; + } +} + +@media all and (max-width: 899px) { + .nav-toggle { + top: 5rem; + right: 0; + z-index: 1; + // width: 100%; + position: absolute; + height: auto; + // font-family: var(--HEADING_FONT_FAMILY); + font-size: 14px; + font-weight: 600; + } + + // .nav-user-toggle{ + // position: absolute; + // top: 3rem; + // right: 0; + // width: 200px; + // z-index: -1; + // background-color: #fff; + // // font-family: var(--HEADING_FONT_FAMILY); + // font-size: 14px; + // font-weight: 600; + + // } + + // .user-nav-opt{ + // padding: 1rem 1rem; + // line-height: 2rem; + // flex-direction: column; + // display: flex; + // align-items: center; + // background-color: #ffffff; + // box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1); + // } + + .rt-nav-list { + padding: 0rem 3rem; + // position: absolute; + // padding: 1rem 22rem; + width: 100%; + right: 0; + text-align: left; + display: flex; + flex-wrap: wrap; + flex-direction: column; + background-color: #ffffff; + box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1); + line-height: 2rem; + align-content: center; + } + + .toggleuppernav { + display: flex; + flex-direction: row; + column-gap: 2rem; + } + + .upmenuList { + display: none !important; + } + + .Home-navbar { + display: none; + } + + .Uppernav { + display: none; + } + + .extranav { + display: none; + } + + // .toggle-container{ + // width: 60vh; + // } + + .extra_small_div { + font-size: 14px !important; + color: #000000; + // font-family: var(--PARA_FONT_FAMILY); + } + + .sliderdiv { + } + + .freebtn { + // width: 30vh; + } +} + +@media (min-width: 1422px) and (max-width: 1077px) { + .Home-navbar { + opacity: 12% !important; + } +} + +* { + margin: 0; + padding: 0; +} + +// body { +// height: 200rem; +// // background-color: rgb(110, 110, 110); +// } +// nav { +// position: fixed; +// width: 100%; +// display: flex; +// justify-content: center; +// background-color:#fff !important; +// align-items: center; +// height: 10rem; +// z-index: 3; +// } +// nav{ +// position: fixed; +// width: 100%; +// display: flex; +// justify-content: space-around; +// background-color: transparent !important; +// // height: 10rem; +// z-index: 10; +// flex-direction: column; +// } + +// ul { +// list-style: none; +// } + +.AppBg { + background-color: var(--APP_BASED_BACKGROUND_COLOR) !important; +} + +.navclass nav { + background-color: white !important; +} + +// .user-nav-opt-fullview{ +// position: absolute !important; +// font-size:14px; +// font-weight:500; +// line-height: 2rem; +// display:flex; +// top: 5rem; +// right: 0; +// // font-family: var(--PARA_FONT_FAMILY); +// align-items: center; +// margin: 1rem 14rem; +// background-color:#ffffff !important; ; +// flex-direction: column; +// box-shadow: 0px 4px 15px rgba(0, 0, 0, 0.1) !important; +// text-align:'right'; +// row-gap:'0.7rem'; +// } + +.user-nav-opt-fullview { + color: #00000000; + display: flex; + flex-direction: column; + row-gap: 0.6rem; + margin: 0.3rem; +} + +.honavlinkWOData { + background-color: #9b9b9b; + width: 100px; + height: 15px; + font-size: 22px; +} + +.honavlinkWOData { + font-size: 14px; + width: 80px; + text-decoration: none; + color: #bababa; +} + +.honavPayPreFontwodata { + background-color: #9b9b9b; + width: 100px; + height: 15px; + font-size: 22px; +} + +.honavPayPreFontwodata { + font-size: 14px; + width: 80px; + text-decoration: none; + color: #bababa; +} + +.NavBarForm { + display: flex; + flex-direction: column; +} + +.navclass { + .navbar { + position: relative !important; + } +} + +.scroll { + .nav-links a { + color: #000000 !important; + } +} + +.templatetoHome { + svg { + border: none !important; + padding: 1px 5px 5px 5px !important; + display: flex !important; + } +} diff --git a/src/styles/template/Navbar/SideNav.scss b/src/styles/template/Navbar/SideNav.scss new file mode 100644 index 0000000..42d34cc --- /dev/null +++ b/src/styles/template/Navbar/SideNav.scss @@ -0,0 +1,81 @@ +.UserAvatar{ + display: flex; + justify-content: center; + align-items: flex-end; + margin: 2.5rem 0px; + + // row-gap: 1rem; +} + +.sideNavePar { + width: clamp(43px, 9vw, 2000px); + overflow:auto; + display: flex; + flex-direction: column; + align-items: center; + + + + + // color: white +} + +.appPage{ + min-width: 100vw; + height: 100vh; + display: flex; + overflow: hidden; +} + + +.sidenavpaypreLogoDiv { + display: flex; + justify-content: center; + align-items: center; + margin: .5rem 0px; + // row-gap: 1rem; +} + + +.PreviewNav1{ + display: flex; + align-items: center; + flex-direction: column; + justify-content: space-evenly; + // height: 25rem; + height: inherit; + width: 6rem; +} + +.preVlink{ + display: flex; + flex-direction:column; + color: #000000 !important; + row-gap: 1rem; + cursor: pointer; +} + +// .nvlink{ +// font-size:13px !important +// } + + +// .nvlink:hover{ +// font-weight:600; +// } + + +.nvlinkWOData{ + background-color: #9b9b9b; + width: 100px; + height:15px; + font-size:22px; +} + + +.nvlinkWOData{ + font-size: 14px; + width: 80px; + text-decoration: none; + color: #bababa; +} \ No newline at end of file diff --git a/src/styles/template/commonApp/AppTemplate.scss b/src/styles/template/commonApp/AppTemplate.scss new file mode 100644 index 0000000..858d652 --- /dev/null +++ b/src/styles/template/commonApp/AppTemplate.scss @@ -0,0 +1,529 @@ +// .AppTemplateDIv{ +// background-color: rgb(247, 247, 247); +// margin: 2rem 2rem; +// padding: 2rem 2rem; +// } + +// .Nav-templates{ +// display: flex; +// margin: 2rem 0rem; +// width:100%; +// } + +// .TemplateCard{ +// margin: 2rem 3rem; +// width:max-content; +// } + +// .tempUp{ +// display: flex; +// width: 66vw; +// flex-wrap:wrap; +// // flex-direction: row; +// gap:1rem; +// } +// .swatches-picker{ +// width: min(61vw,250px) !important; +// height: 240px !important; +// } + +// .fontsdiv{ +// display: flex; +// // flex-wrap:wrap; +// flex-direction: row; +// gap:0.5rem; +// } +// .colorBtn{ + +// background-color: var(--PRIMARY_BUTTON_BG_COLOR); +// color: white; +// font-family: var(--HEADING_FONT_FAMILY); +// font-style: normal; +// border: 4.8px solid var(--PRIMARY_BUTTON_BG_COLOR); +// border-radius: 8px; +// width: 30%; +// float: right; +// margin-top: 18px; +// } + +// .colorDropdown .ant-select-single:not(.ant-select-customize-input) .ant-select-selector{ +// height:54px; +// } +// .plusOutlinedIcon{ +// margin-top: 16px; +// } +// .fontInputs{ +// display: flex; +// flex-wrap: wrap; +// gap:1rem; +// } + +// #app { +// height: 100%; +// } + +// .swiper { +// width: 100%; +// height: 100%; +// } + +// .swiper-slide { +// text-align: center; +// font-size: 18px; +// background: #fff; +// width:max-content !important; +// /* Center slide text vertically */ +// display: flex; +// justify-content: center; +// align-items: center; +// } + +// .swiper-slide img { +// display: block; +// width: 100%; +// height: 100%; +// object-fit: cover; +// } + +// .swiper { +// width: 100%; +// height:max-content; +// margin: 10px auto; + +// } + +// .append-buttons { +// text-align: center; +// margin-top: 20px; +// } + +// .append-buttons button { +// display: inline-block; +// cursor: pointer; +// border: 1px solid #007aff; +// color: #007aff; +// text-decoration: none; +// padding: 4px 10px; +// border-radius: 4px; +// margin: 0 10px; +// font-size: 13px; +// } + +// .swiper-wrapper{ +// transform: translate3d(40px, 0px, 0px); +// padding: 0.2rem 0rem; +// } + +// .swiper-button-prev:after, .swiper-button-next:after { +// font-family: swiper-icons; +// font-size: 15px !important; +// text-transform: none !important; +// letter-spacing: 0; +// font-variant: initial; +// text-align:center !important; +// // border:1px solid #000; +// background-color: #fff; +// padding:0.5rem 0.7rem; +// border-radius:50px; +// } + +// .swiper-button-next, .swiper-rtl .swiper-button-prev { +// right: var(--swiper-navigation-sides-offset, 10px); +// left: auto; +// } +// .swiper-button-next, .swiper-rtl .swiper-button-prev { +// right: var(--swiper-navigation-sides-offset, 10px); +// left: auto; +// } +// .swiper-button-prev, .swiper-button-next { +// position: absolute; +// top: var(--swiper-navigation-top-offset, 50%); +// width: 30px !important; +// height: 30px !important; +// z-index: 10; +// cursor: pointer; +// display: flex; +// align-items: center; +// justify-content: center; +// color: #000 !important; + +// } + +// h1{ +// font-size: 18px; +// font-family: var(--HEADING_FONT_FAMILY); +// font-weight: 600; +// } + +.AppTemplateDIv { + background-color: rgb(247, 247, 247); + margin: 2rem 2rem; + padding: 2rem 2rem; +} + +.Nav-templates { + display: flex; + margin: 2rem 0rem; + width: 100%; +} + +.TemplateCard { + margin: 2rem 3rem; + width: max-content; + border-radius: 3%; +} + +.tempUp { + display: flex; + width: 66vw; + flex-wrap: wrap; + // flex-direction: row; + gap: 1rem; + & .field-DropDown { + width: 160px !important; + } +} +.swatches-picker { + width: min(61vw, 250px) !important; + height: 240px !important; +} + +.fontsdiv { + display: flex; + // flex-wrap:wrap; + flex-direction: row; + gap: 0.5rem; +} +.colorBtn { + background-color: var(--PRIMARY_BUTTON_BG_COLOR); + color: white; + font-family: var(--HEADING_FONT_FAMILY); + font-style: normal; + border: 4.8px solid var(--PRIMARY_BUTTON_BG_COLOR); + border-radius: 8px; + width: 30%; + float: right; + margin-top: 18px; +} + +.colorDropdown + .ant-select-single:not(.ant-select-customize-input) + .ant-select-selector { + height: 54px; +} +.plusOutlinedIcon { + margin-top: 16px; +} +.fontInputs { + display: flex; + flex-wrap: wrap; + gap: 1rem; +} + +#app { + height: 100%; +} + +.swiper { + width: 100%; + height: 100%; +} + +.swiper-slide { + text-align: center; + font-size: 18px; + background: #fff; + width: max-content !important; + /* Center slide text vertically */ + display: flex; + justify-content: center; + align-items: center; +} + +.swiper-slide img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; +} + +.swiper { + width: 100%; + height: max-content; + margin: 10px auto; +} + +.append-buttons { + text-align: center; + margin-top: 20px; +} + +.append-buttons button { + display: inline-block; + cursor: pointer; + border: 1px solid #007aff; + color: #007aff; + text-decoration: none; + padding: 4px 10px; + border-radius: 4px; + margin: 0 10px; + font-size: 13px; +} + +.swiper-wrapper { + transform: translate3d(40px, 0px, 0px); + padding: 0.2rem 0rem; +} + +.swiper-button-prev:after, +.swiper-button-next:after { + font-family: swiper-icons; + font-size: 15px !important; + text-transform: none !important; + letter-spacing: 0; + font-variant: initial; + text-align: center !important; + // border:1px solid #000; + background-color: #fff; + padding: 0.5rem 0.7rem; + border-radius: 50px; +} + +.swiper-button-next, +.swiper-rtl .swiper-button-prev { + right: var(--swiper-navigation-sides-offset, 10px); + left: auto; +} +.swiper-button-next, +.swiper-rtl .swiper-button-prev { + right: var(--swiper-navigation-sides-offset, 10px); + left: auto; +} +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: var(--swiper-navigation-top-offset, 50%); + width: 30px !important; + height: 30px !important; + z-index: 10; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: #000 !important; +} + +h1 { + font-size: 18px; + font-family: var(--HEADING_FONT_FAMILY); + font-weight: 600; +} + +.setscalesize { + transform: scale(0.9); +} + +.themeselection { + display: block; + flex-direction: column; + align-items: left; + cursor: pointer; + padding: 1rem 1rem; + font-size: 22px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #fff; + + .navbar { + position: relative !important; + } +} + +.themeselection:hover { + // display: block; + // cursor: pointer; + // padding: 2rem 4rem; + // font-size: 22px; + // -webkit-user-select: none; + // -moz-user-select: none; + // -ms-user-select: none; + // user-select: none; + + // border-style: dashed; + // border-width: 1px; +} + +.themeselection.selected { + border: #424242 solid 1px; + border-style: dashed; + border-width: 1.9px; + background-color: #ffffff; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + padding: 0rem 1rem; + display: flex; + flex-direction: column; +} + +// updated / + +.themeselection input { + position: absolute; + opacity: 0; + cursor: pointer; +} + +/* Create a custom radio button */ +.checkmark { + position: absolute; + top: 0; + right: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + border-radius: 1%; + z-index: -1; +} + +.themeselection:hover input ~ .checkmark { + background-color: #ccc; +} + +.themeselection input:checked ~ .checkmark { + // background-color: #4ce071; + border: #424242 solid 1px; + border-style: dashed; + border-width: 1.9px; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); +} + +.checkmark:after { + content: ""; + position: absolute; + display: none; +} + +.themeselection .checkmark:after { + top: 10px; + left: 10px; + width: 15px; + height: 15px; + border-radius: 50%; + // background: white; +} + +.selectionCard { + background-color: #ffffff; + // border: #000 solid 1px; + border-radius: 6px; + display: flex; + flex-direction: column; + position: fixed; + padding: 1rem 2rem; + bottom: 0; + right: 0; + margin: 0rem 0.5rem; + z-index: 2; + & ul { + list-style: none; + } +} + +.tempView { + height: 80vh; + width: 80vw; + overflow-y: scroll; + overflow-x: hidden; +} + +.sidenavTempOverall { + display: flex; + flex-direction: column !important; + transition-duration: 0.6s; +} +.tempOptions { + display: flex; + padding: 1rem 0rem; + flex-direction: row; + font-size: 18px; + gap: 1rem; + + svg { + background-color: #141414; + color: #fff; + height: 30px; + width: 30px; + padding: 5px; + border-radius: 5px; + cursor: pointer; + } +} + +.pointerModal { + pointer-events: none; +} + +.FloatSection_Update { + // width: 72%; + height: 60px; + background-color: rgb(255, 255, 255); + position: absolute; + z-index: 1; + bottom: 0; + padding: 0rem 5rem; + display: flex; + flex-direction: row; + column-gap: 2rem; + align-items: flex-end; + right: 0; +} + +@media (min-width: 278px) and (max-width: 499px) { + .CategoryHorizontal-scroll-container { + overflow: auto !important; + width: 57vw !important; + } + .Nav-templates { + margin: 0 !important; + } + .tempOptions { + font-size: 22px !important; + } + + .themeselection { + transform: scale(0.6) !important; + + display: block; + flex-direction: column; + align-items: left; + cursor: pointer; + padding: 1rem 1rem; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #fff; + } + .themeselection.selected { + transform: scale(0.5); + } +} + +@media (min-width: 500px) and (max-width: 768px) { + .CategoryHorizontal-scroll-container { + overflow: auto !important; + width: 57vw !important; + } + .Nav-templates { + margin: 0 !important; + } + + .themeselection { + padding: 1rem 1rem !important; + transform: scale(0.6); + } + .themeselection.selected { + transform: scale(0.5); + } +} diff --git a/src/styles/template/commonApp/check.scss b/src/styles/template/commonApp/check.scss new file mode 100644 index 0000000..fcbe3fb --- /dev/null +++ b/src/styles/template/commonApp/check.scss @@ -0,0 +1,543 @@ +// .AppTemplateDIv{ +// background-color: rgb(247, 247, 247); +// margin: 2rem 2rem; +// padding: 2rem 2rem; +// } + +// .Nav-templates{ +// display: flex; +// margin: 2rem 0rem; +// width:100%; +// } + +// .TemplateCard{ +// margin: 2rem 3rem; +// width:max-content; +// } + +// .tempUp{ +// display: flex; +// width: 66vw; +// flex-wrap:wrap; +// // flex-direction: row; +// gap:1rem; +// } +// .swatches-picker{ +// width: min(61vw,250px) !important; +// height: 240px !important; +// } + +// .fontsdiv{ +// display: flex; +// // flex-wrap:wrap; +// flex-direction: row; +// gap:0.5rem; +// } +// .colorBtn{ + +// background-color: var(--PRIMARY_BUTTON_BG_COLOR); +// color: white; +// font-family: var(--HEADING_FONT_FAMILY); +// font-style: normal; +// border: 4.8px solid var(--PRIMARY_BUTTON_BG_COLOR); +// border-radius: 8px; +// width: 30%; +// float: right; +// margin-top: 18px; +// } + +// .colorDropdown .ant-select-single:not(.ant-select-customize-input) .ant-select-selector{ +// height:54px; +// } +// .plusOutlinedIcon{ +// margin-top: 16px; +// } +// .fontInputs{ +// display: flex; +// flex-wrap: wrap; +// gap:1rem; +// } + +// #app { +// height: 100%; +// } + +// .swiper { +// width: 100%; +// height: 100%; +// } + +// .swiper-slide { +// text-align: center; +// font-size: 18px; +// background: #fff; +// width:max-content !important; +// /* Center slide text vertically */ +// display: flex; +// justify-content: center; +// align-items: center; +// } + +// .swiper-slide img { +// display: block; +// width: 100%; +// height: 100%; +// object-fit: cover; +// } + +// .swiper { +// width: 100%; +// height:max-content; +// margin: 10px auto; + +// } + +// .append-buttons { +// text-align: center; +// margin-top: 20px; +// } + +// .append-buttons button { +// display: inline-block; +// cursor: pointer; +// border: 1px solid #007aff; +// color: #007aff; +// text-decoration: none; +// padding: 4px 10px; +// border-radius: 4px; +// margin: 0 10px; +// font-size: 13px; +// } + +// .swiper-wrapper{ +// transform: translate3d(40px, 0px, 0px); +// padding: 0.2rem 0rem; +// } + +// .swiper-button-prev:after, .swiper-button-next:after { +// font-family: swiper-icons; +// font-size: 15px !important; +// text-transform: none !important; +// letter-spacing: 0; +// font-variant: initial; +// text-align:center !important; +// // border:1px solid #000; +// background-color: #fff; +// padding:0.5rem 0.7rem; +// border-radius:50px; +// } + +// .swiper-button-next, .swiper-rtl .swiper-button-prev { +// right: var(--swiper-navigation-sides-offset, 10px); +// left: auto; +// } +// .swiper-button-next, .swiper-rtl .swiper-button-prev { +// right: var(--swiper-navigation-sides-offset, 10px); +// left: auto; +// } +// .swiper-button-prev, .swiper-button-next { +// position: absolute; +// top: var(--swiper-navigation-top-offset, 50%); +// width: 30px !important; +// height: 30px !important; +// z-index: 10; +// cursor: pointer; +// display: flex; +// align-items: center; +// justify-content: center; +// color: #000 !important; + +// } + +// h1{ +// font-size: 18px; +// font-family: var(--HEADING_FONT_FAMILY); +// font-weight: 600; +// } + +.AppTemplateDIv { + background-color: rgb(247, 247, 247); + margin: 2rem 2rem; + padding: 2rem 2rem; +} + +.Nav-templates { + display: flex; + margin: 2rem 0rem; + width: 100%; +} + +.TemplateCard { + margin: 2rem 3rem; + width: max-content; + border-radius: 3%; +} + +.tempUp { + display: flex; + width: 66vw; + flex-wrap: wrap; + // flex-direction: row; + gap: 1rem; + + & .field-DropDown { + width: 160px !important; + } +} + +.swatches-picker { + width: min(61vw, 250px) !important; + height: 240px !important; +} + +.fontsdiv { + display: flex; + // flex-wrap:wrap; + flex-direction: row; + gap: 0.5rem; +} + +.colorBtn { + background-color: var(--PRIMARY_BUTTON_BG_COLOR); + color: white; + font-family: var(--HEADING_FONT_FAMILY); + font-style: normal; + border: 4.8px solid var(--PRIMARY_BUTTON_BG_COLOR); + border-radius: 8px; + width: 30%; + float: right; + margin-top: 18px; +} + +.colorDropdown + .ant-select-single:not(.ant-select-customize-input) + .ant-select-selector { + height: 54px; +} + +.plusOutlinedIcon { + margin-top: 16px; +} + +.fontInputs { + display: flex; + flex-wrap: wrap; + gap: 1rem; +} + +#app { + height: 100%; +} + +.swiper { + width: 100%; + height: 100%; +} + +.swiper-slide { + text-align: center; + font-size: 18px; + background: #fff; + width: max-content !important; + /* Center slide text vertically */ + display: flex; + justify-content: center; + align-items: center; +} + +.swiper-slide img { + display: block; + width: 100%; + height: 100%; + object-fit: cover; +} + +.swiper { + width: 100%; + height: max-content; + margin: 10px auto; +} + +.append-buttons { + text-align: center; + margin-top: 20px; +} + +.append-buttons button { + display: inline-block; + cursor: pointer; + border: 1px solid #007aff; + color: #007aff; + text-decoration: none; + padding: 4px 10px; + border-radius: 4px; + margin: 0 10px; + font-size: 13px; +} + +.swiper-wrapper { + transform: translate3d(40px, 0px, 0px); + padding: 0.2rem 0rem; +} + +.swiper-button-prev:after, +.swiper-button-next:after { + font-family: swiper-icons; + font-size: 15px !important; + text-transform: none !important; + letter-spacing: 0; + font-variant: initial; + text-align: center !important; + // border:1px solid #000; + background-color: #fff; + padding: 0.5rem 0.7rem; + border-radius: 50px; +} + +.swiper-button-next, +.swiper-rtl .swiper-button-prev { + right: var(--swiper-navigation-sides-offset, 10px); + left: auto; +} + +.swiper-button-next, +.swiper-rtl .swiper-button-prev { + right: var(--swiper-navigation-sides-offset, 10px); + left: auto; +} + +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: var(--swiper-navigation-top-offset, 50%); + width: 30px !important; + height: 30px !important; + z-index: 10; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: #000 !important; +} + +h1 { + font-size: 18px; + font-family: var(--HEADING_FONT_FAMILY); + font-weight: 600; +} + +.setscalesize { + transform: scale(0.9); +} + +.themeselection { + display: block; + flex-direction: column; + align-items: left; + cursor: pointer; + padding: 1rem 1rem; + font-size: 22px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #fff; + + .navbar { + position: relative !important; + } +} + +.themeselection:hover { + // display: block; + // cursor: pointer; + // padding: 2rem 4rem; + // font-size: 22px; + // -webkit-user-select: none; + // -moz-user-select: none; + // -ms-user-select: none; + // user-select: none; + + // border-style: dashed; + // border-width: 1px; +} + +.themeselection.selected { + border: #424242 solid 1px; + border-style: dashed; + border-width: 1.9px; + background-color: #ffffff; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); + padding: 0rem 1rem; + display: flex; + flex-direction: column; +} + +// updated / + +.themeselection input { + position: absolute; + opacity: 0; + cursor: pointer; +} + +/* Create a custom radio button */ +.checkmark { + position: absolute; + top: 0; + right: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + border-radius: 1%; + z-index: -1; +} + +.themeselection:hover input ~ .checkmark { + background-color: #ccc; +} + +.themeselection input:checked ~ .checkmark { + // background-color: #4ce071; + border: #424242 solid 1px; + border-style: dashed; + border-width: 1.9px; + box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.1); +} + +.checkmark:after { + content: ""; + position: absolute; + display: none; +} + +.themeselection .checkmark:after { + top: 10px; + left: 10px; + width: 15px; + height: 15px; + border-radius: 50%; + // background: white; +} + +.selectionCard { + background-color: #ffffff; + // border: #000 solid 1px; + border-radius: 6px; + display: flex; + flex-direction: column; + position: fixed; + padding: 1rem 2rem; + bottom: 0; + right: 0; + margin: 0rem 0.5rem; + z-index: 2; + + & ul { + list-style: none; + } +} + +.tempView { + height: 80vh; + width: 80vw; + overflow-y: scroll; + overflow-x: hidden; +} + +.sidenavTempOverall { + display: flex; + flex-direction: column !important; + transition-duration: 0.6s; +} + +.tempOptions { + display: flex; + padding: 1rem 0rem; + flex-direction: row; + font-size: 18px; + gap: 1rem; + + svg { + background-color: #141414; + color: #fff; + height: 30px; + width: 30px; + padding: 5px; + border-radius: 5px; + cursor: pointer; + } +} + +.pointerModal { + pointer-events: none; +} + +.FloatSection_Update { + // width: 72%; + height: 60px; + background-color: rgb(255, 255, 255); + position: absolute; + z-index: 1; + bottom: 0; + padding: 0rem 5rem; + display: flex; + flex-direction: row; + column-gap: 2rem; + align-items: flex-end; + right: 0; +} + +@media (min-width: 278px) and (max-width: 499px) { + .CategoryHorizontal-scroll-container { + overflow: auto !important; + width: 57vw !important; + } + + .Nav-templates { + margin: 0 !important; + } + + .tempOptions { + font-size: 22px !important; + } + + .themeselection { + transform: scale(0.6) !important; + + display: block; + flex-direction: column; + align-items: left; + cursor: pointer; + padding: 1rem 1rem; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #fff; + } + + .themeselection.selected { + transform: scale(0.5); + } +} + +@media (min-width: 500px) and (max-width: 768px) { + .CategoryHorizontal-scroll-container { + overflow: auto !important; + width: 57vw !important; + } + + .Nav-templates { + margin: 0 !important; + } + + .themeselection { + padding: 1rem 1rem !important; + transform: scale(0.6); + } + + .themeselection.selected { + transform: scale(0.5); + } +} diff --git a/src/styles/template/contact/contact.css b/src/styles/template/contact/contact.css new file mode 100644 index 0000000..6a5bbf2 --- /dev/null +++ b/src/styles/template/contact/contact.css @@ -0,0 +1,85 @@ +.contact1 { + display: flex; + /* flex-wrap: wrap; */ + flex-direction: row; + row-gap: 1rem; + justify-content: space-evenly; + margin: 8vw 8vh; + } + .contactNo{ + display: flex; + } + .ContactMail{ + flex-direction: column; + display: flex; + justify-content: space-evenly; + } + .contact-no { + font-style: normal; + font-weight: 500; + font-size: 27.3037px; + color: #000; + } + .contactimg1 { + width: 286px; + height: 244px; + border-radius: 35.9316px 0 0 35.9316px; + } + .helpContainer{ + display: flex; + } + .helpDesk{ + display: flex; + } + .mailLogo{ + display: flex; + align-items: center; + } + @media screen and (max-width:990px){ + .contact1 { + display: flex; + /* flex-wrap: wrap; */ + /* flex-direction: column; */ + row-gap: 2rem; + justify-content: space-evenly; + margin: 0; + align-items: center; + padding: 5px; + } + } + @media screen and (max-width:768px){ + .contactimg1{ + display: none; + } + } + @media screen and (max-width:330px){ + .mailLogo{ + flex-direction: column ; + } + .mail-contact-logo{ + width: fit-content; + margin: auto; + } + } + + @media screen and (max-width:499px){ + .contactimg1{ + display: none; + } + .contact-no{ + font-size: 18px; + } + .resupgrading{ + font-size: 12px; + } + .contact1{ + row-gap: 1.5rem; + } + } + .contact-cont{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + row-gap: 2rem; + } \ No newline at end of file diff --git a/src/styles/template/downloadsource/downloadsource.css b/src/styles/template/downloadsource/downloadsource.css new file mode 100644 index 0000000..3577671 --- /dev/null +++ b/src/styles/template/downloadsource/downloadsource.css @@ -0,0 +1,201 @@ +.downloadtext1 { + font-style: normal; + font-weight: 400; + font-size: clamp(2rem, 1.5dvw, 6rem); + color: #000; + width: 100%; +} +.downloadSource-container { + padding: 4rem 3rem; + display: flex; + justify-content: space-evenly; + background-color: #E8E8E8B2; +} +.downloadsubtext1 { + font-style: normal; + font-weight: 600; + font-size: clamp(0.5rem, 0.8dvw, 1rem); + color: #000; + opacity: 0.7; +} +.left-container { + display: flex; + flex-wrap: wrap; + flex-direction: column; + row-gap: 1rem; + padding: 0rem 2rem; +} +.DS-subcontainer { + display: flex; + flex-direction: row; + row-gap: 1rem; +} +.downloadsources1 { + width: 100%; + background-color: #f8f8f8; + padding-bottom: 5vh; + border-radius: 8px; + display: flex; + flex-direction: column; + justify-content: center; +} + +.downloadsource { + display: flex; + flex-wrap: wrap; + flex-direction: row; + margin: 12vw -1vh; + row-gap: 1rem; +} + +.downloaddiv { + display: flex; + flex-wrap: wrap; + flex-direction: column; + row-gap: 1rem; + display: flex; + flex-grow: 1; + margin: 1vw 16vh; +} + +.downloadtext { + font-style: normal; + font-weight: 400; + font-size: clamp(1rem, 1.5dvw, 6rem); + color: #000000; +} +.downloadsubtext { + font-style: normal; + font-weight: 600; + font-size: clamp(0.5rem, 0.8dvw, 1rem); + color: #000000; + opacity: 0.7; +} +.DS-button-container { + display: flex; + justify-content: center; +} + +.downloadsources { + width: 880px; + height: 224px; + display: flex; + flex-wrap: wrap; + flex-grow: 1; + flex-direction: column; + row-gap: 1rem; + background: rgba(240, 240, 240, 0.5); + border-radius: 18.3177px; +} + +.downloadsourcestext { + font-style: normal; + font-weight: 500; + font-size: 22.7337px; + color: #000000; + font-size: clamp(1.5rem, 1.5dvw, 2rem); + padding: 17px 48px; +} + +/* CSS */ +.downloadbutton1 { + width: 170px; + height: 45px; + background-color: #37943C; + font-family: Gilroy; + color: #fff; + font-style: normal; + font-weight: 500; + font-size: 14px; + border-radius: 8px; + display: flex; + letter-spacing: 0.5px; + justify-content: space-between; + align-items: center; + z-index: 2; + margin-top: 1rem; + + padding: 1rem; + border: none; +} +.ancharTag{ + text-decoration: none; + color: #000; +} +.tryIt{ + text-decoration: none; + color:#fff; +} +@media screen and (max-width: 980px) { + .DS-subcontainer { + flex-direction: column; + } +} + + + +@media screen and (max-width: 550px) { + .DS-subcontainer { + flex-direction: column; + } + .downloadtext1 { + font-size: clamp(1rem, 1.5dvw, 6rem); + width: 100%; + } + .left-container{ + padding: 0; + } + + .resupgrading{ + width: 80%; + } + .Hide-on-smallScreen{ + display: none !important; + } + .overview-downloads-grp{ + font-size: 13px; + font-weight: 600; + width: max-content !important; + } + .contactimg1{ + display: none; + } + .downloadSource-container{ + padding: 0rem 1rem; + } + .downloadsourcestext { + font-style: normal; + font-weight: 500; + font-size: 22.7337px; + color: #000000; + font-size: clamp(1rem, 1.5dvw, 2rem); + padding: 17px 14px; + } + .downloadssrc{ + display: flex; + /* flex-wrap: wrap; */ + justify-content: flex-start; + row-gap: 1rem; + column-gap: 1rem; + margin: 0px 0px; + } + .downloadsources1 .overview-downloads-grp{ + padding: 0.4rem 0.5rem !important; + } + +} + +.overview-downloads-grp{ + width: max-content !important; + font-size: 13px; + font-weight: 600; + padding:0.4rem 1rem +} +.downloadssrc{ + display: flex; + /* flex-wrap: wrap; */ + justify-content: flex-start; + row-gap: 1rem; + column-gap: 1rem; + margin: 0px 10px; +} diff --git a/src/styles/template/overView/overView1.scss b/src/styles/template/overView/overView1.scss new file mode 100644 index 0000000..309dd5c --- /dev/null +++ b/src/styles/template/overView/overView1.scss @@ -0,0 +1,372 @@ +// .Overview1ImageDiv +// { +// width: 31vw; +// } +// .Overview1ImagePreview +// { +// width: 22vw; +// position: relative; +// right: 50%; +// } +//dhana +.Overview1ImagePreview +{ + width: 100%; + position: relative; +} + +.Overview1ImageDiv { + position: absolute; + z-index: 0; + top: 15%; + width: 50%; + right: 0%; +} +//dhana + +// .Overview1ImageDiv +// { +// position: absolute; +// z-index: 0; +// top: 10.6%; +// width: 68vw; +// right: -6%; +// } + +.overviewmaindiv { + display: flex; + flex-wrap: wrap; + flex-direction: column; +} + +.overviewmainDIV{ + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.overviewsubdiv { + display: flex; + // flex-wrap: wrap; + flex-direction: row; + gap: 0.5rem; +} +.overview1subdiv { + display: flex; + flex-wrap: wrap; + flex-direction: column; + gap: 1.6rem; + // pointer-events: none; + flex-grow: 1; + padding: 0px 50px; + justify-content: center; +} +// .overview1subdiv { +// display: flex; +// flex-wrap: wrap; +// flex-direction: column; +// gap: 1.6rem; +// // pointer-events: none; +// flex-grow: 1; +// padding: 0px 60px; +// } +.overview1subdivdata { + display: flex; + flex-wrap: wrap; + flex-direction: column; + // gap: 0.5rem; + // pointer-events: none; + padding: 3.5rem 0; +} + +// .overview1subdivdata { +// display: flex; +// flex-wrap: wrap; +// flex-direction: column; +// padding: 3.5rem 0; +// } + +.overviewmain { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.overviewmainmodal { + display: flex; + flex-wrap: wrap; + flex-direction: row; + justify-content: space-between; +} + +.overviewImg p { + color: deepskyblue; +} + +.overviewbtn { + display: flex; + justify-content: flex-end; +} + +.empTitleData { + background-color: #929292; + color: #333; + border: 0; + height: 10px; + width: 180px; +} +.empSubTitleData { + background-color: #cccccc; + color: #333; + border: 0; + height: 10px; + width: 80px; +} + +.empButtonTextData { + background-color: #f97068; + color: #333; + border: 0; + height: 20px; + width: 100px; +} +.empLinkData { + background-color: #cccccc; + color: #333; + border: 0; + height: 10px; + width: 30px; + display: flex; +} + +.overviewpreTitleData { + // width: min(45vw,36vw); + font-size: max(2.8rem, 2.5dvw); + font-weight: 600; + color: #000; + // line-height: 1.5; +} + +.preSubTitleData { + font-style: normal; + font-weight: 400; + font-size: max(0.8rem, 1.3dvw); + color: #2e2e2e; + width: min(47vw, 437px); +} + +.preLinkData { + width: min(60vw, 165px); + box-shadow: 0 4px 15px #0000001a; + border-radius: 10px; + border: 0px; + background: rgba(255, 255, 255, 0.5); + display: flex; + align-items: center; + column-gap: 0.5rem; + padding: 7px 18px; + font-size: 0.8rem; + border: 1px solid rgba(0, 0, 0, 0.048); + transition-duration: 0.6s; + cursor: pointer; +} + +.overviewNodata { + align-items: center; + font-size: 20px; + display: flex; + flex-wrap: wrap; + flex-direction: column; + gap: 1rem; +} + +.preButtonTextData { + width: 230px; + height: 45px; + color: #fff; + font-style: normal; + font-weight: 500; + font-size: 14px; + border-radius: 8px; + display: flex; + letter-spacing: 0.5px; + justify-content: space-between; + align-items: center; + border: none; + z-index: 2; +} + +.preButtonTextData { + // border: 1px solid; + overflow: hidden; + span { + z-index: 20; + } + + &:after { + background: #fff; + content: ""; + height: 155px; + left: -75px; + opacity: 0.2; + position: absolute; + top: -50px; + transform: rotate(35deg); + transition: all 550ms cubic-bezier(0.19, 1, 0.22, 1); + width: 50px; + z-index: -10; + } +} + +.preButtonTextData:hover { + &:after { + left: 120%; + transition: all 550ms cubic-bezier(0.19, 1, 0.22, 1); + } +} + +.preButtonTextData:focus { + // border:1.8px solid var(--PRIMARY_BUTTON_BG_COLOR); + background-color: #ffffff !important; + // color: #901D77; + font-weight: 600; + font-size: 14px; +} + +.preButtonTextData:focus:hover { + // border:1.8px solid var(--PRIMARY_BUTTON_BG_COLOR); + background-color: white !important; + // color: var(--PRIMARY_BUTTON_BG_COLOR); + font-weight: 600; + font-size: 14px; +} + +.RightsectionDiv { + width: 50%; + // margin: auto; + flex-grow: 1; +} + +@media screen and (max-width: 900px) { + .preBannerImageData { + display: none; + } + + .RightsectionDiv { + display: none; + } + + .overviewpreTitleData { + font-weight: 600; + font-size: 20px; + // width: 88vw; + } + .overview1subdiv { + padding: 10px 26px; + } + .overviewsubdiv{ + flex-wrap: wrap ; + } +} + +.preAppLinkTextData { + font-size: 12px; +} + +@media screen and (max-width: 499px) { + .Hide-on-smallScreen1 { + display: none !important; + } + .preLinkData { + width: max-content !important; + } + .overview1subdiv { + padding: 0px 26px; + } +} + + + + + + +.gradient-header { + color: #000000; + background-image: -webkit-linear-gradient(9deg, #000000, #4454b1); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + -webkit-animation: hue 3s infinite linear; +} + +@-webkit-keyframes hue { + from { + -webkit-filter: hue-rotate(0deg); + } + to { + -webkit-filter: hue-rotate(-360deg); + } +} + + + + +.btn-shine { + color: #000000; + font-weight: 500; + // background: linear-gradient(to right, #4d4d4d 0, #fff 10%, #4d4d4d 20%); + // background: linear-gradient(to right, #000000 0, #fff 10%, #000000 20%); + background-position: 0; + // -webkit-background-clip: text; + // -webkit-text-fill-color: transparent; + // animation: shine 8s infinite linear; + // animation-fill-mode: forwards; + // -webkit-text-size-adjust: none; + // font-weight: 600; + text-decoration: none; + z-index: 1; +} +@-moz-keyframes shine { + 0% { + background-position: 0; + } + 60% { + background-position: 180px; + } + 100% { + background-position: 180px; + } +} +@-webkit-keyframes shine { + 0% { + background-position: 0; + } + 60% { + background-position: 180px; + } + 100% { + background-position: 180px; + } +} +@-o-keyframes shine { + 0% { + background-position: 0; + } + 60% { + background-position: 180px; + } + 100% { + background-position: 180px; + } +} +@keyframes shine { + 0% { + background-position: 0; + } + 60% { + background-position: 780px; + } + 100% { + background-position: 1200px; + } +} diff --git a/src/styles/template/overView/overView2.scss b/src/styles/template/overView/overView2.scss new file mode 100644 index 0000000..37c710b --- /dev/null +++ b/src/styles/template/overView/overView2.scss @@ -0,0 +1,284 @@ + +.overview2maindiv{ + display:flex; + flex-wrap: wrap; + flex-direction: column; +} + +.overview2subdiv{ + display:flex; + flex-wrap: wrap; + flex-direction: row; + gap:0.5rem; +} + +.overview2subdiv2{ + display:flex; + flex-wrap: wrap; + flex-direction: column; + gap: 0.5rem; + // pointer-events: none; + position: absolute; + z-index: 1; + width: 100%; + height: 95%; + +} + +.overview2subdivwithout{ + display:flex; + flex-wrap: wrap; + flex-direction: column; + gap: 0.5rem; + // pointer-events: none; + // position: absolute; + z-index: 1; + + +} + +.overview2subdivdata{ + display:flex; + flex-wrap: wrap; + flex-direction: column; + gap: 2rem; + // pointer-events: none; + flex-grow: 1; + // padding: 54px 26px; + justify-content: center; + align-items: center; +} + +.overview2main{ + display:flex; + flex-wrap: wrap; + flex-direction: row; + justify-content: space-between; +} + +.overview2main2{ + display:flex; + flex-direction: row; + justify-content: space-between; + +} + +.overview2Img p{ + color:deepskyblue; +} + +.overview2SubImg{ + display:flex; + flex-wrap: wrap; + flex-direction: row; + gap:2rem; +} + +.overview2btn{ + display:flex; + justify-content:flex-end; +} + +.ant-form input[type="file"] { + display: none; +} + +.emp2TitleData{ + background-color: #929292; + color:#333; + border:0; + height:10px; + width:180px; +} + +.emp2SubTitleData{ + background-color: #CCCCCC; + color:#333; + border:0; + height:10px; + width:80px; +} + +.emp2ButtonTextData{ + background-color: #F97068; + color:#333; + border:0; + height:20px; + width:100px; +} + +.emp2LinkData{ + background-color: #CCCCCC; + color:#333; + border:0; + height:10px; + width:30px; + display:flex; +} + +.pre2TitleData{ + width: 66vw; + font-style: normal; + font-weight: 600; + font-size: max(1rem, 2.5dvw); + color: #000; + text-shadow: 2px 1px 1px #0c0c0c; + text-align: center; + line-height: 1.5; + // width: 80vw; + // font-style: normal; + // font-weight: 500; + // font-size: max(1rem, 2.5dvw); + // color: #000; + // text-align: center; + // line-height: 1.5; +} + +.pre2SubTitleData{ + font-style: normal; + font-weight: 400; + font-size: max(0.8rem,1.3dvw); + color: #2e2e2e; + width: min(55vw,800px); + text-align: center; +} + +.pre2LinkData{ + width: min(60vw,155px); + box-shadow: 0 4px 15px #0000001a; + border-radius: 10px; + border: 0px; + background: rgba(255,255,255,.5); + display: flex; + align-items: center; + column-gap: 0.5rem; + padding: 4px 18px; + font-size: .8rem; + border: 1px solid rgba(0,0,0,.048); + transition-duration: .6s; + cursor: pointer; +} + +.background-video-container { + position: relative; + width: 100%; + height: 100vh; /* Adjust to your preferred height */ + overflow: hidden; +} + +.background-video-container1 { + width: min(90vw,321px); + height: 231px; + background-color: #e3e1e1; +} + +.background-video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} + +.overviewNodata{ + align-items: center; + font-size: 20px; + display: flex; + flex-wrap: wrap; + flex-direction: column; + gap:1rem; +} + + +// @media screen and (max-width:450px) { +// .pre2BannerImageData{ +// display: none; + +// } +// } + +.RightsectionDiv2{ + width: 50%; + margin: auto; + flex-grow: 1; +} + + +@media screen and (max-width:900px) { + .pre2BannerImageData{ + display: none; + + } + + .RightsectionDiv2{ + display: none; + } + + .pre2TitleData{ + font-weight: 600; + font-size:20px; + width: 88vw; + } + + +} + + +.btn-shine1 { + color: #000000; + // background: linear-gradient(to right, #4d4d4d 0, #fff 10%, #4d4d4d 20%); + // background: linear-gradient(to right, #969696 0, #4b4b4b 10%, #ffffff 20%); + // background-position: 0; + // -webkit-background-clip: text; + // -webkit-text-fill-color: transparent; + // animation: shine 8s infinite linear; + // animation-fill-mode: forwards; + // -webkit-text-size-adjust: none; + // font-weight: 600; + // text-decoration: none; +} +@-moz-keyframes shine { + 0% { + background-position: 0; + } + 60% { + background-position: 180px; + } + 100% { + background-position: 180px; + } +} +@-webkit-keyframes shine { + 0% { + background-position: 0; + } + 60% { + background-position: 180px; + } + 100% { + background-position: 180px; + } +} +@-o-keyframes shine { + 0% { + background-position: 0; + } + 60% { + background-position: 180px; + } + 100% { + background-position: 180px; + } +} +@keyframes shine { + 0% { + background-position: 0; + } + 60% { + background-position: 780px; + } + 100% { + background-position: 1200px; + } +} diff --git a/src/styles/template/template/template.css b/src/styles/template/template/template.css new file mode 100644 index 0000000..231383a --- /dev/null +++ b/src/styles/template/template/template.css @@ -0,0 +1,22 @@ + +.appcontent{ + height: 100vh; + overflow:auto; +} +.navBarHover .dispflex { + background-color: white !important; + justify-content: space-between; + padding: 0px 2rem; +} + +.navBarHover { + z-index: 999; +} + + + +@media screen and (max-width: 900px) { + .homeNavdiv{ + display:none; + } +} \ No newline at end of file diff --git a/src/styles/testimonials/Testimonials.scss b/src/styles/testimonials/Testimonials.scss new file mode 100644 index 0000000..553b179 --- /dev/null +++ b/src/styles/testimonials/Testimonials.scss @@ -0,0 +1,21 @@ +.uder-details-tesimonial{ + display: flex; + align-items: flex-start; + width: 100%; + gap: 2rem; + font-family: "Gilroy" !important; + >div:nth-child(2){ + font-weight: 500; + font-size: 16px; + width: 600px; + padding: 6px 4px; + + } + >div:nth-child(1){ + padding: 2px 25px; + font-weight: 500; + width: 140px; + font-size: 16px; + + } +} \ No newline at end of file diff --git a/src/styles/testimonials/TestimonialsPublic.scss b/src/styles/testimonials/TestimonialsPublic.scss new file mode 100644 index 0000000..ee77a36 --- /dev/null +++ b/src/styles/testimonials/TestimonialsPublic.scss @@ -0,0 +1,344 @@ +.PozoTestimonial-Master { + width: 100vw; + height: 100vh; + overflow: scroll; + font-family: "Poppins" !important; + background-color: #f0f9ff; + + .PozoTestimonial-Navbar { + position: sticky !important; + top: 0px !important; + width: 100%; + z-index: 999; + padding: 1rem; + background-color: #fff; + display: flex; + align-items: center; + justify-content: flex-start; + svg { + font-size: 35px; + border: 1px solid #000; + padding: 6px; + border-radius: 10pc; + cursor: pointer; + transition: all 0.2s; + &:hover { + background-color: #000; + color: #fff; + } + } + } + + .PozoTestimonial-main { + padding: 1rem 2rem 1rem 2rem; + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + font-family: "Poppins" !important; + } + + .PozoTestimonial-header { + font-size: 32px; + margin: 10px 10px; + font-weight: 500; + text-align: center; + } + + .PozoTestimonial-Subheader { + font-size: 18px; + font-weight: 400; + word-spacing: 3px; + letter-spacing: 0.5px; + + span { + font-size: 18px; + font-weight: 700; + letter-spacing: 1.5px; + } + } + + .CustomerStories-main { + width: 100%; + display: flex; + flex-wrap: wrap; + padding: 3rem 0rem; + gap: 1rem; + justify-content: flex-start; + z-index: 0; + } + + .CustomerStories { + width: 25vw; + height: 500px; + box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px; + border-radius: 12px; + display: flex; + align-items: center; + flex-direction: column; + background-color: #fff; + overflow: hidden; + + &:hover { + .CustomerStories-image { + overflow: hidden; + + img { + transform: scale(1.04); + transition: transform 0.3s ease-in-out; + } + } + } + } + + .CustomerStories-image { + img { + transition: transform 0.5s ease-in-out; + + &:hover { + transform: scale(1.04); + } + } + } + + .playicon-testimonial { + transition: transform 0.3s ease-in-out; + } + + .CustomerStories-image:hover .playicon-testimonial { + transform: scale(1.35); + color: #fff; + } + + .CustomerStories-image { + width: 100%; + position: relative; + } + + .CustomerStories-image { + width: 100%; + + img { + width: 100%; + border-top-left-radius: 12px; + border-top-right-radius: 12px; + height: 220px; + object-fit: scale-down; + filter: brightness(0.9); + } + } + + .playicon-testimonial { + // color: rgba(255, 255, 255, 0.678); + color: #fff; + position: absolute; + left: 0; + font-size: 52px; + width: 100%; + top: 5.5rem; + cursor: pointer; + } + + .CustomerStories-shopDetails { + display: flex; + width: 100%; + align-items: center; + justify-content: flex-start; + gap: 1rem; + padding: 4px 10px; + } + + .shopDetails-logo { + width: 80px; + height: 80px; + display: flex; + align-items: center; + justify-content: center; + + img { + width: 70%; + object-fit: cover; + } + } + + .AllDetailsOfShop-main { + display: flex; + flex-direction: column; + gap: 3px; + align-items: flex-start; + text-align: left; + } + + .testimonial-adminName { + font-size: 22px; + font-weight: 600; + letter-spacing: 1px; + } + + .testimonial-ShopName { + font-size: 11px; + font-weight: 500; + letter-spacing: 0.5px; + text-transform: uppercase; + white-space: nowrap; + overflow: hidden; + width: 100%; + text-overflow: ellipsis; + } + + .testimonial-AdminDestionation { + font-size: 10px; + font-weight: 500; + letter-spacing: 0.5px; + color: #e33333; + text-transform: uppercase; + } + + .customer-reviewStores { + padding: 5px 26px; + + .reviewStores-div { + font-size: 12px; + text-align: left; + width: 98%; + font-weight: 400; + word-spacing: 2px; + letter-spacing: 0.3px; + font-family: "Poppins"; + line-height: 1.6; + height: 150px; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 8; + text-overflow: ellipsis; + } + + p { + color: #1292ee; + cursor: pointer; + font-size: 14px; + padding: 4px 0; + } + } + + .ant-modal-content { + .reviewStores-div { + font-size: 12px; + text-align: left; + width: 98%; + font-weight: 400; + word-spacing: 2px; + letter-spacing: 0.3px; + font-family: "Poppins"; + line-height: 1.6; + height: 130px; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 8; + text-overflow: ellipsis; + } + } + + .PozoTestimonial-Thnx { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + padding: 3rem 2rem; + background-color: rgb(217 217 217 / 10%); + gap: 1rem; + } + + .thnx-header { + font-size: clamp(24px, 4vw, 32px); + font-weight: 500; + text-align: center; + } + + .thnx-content { + width: 70%; + text-align: center; + font-size: 14px; + font-weight: 400; + } + + .btnof-newVideo { + width: max-content; + padding: 10px 22px; + background-color: #292929; + display: flex; + align-items: center; + justify-content: space-between; + gap: 2rem; + color: #fff; + border-radius: 50px; + cursor: pointer; + font-size: 15px; + font-weight: 500; + } +} +.reviewModal-testimonial { + .ant-modal-body { + font-size: 14px !important; + font-family: "poppins" !important; + } +} + +@media (max-width: 768px) { + .CustomerStories-main { + display: grid !important; + grid-template-columns: repeat(2, 1fr); + } + + .CustomerStories { + width: 100% !important; + } + + .CustomerStories-story { + width: 95vw !important; + } +} + +@media (max-width: 499px) { + .CustomerStories-main { + display: grid !important; + grid-template-columns: repeat(1, 1fr); + } + + .CustomerStories { + width: 100% !important; + } + + .CustomerStories-image img { + height: 210px !important; + } + + .PozoTestimonial-header { + font-size: clamp(22px, 3vw, 32px) !important; + } + + .PozoTestimonial-Subheader { + font-size: clamp(13px, 3vw, 18px) !important; + margin-top: -9px; + } + + .TrustedCustomer-title { + font-size: clamp(12px, 2vw, 16px); + padding: 5px 0; + } + + .CustomerStories-story { + width: 93vw !important; + } + + .thnx-content { + width: 80% !important; + text-align: center; + font-size: 10px !important; + font-weight: 400; + margin-top: -7px; + } +} diff --git a/src/styles/user/userForm.scss b/src/styles/user/userForm.scss new file mode 100644 index 0000000..e86523f --- /dev/null +++ b/src/styles/user/userForm.scss @@ -0,0 +1,48 @@ +// .userPage { +// height: 100%; +// width: 100%; +// padding: 0px max(10px, 9vw); +// overflow: auto; +// } + +// .userPageContent { +// height: 100%; +// width: 100%; + +// } + +// .formDiv { +// display: flex; +// flex-wrap: wrap; +// column-gap: 3rem; +// padding-top: 2rem; +// row-gap: 1.5rem; +// } + +// .formdes { +// font-style: normal; +// color: var(--PARA_COLOR); +// font-family: var(--PARA_FONT_FAMILY); +// font-size: 2.1vh; + +// } +// .submitButton { +// display: flex; +// flex-grow: 1; +// justify-content: flex-end; +// } + + +.busi-desc { + + .label { + background-color: #fff !important; + width: 80% !important; + } + .label-float{ + top: 1px !important; + } + textarea{ + scrollbar-width: thin; + } +} \ No newline at end of file diff --git a/src/styles/userAccount/userAccount.scss b/src/styles/userAccount/userAccount.scss new file mode 100644 index 0000000..f452fbe --- /dev/null +++ b/src/styles/userAccount/userAccount.scss @@ -0,0 +1,225 @@ +.userAccount { + margin: min(2.5rem, 5dvw); + background-color: white; + display: flex; + flex-grow: 1; + border-radius: var(--BORDER_RADIUS); +} + +.optionSection { + width: 25%; + border-radius: var(--BORDER_RADIUS); + border-right: solid 0.5px #C9C9C9; + // background-color: yellow; + display: flex; + flex-direction: column; + text-align: center; + padding: 0px 10px; + + & .userAccountHeading { + padding: 1rem 0px; + font-weight: 600; + font-size: 1.4rem; + font-family: var(--HEADING_FONT_FAMILY); + height: 100px; + } + + & .userAccountTab { + font-size: 0.9rem; + font-weight: 500; + padding: 0.5rem 0px; + width: 100%; + font-family: var(--HEADING_FONT_FAMILY); + cursor: pointer; + } + + & .userAccountTab:hover { + background-color: #F4EAF2; + color: #901D77; + } +} + + +.userAccountCont { + padding: max(2px, 0.7dvw); + width: 100%; + overflow-y: auto; +} + +.userAccountSec { + padding: max(2px, 0.7dvw); + width: 100%; + height: 100%; + overflow-y: auto; + +} + +.securityContentPage { + display: flex; + flex-wrap: wrap; + width: 100%; + overflow-y: auto; + column-gap: 2rem; + row-gap: 2rem; + + & .userPage { + padding: 0; + + } + + & .pageOverAllUser { + flex-grow: 1; + height: fit-content; + border-radius: var(--CARD_BORDER_RADIUS); + border: solid 0.5px #A9ACAA; + row-gap: 2rem; + } + + // & .formedit{ + // display: flex; + // // width: 100%; + // flex-grow: 1; + // } + + & .formDiv { + justify-content: center; + align-items: center; + } + + & .formDivAnt { + flex-direction: column; + } + + & .inputForm { + flex-direction: column; + } + +} + +.myProfileHeading { + font-weight: 600; + font-size: 1.4rem; + padding-bottom: 2rem; + font-family: var(--HEADING_FONT_FAMILY); +} + + +.showData { + border: solid 1px #A9ACAA; + border-radius: var(--CARD_BORDER_RADIUS); + display: flex; + flex-wrap: wrap; + padding: 1rem; + margin: 1rem 0px; + column-gap: min(0rem, 4dvw); + row-gap: 2rem; + justify-content: space-around; + + & .heading { + color: #818181; + } + + & .userAccountField { + text-align: center; + margin: auto 0px; + } + + & .userAccountButton { + margin: auto 0px; + + & button { + background-color: white; + border: solid 1px #A9ACAA; + padding: .5rem; + } + } + +} + +.editData { + border: solid 1px #A9ACAA; + border-radius: var(--CARD_BORDER_RADIUS); + display: flex; + flex-wrap: wrap; + padding: 1rem; + margin: 1rem 0px; + // column-gap: 1rem; + row-gap: 2rem; +} + +.backClassUser { + display: flex; + justify-content: flex-end; + flex-grow: 1; + color: #004BA9; +} + +.profileImage { + width: max(200px, 20%); + ; + border-radius: 50%; + // border: solid 1px black +} + +.mobileViewClose { + display: none; + text-align: right; + padding-right: 1rem; + padding-top: 1rem; +} + +.menuIcon { + display: none; + padding-top: 0.5rem; + padding-left: 0.5rem; + font-size: 20px; +} + +@media screen and (max-width: 450px) { + .optionSection { + width: 100%; + font-size: 30px; + + & .userAccountHeading { + font-size: 8dvw; + font-weight: 700; + } + + & .userAccountTab { + font-size: 6dvw; + } + } + + .userSectionClose { + display: none; + } + + .userSectionOpen { + display: block; + } + + .mobileViewClose { + display: block; + } + + .showData { + justify-content: center; + } + + .menuIcon { + display: block; + } +} + + +.userAccountTabDiv { + display: flex; + flex-direction: column; + text-align: left; + margin-left: 1rem; + + // display: flex; + // flex-direction: column; + // text-align: center; + +} \ No newline at end of file diff --git a/src/styles/versionManagement/versionManagement.scss b/src/styles/versionManagement/versionManagement.scss new file mode 100644 index 0000000..5f48700 --- /dev/null +++ b/src/styles/versionManagement/versionManagement.scss @@ -0,0 +1,41 @@ +.versionManagementDropDown{ + .ant-select-single { + width: 110px !important; + } +} + + + +.versionMangement { + overflow: auto; + width: 80vw; + //Sridhar + height: 60vh !important; + // +} +.versionMangement{ + & .ant-checkbox .ant-checkbox-inner:after{ + background: black; + display: inline; + } +} + +.versionMangement { + .ant-table-thead { + position: sticky; + top: 0; + background-color: #f3f3f3; + z-index: 1; + } +} + + + + .versionMangement{ + .ant-pagination{ + position: sticky; + bottom: 0; + margin: 0 !important; + padding: 0.5rem; + background-color: #fafafa; +}} \ No newline at end of file diff --git a/src/theme/pozo.css b/src/theme/pozo.css new file mode 100644 index 0000000..d56488d --- /dev/null +++ b/src/theme/pozo.css @@ -0,0 +1,160 @@ +/* Optional: Inter font — comment out if you prefer system font only */ +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"); + +/* --------- CSS Variables --------- */ +:root { + --bg: #ffffff; + --surface: #f8fafc; /* subtle panel bg */ + --text: #111827; /* slate-900 */ + --muted: #64748b; /* slate-500 */ + --border: #e5e7eb; /* slate-200 */ + --primary: #111827; /* minimal dark primary */ + --primary-contrast: #ffffff; + --radius: 10px; + --shadow: 0 10px 30px rgba(0,0,0,0.08); +} + +/* --------- Global / Typography --------- */ +html, body { + background: var(--bg); + color: var(--text); + font-family: Inter, system-ui, -apple-system, Segoe UI, Roboto, "Helvetica Neue", Arial, "Noto Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif; + line-height: 1.6; +} + +/* h1, h2, h3 { + margin: 0.4rem 0 0.6rem; + font-weight: 700; +} +h1 { font-size: 1.75rem; } +h2 { font-size: 1.25rem; } +h3 { font-size: 1.1rem; } */ + +small, .muted { color: var(--muted); } + +/* --------- Layout helpers --------- */ +.container { + max-width: 1200px; + margin: 16px auto; + padding: 0 16px; +} +.grid { + display: grid; + gap: 16px; +} +.two-pane { + grid-template-columns: 320px 1fr; +} +@media (max-width: 980px) { + .two-pane { grid-template-columns: 1fr; } +} + +/* --------- Header / Toolbar --------- */ +.toolbar { + position: sticky; + top: 0; + z-index: 20; + background: var(--bg); + border-bottom: 1px solid var(--border); + padding: 10px 16px; + display: flex; + gap: 12px; + align-items: center; +} +.toolbar .title-input { + flex: 1; + border: none; + outline: none; + font-size: 20px; + font-weight: 700; + background: transparent; +} + +/* --------- Cards / Panels --------- */ +.card { + background: var(--bg); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 12px; +} +.panel { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 12px; +} + +/* --------- Inputs --------- */ +.input, .textarea, .select { + width: 100%; + padding: 8px 10px; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--bg); + color: var(--text); +} +.textarea { min-height: 90px; } +.input:focus, .textarea:focus, .select:focus { + outline: 2px solid #cbd5e1; /* light focus ring */ + outline-offset: 2px; +} + +/* --------- Buttons --------- */ +.btn { + padding: 8px 12px; + border-radius: 10px; + border: 1px solid var(--border); + background: var(--bg); + color: var(--text); + transition: background 120ms ease, transform 80ms ease, border-color 120ms ease; +} +.btn:hover { background: #f3f4f6; } +.btn:active { transform: translateY(1px); } + +.btn-primary { + background: var(--primary); + color: var(--primary-contrast); + border-color: var(--primary); +} +.btn-primary:hover { filter: brightness(1.08); } +.btn-ghost { + background: transparent; + border-color: var(--border); +} +.btn-outline { + background: var(--bg); + border-color: var(--border); +} + +/* --------- Chips --------- */ +.chip { + display: inline-block; + padding: 2px 8px; + border-radius: 999px; + border: 1px solid var(--border); + font-size: 12px; + font-weight: 600; +} +.chip-success { background: #ecfdf5; border-color: #34d399; color: #065f46; } +.chip-neutral { background: #f1f5f9; border-color: var(--border); color: #334155; } + +/* --------- Toast --------- */ +.toast { + position: fixed; + right: 20px; + bottom: 20px; + z-index: 50; + background: #111827; + color: #fff; + padding: 10px 12px; + border-radius: 8px; + box-shadow: var(--shadow); + font-size: 14px; +} + +/* --------- Editor area safety --------- */ +#pozo-editor, #pozo-editor * { + pointer-events: auto !important; + user-select: text !important; +} +.preview-content img { display: block; max-width: 100%; height: auto; } \ No newline at end of file diff --git a/src/useVisitLogger.jsx b/src/useVisitLogger.jsx new file mode 100644 index 0000000..faad9b3 --- /dev/null +++ b/src/useVisitLogger.jsx @@ -0,0 +1,41 @@ +import { useEffect } from "react"; +import { useLocation } from "react-router-dom"; +import { getSession } from "./Services/others"; + +const useVisitLogger = (pricingData) => { + const location = useLocation(); + const UserId = getSession("UserId"); + const AppId = getSession("AppId"); + + useEffect(() => { + const stored = JSON.parse(localStorage.getItem("visitLogFormat") || "null"); + + const newVisit = { + VisitTime: new Date().toISOString(), + Location: location?.pathname + }; + + let updatedLog; + + if (stored) { + const oldVisits = Array.isArray(stored.LocationVistDtl) ? stored.LocationVistDtl : []; + + updatedLog = { + ...stored, + PricingId: pricingData?.PricingId || stored.PricingId || null, + LocationVistDtl: [...oldVisits, newVisit] + }; + } else { + updatedLog = { + UserId, + AppId, + PricingId: pricingData?.PricingId || null, + LocationVistDtl: [newVisit] + }; + } + + localStorage.setItem("visitLogFormat", JSON.stringify(updatedLog)); + }, [location, pricingData]); +}; + +export default useVisitLogger; diff --git a/src/utils/history.js b/src/utils/history.js new file mode 100644 index 0000000..af79e22 --- /dev/null +++ b/src/utils/history.js @@ -0,0 +1,27 @@ +const KEY = "pozo-editor-history"; + +export function loadHistory() { + try { + const raw = localStorage.getItem(KEY); + return raw ? JSON.parse(raw) : []; + } catch { + return []; + } +} + +export function addSnapshot(post) { + const hist = loadHistory(); + const snap = { + id: Date.now(), + slug: post.slug || "", + title: post.title || "", + featureImage: post.featureImage, + seoTitle: post.seoTitle || "", + seoDescription: post.seoDescription || "", + blocks: post.blocks, + ts: new Date().toISOString() + }; + hist.unshift(snap); + localStorage.setItem(KEY, JSON.stringify(hist.slice(0, 50))); // cap 50 + return snap; +} \ No newline at end of file diff --git a/src/utils/seo.js b/src/utils/seo.js new file mode 100644 index 0000000..da8f84b --- /dev/null +++ b/src/utils/seo.js @@ -0,0 +1,48 @@ +export const generateBlogSEO = (post) => ({ + title: `${post.title} | My Blog`, + description: post.excerpt, + keywords: post.tags.join(', '), + author: post.author, + publishedTime: post.date, + image: post.imageUrl, + url: `${window.location.origin}/blog/${post.id}` +}); + +export const generateBlogListSEO = () => ({ + title: 'My Blog - Latest Articles & Insights', + description: 'Discover the latest articles on web development, React, CSS, and modern programming techniques.', + keywords: 'blog, web development, React, CSS, JavaScript, programming', + url: `${window.location.origin}/blog` +}); + +export const generatePageSEO = (page) => ({ + title: `${page.title} | My Blog`, + description: page.description, + keywords: page.keywords || 'web development, blog', + url: `${window.location.origin}${page.path}` +}); + +export const generateHomeSEO = () => ({ + title: 'My Blog - Web Development & Programming', + description: 'Welcome to my blog featuring articles on web development, React, JavaScript, and modern programming.', + keywords: 'web development, React, JavaScript, programming, blog', + url: window.location.origin +}); + +export const updateMetaTags = (seoData) => { + document.title = seoData.title; + + const updateMeta = (name, content) => { + let meta = document.querySelector(`meta[name="${name}"]`); + if (!meta) { + meta = document.createElement('meta'); + meta.name = name; + document.head.appendChild(meta); + } + meta.content = content; + }; + + updateMeta('description', seoData.description); + updateMeta('keywords', seoData.keywords); + if (seoData.author) updateMeta('author', seoData.author); +}; \ No newline at end of file diff --git a/src/utils/storage.js b/src/utils/storage.js new file mode 100644 index 0000000..42b5834 --- /dev/null +++ b/src/utils/storage.js @@ -0,0 +1,18 @@ +const KEY = "pozo-editor-post"; + +export function loadPost() { + try { const raw = localStorage.getItem(KEY); return raw ? JSON.parse(raw) : null; } + catch { return null; } +} + +export function savePost(post) { + try { localStorage.setItem(KEY, JSON.stringify(post)); return true; } + catch (e) { console.error("Failed to save post", e); return false; } +} + +export function slugify(str) { + return (str || "").toLowerCase().trim() + .replace(/[^\w\s-]/g, "") + .replace(/\s+/g, "-") + .slice(0, 80); +} diff --git a/src/utils/textUtils.js b/src/utils/textUtils.js new file mode 100644 index 0000000..f532f57 --- /dev/null +++ b/src/utils/textUtils.js @@ -0,0 +1,25 @@ +export const slugify = (text) => { + return text + .toLowerCase() + .trim() + .replace(/[^\w\s-]/g, '') + .replace(/[\s_-]+/g, '-') + .replace(/^-+|-+$/g, ''); +}; + +export const countWordsFromBlocks = (blocks) => { + if (!blocks) return 0; + + return blocks?.reduce((count, block) => { + if (block.data && block.data.text) { + const text = block.data.text.replace(/<[^>]*>/g, ''); // Remove HTML tags + return count + text.split(/\s+/).filter(word => word.length > 0).length; + } + return count; + }, 0); +}; + +export const minutesRead = (wordCount) => { + const wordsPerMinute = 200; + return Math.ceil(wordCount / wordsPerMinute); +}; \ No newline at end of file diff --git a/src/utils/utils.js b/src/utils/utils.js new file mode 100644 index 0000000..fb63ffa --- /dev/null +++ b/src/utils/utils.js @@ -0,0 +1,5 @@ +export const getCookie = (name) => { + const value = `; ${document.cookie}`; + const parts = value.split(`; ${name}=`); + if (parts.length === 2) return parts.pop().split(';').shift(); +}; \ No newline at end of file diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..291da17 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,105 @@ +// import { defineConfig } from "vite"; +// import react from "@vitejs/plugin-react"; +// import sitemap from "vite-plugin-sitemap"; + +// export default defineConfig(({ mode }) => { +// const isProd = mode === "production"; + +// return { +// plugins: [ +// react(), +// isProd && +// sitemap({ +// hostname: "https://pozo.app", +// routes: ["/", "/signin", "/signup", "/dashboard", "/features", "/pricing", "/contact-us", "/blog"], +// }), +// ], +// base: "/home/", +// envDir: "src", +// envPrefix: "ENV_", +// build: { +// chunkSizeWarningLimit: 1000, +// rollupOptions: { +// output: { +// manualChunks: { +// vendor: ['react', 'react-dom'], +// editor: ['@editorjs/editorjs', '@editorjs/header', '@editorjs/image', '@editorjs/list', '@editorjs/paragraph', '@editorjs/code', '@editorjs/embed', '@editorjs/link', '@editorjs/quote'] +// } +// } +// } +// }, +// server: { +// host: "192.168.1.68", +// port: process.env.PORT || 3000, +// }, +// optimizeDeps: { +// exclude: ["console.log"], +// include: [ +// "@editorjs/editorjs", +// "@editorjs/header", +// "@editorjs/image", +// "@editorjs/list", +// "@editorjs/paragraph", +// "@editorjs/code", +// "@editorjs/embed", +// "@editorjs/link", +// "@editorjs/quote", +// ], +// }, +// }; +// }); + + +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import { terser } from "rollup-plugin-terser"; +// https://vitejs.dev/config/ +export default defineConfig(({ command, mode, ssrBuild }) => { + if (mode == "production") { + return { + plugins: [ + react(), + // terser({ // Add terser plugin for production + // compress: { + // drop_console: true, // This removes all console.* statements + // }, + // }), + ], + base: "/home/", + envDir: "src", + envPrefix: "ENV_", + }; + } else { + return { + plugins: [react()], + envDir: "src", + envPrefix: "ENV_", + + server: { + host: "192.168.1.26", + port: process.env.PORT || 3001, + }, + optimizeDeps: { + exclude: ["console.log"], + + include: [ + '@editorjs/editorjs', + '@editorjs/header', + '@editorjs/image', + '@editorjs/delimiter', + '@editorjs/list', + '@editorjs/paragraph' + ] + + }, + }; + } +}); + +// export default defineConfig({ +// plugins: [react()], +// server: { +// host: '192.168.1.17', +// port: process.env.PORT || 3000, +// }, +// });