{t(
'Your welcome gift is ready: our complete guide to the English tenses — all 8 tenses explained with examples and a cheat sheet. We\u2019ll also send it to your email.',
'هدية ترحيبية جاهزة لك: دليلنا الكامل لأزمنة الإنجليزية — الأزمنة الثمانية مشروحة بأمثلة وورقة مرجعية. وسنرسله أيضاً إلى بريدك.',
'Hoş geldin hediyen hazır: İngilizce zamanların tam rehberi — 8 zaman, örnekler ve kopya kâğıdıyla. E-postana da göndereceğiz.'
)}
{mode === 'signin'
? t('Sign in to continue where you left off — your progress follows you on any device.','سجّل دخولك لتكمل من حيث توقفت — تقدمك يتبعك على أي جهاز.','Kaldığın yerden devam etmek için giriş yap — ilerlemen her cihazda seninle.')
: (context && context.sub) || t(
'Create your free account to keep practicing — unlimited exercises, your progress saved on any device, and a welcome gift: our complete English Tenses Guide.',
'أنشئ حسابك المجاني لمواصلة التمرين — تمارين بلا حدود، تقدمك محفوظ على أي جهاز، وهدية ترحيبية: دليل الأزمنة الإنجليزية الكامل.',
'Ücretsiz hesabını oluştur — sınırsız alıştırma, her cihazda kayıtlı ilerleme ve hoş geldin hediyesi: İngilizce Zamanlar Rehberi.'
)}
setPassword(e.target.value)} placeholder={t('At least 4 characters','4 أحرف على الأقل','En az 4 karakter')} autoComplete={mode === 'join' ? 'new-password' : 'current-password'} onKeyDown={e => { if (e.key === 'Enter') submit(); }} />
{mode === 'join' && (
setWhatsapp(e.target.value)} placeholder="+90 5xx xxx xx xx" autoComplete="tel" />
)}
{mode === 'join' && (
)}
{err &&
⚠ {err}
}
{t('Free forever. No spam — unsubscribe anytime.','مجاني للأبد. لا رسائل مزعجة — يمكنك إلغاء الاشتراك متى شئت.','Sonsuza dek ücretsiz. Spam yok — istediğin zaman ayrılabilirsin.')}
);
}
/* Wraps a practice-type mode. Pass member/onMember from the app to keep
sign-in state in sync across all sections. */
function MemberGate({ state, t, kind, member: memberProp, onMember, children }) {
const [memberLocal, setMemberLocal] = React.useState(loadMember);
const member = memberProp !== undefined ? memberProp : memberLocal;
const setMember = onMember || setMemberLocal;
const answers = (state.practiceScore && state.practiceScore.total) || 0;
const over = answers >= FREE_PRACTICE_ANSWERS;
// Lock is decided when the mode opens — never mid-exercise
const [locked] = React.useState(over);
if (!member && locked) return ;
const leftTxt = `${Math.max(0, FREE_PRACTICE_ANSWERS - answers)} ${t('free answers left','إجابات مجانية متبقية','ücretsiz cevap kaldı')}`;
return (
{!member && (
🎁 {t('Free preview','جولة مجانية','Ücretsiz deneme')} — {leftTxt}{t('Join free for unlimited practice','انضم مجاناً لتمرين بلا حدود','Sınırsız alıştırma için ücretsiz katıl')}