feat: update Setup Wizard for Gitea tokens and URLs
This commit is contained in:
@@ -5,7 +5,7 @@ import { api } from "../services/api";
|
||||
const STEP_NAMES = [
|
||||
"Welcome",
|
||||
"Prerequisites",
|
||||
"GitHub PAT",
|
||||
"Gitea Token",
|
||||
"Workspace",
|
||||
"NWN Home",
|
||||
"Fork Repos",
|
||||
@@ -118,7 +118,7 @@ function WelcomeStep({ onNext }: StepProps) {
|
||||
Welcome to Layonara Forge
|
||||
</h2>
|
||||
<p className="mt-4" style={{ color: "var(--forge-text-secondary)" }}>
|
||||
This wizard will walk you through setting up your local NWN development environment — Docker, GitHub
|
||||
This wizard will walk you through setting up your local NWN development environment — Docker, Gitea
|
||||
access, workspace initialization, repository cloning, and database seeding.
|
||||
</p>
|
||||
<div className="mt-8">
|
||||
@@ -183,8 +183,8 @@ function PrerequisitesStep({ onNext, onBack }: StepProps) {
|
||||
);
|
||||
}
|
||||
|
||||
function GitHubPatStep({ onNext, onBack }: StepProps) {
|
||||
const [pat, setPat] = useState("");
|
||||
function GiteaTokenStep({ onNext, onBack }: StepProps) {
|
||||
const [token, setToken] = useState("");
|
||||
const [username, setUsername] = useState("");
|
||||
const [error, setError] = useState("");
|
||||
const [loading, setLoading] = useState(false);
|
||||
@@ -193,9 +193,9 @@ function GitHubPatStep({ onNext, onBack }: StepProps) {
|
||||
setLoading(true);
|
||||
setError("");
|
||||
try {
|
||||
const { login } = await api.github.validatePat(pat);
|
||||
const { login } = await api.github.validatePat(token);
|
||||
setUsername(login);
|
||||
await api.workspace.updateConfig({ githubPat: pat });
|
||||
await api.workspace.updateConfig({ githubPat: token });
|
||||
} catch (err) {
|
||||
setError(err instanceof Error ? err.message : "Validation failed");
|
||||
} finally {
|
||||
@@ -206,17 +206,25 @@ function GitHubPatStep({ onNext, onBack }: StepProps) {
|
||||
return (
|
||||
<div>
|
||||
<h2 className="text-xl font-bold" style={{ color: "var(--forge-text)" }}>
|
||||
GitHub Personal Access Token
|
||||
Gitea Access Token
|
||||
</h2>
|
||||
<p className="mt-2 text-sm" style={{ color: "var(--forge-text-secondary)" }}>
|
||||
A PAT with <code>repo</code> scope is needed to fork and push to Layonara repositories.
|
||||
A Gitea token is needed to fork and push to Layonara repositories. Generate one at{" "}
|
||||
<a
|
||||
href="https://gitea.layonara.com/user/settings/applications"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
style={{ color: "var(--forge-accent)" }}
|
||||
>
|
||||
gitea.layonara.com/user/settings/applications
|
||||
</a>
|
||||
</p>
|
||||
<div className="mt-4 flex gap-2">
|
||||
<input
|
||||
type="password"
|
||||
value={pat}
|
||||
onChange={(e) => setPat(e.target.value)}
|
||||
placeholder="ghp_..."
|
||||
value={token}
|
||||
onChange={(e) => setToken(e.target.value)}
|
||||
placeholder="Enter your Gitea token"
|
||||
className="flex-1 rounded px-3 py-2 text-sm"
|
||||
style={{
|
||||
backgroundColor: "var(--forge-bg)",
|
||||
@@ -226,7 +234,7 @@ function GitHubPatStep({ onNext, onBack }: StepProps) {
|
||||
/>
|
||||
<button
|
||||
onClick={validate}
|
||||
disabled={!pat || loading}
|
||||
disabled={!token || loading}
|
||||
className="rounded px-4 py-2 text-sm font-semibold disabled:opacity-40"
|
||||
style={{ backgroundColor: "var(--forge-accent)", color: "#000" }}
|
||||
>
|
||||
@@ -328,7 +336,7 @@ function NwnHomeStep({ onNext, onBack }: StepProps) {
|
||||
}
|
||||
|
||||
function ForkReposStep({ onNext, onBack }: StepProps) {
|
||||
const repos = ["nwn-module", "nwn-haks", "unified"];
|
||||
const forkableRepos = ["nwn-module", "nwn-haks"];
|
||||
const [forkStatus, setForkStatus] = useState<Record<string, "idle" | "forking" | "forked" | "error">>({});
|
||||
const [errors, setErrors] = useState<Record<string, string>>({});
|
||||
|
||||
@@ -361,10 +369,10 @@ function ForkReposStep({ onNext, onBack }: StepProps) {
|
||||
Fork Repositories
|
||||
</h2>
|
||||
<p className="mt-2 text-sm" style={{ color: "var(--forge-text-secondary)" }}>
|
||||
Fork the Layonara repositories to your GitHub account.
|
||||
Fork the Layonara repositories to your Gitea account.
|
||||
</p>
|
||||
<div className="mt-4 space-y-3">
|
||||
{repos.map((repo) => (
|
||||
{forkableRepos.map((repo) => (
|
||||
<div
|
||||
key={repo}
|
||||
className="flex items-center justify-between rounded p-4"
|
||||
@@ -372,7 +380,7 @@ function ForkReposStep({ onNext, onBack }: StepProps) {
|
||||
>
|
||||
<div>
|
||||
<p className="font-mono text-sm" style={{ color: "var(--forge-text)" }}>
|
||||
Layonara/{repo}
|
||||
layonara/{repo}
|
||||
</p>
|
||||
{errors[repo] && (
|
||||
<p className="mt-1 text-xs" style={{ color: "#fca5a5" }}>
|
||||
@@ -394,6 +402,22 @@ function ForkReposStep({ onNext, onBack }: StepProps) {
|
||||
</button>
|
||||
</div>
|
||||
))}
|
||||
<div
|
||||
className="flex items-center justify-between rounded p-4"
|
||||
style={{ backgroundColor: "var(--forge-bg)" }}
|
||||
>
|
||||
<div>
|
||||
<p className="font-mono text-sm" style={{ color: "var(--forge-text)" }}>
|
||||
plenarius/unified
|
||||
</p>
|
||||
<p className="mt-1 text-xs" style={{ color: "var(--forge-text-secondary)" }}>
|
||||
Read-only from GitHub (no fork needed)
|
||||
</p>
|
||||
</div>
|
||||
<span className="text-xs" style={{ color: "var(--forge-text-secondary)" }}>
|
||||
Read-only
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<StepNav onNext={onNext} onBack={onBack} step={5} />
|
||||
</div>
|
||||
@@ -430,7 +454,8 @@ function CloneReposStep({ onNext, onBack }: StepProps) {
|
||||
Clone Repositories
|
||||
</h2>
|
||||
<p className="mt-2 text-sm" style={{ color: "var(--forge-text-secondary)" }}>
|
||||
Clone all forked repositories into the workspace.
|
||||
Clone all repositories into the workspace. Gitea repos clone from your fork; unified clones directly from
|
||||
GitHub (public, read-only).
|
||||
</p>
|
||||
<div className="mt-4 space-y-2">
|
||||
{repos.map((repo) => (
|
||||
@@ -447,6 +472,11 @@ function CloneReposStep({ onNext, onBack }: StepProps) {
|
||||
<span className="font-mono text-sm" style={{ color: "var(--forge-text)" }}>
|
||||
{repo}
|
||||
</span>
|
||||
{repo === "unified" && (
|
||||
<span className="text-xs" style={{ color: "var(--forge-text-secondary)" }}>
|
||||
(GitHub, read-only)
|
||||
</span>
|
||||
)}
|
||||
{errors[repo] && (
|
||||
<span className="text-xs" style={{ color: "#fca5a5" }}>
|
||||
{errors[repo]}
|
||||
@@ -665,7 +695,7 @@ export function Setup() {
|
||||
const stepComponents = [
|
||||
<WelcomeStep key="welcome" onNext={next} onBack={back} />,
|
||||
<PrerequisitesStep key="prereqs" onNext={next} onBack={back} />,
|
||||
<GitHubPatStep key="pat" onNext={next} onBack={back} />,
|
||||
<GiteaTokenStep key="token" onNext={next} onBack={back} />,
|
||||
<WorkspaceStep key="workspace" onNext={next} onBack={back} />,
|
||||
<NwnHomeStep key="nwnhome" onNext={next} onBack={back} />,
|
||||
<ForkReposStep key="fork" onNext={next} onBack={back} />,
|
||||
|
||||
Reference in New Issue
Block a user