// paywall.jsx — «Доступ по подписке»: вошёл через Hakku ID, но в таблице участников // его нет или подписка закончилась. Тарифы и цены — из тарифной сетки (спека §0), // покупка — на hakku.ai/community. Публичные материалы базы при этом открыты. const PLANS = [ { id:'enthusiast', name:'Enthusiast', price:'1 490 ₽', per:'/мес', note:'15 000 ₽ за год', d:'Для тех, кто хочет уверенно применять ИИ в работе и жизни.', f:['База знаний: гайды, подборки, кейсы', 'Вебинар со спецгостем', 'Ответы основателей в чате', 'Random Coffee'] }, { id:'pro', name:'PRO', price:'4 900 ₽', per:'/мес', note:'47 040 ₽ за год', accent: true, d:'Для тех, кто внедряет ИИ в бизнес или команду либо делает свой ИИ-продукт.', f:['Всё из Enthusiast и расширенная база', 'Q&A с основателями раз в месяц', 'Гость с сетапом и мастермайнд', 'Офлайн-встречи раз в два месяца'] }, ]; function PlanCards() { return (
{PLANS.map(p => (
{p.name}
{p.price}{p.per}
{p.note}

{p.d}

Выбрать {p.name} ↗
))}
); } function Paywall({ nav }) { const { user, member } = ME(); const kb = useKB(); const open = ((kb && kb.items) || []).filter(i => !i.locked).slice(0, 5); const expired = member.state === 'expired'; return (
Доступ по подписке

{expired ? 'Подписка закончилась.' : 'Вступите в сообщество.'}

{expired ? <>Подписка для {user.email} {member.status === 'paused' ? 'на паузе' : member.status === 'cancelled' ? 'отменена' : 'не продлена'} {member.paid_until ? ` (оплачено до ${fmtDate(member.paid_until)})` : ''}. Продлите — и закрытые материалы откроются снова. : <>Почты {user.email} нет среди участников сообщества. Закрытая часть базы, эфиры и чат открываются по подписке.}

Не знаете, какой тариф подойдёт?
Пройдите тест «Каких ИИ-навыков тебе не хватает» — он порекомендует тариф.
Пройти тест ↗
Уже оплатили?
Доступ открывается в течение 10 минут после того, как вас внесут в список участников. Если вошли не с той почтой, что указали при оплате, —{' '} { e.preventDefault(); osLogout(); }}>выйдите и войдите с нужной.

Открытые материалы

{ e.preventDefault(); nav('kb'); }}>Вся база →
{open.map((it, i) => )}
); } Object.assign(window, { Paywall, PlanCards });