شخصيصعب

Awlak Benjah

متتبّع للشهادة والمعدّل التراكمي يعمل دون اتصال بالكامل، مبني كمستودع أحادي بـ Turborepo يجمع تطبيق Expo React Native مع موقع عرض بـ Astro.

— نظرة عامة

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

graph TB
    subgraph Monorepo["Turborepo + pnpm workspaces"]
        A["apps/mobile<br/>Expo SDK 57"]
        B["apps/showcase<br/>Astro + Tailwind"]
        C["packages/typescript-config"]
        D["packages/oxlint-config"]
    end
    subgraph Device["على الجهاز"]
        E["expo-sqlite"]
        F["Drizzle ORM"]
        G["مخزن Zustand"]
    end
    A --> E
    F --> E
    A --> G
    C --> A & B
    D --> A & B
    B --> H["Cloudflare Pages"]

متتبّع للشهادة والمعدّل التراكمي يُبقي كل عملية حسابية على الجهاز نفسه. يصوغ الطالب شهادته على شكل فصول ومقررات، ويسجّل العلامات فور صدورها، ويرى المعدّل يتحدّث تلقائيًا دون حاجة إلى حساب أو اتصال بالشبكة.

المستودع أحادي مبني على Turborepo وworkspaces من pnpm: يتشارك تطبيق Expo وصفحة العرض بـ Astro قاعدة TypeScript صارمة وإعداد oxlint واحد، وتمرّ كل مهمة عبر ذاكرة Turbo المؤقتة.

الميزات الرئيسية:

  • نموذج بيانات يعمل دون اتصال بالكامل عبر expo-sqlite وDrizzle ORM
  • تسلسل من الشهادة إلى الفصل إلى المقرر مع إمكانية تجاوز القوالب لكل منهج
  • احتساب مستمر للمعدّل وحالة العلامات مع رسوم بيانية للتقدّم
  • حفظات متعددة لمتابعة أكثر من خطة دراسية جنبًا إلى جنب
  • واجهة مترجمة عبر i18next مع اكتشاف لغة الجهاز
  • تحرير عبر الأوراق السفلية مع استجابة لمسية ورسوم Lottie
  • موقع عرض ثابت بـ Astro يُنشر بمعزل عن التطبيق

التقنيات المستخدمة:

  • الهاتف: Expo SDK 57، React Native، Expo Router، TypeScript
  • البيانات: Drizzle ORM، expo-sqlite، Zustand، TanStack Query
  • الواجهة: HeroUI Native، Uniwind، Tailwind CSS، react-native-gifted-charts
  • موقع العرض: Astro، Tailwind CSS، astro-icon، Cloudflare
  • الأدوات: Turborepo، pnpm، oxlint، dependency-cruiser، Vitest، Zod

سبق أن صدر نموذج أولي على الويب للفكرة نفسها باستخدام React وSupabase، قبل أن ينتقل المشروع إلى بنية أصلية تعمل دون اتصال أولًا.

— التقنيات
TypeScriptReact NativeExpoAstroTailwind CSSTurborepoSQLiteDrizzle ORMCloudflare