From 5f23adc9ae479e058c680e39a85f319e26d8ebd4 Mon Sep 17 00:00:00 2001 From: DIKER0K Date: Sat, 20 Dec 2025 19:32:47 +0500 Subject: [PATCH] add secret page --- assets/images/fake-payment.png | Bin 0 -> 16879 bytes src/renderer/App.tsx | 9 + src/renderer/components/CoinsDisplay.tsx | 21 +- src/renderer/components/PageHeader.tsx | 6 +- src/renderer/components/TopBar.tsx | 7 +- src/renderer/pages/FakePaymentPage.tsx | 518 +++++++++++++++++++++++ 6 files changed, 554 insertions(+), 7 deletions(-) create mode 100644 assets/images/fake-payment.png create mode 100644 src/renderer/pages/FakePaymentPage.tsx diff --git a/assets/images/fake-payment.png b/assets/images/fake-payment.png new file mode 100644 index 0000000000000000000000000000000000000000..9db467d09ce1e57556168f623c869cb619956ffa GIT binary patch literal 16879 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 O-GB7uVA^heoc=%Il|^>| literal 0 HcmV?d00001 diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 98022e5..43472ac 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -26,6 +26,7 @@ import DailyReward from './pages/DailyReward'; import DailyQuests from './pages/DailyQuests'; import Settings from './pages/Settings'; import Inventory from './pages/Inventory'; +import FakePaymentPage from './pages/FakePaymentPage'; import { TrayBridge } from './utils/TrayBridge'; import { API_BASE_URL } from './api'; @@ -398,6 +399,14 @@ const AppLayout = () => { } /> + + + + } + /> diff --git a/src/renderer/components/CoinsDisplay.tsx b/src/renderer/components/CoinsDisplay.tsx index cd2b920..ba1bbc9 100644 --- a/src/renderer/components/CoinsDisplay.tsx +++ b/src/renderer/components/CoinsDisplay.tsx @@ -21,6 +21,9 @@ interface CoinsDisplayProps { backgroundColor?: string; textColor?: string; + onClick?: () => void; + disableRefreshOnClick?: boolean; + sx?: SxProps; } @@ -40,6 +43,9 @@ export default function CoinsDisplay({ backgroundColor = 'rgba(0, 0, 0, 0.2)', textColor = 'white', + onClick, + disableRefreshOnClick = false, + sx, }: CoinsDisplayProps) { const [isLoading, setIsLoading] = useState(false); @@ -61,6 +67,14 @@ export default function CoinsDisplay({ } }; + const handleClick = () => { + // 1) если передали внешний обработчик — выполняем его + if (onClick) onClick(); + + // 2) опционально оставляем обновление баланса по клику + if (!disableRefreshOnClick && username) fetchCoinsData(); + }; + const [coins, setCoins] = useState(() => { // 1) если пришло значение извне — оно приоритетнее if (externalValue !== undefined) return externalValue; @@ -76,7 +90,8 @@ export default function CoinsDisplay({ useEffect(() => { const handler = () => setSettingsVersion((v) => v + 1); window.addEventListener('settings-updated', handler as EventListener); - return () => window.removeEventListener('settings-updated', handler as EventListener); + return () => + window.removeEventListener('settings-updated', handler as EventListener); }, []); const isTooltipDisabledBySettings = useMemo(() => { @@ -191,7 +206,7 @@ export default function CoinsDisplay({ borderRadius: sizes.borderRadius, padding: sizes.containerPadding, border: '1px solid rgba(255, 255, 255, 0.1)', - cursor: tooltipEnabled ? 'help' : 'default', + cursor: onClick ? 'pointer' : tooltipEnabled ? 'help' : 'default', // можно оставить лёгкий намёк на загрузку, но без "пульса" текста opacity: isLoading ? 0.85 : 1, @@ -199,7 +214,7 @@ export default function CoinsDisplay({ ...sx, }} - onClick={username ? handleRefresh : undefined} + onClick={handleClick} title={username ? 'Нажмите для обновления' : undefined} > {showIcon && ( diff --git a/src/renderer/components/PageHeader.tsx b/src/renderer/components/PageHeader.tsx index b689b27..db83526 100644 --- a/src/renderer/components/PageHeader.tsx +++ b/src/renderer/components/PageHeader.tsx @@ -34,6 +34,7 @@ export default function PageHeader() { path === '/marketplace' || path === '/profile' || path === '/inventory' || + path === '/fakepaymentpage' || path.startsWith('/launch') ) { return { title: '', subtitle: '', hidden: true }; @@ -43,7 +44,7 @@ export default function PageHeader() { return { title: 'Настройки', subtitle: 'Персонализация интерфейса и поведения лаунчера', - } + }; } if (path === '/news') { @@ -63,7 +64,8 @@ export default function PageHeader() { if (path.startsWith('/daily')) { return { title: 'Ежедневные награды', - subtitle: 'Ежедневный вход на сервер приносит бонусы и полезные награды!', + subtitle: + 'Ежедневный вход на сервер приносит бонусы и полезные награды!', }; } diff --git a/src/renderer/components/TopBar.tsx b/src/renderer/components/TopBar.tsx index ed37ee3..312b737 100644 --- a/src/renderer/components/TopBar.tsx +++ b/src/renderer/components/TopBar.tsx @@ -262,12 +262,13 @@ export default function TopBar({ onRegister, username }: TopBarProps) { }; window.addEventListener('settings-updated', handler as EventListener); - return () => window.removeEventListener('settings-updated', handler as EventListener); + return () => + window.removeEventListener('settings-updated', handler as EventListener); }, [updateGradientVars]); return ( navigate('/fakepaymentpage')} + disableRefreshOnClick={true} // чтобы клик не дёргал fetchCoins /> )} diff --git a/src/renderer/pages/FakePaymentPage.tsx b/src/renderer/pages/FakePaymentPage.tsx new file mode 100644 index 0000000..960ad61 --- /dev/null +++ b/src/renderer/pages/FakePaymentPage.tsx @@ -0,0 +1,518 @@ +// pages/TopUpPage.tsx +import { + Box, + Button, + Paper, + Stack, + TextField, + Typography, + ToggleButton, + ToggleButtonGroup, + CircularProgress, + LinearProgress, +} from '@mui/material'; +import { styled } from '@mui/material/styles'; +import { useEffect, useMemo, useRef, useState } from 'react'; +import fakePaymentImg from '../../../assets/images/fake-payment.png'; +import { useNavigate } from 'react-router-dom'; + +type PayMethod = 'sbp' | 'card' | 'crypto' | 'other'; +type Stage = 'form' | 'processing' | 'done'; + +const STEPS: string[] = [ + 'Создаём счёт…', + 'Проверяем данные…', + 'Подключаем платёжный шлюз…', + 'Ожидаем подтверждение…', + 'Подписываем запрос…', + 'Проверяем лимиты…', + 'Синхронизируем баланс…', + 'Завершаем операцию…', + 'Почти готово…', +]; + +// ===== Styles “как Registration” ===== +const GRADIENT = + 'linear-gradient(71deg, #F27121 0%, #E940CD 70%, #8A2387 100%)'; + +const GlassPaper = styled(Paper)(() => ({ + position: 'relative', + overflow: 'hidden', + borderRadius: 28, + background: 'rgba(0,0,0,0.35)', + border: '1px solid rgba(255,255,255,0.10)', + backdropFilter: 'blur(14px)', + boxShadow: '0 20px 60px rgba(0,0,0,0.45)', +})); + +const Glow = styled('div')(() => ({ + position: 'absolute', + inset: -2, + background: + 'radial-gradient(800px 300px at 20% 10%, rgba(242,113,33,0.22), transparent 60%),' + + 'radial-gradient(800px 300px at 80% 0%, rgba(233,64,205,0.18), transparent 55%),' + + 'radial-gradient(900px 420px at 50% 110%, rgba(138,35,135,0.20), transparent 60%)', + pointerEvents: 'none', +})); + +const GradientTitle = styled(Typography)(() => ({ + fontWeight: 900, + backgroundImage: + 'linear-gradient(136deg, rgb(242,113,33) 0%, rgb(233,64,87) 50%, rgb(138,35,135) 100%)', + WebkitBackgroundClip: 'text', + WebkitTextFillColor: 'transparent', + fontFamily: 'Benzin-Bold, sans-serif', +})); + +const GradientButton = styled(Button)(() => ({ + background: GRADIENT, + fontFamily: 'Benzin-Bold, sans-serif', + borderRadius: 999, + textTransform: 'none', + transition: 'transform 0.25s ease, filter 0.25s ease, box-shadow 0.25s ease', + boxShadow: '0 12px 30px rgba(0,0,0,0.35)', + '&:hover': { + transform: 'scale(1.04)', + filter: 'brightness(1.06)', + boxShadow: '0 16px 42px rgba(0,0,0,0.48)', + background: GRADIENT, + }, + '&:disabled': { + background: 'rgba(255,255,255,0.08)', + color: 'rgba(255,255,255,0.35)', + boxShadow: 'none', + }, +})); + +const StyledToggleButtonGroup = styled(ToggleButtonGroup)(() => ({ + borderRadius: 999, + overflow: 'hidden', + border: '1px solid rgba(255,255,255,0.10)', + background: 'rgba(255,255,255,0.06)', + '& .MuiToggleButton-root': { + border: 'none', + color: 'rgba(255,255,255,0.75)', + fontFamily: 'Benzin-Bold, sans-serif', + letterSpacing: '0.02em', + paddingTop: 10, + paddingBottom: 10, + transition: 'transform 0.2s ease, background 0.2s ease, color 0.2s ease', + }, + '& .MuiToggleButton-root:hover': { + background: 'rgba(255,255,255,0.08)', + transform: 'scale(1.02)', + }, + '& .MuiToggleButton-root.Mui-selected': { + color: '#fff', + background: GRADIENT, + }, + '& .MuiToggleButton-root.Mui-selected:hover': { + background: GRADIENT, + }, +})); + +const StyledTextField = styled(TextField)(() => ({ + '& .MuiInputLabel-root': { + color: 'rgba(255,255,255,0.65)', + }, + '& .MuiInputLabel-root.Mui-focused': { + color: 'rgba(255,255,255,0.9)', + }, + '& .MuiOutlinedInput-root': { + borderRadius: 20, + background: 'rgba(255,255,255,0.06)', + color: '#fff', + fontFamily: 'Benzin-Bold, sans-serif', + }, + '& .MuiOutlinedInput-notchedOutline': { + borderColor: 'rgba(255,255,255,0.10)', + }, + '& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline': { + borderColor: 'rgba(255,255,255,0.18)', + }, + '& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline': { + borderColor: 'rgba(233,64,205,0.55)', + boxShadow: '0 0 0 6px rgba(233,64,205,0.12)', + }, + '& input': { + color: '#fff', + }, +})); + +export default function TopUpPage() { + const [coins, setCoins] = useState(100); + const [method, setMethod] = useState('sbp'); + const [stage, setStage] = useState('form'); + + const [stepText, setStepText] = useState('Обработка платежа…'); + const [progress, setProgress] = useState(0); + + const doneTimerRef = useRef(null); + const stepIntervalRef = useRef(null); + const navigate = useNavigate(); + + const rubles = useMemo(() => { + const safe = Number.isFinite(coins) ? coins : 0; + return Math.max(0, Math.floor(safe)); + }, [coins]); + + const methodLabel = useMemo(() => { + switch (method) { + case 'sbp': + return 'СБП'; + case 'card': + return 'Карта'; + case 'crypto': + return 'Crypto'; + default: + return 'Другое'; + } + }, [method]); + + const clearTimers = () => { + if (doneTimerRef.current !== null) { + window.clearTimeout(doneTimerRef.current); + doneTimerRef.current = null; + } + if (stepIntervalRef.current !== null) { + window.clearInterval(stepIntervalRef.current); + stepIntervalRef.current = null; + } + }; + + const startProcessing = () => { + clearTimers(); + setStage('processing'); + setProgress(0); + + const used = new Set(); + const pickStep = () => { + if (used.size >= STEPS.length) used.clear(); + let idx = Math.floor(Math.random() * STEPS.length); + while (used.has(idx)) idx = Math.floor(Math.random() * STEPS.length); + used.add(idx); + return STEPS[idx]; + }; + + setStepText(pickStep()); + + const totalMs = 1600 + Math.floor(Math.random() * 1600); // 1.6–3.2 + const stepsCount = 3 + Math.floor(Math.random() * 4); // 3–6 + + let ticks = 0; + stepIntervalRef.current = window.setInterval( + () => { + ticks += 1; + + setStepText(pickStep()); + setProgress((p) => { + const bump = 8 + Math.floor(Math.random() * 18); // 8..25 + return Math.min(95, p + bump); + }); + + if (ticks >= stepsCount && stepIntervalRef.current !== null) { + window.clearInterval(stepIntervalRef.current); + stepIntervalRef.current = null; + } + }, + 400 + Math.floor(Math.random() * 500), + ); // 400..900 + + doneTimerRef.current = window.setTimeout(() => { + setProgress(100); + setStepText('Готово!'); + window.setTimeout(() => setStage('done'), 250); + doneTimerRef.current = null; + }, totalMs); + }; + + const handlePay = () => { + if (rubles <= 0) return; + startProcessing(); + }; + + useEffect(() => { + return () => clearTimers(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // ===== Layout wrapper ===== + const PageCenter = ({ children }: { children: React.ReactNode }) => ( + + {children} + + ); + + // ===== DONE ===== + if (stage === 'done') { + return ( + + + + + + + + Че реально думал донат добавили? + + + + Хуй тебе а не донат + + + + + + + ); + } + + // ===== PROCESSING ===== + if (stage === 'processing') { + return ( + + + + + + + + + + {stepText} + + + + + + {Math.round(progress)}% + + + + + + + {rubles.toLocaleString('ru-RU')} ₽ + + + + + + {rubles.toLocaleString('ru-RU')} монет + + + + + + {methodLabel} + + + + + + Пожалуйста, не закрывайте окно + + + + + ); + } + + // ===== FORM ===== + return ( + + + + + + Пополнение баланса + 1 ₽ = 1 монета + + + + setCoins(Number(e.target.value))} + inputProps={{ min: 0, step: 1 }} + fullWidth + /> + + + + Итого к оплате + + + {rubles.toLocaleString('ru-RU')} ₽ + + + Начислим: {rubles.toLocaleString('ru-RU')} монет + + + + + + + Способ оплаты + + + v && setMethod(v)} + fullWidth + > + СБП + Карта + Crypto + Другое + + + + Выбрано: {methodLabel} + + + + + Оплатить + + + + + ); +}