import { useEffect, useRef } from 'react'; import { Check, ChevronLeft, Loader2, RefreshCw, ShieldCheck, X } from 'lucide-react'; import { FeishuLogoIcon } from '../FeishuLogoIcon.jsx'; export function DocsPanel({ open, docs, busy, error, onClose, onConnect, onDisconnect, onOpenHome, onOpenAuth, onRefresh }) { const closeButtonRef = useRef(null); useEffect(() => { if (open) { closeButtonRef.current?.focus(); } }, [open]); if (!open) { return null; } const cliInstalled = Boolean(docs?.cliInstalled); const skillsInstalled = Boolean(docs?.skillsInstalled); const configured = Boolean(docs?.configured); const connected = Boolean(docs?.connected); const authorizationReady = connected && Boolean(docs?.authorizationReady); const missingScopes = Array.isArray(docs?.missingScopes) ? docs.missingScopes : []; const needsExtraAuth = connected && (!authorizationReady || missingScopes.length > 0); const slidesAuthorized = connected && Boolean(docs?.slidesAuthorized); const sheetsAuthorized = connected && Boolean(docs?.sheetsAuthorized); const authPending = docs?.authPending; const setupItems = [ { id: 'cli', label: 'lark-cli', ok: cliInstalled }, { id: 'skills', label: '官方 skills', ok: skillsInstalled }, { id: 'config', label: 'App 凭证', ok: configured }, { id: 'auth', label: '用户授权', ok: connected }, { id: 'slides', label: 'PPT 权限', ok: slidesAuthorized }, { id: 'sheets', label: '表格权限', ok: sheetsAuthorized } ]; const subtitle = connected ? needsExtraAuth ? '待补权限' : '' : authPending?.status === 'polling' ? '等待授权' : configured ? '未连接' : '未配置'; const summary = authPending?.status === 'polling' ? '授权页已打开,完成后回到这里刷新状态。' : connected ? needsExtraAuth ? '飞书账号已连接,但部分文档权限还没授权。补充授权后,Codex 可完整操作飞书文档、PPT、表格和云空间文件。' : 'Codex 已可操作飞书文档、PPT、表格和云空间文件。' : !cliInstalled ? '本机还没有检测到 lark-cli。' : !skillsInstalled ? '官方文档 skills 还没有安装完整。' : configured ? '连接飞书账号后,Codex 才能以你的身份操作文档、PPT 和表格。' : '请先在后端配置飞书 App ID 和 Secret。'; const canConnect = cliInstalled && skillsInstalled && configured; return (
飞书文档 {subtitle ? {subtitle} : null}

飞书文档

{summary}

{error ?
{error}
: null} {authPending?.verificationUrl && (!connected || needsExtraAuth) ? (
授权码 {authPending.userCode || '已生成'}
) : null}
{setupItems.map((item) => (
{item.ok ? : } {item.label}
))}
{needsExtraAuth && missingScopes.length ? (
缺少 {missingScopes.slice(0, 4).join('、')}
) : null}
{connected ? ( <> ) : ( <> )}
); }