+ //
+
+
+
+
+
+
+ //
);
};
diff --git a/src/pages/Gallary/ImagePop.jsx b/src/pages/Gallary/ImagePop.jsx
index 55a079df..52bee8cd 100644
--- a/src/pages/Gallary/ImagePop.jsx
+++ b/src/pages/Gallary/ImagePop.jsx
@@ -2,7 +2,7 @@ import React, { useState, useEffect } from "react";
import "./ImagePop.css";
import { useModal } from "./ModalContext";
import moment from "moment";
-import {formatUTCToLocalTime} from "../../utils/dateUtils";
+import { formatUTCToLocalTime } from "../../utils/dateUtils";
const ImagePop = ({ batch, initialIndex = 0 }) => {
const { closeModal } = useModal();
@@ -27,12 +27,12 @@ const ImagePop = ({ batch, initialIndex = 0 }) => {
image.uploadedBy?.lastName || ""
}`.trim();
const date = formatUTCToLocalTime(image.uploadedAt);
-
+
// Location and category details from the 'batch' object (as previously corrected)
const buildingName = batch.buildingName;
const floorName = batch.floorName;
const workAreaName = batch.workAreaName;
- const activityName = batch.activityName;
+ const activityName = batch.activityName;
const batchComment = batch.comment;
// Handler for navigating to the previous image
@@ -54,38 +54,58 @@ const ImagePop = ({ batch, initialIndex = 0 }) => {
return (
-
-
+
{hasPrev && (
)}
-
-

-
+
+

+
{hasNext && (
)}
-
-
Uploaded By : {fullName}
-
Date : {date}
-
Uploaded By : {buildingName} {floorName}
- {workAreaName || "Unknown"} {activityName}
-
comment : {batchComment}
-
-
+
+ {" "}
+ {" "}
+ Uploaded By : {" "}
+ {fullName}
+
+
+ {" "}
+ {" "}
+ Date : {" "}
+ {date}
+
+
+ {" "}
+ {" "}
+ Uploaded By : {" "}
+
+ {buildingName} {floorName}{" "}
+
+ {workAreaName || "Unknown"}{" "}
+ {activityName}
+
+
+
+ {" "}
+ {" "}
+ comment : {" "}
+ {batchComment}
+
);
};
-export default ImagePop;
\ No newline at end of file
+export default ImagePop;
diff --git a/src/pages/Home/LandingPage.css b/src/pages/Home/LandingPage.css
new file mode 100644
index 00000000..70b8e283
--- /dev/null
+++ b/src/pages/Home/LandingPage.css
@@ -0,0 +1,649 @@
+.section-py {
+ padding: 6.25rem 0;
+}
+@media (max-width: 1199.98px) {
+ .section-py {
+ padding: 4rem 0;
+ }
+}
+@media (max-width: 767.98px) {
+ .section-py {
+ padding: 3rem 0;
+ }
+}
+
+.first-section-pt {
+ padding-top: 11.28rem;
+}
+@media (max-width: 1199.98px) {
+ .first-section-pt {
+ padding-top: 7.5rem;
+ }
+}
+
+.card[class*="card-hover-border-"] {
+ transition: all 0.2s ease-in-out;
+}
+
+.banner-bg-img {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ object-fit: cover;
+ object-position: left;
+}
+
+.section-title-img {
+ height: 100%;
+ width: 120%;
+ inset-inline-start: -12%;
+ top: 10px;
+}
+
+/* .light-style body {
+ background-color: #fff;
+} */
+
+.dark-style body {
+ background-color: #2b2c40;
+}
+
+nav.layout-navbar {
+ /* backdrop-filter: unset; */
+ /* background-color: transparent !important; */
+}
+
+nav.layout-navbar::before {
+ position: absolute;
+ display: block;
+ block-size: 100%;
+ content: "";
+ inline-size: 100%;
+ inset-block-start: 0;
+ inset-inline-start: 0;
+}
+
+nav.layout-navbar .navbar.landing-navbar {
+ --bs-front-navbar-bg: rgba(var(--bs-paper-bg-rgb), 0.38);
+ --bs-front-navbar-border-color: rgba(var(--bs-paper-bg-rgb), 0.68);
+ border: 2px solid var(--bs-front-navbar-border-color);
+ background-color: var(--bs-front-navbar-bg);
+ margin-block-start: 1rem;
+ padding-block: 0.614rem;
+ transform: unset;
+ transition: all 0.2s ease-in-out;
+ border-radius: 0.375rem;
+}
+
+nav.layout-navbar.navbar-active::after {
+ backdrop-filter: saturate(100%) blur(6px);
+ -webkit-backdrop-filter: saturate(100%) blur(6px);
+}
+
+.navbar.landing-navbar {
+ box-shadow: none;
+ transition: all 0.2s ease-in-out;
+ transform: unset !important;
+ padding-top: 0.614rem;
+ padding-bottom: 0.614rem;
+ margin-top: 1rem;
+ border-width: 2px;
+ border-style: solid;
+ border-radius: 0.375rem;
+}
+.navbar.landing-navbar .navbar-nav .nav-link {
+ padding: 0.5rem 0.625rem;
+ margin-inline-end: 0.625rem;
+}
+@media (max-width: 1199.98px) {
+ .navbar.landing-navbar .navbar-nav .nav-link {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+ margin-inline-end: 0;
+ }
+}
+.navbar.landing-navbar .navbar-nav .nav-item:last-child .nav-link {
+ margin-inline-end: 0;
+}
+@media (min-width: 992px) {
+ .navbar.landing-navbar .navbar-nav .nav-item.mega-dropdown > .dropdown-menu {
+ max-width: 1300px;
+ inset-inline-start: 50% !important;
+ transform: translateX(-50%);
+ top: 100%;
+ }
+}
+@media (max-width: 991.98px) {
+ .navbar.landing-navbar .navbar-nav .nav-item.mega-dropdown > .dropdown-menu {
+ background: transparent;
+ box-shadow: none;
+ border: none;
+ }
+}
+.navbar.landing-navbar
+ .navbar-nav
+ .nav-item.mega-dropdown
+ > .dropdown-menu
+ .mega-dropdown-link {
+ padding-left: 0;
+ padding-right: 0;
+ margin: 0;
+ font-weight: 400;
+}
+.navbar.landing-navbar
+ .navbar-nav
+ .nav-item.mega-dropdown
+ > .dropdown-menu
+ .mega-dropdown-link
+ i {
+ font-size: 1rem;
+ font-weight: 700;
+ margin-top: -0.125rem;
+}
+.navbar.landing-navbar .navbar-nav .nav-item .nav-img-col,
+.navbar.landing-navbar .navbar-nav .nav-item .nav-img-col img {
+ border-radius: 0.625rem;
+}
+@media (max-width: 991.98px) {
+ .navbar.landing-navbar .landing-menu-overlay {
+ position: fixed;
+ display: none;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(34, 48, 62, 0.78);
+ transition: all 0.2s ease-in-out;
+ z-index: 9998;
+ }
+ .navbar.landing-navbar .landing-nav-menu {
+ position: fixed;
+ display: block !important;
+ height: 100%;
+ max-width: 300px;
+ width: 80%;
+ padding: 1rem;
+ inset-inline-start: -100%;
+ top: 0;
+ overflow-y: auto;
+ transition: all 0.3s ease-in-out;
+ z-index: 9999;
+ }
+ .navbar.landing-navbar .landing-nav-menu.show {
+ inset-inline-start: 0;
+ }
+ .navbar.landing-navbar .landing-nav-menu.show ~ .landing-menu-overlay {
+ display: block;
+ }
+}
+
+.light-style .layout-navbar .navbar.landing-navbar {
+ border-color: rgba(255, 255, 255, 100);
+ background: rgba(255, 255, 255, 50);
+}
+.light-style .layout-navbar .navbar.landing-navbar .navbar-nav .nav-link {
+ color: #384551;
+}
+.light-style
+ .layout-navbar
+ .navbar.landing-navbar
+ .navbar-nav
+ .show
+ > .nav-link,
+.light-style
+ .layout-navbar
+ .navbar.landing-navbar
+ .navbar-nav
+ .active
+ > .nav-link,
+.light-style .layout-navbar .navbar.landing-navbar .navbar-nav .nav-link.show,
+.light-style
+ .layout-navbar
+ .navbar.landing-navbar
+ .navbar-nav
+ .nav-link.active {
+ color: #696cff !important;
+}
+.light-style
+ .layout-navbar
+ .navbar.landing-navbar
+ .navbar-nav
+ .nav-item.mega-dropdown
+ > .dropdown-menu
+ .mega-dropdown-link
+ i {
+ color: #646e78;
+}
+@media (max-width: 991.98px) {
+ .light-style .layout-navbar .navbar.landing-navbar .landing-nav-menu {
+ background-color: #fff;
+ }
+}
+.light-style .layout-navbar.navbar-active .navbar.landing-navbar {
+ background: #fff;
+ box-shadow: 0 0.125rem 0.375rem 0 rgba(34, 48, 62, 0.08);
+}
+.light-style .layout-navbar .menu-text {
+ color: #384551;
+}
+
+.dark-style .layout-navbar .navbar.landing-navbar {
+ border-color: rgba(65, 65, 95, 0.68);
+ background-color: rgba(65, 65, 95, 0.38);
+}
+.dark-style .layout-navbar .navbar.landing-navbar .navbar-nav .nav-link {
+ color: #d5d5e2;
+}
+.dark-style .layout-navbar .navbar.landing-navbar .navbar-nav .show > .nav-link,
+.dark-style
+ .layout-navbar
+ .navbar.landing-navbar
+ .navbar-nav
+ .active
+ > .nav-link,
+.dark-style .layout-navbar .navbar.landing-navbar .navbar-nav .nav-link.show,
+.dark-style .layout-navbar .navbar.landing-navbar .navbar-nav .nav-link.active {
+ color: #696cff !important;
+}
+.dark-style
+ .layout-navbar
+ .navbar.landing-navbar
+ .navbar-nav
+ .nav-item.mega-dropdown
+ > .dropdown-menu
+ .mega-dropdown-link
+ i {
+ color: #b2b2c4;
+}
+@media (max-width: 991.98px) {
+ .dark-style .layout-navbar .navbar.landing-navbar .landing-nav-menu {
+ background-color: #2b2c40;
+ }
+}
+.dark-style .layout-navbar .navbar .menu-text {
+ color: #d5d5e2;
+}
+.dark-style .layout-navbar.navbar-active .navbar.landing-navbar {
+ background: #2b2c40;
+ border-color: #2b2c40;
+ box-shadow: 0 0.125rem 0.375rem 0 rgba(20, 20, 29, 0.2);
+}
+
+@media (min-width: 992px) {
+ [dir="rtl"]
+ .navbar.landing-navbar
+ .navbar-nav
+ .nav-item.mega-dropdown
+ > .dropdown-menu {
+ transform: translateX(50%);
+ }
+}
+
+.landing-footer .footer-link,
+.landing-footer .footer-text {
+ color: #fff;
+ opacity: 0.78;
+}
+.landing-footer .footer-title {
+ color: #fff;
+ opacity: 0.92;
+}
+.landing-footer .footer-bottom-text {
+ color: #d3d4dc;
+}
+.landing-footer .footer-bottom {
+ background-color: #282c3e;
+}
+.landing-footer .footer-link {
+ transition: all 0.2s ease-in-out;
+}
+.landing-footer .footer-link:hover {
+ opacity: 1;
+}
+.landing-footer .footer-top {
+ padding-top: 3.3rem;
+ padding-bottom: 2.3rem;
+ border-top-left-radius: 3.75rem;
+ border-top-right-radius: 3.75rem;
+}
+@media (max-width: 767.98px) {
+ .landing-footer .footer-top {
+ padding: 3rem 0;
+ }
+}
+.landing-footer .footer-top .footer-bg {
+ object-position: center;
+}
+@media (min-width: 992px) {
+ .landing-footer .footer-logo-description {
+ max-width: 385px;
+ }
+}
+.landing-footer .footer-form {
+ max-width: 22.25rem;
+}
+.landing-footer .footer-form input {
+ background-color: transparent;
+ border-color: #4e4f6c;
+ color: #fff;
+}
+.landing-footer .footer-form input:hover:not([disabled]):not([focus]) {
+ border-color: #4e4f6c;
+}
+.landing-footer .footer-form input::placeholder {
+ color: rgba(255, 255, 255, 0.5);
+}
+.landing-footer .footer-form label {
+ color: #d5d5e2;
+}
+
+.section-py {
+ padding: 6.25rem 0;
+}
+@media (max-width: 1199.98px) {
+ .section-py {
+ padding: 5rem 0;
+ }
+}
+@media (max-width: 767.98px) {
+ .section-py {
+ padding: 3rem 0;
+ }
+}
+
+.landing-hero {
+ border-radius: 0 0 3.5rem 3.5rem;
+ padding-top: 10.2rem;
+}
+.landing-hero::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+}
+@media (min-width: 992px) {
+ .landing-hero .hero-text-box {
+ max-width: 34.375rem;
+ margin: 0 auto;
+ }
+}
+.landing-hero .hero-title {
+ background: linear-gradient(
+ to right,
+ #28c76f 0%,
+ #5a4aff 47.92%,
+ #ff3739 100%
+ );
+ background-size: 200% auto;
+ color: #384551;
+ font-size: calc(1.3875rem + 1.65vw);
+ background-clip: text;
+ line-height: 1.2;
+ text-fill-color: transparent;
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ animation: shine 2s ease-in-out infinite alternate;
+}
+@media (min-width: 1200px) {
+ .landing-hero .hero-title {
+ font-size: 2.625rem;
+ }
+}
+.landing-hero .landing-hero-btn .hero-btn-item {
+ inset-inline-start: -94%;
+ top: 65%;
+}
+.landing-hero .hero-animation-img {
+ margin-bottom: -32rem;
+}
+.animation-img {
+ border: 1px soid red;
+}
+@media (max-width: 1199.98px) {
+ .landing-hero .hero-animation-img {
+ margin-bottom: -20rem;
+ }
+}
+@media (max-width: 575.98px) {
+ .landing-hero .hero-animation-img {
+ margin-bottom: -10rem;
+ }
+}
+.landing-hero .hero-animation-img .hero-dashboard-img {
+ width: 80%;
+ margin: 0 auto;
+ will-change: transform;
+ transform-style: preserve-3d;
+ transition: all 0.1s;
+}
+.landing-hero .hero-animation-img .hero-dashboard-img img {
+ width: 100%;
+}
+
+.landing-hero-blank {
+ padding-top: 26rem;
+}
+@media (max-width: 1199.98px) {
+ .landing-hero-blank {
+ padding-top: 15rem;
+ }
+}
+@media (max-width: 575.98px) {
+ .landing-hero-blank {
+ padding-top: 7rem;
+ }
+}
+
+@keyframes shine {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 80% {
+ background-position: 50% 90%;
+ }
+ 100% {
+ background-position: 91% 100%;
+ }
+}
+.landing-features
+ .features-icon-wrapper
+ .features-icon-box
+ .features-icon-description {
+ max-width: 19.25rem;
+ margin: 0 auto;
+}
+
+.landing-reviews {
+ border-top-left-radius: 3.75rem;
+ border-top-right-radius: 3.75rem;
+}
+.landing-reviews .swiper-reviews-carousel .swiper-button-prev,
+.landing-reviews .swiper-reviews-carousel .swiper-button-next {
+ display: none;
+}
+.landing-reviews .swiper-reviews-carousel .swiper-slide {
+ height: auto;
+ padding: 0.8125rem;
+}
+.landing-reviews .swiper-reviews-carousel .client-logo {
+ height: 1.375rem;
+ object-fit: contain;
+}
+.landing-reviews .swiper-logo-carousel {
+ padding-bottom: 6.25rem;
+}
+.landing-reviews .swiper-logo-carousel .swiper {
+ max-width: 45rem;
+}
+.landing-reviews .swiper-logo-carousel .swiper .swiper-slide {
+ display: flex;
+ justify-content: center;
+}
+.landing-reviews .swiper-logo-carousel .swiper .client-logo {
+ max-height: 2.5rem;
+ max-width: 95%;
+ object-fit: contain;
+}
+
+.landing-team .card,
+.landing-team .card .team-image-box {
+ border-top-left-radius: 5.625rem;
+ border-top-right-radius: 1.25rem;
+}
+.landing-team .card .card-body {
+ border-bottom-left-radius: 0.375rem;
+ border-bottom-right-radius: 0.375rem;
+}
+.landing-team .team-image-box {
+ height: 11.5625rem;
+}
+.landing-team .team-image-box .card-img-position {
+ height: 15rem;
+ transform: translateX(-50%);
+ max-width: 100%;
+ object-fit: cover;
+}
+@media (max-width: 991.98px) {
+ .landing-team .team-image-box .card-img-position {
+ height: 13rem;
+ }
+}
+@media (max-width: 575.98px) {
+ .landing-team .team-image-box {
+ height: 11rem;
+ }
+}
+.landing-team .card .team-media-icons i {
+ transition: all 0.2s ease-in-out;
+}
+
+.landing-pricing {
+ border-radius: 3.75rem;
+}
+.landing-pricing .pricing-plans-item {
+ inset-inline-end: -56%;
+ bottom: -0.5rem;
+}
+@media (max-width: 767.98px) {
+ .landing-pricing .pricing-plans-item {
+ inset-inline-end: 0;
+ bottom: 1rem;
+ }
+}
+.landing-pricing .pricing-list .badge.badge-center {
+ width: 1rem;
+ height: 1rem;
+}
+.landing-pricing .pricing-list .badge.badge-center i {
+ margin-top: -5px;
+}
+.landing-pricing .price-yearly-toggle {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ transform: translateX(-50%);
+}
+.landing-pricing .card .card-header,
+.landing-pricing .card .card-body {
+ padding: 2rem;
+ padding-top: 3rem;
+}
+
+.landing-faq {
+ border-top-left-radius: 3.75rem;
+ border-top-right-radius: 3.75rem;
+}
+.landing-faq .faq-image {
+ max-width: 20rem;
+ width: 80%;
+}
+
+.landing-cta .cta-title {
+ font-size: 2.125rem;
+}
+@media (max-width: 767.98px) {
+ .landing-cta .cta-title {
+ font-size: 1.8rem;
+ }
+}
+
+.landing-contact .text-heading {
+ overflow-wrap: anywhere;
+}
+.landing-contact .contact-img-box,
+.landing-contact .contact-img-box .contact-img {
+ border-radius: 3.75rem 0.375rem 0.375rem 0.375rem;
+}
+.landing-contact .contact-img-box .contact-border-img {
+ inset-block-start: -2.5rem;
+ inset-inline-start: -2.8125rem;
+}
+
+.light-style .landing-hero {
+ background: linear-gradient(138.18deg, #eae8fd 0%, #fce5e6 94.44%);
+}
+.light-style .landing-hero::after {
+ background-color: #fff;
+}
+
+.dark-style .landing-hero {
+ background: #1e2130;
+}
+.dark-style .landing-hero::after {
+ background-color: #2b2c40;
+}
+
+[dir="rtl"] .landing-reviews-btns {
+ display: flex;
+ justify-content: flex-end;
+ flex-direction: row-reverse;
+ gap: 1rem;
+}
+[dir="rtl"] .landing-team .team-image-box .card-img-position {
+ transform: translateX(50%) !important;
+}
+[dir="rtl"] .landing-pricing .switch .switch-label {
+ padding-right: 0;
+}
+[dir="rtl"] .landing-pricing .switch .switch-label:first-child {
+ padding-left: 0.5rem;
+}
+[dir="rtl"] .landing-pricing .switch .switch-input ~ .switch-label {
+ padding-right: 3rem;
+}
+[dir="rtl"] .landing-contact .contact-img-box {
+ border-radius: 0.375rem 3.75rem 0.375rem 0.375rem;
+}
+[dir="rtl"] .landing-contact .contact-img-box::before {
+ inset-block-start: -1.875rem;
+ inset-inline-start: -3.125rem;
+ transform: rotate(90deg);
+}
+
+.swiper {
+ width: 100%;
+ height: 100%;
+}
+
+.swiper-slide {
+ text-align: center;
+ font-size: 18px;
+ background: #444;
+
+ /* Center slide text vertically */
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.swiper-slide img {
+ display: block;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
diff --git a/src/pages/Home/LandingPage.jsx b/src/pages/Home/LandingPage.jsx
new file mode 100644
index 00000000..36e3f4da
--- /dev/null
+++ b/src/pages/Home/LandingPage.jsx
@@ -0,0 +1,1595 @@
+import { noop } from "@tanstack/react-query";
+import "./LandingPage.css";
+import { Link } from "react-router-dom";
+
+import { Swiper, SwiperSlide } from "swiper/react";
+// import required modules
+import { Autoplay, Pagination, Navigation } from "swiper/modules";
+// Import Swiper styles
+import "swiper/css";
+import "swiper/css/navigation";
+
+const LandingPage = () => {
+ return (
+
+
+ {/* Navbar: End */}
+
+ {/* Sections:Start */}
+
+
+ {/* Hero: Start */}
+
+
+
+
+
+ One dashboard to manage all your businesses
+
+
+ Production-ready & easy to use Admin Template
+
+ for Reliability and Customizability.
+
+
+
+
+
+
+
+
+ {/* Hero: End */}
+
+ {/* Useful features: Start */}
+
+
+
+ Useful Features
+
+
+
+ Everything you need
+
+
+ to start your next project
+
+
+ Not just a set of tools, the package includes ready-to-deploy
+ conceptual application.
+
+
+
+
+

+
+
Quality Code
+
+ Code structure that all developers will easily understand and
+ fall in love with.
+
+
+
+
+

+
+
Continuous Updates
+
+ Free updates for the next 12 months, including new demos and
+ features.
+
+
+
+
+

+
+
Stater-Kit
+
+ Start your project quickly without having to remove
+ unnecessary features.
+
+
+
+
+

+
+
API Ready
+
+ Just change the endpoint and see your own data loaded within
+ seconds.
+
+
+
+
+

+
+
Excellent Support
+
+ An easy-to-follow doc with lots of references and code
+ examples.
+
+
+
+
+

+
+
Well Documented
+
+ An easy-to-follow doc with lots of references and code
+ examples.
+
+
+
+
+
+ {/* Useful features: End */}
+
+ {/* Our great team: Start */}
+
+
+
+ Our Great Team
+
+
+
+ Supported
+
+
+ by Real People
+
+
+ Who is behind these great-looking interfaces?
+
+
+
+
+
+

+
+
+
Sophie Gilbert
+
Project Manager
+
+
+
+
+
+
+

+
+
+
Paul Miles
+
UI Designer
+
+
+
+
+
+
+

+
+
+
Nannie Ford
+
Development Lead
+
+
+
+
+
+
+

+
+
+
Chris Watkins
+
Marketing Manager
+
+
+
+
+
+
+ {/* Our great team: End */}
+
+ {/* Pricing plans: Start */}
+
+
+
+ Pricing Plans
+
+
+
+ Tailored pricing plans
+
+
+ designed for you
+
+
+ All plans include 40+ advanced tools and features to boost your
+ product.
+
+ Choose the best plan to fit your needs.
+
+
+
+
+
+

+
Save 25%
+
+
+
+
+ {/* Basic Plan: Start */}
+
+
+
+
+

+
Basic
+
+
+ $19
+
+
+ $14
+
+ /mo
+
+
+
+
+
+
+ -
+
+
+
+
+ Timeline
+
+
+ -
+
+
+
+
+ Basic search
+
+
+ -
+
+
+
+
+ Live chat widget
+
+
+ -
+
+
+
+
+ Email marketing
+
+
+ -
+
+
+
+
+ Custom Forms
+
+
+ -
+
+
+
+
+ Traffic analytics
+
+
+ -
+
+
+
+
+ Basic Support
+
+
+
+
+
+
+
+ {/* Basic Plan: End */}
+
+ {/* Favourite Plan: Start */}
+
+
+
+
+

+
Team
+
+
+ $29
+
+
+ $22
+
+ /mo
+
+
+
+
+
+
+ -
+
+
+
+
+ Everything in basic
+
+
+ -
+
+
+
+
+ Timeline with database
+
+
+ -
+
+
+
+
+ Advanced search
+
+
+ -
+
+
+
+
+ Marketing automation
+
+
+ -
+
+
+
+
+ Advanced chatbot
+
+
+ -
+
+
+
+
+ Campaign management
+
+
+ -
+
+
+
+
+ Collaboration tools
+
+
+
+
+
+
+
+ {/* Favourite Plan: End */}
+
+ {/* Standard Plan: Start */}
+
+
+
+
+

+
Enterprise
+
+
+ $49
+
+
+ $37
+
+ /mo
+
+
+
+
+
+
+ -
+
+
+
+
+ Everything in premium
+
+
+ -
+
+
+
+
+ Timeline with database
+
+
+ -
+
+
+
+
+ Fuzzy search
+
+
+ -
+
+
+
+
+ A/B testing sanbox
+
+
+ -
+
+
+
+
+ Custom permissions
+
+
+ -
+
+
+
+
+ Social media automation
+
+
+ -
+
+
+
+
+ Sales automation tools
+
+
+
+
+
+
+
+ {/* Standard Plan: End */}
+
+
+
+ {/* Pricing plans: End */}
+
+ {/* Fun facts: Start */}
+
+
+
+
+
+
+

+
7.1k+
+
+ Support Tickets
+
+ Resolved
+
+
+
+
+
+
+
+

+
50k+
+
+ Join creatives
+
+ community
+
+
+
+
+
+
+
+

+
4.8/5
+
+ Highly Rated
+
+ Products
+
+
+
+
+
+
+
+

+
100%
+
+ Money Back
+
+ Guarantee
+
+
+
+
+
+
+
+ {/* Fun facts: End */}
+
+ {/* FAQ: Start */}
+
+
+
+ FAQ
+
+
+ Frequently asked
+
+ questions
+
+
+
+
+ Browse through these FAQs to find answers to commonly asked
+ questions.
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+ Lemon drops chocolate cake gummies carrot cake chupa
+ chups muffin topping. Sesame snaps icing marzipan gummi
+ bears macaroon dragée danish caramels powder. Bear claw
+ dragée pastry topping soufflé. Wafer gummi bears
+ marshmallow pastry pie.
+
+
+
+
+
+
+
+
+
+ Dessert ice cream donut oat cake jelly-o pie sugar plum
+ cheesecake. Bear claw dragée oat cake dragée ice cream
+ halvah tootsie roll. Danish cake oat cake pie macaroon
+ tart donut gummies. Jelly beans candy canes carrot cake.
+ Fruitcake chocolate chupa chups.
+
+
+
+
+
+
+
+
+
+ Regular license can be used for end products that do not
+ charge users for access or service(access is free and
+ there will be no monthly subscription fee). Single
+ regular license can be used for single end product and
+ end product can be used by you or your client. If you
+ want to sell end product to multiple clients then you
+ will need to purchase separate license for each client.
+ The same rule applies if you want to use the same end
+ product on multiple domains(unique setup). For more info
+ on regular license you can check official description.
+
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet consectetur adipisicing elit.
+ Nobis et aliquid quaerat possimus maxime! Mollitia
+ reprehenderit neque repellat deleniti delectus
+ architecto dolorum maxime, blanditiis earum ea, incidunt
+ quam possimus cumque.
+
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet consectetur, adipisicing
+ elit. Sequi molestias exercitationem ab cum nemo facere
+ voluptates veritatis quia, eveniet veniam at et
+ repudiandae mollitia ipsam quasi labore enim architecto
+ non!
+
+
+
+
+
+
+
+
+ {/* FAQ: End */}
+
+ {/* CTA: Start */}
+
+
+
+
+ Contact US
+
+
+
+
+
+ {" "}
+
+
+ Let's work
+
+
+ together
+
+
+ Any question or remark? just write us a message
+
+
+
+
+
+
+

+
+
+
+
+ {/* CTA: End */}
+
+ {/* Contact Us: Start */}
+
+ {/* Contact Us: End */}
+
+
+ {/* / Sections:End */}
+
+ {/* Footer: Start */}
+
+ {/* Footer: End */}
+
+ );
+};
+export default LandingPage;
diff --git a/src/pages/TermsAndConditions/LegalInfoCard.jsx b/src/pages/TermsAndConditions/LegalInfoCard.jsx
index baa5d3da..cd7c9e05 100644
--- a/src/pages/TermsAndConditions/LegalInfoCard.jsx
+++ b/src/pages/TermsAndConditions/LegalInfoCard.jsx
@@ -4,25 +4,10 @@ const LegalInfoPage = () => {
return (
<>
MARCO SECURE SOLUTIONS
@@ -41,7 +26,7 @@ const LegalInfoPage = () => {
overflowY: 'auto',
flexGrow: 1,
- marginBottom: '2rem', // Adds space below the card
+ marginBottom: '2rem',
}}
>
Terms & Conditions
diff --git a/src/pages/authentication/AuthWrapper.jsx b/src/pages/authentication/AuthWrapper.jsx
index c065bac2..5c8f0eb9 100644
--- a/src/pages/authentication/AuthWrapper.jsx
+++ b/src/pages/authentication/AuthWrapper.jsx
@@ -4,17 +4,17 @@ import "./page-auth.css";
export const AuthWrapper = ({ children }) => {
return (
-
+ {/*
-
+
*/}
-
+
-
+
{
/>
-
+ {/*
*/}
{children}
-
-
+ //
+ //
);
-};
+};
\ No newline at end of file
diff --git a/src/pages/authentication/ForgotPasswordPage.jsx b/src/pages/authentication/ForgotPasswordPage.jsx
index 508b7a56..8a6fc608 100644
--- a/src/pages/authentication/ForgotPasswordPage.jsx
+++ b/src/pages/authentication/ForgotPasswordPage.jsx
@@ -1,89 +1,88 @@
import { useState } from "react";
-import {Link} from "react-router-dom";
+import { Link } from "react-router-dom";
import { AuthWrapper } from "./AuthWrapper"
import "./page-auth.css";
import AuthRepository from "../../repositories/AuthRepository";
import showToast from "../../services/toastService";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
-import {z} from "zod";
+import { z } from "zod";
-const forgotPassSceham = z.object( {
+const forgotPassSceham = z.object({
email: z.string().email(),
-} )
+})
const ForgotPasswordPage = () => {
- const[loding,setLoading] = useState(false)
+ const [loding, setLoading] = useState(false)
- const {register,
+ const { register,
handleSubmit,
formState: { errors },
reset,
- getValues } = useForm( {
- resolver: zodResolver( forgotPassSceham ),
- defaultValues: {
- email:""
- }
- })
+ getValues } = useForm({
+ resolver: zodResolver(forgotPassSceham),
+ defaultValues: {
+ email: ""
+ }
+ })
- const onSubmit = async (data) =>
- {
- try
- {
+ const onSubmit = async (data) => {
+ try {
setLoading(true)
- const response = await AuthRepository.forgotPassword(data)
- if ( response.data && response.success )
- showToast( "verification email has been sent to your registered email address", "success" )
+ const response = await AuthRepository.forgotPassword(data)
+ if (response.data && response.success)
+ showToast("verification email has been sent to your registered email address", "success")
reset()
- setLoading( false )
- } catch ( err )
- {
+ setLoading(false)
+ } catch (err) {
reset()
- if(err.response.status === 404){
- showToast( "verification email has been sent to your registered email address", "success" )
- }else{
- showToast("Something wrong","error")
- }
-
+ if (err.response.status === 404) {
+ showToast("verification email has been sent to your registered email address", "success")
+ } else {
+ showToast("Something wrong", "error")
+ }
+
setLoading(false)
}
}
return (
-
- Forgot Password? 🔒
-
- Enter your email and we'll send you instructions to reset your password
-
-
-
+
+
+
Forgot Password? 🔒
+
+ Enter your email and we'll send you instructions to reset your password
+
+
+
+
{
Back to login
-
+
+ {/* Footer Text */}
+
+
+
);
};
-export default ForgotPasswordPage;
+export default ForgotPasswordPage;
\ No newline at end of file
diff --git a/src/pages/authentication/LoginPage.jsx b/src/pages/authentication/LoginPage.jsx
index ce99c9cf..ab898b4c 100644
--- a/src/pages/authentication/LoginPage.jsx
+++ b/src/pages/authentication/LoginPage.jsx
@@ -1,70 +1,54 @@
import { useEffect, useState } from "react";
-import { Link } from "react-router-dom";
-import { AuthWrapper } from "./AuthWrapper";
-import { useNavigate } from "react-router-dom";
-import "./page-auth.css";
+import { Link, useNavigate } from "react-router-dom";
import AuthRepository from "../../repositories/AuthRepository";
import showToast from "../../services/toastService";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
+import { AuthWrapper } from "./AuthWrapper";
const LoginPage = () => {
const navigate = useNavigate();
const [loading, setLoading] = useState(false);
const [hidepass, setHidepass] = useState(true);
const [IsLoginWithOTP, setLoginWithOtp] = useState(false);
- const [IsTriedOTPThrough, setIsTriedOTPThrough] = useState(false);
const now = Date.now();
const loginSchema = IsLoginWithOTP
? z.object({
- username: z.string()
- .trim()
- .email({ message: "Valid email required" }),
- })
+ username: z.string().email({ message: "Valid email required" }),
+ })
: z.object({
- username: z.string()
- .trim()
- .email({ message: "Valid email required" }),
- password: z.string()
- .trim()
- .min(1, { message: "Password required" }),
- rememberMe: z.boolean(),
- });
+ username: z.string().email({ message: "Valid email required" }),
+ password: z.string().min(1, { message: "Password required" }),
+ rememberMe: z.boolean(),
+ });
const {
register,
handleSubmit,
formState: { errors },
- reset,
- getValues,
} = useForm({
resolver: zodResolver(loginSchema),
});
const onSubmit = async (data) => {
setLoading(true);
-
try {
- const username = data.username.trim();
- const password = data.password?.trim();
-
if (!IsLoginWithOTP) {
const userCredential = {
- username,
- password,
+ username: data.username,
+ password: data.password,
};
-
const response = await AuthRepository.login(userCredential);
localStorage.setItem("jwtToken", response.data.token);
localStorage.setItem("refreshToken", response.data.refreshToken);
setLoading(false);
- navigate("/dashboard");
+ navigate("/");
} else {
- await AuthRepository.sendOTP({ email: username });
+ await AuthRepository.sendOTP({ email: data.username });
showToast("OTP has been sent to your email.", "success");
- localStorage.setItem("otpUsername", username);
+ localStorage.setItem("otpUsername", data.username);
localStorage.setItem("otpSentTime", now.toString());
navigate("/auth/login-otp");
}
@@ -74,7 +58,6 @@ const LoginPage = () => {
}
};
-
useEffect(() => {
const otpSentTime = localStorage.getItem("otpSentTime");
if (
@@ -86,145 +69,149 @@ const LoginPage = () => {
}
}, [IsLoginWithOTP]);
-// useEffect(() => {
-// const token = localStorage.getItem("jwtToken");
-// if (token) {
-// navigate("/dashboard");
-// }
-// }, [navigate]);
-
return (
-
- Welcome to PMS!
-
- {IsLoginWithOTP
- ? "Enter your email to receive a one-time password (OTP)."
- : "Please sign-in to your account and start the adventure."}
-
-