UNPKG

rune

Version:

CLI to upload your games to Rune

60 lines (59 loc) 3.22 kB
import { Box, Text } from "ink"; import TextInputImport from "ink-text-input"; import path from "path"; import React, { useState, useMemo, useCallback, useEffect } from "react"; import { Step } from "../../components/Step.js"; import { ValidationErrors } from "../../components/ValidationErrors.js"; import { cli } from "../../lib/cli.js"; import { findGameDir } from "../../lib/findGameDir.js"; import { getGameFiles, findShortestPathFileThatEndsWith, } from "../../lib/getGameFiles.js"; import { isDir } from "../../lib/isDir.js"; import { validateGameFilesInCLI } from "../../lib/validateGameFilesInCli.js"; // @ts-ignore const TextInput = TextInputImport.default; export function GameDirInputStep({ onComplete, }) { const [gameDir, setGameDir] = useState(() => findGameDir(cli.input[1] ?? path.resolve("."))); const existsGameDir = useMemo(() => isDir(gameDir), [gameDir]); const gameDirFormatted = useMemo(() => path.relative(".", gameDir) === "" ? "Current directory" : path.resolve(gameDir), [gameDir]); const [validateGameResult, setValidateGameResult] = useState(null); const [logicJsFile, setLogicJsFile] = useState(); const onSubmitGameDir = useCallback(() => { if (!existsGameDir) return; getGameFiles(gameDir) .then((gameFiles) => { setLogicJsFile(findShortestPathFileThatEndsWith(gameFiles, "logic.js")); return validateGameFilesInCLI(gameFiles); }) .then(setValidateGameResult); }, [existsGameDir, gameDir]); useEffect(() => { if (validateGameResult?.valid) { onComplete({ gameDir }); } }, [gameDir, onComplete, validateGameResult?.valid]); useEffect(() => { if (!existsGameDir) { setValidateGameResult(null); } }, [existsGameDir]); //Skip directory selection step in case a valid directory is provided useEffect(() => { if (cli.input[1]) { onSubmitGameDir(); } }, [onSubmitGameDir]); return (React.createElement(React.Fragment, null, (!existsGameDir || !!validateGameResult?.errors.length) && (React.createElement(Step, { status: "error", label: !existsGameDir ? "Directory does not exist" : "Some issues detected with your game", view: validateGameResult && (React.createElement(ValidationErrors, { validationResult: validateGameResult, logicJsFile: logicJsFile })) })), React.createElement(Step, { status: validateGameResult?.valid ? "success" : "userInput", label: validateGameResult?.valid ? `Using game files from ${gameDirFormatted}` : validateGameResult?.valid === false ? "Update your game to fix these issues 😄" : "Enter the game directory", view: (status) => (React.createElement(Box, { flexDirection: "column" }, (status === "userInput" || status === "error") && (React.createElement(Box, null, React.createElement(Text, null, "Game directory: "), React.createElement(TextInput, { placeholder: "/path/to/game", value: gameDir, onChange: setGameDir, onSubmit: onSubmitGameDir }))))) }))); }