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
137 lines
6.2 KiB
JavaScript
137 lines
6.2 KiB
JavaScript
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;
|