PageSourceSearch

https://slantapp.ai/assets/GroupDetail-DpMW6y_h.js

js slantapp.ai collected 2026-10-05 15:05:09 UTC 10,551 bytes, 1 lines download raw bytes

1import{b6 as H,u as W,c as Y,f as _,r as o,W as w,F as l,q as m,j as e,C as j,a as g,B as n,au as X,K as F,N as I,af as L,v as T,x as q,a4 as O,U as Z,O as R,D as ee,h as se,k as te,m as U,e as ae,$ as ie,a0 as ne,a1 as re,a2 as de,a3 as ce,a5 as oe,Q as u}from"./index-tc5-nNLC.js";import{S as le,a as me,b as ue,c as xe,d as C}from"./select-Bsa-6vNv.js";import{L as D}from"./label-MwGx_WS4.js";import{T as pe}from"./textarea-DN2rY_yY.js";import{A}from"./arrow-left-kYemJdx8.js";import{S as he}from"./send-B0Xv9vwc.js";import{E as je}from"./ellipsis-vertical-DKxVzYXD.js";import{U as ge}from"./user-minus-Djk9Emas.js";import"./index-C-y5wYFI.js";import"./chevron-down-DOFZ7rzv.js";import"./chevron-up-1gTexUQn.js";function Ee(){const[,f]=H("/community/:id"),[,x]=W(),{toast:d}=Y(),{user:v}=_(),a=(f==null?void 0:f.id)||"",[p,M]=o.useState(""),[P,h]=o.useState(!1),k=o.useRef(null),y=o.useRef(null),{data:t,isLoading:G}=w({queryKey:["/api/chat-groups",a],enabled:!!a}),{data:N=[],isLoading:J}=w({queryKey:["/api/chat-groups",a,"messages"],enabled:!!a&&!!(t!=null&&t.isJoined)}),{data:E=[]}=w({queryKey:["/api/chat-groups",a,"members"],enabled:!!a&&!!(t!=null&&t.isJoined)}),b=l({mutationFn:async s=>await u(`/api/chat-groups/${a}/messages`,{method:"POST",body:JSON.stringify({content:s})}),onSuccess:()=>{M(""),m.invalidateQueries({queryKey:["/api/chat-groups",a,"messages"]})},onError:()=>{d({title:"Error",description:"Failed to send message",variant:"destructive"})}}),K=l({mutationFn:async()=>await u(`/api/chat-groups/${a}/leave`,{method:"POST"}),onSuccess:()=>{d({title:"Left group",description:"You have left the group"}),x("/community")},onError:s=>{d({title:"Error",description:s.message||"Failed to leave group",variant:"destructive"})}}),S=l({mutationFn:async s=>await u(`/api/chat-groups/${a}`,{method:"PATCH",body:JSON.stringify(s)}),onSuccess:()=>{m.invalidateQueries({queryKey:["/api/chat-groups",a]}),h(!1),d({title:"Group updated",description:"Group settings have been updated"})},onError:()=>{d({title:"Error",description:"Failed to update group",variant:"destructive"})}}),B=l({mutationFn:async({userId:s,role:i})=>await u(`/api/chat-groups/${a}/members/${s}`,{method:"PATCH",body:JSON.stringify({role:i})}),onSuccess:()=>{m.invalidateQueries({queryKey:["/api/chat-groups",a,"members"]}),d({title:"Role updated",description:"Member role has been updated"})}}),Q=l({mutationFn:async s=>await u(`/api/chat-groups/${a}/members/${s}`,{method:"DELETE"}),onSuccess:()=>{m.invalidateQueries({queryKey:["/api/chat-groups",a,"members"]}),d({title:"Member removed",description:"Member has been removed from the group"})}});o.useEffect(()=>{if(!(t!=null&&t.isJoined))return;const s=window.location.protocol==="https:"?"wss:":"ws:",i=new WebSocket(`${s}//${window.location.host}`);return i.onopen=()=>{i.send(JSON.stringify({type:"join_group",groupId:a}))},i.onmessage=c=>{const r=JSON.parse(c.data);r.type==="chat_message"&&r.data.groupId===a&&m.invalidateQueries({queryKey:["/api/chat-groups",a,"messages"]})},y.current=i,()=>{y.current&&y.current.close()}},[a,t==null?void 0:t.isJoined]),o.useEffect(()=>{var s;(s=k.current)==null||s.scrollIntoView({behavior:"smooth"})},[N]);const V=s=>{s.preventDefault(),p.trim()&&b.mutate(p)},z=s=>{s.preventDefault();const i=new FormData(s.currentTarget);S.mutate({name:i.get("name"),description:i.get("description"),privacy:i.get("privacy")})},$=(t==null?void 0:t.userRole)==="owner"||(t==null?void 0:t.userRole)==="admin";return G?e.jsx("div",{className:"container mx-auto px-4 py-8",children:e.jsx("div",{className:"flex items-center justify-center min-h-[400px]",children:e.jsx("div",{className:"text-muted-foreground",children:"Loading group..."})})}):t?t.isJoined?e.jsxs("div",{className:"container mx-auto px-4 py-8",children:[e.jsxs("div",{className:"mb-6 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs(n,{variant:"ghost",size:"sm",onClick:()=>x("/community"),"data-testid":"button-back-community",children:[e.jsx(A,{className:"w-4 h-4 mr-2"}),"Back"]}),e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold","data-testid":"text-group-name",children:t.name}),e.jsx("p",{className:"text-sm text-muted-foreground","data-testid":"text-group-description",children:t.description})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[$&&e.jsxs(n,{variant:"outline",size:"sm",onClick:()=>h(!0),"data-testid":"button-group-settings",children:[e.jsx(X,{className:"w-4 h-4 mr-2"}),"Settings"]}),e.jsx(n,{variant:"outline",size:"sm",onClick:()=>K.mutate(),"data-testid":"button-leave-group",children:"Leave Group"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsx("div",{className:"lg:col-span-2",children:e.jsxs(j,{className:"h-[600px] flex flex-col",children:[e.jsx(F,{children:e.jsx(I,{children:"Messages"})}),e.jsxs(g,{className:"flex-1 flex flex-col",children:[e.jsx(L,{className:"flex-1 pr-4",children:J?e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsx("div",{className:"text-muted-foreground",children:"Loading messages..."})}):N.length===0?e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-muted-foreground mb-2",children:"No messages yet"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Be the first to start the conversation"})]})}):e.jsxs("div",{className:"space-y-4",children:[N.map(s=>{var i,c,r;return e.jsxs("div",{className:"flex gap-3","data-testid":`message-${s.id}`,children:[e.jsx(T,{children:e.jsx(q,{children:((c=(i=s.user)==null?void 0:i.name)==null?void 0:c.charAt(0).toUpperCase())||"U"})}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-baseline gap-2",children:[e.jsx("span",{className:"font-semibold text-sm","data-testid":`message-author-${s.id}`,children:((r=s.user)==null?void 0:r.name)||"Unknown"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:new Date(s.createdAt).toLocaleTimeString()}),s.isEdited&&e.jsx("span",{className:"text-xs text-muted-foreground",children:"(edited)"})]}),e.jsx("p",{className:"text-sm mt-1","data-testid":`message-content-${s.id}`,children:s.content})]})]},s.id)}),e.jsx("div",{ref:k})]})}),e.jsx("form",{onSubmit:V,className:"mt-4",children:e.jsxs("div",{className:"flex gap-2",children:[e.jsx(O,{value:p,onChange:s=>M(s.target.value),placeholder:"Type a message...",disabled:b.isPending,"data-testid":"input-message"}),e.jsx(n,{type:"submit",disabled:b.isPending||!p.trim(),"data-testid":"button-send-message",children:e.jsx(he,{className:"w-4 h-4"})})]})})]})]})}),e.jsx("div",{children:e.jsxs(j,{children:[e.jsx(F,{children:e.jsxs(I,{className:"flex items-center gap-2",children:[e.jsx(Z,{className:"w-5 h-5"}),"Members (",E.length,")"]})}),e.jsx(g,{children:e.jsx(L,{className:"h-[520px]",children:e.jsx("div",{className:"space-y-3",children:E.map(s=>{var i,c,r;return e.jsxs("div",{className:"flex items-center justify-between","data-testid":`member-${s.userId}`,children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(T,{children:e.jsx(q,{children:((c=(i=s.user)==null?void 0:i.name)==null?void 0:c.charAt(0).toUpperCase())||"U"})}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium","data-testid":`member-name-${s.userId}`,children:((r=s.user)==null?void 0:r.name)||"Unknown"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(R,{variant:"secondary",className:"text-xs",children:s.role}),s.isMuted&&e.jsx(R,{variant:"destructive",className:"text-xs",children:"Muted"})]})]})]}),$&&s.userId!==(v==null?void 0:v.id)&&e.jsxs(ee,{children:[e.jsx(se,{asChild:!0,children:e.jsx(n,{variant:"ghost",size:"sm","data-testid":`button-member-
1actions-${s.userId}`,children:e.jsx(je,{className:"w-4 h-4"})})}),e.jsxs(te,{children:[e.jsxs(U,{onClick:()=>B.mutate({userId:s.userId,role:"moderator"}),children:[e.jsx(ae,{className:"w-4 h-4 mr-2"}),"Make Moderator"]}),e.jsxs(U,{onClick:()=>Q.mutate(s.userId),className:"text-destructive",children:[e.jsx(ge,{className:"w-4 h-4 mr-2"}),"Remove Member"]})]})]})]},s.id)})})})})]})})]}),e.jsx(ie,{open:P,onOpenChange:h,children:e.jsx(ne,{children:e.jsxs("form",{onSubmit:z,children:[e.jsxs(re,{children:[e.jsx(de,{children:"Group Settings"}),e.jsx(ce,{children:"Update group information and settings"})]}),e.jsxs("div",{className:"space-y-4 py-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"edit-name",children:"Group Name"}),e.jsx(O,{id:"edit-name",name:"name",defaultValue:t.name,required:!0,"data-testid":"input-edit-name"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"edit-description",children:"Description"}),e.jsx(pe,{id:"edit-description",name:"description",defaultValue:t.description,rows:3,"data-testid":"input-edit-description"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(D,{htmlFor:"edit-privacy",children:"Privacy"}),e.jsxs(le,{name:"privacy",defaultValue:t.privacy,children:[e.jsx(me,{"data-testid":"select-edit-privacy",children:e.jsx(ue,{})}),e.jsxs(xe,{children:[e.jsx(C,{value:"public",children:"Public"}),e.jsx(C,{value:"private",children:"Private"}),e.jsx(C,{value:"invite-only",children:"Invite Only"})]})]})]})]}),e.jsxs(oe,{children:[e.jsx(n,{type:"button",variant:"outline",onClick:()=>h(!1),"data-testid":"button-cancel-settings",children:"Cancel"}),e.jsx(n,{type:"submit",disabled:S.isPending,"data-testid":"button-save-settings",children:S.isPending?"Saving...":"Save Changes"})]})]})})})]}):e.jsx("div",{className:"container mx-auto px-4 py-8",children:e.jsx(j,{children:e.jsxs(g,{className:"py-12 text-center",children:[e.jsx("h2",{className:"text-2xl font-bold mb-4",children:t.name}),e.jsx("p",{className:"text-muted-foreground mb-6",children:t.description}),e.jsx("p",{className:"text-sm text-muted-foreground mb-4",children:"You need to join this group to see messages"}),e.jsx("div",{className:"flex gap-2 justify-center",children:e.jsxs(n,{variant:"outline",onClick:()=>x("/community"),"data-testid":"button-back",children:[e.jsx(A,{className:"w-4 h-4 mr-2"}),"Back"]})})]})})}):e.jsx("div",{className:"container mx-auto px-4 py-8",children:e.jsx(j,{children:e.jsxs(g,{className:"py-12 text-center",children:[e.jsx("p",{className:"text-muted-foreground mb-4",children:"Group not found"}),e.jsx(n,{onClick:()=>x("/community"),"data-testid":"button-back-to-community",children:"Back to Community"})]})})})}export{Ee 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.