2 lines
26 KiB
JavaScript
2 lines
26 KiB
JavaScript
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};
|