function triggerToast(text, success = false, enable_html = false) { const toastTrigger = document.getElementById('liveToastBtn') const toastLive = document.getElementById('liveToast') const toast = new bootstrap.Toast(toastLive) if (success) { toastLive.classList.remove('text-bg-danger'); toastLive.classList.add('text-bg-success'); } else { toastLive.classList.add('text-bg-danger'); toastLive.classList.remove('text-bg-success'); } if (enable_html) document.getElementById('toast_body').innerHTML = text; else document.getElementById('toast_body').innerText = text; toast.show() } function setButton(waiting, button_descriptor) { let button = document.querySelector(button_descriptor); if (!button) return; if (button.querySelector('.fa-solid')) { button.querySelector('.fa-solid').style.display = waiting ? 'none' : ''; button.querySelector('.spinner-border').hidden = !waiting; } button.disabled = waiting; } function addFriend(name, button_descriptor, auto_reload = false) { return new Promise((resolve) => { setButton(true, button_descriptor); fetch('/friends/add/' + name).then((response) => { setButton(false, button_descriptor); if (response.status === 200) { triggerToast(`${name} est ajouté à votre liste de contacts.
` + "Cliquez ici pour rafraichir la page", true, true); if (auto_reload) setTimeout(() => { location.reload() }, 230); } else triggerToast(name + ' est introuvable'); resolve(response.status); }); }); } function deleteFriend(friend_name, button_descriptor, auto_reload = false) { return new Promise((resolve) => { setButton(true, button_descriptor); fetch('/friends/remove/' + friend_name).then((response) => { setButton(false, button_descriptor); if (response.status === 200) { triggerToast(friend_name + ' a été supprimé de votre liste de contact', true); if (auto_reload) setTimeout(() => { location.reload() }, 200); } else { triggerToast("Une erreur s'est produite pendant la suppression."); } resolve(response.status); }); }); } function setRelation(friend_name, relation, button_descriptor, auto_reload = false) { console.log(relation) return new Promise((resolve) => { setButton(true, button_descriptor); fetch('/friends/set_relation/' + friend_name + '/' + relation).then((response) => { setButton(false, button_descriptor); if (response.status === 200) { triggerToast("Relation modifiée avec succès", true); if (auto_reload) setTimeout(() => { location.reload() }, 200); } else { triggerToast("Une erreur s'est produite pendant la modification."); } resolve(response.status); }); }); } function isValidURL(string) { let res = string.match(/(http(s)?:\/\/.)(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,40}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)/g); return (res !== null) } function getURLDomain(str) { if (!isValidURL(str)) return str.trim() let a = document.createElement('a'); a.href = str; return a.hostname; } function getURLPath(str) { if (!isValidURL(str)) return str.trim() let a = document.createElement('a'); a.href = str; return a.pathname.substr(1) } function openFriend(name, auto_reload = false) { function config_bio(data) { function set_link(elem, data, path = false) { if (!data) { elem.hidden = true; return; } elem.hidden = false; if (path) elem.querySelector('a').innerText = getURLPath(data); else elem.querySelector('a').innerText = getURLDomain(data); if (isValidURL(data)) elem.querySelector('a').href = data; } let bio = document.getElementById('FP-bio'); let social_row = document.getElementById('FP-socials-row'); let website = document.getElementById('FP-website'); let github = document.getElementById('FP-github'); let discord = document.getElementById('FP-discord'); let recit = document.getElementById('FP-text'); let shown = !!(data.discord || data.website || data.github || data.recit); bio.hidden = !shown; if (!shown) return; let social_shown = !!(data.discord || data.website || data.github) social_row.hidden = !social_shown; if (social_shown) { set_link(website, data.website); set_link(github, data.github, true); set_link(discord, data.discord); } recit.hidden = !(recit); if (data.recit) recit.innerText = data.recit; else recit.innerText = ""; } return new Promise(async (resolve) => { fetch("/getuser/" + name).then(res => { if (res.status !== 200) { triggerToast("Une erreur s'est produite.") return resolve(400); } res.json().then(data => { let openFriendLabelAddFriend = document.getElementById("openFriendLabelAddFriend"); let openFriendLabelDeleteFriend = document.getElementById("openFriendLabelDeleteFriend"); let openFriendModalName = document.getElementById("openFriendModalName"); let addCloseFriend = document.getElementById("addCloseFriend"); let removeCloseFriend = document.getElementById("removeCloseFriend"); let openFriendProfile = document.getElementById("openFriendProfile"); let openFriendShowCluster = document.getElementById('openFriendShowCluster'); let pool = openFriendModalName.querySelector('.pool'); let modal_name = openFriendModalName.querySelector('.name'); openFriendLabelAddFriend.hidden = !data.is_friend; openFriendLabelDeleteFriend.hidden = !!data.is_friend; addCloseFriend.hidden = !data.is_friend; removeCloseFriend.hidden = !!data.is_friend; if (!data.is_friend) addCloseFriend.hidden = true; config_bio(data) openFriendShowCluster.disabled = !(data['position'] !== null); openFriendShowCluster.onclick = () => { if (!data.position[0]) return; // i hate it if (data.position[0] === 'e' || data.position[0] === 'c' || data.position.includes('bess') || data.position.includes('paul') || data.position.includes('made')) { let cluster = data.position.split('r')[0] if (data.position.includes('bess') || data.position.includes('paul')) { let lastChar = cluster[cluster.length - 1]; if (lastChar === 'A' || lastChar === 'B') cluster = cluster.slice(0, -1); } location.href = `/?cluster=${cluster}&p=${data.position}` } } openFriendLabelAddFriend.onclick = () => { addFriend(name, '#openFriendLabelAddFriend', auto_reload) } openFriendLabelDeleteFriend.onclick = () => { deleteFriend(name, '#openFriendLabelDeleteFriend', auto_reload) } let changeRelation = async (relation, hide) => { const ret = await setRelation(name, relation, '#openFriendLabelAddBestFriend') if (ret !== 200) return; addCloseFriend.hidden = hide; removeCloseFriend.hidden = !hide; } addCloseFriend.onclick = () => { changeRelation(1, true) }; removeCloseFriend.onclick = () => { changeRelation(0, false) }; openFriendProfile.href = "https://profile.intra.42.fr/users/" + name; document.getElementById('openFriendModalPic').src = data.image; if (data.pool) pool.innerText = "Piscine de " + data.pool modal_name.innerText = name; document.getElementById("openFriendLabel").innerText = name; const modal = new bootstrap.Modal('#openFriendModal', {}); openFriendModal = modal; modal.show(); resolve(200) }) }) }) } function does_user_exists(login) { return new Promise(async (resolve) => { fetch("/getuser/" + login).then(res => { if (res.status === 200) resolve(200); else resolve(res.status); }); }); } function open(url) { window.location.href = url; } function newTab(url) { window.open(url, '_blank').focus(); } function isTouchDevice() { return (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)); } (() => { let globalAddFriend = document.getElementById('globalAddFriend'); let globalSearchInput = document.getElementById('globalSearch'); let globalSearchButton = document.getElementById('globalSearchButton'); async function redirect_profile(login) { login = login.trim().toLowerCase() if (login === "" || login.length <= 3) { globalSearchInput.focus(); return; } if (await does_user_exists(login) === 200) location.href = '/profile/' + login; else triggerToast("L'utilisateur est introuvable", false); } function fillGlobalSuggestions(element, suggestions) { let list = document.querySelector(element); list.innerHTML = '' suggestions.forEach(function(item) { let option = document.createElement('option'); option.value = item['s']; option.innerText = item['v']; list.appendChild(option); }); } /* globalAddFriend.addEventListener('click', async () => { let val = globalSearchInput.value.trim(); if (val === "") { globalSearchInput.focus(); return; } await addFriend(globalSearchInput.value, '#globalAddFriend', true); }); */ function search_text(text, callback) { fetch('/search/' + encodeURIComponent(text) + "/0").then((response) => { response.json().then((json) => { callback(json); }) }) } if (globalSearchInput) { let lastSearch = ""; globalSearchInput.addEventListener('keyup', async (e) => { let val = globalSearchInput.value.trim().toLowerCase(); if (e.key === 'Enter') { if (val.length <= 3) await redirect_profile(val); else { search_text(val, (json) => { let found = 0; json.forEach((item) => { if (item['v'].toLowerCase() === val || item['s'].toLowerCase() === val) { if (item['type'] === 'user') { redirect_profile(item['s']); found = 1; } else if (item['type'] === 'project') { open('/mates/' + item['s']); found = 1; } } }) if (found === 0) triggerToast(`Aucun résultat pour ${val}` ) }); } } if (val.length >= 3) { setTimeout(() => { if (val !== globalSearchInput.value.trim().toLowerCase()) return; if (val === lastSearch) return; console.log(val, globalSearchInput.value.trim().toLowerCase()) lastSearch = val; search_text(val, (json) => { fillGlobalSuggestions('#global_suggestions', json) }); }, 200) } }); globalSearchButton.addEventListener('click', async () => { let val = globalSearchInput.value.trim().toLowerCase(); await redirect_profile(val); }) } })(); (() => { let cluster = document.getElementById('qc-cluster'); let friends = document.getElementById('qc-friends'); if (cluster && friends) { if (location.pathname === '/') friends.hidden = false; else cluster.hidden = false; cluster.addEventListener('click', () => { location.href = '/'; }) friends.addEventListener('click', () => { location.href = '/friends/'; }) } })();