import React, { useState, useEffect } from 'react'; import cl from './GameSettingsModal.module.css'; import Icon from './Icon'; /** * PublishModal — публикация проекта в умную ленту Рублокса. * * Премодерации больше нет (RUBLOX_SMART_FEED_PLAN.md). Игра публикуется * сразу: проходит автопроверку скриптов и попадает в ленту «Новое». * Дальше её судьбу решает алгоритм — лайки, просмотры, время в игре. * * Поля: * - Возрастной рейтинг: 6 / 12 / 16 / 18 * - Подтверждение «Я ознакомился с правилами публикации» * * Props: * open * project — { title, description, status, age_rating } * onClose * onSubmit({ age_rating }) → должен вернуть результат публикации * (например { review: bool }), чтобы показать нужное сообщение. */ const AGE_OPTIONS = [ { id: 6, label: '6+', desc: 'Для самых маленьких. Никакого насилия.' }, { id: 12, label: '12+', desc: 'Лёгкая фантастика, без жестокости.' }, { id: 16, label: '16+', desc: 'Подростковая. Лёгкое насилие допустимо.' }, { id: 18, label: '18+', desc: 'Для взрослых.' }, ]; // Самописная иконка «как работает алгоритм» — ступеньки роста. const AlgoIcon = ({ size = 16 }) => ( ); const PublishModal = ({ open, project, onClose, onSubmit }) => { const [ageRating, setAgeRating] = useState(12); const [confirmed, setConfirmed] = useState(false); const [error, setError] = useState(''); const [submitting, setSubmitting] = useState(false); useEffect(() => { if (!open) return; setAgeRating(project?.age_rating || 12); setConfirmed(false); setError(''); setSubmitting(false); // eslint-disable-next-line react-hooks/exhaustive-deps }, [open]); if (!open) return null; const handleSubmit = async () => { if (!confirmed) { setError('Подтвердите что вы ознакомились с правилами'); return; } setSubmitting(true); try { await onSubmit?.({ age_rating: ageRating }); onClose?.(); } catch (e) { // Приоритет — понятное message от бэка (фильтр названия/описания // отдаёт его), затем код ошибки, затем общий текст. setError(e?.response?.data?.message || e?.response?.data?.error || e?.message || 'Не удалось опубликовать'); setSubmitting(false); } }; // Игра уже опубликована (новый статус 'published') — это переиздание. const isAlreadyPublished = project?.status === 'published'; return (
e.stopPropagation()}>

{isAlreadyPublished ? 'Обновить игру' : 'Опубликовать игру'}

{/* === Как работает лента === */}
Как игра попадает в ленту
  • После публикации игра сразу появляется во вкладке «Новое» — ждать одобрения не нужно.
  • Первые дни ей дают пробный показ. Если игроки ставят лайки и долго играют — она поднимается во вкладку «Рекомендуем».
  • Если игру мало кто запускает или ставят много дизлайков — она тихо опускается в ленте. Но её всё равно можно найти через поиск.
  • Хочешь в топ — делай игру интересной: чтобы в неё хотелось играть и возвращаться.
{isAlreadyPublished && (
Игра уже опубликована. Обновление сохранит изменения — игра останется в ленте, из неё не пропадёт.
)} {/* Возрастной рейтинг */}
Возрастной рейтинг *
{AGE_OPTIONS.map(opt => { const active = ageRating === opt.id; return ( ); })}
{/* Подтверждение */}
{error && (
{error}
)}
); }; export default PublishModal;