Files
mai-bot/dashboard/dist/assets/index-BpTcuomx.js

2 lines
26 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{r as h,j as e,i as he}from"./router-zNjPR4CY.js";import{B as F}from"./badge-CDs67obV.js";import{D as De,i as $e,j as Ee,k as Ge,l as Ve,T as ve,O as je,P as W,a3 as Ue,B as R,C as U,b as ae,d as ie,e as re,f as ne,an as Me,E as Oe,S as Fe,I as Ae}from"./index-CuOHsLf7.js";import{C as pe}from"./checkbox-DWiVrbnx.js";import{P as Ne}from"./progress-C6-hh8fF.js";import{S as ge,a as we,b as be,c as Ce,d as b}from"./select-DGqIoF9r.js";import{R as Be,u as ze,a as We}from"./restart-overlay-B44c6hlE.js";import{c as He,a as Ye,g as Xe,f as Ze,i as ue,u as qe,b as Je,d as Ke,r as Pe,e as Qe}from"./plugin-stats-Bq_VsOhk.js";import{g as Y,c as X,a as Z}from"./installed-CHw5f9lL.js";import{aH as le,aX as es,R as ss,v as ts,L as ce,e as ye,W as oe,aY as as,aZ as is,ai as rs,T as te,S as ns}from"./icons-DTcdLw9j.js";import"./utils-DjBw3JGv.js";import"./misc-BwRzHX8c.js";import"./radix-C-ZuImoP.js";import"./system-api-DeeJapvB.js";import"./unified-ws-CBnrIqHW.js";function ls({open:r,plugin:d,onOpenChange:v,onInstall:S}){const[i,f]=h.useState("main"),[I,g]=h.useState(""),[w,k]=h.useState("preset"),[_,j]=h.useState(!1),T=()=>{const u=w==="custom"?I:i;!u||u.trim()===""||(S(u),v(!1))};return e.jsx(De,{open:r,onOpenChange:v,children:e.jsxs($e,{children:[e.jsxs(Ee,{children:[e.jsx(Ge,{children:"安装插件"}),e.jsxs(Ve,{children:["安装 ",d?.manifest.name]})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-sm text-muted-foreground",children:["版本: ",d?.manifest.version]}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["作者:"," ",typeof d?.manifest.author=="string"?d.manifest.author:d?.manifest.author?.name]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(pe,{id:"advanced-options",checked:_,onCheckedChange:u=>j(u)}),e.jsx("label",{htmlFor:"advanced-options",className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",children:"高级选项"})]}),_&&e.jsx("div",{className:"space-y-4 p-4 border rounded-lg",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"分支选择"}),e.jsxs(ve,{value:w,onValueChange:u=>k(u),children:[e.jsxs(je,{className:"grid w-full grid-cols-2",children:[e.jsx(W,{value:"preset",className:"text-xs",children:"预设分支"}),e.jsx(W,{value:"custom",className:"text-xs",children:"自定义分支"})]}),w==="preset"&&e.jsx("div",{className:"mt-3",children:e.jsxs(ge,{value:i,onValueChange:f,children:[e.jsx(we,{children:e.jsx(be,{placeholder:"选择分支"})}),e.jsxs(Ce,{children:[e.jsx(b,{value:"main",children:"main (默认)"}),e.jsx(b,{value:"master",children:"master"}),e.jsx(b,{value:"dev",children:"dev (开发版)"}),e.jsx(b,{value:"develop",children:"develop"}),e.jsx(b,{value:"beta",children:"beta (测试版)"}),e.jsx(b,{value:"stable",children:"stable (稳定版)"})]})]})}),w==="custom"&&e.jsxs("div",{className:"space-y-2 mt-3",children:[e.jsx("input",{type:"text",className:"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",placeholder:"输入分支名称,例如: feature/new-feature",value:I,onChange:u=>g(u.target.value)}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"输入 Git 分支名称、标签或提交哈希"})]})]})]})}),!_&&e.jsx("p",{className:"text-sm text-muted-foreground",children:"将从默认分支 (main) 安装插件"})]}),e.jsxs(Ue,{children:[e.jsx(R,{variant:"outline",onClick:()=>v(!1),children:"取消"}),e.jsxs(R,{onClick:T,children:[e.jsx(le,{className:"h-4 w-4 mr-2"}),"安装"]})]})]})})}const cs={"Group Management":"群组管理","Entertainment & Interaction":"娱乐互动","Utility Tools":"实用工具","Content Generation":"内容生成",Multimedia:"多媒体","External Integration":"外部集成","Data Analysis & Insights":"数据分析与洞察",Other:"其他"};function de({plugin:r,gitStatus:d,maimaiVersion:v,pluginStats:S,loadProgress:i,onInstall:f,onUpdate:I,onUninstall:g,checkPluginCompatibility:w,needsUpdate:k,getStatusBadge:_,getIncompatibleReason:j}){const T=he();return e.jsxs(U,{className:"flex flex-col hover:shadow-lg transition-shadow h-full",children:[e.jsxs(ae,{className:"p-5 pb-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsx(ie,{className:"text-lg leading-snug",children:r.manifest?.name||r.id}),e.jsxs("div",{className:"flex flex-col items-end gap-1 shrink-0",children:[r.manifest?.categories&&r.manifest.categories[0]&&e.jsx(F,{variant:"secondary",className:"text-xs whitespace-nowrap",children:cs[r.manifest.categories[0]]||r.manifest.categories[0]}),_(r)]})]}),e.jsx(re,{className:"line-clamp-2 text-sm leading-snug",children:r.manifest?.description||"无描述"})]}),e.jsx(ne,{className:"px-5 pb-3",children:e.jsxs("div",{className:"space-y-2.5",children:[e.jsxs("div",{className:"flex items-center gap-3 text-sm text-muted-foreground",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(le,{className:"h-3.5 w-3.5"}),e.jsx("span",{children:(S[r.id]?.downloads??r.downloads??0).toLocaleString()})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(es,{className:"h-3.5 w-3.5 fill-yellow-400 text-yellow-400"}),e.jsx("span",{children:(S[r.id]?.rating??r.rating??0).toFixed(1)})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[r.manifest?.keywords&&r.manifest.keywords.slice(0,3).map(u=>e.jsx(F,{variant:"outline",className:"text-xs",children:u},u)),r.manifest?.keywords&&r.manifest.keywords.length>3&&e.jsxs(F,{variant:"outline",className:"text-xs",children:["+",r.manifest.keywords.length-3]})]}),e.jsxs("div",{className:"text-xs text-muted-foreground pt-2.5 border-t space-y-1",children:[e.jsxs("div",{children:["v",r.manifest?.version||"unknown"," · ",r.manifest?.author?.name||"Unknown"]}),r.manifest?.host_application&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{children:"支持:"}),e.jsxs("span",{className:"font-medium",children:[r.manifest.host_application.min_version,r.manifest.host_application.max_version?` - ${r.manifest.host_application.max_version}`:" - 最新版本"]})]})]})]})}),e.jsx(Me,{className:"px-5 pt-2 pb-5",children:e.jsxs("div",{className:"flex items-center justify-end gap-2 w-full",children:[e.jsx(R,{variant:"outline",size:"sm",onClick:()=>T({to:"/plugin-detail",search:{pluginId:r.id}}),children:"查看详情"}),r.installed?k(r)?e.jsxs(R,{size:"sm",disabled:!d?.installed||v!==null&&!w(r),title:d?.installed?v!==null&&!w(r)?j(r)??"插件与当前麦麦版本不兼容":void 0:"Git 未安装",onClick:()=>I(r),children:[e.jsx(ss,{className:"h-4 w-4 mr-1"}),"更新"]}):e.jsxs(R,{variant:"destructive",size:"sm",disabled:!d?.installed,title:d?.installed?void 0:"Git 未安装",onClick:()=>g(r),children:[e.jsx(ts,{className:"h-4 w-4 mr-1"}),"卸载"]}):e.jsxs(R,{size:"sm",disabled:!d?.installed||i?.operation==="install"||v!==null&&!w(r),title:d?.installed?v!==null&&!w(r)?j(r)??"插件与当前麦麦版本不兼容":void 0:"Git 未安装",onClick:()=>f(r),children:[e.jsx(le,{className:"h-4 w-4 mr-1"}),i?.operation==="install"&&i?.plugin_id===r.id?"安装中...":"安装"]})]})}),i&&(i.stage==="loading"||i.stage==="success"||i.stage==="error")&&i.operation!=="fetch"&&i.plugin_id===r.id&&e.jsx("div",{className:"px-5 pb-5 -mt-1",children:e.jsxs("div",{className:`space-y-2 p-3 rounded-lg border ${i.stage==="success"?"bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-900":i.stage==="error"?"bg-red-50 dark:bg-red-950/20 border-red-200 dark:border-red-900":"bg-muted/50"}`,children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[i.stage==="loading"?e.jsx(ce,{className:"h-3 w-3 animate-spin"}):i.stage==="success"?e.jsx(ye,{className:"h-3 w-3 text-green-600"}):e.jsx(oe,{className:"h-3 w-3 text-red-600"}),e.jsx("span",{className:`text-xs font-medium ${i.stage==="success"?"text-green-700 dark:text-green-300":i.stage==="error"?"text-red-700 dark:text-red-300":""}`,children:i.stage==="loading"?e.jsxs(e.Fragment,{children:[i.operation==="install"&&"正在安装",i.operation==="uninstall"&&"正在卸载",i.operation==="update"&&"正在更新"]}):i.stage==="success"?e.jsxs(e.Fragment,{children:[i.operation==="install"&&"安装完成",i.operation==="uninstall"&&"卸载完成",i.operation==="update"&&"更新完成"]}):e.jsxs(e.Fragment,{children:[i.operation==="install"&&"安装失败",i.operation==="uninstall"&&"卸载失败",i.operation==="update"&&"更新失败"]})})]}),i.stage!=="error"&&e.jsxs("span",{className:`text-xs font-medium ${i.stage==="success"?"text-green-700 dark:text-green-300":""}`,children:[i.progress,"%"]})]}),i.stage!=="error"&&e.jsx(Ne,{value:i.progress,className:`h-1.5 ${i.stage==="success"?"[&>div]:bg-green-500":""}`}),e.jsx("div",{className:`text-xs ${i.stage==="success"?"text-green-600 dark:text-green-400 truncate":i.stage==="error"?"text-red-600 dark:text-red-400":"text-muted-foreground truncate"}`,children:i.stage==="error"?i.error||i.message||"操作失败":i.message})]})})]},r.id)}function os({plugins:r,searchQuery:d,categoryFilter:v,showCompatibleOnly:S,gitStatus:i,maimaiVersion:f,pluginStats:I,loadProgress:g,onInstall:w,onUpdate:k,onUninstall:_,checkPluginCompatibility:j,needsUpdate:T,getStatusBadge:u,getIncompatibleReason:$}){const A=r.filter(l=>{if(!l.manifest||!l.installed)return!1;const M=d===""||l.manifest.name?.toLowerCase().includes(d.toLowerCase())||l.manifest.description?.toLowerCase().includes(d.toLowerCase())||l.manifest.keywords&&l.manifest.keywords.some(O=>O.toLowerCase().includes(d.toLowerCase())),G=v==="all"||l.manifest.categories&&l.manifest.categories.includes(v),C=!S||!f||j(l);return M&&G&&C});return e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-5",children:A.map(l=>e.jsx(de,{plugin:l,gitStatus:i,maimaiVersion:f,pluginStats:I,loadProgress:g,onInstall:w,onUpdate:k,onUninstall:_,checkPluginCompatibility:j,needsUpdate:T,getStatusBadge:u,getIncompatibleReason:$},l.id))})}function ds({plugins:r,searchQuery:d,categoryFilter:v,showCompatibleOnly:S,gitStatus:i,maimaiVersion:f,pluginStats:I,loadProgress:g,onInstall:w,onUpdate:k,onUninstall:_,checkPluginCompatibility:j,needsUpdate:T,getStatusBadge:u,getIncompatibleReason:$}){const A=r.filter(l=>{if(!l.manifest)return console.warn("[过滤] 跳过无 manifest 的插件:",l.id),!1;if(l.source==="local")return!1;const M=d===""||l.manifest.name?.toLowerCase().includes(d.toLowerCase())||l.manifest.description?.toLowerCase().includes(d.toLowerCase())||l.manifest.keywords&&l.manifest.keywords.some(O=>O.toLowerCase().includes(d.toLowerCase())),G=v==="all"||l.manifest.categories&&l.manifest.categories.includes(v),C=!S||!f||j(l);return M&&G&&C});return e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-5",children:A.map(l=>e.jsx(de,{plugin:l,gitStatus:i,maimaiVersion:f,pluginStats:I,loadProgress:g,onInstall:w,onUpdate:k,onUninstall:_,checkPluginCompatibility:j,needsUpdate:T,getStatusBadge:u,getIncompatibleReason:$},l.id))})}function Ss(){return e.jsx(Be,{children:e.jsx(ms,{})})}function ms(){const r=he(),{triggerRestart:d,isRestarting:v}=ze(),[S,i]=h.useState(()=>localStorage.getItem("plugins-restart-notice-dismissed")!=="true"),[f,I]=h.useState(""),[g,w]=h.useState("all"),[k,_]=h.useState("all"),[j,T]=h.useState(!0),[u,$]=h.useState([]),[A,l]=h.useState(!0),[M,G]=h.useState(null),[C,O]=h.useState(null),[p,me]=h.useState(null),[N,ke]=h.useState(null),[,H]=h.useState([]),[q,_e]=h.useState({}),[Se,J]=h.useState(!1),[E,xe]=h.useState(null),{toast:m}=Oe(),Ie=()=>{localStorage.setItem("plugins-restart-notice-dismissed","true"),i(!1)},Le=async s=>{const t=s.map(async o=>{try{const n=await Qe(o.id);return{id:o.id,stats:n}}catch(n){return console.warn(`Failed to load stats for ${o.id}:`,n),{id:o.id,stats:null}}}),c=await Promise.all(t),a={};c.forEach(({id:o,stats:n})=>{n&&(a[o]=n)}),_e(a)};h.useEffect(()=>{let s=null,t=!1;return(async()=>{if(s=await He(a=>{t||(me(a),a.stage==="success"?setTimeout(()=>{t||me(null)},2e3):a.stage==="error"&&(l(!1),G(a.error||"加载失败")))},a=>{console.error("WebSocket error:",a),t||m({title:"WebSocket 连接失败",description:"无法实时显示加载进度",variant:"destructive"})}),!t){const a=await Ye();a.success?(O(a.data),a.data.installed||m({title:"Git 未安装",description:a.data.error||"请先安装 Git 才能使用插件安装功能",variant:"destructive"})):(m({title:"Git 状态检查失败",description:a.error,variant:"destructive"}),O({installed:!1,error:a.error}))}if(!t){const a=await Xe();a.success?ke(a.data):m({title:"版本获取失败",description:a.error,variant:"destructive"})}if(!t)try{l(!0),G(null);const a=await Ze();if(!a.success){t||(G(a.error),m({title:"加载失败",description:a.error,variant:"destructive"}));return}const o=a.data;if(!t){const n=await Y();if(!n.success){m({title:"获取已安装插件失败",description:n.error,variant:"destructive"});return}const y=n.data;H(y);const L=o.map(x=>{const fe=X(x.id,y),V=Z(x.id,y);return{...x,installed:fe,installed_version:V}});for(const x of y)if(!L.some(V=>V.id===x.id)&&x.manifest){const V=x.manifest.urls;L.push({id:x.id,manifest:{manifest_version:x.manifest.manifest_version||1,id:x.manifest.id||x.id,name:x.manifest.name,version:x.manifest.version,description:x.manifest.description||"",author:x.manifest.author,license:x.manifest.license||"Unknown",host_application:x.manifest.host_application,homepage_url:x.manifest.homepage_url||V?.homepage,repository_url:x.manifest.repository_url||V?.repository,urls:V,keywords:x.manifest.keywords||[],categories:x.manifest.categories||[],default_locale:x.manifest.default_locale||"zh-CN",locales_path:x.manifest.locales_path},downloads:0,rating:0,review_count:0,installed:!0,installed_version:x.manifest.version,source:"local",published_at:new Date().toISOString(),updated_at:new Date().toISOString()})}$(L),Le(L)}}finally{t||l(!1)}})(),()=>{t=!0,s&&s()}},[m]);const K=s=>{if(N&&!D(s))return e.jsxs(F,{variant:"destructive",className:"gap-1",children:[e.jsx(oe,{className:"h-3 w-3"}),"不兼容"]});if(s.installed){const t=s.installed_version?.trim(),c=s.manifest.version?.trim();if(t!==c){const a=t?.split(".").map(Number)||[0,0,0],o=c?.split(".").map(Number)||[0,0,0];for(let n=0;n<3;n++){if((o[n]||0)>(a[n]||0))return e.jsxs(F,{variant:"outline",className:"gap-1 text-orange-600 border-orange-600",children:[e.jsx(oe,{className:"h-3 w-3"}),"可更新"]});if((o[n]||0)<(a[n]||0))break}}return e.jsxs(F,{variant:"default",className:"gap-1",children:[e.jsx(ye,{className:"h-3 w-3"}),"已安装"]})}return null},D=s=>N?(s.manifest?.manifest_version??1)<=1&&N.version_major>=1?!1:s.manifest?.host_application?ue(s.manifest.host_application.min_version,s.manifest.host_application.max_version,N):!0:!0,B=s=>{if(!N)return null;const t=s.manifest?.manifest_version??1;if(t<=1&&N.version_major>=1)return`该插件使用旧版 manifest (v${t}),已不被麦麦 ${N.version} 支持`;if(s.manifest?.host_application&&!ue(s.manifest.host_application.min_version,s.manifest.host_application.max_version,N)){const c=s.manifest.host_application.min_version||"未知",a=s.manifest.host_application.max_version;return`不兼容当前版本 (需要 ${a?`${c} - ${a}`:`${c}+`},当前 ${N.version})`}return null},z=s=>{if(!s.installed||!s.installed_version||!s.manifest?.version||!D(s))return!1;const t=s.installed_version.trim(),c=s.manifest.version.trim();if(t===c)return!1;const a=t.split(".").map(Number),o=c.split(".").map(Number);for(let n=0;n<3;n++){if((o[n]||0)>(a[n]||0))return!0;if((o[n]||0)<(a[n]||0))return!1}return!1},P=s=>{if(!C?.installed){m({title:"无法安装",description:"Git 未安装",variant:"destructive"});return}if(N&&!D(s)){m({title:"无法安装",description:B(s)??"插件与当前麦麦版本不兼容",variant:"destructive"});return}xe(s),J(!0)},Re=async s=>{if(E){if(!s||s.trim()===""){m({title:"分支名称不能为空",variant:"destructive"});return}try{J(!1);const t=await Ke(E.id,E.manifest.repository_url||E.manifest.urls?.repository||"",s);if(!t.success){m({title:"安装失败",description:t.error,variant:"destructive"});return}Pe(E.id).catch(o=>{console.warn("Failed to record download:",o)}),m({title:"安装成功",description:`${E.manifest.name} 已成功安装`});const c=await Y();if(!c.success){m({title:"获取已安装插件失败",description:c.error,variant:"destructive"});return}const a=c.data;H(a),$(o=>o.map(n=>{if(n.id===E.id){const y=X(n.id,a),L=Z(n.id,a);return{...n,installed:y,installed_version:L}}return n}))}catch(t){m({title:"安装失败",description:t instanceof Error?t.message:"未知错误",variant:"destructive"})}finally{xe(null)}}},Q=async s=>{try{const t=await qe(s.id);if(!t.success){m({title:"卸载失败",description:t.error,variant:"destructive"});return}m({title:"卸载成功",description:`${s.manifest.name} 已成功卸载`});const c=await Y();if(!c.success){m({title:"获取已安装插件失败",description:c.error,variant:"destructive"});return}const a=c.data;H(a),$(o=>o.map(n=>{if(n.id===s.id){const y=X(n.id,a),L=Z(n.id,a);return{...n,installed:y,installed_version:L}}return n}))}catch(t){m({title:"卸载失败",description:t instanceof Error?t.message:"未知错误",variant:"destructive"})}},ee=async s=>{if(!C?.installed){m({title:"无法更新",description:"Git 未安装",variant:"destructive"});return}if(N&&!D(s)){m({title:"无法更新",description:B(s)??"插件与当前麦麦版本不兼容",variant:"destructive"});return}try{const t=await Je(s.id,s.manifest.repository_url||s.manifest.urls?.repository||"","main");if(!t.success){m({title:"更新失败",description:t.error,variant:"destructive"});return}m({title:"更新成功",description:`${s.manifest.name} 已从 ${t.data.old_version} 更新到 ${t.data.new_version}`});const c=await Y();if(!c.success){m({title:"获取已安装插件失败",description:c.error,variant:"destructive"});return}const a=c.data;H(a),$(o=>o.map(n=>{if(n.id===s.id){const y=X(n.id,a),L=Z(n.id,a);return{...n,installed:y,installed_version:L}}return n}))}catch(t){m({title:"更新失败",description:t instanceof Error?t.message:"未知错误",variant:"destructive"})}},se=s=>u.filter(t=>{if(!t.manifest||s==="all"&&t.source==="local")return!1;const c=f===""||t.manifest.name?.toLowerCase().includes(f.toLowerCase())||t.manifest.description?.toLowerCase().includes(f.toLowerCase())||t.manifest.keywords&&t.manifest.keywords.some(y=>y.toLowerCase().includes(f.toLowerCase())),a=g==="all"||t.manifest.categories&&t.manifest.categories.includes(g),o=!j||!N||D(t);let n=!0;return s==="installed"?n=t.installed===!0:s==="updates"&&(n=t.installed===!0&&z(t)),c&&a&&o&&n}).length,Te=u.filter(s=>{if(!s.manifest)return!1;const t=f===""||s.manifest.name?.toLowerCase().includes(f.toLowerCase())||s.manifest.description?.toLowerCase().includes(f.toLowerCase())||s.manifest.keywords&&s.manifest.keywords.some(o=>o.toLowerCase().includes(f.toLowerCase())),c=g==="all"||s.manifest.categories&&s.manifest.categories.includes(g),a=!j||!N||D(s);return s.installed&&z(s)&&t&&c&&a});return e.jsx(Fe,{className:"h-full",children:e.jsxs("div",{className:"space-y-6 p-4 sm:p-6",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl sm:text-3xl font-bold",children:"插件市场"}),e.jsx("p",{className:"text-muted-foreground mt-2",children:"浏览和管理麦麦的插件"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(R,{variant:"outline",onClick:()=>d(),disabled:v,children:[e.jsx(as,{className:`h-4 w-4 mr-2 ${v?"animate-spin":""}`}),"重启麦麦"]}),e.jsxs(R,{onClick:()=>r({to:"/plugin-mirrors"}),children:[e.jsx(is,{className:"h-4 w-4 mr-2"}),"配置镜像源"]})]})]}),S&&e.jsx(U,{className:"border-blue-200 bg-blue-50 dark:bg-blue-950/20 dark:border-blue-900",children:e.jsx(ne,{className:"py-3",children:e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(rs,{className:"h-4 w-4 text-blue-600 flex-shrink-0"}),e.jsxs("p",{className:"text-sm text-blue-800 dark:text-blue-200",children:["安装、卸载或更新插件后,部分插件需要",e.jsx("span",{className:"font-semibold",children:"重启麦麦"}),"才能生效"]})]}),e.jsx(R,{type:"button",variant:"outline",size:"sm",onClick:Ie,children:"我知道了"})]})})}),C&&!C.installed&&e.jsxs(U,{className:"border-orange-600 bg-orange-50 dark:bg-orange-950/20",children:[e.jsx(ae,{children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(te,{className:"h-5 w-5 text-orange-600"}),e.jsxs("div",{children:[e.jsx(ie,{className:"text-lg text-orange-900 dark:text-orange-100",children:"Git 未安装"}),e.jsx(re,{className:"text-orange-800 dark:text-orange-200",children:C.error||"请先安装 Git 才能使用插件安装功能"})]})]})}),e.jsx(ne,{children:e.jsxs("p",{className:"text-sm text-orange-800 dark:text-orange-200",children:["您可以从"," ",e.jsx("a",{href:"https://git-scm.com/downloads",target:"_blank",rel:"noopener noreferrer",className:"underline font-medium",children:"git-scm.com"})," ","下载并安装 Git。安装完成后请重启麦麦应用。"]})})]}),e.jsx(U,{className:"p-4",children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-4",children:[e.jsxs("div",{className:"flex-1 relative",children:[e.jsx(ns,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),e.jsx(Ae,{placeholder:"搜索插件...",value:f,onChange:s=>I(s.target.value),className:"pl-9"})]}),e.jsxs(ge,{value:g,onValueChange:w,children:[e.jsx(we,{className:"w-full sm:w-[200px]",children:e.jsx(be,{placeholder:"选择分类"})}),e.jsxs(Ce,{children:[e.jsx(b,{value:"all",children:"全部分类"}),e.jsx(b,{value:"Group Management",children:"群组管理"}),e.jsx(b,{value:"Entertainment & Interaction",children:"娱乐互动"}),e.jsx(b,{value:"Utility Tools",children:"实用工具"}),e.jsx(b,{value:"Content Generation",children:"内容生成"}),e.jsx(b,{value:"Multimedia",children:"多媒体"}),e.jsx(b,{value:"External Integration",children:"外部集成"}),e.jsx(b,{value:"Data Analysis & Insights",children:"数据分析与洞察"}),e.jsx(b,{value:"Other",children:"其他"})]})]})]}),e.jsxs("div",{className:"flex items-center space-x-2",children:[e.jsx(pe,{id:"compatible-only",checked:j,onCheckedChange:s=>T(s===!0)}),e.jsx("label",{htmlFor:"compatible-only",className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 cursor-pointer",children:"只显示兼容当前版本的插件"})]})]})}),e.jsx(ve,{value:k,onValueChange:_,className:"w-full",children:e.jsxs(je,{className:"grid w-full grid-cols-3",children:[e.jsxs(W,{value:"all",children:["全部插件 (",se("all"),")"]}),e.jsxs(W,{value:"installed",children:["已安装 (",se("installed"),")"]}),e.jsxs(W,{value:"updates",children:["可更新 (",se("updates"),")"]})]})}),p&&p.stage==="loading"&&p.operation==="fetch"&&e.jsx(U,{className:"p-4",children:e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ce,{className:"h-4 w-4 animate-spin"}),e.jsx("span",{className:"text-sm font-medium",children:"加载插件列表"})]}),e.jsxs("span",{className:"text-sm font-medium",children:[p.progress,"%"]})]}),e.jsx(Ne,{value:p.progress,className:"h-2"}),e.jsx("div",{className:"text-xs text-muted-foreground",children:p.message}),p.total_plugins>0&&e.jsxs("div",{className:"text-xs text-muted-foreground text-center",children:["已加载 ",p.loaded_plugins," / ",p.total_plugins," 个插件"]})]})}),p&&p.stage==="error"&&p.error&&e.jsx(U,{className:"border-destructive bg-destructive/10",children:e.jsx(ae,{children:e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(te,{className:"h-5 w-5 text-destructive"}),e.jsxs("div",{children:[e.jsx(ie,{className:"text-lg text-destructive",children:"加载失败"}),e.jsx(re,{className:"text-destructive/80",children:p.error})]})]})})}),A?e.jsxs("div",{className:"flex items-center justify-center py-12",children:[e.jsx(ce,{className:"h-8 w-8 animate-spin text-muted-foreground"}),e.jsx("span",{className:"ml-3 text-muted-foreground",children:"加载插件列表中..."})]}):M?e.jsx(U,{className:"p-6",children:e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx(te,{className:"h-12 w-12 text-destructive mb-4"}),e.jsx("h3",{className:"text-lg font-semibold mb-2",children:"加载失败"}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:M}),e.jsx(R,{onClick:()=>window.location.reload(),children:"重新加载"})]})}):k==="all"?e.jsx(ds,{plugins:u,searchQuery:f,categoryFilter:g,showCompatibleOnly:j,gitStatus:C,maimaiVersion:N,pluginStats:q,loadProgress:p,onInstall:P,onUpdate:ee,onUninstall:Q,checkPluginCompatibility:D,needsUpdate:z,getStatusBadge:K,getIncompatibleReason:B}):k==="installed"?e.jsx(os,{plugins:u,searchQuery:f,categoryFilter:g,showCompatibleOnly:j,gitStatus:C,maimaiVersion:N,pluginStats:q,loadProgress:p,onInstall:P,onUpdate:ee,onUninstall:Q,checkPluginCompatibility:D,needsUpdate:z,getStatusBadge:K,getIncompatibleReason:B}):e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-5",children:Te.map(s=>e.jsx(de,{plugin:s,gitStatus:C,maimaiVersion:N,pluginStats:q,loadProgress:p,onInstall:P,onUpdate:ee,onUninstall:Q,checkPluginCompatibility:D,needsUpdate:z,getStatusBadge:K,getIncompatibleReason:B},s.id))}),e.jsx(ls,{open:Se,plugin:E,onOpenChange:J,onInstall:Re}),e.jsx(We,{})]})})}export{Ss as PluginsPage};