diff --git a/src/app/blogs/[id]/loading.tsx b/src/app/blogs/[id]/loading.tsx new file mode 100644 index 0000000..fe9235e --- /dev/null +++ b/src/app/blogs/[id]/loading.tsx @@ -0,0 +1,112 @@ +export default function Loading() { + return ( +
+ {/* Blog Title Skeleton */} +
+ +
+ {/* Main Content Column */} +
+ {/* Meta Info Row */} +
+ {/* Category */} +
+
+
+
+ + {/* Author */} +
+
+
+
+ + {/* Date */} +
+
+
+
+
+ + {/* Featured Image */} +
+
+
+ + {/* Content Paragraphs */} +
+
+
+
+
+
+
+
+
+
+
+
+ + {/* Share Section */} +
+
+
+
+
+
+
+ + {/* Sidebar Column */} +
+ {/* Most Visited */} +
+
+ +
+ {[1, 2, 3, 4].map((i) => ( +
+
+
+
+
+
+
+ ))} +
+
+ + {/* Contact Us */} +
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/blogs/[id]/page.tsx b/src/app/blogs/[id]/page.tsx index 8ef1ad4..001ad94 100644 --- a/src/app/blogs/[id]/page.tsx +++ b/src/app/blogs/[id]/page.tsx @@ -1,7 +1,9 @@ +import { Suspense } from 'react' import { dehydrate, HydrationBoundary, QueryClient } from '@tanstack/react-query' import { blogSingleQueryOptions } from '../hooks/useBlogsData' import { NextPage } from 'next' import SingleBlogPage from '../components/SingleBlogPage' +import Loading from './loading' interface PageProps { params: Promise<{ @@ -12,8 +14,17 @@ interface PageProps { const SingleBlog: NextPage = async ({ params }) => { const { id } = await params + return ( + }> + + + ) +} + +async function BlogContent({ id }: { id: string }) { const queryClient = new QueryClient() await queryClient.prefetchQuery(blogSingleQueryOptions(id)) + return ( diff --git a/src/app/blogs/components/BigBlogItem.tsx b/src/app/blogs/components/BigBlogItem.tsx index 96b58f1..c068644 100644 --- a/src/app/blogs/components/BigBlogItem.tsx +++ b/src/app/blogs/components/BigBlogItem.tsx @@ -39,8 +39,9 @@ const BigBlogItem: FC = ({ item }) => { -

-

+
+ {item.previewContent.replace(/<\/?[^>]+(>|$)/g, "")} +
diff --git a/src/app/blogs/components/HeroSection.tsx b/src/app/blogs/components/HeroSection.tsx index 974e259..55b2867 100644 --- a/src/app/blogs/components/HeroSection.tsx +++ b/src/app/blogs/components/HeroSection.tsx @@ -19,7 +19,7 @@ const HeroSection: FC = () => { alt={item.title} width={1920} height={1080} - className='w-full rounded-4xl object-cover xl:mt-14 mt-8 xl:min-h-[210px] min-h-[350px]' + className='w-full rounded-4xl object-cover xl:mt-14 mt-8 xl:min-h-[210px] min-h-[350px] max-h-[450px]' />
@@ -27,8 +27,9 @@ const HeroSection: FC = () => { {item.title} -

-

+
+ {item.previewContent.replace(/<\/?[^>]+(>|$)/g, "")} +
) diff --git a/src/app/blogs/components/SingleBlogPage.tsx b/src/app/blogs/components/SingleBlogPage.tsx index 1255dd2..e9fd076 100644 --- a/src/app/blogs/components/SingleBlogPage.tsx +++ b/src/app/blogs/components/SingleBlogPage.tsx @@ -13,16 +13,17 @@ type Props = { } const SingleBlogPage: FC = ({ id }) => { - const { data } = useGetBlogSingle(id) - if (!data) return
+ + if (!data) return null + return (

{data?.data?.blog?.title}

-
+
@@ -85,7 +86,7 @@ const SingleBlogPage: FC = ({ id }) => {
-
+
diff --git a/src/app/blogs/loading.tsx b/src/app/blogs/loading.tsx new file mode 100644 index 0000000..fb60392 --- /dev/null +++ b/src/app/blogs/loading.tsx @@ -0,0 +1,160 @@ +export default function Loading() { + return ( +
+ {/* Hero Section Skeleton */} +
+
+
+
+
+
+
+ + {/* Secondary Hero Items */} +
+ {[1, 2, 3].map((i) => ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ))} +
+ + {/* Blog Title */} +

+
+

+ + {/* Main Content Area */} +
+ {/* Left Sidebar - Categories */} +
+
+
+ +
+ {[1, 2, 3, 4, 5, 6].map((i) => ( +
+
+
+
+ ))} +
+
+
+ + {/* Center Content - Blog List */} +
+ {[1, 2, 3, 4].map((i) => ( +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+ ))} +
+ + {/* Right Sidebar */} +
+ {/* Most Visited Widget */} +
+
+ +
+ {[1, 2, 3, 4].map((i) => ( +
+
+
+
+
+
+
+ ))} +
+
+ + {/* Contact Us Widget */} +
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + {/* Second Most Visited Widget */} +
+
+ +
+ {[1, 2, 3, 4].map((i) => ( +
+
+
+
+
+
+
+ ))} +
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/blogs/page.tsx b/src/app/blogs/page.tsx index 12333a6..c5a255f 100644 --- a/src/app/blogs/page.tsx +++ b/src/app/blogs/page.tsx @@ -1,6 +1,8 @@ import { HydrationBoundary, dehydrate } from '@tanstack/react-query' import { QueryClient } from '@tanstack/react-query' +import { Suspense } from 'react' import BlogList from './components/BlogList' +import Loading from './loading' import { blogCategoriesQueryOptions, blogsQueryOptions, blogCombinedQueryOptions, mostVisitedBlogsQueryOptions } from './hooks/useBlogsData' export const metadata = { @@ -8,8 +10,15 @@ export const metadata = { description: 'مقالات جذاب، نکات آموزشی و اخبار دنیای نرم‌افزار در مجله داناک', } -export default async function BlogsPage() { +export default function BlogsPage() { + return ( + }> + + + ) +} +async function BlogsContent() { const queryClient = new QueryClient() await queryClient.prefetchQuery(blogsQueryOptions) await queryClient.prefetchQuery(blogCategoriesQueryOptions) diff --git a/src/app/danak-services/DanakServicesContent.tsx b/src/app/danak-services/DanakServicesContent.tsx new file mode 100644 index 0000000..6e7193c --- /dev/null +++ b/src/app/danak-services/DanakServicesContent.tsx @@ -0,0 +1,150 @@ +'use client' +import { Headphone, Profile2User, ShieldTick, TrendUp } from 'iconsax-react' +import { FC } from 'react' +import Image from 'next/image' + +const DanakServicesContent: FC = () => { + return ( +
+
+

+ خدمات داناک +

+ +
+ ما در داناک با ترکیب خلاقیت، تخصص و تکنولوژی‌های روز، راهکارهای نرم‌افزاری منحصربه‌فردی ارائه می‌دهیم که کسب‌وکار شما را به سطحی بالاتر می‌برد. +
+
+ +
+
+
+
+ +
+ +
+ مشاوره +
+
+ +

+ در دنیای امروز، نیاز به راهکارهای نرم‌افزاری که هم از لحاظ عملکردی بهینه و سریع باشند و هم با پیچیدگی‌های فنی و نیازهای خاص کسب‌وکارها همخوانی داشته باشند، بیشتر از همیشه احساس می‌شود. تیم مشاوره داناک با ارائه راهکارهای نرم‌افزاری مدرن، به شما کمک می‌کند تا از ابزارها و فناوری‌های روز دنیا استفاده کرده و فرایندهای کسب‌وکار خود را به شکلی بهینه‌سازی کنید. هدف ما این است که راه‌حل‌هایی با بالاترین کارایی و کمترین زمان اجرا ارائه دهیم تا شما بتوانید با کمترین هزینه و زمان ممکن، بهترین نتیجه را در پروژه‌های خود به دست آورید. چه در زمینه توسعه نرم‌افزارهای خاص، چه در یکپارچه‌سازی سیستم‌ها، مشاوران ما به شما در انتخاب و پیاده‌سازی بهترین گزینه‌ها کمک می‌کنند. +

+
+ +
+ service-1 +
+
+ +
+
+
+ service-1 +
+ +
+
+
+ +
+ +
+ خدمات امنیت +
+
+ +

+ امنیت اطلاعات یکی از مهم‌ترین ارکان هر کسب‌وکاری است که به دنیای دیجیتال وارد می‌شود. در داناک، ما به شما خدمات امنیتی پیشرفته‌ای را ارائه می‌دهیم که تضمین‌کننده حفاظت از داده‌ها و اطلاعات حساس شماست. سرویس‌های امنیتی ما با رعایت استانداردهای جهانی و پیروی از آخرین متدهای امنیتی طراحی شده‌اند تا از تهدیدات احتمالی جلوگیری کنند. از رمزگذاری داده‌ها و پیشگیری از حملات سایبری گرفته تا پیاده‌سازی سیستم‌های احراز هویت چندعاملی، ما با استفاده از ابزارهای پیشرفته و تیم متخصص خود، امنیت سیستم‌ها و زیرساخت‌های شما را تأمین می‌کنیم. با خدمات امنیتی ما، دیگر نگرانی از بابت حفاظت از داده‌ها و حفظ حریم خصوصی نخواهید داشت. +

+
+
+
+ +
+
+
+
+ +
+ +
+ راهکارهای اختصاصی +
+
+ +

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

+
+ +
+ service-1 +
+
+ +
+
+
+ service-1 +
+ +
+
+
+ +
+ +
+ خدمات پشتیبانی +
+
+ +

+ در دنیای پرسرعت فناوری امروز، داشتن پشتیبانی مطمئن و مستمر برای نرم‌افزارها و سیستم‌های شما، نقشی حیاتی در موفقیت کسب‌وکار دارد. در داناک، ما نه تنها در زمان طراحی و پیاده‌سازی راهکارها در کنار شما هستیم، بلکه پس از راه‌اندازی نیز به عنوان یک شریک بلندمدت همراه شما خواهیم بود. خدمات پشتیبانی ما به گونه‌ای طراحی شده است که همیشه در دسترس شما قرار داشته باشیم تا هرگونه چالش یا مشکلی که ممکن است پیش آید، به سرعت و به‌طور مؤثر حل شود. تیم پشتیبانی ما با ارائه مشاوره تخصصی، به‌روزرسانی‌های منظم، رفع اشکالات فنی، و راهنمایی‌های مستمر، به شما کمک می‌کند تا از تمامی امکانات نرم‌افزاری به بهترین شکل ممکن استفاده کنید و هیچ‌گاه دچار اختلال در عملکرد نشوید. هدف ما این است که شما همواره بهترین تجربه کاربری را داشته باشید و هیچ‌وقت در مسیر کسب‌وکارتان تنها نباشید. +

+
+
+
+
+ ) +} + +export default DanakServicesContent \ No newline at end of file diff --git a/src/app/danak-services/loading.tsx b/src/app/danak-services/loading.tsx new file mode 100644 index 0000000..2eb8537 --- /dev/null +++ b/src/app/danak-services/loading.tsx @@ -0,0 +1,103 @@ +export default function Loading() { + return ( +
+ {/* Header Section */} +
+
+
+
+
+
+
+
+ + {/* First Service Section - Consulting */} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + {/* Second Service Section - Security */} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + {/* Third Service Section - Custom Solutions */} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + {/* Fourth Service Section - Support */} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/danak-services/page.tsx b/src/app/danak-services/page.tsx index c4d972d..0263d92 100644 --- a/src/app/danak-services/page.tsx +++ b/src/app/danak-services/page.tsx @@ -1,151 +1,13 @@ -import { Headphone, Profile2User, ShieldTick, TrendUp } from 'iconsax-react' import { NextPage } from 'next' -import Image from 'next/image' -import React from 'react' +import { Suspense } from 'react' +import Loading from './loading' +import DanakServicesContent from './DanakServicesContent' const DanakServices: NextPage = () => { return ( -
-
-

- خدمات داناک -

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

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

-
- -
- service-1 -
-
- -
-
-
- service-1 -
- -
-
-
- -
- -
- خدمات امنیت -
-
- -

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

-
-
-
- -
-
-
-
- -
- -
- راهکارهای اختصاصی -
-
- -

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

-
- -
- service-1 -
-
- -
-
-
- service-1 -
- -
-
-
- -
- -
- خدمات پشتیبانی -
-
- -

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

-
-
-
- - -
+ }> + + ) } diff --git a/src/app/home/HeroSection.tsx b/src/app/home/HeroSection.tsx index 0aa0d55..5d415b2 100644 --- a/src/app/home/HeroSection.tsx +++ b/src/app/home/HeroSection.tsx @@ -22,7 +22,7 @@ const HeroSection: FC = () => { alt='banner' width={1920} height={1080} - className='w-full rounded-4xl object-cover xl:mt-14 mt-8 min-h-[210px]' + className='w-full rounded-4xl object-cover xl:mt-14 mt-8 min-h-[210px] max-h-[500px]' />
diff --git a/src/app/loading.tsx b/src/app/loading.tsx new file mode 100644 index 0000000..52e256a --- /dev/null +++ b/src/app/loading.tsx @@ -0,0 +1,87 @@ +export default function Loading() { + return ( +
+ {/* Hero Section Skeleton */} +
+
+
+
+
+
+
+
+ + {/* Danak Suggested Service Skeleton */} +
+
+
+ +
+ {[1, 2, 3, 4].map((i) => ( +
+
+
+
+
+
+
+
+ ))} +
+
+ + {/* Why Danak Skeleton */} +
+
+
+ +
+ {[1, 2, 3].map((i) => ( +
+
+
+
+
+
+
+ ))} +
+
+ + {/* Blog Skeleton */} +
+
+
+ +
+ {[1, 2, 3].map((i) => ( +
+
+
+
+
+
+
+
+
+
+ ))} +
+
+ + {/* Collaboration Skeleton */} +
+
+
+ +
+ {[1, 2, 3, 4, 5, 6].map((i) => ( +
+
+
+ ))} +
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 50e2bbf..cfda450 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,10 +1,21 @@ import { NextPage } from 'next' +import { Suspense } from 'react' import { HydrationBoundary } from '@tanstack/react-query' import { dehydrate } from '@tanstack/react-query' import { QueryClient } from '@tanstack/react-query' import { landingQueryOptions } from './home/hooks/useHomeData' import LangingPage from './home/LangingPage' -const Home: NextPage = async () => { +import Loading from './loading' + +const Home: NextPage = () => { + return ( + }> + + + ) +} + +async function HomeContent() { const queryClient = new QueryClient() await queryClient.prefetchQuery(landingQueryOptions) diff --git a/src/app/products/loading.tsx b/src/app/products/loading.tsx new file mode 100644 index 0000000..40903de --- /dev/null +++ b/src/app/products/loading.tsx @@ -0,0 +1,93 @@ +export default function Loading() { + return ( +
+ {/* Header Skeleton */} +
+
+
+
+
+
+ + {/* Product Slider Skeleton */} +
+
+ {[1, 2].map((i) => ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ))} +
+
+ + {/* Danak Suggested Service Skeleton */} +
+
+
+
+
+ +
+ {[1, 2, 3, 4].map((i) => ( +
+
+
+
+
+
+
+
+ ))} +
+
+ + {/* Danak Services Skeleton */} +
+
+
+
+
+ +
+ {[1, 2, 3, 4, 5, 6].map((i) => ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ))} +
+
+
+ ) +} \ No newline at end of file diff --git a/src/app/products/page.tsx b/src/app/products/page.tsx index 3692505..e8a53a5 100644 --- a/src/app/products/page.tsx +++ b/src/app/products/page.tsx @@ -1,14 +1,26 @@ import { NextPage } from 'next' +import { Suspense } from 'react' import { HydrationBoundary } from '@tanstack/react-query' import { dehydrate } from '@tanstack/react-query' import { QueryClient } from '@tanstack/react-query' import { categoriesQueryOptions, danakServiceSuggestedQueryOptions, servicesQueryOptions } from './hooks/useProductData' import Products from './ProductsPage' -const ProductsPage: NextPage = async () => { +import Loading from './loading' + +const ProductsPage: NextPage = () => { + return ( + }> + + + ) +} + +async function ProductsContent() { const queryClient = new QueryClient() await queryClient.prefetchQuery(servicesQueryOptions) await queryClient.prefetchQuery(categoriesQueryOptions) await queryClient.prefetchQuery(danakServiceSuggestedQueryOptions) + return (