From f61f9fb02559ead47189eee43c5f87bab589da0a Mon Sep 17 00:00:00 2001 From: xintaofei Date: Thu, 26 Mar 2026 21:47:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=80=E6=9C=89lint?= =?UTF-8?q?=E8=AD=A6=E5=91=8A=E5=92=8C=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/web/auth.rs | 2 +- src/app/commit/page.tsx | 9 +- src/app/login/page.tsx | 4 +- src/app/merge/page.tsx | 9 +- src/app/push/page.tsx | 9 +- src/app/stash/page.tsx | 4 +- src/components/chat/message-input.tsx | 1 + src/components/layout/branch-dropdown.tsx | 8 +- .../layout/folder-name-dropdown.tsx | 7 +- src/components/merge/merge-workspace.tsx | 4 +- src/components/settings/settings-shell.tsx | 7 +- .../settings/web-service-settings.tsx | 14 +-- src/lib/api.ts | 98 ++++++++++++++----- src/lib/platform.ts | 19 ++-- src/lib/transport/detect.ts | 5 +- src/lib/transport/index.ts | 5 +- src/lib/transport/tauri-transport.ts | 5 +- src/lib/transport/web-transport.ts | 5 +- src/lib/updater.ts | 11 ++- src/lib/utils.ts | 5 +- 20 files changed, 138 insertions(+), 93 deletions(-) diff --git a/src-tauri/src/web/auth.rs b/src-tauri/src/web/auth.rs index 3b9afdf..ea07fc8 100644 --- a/src-tauri/src/web/auth.rs +++ b/src-tauri/src/web/auth.rs @@ -20,7 +20,7 @@ pub async fn require_token( // Check Authorization header if let Some(auth_header) = request.headers().get("authorization") { if let Ok(auth_str) = auth_header.to_str() { - if auth_str.strip_prefix("Bearer ").map_or(false, |t| t == token) { + if auth_str.strip_prefix("Bearer ").is_some_and(|t| t == token) { return next.run(request).await; } } diff --git a/src/app/commit/page.tsx b/src/app/commit/page.tsx index 93d6ba4..36bc4eb 100644 --- a/src/app/commit/page.tsx +++ b/src/app/commit/page.tsx @@ -3,7 +3,10 @@ import { Suspense, useCallback, useEffect, useState } from "react" import { useSearchParams } from "next/navigation" import { useTranslations } from "next-intl" -const getCurrentWindow = async () => { const m = await import("@tauri-apps/api/window"); return m.getCurrentWindow() } +const getCurrentWindow = async () => { + const m = await import("@tauri-apps/api/window") + return m.getCurrentWindow() +} import { Loader2 } from "lucide-react" import { CommitWorkspace } from "@/components/layout/commit-dialog" import { AppTitleBar } from "@/components/layout/app-title-bar" @@ -74,9 +77,7 @@ function CommitPageInner() { } }, [hasValidFolderId, normalizedFolderId]) - const pageTitle = folder - ? `${t("title")} · ${folder.name}` - : t("title") + const pageTitle = folder ? `${t("title")} · ${folder.name}` : t("title") useEffect(() => { document.title = `${pageTitle} - codeg` diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index a3c74b1..92cc87f 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -73,9 +73,7 @@ export default function LoginPage() { /> - {error && ( -

{error}

- )} + {error &&

{error}

} - {error && ( -

{error}

- )} + {error &&

{error}

} {/* Connection info */} {isRunning && ( diff --git a/src/lib/api.ts b/src/lib/api.ts index d083aac..e210a6c 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -120,7 +120,11 @@ export async function acpSetConfigOption( configId: string, valueId: string ): Promise { - return getTransport().call("acp_set_config_option", { connectionId, configId, valueId }) + return getTransport().call("acp_set_config_option", { + connectionId, + configId, + valueId, + }) } export async function acpCancel(connectionId: string): Promise { @@ -483,7 +487,10 @@ export async function saveFolderOpenedConversations( folderId: number, items: OpenedConversation[] ): Promise { - return getTransport().call("save_folder_opened_conversations", { folderId, items }) + return getTransport().call("save_folder_opened_conversations", { + folderId, + items, + }) } export async function setFolderParentBranch( @@ -528,7 +535,10 @@ export async function gitPull( path: string, credentials?: GitCredentials | null ): Promise { - return getTransport().call("git_pull", { path, credentials: credentials ?? null }) + return getTransport().call("git_pull", { + path, + credentials: credentials ?? null, + }) } export async function gitStartPullMerge( @@ -546,7 +556,10 @@ export async function gitFetch( path: string, credentials?: GitCredentials | null ): Promise { - return getTransport().call("git_fetch", { path, credentials: credentials ?? null }) + return getTransport().call("git_fetch", { + path, + credentials: credentials ?? null, + }) } export async function gitPushInfo(path: string): Promise { @@ -582,7 +595,11 @@ export async function gitWorktreeAdd( branchName: string, worktreePath: string ): Promise { - return getTransport().call("git_worktree_add", { path, branchName, worktreePath }) + return getTransport().call("git_worktree_add", { + path, + branchName, + worktreePath, + }) } export async function gitCheckout( @@ -673,7 +690,7 @@ export async function openMergeWindow( folderId, operation, upstreamCommit: upstreamCommit ?? null, - }, + } ) window.open(result.path, `merge-${folderId}`) } @@ -684,7 +701,7 @@ export async function openStashWindow(folderId: number): Promise { } const result = await getTransport().call<{ path: string }>( "open_stash_window", - { folderId }, + { folderId } ) window.open(result.path, `stash-${folderId}`) } @@ -695,7 +712,7 @@ export async function openPushWindow(folderId: number): Promise { } const result = await getTransport().call<{ path: string }>( "open_push_window", - { folderId }, + { folderId } ) window.open(result.path, `push-${folderId}`) } @@ -716,7 +733,10 @@ export async function gitStashPop( path: string, stashRef?: string ): Promise { - return getTransport().call("git_stash_pop", { path, stashRef: stashRef ?? null }) + return getTransport().call("git_stash_pop", { + path, + stashRef: stashRef ?? null, + }) } export async function gitStashList(path: string): Promise { @@ -818,7 +838,11 @@ export async function gitShowDiff( commit: string, file?: string ): Promise { - return getTransport().call("git_show_diff", { path, commit, file: file ?? null }) + return getTransport().call("git_show_diff", { + path, + commit, + file: file ?? null, + }) } export async function gitShowFile( @@ -866,14 +890,14 @@ export async function gitAddFiles( export async function openFolderWindow( path: string, - options?: { newWindow?: boolean }, + options?: { newWindow?: boolean } ): Promise { if (getTransport().isDesktop()) { return getTransport().call("open_folder_window", { path }) } const entry = await getTransport().call<{ id: number }>( "open_folder_window", - { path }, + { path } ) const url = `/folder?id=${entry.id}` if (options?.newWindow) { @@ -889,7 +913,7 @@ export async function openCommitWindow(folderId: number): Promise { } const result = await getTransport().call<{ path: string }>( "open_commit_window", - { folderId }, + { folderId } ) window.open(result.path, `commit-${folderId}`) } @@ -922,7 +946,7 @@ export async function openSettingsWindow( { section: section ?? null, agentType: options?.agentType ?? null, - }, + } ) window.open(result.path, `settings-${section ?? "general"}`) } @@ -938,7 +962,12 @@ export async function focusFolderWindow(folderId: number): Promise { // Web mode: open empty string to focus existing named window without reload. // If the window doesn't exist (was closed), open the folder page. const win = window.open("", `folder-${folderId}`) - if (!win || win.closed || !win.location.href || win.location.href === "about:blank") { + if ( + !win || + win.closed || + !win.location.href || + win.location.href === "about:blank" + ) { window.open(`/folder?id=${folderId}`, `folder-${folderId}`) } } @@ -961,14 +990,20 @@ export async function updateConversationStatus( conversationId: number, status: string ): Promise { - return getTransport().call("update_conversation_status", { conversationId, status }) + return getTransport().call("update_conversation_status", { + conversationId, + status, + }) } export async function updateConversationTitle( conversationId: number, title: string ): Promise { - return getTransport().call("update_conversation_title", { conversationId, title }) + return getTransport().call("update_conversation_title", { + conversationId, + title, + }) } export async function updateConversationExternalId( @@ -1000,7 +1035,11 @@ export async function createFolderCommand( name: string, command: string ): Promise { - return getTransport().call("create_folder_command", { folderId, name, command }) + return getTransport().call("create_folder_command", { + folderId, + name, + command, + }) } export async function updateFolderCommand( @@ -1044,7 +1083,10 @@ export async function getFileTree( path: string, maxDepth?: number ): Promise { - return getTransport().call("get_file_tree", { path, maxDepth: maxDepth ?? null }) + return getTransport().call("get_file_tree", { + path, + maxDepth: maxDepth ?? null, + }) } export async function startFileTreeWatch(rootPath: string): Promise { @@ -1059,7 +1101,10 @@ export async function readFileBase64( path: string, maxBytes?: number ): Promise { - return getTransport().call("read_file_base64", { path, maxBytes: maxBytes ?? null }) + return getTransport().call("read_file_base64", { + path, + maxBytes: maxBytes ?? null, + }) } export async function readFilePreview( @@ -1107,7 +1152,11 @@ export async function renameFileTreeEntry( path: string, newName: string ): Promise { - return getTransport().call("rename_file_tree_entry", { rootPath, path, newName }) + return getTransport().call("rename_file_tree_entry", { + rootPath, + path, + newName, + }) } export async function deleteFileTreeEntry( @@ -1123,7 +1172,12 @@ export async function createFileTreeEntry( name: string, kind: "file" | "dir" ): Promise { - return getTransport().call("create_file_tree_entry", { rootPath, path, name, kind }) + return getTransport().call("create_file_tree_entry", { + rootPath, + path, + name, + kind, + }) } export async function gitLog( diff --git a/src/lib/platform.ts b/src/lib/platform.ts index 864cb1f..1c483d7 100644 --- a/src/lib/platform.ts +++ b/src/lib/platform.ts @@ -24,9 +24,7 @@ export async function subscribe( */ export async function openUrl(url: string): Promise { if (isDesktop()) { - const { openUrl: tauriOpenUrl } = await import( - "@tauri-apps/plugin-opener" - ) + const { openUrl: tauriOpenUrl } = await import("@tauri-apps/plugin-opener") await tauriOpenUrl(url) } else { window.open(url, "_blank") @@ -39,9 +37,8 @@ export async function openUrl(url: string): Promise { */ export async function openPath(path: string): Promise { if (isDesktop()) { - const { openPath: tauriOpenPath } = await import( - "@tauri-apps/plugin-opener" - ) + const { openPath: tauriOpenPath } = + await import("@tauri-apps/plugin-opener") await tauriOpenPath(path) } } @@ -52,9 +49,8 @@ export async function openPath(path: string): Promise { */ export async function revealItemInDir(path: string): Promise { if (isDesktop()) { - const { revealItemInDir: tauriReveal } = await import( - "@tauri-apps/plugin-opener" - ) + const { revealItemInDir: tauriReveal } = + await import("@tauri-apps/plugin-opener") await tauriReveal(path) } } @@ -101,9 +97,8 @@ export async function openFileDialog(options?: { */ export async function getCurrentWindow() { if (isDesktop()) { - const { getCurrentWindow: tauriGetCurrentWindow } = await import( - "@tauri-apps/api/window" - ) + const { getCurrentWindow: tauriGetCurrentWindow } = + await import("@tauri-apps/api/window") return tauriGetCurrentWindow() } return null diff --git a/src/lib/transport/detect.ts b/src/lib/transport/detect.ts index 7a883ad..80e493b 100644 --- a/src/lib/transport/detect.ts +++ b/src/lib/transport/detect.ts @@ -1,10 +1,7 @@ export type TransportEnvironment = "tauri" | "web" export function detectEnvironment(): TransportEnvironment { - if ( - typeof window !== "undefined" && - "__TAURI_INTERNALS__" in window - ) { + if (typeof window !== "undefined" && "__TAURI_INTERNALS__" in window) { return "tauri" } return "web" diff --git a/src/lib/transport/index.ts b/src/lib/transport/index.ts index 9b0b9bc..af135e5 100644 --- a/src/lib/transport/index.ts +++ b/src/lib/transport/index.ts @@ -10,17 +10,16 @@ export function getTransport(): Transport { const env = detectEnvironment() if (env === "tauri") { // Use dynamic require to avoid bundling tauri deps in web mode. - // TauriTransport uses dynamic imports internally. + // eslint-disable-next-line @typescript-eslint/no-require-imports const { TauriTransport } = require("./tauri-transport") as { TauriTransport: new () => Transport } _transport = new TauriTransport() } else { + // eslint-disable-next-line @typescript-eslint/no-require-imports const { WebTransport } = require("./web-transport") as { WebTransport: new (baseUrl: string) => Transport } - // In web mode, the API is served from the same origin. - // Token is read from localStorage on each request. const baseUrl = window.location.origin _transport = new WebTransport(baseUrl) } diff --git a/src/lib/transport/tauri-transport.ts b/src/lib/transport/tauri-transport.ts index b60f19b..8430402 100644 --- a/src/lib/transport/tauri-transport.ts +++ b/src/lib/transport/tauri-transport.ts @@ -1,10 +1,7 @@ import type { Transport, UnsubscribeFn } from "./types" export class TauriTransport implements Transport { - async call( - command: string, - args?: Record - ): Promise { + async call(command: string, args?: Record): Promise { const { invoke } = await import("@tauri-apps/api/core") return invoke(command, args) } diff --git a/src/lib/transport/web-transport.ts b/src/lib/transport/web-transport.ts index 0ea9560..a4731e2 100644 --- a/src/lib/transport/web-transport.ts +++ b/src/lib/transport/web-transport.ts @@ -20,10 +20,7 @@ export class WebTransport implements Transport { this.baseUrl = baseUrl } - async call( - command: string, - args?: Record - ): Promise { + async call(command: string, args?: Record): Promise { const token = getToken() const res = await fetch(`${this.baseUrl}/api/${command}`, { method: "POST", diff --git a/src/lib/updater.ts b/src/lib/updater.ts index f53d3f6..dab70c3 100644 --- a/src/lib/updater.ts +++ b/src/lib/updater.ts @@ -23,7 +23,8 @@ export interface AppUpdateErrorInfo { export async function getCurrentAppVersion(): Promise { if (!isDesktop()) { - const result = await getTransport().call("check_app_update") + const result = + await getTransport().call("check_app_update") return result.currentVersion } try { @@ -44,7 +45,9 @@ export async function checkAppUpdate(): Promise { return { currentVersion, update } } -export async function installAppUpdate(update: NonNullable): Promise { +export async function installAppUpdate( + update: NonNullable +): Promise { await update.downloadAndInstall() } @@ -53,7 +56,9 @@ export async function relaunchApp(): Promise { await relaunch() } -export async function closeAppUpdate(update: NonNullable): Promise { +export async function closeAppUpdate( + update: NonNullable +): Promise { await update.close() } diff --git a/src/lib/utils.ts b/src/lib/utils.ts index da1b087..63d3f75 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -10,7 +10,10 @@ export function cn(...inputs: ClassValue[]) { * contexts), otherwise falls back to `crypto.getRandomValues()`. */ export function randomUUID(): string { - if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") { + if ( + typeof crypto !== "undefined" && + typeof crypto.randomUUID === "function" + ) { return crypto.randomUUID() } // Fallback for non-secure contexts (HTTP over LAN)