← Back to Work

لقاء25

منصة مجتمع مهني ثنائية اللغة، عربية أولاً، للمملكة العربية السعودية. بنيت الواجهة الأمامية والخلفية الكاملة ضمن فريق من ثلاثة مهندسين في Extend.

Role
مهندس واجهات أمامية أول (full-stack)
Published
أبريل ٢٠٢٥
الصفحات
+30
Route Handlers
+70
استراتيجيات المصادقة
3
Next.js 15React 19TypeScriptTailwind CSS v4Supabasei18nextPostgreSQL
View live site →

السياق

لقاء25 منصة مجتمع مهني للمملكة العربية السعودية — تقدّم تجربة عربية أصيلة لا مجرد واجهة مترجمة. الجمهور هو خريجو ومنتسبو شبكة مهنية متخصصة، يتوقعون منتجاً عربياً بالدرجة الأولى مع دعم ثنائي اللغة (AR/EN).

المشكلة

التوتر الهندسي الجوهري: بناء منصة إنتاجية عربية-أولاً بسيو ديناميكي، ومصادقة متعددة الاستراتيجيات، وصلاحيات قائمة على الأدوار — في إطار زمني ضيق، بفريق من ثلاثة، مع بناء الخلفية الكاملة في الوقت ذاته.

الرهانات التقنية التي كان يجب أن تكون صحيحة من البداية:

البنية المعمارية

طبقة BFF كانت خياراً مقصوداً بدلاً من الوصول المباشر عبر Supabase JS من العميل. مع سياسات RLS كحد أمني، تتيح Route Handlers:

التنفيذ

مخطط PostgreSQL وRLS

المخطط يحتوي على أكثر من 10 جداول مع سياسات Row Level Security تفرض RBAC على مستوى قاعدة البيانات. مثال على سياسة جدول members:

-- يمكن للأعضاء قراءة ملفاتهم الشخصية وملفات الأعضاء المعتمدين
create policy "members_select" on members
  for select using (
    auth.uid() = user_id
    or (status = 'approved' and auth.uid() in (
      select user_id from members where status = 'approved'
    ))
  );

RTL / i18n

i18next مع i18next-resources-to-backend لتحميل الترجمات من جهة الخادم. اللغة ar أو en مُبوّبة في الرابط. سمة dir تُضبط على <html> في مستوى الـ layout. إحدى المشكلات غير المتوقعة: تنسيق الأرقام العربية في سلاسل التواريخ — حُلّت باستخدام Intl.DateTimeFormat مع خاصية locale بدلاً من مُنسِّق مخصص.

SEO الديناميكي

مخططات JSON-LD لـ Event وPerson لكل صفحة. صور OG تُولَّد عبر @vercel/og مع تحميل IBM Plex Sans Arabic كـ font buffer. Sitemap تلقائي عبر metadata route في Next.js.

النتيجة

← All case studies