From de45b1f1974083acb9a3de03ab503c919e3d7269 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 21 Jun 2026 14:52:20 +0330 Subject: [PATCH] Cache --- .../[name]/(Main)/about/hooks/useAboutData.ts | 13 +- .../[name]/(Main)/components/MenuIndex.tsx | 6 +- src/app/[name]/(Main)/hooks/useMenuData.ts | 43 ++- src/app/[name]/(Main)/loading.tsx | 10 - src/app/layout.tsx | 2 + src/app/loading.tsx | 10 - src/components/ThemeBootScript.tsx | 10 + src/components/ThemeColorSetter.tsx | 14 +- src/components/background/AppBackground.tsx | 42 +-- .../background/PatternBackgroundProvider.tsx | 110 +++++-- src/components/navigation/BottomNavBar.tsx | 17 +- src/components/navigation/BottomNavLink.tsx | 10 +- .../navigation/BottomNavLinkBig.tsx | 6 +- src/components/overlays/LoadingOverlay.tsx | 18 +- src/components/overlays/SplashScreen.tsx | 7 +- src/components/wrapper/PreferenceWrapper.tsx | 113 +++++-- src/features/providers/ReactQueryProvider.tsx | 42 ++- src/lib/helpers/themeBootScript.ts | 3 + src/lib/helpers/themeCache.ts | 303 ++++++++++++++++++ 19 files changed, 622 insertions(+), 157 deletions(-) delete mode 100644 src/app/[name]/(Main)/loading.tsx delete mode 100644 src/app/loading.tsx create mode 100644 src/components/ThemeBootScript.tsx create mode 100644 src/lib/helpers/themeBootScript.ts create mode 100644 src/lib/helpers/themeCache.ts diff --git a/src/app/[name]/(Main)/about/hooks/useAboutData.ts b/src/app/[name]/(Main)/about/hooks/useAboutData.ts index 6dfd592..292c24a 100644 --- a/src/app/[name]/(Main)/about/hooks/useAboutData.ts +++ b/src/app/[name]/(Main)/about/hooks/useAboutData.ts @@ -1,16 +1,23 @@ import { useQuery } from "@tanstack/react-query"; -import * as api from "../service/AboutService"; import { useParams } from "next/navigation"; +import * as api from "../service/AboutService"; +import { setPersistedAboutData } from "@/lib/helpers/themeCache"; export const useGetAbout = () => { const { name } = useParams<{ name: string }>(); return useQuery({ queryKey: ["about", name], - queryFn: () => api.getAbout(name), + queryFn: async () => { + const data = await api.getAbout(name); + setPersistedAboutData(name, data); + return data; + }, enabled: !!name, retry: false, - staleTime: 5 * 60_000, + staleTime: 60 * 60_000, + gcTime: 24 * 60 * 60_000, refetchOnMount: false, + refetchOnWindowFocus: false, }); }; diff --git a/src/app/[name]/(Main)/components/MenuIndex.tsx b/src/app/[name]/(Main)/components/MenuIndex.tsx index 44304b8..e54d7c6 100644 --- a/src/app/[name]/(Main)/components/MenuIndex.tsx +++ b/src/app/[name]/(Main)/components/MenuIndex.tsx @@ -22,12 +22,12 @@ import type { Category, Food } from "../types/Types"; const sortings = ["PopularityDescending", "RateDescending", "PriceAscending", "PriceDescending"] as const; const MenuIndex = () => { - const { data: foodsData, isLoading: foodsLoading } = useGetFoods(); - const { data: categoriesData, isLoading: categoriesLoading } = useGetCategories(); + const { data: foodsData, isPending: foodsPending } = useGetFoods(); + const { data: categoriesData, isPending: categoriesPending } = useGetCategories(); const foods = useMemo(() => foodsData?.data || [], [foodsData?.data]); const categories = useMemo(() => categoriesData?.data || [], [categoriesData?.data]); - const isLoading = foodsLoading || categoriesLoading; + const isLoading = foodsPending || categoriesPending; const { t: tCommon } = useTranslation("common"); const { t: tMenu } = useTranslation("menu", { keyPrefix: "Menu" }); const { state: filterModal, toggle: toggleFilterModal } = useToggle(); diff --git a/src/app/[name]/(Main)/hooks/useMenuData.ts b/src/app/[name]/(Main)/hooks/useMenuData.ts index dec230e..ebe42af 100644 --- a/src/app/[name]/(Main)/hooks/useMenuData.ts +++ b/src/app/[name]/(Main)/hooks/useMenuData.ts @@ -1,28 +1,63 @@ +"use client"; + import { useQuery } from "@tanstack/react-query"; +import { useEffect } from "react"; import * as api from "../service/MenuService"; import { useParams } from "next/navigation"; import { hasAuthToken } from "@/lib/api/func"; +import { + getPersistedCategoriesData, + getPersistedMenuData, + setPersistedCategoriesData, + setPersistedMenuData, +} from "@/lib/helpers/themeCache"; export const useGetFoods = () => { const { name } = useParams<{ name: string }>(); - return useQuery({ + const query = useQuery({ queryKey: ["menu", name], - queryFn: () => api.getFoods(name), + queryFn: async () => { + const data = await api.getFoods(name); + setPersistedMenuData(name, data); + return data; + }, enabled: !!name, staleTime: 5 * 60_000, refetchOnMount: false, + placeholderData: () => (name ? getPersistedMenuData(name) : undefined), }); + + useEffect(() => { + if (name && query.data) { + setPersistedMenuData(name, query.data); + } + }, [name, query.data]); + + return query; }; export const useGetCategories = () => { const { name } = useParams<{ name: string }>(); - return useQuery({ + const query = useQuery({ queryKey: ["categories", name], - queryFn: () => api.getCategories(name), + queryFn: async () => { + const data = await api.getCategories(name); + setPersistedCategoriesData(name, data); + return data; + }, enabled: !!name, staleTime: 5 * 60_000, refetchOnMount: false, + placeholderData: () => (name ? getPersistedCategoriesData(name) : undefined), }); + + useEffect(() => { + if (name && query.data) { + setPersistedCategoriesData(name, query.data); + } + }, [name, query.data]); + + return query; }; export const useGetNotificationsCount = () => { diff --git a/src/app/[name]/(Main)/loading.tsx b/src/app/[name]/(Main)/loading.tsx deleted file mode 100644 index a21843d..0000000 --- a/src/app/[name]/(Main)/loading.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import LoadingOverlay from '@/components/overlays/LoadingOverlay' -import React from 'react' - -function Loading() { - return ( - - ) -} - -export default Loading \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2eba3e3..6341547 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -7,6 +7,7 @@ import initTranslations from '@/lib/i18n'; import TranslationsProvider from "@/components/utils/TranslationsProdiver"; import ToastContainer from "@/components/Toast"; import { ThemeColorSetter } from "@/components/ThemeColorSetter"; +import { ThemeBootScript } from "@/components/ThemeBootScript"; import PwaServiceWorker from "@/components/PwaServiceWorker"; export const metadata: Metadata = { @@ -48,6 +49,7 @@ export default async function RootLayout({ className={`antialiased bg-background h-svh overflow-hidden`} > + - ) -} - -export default Loading \ No newline at end of file diff --git a/src/components/ThemeBootScript.tsx b/src/components/ThemeBootScript.tsx new file mode 100644 index 0000000..74012c6 --- /dev/null +++ b/src/components/ThemeBootScript.tsx @@ -0,0 +1,10 @@ +import { getThemeBootScript } from "@/lib/helpers/themeBootScript"; + +export function ThemeBootScript() { + return ( +