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/';
})
}
})();