موقع عربي مصمّم للهاتف أولًا يضم 39 لعبة ونشاطًا قصيرًا للزوجين: بطاقات حوار، وألعاب توقّع، وتحديات بمؤقت، وبعض الألعاب المرسومة على الشاشة نفسها. اختارا المزاج وكم لديكما من الوقت، وابدآ في أقل من دقيقة.
نظرة عامة
البحث عن شيء تفعلانه معًا يستغرق أحيانًا أطول من النشاط نفسه، ومعظم تطبيقات الأزواج تبدأ بنموذج تسجيل. أما «ونس» فيبدأ بسؤالين: ما مزاجكما، وكم لديكما من الدقائق.
كل لعبة تعمل على هاتف واحد مشترك. يُمرَّر الدور باليد، وحين يجيب أحدكما سرًّا تُخفي الشاشة إجابته قبل التسليم. تبقى الإجابات في ذاكرة الصفحة فقط، ولا يحفظ المتصفح إلا الإعدادات والمفضلة والبطاقات التي رأيتماها.
بدأ بوثيقة متطلبات من ست ألعاب، وكبر إلى 39 لعبة، لكلٍّ منها محرك قواعد واختبارات، فوق بنك يزيد على 1,500 بطاقة عربية مكتوبة يدويًا.
ترتيب الأدوار والنقاط ولحظة كشف الإجابة هي مواضع انكسار هذه الألعاب. وكتابة هذا المنطق داخل مكوّنات React تعني اختباره بالنقر عبر كل لعبة على الهاتف.
الحل
كل لعبة مُختزِل نقي بلا DOM خلف عقد واحد: بناء الرزمة، والبدء، ومعالجة الحدث، واشتقاق النتيجة. والحدث غير الصالح يعيد الحالة نفسها دون تغيير، والنتيجة تُحسب من الجولات المكتملة لا من العدّادات. ويشغّل Node الاختبارات مباشرة بلا أداة اختبار مثبّتة.
سرّ على شاشة مشتركة
المشكلة
في ألعاب التوقّع يجيب أحدكما ويتوقّع الآخر، على الهاتف نفسه. وإن بقيت الإجابة على الشاشة لحظة انتقال الهاتف، تنتهي الجولة قبل أن تبدأ.
الحل
تتضمن المحركات مرحلة تسليم بين الإدخالين، لا يُعرض فيها شيء مما كُتب، ولا يقبل المحرك إدخالًا إلا ممن عليه الدور. فلا تستطيع الواجهة تسريب ما لا تكشفه الحالة في تلك المرحلة أصلًا.
تعديل المحتوى دون كسر المفضلة
المشكلة
تُعاد كتابة البطاقات وتُسحب. والمفضلة المحفوظة الشهر الماضي التي تشير إلى بطاقة محذوفة قد تُسقط الصفحة أو تعرض بطاقة أخرى بصمت.
الحل
البطاقات ملفات JSON بمعرّفات ثابتة وحالة مسودة ← مراجعة ← منشورة ← مؤرشفة، تُفحص بمخطط قبل كل بناء. وتبقى البطاقات المؤرشفة في الملف، فتعرض المفضلة القديمة ملاحظة لطيفة بأنها «لم تعد متاحة».
النتائج
39 لعبة ونشاطًا، من بطاقات الحوار إلى ثلاث ألعاب مرسومة على الشاشة.
أكثر من 1,500 بطاقة عربية تُفحص بالمخطط في كل بناء.
بلا حسابات وبلا تحليلات؛ والإجابات لا تغادر الهاتف.