Skip to content

Commit c1a380b

Browse files
Merge pull request #23 from binshops/fixSomeBugs
Fix some bugs
2 parents 3828003 + 9bbb9c6 commit c1a380b

File tree

13 files changed

+1062
-869
lines changed

13 files changed

+1062
-869
lines changed

package-lock.json

Lines changed: 342 additions & 51 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414
"@fortawesome/free-regular-svg-icons": "^6.6.0",
1515
"@fortawesome/free-solid-svg-icons": "^6.6.0",
1616
"@fortawesome/react-fontawesome": "^0.2.2",
17+
"@tanstack/react-query": "^5.74.4",
1718
"axios": "^1.7.8",
1819
"i18next": "^24.0.5",
1920
"next": "14.2.3",
2021
"react": "^18",
2122
"react-dom": "^18",
2223
"react-hot-toast": "^2.4.1",
2324
"react-i18next": "^15.1.4",
24-
"react-query": "^3.39.3",
2525
"sass": "^1.76.0",
2626
"scss": "^0.2.4",
2727
"swiper": "^11.1.1",

src/component/header/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ const Header: FC = () => {
5151
</div>
5252
</div>
5353
<CartContent isOpen={openCart} setIsOpen={setOpenCart} />
54-
<LoadingIndicator />
5554
</header>
5655
);
5756
};

src/component/languageSelector/languageSelector.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import React, { FC, useEffect, useRef, useState } from "react";
2-
32
import styles from "./languageSelector.module.scss";
43
import { useTranslation } from "react-i18next";
54
import { useRouter } from "next/router";
@@ -12,27 +11,33 @@ const LanguageSelector: FC = () => {
1211

1312
const router = useRouter();
1413
const locale = router.locale;
14+
1515
const handleClickOutside = (event: MouseEvent) => {
1616
if (divRef.current && !divRef.current.contains(event.target as Node)) {
1717
setOpenLanguage(false);
1818
}
1919
};
2020

2121
const changeLanguage = (lng: string) => {
22-
i18n.changeLanguage(lng);
23-
const { pathname, query } = router;
24-
router.push({ pathname, query }, undefined, { locale: lng });
22+
if (i18n.language !== lng) {
23+
i18n.changeLanguage(lng);
24+
const { pathname, query } = router;
25+
router.push({ pathname, query }, undefined, { locale: lng });
26+
queryClient.invalidateQueries();
27+
}
2528
setOpenLanguage(false);
26-
queryClient.invalidateQueries();
2729
};
2830

2931
useEffect(() => {
3032
document.addEventListener("mousedown", handleClickOutside);
31-
locale && changeLanguage(locale);
33+
if (locale && i18n.language !== locale) {
34+
changeLanguage(locale);
35+
}
3236
return () => {
3337
document.removeEventListener("mousedown", handleClickOutside);
3438
};
35-
}, []);
39+
}, [locale, i18n.language]);
40+
3641
return (
3742
<div className={styles.languageBox}>
3843
<button

src/component/productDetails/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { FC } from "react";
2-
import { useQuery } from "react-query";
2+
import { useQuery } from "@tanstack/react-query";
33

44
import { FeaturedProductAPI } from "@/const/endPoint";
55
import { FeaturedProductTransformer } from "@/utils/api/transformer/featuredProduct";

src/const/queryClient.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { QueryClient } from "react-query";
1+
import { QueryClient } from "@tanstack/react-query";
22

33
export const queryClient = new QueryClient({
44
defaultOptions: {
55
queries: {
66
staleTime: 5 * 60 * 1000,
7-
cacheTime: 30 * 60 * 1000,
87
retry: 3,
98
retryDelay: (attempt: any) => Math.min(1000 * 2 ** attempt, 30000),
109
refetchOnWindowFocus: true,

src/context/menuContext.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import React, { createContext, useContext, useEffect, useState } from "react";
2-
import { useQuery } from "react-query";
1+
import React, { createContext, useContext, useState, useEffect } from "react";
32
import { getData } from "@/utils/api/fetchData/apiCall";
43
import { MegaMenuAPI } from "@/const/endPoint";
54
import { MegaMenuTransformer } from "@/utils/api/transformer/megaMenu";
65
import { menuItems } from "@/utils/type";
6+
import { useRouter } from "next/router";
77

88
type MegaMenuContextType = menuItems[] | undefined;
99

@@ -13,8 +13,9 @@ export const MegaMenuProvider: React.FC<{
1313
children: React.ReactNode;
1414
initialMenu: menuItems[];
1515
language?: string;
16-
}> = ({ children, initialMenu, language = "en" }) => {
16+
}> = ({ children, initialMenu }) => {
1717
const [clientMenu, setClientMenu] = useState(initialMenu);
18+
const router = useRouter();
1819

1920
useEffect(() => {
2021
const fetchMenu = async () => {
@@ -23,7 +24,7 @@ export const MegaMenuProvider: React.FC<{
2324
};
2425

2526
fetchMenu();
26-
}, [language]);
27+
}, [router.locale]);
2728

2829
return (
2930
<MegaMenuContext.Provider value={clientMenu}>

src/pages/_app.tsx

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,48 +10,40 @@ import { MegaMenuProvider } from "@/context/menuContext";
1010
import { Toaster } from "react-hot-toast";
1111
import "./../../i18n";
1212
import { useRouter } from "next/router";
13-
import { useTranslation } from "react-i18next";
14-
import { QueryClientProvider } from "react-query";
13+
import { QueryClientProvider, HydrationBoundary } from "@tanstack/react-query";
1514
import { queryClient } from "@/const/queryClient";
1615

1716
const inter = Raleway({ subsets: ["latin"] });
1817

1918
export default function App({ Component, pageProps }: AppProps) {
2019
const router = useRouter();
21-
const { i18n } = useTranslation();
22-
2320
useEffect(() => {
2421
if ("scrollRestoration" in window.history) {
2522
window.history.scrollRestoration = "manual";
2623
}
2724
}, [router]);
2825

29-
useEffect(() => {
30-
const { locale } = router;
31-
if (locale) {
32-
i18n.changeLanguage(locale);
33-
}
34-
}, [router.locale]);
35-
3626
return (
3727
<>
3828
<QueryClientProvider client={queryClient}>
39-
<CartProvider>
40-
<MegaMenuProvider
41-
initialMenu={pageProps.menu || []}
42-
language={router.locale}
43-
>
44-
<main className={inter.className}>
45-
<Header />
46-
<div className="container">
47-
<Toaster />
48-
<Component {...pageProps} />
49-
</div>
50-
<NavigationBar />
51-
<Footer />
52-
</main>
53-
</MegaMenuProvider>
54-
</CartProvider>
29+
<HydrationBoundary>
30+
<CartProvider>
31+
<MegaMenuProvider
32+
initialMenu={pageProps.menu || []}
33+
language={router.locale}
34+
>
35+
<main className={inter.className}>
36+
<Header />
37+
<div className="container">
38+
<Toaster />
39+
<Component {...pageProps} />
40+
</div>
41+
<NavigationBar />
42+
<Footer />
43+
</main>
44+
</MegaMenuProvider>
45+
</CartProvider>
46+
</HydrationBoundary>
5547
</QueryClientProvider>
5648
</>
5749
);

src/pages/category/[slug].tsx

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CategoryAPI } from "@/const/endPoint";
1+
import { CategoryAPI, MegaMenuAPI } from "@/const/endPoint";
22
import { getData } from "@/utils/api/fetchData/apiCall";
33
import { GetServerSidePropsContext } from "next";
44
import React, { FC, useState } from "react";
@@ -12,8 +12,9 @@ import { useRouter } from "next/router";
1212
import Placeholder from "@/component/category/placeholder";
1313
import { CategoryTransformer } from "@/utils/api/transformer/category";
1414
import { useMegaMenu } from "@/context/menuContext";
15-
import { useQuery } from "react-query";
15+
import { useQuery } from "@tanstack/react-query";
1616
import MetaTags from "@/component/metaTags";
17+
import { MegaMenuTransformer } from "@/utils/api/transformer/megaMenu";
1718

1819
const fetchCategoryData = async (
1920
categoryId: string,
@@ -37,15 +38,13 @@ const CategoryPage: FC<CategoryPageProps> = ({ initialCategory }) => {
3738
const menu = useMegaMenu();
3839
const page = parseInt(router.query.page as string, 10) || 0;
3940
const categoryId = String(router.query.slug);
40-
const { data: category, isLoading } = useQuery<Category>(
41-
["categoryData", categoryId, page, filterQuery, orderQuery],
42-
() => fetchCategoryData(categoryId, page, filterQuery, orderQuery),
43-
{
44-
initialData: initialCategory || undefined,
45-
enabled: !initialCategory,
46-
refetchOnMount: false,
47-
}
48-
);
41+
const { data: category, isLoading } = useQuery<Category>({
42+
queryKey: ["categoryData", categoryId, page, filterQuery, orderQuery],
43+
queryFn: () => fetchCategoryData(categoryId, page, filterQuery, orderQuery),
44+
initialData: initialCategory || undefined,
45+
enabled: !initialCategory,
46+
refetchOnMount: false,
47+
});
4948

5049
if (isLoading) {
5150
return <Placeholder />;
@@ -98,9 +97,10 @@ export async function getServerSideProps(context: GetServerSidePropsContext) {
9897
page,
9998
});
10099
const data = CategoryTransformer(categoryData);
101-
100+
const megaMenuData = await getData(MegaMenuAPI);
101+
const menu = MegaMenuTransformer(megaMenuData).menuItems;
102102
return {
103-
props: { initialCategory: data },
103+
props: { initialCategory: data, menu },
104104
};
105105
}
106106

src/pages/index.tsx

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,56 @@
11
import MainSlider from "@/component/mainSlider";
22
import HomeCategory from "@/component/homeCategory";
33
import ProductCarousel from "@/component/productCarousel";
4-
import { HomePageAPI } from "@/const/endPoint";
4+
import { HomePageAPI, MegaMenuAPI } from "@/const/endPoint";
55
import Subscribe from "@/component/subscribe";
66
import InstagramPost from "@/component/instagramPost";
77
import { HomeProps, Product } from "@/utils/type";
8-
import { MegaMenuProvider } from "@/context/menuContext";
98
import { HomeTransformer } from "@/utils/api/transformer/home";
109
import { getData } from "@/utils/api/fetchData/apiCall";
1110
import { useScrollRestoration } from "@/utils/hooks";
12-
import { useQuery } from "react-query";
13-
import { useRouter } from "next/router";
11+
import { useQuery } from "@tanstack/react-query";
1412
import { GetServerSidePropsContext } from "next";
1513
import MetaTags from "@/component/metaTags";
14+
import { MegaMenuTransformer } from "@/utils/api/transformer/megaMenu";
1615

1716
const fetchCHomeData = async () => {
1817
const data = await getData(HomePageAPI);
1918
return HomeTransformer(data).homeProductCarousel;
2019
};
2120

22-
export default function Home({
23-
homeProductCarousel,
24-
menu,
25-
}: HomeProps): JSX.Element {
21+
export default function Home({ homeProductCarousel }: HomeProps): JSX.Element {
2622
useScrollRestoration();
27-
const router = useRouter();
28-
const locale = router.locale || "en";
29-
const { data: carouselData } = useQuery<Product[]>(
30-
["homePage"],
31-
() => fetchCHomeData(),
3223

33-
{
34-
initialData: homeProductCarousel || undefined,
35-
enabled: !homeProductCarousel,
36-
refetchOnMount: false,
37-
}
38-
);
24+
const { data: carouselData } = useQuery<Product[]>({
25+
queryKey: ["homePage"],
26+
queryFn: () => fetchCHomeData(),
27+
initialData: homeProductCarousel || undefined,
28+
enabled: !homeProductCarousel,
29+
refetchOnMount: false,
30+
});
3931

4032
return (
4133
<>
42-
<MegaMenuProvider initialMenu={menu} language={locale}>
43-
<MetaTags />
44-
<MainSlider />
45-
<HomeCategory />
46-
<ProductCarousel product={carouselData} />
47-
<Subscribe />
48-
<InstagramPost />
49-
</MegaMenuProvider>
34+
<MetaTags />
35+
<MainSlider />
36+
<HomeCategory />
37+
<ProductCarousel product={carouselData} />
38+
<Subscribe />
39+
<InstagramPost />
5040
</>
5141
);
5242
}
5343

5444
export async function getServerSideProps(context: GetServerSidePropsContext) {
5545
const referer = context.req.headers.referer || null;
46+
5647
if (!referer) {
5748
const data = await getData(HomePageAPI);
5849
const { homeProductCarousel } = HomeTransformer(data);
59-
60-
return { props: { homeProductCarousel } };
50+
const megaMenuData = await getData(MegaMenuAPI);
51+
const menu = MegaMenuTransformer(megaMenuData).menuItems;
52+
return { props: { homeProductCarousel, menu } };
6153
}
62-
return { props: { homeProductCarousel: null } };
54+
55+
return { props: { homeProductCarousel: null, menu: [] } };
6356
}

0 commit comments

Comments
 (0)