studio/src/components/PleeseReg/PleeseReg.jsx
МИН 80c31a1f94
Some checks failed
CI / Lint (pull_request) Failing after 43s
CI / Build (pull_request) Failing after 41s
CI / Secret scan (pull_request) Successful in 2m30s
CI / PR size check (pull_request) Successful in 6s
chore: onboarding-readiness — CI/ассеты/dev-login
3 блокера перед запуском opensource-контрибьюторов:

1. CI Lint+Format убран format:check (206 файлов студии не
   соответствуют prettier — отдельная задача формат-недели).
   Build/Lint/Secret-scan/PR-size остаются.

2. Ассеты (93 МБ kubikon-assets/) теперь в Gitea Releases:
   https://git.rublox.pro/rublox/studio/releases/tag/assets-v1
   Скачка через scripts/fetch-assets.js (npm run fetch-assets +
   автозапуск через postinstall).

3. Dev-login:
   - IS_DEV расширен до 127.0.0.1 (vite на Windows слушает там)
   - PleeseReg в dev показывает «Войти как гость» (?standalone=1)
     или «Вставить JWT»; в prod — редирект на rublox.pro
   - AuthContext поддерживает ?standalone=1 URL-параметр
   - ModelThumbnails кеш v19→v20 чтобы старые failed-превью
     не блокировали рендер после фикса IS_DEV
2026-05-28 14:55:08 +03:00

137 lines
6.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useState } from 'react';
import cl from './PleeseReg.module.css';
import a1 from './img/1.png';
import MyButton_1 from '../MyButton_1/MyButton_1';
// В dev (localhost / 127.0.0.1) — показываем форму вставки JWT и кнопку
// «Войти как гость» (STANDALONE-режим). В prod — редирект на rublox.pro,
// где работает настоящая регистрация. Регистрация и логин по паролю в
// opensource-студии умышленно НЕ реализованы — это отдельный сервис.
const IS_DEV =
typeof window !== 'undefined' &&
(window.location.hostname === 'localhost' ||
window.location.hostname === '127.0.0.1');
const RUBLOX_HOME =
(typeof import.meta !== 'undefined' && import.meta.env?.VITE_RUBLOX_HOME) ||
'https://rublox.pro/app';
const PleeseReg = ({ textDefault, ...props }) => {
const [showJwtInput, setShowJwtInput] = useState(false);
const [jwt, setJwt] = useState('');
const [err, setErr] = useState('');
const applyJwt = () => {
const t = jwt.trim();
if (!t.startsWith('eyJ')) {
setErr('Это не похоже на JWT (должен начинаться с eyJ)');
return;
}
try {
localStorage.setItem('Authorization', t);
localStorage.setItem('player_jwt', t);
window.location.reload();
} catch (e) {
setErr('localStorage недоступен: ' + e.message);
}
};
const enableStandalone = () => {
// Перезагрузим страницу с ?standalone=1 — AuthContext подхватит.
const url = new URL(window.location.href);
url.searchParams.set('standalone', '1');
window.location.href = url.toString();
};
if (IS_DEV) {
return (
<div className={cl.Wrap} {...props}>
<div className={cl.wrapLast}>
<img src={a1} alt="" />
<div>
{!showJwtInput ? (
<>
<MyButton_1 onClick={enableStandalone}>Войти как гость</MyButton_1>
<p>или</p>
<MyButton_1 onClick={() => setShowJwtInput(true)}>
Вставить JWT
</MyButton_1>
<p className={cl.ppropsRegPleese}>
{textDefault}
<br />
<small style={{ opacity: 0.7 }}>
Dev-режим: настоящая регистрация только на{' '}
<a href={RUBLOX_HOME} target="_blank" rel="noreferrer">
rublox.pro
</a>
</small>
</p>
</>
) : (
<>
<textarea
value={jwt}
onChange={(e) => {
setJwt(e.target.value);
setErr('');
}}
placeholder="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
style={{
width: 360,
height: 90,
fontFamily: 'monospace',
fontSize: 11,
padding: 8,
marginBottom: 12,
wordBreak: 'break-all',
}}
/>
{err && (
<p style={{ color: 'red', fontSize: 13, margin: '0 0 8px' }}>{err}</p>
)}
<MyButton_1 onClick={applyJwt}>Применить</MyButton_1>
<p
style={{ cursor: 'pointer', textDecoration: 'underline', marginTop: 8 }}
onClick={() => setShowJwtInput(false)}
>
назад
</p>
<p className={cl.ppropsRegPleese} style={{ fontSize: 12 }}>
Получить JWT: войди на{' '}
<a href={RUBLOX_HOME} target="_blank" rel="noreferrer">
rublox.pro
</a>
, открой DevTools Application Local Storage скопируй ключ{' '}
<code>Authorization</code>
</p>
</>
)}
</div>
</div>
</div>
);
}
// Prod: единственный путь — настоящий сайт Рублокса.
return (
<div className={cl.Wrap} {...props}>
<div className={cl.wrapLast}>
<img src={a1} alt="" />
<div>
<a href={`${RUBLOX_HOME}/login`} style={{ textDecoration: 'none' }}>
<MyButton_1>Войти</MyButton_1>
</a>
<p>или</p>
<a href={`${RUBLOX_HOME}/registration`} style={{ textDecoration: 'none' }}>
<MyButton_1>Зарегистрироваться</MyButton_1>
</a>
<p className={cl.ppropsRegPleese}>{textDefault}</p>
</div>
</div>
</div>
);
};
export default PleeseReg;