const bridge=window.psiqCommunityBridge; const byId=id=>document.getElementById(id); const escape=value=>String(value??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); const slug=name=>'membro-'+name.normalize('NFD').replace(/[\u0300-\u036f]/g,'').toLowerCase().replace(/[^a-z0-9]+/g,'-').replace(/^-|-$/g,''); const initials=name=>name.trim().split(/\s+/).slice(0,2).map(n=>n[0]||'').join('').toUpperCase(); const screen=document.createElement('section');screen.id='public-community';screen.className='public-community';screen.hidden=true;byId('main').insertBefore(screen,byId('main').querySelector(':scope > .footer')); const chats=new Map(); function people(){const self=bridge.self();const list=[{id:'eu',name:self.name,bio:self.bio,role:'Membro',own:true}];const known=new Set();for(const post of bridge.posts()){if(post.example===false)continue;const id=slug(post.author);if(known.has(id))continue;known.add(id);list.push({id,name:post.author,bio:post.role==='Professor'?'Professor da comunidade Psiq Raiz. Perfil de demonstração.':'Este é um perfil de exemplo para conhecer a comunidade e testar a navegação.',role:post.role||'Membro',own:false})}for(const person of list){bridge.register('perfil-'+person.id,['Perfil de '+person.name,'COMUNIDADE',person.name,'Perfil público da comunidade.','user']);if(!person.own)bridge.register('mensagens-para-'+person.id,['Conversa com '+person.name,'MENSAGENS',person.name,'Prévia de conversa privada.','chat'])}return list} function personById(id){return people().find(p=>p.id===id)} function selfPhoto(){return document.querySelector('#profile-toggle [data-avatar] img')?.getAttribute('src')||null} function avatar(person){const photo=person.own?selfPhoto():null;return `${photo?`Foto de ${escape(person.name)}`:escape(initials(person.name))}`} function about(person){return person.bio||'Ainda não adicionou uma bio.'} function renderDirectory(){const list=people();screen.innerHTML=`
COMUNIDADE PSIQ RAIZ

Membros

Ver meu perfil

Conheça as pessoas da comunidade. Clique no nome, na foto ou na bio para abrir o perfil.

${list.map(p=>`
${avatar(p)}${escape(p.name)}${escape(p.role)}${p.own?' · Você':' · Exemplo'}${escape(about(p))}Ver perfil
`).join('')}

Prévia local: os outros perfis são exemplos. O diretório compartilhado será conectado ao backend.

`} function postsFor(person){return bridge.posts().filter(post=>person.own?post.example===false:post.example!==false&&slug(post.author)===person.id)} function renderProfile(person){const posts=postsFor(person);screen.innerHTML=`
← Voltar aos membros${person.own?'Seu perfil na comunidade':'Perfil de demonstração'}
${avatar(person)}

${escape(person.name)}

${escape(person.role)} · Comunidade Psiq Raiz
${person.own?'':`Enviar mensagem`}

Sobre

${escape(about(person))}

${person.own?'

Foto, nome e bio compõem seu perfil público para os membros. Financeiro e configurações ficam na sua área pessoal.

':''}

Publicações na comunidade

${posts.length?posts.map(post=>`
${post.space==='apresente'?'Se apresente':'Feed'}

${escape(post.title)}

${escape(post.body)}

Ver no espaço →
`).join(''):'

Ainda não há publicações nesta prévia.

'}

Perfil demonstrativo. As informações ainda não são compartilhadas entre contas e desaparecem ao recarregar.

`} function renderMessages(person){if(!person){screen.innerHTML=`

Mensagens privadas

Comece uma conversa

Abra o perfil de um membro e escolha “Enviar mensagem”.

Conhecer os membros

As mensagens reais serão conectadas ao backend.

`;return}const messages=chats.get(person.id)||[];screen.innerHTML=`
← Voltar ao perfil
${avatar(person)}

${escape(person.name)}

Ver perfil

Simulação local: nenhuma mensagem é enviada a outra pessoa. O envio real depende do backend.

${messages.length?messages.map(text=>`
${escape(text)}Somente nesta prévia
`).join(''):'

Sua conversa começa aqui.

'}
`} function decoratePostProfiles(){const list=people(),posts=bridge.posts(),space=location.hash.slice(1);document.querySelectorAll('#post-list .post').forEach(article=>{const name=article.querySelector('.post-person strong');if(!name)return;const matching=posts.find(p=>p.space===space&&p.title===article.querySelector('h2')?.textContent);const person=matching?.example===false?list[0]:list.find(p=>!p.own&&p.name===name.textContent);if(!person)return;[name,article.querySelector('.post-top>.avatar')].filter(Boolean).forEach(node=>{node.dataset.publicProfile=person.id;node.tabIndex=0;node.setAttribute('role','link');node.setAttribute('aria-label','Ver perfil de '+person.name);node.classList.add('public-profile-link')})})} function renderCommunity(){screen.hidden=true;if(!bridge.ready())return;people();const key=location.hash.slice(1),profileId=key.startsWith('perfil-')?key.slice(7):null,recipientId=key.startsWith('mensagens-para-')?key.slice(15):null;const isCommunity=key==='membros'||key==='mensagens'||profileId!==null||recipientId!==null;if(!isCommunity){decoratePostProfiles();return}document.querySelectorAll('#home-content,#section-content,#feed-content,#onboard-content,#course-content,#events-content,#finance-content,.main>.heading,.main>.crumb').forEach(node=>node.hidden=true);screen.hidden=false;if(key==='membros')renderDirectory();else if(key==='mensagens')renderMessages(null);else if(profileId!==null){const person=personById(profileId);if(person)renderProfile(person);else screen.innerHTML='

Perfil não encontrado

Voltar aos membros'}else{const person=personById(recipientId);if(person&&!person.own)renderMessages(person);else renderMessages(null)}window.closeProfile();window.closeSidebar();const menuPerson=document.querySelector('#profile-menu .menu-person');menuPerson.dataset.publicProfile='eu';menuPerson.tabIndex=0;menuPerson.setAttribute('role','link');menuPerson.setAttribute('aria-label','Ver meu perfil')} const originalNavigate=window.navigate;window.navigate=function(...args){originalNavigate(...args);renderCommunity()}; const originalFeed=window.renderFeed;window.renderFeed=function(...args){originalFeed(...args);decoratePostProfiles()}; window.addEventListener('hashchange',renderCommunity); document.addEventListener('click',event=>{const edit=event.target.closest('[data-edit-community-profile]');if(edit){event.preventDefault();window.openDialog('Editar perfil','Sua foto, nome e bio aparecem no seu perfil para a comunidade.',true);return}const target=event.target.closest('[data-public-profile]');if(!target)return;event.preventDefault();event.stopPropagation();const route='perfil-'+target.dataset.publicProfile;if(location.hash==='#'+route)renderCommunity();else location.hash=route},true); document.addEventListener('keydown',event=>{if(!['Enter',' '].includes(event.key))return;const target=event.target.closest('[data-public-profile][role=link]');if(target){event.preventDefault();target.click()}}); byId('profile-form').addEventListener('submit',()=>queueMicrotask(renderCommunity)); document.addEventListener('submit',event=>{if(event.target.id!=='community-chat-form')return;event.preventDefault();const person=personById(event.target.dataset.recipient),field=byId('community-message'),text=field.value.trim();if(!person||person.own||!text){field.setCustomValidity('Escreva uma mensagem de exemplo.');field.reportValidity();return}const messages=chats.get(person.id)||[];messages.push(text.slice(0,3000));chats.set(person.id,messages);renderMessages(person);byId('community-message').focus()}); document.addEventListener('input',event=>{if(event.target.id==='community-message')event.target.setCustomValidity('')}); byId('logout').addEventListener('click',()=>{chats.clear();screen.hidden=true}); const menuPerson=document.querySelector('#profile-menu .menu-person');menuPerson.dataset.publicProfile='eu';menuPerson.tabIndex=0;menuPerson.setAttribute('role','link');menuPerson.setAttribute('aria-label','Ver meu perfil'); people();renderCommunity();