PageSourceSearch

https://edube.com.br/assets/admin.comunidade-D0Zx2gKg.js

js edube.com.br collected 2026-10-04 08:37:40 UTC 12,692 bytes, 1 lines download raw bytes

1import{c as Q,r as c,j as e,t as m,s as y}from"./index-jArl847u.js";import{P as W}from"./page-DVBv4Eel.js";import{u as x}from"./useServerFn-B6DQcslF.js";import{a as Y,b as ee,c as se,d as ae,e as ie,f as re,g as te}from"./community.functions-Ff4oJ58n.js";import{T as ne,a as ce,b as S,c as A}from"./tabs-BDtnHBEi.js";import{B as l}from"./button-wnbJ8JVy.js";import{I as f}from"./input-xccnWHAR.js";import{T as F}from"./textarea-BpS_9NBk.js";import{L as n}from"./label-CQ3tgCWN.js";import{S as N,a as _,b as w,c as C,d as t}from"./select-CYPDpDyU.js";import{B as h}from"./badge-4Me-4PJw.js";import{M as le}from"./message-square-BvWSwZyH.js";import{M as P}from"./megaphone-D200RGPQ.js";import{P as L}from"./pin-DptH6rdK.js";import{L as R}from"./lock-DZF3aFuC.js";import{R as oe}from"./rotate-ccw-CD3dBS-u.js";import{T as U}from"./trash-2-WYn3gfES.js";import{P as de}from"./plus-DLotDNof.js";import"./index-BOVcORaS.js";import"./index-CdV64FxY.js";import"./index-Dldzhgj_.js";import"./index-xTMvGMEe.js";import"./index-BF5uUtgN.js";import"./index-CdQxd2wX.js";import"./check-DsaoBk1-.js";const me=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"17",x2:"22",y1:"8",y2:"13",key:"3nzzx3"}],["line",{x1:"22",x2:"17",y1:"8",y2:"13",key:"1swrse"}]],V=Q("user-x",me);function Ve(){const j=x(Y),p=x(ee),d=x(se),v=x(ae),g=x(ie),u=x(re),i=x(te),[r,s]=c.useState([]),[q,I]=c.useState([]),[$,O]=c.useState({}),[K,H]=c.useState([]),[X,Z]=c.useState([]),[z,G]=c.useState([]);async function o(){const[{data:a},{data:k},{data:b},{data:T}]=await Promise.all([y.from("community_categories").select("*").order("sort_order"),y.from("community_topics").select("*").order("last_activity_at",{ascending:!1}).limit(200),y.from("courses").select("id, title").order("title"),y.from("cohorts").select("id, name").order("name")]);s(a??[]),I(k??[]),H(b??[]),Z(T??[]);const D=Array.from(new Set((k??[]).map(E=>E.author_id)));if(D.length){const{data:E}=await y.from("profiles").select("id, full_name, email").in("id",D),M={};(E??[]).forEach(B=>{M[B.id]={name:B.full_name??"Aluno",email:B.email??null}}),O(M)}const J=await g();G(J.bans)}return c.useEffect(()=>{o()},[]),e.jsxs(W,{children:[e.jsx("h1",{className:"font-display text-3xl font-semibold",children:"Comunidade"}),e.jsx("p",{className:"mt-1 text-sm text-muted-foreground",children:"Modere conteúdo, gerencie categorias, publique anúncios e gerencie banimentos."}),e.jsxs(ne,{defaultValue:"topics",className:"mt-6",children:[e.jsxs(ce,{children:[e.jsxs(S,{value:"topics",children:[e.jsx(le,{className:"mr-1 h-3 w-3"})," Tópicos"]}),e.jsx(S,{value:"categories",children:"Categorias"}),e.jsxs(S,{value:"announcements",children:[e.jsx(P,{className:"mr-1 h-3 w-3"})," Anúncios"]}),e.jsxs(S,{value:"bans",children:[e.jsx(V,{className:"mr-1 h-3 w-3"})," Banimentos"]})]}),e.jsx(A,{value:"topics",className:"mt-4 space-y-2",children:q.length===0?e.jsx("div",{className:"rounded-xl border bg-card p-6 text-center text-sm text-muted-foreground",children:"Nenhum tópico ainda."}):q.map(a=>{const k=r.find(T=>T.id===a.category_id),b=$[a.author_id];return e.jsxs("div",{className:`flex flex-col gap-2 rounded-xl border bg-card p-4 sm:flex-row sm:items-center sm:justify-between ${a.is_deleted?"opacity-60":""}`,children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[e.jsx(h,{variant:"outline",children:k?.name??"—"}),a.is_pinned&&e.jsxs(h,{children:[e.jsx(L,{className:"mr-1 h-3 w-3"}),"Fixado"]}),a.is_locked&&e.jsxs(h,{variant:"secondary",children:[e.jsx(R,{className:"mr-1 h-3 w-3"}),"Fechado"]}),a.is_announcement&&e.jsxs(h,{variant:"secondary",children:[e.jsx(P,{className:"mr-1 h-3 w-3"}),"Anúncio"]}),a.is_deleted&&e.jsx(h,{variant:"destructive",children:"Excluído"})]}),e.jsx("div",{className:"mt-1 truncate font-semibold",children:a.title}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["por ",b?.name??"Aluno"," (",b?.email??"—",") · ",a.reply_count," respostas · ",a.like_count," curtidas"]})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsxs(l,{size:"sm",variant:"outline",onClick:async()=>{await d({data:{topic_id:a.id,action:a.is_pinned?"unpin":"pin"}}),m.success("OK"),o()},children:[e.jsx(L,{className:"h-3 w-3"})," ",a.is_pinned?"Desafixar":"Fixar"]}),e.jsxs(l,{size:"sm",variant:"outline",onClick:async()=>{await d({data:{topic_id:a.id,action:a.is_locked?"unlock":"lock"}}),m.success("OK"),o()},children:[e.jsx(R,{className:"h-3 w-3"})," ",a.is_locked?"Reabrir":"Fechar"]}),a.is_deleted?e.jsxs(l,{size:"sm",variant:"outline",onClick:async()=>{await d({data:{topic_id:a.id,action:"restore"}}),m.success("Restaurado"),o()},children:[e.jsx(oe,{className:"h-3 w-3"})," Restaurar"]}):e.jsxs(l,{size:"sm",variant:"destructive",onClick:async()=>{confirm("Excluir tópico?")&&(await d({data:{topic_id:a.id,action:"delete"}}),m.success("Excluído"),o())},children:[e.jsx(U,{className:"h-3 w-3"})," Excluir"]}),e.jsxs(l,{size:"sm",variant:"outline",onClick:async()=>{confirm(`Banir ${b?.name??"este aluno"} da comunidade?`)&&(await u({data:{user_id:a.author_id,reason:`Tópico: ${a.title}`}}),m.success("Aluno banido"),o())},children:[e.jsx(V,{className:"h-3 w-3"})," Banir autor"]})]})]},a.id)})}),e.jsx(A,{value:"categories",className:"mt-4",children:e.jsx(ue,{categories:r,courses:K,cohorts:X,onSave:async a=>{await j({data:a}),m.success("Categoria salva"),o()},onDelete:async a=>{confirm("Excluir categoria? Tópicos serão removidos.")&&(await p({data:{id:a}}),m.success("Excluída"),o())}})}),e.jsx(A,{value:"announcements",className:"mt-4",children:e.jsx(xe,{onCreate:async a=>{await v({data:a}),m.success("Anúncio publicado"),o()}})}),e.jsx(A,{value:"bans",className:"mt-4 space-y-2",children:z.length===0?e.jsx("div",{className:"rounded-xl border bg-card p-6 text-center text-sm text-muted-foreground",children:"Nenhum aluno banido."}):z.map(a=>e.jsxs("div",{className:"flex items-center justify-between rounded-xl border bg-card p-4",children:[e.jsxs("div",{children:[e.jsx("div",{className:"font-semibold",children:a.full_name??"Aluno"}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:[a.email??"—"," · banido em ",new Date(a.banned_at).toLocaleDateString("pt-BR",{timeZone:"America/Sao_Paulo"})]}),a.reason&&e.jsxs("div",{className:"mt-1 text-xs italic",children:['"',a.reason,'"']}
1)]}),e.jsx(l,{size:"sm",variant:"outline",onClick:async()=>{await i({data:{user_id:a.user_id}}),m.success("Desbanido"),o()},children:"Desbanir"})]},a.user_id))})]})]})}function ue({categories:j,courses:p,cohorts:d,onSave:v,onDelete:g}){const u={name:"",slug:"",description:"",kind:"topic",course_id:null,cohort_id:null,visibility:"public",status:"active",icon:"MessageSquare",color:"blue",allow_member_posts:!0,allow_attachments:!0,sort_order:(j.at(-1)?.sort_order??0)+10,archived:!1},[i,r]=c.useState(u);return e.jsxs("div",{className:"grid gap-6 md:grid-cols-2",children:[e.jsx("div",{className:"space-y-2",children:j.map(s=>e.jsxs("div",{className:`flex items-center justify-between rounded-lg border bg-card p-3 ${s.archived||s.status==="archived"?"opacity-60":""}`,children:[e.jsxs("div",{children:[e.jsxs("div",{className:"text-sm font-semibold",children:[s.name," ",e.jsx(h,{variant:"outline",className:"ml-1",children:s.kind}),e.jsx(h,{variant:"secondary",className:"ml-1 text-[10px]",children:s.visibility})]}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["/",s.slug," · ordem ",s.sort_order," · ",s.status]})]}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(l,{size:"sm",variant:"ghost",onClick:()=>r(s),children:"Editar"}),e.jsx(l,{size:"sm",variant:"ghost",onClick:()=>g(s.id),children:e.jsx(U,{className:"h-3 w-3"})})]})]},s.id))}),e.jsxs("form",{className:"rounded-xl border bg-card p-4 space-y-3",onSubmit:async s=>{s.preventDefault(),await v(i),r(u)},children:[e.jsx("div",{className:"font-semibold",children:i.id?"Editar categoria":"Nova categoria"}),e.jsxs("div",{children:[e.jsx(n,{children:"Nome"}),e.jsx(f,{value:i.name,onChange:s=>r({...i,name:s.target.value}),required:!0})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Slug"}),e.jsx(f,{value:i.slug,onChange:s=>r({...i,slug:s.target.value.toLowerCase().replace(/[^a-z0-9-]/g,"-")}),required:!0})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Descrição"}),e.jsx(F,{value:i.description,onChange:s=>r({...i,description:s.target.value}),rows:2})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Tipo"}),e.jsxs(N,{value:i.kind,onValueChange:s=>r({...i,kind:s}),children:[e.jsx(_,{children:e.jsx(w,{})}),e.jsxs(C,{children:[e.jsx(t,{value:"topic",children:"Temática"}),e.jsx(t,{value:"course",children:"Curso"}),e.jsx(t,{value:"announcement",children:"Anúncios"})]})]})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Visibilidade"}),e.jsxs(N,{value:i.visibility,onValueChange:s=>r({...i,visibility:s}),children:[e.jsx(_,{children:e.jsx(w,{})}),e.jsxs(C,{children:[e.jsx(t,{value:"public",children:"Pública"}),e.jsx(t,{value:"subscribers",children:"Assinantes"}),e.jsx(t,{value:"course_students",children:"Alunos do curso/turma"}),e.jsx(t,{value:"staff",children:"Equipe"}),e.jsx(t,{value:"admins",children:"Admins"})]})]})]})]}),i.kind==="course"&&e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Curso vinculado"}),e.jsxs(N,{value:i.course_id??"",onValueChange:s=>r({...i,course_id:s||null,cohort_id:null}),children:[e.jsx(_,{children:e.jsx(w,{placeholder:"Escolha um curso"})}),e.jsx(C,{children:p.map(s=>e.jsx(t,{value:s.id,children:s.title},s.id))})]})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Turma vinculada"}),e.jsxs(N,{value:i.cohort_id??"",onValueChange:s=>r({...i,cohort_id:s||null,course_id:null}),children:[e.jsx(_,{children:e.jsx(w,{placeholder:"(opcional)"})}),e.jsx(C,{children:d.map(s=>e.jsx(t,{value:s.id,children:s.name},s.id))})]})]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Status"}),e.jsxs(N,{value:i.status,onValueChange:s=>r({...i,status:s}),children:[e.jsx(_,{children:e.jsx(w,{})}),e.jsxs(C,{children:[e.jsx(t,{value:"active",children:"Ativa"}),e.jsx(t,{value:"draft",children:"Rascunho"}),e.jsx(t,{value:"archived",children:"Arquivada"})]})]})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Ícone"}),e.jsx(f,{value:i.icon,onChange:s=>r({...i,icon:s.target.value})})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Cor"}),e.jsx(f,{value:i.color,onChange:s=>r({...i,color:s.target.value})})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:i.allow_member_posts,onChange:s=>r({...i,allow_member_posts:s.target.checked})})," Membros podem postar"]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:i.allow_attachments,onChange:s=>r({...i,allow_attachments:s.target.checked})})," Permitir anexos"]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{children:[e.jsx(n,{children:"Ordem"}),e.jsx(f,{type:"number",value:i.sort_order,onChange:s=>r({...i,sort_order:Number(s.target.value)})})]}),e.jsx("div",{className:"flex items-end",children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:i.archived,onChange:s=>
1r({...i,archived:s.target.checked})})," Arquivada (legado)"]})})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(l,{type:"submit",children:[e.jsx(de,{className:"h-3 w-3"})," Salvar"]}),i.id&&e.jsx(l,{type:"button",variant:"ghost",onClick:()=>r(u),children:"Cancelar"})]})]})]})}function xe({onCreate:j}){const[p,d]=c.useState(""),[v,g]=c.useState(""),[u,i]=c.useState(!0);return e.jsxs("form",{className:"mx-auto max-w-2xl rounded-xl border bg-card p-6 space-y-3",onSubmit:async r=>{r.preventDefault(),await j({title:p,body:v,pinned:u}),d(""),g("")},children:[e.jsx("div",{className:"font-semibold",children:"Publicar anúncio oficial"}),e.jsxs("div",{children:[e.jsx(n,{children:"Título"}),e.jsx(f,{value:p,onChange:r=>d(r.target.value),required:!0})]}),e.jsxs("div",{children:[e.jsx(n,{children:"Mensagem"}),e.jsx(F,{value:v,onChange:r=>g(r.target.value),rows:6,required:!0})]}),e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:u,onChange:r=>i(r.target.checked)})," Fixar no topo"]}),e.jsxs(l,{type:"submit",children:[e.jsx(P,{className:"h-3 w-3"})," Publicar"]})]})}export{Ve as component};

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.