+
{productCategory.title} Products
diff --git a/src/app/api/product_categories/[id]/products/data.ts b/src/app/api/product_categories/[id]/products/data.ts
index e83f9be..7b76d24 100644
--- a/src/app/api/product_categories/[id]/products/data.ts
+++ b/src/app/api/product_categories/[id]/products/data.ts
@@ -1,5 +1,5 @@
-import { productCategories } from '../../data';
import type { IProductCardProps } from '@/components/pages/products/productCard/productCard.d';
+import { productCategoriesData } from '../../data';
// Helper to generate 50 products for a category
export function generateProductsForCategory(
@@ -18,7 +18,7 @@ export function generateProductsForCategory(
// Map of categoryId to products
export const productsByCategory: Record
=
Object.fromEntries(
- productCategories.map((cat) => [
+ productCategoriesData.map((cat) => [
cat.id,
generateProductsForCategory(cat.id, cat.title),
]),
diff --git a/src/app/api/product_categories/[id]/products/route.ts b/src/app/api/product_categories/[id]/products/route.ts
index ac1704d..dac8508 100644
--- a/src/app/api/product_categories/[id]/products/route.ts
+++ b/src/app/api/product_categories/[id]/products/route.ts
@@ -1,14 +1,14 @@
import { NextResponse, NextRequest } from 'next/server';
import { cookies } from 'next/headers';
-import { productCategories } from '../../data';
import { generateProductsForCategory } from './data';
+import { productCategoriesData } from '../../data';
export async function GET(request: NextRequest, context: any) {
const cookieStore = await cookies();
const lang = cookieStore.get('locale')?.value || 'en';
const params = await context.params;
- const category = productCategories.find((cat) => cat.id === params.id);
+ const category = productCategoriesData.find((cat) => cat.id === params.id);
if (!category) {
return NextResponse.json({ error: 'Not found' }, { status: 404 });
diff --git a/src/app/api/product_categories/[id]/route.ts b/src/app/api/product_categories/[id]/route.ts
index f005af1..a82936e 100644
--- a/src/app/api/product_categories/[id]/route.ts
+++ b/src/app/api/product_categories/[id]/route.ts
@@ -2,7 +2,7 @@
import { NextResponse, NextRequest } from 'next/server';
import { cookies } from 'next/headers';
-import { productCategories } from '../data';
+import { productCategoriesData } from '../data';
interface IContext {
params: {
@@ -20,7 +20,7 @@ export async function GET(request: NextRequest, context: any) {
const { id } = params;
- let category = productCategories.find((cat) => cat.id === id);
+ let category = productCategoriesData.find((cat) => cat.id === id);
if (!category) {
return NextResponse.json({ error: 'Not found' }, { status: 404 });
diff --git a/src/app/api/product_categories/data.ts b/src/app/api/product_categories/data.ts
index dbdddff..83c0378 100644
--- a/src/app/api/product_categories/data.ts
+++ b/src/app/api/product_categories/data.ts
@@ -1,4 +1,4 @@
-export const productCategories = [
+export const productCategoriesData = [
{
id: '1',
title: 'Ghazaghi',
diff --git a/src/app/api/product_categories/route.ts b/src/app/api/product_categories/route.ts
index 7652ca3..3a39120 100644
--- a/src/app/api/product_categories/route.ts
+++ b/src/app/api/product_categories/route.ts
@@ -1,63 +1,36 @@
import { NextResponse } from 'next/server';
import { cookies } from 'next/headers';
-import { productCategories } from './data';
+import { APIProductCategoryEntity } from '@/models/api';
+import { productCategoriesData } from './data';
export async function GET(request: Request) {
- let data = productCategories;
+ try {
+ let data = productCategoriesData as APIProductCategoryEntity[];
- const cookieStore = await cookies();
- const lang = (await cookieStore).get('lang')?.value || 'fa';
+ const cookieStore = await cookies();
+ const lang = (await cookieStore).get('locale')?.value || 'en';
+ console.log('!!!!!!!!!!!!!!!!!!!!');
+ console.log(lang);
- if (lang === 'fa') {
- data = productCategories.map(
- ({
- id,
- title,
- fa_title,
- icon,
- typesCount,
- priceTypeTitle,
- fa_priceTypeTitle,
- meta_description,
- meta_keywords,
- meta_title,
- slug,
- bestForTitle,
- fa_bestForTitle,
- description,
- fa_description,
- }) => {
- if (lang === 'fa') {
- return {
- id,
- icon,
- typesCount,
- meta_description,
- meta_keywords,
- meta_title,
- slug,
- title: fa_title || title,
- priceTypeTitle: fa_priceTypeTitle || priceTypeTitle,
- bestForTitle: fa_bestForTitle || bestForTitle,
- description: fa_description || description,
- };
- }
- return {
- id,
- icon,
- typesCount,
- title,
- priceTypeTitle,
- bestForTitle,
- meta_description,
- meta_keywords,
- meta_title,
- slug,
- description,
- };
- },
+ if (lang === 'fa') {
+ data = productCategoriesData.map((productCategory) => ({
+ ...productCategory,
+ title: (lang && productCategory.fa_title) || productCategory.title,
+ priceTypeTitle:
+ productCategory.fa_priceTypeTitle || productCategory.priceTypeTitle,
+ bestForTitle:
+ productCategory.fa_bestForTitle || productCategory.bestForTitle,
+ description:
+ productCategory.fa_description || productCategory.description,
+ }));
+ }
+
+ return NextResponse.json({ data });
+ } catch (error) {
+ console.error('Error fetching product categories:', error);
+ return NextResponse.json(
+ { error: 'Failed to fetch product categories' },
+ { status: 500 },
);
}
-
- return NextResponse.json({ data: productCategories });
}
diff --git a/src/app/api/sitemapBuilder/route.ts b/src/app/api/sitemapBuilder/route.ts
new file mode 100644
index 0000000..f83f744
--- /dev/null
+++ b/src/app/api/sitemapBuilder/route.ts
@@ -0,0 +1,56 @@
+'use server';
+
+// app/(api)/sitemap/route.ts
+import { NextResponse } from 'next/server';
+import { productCategoriesData } from '../product_categories/data';
+import { host } from '@/config';
+import { projects } from '../projects/data';
+
+const pages = [
+ '/',
+ '/about-us',
+ '/contact-us',
+ '/blog',
+ '/product-categories',
+ '/projects',
+];
+
+const locales = ['en', 'fa'];
+
+export async function GET() {
+ try {
+ pages.push(
+ ...productCategoriesData.map(
+ (productCategory) => `/product-categories/${productCategory.id}`,
+ ),
+ );
+ pages.push(...projects.map((project) => `/projects/${project.id}`));
+
+ const urls = pages.flatMap((page) =>
+ locales.map((locale) => {
+ const loc = `/${locale}`;
+ return `
+
+ ${host}${loc}${page}
+ weekly
+ 0.8
+
+ `;
+ }),
+ );
+
+ const xml = `
+
+ ${urls.join('\n')}
+ `;
+
+ return new NextResponse(xml, {
+ headers: {
+ 'Content-Type': 'application/xml',
+ },
+ });
+ } catch (err) {
+ console.error('Sitemap generation failed:', err);
+ return new NextResponse('Internal Server Errorsssssss', { status: 500 });
+ }
+}
diff --git a/src/components/layout/header/index.tsx b/src/components/layout/header/index.tsx
index 2917b3d..e6a74c8 100644
--- a/src/components/layout/header/index.tsx
+++ b/src/components/layout/header/index.tsx
@@ -5,15 +5,20 @@ import Navbar from '../navbar';
import Button, { IconButton } from '@/components/uikit/button';
import { Icon } from '@/components/uikit/icons';
import { useTranslations } from 'next-intl';
+import routeFactory from '@/assets/constants/routeFactory';
+import { useParams } from 'next/navigation';
export default function Header() {
const t = useTranslations();
+ const params = useParams();
+ const locale = params.locale as string;
const bannerFooter = [
t('com_home_Banner_link1'),
t('com_home_Banner_link2'),
t('com_home_Banner_link3'),
];
+ const routes = routeFactory(t, locale);
return (
-
+
diff --git a/src/components/pages/products/productList/index.tsx b/src/components/pages/products/productList/index.tsx
index c0741af..36dd034 100644
--- a/src/components/pages/products/productList/index.tsx
+++ b/src/components/pages/products/productList/index.tsx
@@ -19,6 +19,10 @@ export default function ProductList({
.then((res) => {
setProducts(res.data);
setPagination(res.pagination);
+
+ document
+ .getElementById('productList')
+ ?.scrollIntoView({ behavior: 'smooth', block: 'start' });
})
.catch((error) => {
console.error('Failed to fetch products:', error);
diff --git a/src/components/pages/project/ProjectGrid.tsx b/src/components/pages/project/ProjectGrid.tsx
index 05f7e6a..936d8a8 100644
--- a/src/components/pages/project/ProjectGrid.tsx
+++ b/src/components/pages/project/ProjectGrid.tsx
@@ -3,7 +3,11 @@ import Link from 'next/link';
import { IProjectCardProps } from './project';
import { getProjects } from '@/services/projects';
-export default async function ProjectsGrid({ projects }) {
+export default async function ProjectsGrid({
+ projects,
+}: {
+ projects: IProjectCardProps[];
+}) {
return (
{projects.map((project, index) => (
diff --git a/src/models/api.d.ts b/src/models/api.d.ts
new file mode 100644
index 0000000..fe99e98
--- /dev/null
+++ b/src/models/api.d.ts
@@ -0,0 +1,13 @@
+export interface APIProductCategoryEntity {
+ id: string;
+ title: string;
+ fa_title?: string;
+ icon: string;
+ typesCount: number;
+ priceTypeTitle: string;
+ fa_priceTypeTitle?: string;
+ bestForTitle: string;
+ fa_bestForTitle?: string;
+ fa_description?: string;
+ description?: string;
+}
diff --git a/src/services/projects.ts b/src/services/projects.ts
index c7594c8..3c33c7a 100644
--- a/src/services/projects.ts
+++ b/src/services/projects.ts
@@ -1,8 +1,6 @@
'use server';
-import { IProjectCardProps } from '@/components/pages/project/project';
import api from '@/lib/axios';
-import { IResponse } from '@/models/response';
import { cookies } from 'next/headers';
export async function getProjects() {
@@ -12,7 +10,6 @@ export async function getProjects() {
headers: {
Cookie: cookiesStore.toString(),
},
-
})
.then(({ data }) => Promise.resolve(data.data))
.catch((error) => Promise.reject(error));