Add OTP login flow and multi-cafe role switching

Introduce an OTP input box on login/register, surface user roles and a
cafe chooser, add a dashboard switch button in the POS screen, and
register OTP validators explicitly to survive Docker layer caching.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-05-29 17:14:46 +03:30
parent 923a00b113
commit c68cca4f17
15 changed files with 364 additions and 44 deletions
+14 -1
View File
@@ -41,7 +41,20 @@
"rateLimited": "طلبات الرمز كثيرة جداً. انتظر ساعة كحد أقصى أو تواصل مع الدعم.",
"notFound": "لا يوجد حساب بهذا الرقم.",
"smsFailed": "فشل إرسال الرسالة. حاول مرة أخرى.",
"invalidOtp": "رمز التحقق غير صحيح أو منتهٍ."
"invalidOtp": "رمز التحقق غير صحيح أو منتهٍ.",
"chooseCafe": "اختر المقهى",
"chooseCafeSubtitle": "هذا الرقم لديه صلاحية على عدة مقاهٍ. اختر واحداً للمتابعة.",
"createNewCafe": "إنشاء مقهى جديد",
"createNewCafeHint": "هل تريد بدء مقهاك الخاص بهذا الرقم؟"
},
"roles": {
"owner": "المالك",
"manager": "المدير",
"cashier": "أمين الصندوق",
"waiter": "النادل",
"chef": "الطاهي",
"delivery": "عامل التوصيل",
"unknown": "مستخدم"
},
"nav": {
"aria": "القائمة الرئيسية",
+21 -2
View File
@@ -52,7 +52,20 @@
"noAccount": "Don't have an account?",
"registerLink": "Register",
"alreadyRegistered": "This phone is already registered. Please sign in.",
"registrationExpired": "Registration session expired. Please try again."
"registrationExpired": "Registration session expired. Please try again.",
"chooseCafe": "Choose a café",
"chooseCafeSubtitle": "This number has access to several cafés. Pick one to continue.",
"createNewCafe": "Create a new café",
"createNewCafeHint": "Want to start your own café with this number?"
},
"roles": {
"owner": "Owner",
"manager": "Manager",
"cashier": "Cashier",
"waiter": "Waiter",
"chef": "Chef",
"delivery": "Delivery",
"unknown": "User"
},
"nav": {
"aria": "Main navigation",
@@ -93,7 +106,13 @@
"offline": "Offline",
"activePlan": "Active plan",
"editCafeSettings": "Café settings",
"viewSubscription": "Plan & billing"
"viewSubscription": "Plan & billing",
"switchCafe": "Switch café",
"currentCafe": "Current café",
"otherCafes": "Other cafés",
"createNewCafe": "Create a new café",
"openMenu": "Menu",
"switchCafeError": "Could not switch café. Please try again."
},
"overview": {
"title": "Home",
+21 -2
View File
@@ -52,7 +52,20 @@
"noAccount": "حساب ندارید؟",
"registerLink": "ثبت‌نام",
"alreadyRegistered": "این شماره قبلاً ثبت‌نام کرده است. لطفاً وارد شوید.",
"registrationExpired": "زمان ثبت‌نام منقضی شد. دوباره تلاش کنید."
"registrationExpired": "زمان ثبت‌نام منقضی شد. دوباره تلاش کنید.",
"chooseCafe": "انتخاب کافه",
"chooseCafeSubtitle": "این شماره به چند کافه دسترسی دارد. یکی را انتخاب کنید.",
"createNewCafe": "ایجاد کافه جدید",
"createNewCafeHint": "می‌خواهید کافه خودتان را با همین شماره راه‌اندازی کنید؟"
},
"roles": {
"owner": "مالک",
"manager": "مدیر",
"cashier": "صندوق‌دار",
"waiter": "گارسون",
"chef": "آشپز",
"delivery": "پیک",
"unknown": "کاربر"
},
"nav": {
"aria": "منوی اصلی",
@@ -93,7 +106,13 @@
"offline": "آفلاین",
"activePlan": "پلن فعال",
"editCafeSettings": "تنظیمات کافه",
"viewSubscription": "اشتراک و پلن"
"viewSubscription": "اشتراک و پلن",
"switchCafe": "تغییر کافه",
"currentCafe": "کافه فعلی",
"otherCafes": "کافه‌های دیگر",
"createNewCafe": "ایجاد کافه جدید",
"openMenu": "منو",
"switchCafeError": "تغییر کافه ناموفق بود. دوباره تلاش کنید."
},
"overview": {
"title": "خانه",