// Version: 2.11.31 (Removed obsolete AdminPanel) // --- GLOBAL SHARED COMPONENTS --- var { useState, useEffect, useMemo, useRef } = React; var ADMIN_VERSION = "2.11.31"; var API_BASE = (window.location.protocol === 'blob:' || window.location.protocol === 'file:') ? 'https://kp-generator-b4fb.onrender.com' : ''; // ИСПРАВЛЕНИЕ: Теперь SafeIcon честно ищет иконку, а не возвращает текст window.SafeIcon = window.SafeIcon || (({ name, fallback = 'LayoutTemplate', ...props }) => { let Icon = window[name]; if (!Icon) Icon = window[fallback]; if (!Icon) return [{name}]; return ; }); var SafeIcon = window.SafeIcon; window.TelegramLogin = ({ onAuth, botUsername }) => { const ref = useRef(null); const onAuthRef = useRef(onAuth); useEffect(() => { onAuthRef.current = onAuth; }, [onAuth]); useEffect(() => { window.onTelegramAuth = (user) => { if (onAuthRef.current) onAuthRef.current(user); }; if (ref.current) { ref.current.innerHTML = ""; const script = document.createElement("script"); script.src = "https://telegram.org/js/telegram-widget.js?22"; script.setAttribute("data-telegram-login", botUsername); script.setAttribute("data-size", "large"); script.setAttribute("data-radius", "10"); script.setAttribute("data-request-access", "write"); script.setAttribute("data-userpic", "false"); script.setAttribute("data-onauth", "onTelegramAuth(user)"); script.async = true; ref.current.appendChild(script); } }, [botUsername]); return
; }; window.ApiTestButton = () => { const [status, setStatus] = useState('idle'); const test = async () => { setStatus('loading'); try { const res = await fetch(`/api/proxy/search?article=102529M`); if (!res.ok) throw new Error(res.statusText); const json = await res.json(); if (json.found !== undefined) { setStatus('success'); setTimeout(() => setStatus('idle'), 3000); } else { throw new Error("Некорректный ответ"); } } catch (e) { console.error(e); setStatus('error'); setTimeout(() => setStatus('idle'), 3000); } }; if (status === 'loading') return Проверка...; if (status === 'success') return ✅ OK; if (status === 'error') return ❌ Ошибка; return ; }; window.BonusBanner = ({ refLink, isVip }) => { const [expanded, setExpanded] = useState(false); const copyRef = (e) => { e.stopPropagation(); navigator.clipboard.writeText(refLink).then(() => alert("Ссылка скопирована!")); }; const shareTelegram = (e) => { e.stopPropagation(); const text = encodeURIComponent("Привет! Рекомендую этот конструктор КП. Регистрируйся по ссылке и получи бонусы:"); window.open(`https://t.me/share/url?url=${refLink}&text=${text}`, '_blank'); }; return (
setExpanded(!expanded)} className={"bg-gradient-to-r from-blue-600 to-indigo-600 rounded-xl p-4 shadow-lg text-white mb-8 relative overflow-hidden cursor-pointer transition-all " + (expanded ? 'h-auto' : 'h-16 flex items-center')}>

{isVip ? "Пригласить коллегу" : "Бонусная программа"}

{expanded && (

{isVip ? "У вас уже максимальный статус VIP. Поделитесь ссылкой с коллегами, чтобы они получили 2 месяца тарифа Speed при регистрации!" : Пригласите коллегу или друга! Вы получите 7 дней тарифа Speed сразу после его регистрации, и еще 2 месяца, когда он совершит первую оплату. Ваш друг получит 2 месяца тарифа Speed при регистрации по вашей ссылке. }

{refLink || "Loading..."}
)}
{expanded &&
}
); }; window.TariffModal = ({ isOpen, onClose, botLink, prices, user, onPaymentSuccess }) => { useEffect(() => { if (!isOpen || !user) return; const pollInterval = setInterval(async () => { try { const res = await fetch(`/api/user/status/${user.id}`); if (!res.ok) return; const status = await res.json(); const currentTierVal = getTierValue(user.tier); const newTierVal = getTierValue(status.tier); if (newTierVal > currentTierVal || (status.is_premium && !user.is_premium) || (status.is_premium && status.sub_end !== user.sub_end)) { if (onPaymentSuccess) onPaymentSuccess(status); } } catch (e) { console.error("Polling error", e); } }, 3000); return () => clearInterval(pollInterval); }, [isOpen, user, onPaymentSuccess]); const getTierValue = (t) => { if (t === 'vip') return 3; if (t === 'speed') return 2; if (t === 'manager') return 1; return 0; }; const getSafeBotLink = () => { if (botLink && botLink.startsWith('http')) return botLink; const fallbackName = window.BOT_USERNAME || 'kp_gen_my_bot'; return `https://t.me/${fallbackName}`; }; const safeLink = getSafeBotLink(); if (!isOpen) return null; return (
e.stopPropagation()}>

Выберите тариф

Manager

{prices.manager} ⭐️ / мес
  • 5 документов
  • Без водяного знака
  • Сохранение в облако
  • Без интеграции 1С
Выбрать Manager

Speed

HIT
{prices.speed} ⭐️ / мес
  • Безлимит документов
  • Без водяного знака
  • Интеграция 1С
  • Приоритетная поддержка
Выбрать Speed
); };