diff --git a/src/app/blogs/[id]/page.tsx b/src/app/blogs/[id]/page.tsx index 782aec4..39d97c9 100644 --- a/src/app/blogs/[id]/page.tsx +++ b/src/app/blogs/[id]/page.tsx @@ -1,16 +1,80 @@ +'use client' import Image from 'next/image' -import { Calendar, Eye, User } from 'iconsax-react' +import { Calendar, Eye, User, Share } from 'iconsax-react' import LastPost from '../components/LastPost' import { NextPage } from 'next' import Layout from '@/hoc/Layout' import { SHOP_CONFIG } from '@/config/const' +import { useGetBlogDetails, useGetLastBlogs } from '../hooks/useBlogData' +import { useParams } from 'next/navigation' +import { useEffect, useState } from 'react' const BlogDetail: NextPage = () => { + + const { id } = useParams() + const { data, isLoading } = useGetBlogDetails(id as string) + const { data: lastBlogsData } = useGetLastBlogs(3) + const [currentUrl, setCurrentUrl] = useState('') + + useEffect(() => { + if (typeof window !== 'undefined') { + setCurrentUrl(window.location.href) + } + }, []) + + const shareOnTelegram = () => { + const blog = data?.results?.blog + if (blog && currentUrl) { + const text = `مشاهده مقاله: ${blog.title_fa}` + const url = `https://t.me/share/url?url=${encodeURIComponent(currentUrl)}&text=${encodeURIComponent(text)}` + window.open(url, '_blank') + } + } + + const shareOnWhatsApp = () => { + const blog = data?.results?.blog + if (blog && currentUrl) { + const text = `${blog.title_fa}\n\n${currentUrl}` + const url = `https://wa.me/?text=${encodeURIComponent(text)}` + window.open(url, '_blank') + } + } + + const handleNativeShare = async () => { + const blog = data?.results?.blog + if (blog && currentUrl && typeof navigator !== 'undefined' && 'share' in navigator) { + try { + const shareData = { + title: blog.title_fa, + text: `مشاهده مقاله: ${blog.title_fa}`, + url: currentUrl, + } + await (navigator as { share: (data: typeof shareData) => Promise }).share(shareData) + } catch (error) { + console.log('Error sharing:', error) + } + } + } + + if (isLoading) { + return
+
+
+ } + + if (!data?.results?.blog) { + return
+

بلاگ یافت نشد

+
+ } + + const blog = data.results.blog + return (
{/* Breadcrumb */}
- فروشگاه {SHOP_CONFIG.name} / راهنما ها / تست اقلام و قطعات / گلکسی بوک + فروشگاه {SHOP_CONFIG.name} / {blog.category.title_fa} / {blog.title_fa}
@@ -19,25 +83,25 @@ const BlogDetail: NextPage = () => { {/* Blog Header */}
- اخبار + {blog.category.title_fa}

- مشخصات گلکسی بوک 3 پرو و اولترا پیش از رونمایی فاش شد + {blog.title_fa}

- نویسنده: حمید ضرغامی + نویسنده: {blog.author.fullName}
- چهارشنبه 15 آذر 1401 ساعت 15:30 + {new Date(blog.createdAt).toLocaleDateString('fa-IR')}
- 1,234 بازدید + {blog.view} بازدید
@@ -45,8 +109,8 @@ const BlogDetail: NextPage = () => { {/* Featured Image */}
Samsung Galaxy Book3 Ultra {
{/* Blog Content */} -
-

- گلکسی بوک 3 اولترا قوی‌ترین عضو این خانواده خواهد بود که با پردازنده نسل سیزدهم اینتل Core i9-13900H، حداکثر 32 گیگابایت رم LPDDR5 و 1 ترابایت حافظه داخلی NVMe PCIe Gen 4 از آن می‌رسد. این دستگاه همچنین می‌تواند به حداکثر گرافیک RTX 4070 اویدیا مجهز شود. -

- -

گلکسی بوک 3 پرو

- -

- گلکسی بوک 3 پرو در دو اندازه 14 و 16 اینچی عرضه می‌شود که هر دو از نوع اموled با روزنمایی 3K خواهند بود. این لپ‌تاپ قرار است از پردازنده نسل سیزدهم اینتل Core i7-1360P و Core i5-1340P برخوردار شود؛ به‌همراه حداکثر 1 ترابایت حافظه DDR5 رم و 16 گیگابایت استفاده کند 16 گیگابایت رم. -

- -
-

مشخصات فنی کلیدی:

-
    -
  • • پردازنده: Intel Core i9-13900H (نسل سیزدهم)
  • -
  • • رم: تا 32 گیگابایت LPDDR5
  • -
  • • حافظه: 1 ترابایت NVMe PCIe Gen 4
  • -
  • • کارت گرافیک: RTX 4070
  • -
  • • صفحه نمایش: OLED با کیفیت 3K
  • -
  • • سیستم عامل: Windows 11
  • -
-
- -

- این لپ‌تاپ برای کاربران حرفه‌ای طراحی شده که نیاز به قدرت پردازشی بالا برای کارهای گرافیکی، ویرایش ویدئو و بازی دارند. طراحی زیبا و ساخت با کیفیت سامسونگ، آن را به گزینه‌ای جذاب برای کسانی تبدیل می‌کند که به دنبال ترکیب عملکرد و زیبایی هستند. -

- -

نتیجه گیری

- -

- سامسونگ با ارائه گلکسی بوک 3 سری، قصد دارد جایگاه خود را در بازار لپ‌تاپ‌های پریمیوم تقویت کند. این محصولات با ترکیب سخت‌افزار قدرتمند و طراحی شیک، می‌توانند رقیبی جدی برای سایر برندهای معتبر باشند. -

-
+
{/* Tags */}
برچسب‌ها: - سامسونگ - گلکسی بوک - لپ‌تاپ - OLED + {blog.tags.map((tag, index) => ( + + {tag} + + ))}
@@ -104,24 +140,35 @@ const BlogDetail: NextPage = () => {
اشتراک‌گذاری: - - + {typeof navigator !== 'undefined' && 'share' in navigator && ( + + )}
-
{/* Sidebar */}
- +
diff --git a/src/app/blogs/hooks/useBlogData.ts b/src/app/blogs/hooks/useBlogData.ts index cfefba1..ec6ced5 100644 --- a/src/app/blogs/hooks/useBlogData.ts +++ b/src/app/blogs/hooks/useBlogData.ts @@ -1,6 +1,6 @@ import * as api from "../service/Service"; import { useQuery } from "@tanstack/react-query"; -import { BlogResponse, BlogCategory } from "../types/Types"; +import { BlogResponse, BlogDetailResponse, BlogCategory } from "../types/Types"; export const useGetBlogs = (page = 1, limit = 20) => { return useQuery({ @@ -17,7 +17,7 @@ export const useGetBlogCategories = () => { }; export const useGetBlogDetails = (id: string) => { - return useQuery({ + return useQuery({ queryKey: ["blog-details", id], queryFn: () => api.getBlogDetails(id), enabled: !!id, @@ -35,3 +35,10 @@ export const useGetBlogsByCategory = ( enabled: !!slug, }); }; + +export const useGetLastBlogs = (limit: number = 3) => { + return useQuery({ + queryKey: ["last-blogs", limit], + queryFn: () => api.getBlogs(1, limit), + }); +}; diff --git a/src/app/blogs/service/Service.ts b/src/app/blogs/service/Service.ts index 4db4ace..655a90b 100644 --- a/src/app/blogs/service/Service.ts +++ b/src/app/blogs/service/Service.ts @@ -1,5 +1,5 @@ import axios from "@/config/axios"; -import { BlogResponse, BlogCategory } from "../types/Types"; +import { BlogResponse, BlogDetailResponse, BlogCategory } from "../types/Types"; export const getBlogs = async ( page: number, @@ -19,7 +19,9 @@ export const getBlogCategories = async (): Promise => { } }; -export const getBlogDetails = async (id: string): Promise => { +export const getBlogDetails = async ( + id: string +): Promise => { const { data } = await axios.get(`/blogs/${id}`); return data; }; diff --git a/src/app/blogs/types/Types.ts b/src/app/blogs/types/Types.ts index 5a7129c..30392a6 100644 --- a/src/app/blogs/types/Types.ts +++ b/src/app/blogs/types/Types.ts @@ -63,3 +63,11 @@ export interface BlogResponse { success: boolean; results: BlogResults; } + +export interface BlogDetailResponse { + status: number; + success: boolean; + results: { + blog: Blog; + }; +}