import { renderHeader } from '../components/header.js'; import { state } from '../state.js'; import { loadUserProfileCard } from '../services/user-connections.js'; import { renderUserAvatar } from '../components/avatar-image.js'; import { makeProfileLinksRoute } from '../services/shine-routes.js'; import { navigateBack } from '../router.js'; export const pageMeta = { id: 'user', title: 'Профиль пользователя' }; function escapeHtml(text){return String(text||'').replaceAll('&','&').replaceAll('<','<').replaceAll('>','>').replaceAll('"','"').replaceAll("'",''');} function fullName(card){return [card.firstName,card.lastName].filter(Boolean).join(' ')||card.login;} function openTextModal(title,text){ const root=document.getElementById('modal-root'); if(!root)return; root.innerHTML=``; const close=()=>{root.innerHTML='';}; root.querySelector('#profile-text-close')?.addEventListener('click',close); root.querySelector('#profile-text-modal')?.addEventListener('click',e=>{if(e.target?.id==='profile-text-modal')close();}); } function statusBadges(card){ const role=card.accountRole==='primary'?'Основной аккаунт':card.accountRole==='non_voting'?'Голос не учитывать':''; const shine=card.shineStatus==='shining'?'Сияющий':''; return `
${role?`${escapeHtml(role)}`:''}${shine?'Сияющий':''}${card.shineStatus==='not_interested'?'Сияние неинтересно':''}
`; } function statsHtml(card){ const s=card.stats||{}; const rows=[ ['friends','Друзья',s.friendsCount],['close_friends','Близкие друзья',s.closeFriendsCount], ['primary_received','Подтвердили основной аккаунт',s.primaryReceivedCount],['primary_given','Подтверждённые аккаунты',s.primaryGivenCount], ['shine_received','Считают сияющим',s.shineReceivedCount],['shine_given','Подтверждённые сияющие',s.shineGivenCount], ['channels_following','Подписки на каналы',s.followingChannelsCount],['channels_owned','Каналы',s.ownedPublicChannelsCount], ]; return `
${rows.map(([kind,label,n])=>``).join('')}
`; } export function render({navigate,route}){ const requestedLogin=String(route?.params?.login||'').trim(); const selfLogin=String(state.session.login||'').trim(); const screen=document.createElement('section'); screen.className='stack'; const body=document.createElement('div');body.className='stack';const status=document.createElement('div');status.className='status-line';status.textContent='Загрузка профиля...'; screen.append(renderHeader({title:'Профиль пользователя',leftAction:{label:'←',onClick:()=>navigateBack()}}),status,body); let card=null; async function refresh(){ card=await loadUserProfileCard(requestedLogin); const isSelf=card.login.toLowerCase()===selfLogin.toLowerCase(); body.innerHTML=`${statusBadges(card)}
${escapeHtml(card.about||'')}
${statsHtml(card)}
${!isSelf?`
`:''}`; const identity=document.createElement('div');identity.className='card row';identity.style.gap='12px';identity.style.alignItems='center'; identity.append(renderUserAvatar({login:card.login,firstName:card.firstName,lastName:card.lastName,avatar:card.avatar,size:'xl',className:'profile-avatar'})); const txt=document.createElement('div');txt.innerHTML=`
${escapeHtml(fullName(card))}
${escapeHtml(card.login)}
`;identity.append(txt);body.prepend(identity);status.textContent=''; } body.addEventListener('click',e=>{const el=e.target.closest('[data-profile-list],[data-profile-detail],[data-bottom]');if(!el||!card)return; const list=el.dataset.profileList;if(list){navigate(`SHiNE/${encodeURIComponent(card.login)}/list/${encodeURIComponent(list)}`);return;} const detail=el.dataset.profileDetail;if(detail==='contacts'){openTextModal('Контакты',[card.web?`Links: ${card.web}`:'',card.phone?`Телефон: ${card.phone}`:'',card.address?`Адрес: ${card.address}`:''].filter(Boolean).join('\n')||'Не заполнено');return;} if(detail==='spiritual'){openTextModal('Духовный путь',card.spiritualPath);return;} const bottom=el.dataset.bottom;if(bottom==='chat')navigate(`chat/${encodeURIComponent(card.login)}`);if(bottom==='links')navigate(makeProfileLinksRoute(card.login));if(bottom==='add')navigate(`SHiNE/${encodeURIComponent(card.login)}/manage`); }); refresh().catch(e=>{status.className='status-line is-unavailable';status.textContent=`Ошибка: ${e.message||'unknown'}`;}); return screen; }