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