import { useState, useEffect } from "react"; import { listen } from "@tauri-apps/api/event"; import { DeepLinkImportRequest, deeplinkApi } from "@/lib/api/deeplink"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { toast } from "sonner"; import { useTranslation } from "react-i18next"; import { useQueryClient } from "@tanstack/react-query"; interface DeeplinkError { url: string; error: string; } export function DeepLinkImportDialog() { const { t } = useTranslation(); const queryClient = useQueryClient(); const [request, setRequest] = useState(null); const [isImporting, setIsImporting] = useState(false); const [isOpen, setIsOpen] = useState(false); useEffect(() => { // Listen for deep link import events const unlistenImport = listen( "deeplink-import", (event) => { console.log("Deep link import event received:", event.payload); setRequest(event.payload); setIsOpen(true); }, ); // Listen for deep link error events const unlistenError = listen("deeplink-error", (event) => { console.error("Deep link error:", event.payload); toast.error(t("deeplink.parseError"), { description: event.payload.error, }); }); return () => { unlistenImport.then((fn) => fn()); unlistenError.then((fn) => fn()); }; }, [t]); const handleImport = async () => { if (!request) return; setIsImporting(true); try { await deeplinkApi.importFromDeeplink(request); // Invalidate provider queries to refresh the list await queryClient.invalidateQueries({ queryKey: ["providers", request.app], }); toast.success(t("deeplink.importSuccess"), { description: t("deeplink.importSuccessDescription", { name: request.name, }), }); setIsOpen(false); setRequest(null); } catch (error) { console.error("Failed to import provider from deep link:", error); toast.error(t("deeplink.importError"), { description: error instanceof Error ? error.message : String(error), }); } finally { setIsImporting(false); } }; const handleCancel = () => { setIsOpen(false); setRequest(null); }; if (!request) return null; // Mask API key for display (show first 4 chars + ***) const maskedApiKey = request.apiKey.length > 4 ? `${request.apiKey.substring(0, 4)}${"*".repeat(20)}` : "****"; return ( {/* 标题显式左对齐,避免默认居中样式影响 */} {t("deeplink.confirmImport")} {t("deeplink.confirmImportDescription")} {/* 主体内容整体右移,略大于标题内边距,让内容看起来不贴边 */}
{/* App Type */}
{t("deeplink.app")}
{request.app}
{/* Provider Name */}
{t("deeplink.providerName")}
{request.name}
{/* Homepage */}
{t("deeplink.homepage")}
{request.homepage}
{/* API Endpoint */}
{t("deeplink.endpoint")}
{request.endpoint}
{/* API Key (masked) */}
{t("deeplink.apiKey")}
{maskedApiKey}
{/* Model (if present) */} {request.model && (
{t("deeplink.model")}
{request.model}
)} {/* Notes (if present) */} {request.notes && (
{t("deeplink.notes")}
{request.notes}
)} {/* Warning */}
{t("deeplink.warning")}
); }