From b7008a132e6f01320b674a78e963e9a1de5a3640 Mon Sep 17 00:00:00 2001 From: lanrtop Date: Fri, 3 Jul 2026 09:38:31 +0900 Subject: [PATCH] =?UTF-8?q?fix(gitea):=20=E5=BB=BA=E4=BB=93=E9=9C=80=20wri?= =?UTF-8?q?te:user=20scope=E2=80=94=E2=80=94=E5=AE=9E=E4=BE=8B=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=94=B9=20Token=20+=20=E6=9D=83=E9=99=90=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Gitea 的 POST /user/repos 归 write:user scope(403 实测,R10:以实际 行为为准),此前权限指导只给了 read:user 导致新建仓库失败 - GiteaInstancesSection 新增「改 Token」内联编辑(此前无入口,删除实例 重建会级联丢失全部仓库绑定) - 添加实例的 placeholder 补权限要求说明 Rules-Applied: R08, R10 --- src/components/dashboard/GiteaPanel.tsx | 73 ++++++++++++++++++++----- 1 file changed, 58 insertions(+), 15 deletions(-) diff --git a/src/components/dashboard/GiteaPanel.tsx b/src/components/dashboard/GiteaPanel.tsx index 92d470e..568330f 100644 --- a/src/components/dashboard/GiteaPanel.tsx +++ b/src/components/dashboard/GiteaPanel.tsx @@ -8,6 +8,7 @@ import { giteaSaveInstance, giteaListInstances, giteaDeleteInstance, + giteaUpdateInstance, giteaTestConnection, giteaGetRepoLink, giteaListLinkedRepos, @@ -46,6 +47,21 @@ export function GiteaInstancesSection() { const [instUrl, setInstUrl] = useState(""); const [instToken, setInstToken] = useState(""); const [testing, setTesting] = useState(null); + const [editingTokenId, setEditingTokenId] = useState(null); + const [newToken, setNewToken] = useState(""); + + const handleUpdateToken = async (id: string) => { + if (!newToken.trim()) return; + try { + await giteaUpdateInstance(id, { access_token: newToken.trim() }); + qc.invalidateQueries({ queryKey: ["gitea-instances"] }); + setEditingTokenId(null); + setNewToken(""); + showToast("Token 已更新 ✓ 可点「测试连接」验证"); + } catch (e) { + showToast(`❌ ${e}`); + } + }; const handleAdd = async () => { if (!instName.trim() || !instUrl.trim() || !instToken.trim()) return; @@ -105,28 +121,55 @@ export function GiteaInstancesSection() {

尚未添加 Gitea 实例——添加后可在各项目蓝图的治理面板中绑定仓库

)} {instances.map((inst) => ( -
- {inst.name} - {inst.is_default && ( - 默认 +
+
+ {inst.name} + {inst.is_default && ( + 默认 + )} + {inst.url} + + + +
+ {editingTokenId === inst.id && ( +
+ setNewToken(e.target.value)} + autoFocus + /> + +
)} - {inst.url} - -
))} {showAdd && (
setInstName(e.target.value)} /> setInstUrl(e.target.value)} /> - setInstToken(e.target.value)} /> + setInstToken(e.target.value)} />