-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathweb_module.js
More file actions
1 lines (1 loc) · 4.7 KB
/
Copy pathweb_module.js
File metadata and controls
1 lines (1 loc) · 4.7 KB
1
import{useEffect as x,useState as p}from"react";import{createRoot as y}from"react-dom/client";import{jsx as r,jsxs as n}from"react/jsx-runtime";var b=null;async function u(o,t){if(!b)throw new Error("Meme 工作台面板未激活");let a=await b(o,t),s=await a.json();if(!a.ok)throw new Error(String(s.detail??s.message??`HTTP ${a.status}`));return s}async function _(o,t){if(!b)throw new Error("Meme 工作台面板未激活");let a=await b(o,{signal:t});if(!a.ok)throw new Error(`图片读取失败:HTTP ${a.status}`);return a.blob()}function w(){let[o,t]=p([]),[a,s]=p(null),[c,m]=p([]),[g,h]=p(null),[f,v]=p(!0);return x(()=>{let e=new AbortController;return u("/api/dashboard/meme/categories",{signal:e.signal}).then(i=>{e.signal.aborted||(t(i.categories||[]),i.categories?.length>0&&s(i.categories[0].tag),v(!1))},i=>{e.signal.aborted||(h(i instanceof Error?i.message:"分类读取失败"),v(!1))}),()=>e.abort()},[]),x(()=>{if(!a){m([]);return}let e=new AbortController;return m([]),h(null),u(`/api/dashboard/meme/images/${a}`,{signal:e.signal}).then(i=>{e.signal.aborted||m(i.images||[])},i=>{e.signal.aborted||h(i instanceof Error?i.message:"图片读取失败")}),()=>e.abort()},[a]),n("main",{className:"meme-dashboard","aria-labelledby":"meme-dashboard-title",children:[n("nav",{className:"meme-dashboard__sidebar","aria-label":"表情包分类",children:[n("div",{className:"meme-dashboard__sidebar-heading",children:[r("h2",{children:"分类"}),r("span",{children:o.length})]}),o.map(e=>n("div",{className:"meme-category-row",children:[n("button",{type:"button",className:`meme-category${a===e.tag?" is-active":""}`,onClick:()=>s(e.tag),"aria-current":a===e.tag?"page":void 0,disabled:!e.enabled,children:[n("span",{children:[r("strong",{children:e.name||e.tag}),r("small",{children:e.desc||e.tag})]}),r("b",{children:e.count})]}),r("button",{type:"button",className:"meme-delete",onClick:()=>{confirm(`确定要删除分类 "${e.tag}" 吗?这会永久删除该分类及其所有图片!`)&&u(`/api/dashboard/meme/categories/${e.tag}`,{method:"DELETE"}).then(()=>{t(i=>{let l=i.filter(d=>d.tag!==e.tag);return a===e.tag&&s(l.length>0?l[0].tag:null),l})}).catch(i=>alert("删除失败:"+i.message))},"aria-label":`删除分类 ${e.tag}`,title:"删除分类",children:"✕"})]},e.tag)),!f&&o.length===0&&r("p",{className:"meme-dashboard__nav-empty",children:"还没有分类。"})]}),n("section",{className:"meme-dashboard__gallery",children:[n("div",{className:"meme-dashboard__header",children:[n("div",{children:[r("p",{children:"表情包库"}),r("h1",{id:"meme-dashboard-title",children:a?o.find(e=>e.tag===a)?.name||a:"选择一个分类"}),r("div",{className:"meme-dashboard__description",children:a?o.find(e=>e.tag===a)?.desc:""})]}),n("span",{className:"meme-dashboard__total",children:[c.length," 张图片"]})]}),n("div",{className:"meme-grid","aria-live":"polite",children:[c.map(e=>n("figure",{className:"meme-item",children:[r("button",{type:"button",className:"meme-item__delete",onClick:i=>{i.stopPropagation(),confirm(`确定要删除图片 "${e}" 吗?`)&&u(`/api/dashboard/meme/media/${a}/${e}`,{method:"DELETE"}).then(()=>{m(l=>l.filter(d=>d!==e)),t(l=>l.map(d=>d.tag===a?{...d,count:d.count-1}:d))}).catch(l=>alert("删除失败:"+l.message))},"aria-label":`删除图片 ${e}`,title:"删除图片",children:"✕"}),r("div",{className:"meme-item__preview",children:r(k,{tag:a,name:e})}),r("figcaption",{title:e,children:e})]},e)),f&&r("div",{className:"meme-state",role:"status",children:"正在读取表情包分类…"}),!f&&!g&&c.length===0&&a&&n("div",{className:"meme-state",children:[r("strong",{children:"这个分类还没有图片"}),r("span",{children:"通过 Meme 插件导入图片后会显示在这里。"})]}),g&&n("div",{className:"meme-state is-error",role:"alert",children:[r("strong",{children:"无法加载表情包"}),r("span",{children:g})]})]})]})]})}function k({tag:o,name:t}){let[a,s]=p(null);return x(()=>{let c=new AbortController,m=null;return _(`/api/dashboard/meme/media/${o}/${t}`,c.signal).then(g=>{m=URL.createObjectURL(g),s(m)},g=>{c.signal.aborted||console.error("Meme 图片读取失败",g)}),()=>{c.abort(),m&&URL.revokeObjectURL(m)}},[t,o]),r("img",{src:a??void 0,alt:"",loading:"lazy"})}var E={id:"meme",label:"Meme 表情包",viewLabel:"表情包",order:50,layout:"workbench",rowKey:"id",columns:[],async getCount({signal:o}){try{let t=await u("/api/dashboard/meme/categories",{signal:o}),a=0;for(let s of t.categories||[])a+=s.count;return a}catch(t){if(o.aborted)throw t;return null}},async fetchPage(){return{items:[],total:0}},renderMain(o){let t=y(o);return t.render(r(w,{})),()=>t.unmount()}};function M(o){b=o.http.request;let t=o.ui.inject("workbench.panels.v2",a=>a.register(E));return()=>{t(),b=null}}export{M as activate};