update optimize
Build and Deploy Docker Images / build_and_deploy (push) Has been cancelled

This commit is contained in:
hamid zarghami
2026-06-06 15:06:19 +03:30
parent c9d152fbaf
commit 804f6f69ae
8 changed files with 103 additions and 20 deletions
-4
View File
@@ -5,7 +5,3 @@ self.addEventListener('install', (event) => {
self.addEventListener('activate', (event) => { self.addEventListener('activate', (event) => {
event.waitUntil(self.clients.claim()); event.waitUntil(self.clients.claim());
}); });
self.addEventListener('fetch', (event) => {
event.respondWith(fetch(event.request));
});
@@ -5,7 +5,7 @@ import { useParams } from "next/navigation";
export const useGetAbout = () => { export const useGetAbout = () => {
const { name } = useParams<{ name: string }>(); const { name } = useParams<{ name: string }>();
return useQuery({ return useQuery({
queryKey: ["about"], queryKey: ["about", name],
queryFn: () => api.getAbout(name), queryFn: () => api.getAbout(name),
enabled: !!name, enabled: !!name,
retry: false, retry: false,
@@ -17,7 +17,7 @@ export const useGetAbout = () => {
export const useGetReviews = () => { export const useGetReviews = () => {
const { name } = useParams<{ name: string }>(); const { name } = useParams<{ name: string }>();
return useQuery({ return useQuery({
queryKey: ["reviews"], queryKey: ["reviews", name],
queryFn: () => api.getReviews(name), queryFn: () => api.getReviews(name),
enabled: !!name, enabled: !!name,
retry: false, retry: false,
@@ -27,7 +27,7 @@ export const useGetReviews = () => {
export const useGetSchedules = () => { export const useGetSchedules = () => {
const { name } = useParams<{ name: string }>(); const { name } = useParams<{ name: string }>();
return useQuery({ return useQuery({
queryKey: ["schedules"], queryKey: ["schedules", name],
queryFn: () => api.getSchedules(name), queryFn: () => api.getSchedules(name),
enabled: !!name, enabled: !!name,
retry: false, retry: false,
+4 -2
View File
@@ -6,7 +6,7 @@ import { hasAuthToken } from "@/lib/api/func";
export const useGetFoods = () => { export const useGetFoods = () => {
const { name } = useParams<{ name: string }>(); const { name } = useParams<{ name: string }>();
return useQuery({ return useQuery({
queryKey: ["menu"], queryKey: ["menu", name],
queryFn: () => api.getFoods(name), queryFn: () => api.getFoods(name),
enabled: !!name, enabled: !!name,
staleTime: 5 * 60_000, staleTime: 5 * 60_000,
@@ -17,9 +17,11 @@ export const useGetFoods = () => {
export const useGetCategories = () => { export const useGetCategories = () => {
const { name } = useParams<{ name: string }>(); const { name } = useParams<{ name: string }>();
return useQuery({ return useQuery({
queryKey: ["categories"], queryKey: ["categories", name],
queryFn: () => api.getCategories(name), queryFn: () => api.getCategories(name),
enabled: !!name, enabled: !!name,
staleTime: 5 * 60_000,
refetchOnMount: false,
}); });
}; };
+11 -3
View File
@@ -1,10 +1,12 @@
import type { Metadata, Viewport } from "next"; import type { Metadata, Viewport } from "next";
import { dehydrate, HydrationBoundary } from "@tanstack/react-query";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import { getRestaurant } from "@/app/[name]/lib/getRestaurant";
import { import {
buildRestaurantMetadata, buildRestaurantMetadata,
buildRestaurantViewport, buildRestaurantViewport,
} from "@/app/[name]/lib/restaurantMetadata"; } from "@/app/[name]/lib/restaurantMetadata";
import { prefetchMenuPageData } from "@/app/[name]/lib/prefetchMenuPage";
import { getQueryClient } from "@/lib/query/getQueryClient";
import MenuIndex from "./components/MenuIndex"; import MenuIndex from "./components/MenuIndex";
type PageParams = { name: string }; type PageParams = { name: string };
@@ -33,14 +35,20 @@ export default async function Page({
params: Promise<PageParams>; params: Promise<PageParams>;
}) { }) {
const { name } = await params; const { name } = await params;
const queryClient = getQueryClient();
try { try {
await getRestaurant(name); await prefetchMenuPageData(queryClient, name);
} catch (error) { } catch (error) {
if (error instanceof Error && error.message === "RESTAURANT_NOT_FOUND") { if (error instanceof Error && error.message === "RESTAURANT_NOT_FOUND") {
notFound(); notFound();
} }
throw error;
} }
return <MenuIndex />; return (
<HydrationBoundary state={dehydrate(queryClient)}>
<MenuIndex />
</HydrationBoundary>
);
} }
+26
View File
@@ -0,0 +1,26 @@
import type { QueryClient } from "@tanstack/react-query";
import {
fetchAboutResponse,
fetchCategoriesResponse,
fetchFoodsResponse,
} from "./serverMenuFetch";
export async function prefetchMenuPageData(
queryClient: QueryClient,
name: string,
) {
await Promise.all([
queryClient.prefetchQuery({
queryKey: ["about", name],
queryFn: () => fetchAboutResponse(name),
}),
queryClient.prefetchQuery({
queryKey: ["menu", name],
queryFn: () => fetchFoodsResponse(name),
}),
queryClient.prefetchQuery({
queryKey: ["categories", name],
queryFn: () => fetchCategoriesResponse(name),
}),
]);
}
+39
View File
@@ -0,0 +1,39 @@
import axios from "axios";
import { API_BASE_URL } from "@/config/const";
import type { AboutResponse } from "../(Main)/about/types/Types";
import type { CategoriesResponse, FoodsResponse } from "../(Main)/types/Types";
import { getRestaurant, RESTAURANT_FETCH_TIMEOUT_MS } from "./getRestaurant";
function createServerAxios(slug: string) {
return axios.create({
baseURL: API_BASE_URL,
headers: {
"Content-Type": "application/json",
"X-SLUG": slug,
},
timeout: RESTAURANT_FETCH_TIMEOUT_MS,
});
}
export async function fetchAboutResponse(slug: string): Promise<AboutResponse> {
const restaurant = await getRestaurant(slug);
return { success: true, data: restaurant };
}
export async function fetchFoodsResponse(slug: string): Promise<FoodsResponse> {
const client = createServerAxios(slug);
const { data } = await client.get<FoodsResponse>(
`/public/foods/restaurant/${slug}`,
);
return data;
}
export async function fetchCategoriesResponse(
slug: string,
): Promise<CategoriesResponse> {
const client = createServerAxios(slug);
const { data } = await client.get<CategoriesResponse>(
`/public/categories/restaurant/${slug}`,
);
return data;
}
+2 -8
View File
@@ -47,10 +47,7 @@ export async function GET(
return NextResponse.json(manifest, { return NextResponse.json(manifest, {
headers: { headers: {
"Content-Type": "application/manifest+json", "Content-Type": "application/manifest+json",
"Cache-Control": "Cache-Control": "public, max-age=300, stale-while-revalidate=600",
"no-store, no-cache, must-revalidate, proxy-revalidate",
Pragma: "no-cache",
Expires: "0",
}, },
}); });
} catch (error) { } catch (error) {
@@ -79,10 +76,7 @@ export async function GET(
return NextResponse.json(manifest, { return NextResponse.json(manifest, {
headers: { headers: {
"Content-Type": "application/manifest+json", "Content-Type": "application/manifest+json",
"Cache-Control": "Cache-Control": "public, max-age=300, stale-while-revalidate=600",
"no-store, no-cache, must-revalidate, proxy-revalidate",
Pragma: "no-cache",
Expires: "0",
}, },
}); });
} }
+18
View File
@@ -0,0 +1,18 @@
import { QueryClient } from "@tanstack/react-query";
import { cache } from "react";
export const getQueryClient = cache(
() =>
new QueryClient({
defaultOptions: {
queries: {
retry: false,
retryOnMount: false,
staleTime: 5 * 60_000,
},
mutations: {
retry: false,
},
},
}),
);