import { useState, type FormEvent } from "react"; import { useNavigate } from "react-router-dom"; import { api, uploadRaw, type Game } from "../api"; export function NewGame() { const navigate = useNavigate(); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [tags, setTags] = useState(""); const [file, setFile] = useState(null); const [progress, setProgress] = useState(null); const [error, setError] = useState(""); const submit = async (e: FormEvent) => { e.preventDefault(); if (!file) return; setError(""); setProgress(0); let game: Game | null = null; try { game = await api.post("/api/games", { title: title.trim() || file.name.replace(/\.(zip|7z|rar|tar.*)$/i, ""), description, tags: tags.split(",").map((t) => t.trim()).filter(Boolean), }); await uploadRaw("POST", `/api/games/${game.id}/upload?filename=${encodeURIComponent(file.name)}`, file, setProgress); navigate(`/games/${game.id}`); } catch (err) { // don't leave an empty game card behind when the archive never arrived if (game) await api.del(`/api/games/${game.id}`).catch(() => {}); setError((err as Error).message); setProgress(null); } }; return (

Новая игра

Загрузите архив с игрой Ren'Py (zip, 7z, rar, tar). После загрузки сервер распакует его, сконвертирует скрипты и ассеты в формат PGVN и удалит исходники.