feat(website): Next.js 16 marketing website with RTL/Farsi
Marketing website for Meezi platform: - Server-side rendered pages: home, demo, blog, pricing - RTL/Farsi layout with Vazirmatn font - SEO metadata and Open Graph tags - proxy.ts for Next.js 16 middleware convention - MEEZI_API_URL internal Docker network routing Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,218 @@
|
||||
import type { Metadata } from "next";
|
||||
import { getTranslations } from "next-intl/server";
|
||||
import { Navbar } from "@/components/layout/navbar";
|
||||
import { Footer } from "@/components/layout/footer";
|
||||
import { Shield } from "lucide-react";
|
||||
|
||||
export async function generateMetadata({
|
||||
params,
|
||||
}: {
|
||||
params: { locale: string };
|
||||
}): Promise<Metadata> {
|
||||
const { locale } = await Promise.resolve(params);
|
||||
const t = await getTranslations({ locale, namespace: "meta" });
|
||||
return { title: t("privacyTitle") };
|
||||
}
|
||||
|
||||
const fa = {
|
||||
badge: "حقوقی",
|
||||
title: "سیاست حریم خصوصی",
|
||||
updated: "آخرین بهروزرسانی: خرداد ۱۴۰۴",
|
||||
sections: [
|
||||
{
|
||||
h: "۱. مقدمه",
|
||||
body: `میزی («ما»، «شرکت») اهمیت حریم خصوصی کاربران خود را بهخوبی درک میکند. این سیاست توضیح میدهد چه اطلاعاتی جمعآوری میکنیم، چگونه از آنها استفاده میکنیم و چه حقوقی دارید.
|
||||
|
||||
با استفاده از خدمات میزی، با شرایط این سیاست موافقت میکنید.`,
|
||||
},
|
||||
{
|
||||
h: "۲. اطلاعاتی که جمعآوری میکنیم",
|
||||
body: `الف) اطلاعاتی که شما ارائه میدهید:
|
||||
• نام و نام خانوادگی
|
||||
• شماره موبایل (برای احراز هویت OTP)
|
||||
• نام کسبوکار، آدرس و اطلاعات شعب
|
||||
• اطلاعات منو و قیمتگذاری
|
||||
|
||||
ب) اطلاعاتی که بهطور خودکار جمعآوری میشود:
|
||||
• دادههای استفاده از سرویس (سفارشها، تراکنشها)
|
||||
• آدرس IP و اطلاعات دستگاه
|
||||
• کوکیهای ضروری برای عملکرد سرویس`,
|
||||
},
|
||||
{
|
||||
h: "۳. نحوه استفاده از اطلاعات",
|
||||
body: `اطلاعات شما برای موارد زیر استفاده میشود:
|
||||
• ارائه، نگهداری و بهبود خدمات میزی
|
||||
• احراز هویت و امنیت حساب
|
||||
• پردازش سفارشها و تراکنشهای مالی
|
||||
• ارسال اطلاعیههای سرویس و بهروزرسانیها
|
||||
• پشتیبانی فنی و رفع مشکلات
|
||||
• تولید گزارشهای آماری کلی (بدون شناسایی هویت)`,
|
||||
},
|
||||
{
|
||||
h: "۴. ذخیرهسازی و امنیت داده",
|
||||
body: `تمام دادههای شما روی سرورهای داخل ایران نگهداری میشوند. ما از موارد زیر برای حفاظت از اطلاعات استفاده میکنیم:
|
||||
• رمزگذاری TLS 1.3 برای تمام ارتباطات
|
||||
• رمزگذاری دادههای حساس در سطح پایگاه داده
|
||||
• پشتیبانگیری روزانه خودکار
|
||||
• کنترل دسترسی مبتنی بر نقش (RBAC)
|
||||
• مانیتورینگ و هشدار امنیتی ۲۴/۷`,
|
||||
},
|
||||
{
|
||||
h: "۵. اشتراکگذاری اطلاعات",
|
||||
body: `اطلاعات شما را به اشخاص ثالث نمیفروشیم. ممکن است اطلاعات را در موارد زیر به اشتراک بگذاریم:
|
||||
• درگاههای پرداخت (زرینپال و غیره) — فقط اطلاعات تراکنش ضروری
|
||||
• ارائهدهندگان پیامک — فقط شماره موبایل و متن OTP
|
||||
• الزامات قانونی — در صورت دستور مراجع قضایی
|
||||
|
||||
در تمام موارد، حداقل اطلاعات ضروری به اشتراک گذاشته میشود.`,
|
||||
},
|
||||
{
|
||||
h: "۶. حقوق شما",
|
||||
body: `شما حق دارید:
|
||||
• به اطلاعات شخصیتان دسترسی داشته باشید
|
||||
• اطلاعات نادرست را اصلاح کنید
|
||||
• حذف حساب و دادههای مرتبط را درخواست دهید
|
||||
• خروجی دادههایتان را دریافت کنید
|
||||
• از پردازش اطلاعات برای اهداف بازاریابی انصراف دهید
|
||||
|
||||
برای اعمال هر یک از این حقوق، با ما به آدرس privacy@meezi.ir تماس بگیرید.`,
|
||||
},
|
||||
{
|
||||
h: "۷. کوکیها",
|
||||
body: `میزی از کوکیهای ضروری برای عملکرد سرویس (احراز هویت، نشست) استفاده میکند. کوکیهای تبلیغاتی یا ردیابی شخص ثالث استفاده نمیشوند.`,
|
||||
},
|
||||
{
|
||||
h: "۸. تغییرات در این سیاست",
|
||||
body: `در صورت تغییر این سیاست، از طریق داشبورد یا ایمیل اطلاعرسانی خواهیم کرد. ادامه استفاده از سرویس پس از اطلاعرسانی، به منزله پذیرش تغییرات است.`,
|
||||
},
|
||||
{
|
||||
h: "۹. تماس با ما",
|
||||
body: `برای هرگونه سوال درباره حریم خصوصی:
|
||||
ایمیل: privacy@meezi.ir
|
||||
آدرس: تهران، ایران`,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const en = {
|
||||
badge: "Legal",
|
||||
title: "Privacy Policy",
|
||||
updated: "Last updated: June 2025",
|
||||
sections: [
|
||||
{
|
||||
h: "1. Introduction",
|
||||
body: `Meezi ("we", "company") takes user privacy seriously. This policy explains what information we collect, how we use it, and what rights you have.
|
||||
|
||||
By using Meezi's services, you agree to the terms of this policy.`,
|
||||
},
|
||||
{
|
||||
h: "2. Information We Collect",
|
||||
body: `a) Information you provide:
|
||||
• Full name
|
||||
• Mobile number (for OTP authentication)
|
||||
• Business name, address, and branch information
|
||||
• Menu items and pricing
|
||||
|
||||
b) Automatically collected information:
|
||||
• Service usage data (orders, transactions)
|
||||
• IP address and device information
|
||||
• Essential cookies for service functionality`,
|
||||
},
|
||||
{
|
||||
h: "3. How We Use Your Information",
|
||||
body: `Your information is used to:
|
||||
• Provide, maintain, and improve Meezi services
|
||||
• Authenticate and secure your account
|
||||
• Process orders and financial transactions
|
||||
• Send service notifications and updates
|
||||
• Technical support and issue resolution
|
||||
• Generate aggregate statistical reports (non-identifying)`,
|
||||
},
|
||||
{
|
||||
h: "4. Data Storage & Security",
|
||||
body: `All your data is stored on servers inside Iran. We protect your information with:
|
||||
• TLS 1.3 encryption for all communications
|
||||
• Encryption of sensitive data at the database level
|
||||
• Automatic daily backups
|
||||
• Role-based access control (RBAC)
|
||||
• 24/7 security monitoring and alerting`,
|
||||
},
|
||||
{
|
||||
h: "5. Information Sharing",
|
||||
body: `We do not sell your information to third parties. We may share information in these cases:
|
||||
• Payment gateways (ZarinPal, etc.) — only necessary transaction data
|
||||
• SMS providers — only mobile number and OTP text
|
||||
• Legal requirements — when required by judicial authorities
|
||||
|
||||
In all cases, only the minimum necessary information is shared.`,
|
||||
},
|
||||
{
|
||||
h: "6. Your Rights",
|
||||
body: `You have the right to:
|
||||
• Access your personal information
|
||||
• Correct inaccurate information
|
||||
• Request deletion of your account and related data
|
||||
• Receive an export of your data
|
||||
• Opt out of marketing communications
|
||||
|
||||
To exercise any of these rights, contact us at privacy@meezi.ir`,
|
||||
},
|
||||
{
|
||||
h: "7. Cookies",
|
||||
body: `Meezi uses essential cookies for service functionality (authentication, session). No advertising or third-party tracking cookies are used.`,
|
||||
},
|
||||
{
|
||||
h: "8. Changes to This Policy",
|
||||
body: `If this policy changes, we will notify you via the dashboard or email. Continued use of the service after notification constitutes acceptance of the changes.`,
|
||||
},
|
||||
{
|
||||
h: "9. Contact Us",
|
||||
body: `For any privacy-related questions:
|
||||
Email: privacy@meezi.ir
|
||||
Address: Tehran, Iran`,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
export default async function PrivacyPage({
|
||||
params,
|
||||
}: {
|
||||
params: { locale: string };
|
||||
}) {
|
||||
const { locale } = await Promise.resolve(params);
|
||||
const c = locale === "fa" ? fa : en;
|
||||
|
||||
return (
|
||||
<>
|
||||
<Navbar />
|
||||
<main className="pt-16">
|
||||
{/* Hero */}
|
||||
<div className="bg-gradient-to-br from-brand-900 to-brand-700 pb-16 pt-16 text-center">
|
||||
<div className="mx-auto flex h-14 w-14 items-center justify-center rounded-2xl bg-white/10">
|
||||
<Shield className="h-7 w-7 text-white" />
|
||||
</div>
|
||||
<span className="mt-4 inline-flex items-center gap-1.5 rounded-full border border-white/20 bg-white/10 px-3 py-1 text-xs font-semibold text-white/80">
|
||||
{c.badge}
|
||||
</span>
|
||||
<h1 className="mt-3 text-3xl font-extrabold text-white sm:text-4xl">{c.title}</h1>
|
||||
<p className="mt-2 text-sm text-white/50">{c.updated}</p>
|
||||
</div>
|
||||
|
||||
{/* Content */}
|
||||
<div className="mx-auto max-w-3xl px-4 py-16 sm:px-6 lg:px-8">
|
||||
<div className="space-y-10">
|
||||
{c.sections.map((sec) => (
|
||||
<div key={sec.h}>
|
||||
<h2 className="mb-3 text-lg font-bold text-gray-900">{sec.h}</h2>
|
||||
<div className="whitespace-pre-line text-sm leading-relaxed text-gray-600">
|
||||
{sec.body}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user