PageSourceSearch

https://reka.cc/_nuxt/BM41yTgk.js

js reka.cc collected 2026-10-02 01:20:47 UTC 13,703 bytes, 3 lines download raw bytes

1import{A as oe,f as ce,g as me,B as fe,u as ve,j as pe,m as y,w as i,r as f,s as B,o as d,a as l,b as a,k as s,q as V,d as c,t as o,p as v,l as _e,c as m,F as J,C as Q,D as ye}from"./ALYhAVuH.js";import{A as ge}from"./DzpvfOjV.js";import{_ as j}from"./CLVto6Pa.js";import{b as x,_ as k,a as F}from"./DgDkSvBj.js";import{_ as h}from"./krmDdQ96.js";import{_ as q}from"./BNZ0a080.js";import{_ as be}from"./_Ae7EPbz.js";import{_ as p}from"./CZtE_ht5.js";import{_ as xe,S as ke}from"./DPc3ggKr.js";import{A as he}from"./BqXg9zsQ.js";import{M as we}from"./CduuUidW.js";import{R as W}from"./CuMo4g97.js";import{L as X}from"./DD3zOpnP.js";const $e=oe("mail",[["path",{d:"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7",key:"132q7q"}],["rect",{x:"2",y:"4",width:"20",height:"16",rx:"2",key:"izxlao"}]]),Ce={class:"space-y-6"},Se={class:"flex flex-col gap-4 md:flex-row md:items-start md:justify-between"},Me={class:"space-y-3"},Re={class:"space-y-2"},Ae={class:"flex items-center gap-2 text-sm font-medium text-muted-foreground"},ze={class:"flex flex-wrap items-center gap-3"},Ie={key:0,class:"rounded-md border border-destructive/30 bg-destructive/10 px-4 py-3 text-sm text-destructive"},Le={key:1,class:"grid gap-4 lg:grid-cols-[1fr_22rem]"},Be={key:2,class:"grid gap-4 lg:grid-cols-[minmax(0,1fr)_24rem]"},Ne={class:"space-y-4"},Ve={class:"grid gap-4 sm:grid-cols-2"},Fe={class:"space-y-1"},qe={class:"break-all text-sm font-medium"},Ue={class:"space-y-1"},De={class:"space-y-1"},Ee={class:"text-sm"},Pe={class:"space-y-1"},je={class:"text-sm"},Te={key:0,class:"space-y-3 border-t pt-5"},Ge={class:"grid gap-3"},Ke={class:"text-xs font-medium text-muted-foreground"},Oe={class:"break-all text-sm"},He={class:"whitespace-pre-wrap break-words rounded-md border bg-muted/30 p-4 text-sm leading-6"},Je={key:0,class:"rounded-md border border-destructive/30 bg-destructive/10 px-4 py-3 text-sm text-destructive"},Qe={key:1,class:"rounded-md border border-emerald-500/30 bg-emerald-500/10 px-4 py-3 text-sm text-emerald-700 dark:text-emerald-300"},We={key:2,class:"rounded-md border border-dashed p-6 text-center text-sm text-muted-foreground"},Xe={key:3,class:"divide-y rounded-md border"},Ye={class:"flex flex-wrap items-center justify-between gap-3"},Ze={class:"flex flex-wrap items-center gap-2"},et={class:"text-xs text-muted-foreground"},tt={class:"whitespace-pre-wrap break-words text-sm leading-6"},st={key:0,class:"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-xs text-destructive"},at={class:"flex size-10 items-center justify-center rounded-md bg-primary text-primary-foreground"},lt={class:"space-y-1"},nt={class:"space-y-2"},it={key:0,class:"rounded-md border border-destructive/30 bg-destructive/10 px-4 py-3 text-sm text-destructive"},rt={key:1,class:"space-y-1 rounded-md border border-destructive/30 bg-destructive/10 px-4 py-3 text-sm text-destructive"},dt={key:2,class:"rounded-md border border-emerald-500/30 bg-emerald-500/10 px-4 py-3 text-sm text-emerald-700 dark:text-emerald-300"},wt=ce({__name:"[feedbackId]",setup(ut){const w=me(),$=fe(),T=f(!0),C=f(!1),g=f(!1),S=f(""),_=f(""),M=f(""),R=f(""),A=f(""),z=f(""),I=f(""),r=f(null),N=f(null),G=B(()=>{const t=w.params.feedbackId;return Array.isArray(t)?String(t[0]||""):String(t||"")}),Y=B(()=>T.value||C.value&&!r.value),L=B(()=>{if(!N.value||N.value.configured)return"";const t=N.value.missingKeys.filter(Boolean).join(", ");return t?`邮件配置缺失,回复邮件无法发送。缺少:${t}`:"邮件配置缺失,回复邮件无法发送。"}),K=B(()=>!!(r.value&&I.value.trim()&&!g.value&&!S.value&&!L.value)),O=B(()=>{const t=r.value;return t?[{label:"页面 URL",value:t.pageUrl},{label:"插件路由",value:t.extensionRoute},{label:"语言",value:t.locale},{label:"插件版本",value:t.extensionVersion}].filter(e=>!!e.value):[]});ve({title:"反馈详情 - AltG",meta:[{name:"description",content:"AltG 管理员反馈详情与邮件回复。"}]}),pe(async()=>{const t=await Z();T.value=!1,t&&await b()});async function Z(){try{const t=await $fetch("/api/admin/session");if(t.configured&&t.authenticated)return!0}catch{_.value="管理员会话检查失败。"}return await $.replace({path:"/admin/login",query:{redirect:w.fullPath}}),!1}async function b(t={}){if(!G.value){_.value="反馈 ID 无效。";return}t.silent||(C.value=!0),_.value="";try{const e=await $fetch(`/api/admin/feedback/${encodeURIComponent(G.value)}`),n=e.feedback||e.submission;if(!n){_.value="反馈详情加载失败。";return}r.value={...n,replies:(n.replies||e.replies||[]).map(u=>({...u,updatedAt:u.updatedAt||null}))}
1,N.value=e.rekaMail||null}catch(e){if(U(e)){await $.replace({path:"/admin/login",query:{redirect:w.fullPath}});return}const n=Number(e?.response?.status||e?.statusCode||0);_.value=n===404?"反馈不存在或已被删除。":D(e,"反馈详情加载失败。")}finally{t.silent||(C.value=!1)}}async function ee(){if(!(!K.value||!r.value)){g.value=!0,M.value="",R.value="",A.value="",z.value="";try{await $fetch(`/api/admin/feedback/${encodeURIComponent(r.value.id)}/replies`,{method:"POST",body:{body:I.value.trim()}}),I.value="",R.value=`回复邮件已发送至 ${r.value.email}。`,await b({silent:!0})}catch(t){if(U(t)){await $.replace({path:"/admin/login",query:{redirect:w.fullPath}});return}M.value=se(t),await b({silent:!0})}finally{g.value=!1}}}async function te(t){if(!(!r.value||!H(t))){S.value=t.id,M.value="",R.value="",A.value="",z.value="";try{await $fetch(`/api/admin/feedback/${encodeURIComponent(r.value.id)}/replies/${encodeURIComponent(t.id)}/retry`,{method:"POST"}),z.value=`回复邮件已重新发送至 ${r.value.email}。`,await b({silent:!0})}catch(e){if(U(e)){await $.replace({path:"/admin/login",query:{redirect:w.fullPath}});return}A.value=ae(e),await b({silent:!0})}finally{S.value=""}}}function U(t){const e=Number(t?.response?.status||t?.statusCode||0);return e===401||e===403}function D(t,e){const n=typeof t?.data?.message=="string"?t.data.message.trim():"";return!n||n.includes(`
2`)||/(^|\s)at\s+\S+\s*\(/.test(n)||/stack|trace/i.test(n)?e:n}function se(t){const e=D(t,""),u=`${String(t?.data?.code||t?.data?.statusMessage||"")} ${e}`.toLowerCase();return u.includes("config")||u.includes("reka_mail")||u.includes("missing")||u.includes("未配置")||u.includes("配置缺失")?e?`邮件配置缺失,回复邮件无法发送:${e}`:"邮件配置缺失,回复邮件无法发送。":u.includes("send")||u.includes("mail")||u.includes("failed")||u.includes("发送")||u.includes("失败")?e?`发送失败,回复邮件没有发出:${e}`:"发送失败,回复邮件没有发出。":e?`发送失败,回复邮件没有发出:${e}`:"发送失败,回复邮件没有发出,请稍后重试。"}function ae(t){const e=D(t,""),u=`${String(t?.data?.code||t?.data?.statusMessage||"")} ${e}`.toLowerCase();return u.includes("config")||u.includes("reka_mail")||u.includes("missing")||u.includes("未配置")||u.includes("配置缺失")?e?`邮件配置缺失,重试发送无法执行:${e}`:"邮件配置缺失,重试发送无法执行。":e?`重试发送失败,回复邮件没有发出:${e}`:"重试发送失败,回复邮件没有发出,请稍后再试。"}function E(t){return t.status==="failed"||t.status==="error"}function H(t){return!!(r.value&&E(t)&&!g.value&&!S.value&&!L.value)}function le(t){const e=t?.trim()||"";return e?e.includes(`
3`)||/(^|\s)at\s+\S+\s*\(/.test(e)||/stack|trace/i.test(e)?"后端返回了发送错误,详情已隐藏。":e.length>240?`${e.slice(0,240)}...`:e:"未提供错误详情。"}function ne(t){return t==="web"||t==="website"?"网站":t==="extension"||t==="chrome_extension"?"浏览器插件":t||"未知来源"}function ie(t){return t==="open"?"待回复":t==="replied"?"已回复":t||"未知"}function re(t){return t==="replied"?"default":"secondary"}function de(t){return t==="sent"?"已发送":t==="failed"||t==="error"?"发送失败":t||"未知"}function ue(t){return t==="sent"?"default":"destructive"}function P(t){if(!t)return"从未";const e=new Date(t);return Number.isNaN(e.getTime())?"未知":new Intl.DateTimeFormat("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(e)}return(t,e)=>(d(),y(ge,null,{default:i(()=>[l("div",Ce,[l("div",Se,[l("div",Me,[a(s(V),{type:"button",variant:"ghost",size:"sm",class:"-ml-2",onClick:e[0]||(e[0]=n=>s($).push("/admin/feedback"))},{default:i(()=>[a(s(he),{class:"size-4"}),e[3]||(e[3]=c(" 返回反馈列表 ",-1))]),_:1}),l("div",Re,[l("div",Ae,[a(s(we),{class:"size-4"}),e[4]||(e[4]=c(" 反馈管理 ",-1))]),l("div",ze,[e[5]||(e[5]=l("h1",{class:"text-2xl font-semibold tracking-normal"}," 反馈详情 ",-1)),r.value?(d(),y(s(j),{key:0,variant:re(r.value.status)},{default:i(()=>[c(o(ie(r.value.status)),1)]),_:1}
3,8,["variant"])):v("",!0)])])]),a(s(V),{type:"button",variant:"outline",size:"sm",disabled:C.value,onClick:e[1]||(e[1]=()=>b())},{default:i(()=>[a(s(W),{class:_e(["size-4",C.value&&"animate-spin"])},null,8,["class"]),e[6]||(e[6]=c(" 刷新 ",-1))]),_:1},8,["disabled"])]),_.value?(d(),m("div",Ie,o(_.value),1)):v("",!0),Y.value?(d(),m("div",Le,[a(s(x),null,{default:i(()=>[a(s(k),null,{default:i(()=>[a(s(p),{class:"h-6 w-40"}),a(s(p),{class:"h-4 w-72"})]),_:1}),a(s(h),{class:"space-y-3"},{default:i(()=>[a(s(p),{class:"h-5 w-full"}),a(s(p),{class:"h-5 w-2/3"}),a(s(p),{class:"h-32 w-full"})]),_:1})]),_:1}),a(s(x),null,{default:i(()=>[a(s(k),null,{default:i(()=>[a(s(p),{class:"h-6 w-32"})]),_:1}),a(s(h),{class:"space-y-3"},{default:i(()=>[a(s(p),{class:"h-24 w-full"}),a(s(p),{class:"h-9 w-28"})]),_:1})]),_:1})])):r.value?(d(),m("div",Be,[l("div",Ne,[a(s(x),null,{default:i(()=>[a(s(k),null,{default:i(()=>[a(s(F),null,{default:i(()=>[...e[7]||(e[7]=[c("提交信息",-1)])]),_:1}),a(s(q),null,{default:i(()=>[...e[8]||(e[8]=[c("用户留下的邮箱和提交来源。",-1)])]),_:1})]),_:1}),a(s(h),{class:"space-y-5"},{default:i(()=>[l("dl",Ve,[l("div",Fe,[e[9]||(e[9]=l("dt",{class:"text-xs font-medium text-muted-foreground"}," 邮箱 ",-1)),l("dd",qe,o(r.value.email),1)]),l("div",Ue,[e[10]||(e[10]=l("dt",{class:"text-xs font-medium text-muted-foreground"}," 来源 ",-1)),l("dd",null,[a(s(j),{variant:"outline"},{default:i(()=>[c(o(ne(r.value.source)),1)]),_:1})])]),l("div",De,[e[11]||(e[11]=l("dt",{class:"text-xs font-medium text-muted-foreground"}," 创建时间 ",-1)),l("dd",Ee,o(P(r.value.createdAt)),1)]),l("div",Pe,[e[12]||(e[12]=l("dt",{class:"text-xs font-medium text-muted-foreground"}," 回复时间 ",-1)),l("dd",je,o(P(r.value.repliedAt)),1)])]),O.value.length?(d(),m("div",Te,[e[13]||(e[13]=l("h2",{class:"text-sm font-medium"}," 上下文 ",-1)),l("dl",Ge,[(d(!0),m(J,null,Q(O.value,n=>(d(),m("div",{key:n.label,class:"grid gap-1 sm:grid-cols-[7rem_minmax(0,1fr)]"},[l("dt",Ke,o(n.label),1),l("dd",Oe,o(n.value),1)]))),128))])])):v("",!0)]),_:1})]),_:1}),a(s(x),null,{default:i(()=>[a(s(k),null,{default:i(()=>[a(s(F),null,{default:i(()=>[...e[14]||(e[14]=[c("反馈正文",-1)])]),_:1}),a(s(q),null,{default:i(()=>[...e[15]||(e[15]=[c("用户提交的原始反馈内容。",-1)])]),_:1})]),_:1}),a(s(h),null,{default:i(()=>[l("p",He,o(r.value.body),1)]),_:1})]),_:1}),a(s(x),null,{default:i(()=>[a(s(k),null,{default:i(()=>[a(s(F),null,{default:i(()=>[...e[16]||(e[16]=[c("历史邮件回复",-1)])]),_:1}),a(s(q),null,{default:i(()=>[...e[17]||(e[17]=[c("这里只记录通过邮件发送的回复,不代表站内消息。",-1)])]),_:1})]),_:1}),a(s(h),{class:"space-y-3"},{default:i(()=>[A.value?(d(),m("div",Je,o(A.value),1)):v("",!0),z.value?(d(),m("div",Qe,o(z.value),1)):v("",!0),r.value.replies.length===0?(d(),m("div",We," 暂无历史回复 ")):(d(),m("div",Xe,[(d(!0),m(J,null,Q(r.value.replies,n=>(d(),m("article",{key:n.id,class:"space-y-3 p-4"},[l("div",Ye,[a(s(j),{variant:ue(n.status)},{default:i(()=>[c(o(de(n.status)),1)]),_:2},1032,["variant"]),l("div",Ze,[l("p",et,o(P(n.sentAt||n.updatedAt||n.createdAt)),1),E(n)?(d(),y(s(V),{key:0,type:"button",variant:"outline",size:"sm",disabled:!H(n),onClick:u=>te(n)},{default:i(()=>[S.value===n.id?(d(),y(s(X),{key:0,class:"size-4 animate-spin"})):(d(),y(s(W),{key:1,class:"size-4"})),e[18]||(e[18]=c(" 重试发送 ",-1))]),_:2},1032,["disabled","onClick"])):v("",!0)])]),l("p",tt,o(n.body),1),E(n)?(d(),m("p",st," 错误:"+o(le(n.errorMessage||n.error||null)),1)):v("",!0)]))),128))]))]),_:1})]),_:1})]),a(s(x),{class:"h-fit"},{default:i(()=>[a(s(k),null,{default:i(()=>[l("div",at,[a(s($e),{class:"size-5"})]),l("div",lt,[a(s(F),null,{default:i(()=>[...e[19]||(e[19]=[c("邮件回复",-1)])]),_:1}),a(s(q),null,{default:i(()=>[c(" 回复会通过邮件发送到 "+o(r.value.email)+",不会创建站内消息。 ",1)]),_:1})])]),_:1}),a(s(h),null,{default:i(()=>[l("form",{class:"space-y-4",onSubmit:ye(ee,["prevent"])},[l("div",nt,[a(s(be),{for:"feedback-reply-body"},{default:i(()=>[...e[20]||(e[20]=[c("回复正文",-1)])]),_:1}),a(s(xe),{id:"feedback-reply-body",modelValue:I.value,"onUpdate:modelValue":e[2]||(e[2]=n=>I.value=n),class:"min-h-40 resize-y",disabled:g.value||!!L.value,placeholder:"输入要发送给用户的邮件正文"},null,8,["modelValue","disabled"])]),L.value?(d(),m("div",it,o(L.value),1)):v("",!0),M.value?(d(),m("div",rt,[l("p",null,o(M.value),1),e[21]||(e[21]=l("p",null,"回复原文已保留,可修改后重试。",-1))])):v("",!0),R.value?(d(),m("div",dt,o(R.value),1)):v("",!0),a(s(V),{t
3ype:"submit",class:"w-full",disabled:!K.value},{default:i(()=>[g.value?(d(),y(s(X),{key:0,class:"size-4 animate-spin"})):(d(),y(s(ke),{key:1,class:"size-4"})),e[22]||(e[22]=c(" 发送邮件回复 ",-1))]),_:1},8,["disabled"])],32)]),_:1})]),_:1})])):v("",!0)])]),_:1}))}});export{wt as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.