diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b8b7cba --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/next-ArAB.iml b/.idea/next-ArAB.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/next-ArAB.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..f324872 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/about/page.tsx b/app/about/page.tsx index f15096e..20233de 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -1,3 +1,9 @@ +export const metadata = { + title: "درباره ما", + description: + "فیپ یک گروه متخصص در حوزه اینتگریشن و روش‌های نوین یکپارچه‌سازی. ماموریت، چشم‌انداز و ارزش‌های ما.", +}; + export default function AboutPage() { return ( <> diff --git a/app/api/consulting/route.ts b/app/api/consulting/route.ts new file mode 100644 index 0000000..7e04de0 --- /dev/null +++ b/app/api/consulting/route.ts @@ -0,0 +1,82 @@ +import { NextResponse } from 'next/server' + +/** API بله سازگار با API تلگرام — مستندات: https://dev.bale.ai */ +const BALE_API = 'https://tapi.bale.ai' + +export interface ConsultingRequestBody { + fullName: string + organization: string + phone: string + area: string + description?: string +} + +function escapeHtml(text: string): string { + return text + .replace(/&/g, '&') + .replace(//g, '>') +} + +export async function POST(request: Request) { + const token = process.env.BALE_BOT_TOKEN + const chatId = process.env.BALE_CHAT_ID + + if (!token || !chatId) { + return NextResponse.json( + { + error: + 'بله پیکربندی نشده است. BALE_BOT_TOKEN و BALE_CHAT_ID را در .env.local تنظیم کنید.', + }, + { status: 500 } + ) + } + + let body: ConsultingRequestBody + try { + body = await request.json() + } catch { + return NextResponse.json({ error: 'بدنه درخواست نامعتبر است' }, { status: 400 }) + } + + const { fullName, organization, phone, area, description } = body + if (!fullName?.trim() || !organization?.trim() || !phone?.trim() || !area?.trim()) { + return NextResponse.json({ error: 'فیلدهای الزامی خالی است' }, { status: 400 }) + } + + const lines = [ + '📩 درخواست جدید مشاوره سازمانی', + '────────────────', + `👤 نام و نام خانوادگی: ${escapeHtml(fullName.trim())}`, + `🏢 نام سازمان: ${escapeHtml(organization.trim())}`, + `📱 شماره تماس: ${escapeHtml(phone.trim())}`, + `📋 حوزه مشاوره: ${escapeHtml(area.trim())}`, + ] + if (description?.trim()) { + lines.push('', `💬 توضیحات:\n${escapeHtml(description.trim())}`) + } + + const text = lines.join('\n') + + try { + const res = await fetch(`${BALE_API}/bot${token}/sendMessage`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + chat_id: chatId, + text, + }), + }) + + const data = await res.json().catch(() => ({})) + if (!res.ok) { + return NextResponse.json( + { error: data.description || 'ارسال به بله ناموفق بود' }, + { status: 502 } + ) + } + return NextResponse.json({ ok: true }) + } catch { + return NextResponse.json({ error: 'خطا در ارتباط با بله' }, { status: 502 }) + } +} diff --git a/app/api/revalidate/route.ts b/app/api/revalidate/route.ts new file mode 100644 index 0000000..66c71eb --- /dev/null +++ b/app/api/revalidate/route.ts @@ -0,0 +1,47 @@ +import { revalidateTag } from "next/cache"; +import { NextRequest, NextResponse } from "next/server"; + +/** + * پاک کردن کش مقالات وردپرس. + * وقتی در وردپرس مقاله‌ای منتشر یا ویرایش شد، این آدرس را با secret فراخوانی کنید + * تا کش دانشنامه و مقاله‌ها بدون ریستارت سرور به‌روز شود. + * + * استفاده در وردپرس: + * - با پلاگین Webhook یا کد تم: بعد از save_post درخواست به این آدرس بفرست. + * - مثال: GET یا POST /api/revalidate?secret=YOUR_REVALIDATE_SECRET + * - یا هدر: x-revalidate-secret: YOUR_REVALIDATE_SECRET + */ +export async function GET(request: NextRequest) { + return handleRevalidate(request); +} + +export async function POST(request: NextRequest) { + return handleRevalidate(request); +} + +async function handleRevalidate(request: NextRequest) { + const secret = process.env.REVALIDATE_SECRET; + if (!secret) { + return NextResponse.json( + { error: "REVALIDATE_SECRET تنظیم نشده است." }, + { status: 500 } + ); + } + + const provided = + request.nextUrl.searchParams.get("secret") ?? + request.headers.get("x-revalidate-secret"); + if (provided !== secret) { + return NextResponse.json({ error: "غیرمجاز" }, { status: 401 }); + } + + try { + revalidateTag("blog-posts"); + return NextResponse.json({ revalidated: true, now: Date.now() }); + } catch (err) { + return NextResponse.json( + { error: "خطا در پاک کردن کش" }, + { status: 500 } + ); + } +} diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx index bca79ea..c98f32b 100644 --- a/app/blog/[slug]/page.tsx +++ b/app/blog/[slug]/page.tsx @@ -20,17 +20,33 @@ interface BlogPostPageProps { params: Promise<{ slug: string }>; } +function stripHtml(html: string): string { + return html.replace(/<[^>]*>/g, "").trim(); +} + export async function generateMetadata({ params, }: BlogPostPageProps): Promise { const { slug } = await params; const post = await getPostBySlug(slug); if (!post) return { title: "پست یافت نشد" }; - const title = post.title?.rendered ?? "پست"; - const excerpt = post.excerpt?.rendered?.replace(/<[^>]*>/g, "").trim().slice(0, 160) ?? ""; + const titleRaw = post.title?.rendered ?? "پست"; + const title = stripHtml(titleRaw); + const excerpt = stripHtml(post.excerpt?.rendered ?? "").slice(0, 160); + const imageUrl = getFeaturedImageUrl(post, "medium_large"); return { - title, + title: titleRaw, description: excerpt, + openGraph: { + title, + description: excerpt, + ...(imageUrl && { images: [{ url: imageUrl, alt: title }] }), + }, + twitter: { + card: "summary_large_image", + title, + description: excerpt, + }, }; } diff --git a/app/blog/page.tsx b/app/blog/page.tsx index 560f642..6c74565 100644 --- a/app/blog/page.tsx +++ b/app/blog/page.tsx @@ -11,6 +11,10 @@ const PER_PAGE = 9; export const metadata: Metadata = { title: "دانشنامه", description: "مقالات و مطالب فیپ در زمینه یکپارچه‌سازی، اتوماسیون و بهره‌وری سازمانی.", + openGraph: { + title: "دانشنامه", + description: "مقالات و مطالب فیپ در زمینه یکپارچه‌سازی، اتوماسیون و بهره‌وری سازمانی.", + }, }; interface BlogPageProps { diff --git a/app/consulting/page.tsx b/app/consulting/page.tsx new file mode 100644 index 0000000..1a4a2b0 --- /dev/null +++ b/app/consulting/page.tsx @@ -0,0 +1,290 @@ +import { AspectRatio } from '@/components/ui/aspect-ratio' +import { Button } from '@/components/ui/button' +import { Card, CardContent } from '@/components/ui/card' +import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from '@/components/ui/accordion' +import { ConsultingForm } from '@/components/consulting-form' +import { + Plug2, + Sparkles, + Database, + Shield, + Layout, + BarChart3, + HelpCircle, + Quote, +} from 'lucide-react' +import Link from 'next/link' + +const consultants = [ + { + name: 'مشاور ارشد اینتگریشن', + expertise: ['اینتگریشن سیستم‌ها', 'API', 'اتوماسیون'], + description: + 'بیش از ده سال تجربه در طراحی و پیاده‌سازی راهکارهای یکپارچه‌سازی برای سازمان‌های بزرگ.', + image: '/assets/logo.svg', + fallback: 'م۱', + }, + { + name: 'مشاور هوشمندسازی و RAG', + expertise: ['RAG', 'هوش مصنوعی', 'پردازش زبان طبیعی'], + description: + 'تخصص در طراحی سامانه‌های مبتنی بر دانش و هوشمندسازی فرآیندهای سازمانی.', + image: '/assets/logo.svg', + fallback: 'م۲', + }, + { + name: 'مشاور عملکرد و معماری', + expertise: ['Performance', 'معماری نرم‌افزار', 'مقیاس‌پذیری'], + description: + 'بهینه‌سازی عملکرد سامانه‌ها و طراحی معماری مقیاس‌پذیر و پایدار.', + image: '/assets/logo.svg', + fallback: 'م۳', + }, +] + +const domains = [ + { + title: 'اینتگریشن', + description: 'اتصال سیستم‌ها، APIها و یکپارچه‌سازی داده‌ها و فرآیندها', + icon: Plug2, + }, + { + title: 'هوشمندسازی', + description: 'اتوماسیون و هوشمندسازی فرآیندهای کسب‌وکار', + icon: Sparkles, + }, + { + title: 'RAG', + description: 'سامانه‌های بازیابی و تولید پاسخ مبتنی بر دانش', + icon: Database, + }, + { + title: 'امنیت', + description: 'امنیت داده، احراز هویت و کنترل دسترسی', + icon: Shield, + }, + { + title: 'معماری نرم‌افزار', + description: 'طراحی معماری، میکروسرویس و طراحی سیستم', + icon: Layout, + }, + { + title: 'داده و تحلیل', + description: 'تحلیل داده، گزارش‌گیری و دشبوردهای تحلیلی', + icon: BarChart3, + }, +] + +const faqItems = [ + { + id: 'faq-1', + question: 'مشاوره سازمانی چیست؟', + answer: + 'مشاوره سازمانی خدمتی است که در آن متخصصان با بررسی وضعیت فعلی سازمان، چالش‌ها و اهداف شما، راهکارهای فنی و فرآیندی پیشنهاد می‌دهند. این مشاوره می‌تواند در حوزه‌های اینتگریشن، هوشمندسازی، RAG، بهینه‌سازی عملکرد و معماری نرم‌افزار باشد.', + }, + { + id: 'faq-2', + question: 'چه زمانی می‌توانم انتظار تماس داشته باشم؟', + answer: + 'پس از ثبت درخواست، تیم ما در سریع‌ترین زمان ممکن (معمولاً حداکثر ۲۴ تا ۴۸ ساعت کاری) با شما تماس می‌گیرد تا نیازتان را دقیق‌تر بررسی کنیم و زمان جلسه مشاوره را هماهنگ کنیم.', + }, + { + id: 'faq-3', + question: 'آیا مشاوره اولیه رایگان است؟', + answer: + 'جلسه اول شناخت و تعیین scope معمولاً به صورت رایگان یا با هزینه نمادین انجام می‌شود. جزئیات بسته به نوع درخواست و حجم کار در اولین تماس به شما اعلام می‌شود.', + }, + { + id: 'faq-4', + question: 'برای چه اندازه‌ای از سازمان‌ها مناسب است؟', + answer: + 'خدمات مشاوره ما برای استارتاپ‌ها، شرکت‌های کوچک و متوسط و سازمان‌های بزرگ طراحی شده است. محتوای جلسات و پیشنهادها متناسب با اندازه و نیاز هر سازمان تنظیم می‌شود.', + }, +] + +export const metadata = { + title: 'مشاوره سازمانی', + description: + 'مشاوره تخصصی در حوزه اینتگریشن، هوشمندسازی، RAG، Performance و معماری نرم‌افزار. در سریع‌ترین زمان با شما تماس می‌گیریم.', +} + +export default function ConsultingPage() { + return ( + <> + {/* Section 1: Hero - مشاوره سازمانی */} +
+
+
+
+
+

+ مشاوره سازمانی +

+

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

+

+ شرایط همکاری: پس از ثبت درخواست، تیم ما با شما تماس می‌گیرد؛ جلسه اول برای + شناخت نیازها و تعیین دامنه کار است و در ادامه پیشنهاد و برنامه اجرا ارائه + می‌شود. +

+
+
+ + +
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+ + {/* Section 2: حوزه‌های مشاوره (جابجا شده با مشاوران) */} +
+
+
+

در چه حوزه‌هایی مشاوره می‌دهیم؟

+

+ از اینتگریشن و هوشمندسازی تا RAG و معماری نرم‌افزار +

+
+
+ {domains.map((domain) => { + const Icon = domain.icon + return ( + + +
+
+ +
+
+

{domain.title}

+

+ {domain.description} +

+
+
+
+
+ ) + })} +
+
+
+ + {/* Section 3: چه کسانی مشاوره می‌دهند؟ — سبک Testimonial */} +
+
+
+

چه کسانی مشاوره می‌دهند؟

+

+ تیم مشاوره ما متشکل از متخصصان با تجربه در حوزه‌های مختلف فناوری است. +

+
+
+ {consultants.map((person) => ( + + + +
+ {person.description} +
+
+ + + + {person.fallback} + + +
+

{person.name}

+
+ {person.expertise.map((e) => ( + + {e} + {e !== person.expertise[person.expertise.length - 1] ? ' · ' : ''} + + ))} +
+
+
+
+
+ ))} +
+
+
+ + {/* Section 4: سوالات متداول (جابجا شده با فرم) */} +
+
+
+

سوالات متداول

+

+ پاسخ سوالات رایج درباره مشاوره سازمانی +

+
+ + {faqItems.map((item) => ( + + + {item.question} + + +

{item.answer}

+
+
+ ))} +
+
+
+ + {/* Section 5: فرم درخواست مشاوره (جابجا شده با FAQ) */} +
+
+
+
+

درخواست مشاوره

+

+ فرم زیر را پر کنید؛ در سریع‌ترین زمان ممکن با شما تماس می‌گیریم. +

+
+ + + + + +
+
+
+ + ) +} diff --git a/app/error.tsx b/app/error.tsx new file mode 100644 index 0000000..ade1eb9 --- /dev/null +++ b/app/error.tsx @@ -0,0 +1,32 @@ +'use client' + +import { useEffect } from 'react' +import Link from 'next/link' +import { Button } from '@/components/ui/button' + +export default function Error({ + error, + reset, +}: { + error: Error & { digest?: string } + reset: () => void +}) { + useEffect(() => { + console.error(error) + }, [error]) + + return ( +
+

خطایی رخ داد

+

+ لطفاً دوباره تلاش کنید یا به صفحه اصلی برگردید. +

+
+ + +
+
+ ) +} diff --git a/app/global-not-found.tsx b/app/global-not-found.tsx new file mode 100644 index 0000000..3c19747 --- /dev/null +++ b/app/global-not-found.tsx @@ -0,0 +1,41 @@ +import './globals.css' +import Link from 'next/link' + +export const metadata = { + title: '۴۰۴ | صفحه یافت نشد', + description: 'صفحه‌ای که دنبال آن هستید وجود ندارد.', +} + +export default function GlobalNotFound() { + return ( + + +
+
+ + ۴۰۴ + +
+ +

+ صفحه پیدا نشد +

+

+ به نظر می‌رسد این آدرس وجود ندارد یا منتقل شده است. +

+ + + + صفحه اصلی + +
+ + + ) +} diff --git a/app/layout.tsx b/app/layout.tsx index 1714c82..79fcd52 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,10 +5,16 @@ import { ThemeProvider } from "@/components/theme-provider"; import { TopProgressBar } from "@/components/top-progress-bar"; +const SITE_NAME = "فیپ"; +const DEFAULT_DESCRIPTION = + "فیپ یک سامانه برای ایجاد و طراحی راهکارهای مناسب برای کسب و کار شما است."; + export const metadata: Metadata = { - title: "فیپ", - description: - "فیپ یک سامانه برای ایجاد و طراحی راهکارهای مناسب برای کسب و کار شما است.", + title: { + default: `${SITE_NAME} | راهکارهای یکپارچه و هوشمند برای کسب‌وکار`, + template: `%s | ${SITE_NAME}`, + }, + description: DEFAULT_DESCRIPTION, icons: { icon: "/assets/feep-Logo.svg", }, diff --git a/app/login/page.tsx b/app/login/page.tsx index 3d82022..1ea1755 100644 --- a/app/login/page.tsx +++ b/app/login/page.tsx @@ -1,5 +1,11 @@ +import type { Metadata } from "next"; import { LoginForm } from "@/components/login-form"; +export const metadata: Metadata = { + title: "ورود", + description: "ورود به حساب فیپ", +}; + export default function LoginPage() { return (
diff --git a/app/not-found.tsx b/app/not-found.tsx new file mode 100644 index 0000000..25ca37e --- /dev/null +++ b/app/not-found.tsx @@ -0,0 +1,39 @@ +import Link from 'next/link' +import { Button } from '@/components/ui/button' +import { Home } from 'lucide-react' + +export const metadata = { + title: '۴۰۴', + description: 'صفحه‌ای که دنبال آن هستید یافت نشد.', +} + +export default function NotFound() { + return ( +
+
+
+ + ۴۰۴ + +
+ +

+ صفحه پیدا نشد +

+

+ به نظر می‌رسد این آدرس وجود ندارد یا منتقل شده است. +

+ + +
+
+ ) +} diff --git a/app/page.tsx b/app/page.tsx index 2117cb7..e259557 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,10 +1,15 @@ +import type { Metadata } from "next"; import ContentSection from "@/components/content-1"; import Features from "@/components/features-12"; import { FeaturedPostsGrid } from "@/components/featured-posts-grid"; import { getPosts } from "@/lib/wp-api"; -import { HeroHeader } from "@/components/header"; import HeroSection from "@/components/hero-section"; +export const metadata: Metadata = { + description: + "فیپ؛ راهکارهای یکپارچه و هوشمند برای اتصال سیستم‌ها، اتوماسیون فرآیندها و بهره‌وری کسب‌وکار.", +}; + const FEATURED_CATEGORY_ID = 3; const FEATURED_POSTS_COUNT = 4; @@ -17,9 +22,9 @@ export default async function Home() { orderby: "date", order: "desc", }); - featuredPosts = result.posts; + featuredPosts = result?.posts ?? []; } catch { - // بدون پست هم صفحه رندر می‌شود + featuredPosts = []; } return ( diff --git a/app/pricing/page.tsx b/app/pricing/page.tsx index 3e3dc61..d8a6d2f 100644 --- a/app/pricing/page.tsx +++ b/app/pricing/page.tsx @@ -1,6 +1,12 @@ +import type { Metadata } from "next"; import Pricing from "@/components/pricing"; import PricingComparator from "@/components/pricing-comparator"; +export const metadata: Metadata = { + title: "قیمت‌گذاری", + description: "تعرفه و پلن‌های خدمات فیپ. انتخاب مناسب برای کسب‌وکار شما.", +}; + export default function PricingPage() { return ( <> diff --git a/app/solutions/page.tsx b/app/solutions/page.tsx index 2e45a8e..cf54cde 100644 --- a/app/solutions/page.tsx +++ b/app/solutions/page.tsx @@ -1,74 +1,87 @@ +import type { Metadata } from "next"; import { Button } from "@/components/ui/button"; import { Link as LinkIcon, BarChart3, Share2, Zap, TrendingUp, Workflow } from "lucide-react"; import Link from "next/link"; +export const metadata: Metadata = { + title: "راه حل‌ها", + description: + "راهکارهای فیپ: یکپارچه‌سازی سیستم‌ها، پنل‌های مدیریتی، اتوماسیون فرآیندها و تحلیل داده.", +}; + const solutions = [ { icon: LinkIcon, title: "یکپارچه‌سازی سیستم‌ها", - description: "اتصال و هماهنگ‌سازی سیستم‌ها و سرویس‌های مختلف برای ایجاد جریان یکپارچه داده و فرآیند", + description: + "در بسیاری از شرکت‌ها، نرم‌افزارها و سرویس‌های مختلف مثل CRM، مدیریت مالی یا پشتیبانی با هم ارتباط ندارند. این موضوع باعث اتلاف وقت، اشتباه در داده‌ها و تجربه کاربری ضعیف می‌شود. راهکار یکپارچه‌سازی به شما اجازه می‌دهد تا:", features: [ - "اتصال به سرویس‌ها و APIهای مختلف", - "همگام‌سازی خودکار داده‌ها بین سیستم‌ها", - "ایجاد workflowهای یکپارچه", - "پشتیبانی از پروتکل‌های مختلف ارتباطی" - ] + "سیستم‌های مختلف را به هم وصل کنید و داده‌ها همزمان در همه جا به‌روز شوند", + "داده‌ها بدون دخالت انسانی بین ابزارها منتقل شود", + "فرایندهای تکراری حذف شوند", + ], + result: "این یعنی حذف خطاهای انسانی، صرفه‌جویی در وقت و تمرکز روی تصمیم‌های درست.", }, { icon: BarChart3, - title: "پنل‌های مدیریتی قدرتمند", - description: "ارائه پنل‌های کاربری پیشرفته برای نمایش آمار، تحلیل داده‌ها و مدیریت اطلاعات با رابط کاربری حرفه‌ای", + title: "داشبوردها و پنل‌های مدیریتی قدرتمند", + description: + "داشتن اطلاعات به‌موقع، کلید تصمیم‌گیری دقیق است. راهکارهای مدیریتی پیشرفته امکان می‌دهند تا:", features: [ - "داشبوردهای تعاملی و قابل تنظیم", - "نمایش آمار و گزارش‌های زنده", - "ویرایش و مدیریت اطلاعات از طریق UI", - "نمودارها و تجسم‌های داده پیشرفته" - ] + "همه اطلاعات مهم کسب‌و‌کار را در یک نمایشگر واحد ببینید", + "گزارش‌های لحظه‌ای و قابل تنظیم داشته باشید", + "روندها، شاخص‌های کلیدی و فرصت‌ها را سریع تشخیص دهید", + ], + result: "این نوع داشبوردها باعث می‌شود به‌جای حدس و گمان، تصمیم‌های مبتنی بر داده بگیرید.", }, { icon: Share2, - title: "تعامل با شبکه‌های اجتماعی", - description: "ایجاد ارتباطات قدرتمند و خودکار با پلتفرم‌های مختلف شبکه‌های اجتماعی برای مدیریت و تعامل بهتر", + title: "تعامل هوشمند با شبکه‌های اجتماعی", + description: + "امروزه شبکه‌های اجتماعی نقش مهمی در ارتباط با مشتریان دارند. راهکارهای یکپارچه‌سازی تعامل اجتماعی به شما امکان می‌دهند تا:", features: [ - "اتصال به پلتفرم‌های مختلف اجتماعی", - "مدیریت و ارسال محتوا به صورت خودکار", - "نظارت و تحلیل تعاملات", - "همگام‌سازی اطلاعات بین پلتفرم‌ها" - ] + "محتوا را به‌صورت خودکار منتشر کنید", + "تعاملات کاربران در شبکه‌های مختلف را تحلیل کنید", + "تحلیل داده‌های اجتماعی را برای بهبود تجربه مشتری در کسب‌و‌کارتان به‌کار ببرید", + ], + result: "این یعنی مدیریت بهتر برند، افزایش تعامل و شناخت عمیق‌تر مشتریان.", }, { icon: Zap, title: "اتوماسیون فرآیندها", - description: "ایجاد کارهای خودکار برای اتوماتیک‌سازی فرآیندهای کسب‌وکار و کاهش کارهای دستی", + description: + "بخش زیادی از کارهای روزمره در کسب‌و‌کار قابل خودکارسازی هستند. با اتوماسیون فرایندها می‌توانید:", features: [ - "تعریف و اجرای workflowهای خودکار", - "اتوماسیون بر اساس رویداد و زمان", - "زمان‌بندی و اجرای کارهای تکراری", - "اعلان‌ها و هشدارهای خودکار" - ] + "فعالیت‌های تکراری را بدون دخالت انسانی اجرا کنید", + "اعلان‌های هوشمند تنظیم کنید تا تیم شما فقط روی کارهای مهم تمرکز کند", + "چرخه‌های کاری را بهینه کنید تا خطا کمتر شود و سرعت اجرا بیشتر", + ], + result: "این نوع اتوماسیون کمک می‌کند تا منابع انسانی شما روی فعالیت‌های ارزش‌آفرین تمرکز کنند.", }, { icon: TrendingUp, - title: "تحلیل و پردازش داده", - description: "انجام تحلیل‌های پیشرفته روی داده‌ها و پردازش اطلاعات برای استخراج منابع ارزشمند", + title: "تحلیل و پردازش داده‌ها", + description: + "اطلاعات خام زمانی ارزشمند می‌شود که بتوانید با آن تصمیم‌های هوشمند بگیرید. این راهکار شامل:", features: [ - "تحلیل داده‌ها از منابع مختلف", - "پردازش و تبدیل داده‌ها", - "گزارش‌گیری و تجسم نتایج", - "شناسایی الگوها و روندها" - ] + "تحلیل‌های پیشرفته روی داده‌های جمع‌آوری‌شده از منابع مختلف", + "گزارش‌گیری و شناسایی الگوها و روندها در داده‌ها", + "تبدیل داده به بینش عملیاتی", + ], + result: "که به شما کمک می‌کند درک بهتری از عملکرد، مشتریان و فرصت‌های رشد داشته باشید.", }, { icon: Workflow, - title: "مدیریت جریان کار", - description: "طراحی و مدیریت جریان‌های کاری پیچیده برای اتصال و هماهنگ‌سازی فرآیندهای مختلف", + title: "مدیریت جریان‌های کاری پیچیده", + description: + "وقتی کسب‌و‌کار رشد می‌کند، فرایندها پیچیده‌تر می‌شوند. مدیریت جریان کار به شما این امکان را می‌دهد تا:", features: [ - "طراحی workflowهای سفارشی", - "مدیریت و نظارت بر اجرای فرآیندها", - "خطایابی و بهینه‌سازی جریان‌ها", - "لاگ و گزارش‌گیری از اجراها" - ] - } + "فرآیندهای چندمرحله‌ای را طراحی و نظارت کنید", + "ایرادات فرایندها را سریع پیدا و برطرف کنید", + "خروجی کارها را به‌طور کامل رهگیری کنید", + ], + result: "این موضوع باعث می‌شود فرایندها استاندارد، قابل اندازه‌گیری و همیشه بهتر شوند.", + }, ]; export default function SolutionsPage() { @@ -81,36 +94,39 @@ export default function SolutionsPage() {

راه‌حل‌های ما

-

- راه‌حل‌های یکپارچه‌سازی پیشرفته برای اتصال سیستم‌ها، اتوماسیون فرآیندها، تعامل با شبکه‌های اجتماعی و تحلیل داده‌ها که کسب‌وکار شما را به سطح جدیدی از کارایی می‌رساند. +

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

+

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

- {/* Solutions Grid */} + {/* Solutions */}
-
+
{solutions.map((solution, index) => { const Icon = solution.icon; return (

- {solution.title} + {index + 1}. {solution.title}

{solution.description}

-
    +
      {solution.features.map((feature, featureIndex) => (
    • ))}
    + {solution.result && ( +

    + {solution.result} +

    + )}
); })} @@ -128,8 +149,23 @@ export default function SolutionsPage() {
+ {/* نتیجه‌گیری */} +
+
+
+

نتیجه‌گیری

+

+ این راهکارها کمک می‌کنند تا کسب‌و‌کار شما از حالت «جزیره‌ای» بیرون بیاید و به یک ساختار هوشمند، به‌هم‌پیوسته و قابل رشد تبدیل شود. +

+

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

+
+
+
+ {/* CTA Section */} -
+

diff --git a/components/consulting-form.tsx b/components/consulting-form.tsx new file mode 100644 index 0000000..95dc508 --- /dev/null +++ b/components/consulting-form.tsx @@ -0,0 +1,212 @@ +'use client' + +import { useState } from 'react' +import { useForm } from 'react-hook-form' +import { zodResolver } from '@hookform/resolvers/zod' +import { z } from 'zod' +import { Button } from '@/components/ui/button' +import { Input } from '@/components/ui/input' +import { Textarea } from '@/components/ui/textarea' +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@/components/ui/form' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { Alert, AlertDescription } from '@/components/ui/alert' +import { CheckCircle2, Loader2 } from 'lucide-react' + +const consultingAreas = [ + 'اینتگریشن', + 'هوشمندسازی', + 'RAG', + 'Performance', + 'امنیت', + 'معماری نرم‌افزار', + 'داده و تحلیل', + 'سایر', +] as const + +const formSchema = z.object({ + fullName: z.string().min(2, 'نام و نام خانوادگی الزامی است'), + organization: z.string().min(1, 'نام سازمان الزامی است'), + phone: z + .string() + .min(1, 'شماره تماس الزامی است') + .refine( + (val) => { + const normalized = val + .replace(/[۰-۹]/g, (c) => '۰۱۲۳۴۵۶۷۸۹'.indexOf(c).toString()) + .replace(/\D/g, '') + return normalized.length === 11 && normalized.startsWith('09') + }, + 'لطفاً شماره موبایل معتبر وارد کنید' + ), + area: z.string().min(1, 'حوزه مشاوره را انتخاب کنید'), + description: z.string().max(1000, 'حداکثر ۱۰۰۰ کاراکتر مجاز است').optional(), +}) + +type FormValues = z.infer + +export function ConsultingForm() { + const [submitted, setSubmitted] = useState(false) + const [isSubmitting, setIsSubmitting] = useState(false) + const [submitError, setSubmitError] = useState(null) + + const form = useForm({ + resolver: zodResolver(formSchema), + defaultValues: { + fullName: '', + organization: '', + phone: '', + area: '', + description: '', + }, + }) + + async function onSubmit(data: FormValues) { + setSubmitError(null) + setIsSubmitting(true) + try { + const res = await fetch('/api/consulting', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data), + }) + const json = await res.json().catch(() => ({})) + if (!res.ok) { + setSubmitError(json.error || 'ارسال درخواست ناموفق بود. لطفاً دوباره تلاش کنید.') + return + } + setSubmitted(true) + form.reset() + } catch { + setSubmitError('خطا در ارتباط با سرور. لطفاً دوباره تلاش کنید.') + } finally { + setIsSubmitting(false) + } + } + + if (submitted) { + return ( + + + + در سریع‌ترین زمان ممکن با شما تماس می‌گیریم. + + + ) + } + + return ( +
+ + {submitError && ( + + {submitError} + + )} + ( + + نام و نام خانوادگی + + + + + + )} + /> + ( + + نام سازمان + + + + + + )} + /> + ( + + شماره تماس + + + + + + )} + /> + ( + + در چه حوزه‌ای مشاوره می‌خواهید؟ + + + + )} + /> + ( + + توضیحات (اختیاری) + +