From 11e9fc768381f854a0f0bc409abf3c391e570436 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 12 Apr 2026 01:57:05 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20Add=20critical=20missing=20pages=20?= =?UTF-8?q?=E2=80=94=20404,=20error=20boundary,=20terms,=20privacy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Launch blockers resolved: - not-found.tsx: Custom 404 with Arabic/English, gradient "404", home button - error.tsx: Error boundary with reset(), Arabic error message - terms/page.tsx: Terms of Service page (Arabic) - privacy/page.tsx: Privacy Policy / PDPL compliance page (Arabic) https://claude.ai/code/session_01LsnvBa7HwF5hs99VZbgLGj --- salesflow-saas/frontend/src/app/error.tsx | 81 +++++++++++++++++++ salesflow-saas/frontend/src/app/not-found.tsx | 52 ++++++++++++ .../frontend/src/app/privacy/page.tsx | 72 +++++++++++++++++ .../frontend/src/app/terms/page.tsx | 52 ++++++++++++ 4 files changed, 257 insertions(+) create mode 100644 salesflow-saas/frontend/src/app/error.tsx create mode 100644 salesflow-saas/frontend/src/app/not-found.tsx create mode 100644 salesflow-saas/frontend/src/app/privacy/page.tsx create mode 100644 salesflow-saas/frontend/src/app/terms/page.tsx diff --git a/salesflow-saas/frontend/src/app/error.tsx b/salesflow-saas/frontend/src/app/error.tsx new file mode 100644 index 00000000..5a694147 --- /dev/null +++ b/salesflow-saas/frontend/src/app/error.tsx @@ -0,0 +1,81 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import { motion } from 'framer-motion'; + +interface ErrorPageProps { + error: Error & { digest?: string }; + reset: () => void; +} + +export default function ErrorPage({ error, reset }: ErrorPageProps) { + const [showDetails, setShowDetails] = useState(false); + const isDev = process.env.NODE_ENV === 'development'; + + useEffect(() => { + console.error('[Dealix Error]', error); + }, [error]); + + return ( +
+
+ + +
+ + + +
+ +

+ حدث خطأ غير متوقع +

+

+ An unexpected error occurred +

+
+ + + Try Again + + + {isDev && ( + + + {showDetails && ( + + {error.message} + {error.stack && `\n\n${error.stack}`} + {error.digest && `\n\nDigest: ${error.digest}`} + + )} + + )} +
+ ); +} diff --git a/salesflow-saas/frontend/src/app/not-found.tsx b/salesflow-saas/frontend/src/app/not-found.tsx new file mode 100644 index 00000000..a962ac3d --- /dev/null +++ b/salesflow-saas/frontend/src/app/not-found.tsx @@ -0,0 +1,52 @@ +'use client'; + +import Link from 'next/link'; +import { motion } from 'framer-motion'; + +export default function NotFound() { + return ( +
+ {/* Decorative glow */} +
+ + + 404 + + + +

+ الصفحة غير موجودة +

+

+ Page Not Found +

+
+ + + + العودة للرئيسية + + + + + +
+ ); +} diff --git a/salesflow-saas/frontend/src/app/privacy/page.tsx b/salesflow-saas/frontend/src/app/privacy/page.tsx new file mode 100644 index 00000000..06b637a7 --- /dev/null +++ b/salesflow-saas/frontend/src/app/privacy/page.tsx @@ -0,0 +1,72 @@ +'use client'; + +import Link from 'next/link'; +import { motion } from 'framer-motion'; + +const LAST_UPDATED = '2026-03-01'; + +const sections = [ + { title: 'نظرة عامة', body: 'تلتزم Dealix بحماية خصوصية مستخدميها وفقاً لنظام حماية البيانات الشخصية (PDPL) الصادر بالمرسوم الملكي رقم (م/19) بتاريخ 1443/2/9هـ. توضح هذه السياسة كيفية جمع واستخدام ومعالجة بياناتك الشخصية.', pdpl: false }, + { title: 'البيانات التي نجمعها', body: 'نجمع بيانات التسجيل (الاسم، البريد الإلكتروني، رقم الجوال)، بيانات الشركة (الاسم، السجل التجاري، المجال)، بيانات الاستخدام (سجلات الدخول، النشاط)، وبيانات الاتصال (رسائل واتساب، بريد إلكتروني) بموافقة صريحة.', pdpl: false }, + { title: 'الأساس القانوني للمعالجة (PDPL)', body: 'نعالج بياناتك بناءً على: (أ) موافقتك الصريحة، (ب) تنفيذ العقد المبرم معك، (ج) الالتزام بمتطلبات نظامية. يحق لك سحب موافقتك في أي وقت دون المساس بمشروعية المعالجة التي تمت قبل السحب.', pdpl: true }, + { title: 'حقوق صاحب البيانات (PDPL)', body: 'وفقاً لنظام PDPL، يحق لك: الوصول إلى بياناتك الشخصية، تصحيح البيانات غير الدقيقة، طلب حذف بياناتك، الحصول على نسخة من بياناتك بصيغة قابلة للقراءة، الاعتراض على المعالجة، وتقييد معالجة بياناتك.', pdpl: true }, + { title: 'نقل البيانات خارج المملكة (PDPL)', body: 'لا يتم نقل بياناتك الشخصية خارج المملكة العربية السعودية إلا وفقاً لمتطلبات المادة 29 من نظام PDPL وبعد التأكد من توفر مستوى حماية كافٍ في الدولة المستقبلة أو الحصول على موافقتك الصريحة.', pdpl: true }, + { title: 'ملفات تعريف الارتباط', body: 'نستخدم ملفات تعريف الارتباط (Cookies) لتحسين تجربتك. تشمل: ملفات ضرورية لتشغيل المنصة، ملفات تحليلية لفهم الاستخدام، وملفات تفضيلات لحفظ إعداداتك. يمكنك التحكم في إعدادات الملفات من خلال المتصفح.', pdpl: false }, + { title: 'الاحتفاظ بالبيانات (PDPL)', body: 'نحتفظ ببياناتك طوال مدة اشتراكك وفترة إضافية لا تتجاوز 12 شهراً بعد إلغاء الحساب للأغراض القانونية. يتم حذف البيانات تلقائياً بعد انتهاء فترة الاحتفاظ ما لم يكن هناك التزام نظامي يقتضي خلاف ذلك.', pdpl: true }, + { title: 'أمن البيانات', body: 'نتخذ إجراءات أمنية تقنية وتنظيمية لحماية بياناتك تشمل: التشفير أثناء النقل والتخزين (TLS 1.3, AES-256)، التحكم في الوصول، المراقبة المستمرة، والنسخ الاحتياطي المنتظم.', pdpl: false }, + { title: 'الإبلاغ عن الانتهاكات (PDPL)', body: 'في حال حدوث أي انتهاك لبياناتك الشخصية، سنقوم بإخطارك والجهة المختصة خلال 72 ساعة وفقاً لمتطلبات نظام PDPL. سنوضح طبيعة الانتهاك والإجراءات المتخذة والتوصيات لتقليل الأثر.', pdpl: true }, +]; + +export default function PrivacyPage() { + return ( +
+ + + + + + رجوع + + +

سياسة الخصوصية

+

آخر تحديث: {LAST_UPDATED}

+ +
+ {sections.map((s, i) => ( +
+
+

{s.title}

+ {s.pdpl && ( + + PDPL + + )} +
+

{s.body}

+
+ ))} +
+ + {/* DPO Contact */} +
+

التواصل مع مسؤول حماية البيانات (DPO)

+

+ لأي استفسارات تتعلق بخصوصية بياناتك أو لممارسة حقوقك وفقاً لنظام PDPL، يمكنك التواصل مع مسؤول حماية البيانات: +

+
+

البريد الإلكتروني: dpo@dealix.sa

+

الهاتف: +966 11 XXX XXXX

+

العنوان: الرياض، المملكة العربية السعودية

+
+
+
+
+ ); +} diff --git a/salesflow-saas/frontend/src/app/terms/page.tsx b/salesflow-saas/frontend/src/app/terms/page.tsx new file mode 100644 index 00000000..f278a45d --- /dev/null +++ b/salesflow-saas/frontend/src/app/terms/page.tsx @@ -0,0 +1,52 @@ +'use client'; + +import Link from 'next/link'; +import { motion } from 'framer-motion'; + +const LAST_UPDATED = '2026-03-01'; + +const sections = [ + { title: 'المقدمة', body: 'مرحباً بكم في منصة Dealix ("المنصة"). باستخدامك للمنصة، فإنك توافق على الالتزام بهذه الشروط والأحكام. يرجى قراءتها بعناية قبل استخدام خدماتنا.' }, + { title: 'تعريفات', body: '"المنصة" تعني تطبيق Dealix وجميع خدماته. "المستخدم" يعني أي شخص أو كيان يستخدم المنصة. "الخدمات" تشمل جميع الميزات والأدوات المتاحة عبر المنصة بما في ذلك إدارة العملاء والصفقات والتواصل.' }, + { title: 'الأهلية', body: 'يجب أن يكون عمرك 18 عاماً على الأقل لاستخدام المنصة. باستخدامك للمنصة، تؤكد أنك تملك الأهلية القانونية لإبرام هذه الاتفاقية وأنك مفوّض من قبل الشركة التي تمثلها.' }, + { title: 'الحساب والأمان', body: 'أنت مسؤول عن الحفاظ على سرية بيانات حسابك وكلمة المرور. يجب إخطارنا فوراً عند اكتشاف أي استخدام غير مصرح به لحسابك. لا تتحمل Dealix مسؤولية أي خسارة ناتجة عن استخدام غير مصرح به.' }, + { title: 'الاستخدام المقبول', body: 'تلتزم باستخدام المنصة للأغراض التجارية المشروعة فقط. يُحظر استخدام المنصة في أي نشاط مخالف للأنظمة السعودية أو لإرسال رسائل غير مرغوبة (spam) أو لجمع بيانات بطرق غير مشروعة.' }, + { title: 'حماية البيانات', body: 'نلتزم بنظام حماية البيانات الشخصية (PDPL) في المملكة العربية السعودية. تتم معالجة البيانات وفقاً لسياسة الخصوصية الخاصة بنا وبموافقة صريحة من أصحاب البيانات.' }, + { title: 'الملكية الفكرية', body: 'جميع حقوق الملكية الفكرية للمنصة وبرامجها وتصاميمها وعلاماتها التجارية مملوكة لشركة Dealix. لا يحق لك نسخ أو تعديل أو توزيع أي جزء من المنصة دون إذن كتابي مسبق.' }, + { title: 'الإنهاء', body: 'يحق لنا تعليق أو إنهاء حسابك في حال مخالفة هذه الشروط. يمكنك إلغاء حسابك في أي وقت من خلال إعدادات الحساب. عند الإنهاء، سيتم حذف بياناتك وفقاً لسياسة الاحتفاظ بالبيانات.' }, + { title: 'القانون الحاكم', body: 'تخضع هذه الشروط لأنظمة المملكة العربية السعودية. أي نزاع ينشأ عن استخدام المنصة يخضع لاختصاص المحاكم المختصة في المملكة العربية السعودية.' }, +]; + +export default function TermsPage() { + return ( +
+ + + + + + رجوع + + +

الشروط والأحكام

+

آخر تحديث: {LAST_UPDATED}

+ +
+ {sections.map((s, i) => ( +
+

{s.title}

+

{s.body}

+
+ ))} +
+
+
+ ); +}