import React, { useState, useCallback } from "react";
import { render, Box, Text, useApp, useInput } from "ink";
import MainMenu from "./screens/MainMenu.jsx";
import FrpMenu from "./screens/FrpMenu.jsx";
import TokenPrompt from "./screens/TokenPrompt.jsx";
import ProxyForm from "./screens/ProxyForm.jsx";
import ProxyList from "./screens/ProxyList.jsx";
import PlanPreview from "./screens/PlanPreview.jsx";
import RunLog from "./screens/RunLog.jsx";
import FrpConfigForm from "./screens/FrpConfigForm.jsx";
import SshKeyPrompt from "./screens/SshKeyPrompt.jsx";
function App() {
const { exit } = useApp();
const [stack, setStack] = useState([{ name: "main" }]);
const screen = stack[stack.length - 1];
const push = useCallback((next) => {
setStack((current) => [...current, next]);
}, []);
const replace = useCallback((next) => {
setStack((current) => [...current.slice(0, -1), next]);
}, []);
const back = useCallback(() => {
setStack((current) => (current.length > 1 ? current.slice(0, -1) : current));
}, []);
const home = useCallback(() => {
setStack([{ name: "main" }]);
}, []);
useInput((input, key) => {
if (key.escape && stack.length > 1 && screen.name !== "run") {
back();
}
if (input === "q" && screen.name === "main") {
exit();
}
});
const nav = { push, replace, back, home, exit };
return (
{renderScreen(screen, nav)}
);
}
function renderScreen(screen, nav) {
switch (screen.name) {
case "main":
return ;
case "frp":
return ;
case "token":
return ;
case "frp-config-form":
return ;
case "proxy-form":
return ;
case "proxy-list":
return ;
case "ssh-key":
return ;
case "plan":
return ;
case "run":
return ;
default:
return Unknown screen: {screen.name};
}
}
const LOGO = String.raw` ____ ____ _ _
| _ \ ___ ___ _ __ | _ \ ___ | (_) ___ _ _
| | | |/ _ \/ _ \ '_ \| |_) / _ \| | |/ __| | | |
| |_| | __/ __/ |_) | __/ (_) | | | (__| |_| |
|____/ \___|\___| .__/|_| \___/|_|_|\___|\__, |
|_| |___/`;
function Header() {
return (
{LOGO}
server-config
zsh · ssh · frp client
);
}
function Footer({ screen }) {
const hint =
screen === "main"
? "↑↓ select · Enter confirm · q quit"
: screen === "run"
? "(Esc disabled while running)"
: "↑↓ select · Enter confirm · Esc back";
return (
{hint}
);
}
export function start() {
render();
}
start();