// 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
);
};