/* ============================================================ BAN YARO — Freunde-Seite ============================================================ */ window.Page_friends = (() => { let _container = null; let _searchTimer = null; // ---------------------------------------------------------- function init(container) { _container = container; render(); } // ---------------------------------------------------------- async function render() { _container.innerHTML = `

Freunde

`; document.getElementById('fr-search').addEventListener('input', e => { clearTimeout(_searchTimer); _searchTimer = setTimeout(() => _doSearch(e.target.value.trim()), 400); }); await _loadFriends(); } // ---------------------------------------------------------- async function _loadFriends() { try { const data = await API.friends.list(); _renderIncoming(data.incoming); _renderOutgoing(data.outgoing); _renderFriends(data.friends); _updateBadge(data.incoming.length); } catch (e) { if (e.status === 401) { document.getElementById('fr-list').innerHTML = `

Bitte melde dich an, um Freunde zu verwalten.

`; } } } // ---------------------------------------------------------- function _updateBadge(count) { const el = document.getElementById('friends-badge'); if (!el) return; el.textContent = count; el.style.display = count > 0 ? '' : 'none'; } // ---------------------------------------------------------- function _renderIncoming(list) { const el = document.getElementById('fr-incoming'); if (!list.length) { el.innerHTML = ''; return; } el.innerHTML = `

Anfragen (${list.length})

${list.map(r => `
${_initial(r.requester_name)}
${_esc(r.requester_name)}
möchte mit dir befreundet sein
`).join('')} `; } // ---------------------------------------------------------- function _renderOutgoing(list) { const el = document.getElementById('fr-outgoing'); if (!list.length) { el.innerHTML = ''; return; } el.innerHTML = `

Gesendete Anfragen

${list.map(r => `
${_initial(r.addressee_name)}
${_esc(r.addressee_name)}
ausstehend
`).join('')} `; } // ---------------------------------------------------------- function _renderFriends(list) { const el = document.getElementById('fr-list'); if (!list.length) { el.innerHTML = `

Noch keine Freunde. Suche oben nach Nutzern!

`; return; } el.innerHTML = `

Freunde (${list.length})

${list.map(f => `
${_initial(f.friend_name)}
${_esc(f.friend_name)}
`).join('')} `; } // ---------------------------------------------------------- async function _doSearch(q) { const el = document.getElementById('fr-search-results'); if (q.length < 2) { el.innerHTML = ''; return; } try { const results = await API.friends.search(q); if (!results.length) { el.innerHTML = `
Keine Nutzer gefunden.
`; return; } el.innerHTML = `
${results.map(u => `
${_initial(u.name)}
${_esc(u.name)}
`).join('')}
`; } catch (e) { el.innerHTML = ''; } } // ---------------------------------------------------------- async function _sendRequest(userId, btn) { btn.disabled = true; try { await API.friends.sendRequest(userId); UI.toast('Freundschaftsanfrage gesendet!', 'success'); document.getElementById('fr-search').value = ''; document.getElementById('fr-search-results').innerHTML = ''; await _loadFriends(); } catch (e) { UI.toast(e.message, 'danger'); btn.disabled = false; } } async function _accept(id) { try { await API.friends.accept(id); UI.toast('Freundschaft angenommen!', 'success'); await _loadFriends(); } catch (e) { UI.toast(e.message, 'danger'); } } async function _decline(id) { try { await API.friends.decline(id); await _loadFriends(); } catch (e) { UI.toast(e.message, 'danger'); } } async function _cancel(id) { try { await API.friends.decline(id); await _loadFriends(); } catch (e) { UI.toast(e.message, 'danger'); } } async function _removeFriend(userId, name) { if (!confirm(`${name} als Freund entfernen?`)) return; try { await API.friends.remove(userId); UI.toast('Freund entfernt.', 'info'); await _loadFriends(); } catch (e) { UI.toast(e.message, 'danger'); } } async function _openChat(userId) { try { const { conversation_id } = await API.chat.start(userId); App.navigate('chat', true, { conversation_id }); } catch (e) { UI.toast(e.message, 'danger'); } } // ---------------------------------------------------------- function _initial(name) { return (name || '?')[0].toUpperCase(); } function _esc(s) { if (!s) return ''; return String(s).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } // ---------------------------------------------------------- return { init, _sendRequest, _accept, _decline, _cancel, _removeFriend, _openChat, }; })();