PageSourceSearch

https://nazohiroba.com/_nuxt/content-reports.15f5a21f.js

js nazohiroba.com collected 2026-09-24 13:35:51 UTC 7,227 bytes, 1 lines download raw bytes

1import{d as E,h as J,r as d,i as q,u as G,o,c as n,a as t,l as k,s as T,j as l,x as f,F as L,y as K,z as Q,t as i,v as W,k as u,n as A,b as B,_ as X}from"./entry.fcc3f972.js";import"./firebase.efe57387.js";const Y={class:"rep-container"},Z={class:"filters"},ee={key:0,class:"state"},te={key:1,class:"state"},se={key:2,class:"report-list"},ae={class:"report-top"},oe={class:"badge badge--type"},ne={class:"report-date"},le={class:"report-people"},ie={key:0},de=["href"],re={key:0,class:"report-desc"},ce={key:1,class:"target-box target-box--gone"},ue={key:2,class:"target-box"},pe={key:0,class:"target-mystery"},ve={class:"target-text"},me={class:"target-actions"},ye=["href"],ge={key:0,class:"deleted-mark"},_e=["disabled","onClick"],be={class:"actions"},he=["disabled","onClick"],ke={class:"actions-right"},fe=["disabled","onClick"],$e=["disabled","onClick"],Ce={class:"modal"},we={class:"modal-user"},xe={class:"modal-actions"},Te=["disabled"],Se=E({__name:"content-reports",setup(De){const{getIdToken:M}=J(),$=d([]),_=d("pending"),C=d(!0),r=d(null),c=d(null),p=d("all"),v=d(30),m=d(""),w=d(!1),b=async()=>({Authorization:`Bearer ${await M()}`}),y=async()=>{C.value=!0;try{const a=await $fetch("/api/v2/admin/content-reports",{params:{status:_.value},headers:await b()});$.value=a.reports||[]}catch(a){console.error(a),alert("通報一覧の取得に失敗しました")}finally{C.value=!1}},S=async(a,s)=>{r.value=a.id;try{await $fetch(`/api/v2/admin/content-reports/${a.id}/status`,{method:"PATCH",body:{status:s},headers:await b()}),await y()}catch(e){console.error(e),alert("ステータスの更新に失敗しました")}finally{r.value=null}},P=async a=>{if(confirm("このコメントを規約違反として削除します。よろしいですか?")){r.value=a.id;try{await $fetch(`/api/v2/admin/comments/${a.contentId}/moderate`,{method:"POST",body:{action:"delete"},headers:await b()}),await y()}catch(s){console.error(s),alert("コメントの削除に失敗しました")}finally{r.value=null}}},R=a=>{c.value=a,p.value="all",v.value=30,m.value=`通報ID ${a.id}(${D(a.reportType)})に基づく措置`},H=async()=>{var s,e,g;const a=(g=(e=(s=c.value)==null?void 0:s.target)==null?void 0:e.author)==null?void 0:g.uid;if(a){w.value=!0;try{await $fetch(`/api/v2/admin/users/${a}/suspend`,{method:"POST",body:{action:"suspend",scope:p.value,days:v.value,reason:m.value},headers:await b()}),c.value=null,alert("投稿を停止しました")}catch(h){console.error(h),alert("停止措置に失敗しました")}finally{w.value=!1}}},D=a=>({spam:"スパム",inappropriate:"不適切なコンテンツ",harassment:"嫌がらせ・誹謗中傷",other:"その他"})[a]||a,N=a=>({pending:"未対応",resolved:"対応済み",rejected:"問題なし"})[a]||a,F=(a,s)=>a&&a.length>s?`${a.slice(0,s)}…`:a||"",O=a=>new Date(a).toLocaleString("ja-JP",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"});return q(y),G({title:"通報の対応 | ナゾヒロバ管理"}),(a,s)=>(o(),n("div",Y,[s[14]||(s[14]=t("div",{class:"rep-header"},[t("h1",{class:"rep-title"},"通報の対応"),t("p",{class:"rep-desc"}
1," ナゾ活・コメントへの通報を確認し、対応します。対象の削除や投稿者の停止もこの画面から行えます。 ")],-1)),t("div",Z,[k(t("select",{"onUpdate:modelValue":s[0]||(s[0]=e=>f(_)?_.value=e:null),class:"filter-select",onChange:y},s[6]||(s[6]=[t("option",{value:"pending"},"未対応",-1),t("option",{value:"resolved"},"対応済み",-1),t("option",{value:"rejected"},"問題なし",-1),t("option",{value:"all"},"すべて",-1)]),544),[[T,l(_)]]),t("button",{class:"reload-btn",onClick:y},"再読み込み")]),l(C)?(o(),n("div",ee,"読み込み中...")):l($).length===0?(o(),n("div",te,"該当する通報はありません")):(o(),n("div",se,[(o(!0),n(L,null,K(l($),e=>{var g,h,I,V,U,j,z;return o(),n("div",{key:e.id,class:"report-card"},[t("div",ae,[t("span",{class:A(["badge",`badge--${e.reportType}`])},i(D(e.reportType)),3),t("span",oe,i(e.contentType==="comment"?"コメント":"ナゾ活"),1),t("span",{class:A(["badge",`badge--st-${e.status}`])},i(N(e.status)),3),t("span",ne,i(O(e.createdAt)),1)]),t("div",le,[t("span",null,"通報者: "+i(((g=e.reporter)==null?void 0:g.name)||"(匿名)"),1),(h=e.target)!=null&&h.exists?(o(),n("span",ie,[s[7]||(s[7]=B(" 投稿者: ")),(I=e.target.author)!=null&&I.nzUserId?(o(),n("a",{key:0,href:`/users/${e.target.author.nzUserId}`,target:"_blank"},i(e.target.author.name),9,de)):(o(),n(L,{key:1},[B(i((V=e.target.author)==null?void 0:V.name),1)],64))])):u("",!0)]),e.description?(o(),n("p",re,"通報理由: "+i(e.description),1)):u("",!0),(U=e.target)!=null&&U.exists?(o(),n("div",ue,[e.target.mysteryTitle?(o(),n("p",pe,i(e.target.mysteryTitle),1)):u("",!0),t("p",ve,i(F(e.target.text,200)||"(本文なし)"),1),t("div",me,[t("a",{href:e.target.url,target:"_blank",class:"link-btn"},"対象を開く",8,ye),e.target.isDeleted?(o(),n("span",ge,i(e.contentType==="comment"?"削除済み":"非公開"),1)):e.contentType==="comment"?(o(),n("button",{key:1,class:"danger-btn",disabled:l(r)===e.id,onClick:x=>P(e)},"規約違反として削除",8,_e)):u("",!0)])])):(o(),n("div",ce," 対象のコンテンツは既に存在しません(投稿者による削除の可能性があります) ")),t("div",be,[(j=e.target)!=null&&j.exists&&((z=e.target.author)!=null&&z.uid)?(o(),n("button",{key:0,class:"warn-btn",disabled:l(r)===e.id,onClick:x=>R(e)},"投稿者を停止",8,he)):u("",!0),t("div",ke,[t("button",{class:"ok-btn",disabled:l(r)===e.id,onClick:x=>S(e,"resolved")},"対応済みにする",8,fe),t("button",{class:"ghost-btn",disabled:l(r)===e.id,onClick:x=>S(e,"rejected")},"問題なし",8,$e)])])])}),128))])),l(c)?(o(),n("div",{key:3,class:"modal-overlay",onClick:s[5]||(s[5]=Q(e=>c.value=null,["self"]))},[t("div",Ce,[s[10]||(s[10]=t("h2",{class:"modal-title"},"投稿を停止する",-1)),t("p",we,"対象: "+i(l(c).target.author.name),1),s[11]||(s[11]=t("label",{class:"modal-label"},"停止範囲",-1)),k(t("select",{"onUpdate:modelValue":s[1]||(s[1]=e=>f(p)?p.value=e:null),class:"modal-input"},s[8]||(s[8]=[t("option",{value:"all"},"コメント・ナゾ活の両方",-1),t("option",{value:"comment"},"コメントのみ",-1),t("option",{value:"review"},"ナゾ活のみ",-1)]),512),[[T,l(p)]]),s[12]||(s[12]=t("label",{class:"modal-label"},"期間",-1)),k(t("select",{"onUpdate:modelValue":s[2]||(s[2]=e=>f(v)?v.value=e:null),class:"modal-input"},s[9]||(s[9]=[t("option",{value:7},"7日間",-1),t("option",{value:14},"14日間",-1),t("option",{value:30},"30日間",-1),t("option",{value:90},"90日間",-1),t("option",{value:0},"無期限",-1)]),512),[[T,l(v)]]),s[13]||(s[13]=t("label",{class:"modal-label"},"理由(記録用・本人には表示されません)",-1)),k(t("textarea",{"onUpdate:modelValue":s[3]||(s[3]=e=>f(m)?m.value=e:null),class:"modal-input modal-textarea",rows:"3"},null,512),[[W,l(m)]]),t("div",xe,[t("button",{class:"ghost-btn",onClick:s[4]||(s[4]=e=>c.value=null)},"キャンセル"),t("button",{class:"danger-btn",disabled:l(w),onClick:H},"停止する",8,Te)])])])):u("",!0)]))}});const Ue=X(Se,[["__scopeId","data-v-7544587b"]]);export{Ue 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.