generated from dwd/boilarplate-astro-tailwind
fix-seo done for all pages
parent
b528567844
commit
7153397800
4
env.txt
4
env.txt
|
@ -1,2 +1,2 @@
|
|||
PUBLIC_API_KEY=1234567890abcdef
|
||||
PUBLIC_SECRET_KEY=my-secret-key
|
||||
PUBLIC_BUZZ_ONE_BASE_URL=https://beanstalkedu.in/api/one/v1/
|
||||
PUBLIC_BUZZ_BASE_URL=https://beanstalkedu.in/api/
|
|
@ -9864,8 +9864,6 @@
|
|||
},
|
||||
"node_modules/npm/node_modules/cross-spawn/node_modules/which": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
|
||||
"inBundle": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/guide-to-preschool-assessment-tools</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/summer-camp-activities-for-preschool</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/first-day-preschool-activities-ideas</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/lesson-plan-for-preschool-a-complete-guide</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/benefits-of-preschool-learning-games-for-early-education</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/preschool-online-learning-games-kits-apps-worksheets</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/seamless-scalability-akadmy-empowering-early-education</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/ai-tools-for-teachers</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/what-should-be-included-in-a-preschool-report-card</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/ideas-of-worksheets-for-preschool</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/power-of-early-learning-why-preschool-education-is-important</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/how-do-classroom-management-tools-help-educators</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/anecdotal-record-a-guide-for-early-childhood-educators</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/blogs/preschool-activity-plans-that-make-learning-fun</loc>
|
||||
</url>
|
||||
</urlset>
|
|
@ -0,0 +1,32 @@
|
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/learning-solutions-for-preschools</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/preschool-management-solutions</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/pricing/akadmy-platform-pricing</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/pricing/akadmy-product-pricing</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/interakto-coding-worksheets</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/term-and-conditions</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/contact-us</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/purchase/cart</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/about-us</loc>
|
||||
</url>
|
||||
</urlset>
|
|
@ -0,0 +1,197 @@
|
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/home_banner.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Home_TB.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Home_Interakto.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Home_Toddler.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/home_platform.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/home_platform2.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/interakto-coding-section3-3.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Next-Gen-Tech.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Home_parent.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Home_educator.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Home_learner.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/contact.svg</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/akademy_Logo.png</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/prime.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/specific.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/augmented.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/worksheet_4.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/worksheet_1.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/worksheet_2.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/worksheet_3.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/ReportCard.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Resources_CurriculumFocus.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Co_Curriculum.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/contact.svg</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Interakto_Understanding_world.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/interakto_literacy.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Interakto_math.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Interakto_Celebrations.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Interakto_Thinking.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Interakto_coding.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Problem_Solving.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Interakto_Perseverance.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/earth.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Fruits.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/shaps.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Letter_B.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/InteraktoCodingWithoutBG.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/InteraktoRobotics.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Family.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/babies_child.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/food.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/home.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/outside.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/animal.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Friends.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Class.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/AI-Attendance.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Buzzboard.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/observation.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Games.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/family-comunications.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Academic-Report.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/family-comunications.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Magic-Workshetets.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Academic-Report.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/home_platform.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Interakto_Coding_img.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Data-driven_Decision-making.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/developmental_Insights.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/connecting_with_Parents.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/ai_powered.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Captivating_Worksheets.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Interakto.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/TeenyBeans.webp</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/assets/Toddlers.webp</loc>
|
||||
</url>
|
||||
</urlset>
|
|
@ -0,0 +1,11 @@
|
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/digital-preschool-curriculum/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/interactive-learning-resources-for-preschool</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://akadmyapp.com/mother-toddler-program</loc>
|
||||
</url>
|
||||
</urlset>
|
|
@ -0,0 +1,4 @@
|
|||
User-agent: *
|
||||
Allow: /
|
||||
Disallow: /_DIZ_ADMIN/
|
||||
Sitemap: https://akadmyapp.com/sitemap.xml
|
|
@ -0,0 +1,14 @@
|
|||
<sitemapindex xmlns="http://www.google.com/schemas/sitemap/0.84">
|
||||
<sitemap>
|
||||
<loc>https://akadmyapp.com/products-sitemap.xml</loc>
|
||||
</sitemap>
|
||||
<sitemap>
|
||||
<loc>https://akadmyapp.com/general-sitemap.xml</loc>
|
||||
</sitemap>
|
||||
<sitemap>
|
||||
<loc>https://akadmyapp.com/images-sitemap.xml</loc>
|
||||
</sitemap>
|
||||
<sitemap>
|
||||
<loc>https://akadmyapp.com/blogs-sitemap.xml</loc>
|
||||
</sitemap>
|
||||
</sitemapindex>
|
|
@ -30,9 +30,16 @@ const Blog = (props) => {
|
|||
// }, [slug]);
|
||||
|
||||
// blog
|
||||
const newSchema = props.blog && props.blog.schema && props.blog?.schema.replaceAll("\n", "");
|
||||
const newSchema2 = props.blog && props.blog.schema2 && props.blog?.schema2.replaceAll("\n", "");
|
||||
const newSchema3 = props.blog && props.blog.schema3 && props.blog?.schema3.replaceAll("\n", "");
|
||||
const newSchema =
|
||||
props.blog && props.blog.schema && props.blog?.schema.replaceAll("\n", "");
|
||||
const newSchema2 =
|
||||
props.blog &&
|
||||
props.blog.schema2 &&
|
||||
props.blog?.schema2.replaceAll("\n", "");
|
||||
const newSchema3 =
|
||||
props.blog &&
|
||||
props.blog.schema3 &&
|
||||
props.blog?.schema3.replaceAll("\n", "");
|
||||
|
||||
// console.log("blogUrl", `https://akadmyapp.com${pathname}`);
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
import { TOKEN_NAME } from "../utils/constants";
|
||||
|
||||
export const API_BASE_BUZZONE = import.meta.env.VITE_BUZZ_ONE_BASE_URL;
|
||||
export const API_BASE_BUZZ = import.meta.env.VITE_BUZZ_BASE_URL;
|
||||
export const API_BASE_BUZZONE = import.meta.env.PUBLIC_BUZZ_ONE_BASE_URL;
|
||||
export const API_BASE_BUZZ = import.meta.env.PUBLIC_BUZZ_BASE_URL;
|
||||
|
||||
export const AUTH_TOKEN = () => localStorage.getItem(TOKEN_NAME);
|
||||
export const SCHOOL_ID = () => localStorage.getItem("SCHOOL_ID");
|
||||
|
||||
console.log('TestENV', import.meta.env.PUBLIC_API_KEY);
|
||||
console.log('TestENV', import.meta.env.PUBLIC_SECRET_KEY);
|
||||
console.log("TestENV", import.meta.env.PUBLIC_BUZZ_ONE_BASE_URL);
|
||||
console.log("TestENV", import.meta.env.PUBLIC_BUZZ_BASE_URL);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import React, { useMemo, useState } from "react";
|
||||
import React, { useEffect, useMemo, useState } from "react";
|
||||
|
||||
import ArrowForwardOutlinedIcon from "@mui/icons-material/ArrowForwardOutlined";
|
||||
import ClearIcon from "@mui/icons-material/Clear";
|
||||
|
@ -11,240 +11,259 @@ import ProductCard from "../components/ProductCard/ProductCard";
|
|||
|
||||
import { useDispatch, useSelector } from "react-redux";
|
||||
import { toast } from "react-toastify";
|
||||
import { removeItemFromCart, updatePurchase, validateCoupon } from "../../redux/purchaseSlice";
|
||||
import {
|
||||
getPurchaseDetails,
|
||||
removeItemFromCart,
|
||||
updatePurchase,
|
||||
validateCoupon,
|
||||
} from "../../redux/purchaseSlice";
|
||||
import { getFormattedCurrency } from "../../utils";
|
||||
import style from "./Cart.module.css";
|
||||
|
||||
function CartPage() {
|
||||
const dispatch = useDispatch();
|
||||
// const navigate = useNavigate();
|
||||
const dispatch = useDispatch();
|
||||
// const navigate = useNavigate();
|
||||
|
||||
const { purchaseDetails } = useSelector(({ purchase }) => {
|
||||
return {
|
||||
purchaseDetails: purchase.purchaseDetails,
|
||||
};
|
||||
});
|
||||
const { purchaseDetails } = useSelector(({ purchase }) => {
|
||||
return {
|
||||
purchaseDetails: purchase.purchaseDetails,
|
||||
};
|
||||
});
|
||||
|
||||
const removeFromCart = (cartItemId) => {
|
||||
if (window.confirm("Do you really want to remove this Item?")) {
|
||||
dispatch(removeItemFromCart({ cartItemId }));
|
||||
}
|
||||
};
|
||||
console.log("purchaseDetails", purchaseDetails);
|
||||
|
||||
const changeLicenseCount = (cartItemId, licenseCount) => {
|
||||
let cartItem = purchaseDetails.cartItems.find(
|
||||
({ _id }) => _id === cartItemId
|
||||
);
|
||||
cartItem = JSON.parse(JSON.stringify(cartItem));
|
||||
if (!cartItem.additionalLicenses || cartItem.additionalLicenses.length <= 0)
|
||||
return;
|
||||
cartItem.additionalLicenses[0].count = licenseCount;
|
||||
const removeFromCart = (cartItemId) => {
|
||||
if (window.confirm("Do you really want to remove this Item?")) {
|
||||
dispatch(removeItemFromCart({ cartItemId }));
|
||||
}
|
||||
};
|
||||
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
cartItem,
|
||||
})
|
||||
);
|
||||
};
|
||||
const changeLicenseCount = (cartItemId, licenseCount) => {
|
||||
let cartItem = purchaseDetails.cartItems.find(
|
||||
({ _id }) => _id === cartItemId
|
||||
);
|
||||
cartItem = JSON.parse(JSON.stringify(cartItem));
|
||||
if (!cartItem.additionalLicenses || cartItem.additionalLicenses.length <= 0)
|
||||
return;
|
||||
cartItem.additionalLicenses[0].count = licenseCount;
|
||||
|
||||
const changeBuyOnlyLicenseFlag = (cartItemId, value) => {
|
||||
let cartItem = purchaseDetails.cartItems.find(
|
||||
({ _id }) => _id === cartItemId
|
||||
);
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
cartItem,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
const payload = {
|
||||
_id: cartItem._id,
|
||||
planId: cartItem.planId,
|
||||
buyingOnlyLicenses: value,
|
||||
};
|
||||
const changeBuyOnlyLicenseFlag = (cartItemId, value) => {
|
||||
let cartItem = purchaseDetails.cartItems.find(
|
||||
({ _id }) => _id === cartItemId
|
||||
);
|
||||
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
cartItem: payload,
|
||||
})
|
||||
);
|
||||
};
|
||||
const payload = {
|
||||
_id: cartItem._id,
|
||||
planId: cartItem.planId,
|
||||
buyingOnlyLicenses: value,
|
||||
};
|
||||
|
||||
const changeTerm = (cartItemId, newIdx) => {
|
||||
let cartItem = purchaseDetails.cartItems.find(
|
||||
({ _id }) => _id === cartItemId
|
||||
);
|
||||
cartItem = JSON.parse(JSON.stringify(cartItem));
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
cartItem: payload,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
cartItem.planVariantIdx = newIdx;
|
||||
const changeTerm = (cartItemId, newIdx) => {
|
||||
let cartItem = purchaseDetails.cartItems.find(
|
||||
({ _id }) => _id === cartItemId
|
||||
);
|
||||
cartItem = JSON.parse(JSON.stringify(cartItem));
|
||||
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
cartItem,
|
||||
})
|
||||
);
|
||||
};
|
||||
cartItem.planVariantIdx = newIdx;
|
||||
|
||||
const redirectToCheckout = () => {
|
||||
// navigate("/purchase/user_details");
|
||||
window.location.href = "/purchase/user_details";
|
||||
};
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
cartItem,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
const [couponCode, setCouponCode] = useState("");
|
||||
const redirectToCheckout = () => {
|
||||
// navigate("/purchase/user_details");
|
||||
window.location.href = "/purchase/user_details";
|
||||
};
|
||||
|
||||
const applyDiscount = () => {
|
||||
dispatch(validateCoupon({ couponCode }))
|
||||
.unwrap()
|
||||
.then((res) => {
|
||||
const { getOffer } = res;
|
||||
let discount = { code: couponCode };
|
||||
if (getOffer.type === "PERCENTAGE") discount.percentage = getOffer.amount;
|
||||
else if (getOffer.type === "FLAT") discount.amount = getOffer.amount;
|
||||
const [couponCode, setCouponCode] = useState("");
|
||||
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
discount,
|
||||
})
|
||||
);
|
||||
setCouponCode("");
|
||||
})
|
||||
.catch((err) => {
|
||||
toast.error(err.message);
|
||||
});
|
||||
};
|
||||
const applyDiscount = () => {
|
||||
dispatch(validateCoupon({ couponCode }))
|
||||
.unwrap()
|
||||
.then((res) => {
|
||||
const { getOffer } = res;
|
||||
let discount = { code: couponCode };
|
||||
if (getOffer.type === "PERCENTAGE")
|
||||
discount.percentage = getOffer.amount;
|
||||
else if (getOffer.type === "FLAT") discount.amount = getOffer.amount;
|
||||
|
||||
const removeDiscount = () => {
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
discount: null,
|
||||
})
|
||||
);
|
||||
};
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
discount,
|
||||
})
|
||||
);
|
||||
setCouponCode("");
|
||||
})
|
||||
.catch((err) => {
|
||||
toast.error(err.message);
|
||||
});
|
||||
};
|
||||
|
||||
const isCartEmpty = useMemo(() => {
|
||||
return purchaseDetails && purchaseDetails.currency ? false : true;
|
||||
}, [purchaseDetails]);
|
||||
const removeDiscount = () => {
|
||||
dispatch(
|
||||
updatePurchase({
|
||||
discount: null,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className={style.main_container}>
|
||||
<ContentWrapper>
|
||||
<Header theme="DARK2" />
|
||||
<div className={style.section1}>
|
||||
{" "}
|
||||
<p>
|
||||
{!isCartEmpty
|
||||
? `Your cart total is ${getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
purchaseDetails.totalCost
|
||||
)}`
|
||||
: "Your cart is Empty"}
|
||||
</p>
|
||||
<Button
|
||||
variant="contained"
|
||||
onClick={redirectToCheckout}
|
||||
disabled={isCartEmpty}
|
||||
>
|
||||
Check Out{" "}
|
||||
<ArrowForwardOutlinedIcon sx={{ marginLeft: "0.5rem", fontSize: 20 }} />
|
||||
</Button>
|
||||
</div>
|
||||
const isCartEmpty = useMemo(() => {
|
||||
return purchaseDetails && purchaseDetails.currency ? false : true;
|
||||
}, [purchaseDetails]);
|
||||
|
||||
<div className={style.section2}>
|
||||
{purchaseDetails &&
|
||||
purchaseDetails.cartItems &&
|
||||
purchaseDetails.cartItems.map((data) => (
|
||||
<ProductCard
|
||||
currency={purchaseDetails.currency}
|
||||
data={data}
|
||||
removeFromCart={removeFromCart}
|
||||
changeBuyOnlyLicenseFlag={changeBuyOnlyLicenseFlag}
|
||||
changeLicenseCount={changeLicenseCount}
|
||||
changeTerm={changeTerm}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
useEffect(() => {
|
||||
dispatch(getPurchaseDetails());
|
||||
}, []);
|
||||
|
||||
<div className={style.section3}>
|
||||
<div>
|
||||
<p>Sub-total</p>
|
||||
<p className={style.price}>
|
||||
{purchaseDetails
|
||||
? getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
purchaseDetails.subTotalCost
|
||||
)
|
||||
: "Nil"}
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>Other taxes</p>
|
||||
<p className={style.price}>
|
||||
{purchaseDetails
|
||||
? getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
purchaseDetails.otherTaxesCost
|
||||
)
|
||||
: "Nil"}
|
||||
</p>
|
||||
</div>
|
||||
<div className={style.coupon_row}>
|
||||
<p>Have a discount code?</p>
|
||||
{purchaseDetails && purchaseDetails.discount ? (
|
||||
<>
|
||||
<div className={style.coupon_code}>
|
||||
<span>{purchaseDetails.discount.code} </span>{" "}
|
||||
<ClearIcon style={{ cursor: "pointer" }} onClick={removeDiscount} />
|
||||
</div>
|
||||
return (
|
||||
<div className={style.main_container}>
|
||||
<ContentWrapper>
|
||||
<Header theme="DARK2" />
|
||||
<div className={style.section1}>
|
||||
{" "}
|
||||
<p>
|
||||
{!isCartEmpty
|
||||
? `Your cart total is ${getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
purchaseDetails.totalCost
|
||||
)}`
|
||||
: "Your cart is Empty"}
|
||||
</p>
|
||||
<Button
|
||||
variant="contained"
|
||||
onClick={redirectToCheckout}
|
||||
disabled={isCartEmpty}
|
||||
>
|
||||
Check Out{" "}
|
||||
<ArrowForwardOutlinedIcon
|
||||
sx={{ marginLeft: "0.5rem", fontSize: 20 }}
|
||||
/>
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
<p className={style.price}>
|
||||
{getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
-purchaseDetails.discount.amount
|
||||
)}
|
||||
</p>
|
||||
</>
|
||||
) : (
|
||||
<div className={style.coupon}>
|
||||
<TextField
|
||||
fullWidth
|
||||
id="discount_code"
|
||||
placeholder="Discount Code"
|
||||
value={couponCode}
|
||||
onChange={(e) => {
|
||||
setCouponCode(e.target.value);
|
||||
}}
|
||||
/>
|
||||
<Button
|
||||
fullWidth
|
||||
variant="outlined"
|
||||
disabled={!couponCode}
|
||||
onClick={applyDiscount}
|
||||
>
|
||||
Apply
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className={style.section2}>
|
||||
{purchaseDetails &&
|
||||
purchaseDetails.cartItems &&
|
||||
purchaseDetails.cartItems.map((data) => (
|
||||
<ProductCard
|
||||
currency={purchaseDetails.currency}
|
||||
data={data}
|
||||
removeFromCart={removeFromCart}
|
||||
changeBuyOnlyLicenseFlag={changeBuyOnlyLicenseFlag}
|
||||
changeLicenseCount={changeLicenseCount}
|
||||
changeTerm={changeTerm}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p>Total</p>
|
||||
<p className={style.price}>
|
||||
{purchaseDetails
|
||||
? getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
purchaseDetails.totalCost
|
||||
)
|
||||
: "Nil"}
|
||||
</p>
|
||||
</div>
|
||||
<Button
|
||||
variant="contained"
|
||||
onClick={redirectToCheckout}
|
||||
disabled={isCartEmpty}
|
||||
className={style.checkout}
|
||||
>
|
||||
Check Out{" "}
|
||||
<ArrowForwardOutlinedIcon sx={{ marginLeft: "0.5rem", fontSize: 20 }} />
|
||||
</Button>
|
||||
</div>
|
||||
</ContentWrapper>
|
||||
</div>
|
||||
);
|
||||
<div className={style.section3}>
|
||||
<div>
|
||||
<p>Sub-total</p>
|
||||
<p className={style.price}>
|
||||
{purchaseDetails
|
||||
? getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
purchaseDetails.subTotalCost
|
||||
)
|
||||
: "Nil"}
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<p>Other taxes</p>
|
||||
<p className={style.price}>
|
||||
{purchaseDetails
|
||||
? getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
purchaseDetails.otherTaxesCost
|
||||
)
|
||||
: "Nil"}
|
||||
</p>
|
||||
</div>
|
||||
<div className={style.coupon_row}>
|
||||
<p>Have a discount code?</p>
|
||||
{purchaseDetails && purchaseDetails.discount ? (
|
||||
<>
|
||||
<div className={style.coupon_code}>
|
||||
<span>{purchaseDetails.discount.code} </span>{" "}
|
||||
<ClearIcon
|
||||
style={{ cursor: "pointer" }}
|
||||
onClick={removeDiscount}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<p className={style.price}>
|
||||
{getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
-purchaseDetails.discount.amount
|
||||
)}
|
||||
</p>
|
||||
</>
|
||||
) : (
|
||||
<div className={style.coupon}>
|
||||
<TextField
|
||||
fullWidth
|
||||
id="discount_code"
|
||||
placeholder="Discount Code"
|
||||
value={couponCode}
|
||||
onChange={(e) => {
|
||||
setCouponCode(e.target.value);
|
||||
}}
|
||||
/>
|
||||
<Button
|
||||
fullWidth
|
||||
variant="outlined"
|
||||
disabled={!couponCode}
|
||||
onClick={applyDiscount}
|
||||
>
|
||||
Apply
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p>Total</p>
|
||||
<p className={style.price}>
|
||||
{purchaseDetails
|
||||
? getFormattedCurrency(
|
||||
purchaseDetails.currency,
|
||||
purchaseDetails.totalCost
|
||||
)
|
||||
: "Nil"}
|
||||
</p>
|
||||
</div>
|
||||
<Button
|
||||
variant="contained"
|
||||
onClick={redirectToCheckout}
|
||||
disabled={isCartEmpty}
|
||||
className={style.checkout}
|
||||
>
|
||||
Check Out{" "}
|
||||
<ArrowForwardOutlinedIcon
|
||||
sx={{ marginLeft: "0.5rem", fontSize: 20 }}
|
||||
/>
|
||||
</Button>
|
||||
</div>
|
||||
</ContentWrapper>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default CartPage;
|
||||
|
|
|
@ -3,283 +3,284 @@ import { isAxiosError } from "axios";
|
|||
import { axiosBuzz, axiosBuzzOne } from "../utils/axios";
|
||||
|
||||
export const getAkademyPlans = createAsyncThunk(
|
||||
`COMMON/akademy/plans`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "GET",
|
||||
url: "/akademy/subscriptions/plans",
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
`COMMON/akademy/plans`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "GET",
|
||||
url: "/akademy/subscriptions/plans",
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const getAkademyClasses = createAsyncThunk(
|
||||
`COMMON/akademy/classes`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "GET",
|
||||
url: "/akademy/bcc/school/classes",
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
`COMMON/akademy/classes`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "GET",
|
||||
url: "/akademy/bcc/school/classes",
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const createPurchase = createAsyncThunk(
|
||||
`PURCHASE:POST/akademy/purchase`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "POST",
|
||||
url: "/akademy/subscriptions/purchase",
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
`PURCHASE:POST/akademy/purchase`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "POST",
|
||||
url: "/akademy/subscriptions/purchase",
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const updatePurchase = createAsyncThunk(
|
||||
`PURCHASE:PUT/akademy/purchase`,
|
||||
async (payload, { getState, dispatch }) => {
|
||||
const { purchase } = getState();
|
||||
`PURCHASE:PUT/akademy/purchase`,
|
||||
async (payload, { getState, dispatch }) => {
|
||||
const { purchase } = getState();
|
||||
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "PUT",
|
||||
url: `/akademy/subscriptions/purchase/${purchase.purchaseId}/cart`,
|
||||
data: payload,
|
||||
});
|
||||
dispatch(getPurchaseDetails());
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "PUT",
|
||||
url: `/akademy/subscriptions/purchase/${purchase.purchaseId}/cart`,
|
||||
data: payload,
|
||||
});
|
||||
dispatch(getPurchaseDetails());
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const removeItemFromCart = createAsyncThunk(
|
||||
`PURCHASE:DELETE/akademy/purchase`,
|
||||
async (payload, { getState, dispatch }) => {
|
||||
const { cartItemId } = payload;
|
||||
const { purchase } = getState();
|
||||
`PURCHASE:DELETE/akademy/purchase`,
|
||||
async (payload, { getState, dispatch }) => {
|
||||
const { cartItemId } = payload;
|
||||
const { purchase } = getState();
|
||||
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "DELETE",
|
||||
url: `/akademy/subscriptions/purchase/${purchase.purchaseId}/cart/${cartItemId}`,
|
||||
data: payload,
|
||||
});
|
||||
dispatch(getPurchaseDetails());
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "DELETE",
|
||||
url: `/akademy/subscriptions/purchase/${purchase.purchaseId}/cart/${cartItemId}`,
|
||||
data: payload,
|
||||
});
|
||||
dispatch(getPurchaseDetails());
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const getPurchaseDetails = createAsyncThunk(
|
||||
`PURCHASE:GET/akademy/purchase`,
|
||||
async (payload, { getState }) => {
|
||||
const { purchase } = getState();
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "GET",
|
||||
url: `/akademy/subscriptions/purchase/${purchase.purchaseId}/cart`,
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
`PURCHASE:GET/akademy/purchase`,
|
||||
async (payload, { getState }) => {
|
||||
const { purchase } = getState();
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "GET",
|
||||
url: `/akademy/subscriptions/purchase/${purchase.purchaseId}/cart`,
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const initiatePayment = createAsyncThunk(
|
||||
`PURCHASE:POST/akademy/purchase/initiatePayment`,
|
||||
async (payload, { getState }) => {
|
||||
const { purchase } = getState();
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "POST",
|
||||
url: `/akademy/subscriptions/purchase/${purchase.purchaseId}/cart/checkout`,
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
`PURCHASE:POST/akademy/purchase/initiatePayment`,
|
||||
async (payload, { getState }) => {
|
||||
const { purchase } = getState();
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "POST",
|
||||
url: `/akademy/subscriptions/purchase/${purchase.purchaseId}/cart/checkout`,
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const verifyPayment = createAsyncThunk(
|
||||
`PURCHASE:POST/akademy/purchase/verifyPayment`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzz({
|
||||
method: "POST",
|
||||
url: "/payments/verify",
|
||||
data: {
|
||||
txnId: payload.txnId,
|
||||
provider: "airpay",
|
||||
},
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
`PURCHASE:POST/akademy/purchase/verifyPayment`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzz({
|
||||
method: "POST",
|
||||
url: "/payments/verify",
|
||||
data: {
|
||||
txnId: payload.txnId,
|
||||
provider: "airpay",
|
||||
},
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const validateCoupon = createAsyncThunk(
|
||||
`COUPON:POST/validate`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "POST",
|
||||
url: "/offer/validate-coupon",
|
||||
data: {
|
||||
code: payload.couponCode,
|
||||
},
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
`COUPON:POST/validate`,
|
||||
async (payload) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "POST",
|
||||
url: "/offer/validate-coupon",
|
||||
data: {
|
||||
code: payload.couponCode,
|
||||
},
|
||||
});
|
||||
return response.data;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
if (isAxiosError(err))
|
||||
throw new Error(err.response.data.message || "Something went wrong");
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const getAllTeenybeansLanguages = createAsyncThunk(
|
||||
`PURCHASE:getAllTeenybeansLanguages`,
|
||||
async (paylaod, { rejectWithValue }) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "GET",
|
||||
url: "/akademy/bcc/user/languages",
|
||||
});
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
return rejectWithValue(error.response.data);
|
||||
}
|
||||
}
|
||||
`PURCHASE:getAllTeenybeansLanguages`,
|
||||
async (paylaod, { rejectWithValue }) => {
|
||||
try {
|
||||
const response = await axiosBuzzOne({
|
||||
method: "GET",
|
||||
url: "/akademy/bcc/user/languages",
|
||||
});
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
return rejectWithValue(error.response.data);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export const purchaseSlice = createSlice({
|
||||
name: "purchase",
|
||||
initialState: {
|
||||
currency: localStorage.getItem("currency") || "INR",
|
||||
planDetails: {},
|
||||
planPriceDetails: {
|
||||
RETAIL_PARENT: {},
|
||||
TUTION_EDUCATOR: {},
|
||||
ENTERPRISE_SCHOOL: {},
|
||||
},
|
||||
classes: [],
|
||||
purchaseId: localStorage.getItem("PURCHASE_ID"),
|
||||
purchaseDetails: {},
|
||||
userDetails:
|
||||
(localStorage.getItem("USER_DETAILS") &&
|
||||
JSON.parse(localStorage.getItem("USER_DETAILS"))) ||
|
||||
{},
|
||||
statusByName: {},
|
||||
teenybeansLanguages: [],
|
||||
},
|
||||
reducers: {
|
||||
clearPurchaseCart: (state, action) => {
|
||||
state.purchaseId = undefined;
|
||||
localStorage.removeItem("PURCHASE_ID");
|
||||
state.purchaseDetails = {};
|
||||
state.userDetails = {};
|
||||
localStorage.removeItem("USER_DETAILS");
|
||||
/////////////////////////////////////////////
|
||||
localStorage.removeItem("IS_USER_VERIFIED");
|
||||
localStorage.removeItem("IS_EMAIL_OTP_SENT");
|
||||
},
|
||||
name: "purchase",
|
||||
initialState: {
|
||||
currency: localStorage.getItem("currency") || "INR",
|
||||
planDetails: {},
|
||||
planPriceDetails: {
|
||||
RETAIL_PARENT: {},
|
||||
TUTION_EDUCATOR: {},
|
||||
ENTERPRISE_SCHOOL: {},
|
||||
},
|
||||
classes: [],
|
||||
purchaseId: localStorage.getItem("PURCHASE_ID"),
|
||||
purchaseDetails: {},
|
||||
userDetails:
|
||||
(localStorage.getItem("USER_DETAILS") &&
|
||||
JSON.parse(localStorage.getItem("USER_DETAILS"))) ||
|
||||
{},
|
||||
statusByName: {},
|
||||
teenybeansLanguages: [],
|
||||
},
|
||||
reducers: {
|
||||
clearPurchaseCart: (state, action) => {
|
||||
state.purchaseId = undefined;
|
||||
localStorage.removeItem("PURCHASE_ID");
|
||||
state.purchaseDetails = {};
|
||||
state.userDetails = {};
|
||||
localStorage.removeItem("USER_DETAILS");
|
||||
/////////////////////////////////////////////
|
||||
localStorage.removeItem("IS_USER_VERIFIED");
|
||||
localStorage.removeItem("IS_EMAIL_OTP_SENT");
|
||||
},
|
||||
|
||||
saveUserDetails: (state, action) => {
|
||||
state.userDetails = action.payload;
|
||||
localStorage.setItem("USER_DETAILS", JSON.stringify(action.payload));
|
||||
},
|
||||
},
|
||||
saveUserDetails: (state, action) => {
|
||||
state.userDetails = action.payload;
|
||||
localStorage.setItem("USER_DETAILS", JSON.stringify(action.payload));
|
||||
},
|
||||
},
|
||||
|
||||
extraReducers: (builder) => {
|
||||
builder.addCase(getAkademyPlans.pending, (state, action) => {
|
||||
state.statusByName["plans"] = "pending";
|
||||
});
|
||||
builder.addCase(getAkademyPlans.fulfilled, (state, action) => {
|
||||
state.statusByName["plans"] = "fulfilled";
|
||||
extraReducers: (builder) => {
|
||||
builder.addCase(getAkademyPlans.pending, (state, action) => {
|
||||
state.statusByName["plans"] = "pending";
|
||||
});
|
||||
builder.addCase(getAkademyPlans.fulfilled, (state, action) => {
|
||||
state.statusByName["plans"] = "fulfilled";
|
||||
|
||||
action.payload.data.map((plan) => {
|
||||
const { _id, products, productCategory } = plan;
|
||||
state.planDetails[_id] = plan;
|
||||
if (products && Array.isArray(products) && products.length == 1) {
|
||||
state.planPriceDetails[productCategory][products[0]] = plan;
|
||||
}
|
||||
});
|
||||
});
|
||||
builder.addCase(getAkademyPlans.rejected, (state, action) => {
|
||||
state.statusByName["plans"] = "rejected";
|
||||
});
|
||||
action.payload.data.map((plan) => {
|
||||
const { _id, products, productCategory } = plan;
|
||||
state.planDetails[_id] = plan;
|
||||
if (products && Array.isArray(products) && products.length == 1) {
|
||||
state.planPriceDetails[productCategory][products[0]] = plan;
|
||||
}
|
||||
});
|
||||
});
|
||||
builder.addCase(getAkademyPlans.rejected, (state, action) => {
|
||||
state.statusByName["plans"] = "rejected";
|
||||
});
|
||||
|
||||
builder.addCase(getAkademyClasses.pending, (state, action) => {
|
||||
state.statusByName["classes"] = "pending";
|
||||
});
|
||||
builder.addCase(getAkademyClasses.fulfilled, (state, action) => {
|
||||
state.statusByName["classes"] = "fulfilled";
|
||||
state.classes = ["IK3", "IK2", "IK1", "PG"]?.map((item) =>
|
||||
action.payload.data?.find((el) => el.name === item)
|
||||
);
|
||||
});
|
||||
builder.addCase(getAkademyClasses.rejected, (state, action) => {
|
||||
state.statusByName["classes"] = "rejected";
|
||||
});
|
||||
builder.addCase(getAkademyClasses.pending, (state, action) => {
|
||||
state.statusByName["classes"] = "pending";
|
||||
});
|
||||
builder.addCase(getAkademyClasses.fulfilled, (state, action) => {
|
||||
state.statusByName["classes"] = "fulfilled";
|
||||
state.classes = ["IK3", "IK2", "IK1", "PG"]?.map((item) =>
|
||||
action.payload.data?.find((el) => el.name === item)
|
||||
);
|
||||
});
|
||||
builder.addCase(getAkademyClasses.rejected, (state, action) => {
|
||||
state.statusByName["classes"] = "rejected";
|
||||
});
|
||||
|
||||
builder.addCase(createPurchase.fulfilled, (state, action) => {
|
||||
const purchaseId = action.payload.data._id;
|
||||
state.purchaseId = purchaseId;
|
||||
localStorage.setItem("PURCHASE_ID", purchaseId);
|
||||
});
|
||||
builder.addCase(createPurchase.fulfilled, (state, action) => {
|
||||
const purchaseId = action.payload.data._id;
|
||||
state.purchaseId = purchaseId;
|
||||
localStorage.setItem("PURCHASE_ID", purchaseId);
|
||||
});
|
||||
|
||||
builder.addCase(getPurchaseDetails.fulfilled, (state, action) => {
|
||||
state.purchaseDetails = action.payload.data.data[0];
|
||||
});
|
||||
builder.addCase(getAllTeenybeansLanguages.fulfilled, (state, action) => {
|
||||
state.teenybeansLanguages = action.payload.data;
|
||||
});
|
||||
},
|
||||
builder.addCase(getPurchaseDetails.fulfilled, (state, action) => {
|
||||
state.purchaseDetails = action.payload.data.data[0];
|
||||
console.log("lookData", action.payload);
|
||||
});
|
||||
builder.addCase(getAllTeenybeansLanguages.fulfilled, (state, action) => {
|
||||
state.teenybeansLanguages = action.payload.data;
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
// Action creators are generated for each case reducer function
|
||||
|
|
|
@ -6,14 +6,26 @@ export interface Props {
|
|||
ogImage: string;
|
||||
ogUrl: string;
|
||||
canonicalUrl: string;
|
||||
newSchema1:string;
|
||||
newSchema2:string;
|
||||
newSchema3:string;
|
||||
}
|
||||
|
||||
const { title, description, keywords, ogImage, ogUrl, canonicalUrl } = Astro.props;
|
||||
const { title, description, keywords, ogImage, ogUrl, canonicalUrl, newSchema1, newSchema2, newSchema3 } = Astro.props;
|
||||
---
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-M4948JYT6C"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-M4948JYT6C');
|
||||
</script>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
|
@ -30,6 +42,29 @@ const { title, description, keywords, ogImage, ogUrl, canonicalUrl } = Astro.pro
|
|||
<meta property="og:image" content={ogImage}>
|
||||
<meta property="og:url" content={ogUrl}>
|
||||
<meta property="og:type" content="website">
|
||||
{newSchema1 && (
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: newSchema1,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
{newSchema2 && (
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: newSchema2,
|
||||
}}
|
||||
/>
|
||||
)}{newSchema3 && (
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: newSchema3,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</head>
|
||||
<body>
|
||||
<slot />
|
||||
|
|
|
@ -36,6 +36,6 @@ export async function getStaticPaths() {
|
|||
}
|
||||
}
|
||||
---
|
||||
<Layout title={blogData?.title ?? 'Blog | Akademy'}>
|
||||
<Layout title={blogData?.title ?? 'Blog | Akademy'} description={blogData?.meta_description} canonicalUrl={`https://akadmyapp.com/blogs/${id}`} ogImage={`https://management.beanstalkedu.com/assets/${blogData?.og_img}`} ogUrl={'https://akadmyapp.com'} newSchema1={blogData?.schema1?.replaceAll("\n", "")} newSchema2={blogData?.schema2?.replaceAll("\n", "")} newSchema3={blogData?.schema3?.replaceAll("\n", "")}>
|
||||
<SingleBlog client:only="react" blog={blogData} />
|
||||
</Layout>
|
|
@ -15,6 +15,6 @@ try {
|
|||
blogs = [];
|
||||
}
|
||||
---
|
||||
<Layout title="Akademy Landing - Blogs">
|
||||
<Layout title="aKadmy Blogs | Insights, Tips, and Trends for Early Childhood" description={'Stay updated with the latest trends, insights, and tips on early childhood education. Explore aKadmy’s blog for valuable resources and expert advice.'} canonicalUrl={'https://akadmyapp.com/blogs'}>
|
||||
<AllBlogs client:only="react" />
|
||||
</Layout>
|
48
yarn.lock
48
yarn.lock
|
@ -991,15 +991,15 @@
|
|||
resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"
|
||||
integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
|
||||
|
||||
"@esbuild/linux-x64@0.21.5":
|
||||
"@esbuild/win32-x64@0.21.5":
|
||||
version "0.21.5"
|
||||
resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz"
|
||||
integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
|
||||
resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz"
|
||||
integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
|
||||
|
||||
"@esbuild/linux-x64@0.25.5":
|
||||
"@esbuild/win32-x64@0.25.5":
|
||||
version "0.25.5"
|
||||
resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz"
|
||||
integrity sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==
|
||||
resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz"
|
||||
integrity sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==
|
||||
|
||||
"@eslint-community/eslint-utils@^4.2.0":
|
||||
version "4.7.0"
|
||||
|
@ -1052,29 +1052,10 @@
|
|||
resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz"
|
||||
integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
|
||||
|
||||
"@img/sharp-libvips-linux-x64@1.0.4":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz"
|
||||
integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==
|
||||
|
||||
"@img/sharp-libvips-linuxmusl-x64@1.0.4":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz"
|
||||
integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==
|
||||
|
||||
"@img/sharp-linux-x64@0.33.5":
|
||||
"@img/sharp-win32-x64@0.33.5":
|
||||
version "0.33.5"
|
||||
resolved "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz"
|
||||
integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==
|
||||
optionalDependencies:
|
||||
"@img/sharp-libvips-linux-x64" "1.0.4"
|
||||
|
||||
"@img/sharp-linuxmusl-x64@0.33.5":
|
||||
version "0.33.5"
|
||||
resolved "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz"
|
||||
integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==
|
||||
optionalDependencies:
|
||||
"@img/sharp-libvips-linuxmusl-x64" "1.0.4"
|
||||
resolved "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz"
|
||||
integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==
|
||||
|
||||
"@isaacs/cliui@^8.0.2":
|
||||
version "8.0.2"
|
||||
|
@ -1526,15 +1507,10 @@
|
|||
estree-walker "^2.0.2"
|
||||
picomatch "^4.0.2"
|
||||
|
||||
"@rollup/rollup-linux-x64-gnu@4.42.0":
|
||||
"@rollup/rollup-win32-x64-msvc@4.42.0":
|
||||
version "4.42.0"
|
||||
resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.42.0.tgz"
|
||||
integrity sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==
|
||||
|
||||
"@rollup/rollup-linux-x64-musl@4.42.0":
|
||||
version "4.42.0"
|
||||
resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.42.0.tgz"
|
||||
integrity sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==
|
||||
resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.42.0.tgz"
|
||||
integrity sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==
|
||||
|
||||
"@shikijs/core@3.6.0":
|
||||
version "3.6.0"
|
||||
|
|
Loading…
Reference in New Issue