Merge pull request 'fix-seo done for all pages' (#1) from feat/seo into master

Reviewed-on: #1
pull/3/head
Subhodip Ghosh 2025-06-10 09:39:24 +00:00
commit 1e078032df
16 changed files with 837 additions and 499 deletions

View File

@ -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/

2
package-lock.json generated
View File

@ -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": {

44
public/blogs-sitemap.xml Normal file
View File

@ -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>

View File

@ -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>

197
public/images-sitemap.xml Normal file
View File

@ -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>

View File

@ -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>

4
public/robots.txt Normal file
View File

@ -0,0 +1,4 @@
User-agent: *
Allow: /
Disallow: /_DIZ_ADMIN/
Sitemap: https://akadmyapp.com/sitemap.xml

14
public/sitemap.xml Normal file
View File

@ -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>

View File

@ -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}`);

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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 />

View File

@ -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>

View File

@ -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 aKadmys blog for valuable resources and expert advice.'} canonicalUrl={'https://akadmyapp.com/blogs'}>
<AllBlogs client:only="react" />
</Layout>

View File

@ -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"