diff --git a/package-lock.json b/package-lock.json index 38a8b23..e76633a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "@radix-ui/react-toggle": "^1.1.2", "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", + "@reduxjs/toolkit": "^2.9.0", "@tailwindcss/postcss": "^4.1.12", "class-variance-authority": "^0.7.1", "clsx": "*", @@ -48,6 +49,7 @@ "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", "react-hook-form": "^7.55.0", + "react-redux": "^9.2.0", "react-resizable-panels": "^2.1.7", "react-router-dom": "^7.8.2", "recharts": "^2.15.2", @@ -2239,6 +2241,32 @@ "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", "license": "MIT" }, + "node_modules/@reduxjs/toolkit": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.9.0.tgz", + "integrity": "sha512-fSfQlSRu9Z5yBkvsNhYF2rPS8cGXn/TZVrlwN1948QyZ8xMZ0JvP50S2acZNaf+o63u6aEeMjipFyksjIcWrog==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", @@ -2526,6 +2554,18 @@ "win32" ] }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@swc/core": { "version": "1.13.5", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.13.5.tgz", @@ -3158,6 +3198,12 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/@vitejs/plugin-react": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.2.tgz", @@ -3715,6 +3761,16 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/immer": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.3.tgz", + "integrity": "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/input-otp": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", @@ -4309,6 +4365,29 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -4499,6 +4578,27 @@ "decimal.js-light": "^2.4.1" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "node_modules/rollup": { "version": "4.49.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz", diff --git a/package.json b/package.json index 4dae6f6..7e6aeb6 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@radix-ui/react-toggle": "^1.1.2", "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", + "@reduxjs/toolkit": "^2.9.0", "@tailwindcss/postcss": "^4.1.12", "class-variance-authority": "^0.7.1", "clsx": "*", @@ -43,6 +44,7 @@ "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", "react-hook-form": "^7.55.0", + "react-redux": "^9.2.0", "react-resizable-panels": "^2.1.7", "react-router-dom": "^7.8.2", "recharts": "^2.15.2", diff --git a/src/components/BookFacility.tsx b/src/components/BookFacility.tsx index c607cfc..4108a68 100644 --- a/src/components/BookFacility.tsx +++ b/src/components/BookFacility.tsx @@ -227,7 +227,7 @@ export function BookFacility() { return (
-
+
-
+
-
+
{/* Confirmation Header */}
@@ -637,7 +637,7 @@ export function BookFacility() {
-
+
{/* Back Button */} {/* Hero Content */} -
+
{/* Main Content */} @@ -469,7 +469,7 @@ export function VirtualTour() { {/* Facility Stats Card */}
-
+
@@ -527,7 +527,7 @@ export function VirtualTour() { {/* Virtual Tour Section */}
-
+
{!isVirtualTourActive ? ( /* Tour Preview */
@@ -1215,7 +1215,7 @@ export function VirtualTour() { {/* FAQ Section */}
-
+
-
+

Ready to Transform Your Team? diff --git a/src/components/about/OurExpertise.tsx b/src/components/about/OurExpertise.tsx index c247317..f93149a 100644 --- a/src/components/about/OurExpertise.tsx +++ b/src/components/about/OurExpertise.tsx @@ -118,7 +118,7 @@ export function OurExpertise() {

-
+
@@ -158,7 +158,7 @@ export function OurExpertise() { {/* Statistics Section - Embedded in Hero */}
-
+
152+
@@ -193,7 +193,7 @@ export function OurExpertise() { {/* Expertise Overview - Clean Standard Design */}
-
+

Four Pillars of Excellence

@@ -475,7 +475,7 @@ export function OurExpertise() { {/* Consulting & Advisory Section - Reusable Carousel Design */}

-
+
{/* Using the new reusable carousel component */}
@@ -483,7 +483,7 @@ export function OurExpertise() { {/* Leadership Development Section - Split Layout */}
-
+
{/* Leadership Development Framework - Our Vision Style */}
@@ -690,7 +690,7 @@ export function OurExpertise() { {/* Platform Features Section - Redesigned Layout */}
-
+
{/* Header */}
-
+
-
+
@@ -323,7 +323,7 @@ export function OurImpact() { {/* Statistics Section - Embedded in Hero */}
-
+
@@ -364,7 +364,7 @@ export function OurImpact() { {/* Partners Section - Redesigned According to JSON Config */}
-
+
{/* Statistics Section - Landing Page Style */} @@ -577,7 +577,7 @@ export function OurImpact() { {/* Additional Metrics Section - Redesigned */}
-
+
-
+
@@ -216,7 +216,7 @@ export function OurVision() { {/* Vision Statistics Section - Embedded in Hero */}
-
+
3
@@ -241,7 +241,7 @@ export function OurVision() { {/* Vision Pillars - Redesigned */}
-
+
-
+
-
+
{/* Content Side */} diff --git a/src/components/services/Consulting.tsx b/src/components/services/Consulting.tsx index a7d47b6..61729e9 100644 --- a/src/components/services/Consulting.tsx +++ b/src/components/services/Consulting.tsx @@ -198,7 +198,7 @@ export function Consulting() {
-
+
@@ -237,7 +237,7 @@ export function Consulting() {
-
+
96%
@@ -265,7 +265,7 @@ export function Consulting() { {/* Who It's For Section */}
-
+

@@ -326,7 +326,7 @@ export function Consulting() { {/* Expected Outcomes Section */}
-
+

Expected Outcomes @@ -532,7 +532,7 @@ export function Consulting() { {/* Our Approach Section - Carousel Design */}
-
+
{/* Left Side - Title, Description & Navigation */} diff --git a/src/components/services/CultureCompetence.tsx b/src/components/services/CultureCompetence.tsx index 52e2ace..05f3c1c 100644 --- a/src/components/services/CultureCompetence.tsx +++ b/src/components/services/CultureCompetence.tsx @@ -202,7 +202,7 @@ export function CultureCompetence() {
-
+
@@ -241,7 +241,7 @@ export function CultureCompetence() {
-
+
87%
@@ -269,7 +269,7 @@ export function CultureCompetence() { {/* Who It's For Section */}
-
+

@@ -330,7 +330,7 @@ export function CultureCompetence() { {/* Expected Outcomes Section */}
-
+

Expected Outcomes @@ -536,7 +536,7 @@ export function CultureCompetence() { {/* Our Approach Section - Carousel Design */}
-
+
{/* Left Side - Title, Description & Navigation */} diff --git a/src/components/services/ExecutiveCoaching.tsx b/src/components/services/ExecutiveCoaching.tsx index a28cab0..4a20944 100644 --- a/src/components/services/ExecutiveCoaching.tsx +++ b/src/components/services/ExecutiveCoaching.tsx @@ -198,7 +198,7 @@ export function ExecutiveCoaching() {
-
+
@@ -237,7 +237,7 @@ export function ExecutiveCoaching() {
-
+
91%
@@ -265,7 +265,7 @@ export function ExecutiveCoaching() { {/* Who It's For Section */}
-
+

@@ -326,7 +326,7 @@ export function ExecutiveCoaching() { {/* Expected Outcomes Section */}
-
+

Expected Outcomes @@ -532,7 +532,7 @@ export function ExecutiveCoaching() { {/* Our Approach Section - Carousel Design */}
-
+
{/* Left Side - Title, Description & Navigation */} diff --git a/src/components/services/LeadershipDevelopment.tsx b/src/components/services/LeadershipDevelopment.tsx index d8a6330..9161db2 100644 --- a/src/components/services/LeadershipDevelopment.tsx +++ b/src/components/services/LeadershipDevelopment.tsx @@ -202,7 +202,7 @@ export function LeadershipDevelopment() {
-
+
@@ -241,7 +241,7 @@ export function LeadershipDevelopment() {
-
+
94%
@@ -269,7 +269,7 @@ export function LeadershipDevelopment() { {/* Who It's For Section */}
-
+

@@ -330,7 +330,7 @@ export function LeadershipDevelopment() { {/* Expected Outcomes Section */}
-
+

Expected Outcomes @@ -536,7 +536,7 @@ export function LeadershipDevelopment() { {/* Our Approach Section - Carousel Design */}
-
+
{/* Left Side - Title, Description & Navigation */} diff --git a/src/components/services/LearningFacility.tsx b/src/components/services/LearningFacility.tsx index e65450b..334ec3e 100644 --- a/src/components/services/LearningFacility.tsx +++ b/src/components/services/LearningFacility.tsx @@ -496,7 +496,7 @@ export function LearningFacility() { {/* Centered content */}
-
+
@@ -541,7 +541,7 @@ export function LearningFacility() { {/* Stat strip */}
-
+
2 Acres
@@ -562,7 +562,7 @@ export function LearningFacility() { {/* What We Offer Section */}
-
+

What We Offer @@ -641,7 +641,7 @@ export function LearningFacility() { {/* Who It's For Section - match Services page (left intro + right accordion list) */}
-
+
{/* Our Expertise "Our Services" style - horizontal carousel cards */}
{/* Header with eyebrow and controls */} @@ -791,7 +791,7 @@ export function LearningFacility() { {/* Facility Features Section */}
-
+
@@ -895,7 +895,7 @@ export function LearningFacility() { {/* Amenities Section */}
-
+

World-Class Amenities @@ -967,7 +967,7 @@ export function LearningFacility() { {/* Virtual Tour Section */}
-
+
{!isVirtualTourActive ? ( /* Tour Preview */
diff --git a/src/components/services/ManagementDevelopment.tsx b/src/components/services/ManagementDevelopment.tsx index 9a47076..8e7b05d 100644 --- a/src/components/services/ManagementDevelopment.tsx +++ b/src/components/services/ManagementDevelopment.tsx @@ -199,7 +199,7 @@ export function ManagementDevelopment() {
-
+
@@ -266,7 +266,7 @@ export function ManagementDevelopment() { {/* Who It's For Section */}
-
+

@@ -327,7 +327,7 @@ export function ManagementDevelopment() { {/* Expected Outcomes Section - Redesigned to Match Reference */}
-
+

Expected Outcomes @@ -533,7 +533,7 @@ export function ManagementDevelopment() { {/* Our Approach Section - Carousel Design */}
-
+
{/* Left Side - Title, Description & Navigation */} diff --git a/src/services/baseQuery.ts b/src/services/baseQuery.ts new file mode 100644 index 0000000..8e74e0f --- /dev/null +++ b/src/services/baseQuery.ts @@ -0,0 +1,15 @@ +import { fetchBaseQuery } from '@reduxjs/toolkit/query/react'; + +const rawBaseQuery = fetchBaseQuery({ + baseUrl: 'http://localhost:3000/api', +}); + +const baseQueryWithReauth = async (args: any, api: any, extraOptions: any) => { + const result = await rawBaseQuery(args, api, extraOptions); + + // Optional: reauthentication logic if result.error?.status === 401 + + return result; +}; + +export default baseQueryWithReauth; diff --git a/src/services/storeSwitchToDashboard.tsx b/src/services/storeSwitchToDashboard.tsx new file mode 100644 index 0000000..404b64d --- /dev/null +++ b/src/services/storeSwitchToDashboard.tsx @@ -0,0 +1,37 @@ +// storeSwitchToDashboard.service.ts +import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; +import baseQueryWithReauth from "./baseQuery"; + +export type ContactUsFormData = { + t_id: string; + name: string; + email: string; + country: string; + phone_number: string; + service: string; + budget: string; + message: string; + development_stage: string; + startTime: string; + nda_signing: string | boolean; + from_page: string; + ip?: string; + user_agent?: string; + contact_us_attachment?: File; +}; + +export const storeSwitchToDashboard = createApi({ + reducerPath: "storeSwitchToDashboard", + baseQuery: baseQueryWithReauth, + endpoints: (builder) => ({ + storeSwitchToDashboard: builder.mutation({ + query: (formData) => ({ + url: "/api/store-contact-us-data", + method: "POST", + body: formData, + }), + }), + }), +}); + +export const { useStoreSwitchToDashboardMutation } = storeSwitchToDashboard; \ No newline at end of file diff --git a/src/store/Store.tsx b/src/store/Store.tsx new file mode 100644 index 0000000..f06519a --- /dev/null +++ b/src/store/Store.tsx @@ -0,0 +1,16 @@ +// store.ts +import { configureStore } from '@reduxjs/toolkit'; +import { setupListeners } from '@reduxjs/toolkit/query'; +import { storeSwitchToDashboard } from '../services/storeSwitchToDashboard'; + +export const store = configureStore({ + reducer: { + [storeSwitchToDashboard.reducerPath]: storeSwitchToDashboard.reducer, + }, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware().concat(storeSwitchToDashboard.middleware), +}); + +setupListeners(store.dispatch); + +export default store; \ No newline at end of file