Raccourcisseur de liens

Transformez n'importe quel lien long en lien court sur le domaine fastols.com/ en quelques secondes, avec un compteur de clics pour chaque lien

document.addEventListener('DOMContentLoaded',function(){ var shell = document.getElementById('toolShell'); var API_BASE = window.FASTOLS_API_BASE || ''; var $url = shell.querySelector('#longUrl'), $alias = shell.querySelector('#customAlias'), $expires = shell.querySelector('#expiresSelect'), $btn = shell.querySelector('#shortenBtn'), $status = shell.querySelector('#shortenStatus'), $resultBox = shell.querySelector('#resultBox'), $shortOut = shell.querySelector('#shortUrlOut'), $copyBtn = shell.querySelector('#copyShortBtn'), $clicksInfo = shell.querySelector('#clicksInfo'); function formatExpiry(iso){ try { var d = new Date(iso); return d.toLocaleString(); } catch (e) { return iso; } } function esc(s){ return (s||'').replace(/&/g,'&').replace(/"/g,'"').replace(//g,'>'); } function setStatus(ok, msg){ $status.style.display = 'block'; $status.style.cssText = 'display:block;margin:2px 0 4px;border-radius:12px;padding:10px 14px;font-size:12.5px;line-height:1.8;border:1.5px solid ' + (ok ? '#16A34A55' : '#DC262655') + ';background:' + (ok ? '#16A34A14' : '#DC262614') + ';color:' + (ok ? '#15803D' : '#2DCC29') + ';'; $status.innerHTML = '' + esc(msg) + ''; } function clearStatus(){ $status.style.display = 'none'; $status.innerHTML = ''; } function shorten(){ var url = ($url.value || '').trim(); var alias = ($alias.value || '').trim(); var expiresDays = $expires ? ($expires.value || '').trim() : ''; if (!url) { setStatus(false, FastolsI18n.t('tool.shorten.errEmpty', 'Veuillez d\'abord saisir un lien.')); return; } clearStatus(); $resultBox.style.display = 'none'; $btn.disabled = true; var origLabel = $btn.textContent; $btn.textContent = FastolsI18n.t('tool.shorten.loading', 'Raccourcissement...'); var payload = { url: url }; if (alias) payload.alias = alias; if (expiresDays) payload.expires_in_days = parseInt(expiresDays, 10); fetch(API_BASE + '/api/shorten', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }).then(function(res){ return res.json().then(function(data){ return { ok: res.ok, data: data }; }); }).then(function(r){ $btn.disabled = false; $btn.textContent = origLabel; if (!r.ok) { setStatus(false, r.data && r.data.error ? r.data.error : FastolsI18n.t('tool.shorten.errGeneric', 'Une erreur s\'est produite, veuillez réessayer.')); return; } $shortOut.textContent = r.data.short_url; $resultBox.style.display = 'block'; $clicksInfo.textContent = r.data.expires_at ? FastolsI18n.t('tool.shorten.expiresInfo', 'Le lien expire le : {date}').replace('{date}', formatExpiry(r.data.expires_at)) : ''; setStatus(true, FastolsI18n.t('tool.shorten.success', 'Lien court créé avec succès ✓')); }).catch(function(){ $btn.disabled = false; $btn.textContent = origLabel; setStatus(false, FastolsI18n.t('tool.shorten.errNetwork', 'Impossible de contacter le serveur, vérifiez votre connexion et réessayez.')); }); } $btn.addEventListener('click', shorten); $url.addEventListener('keydown', function(e){ if (e.key === 'Enter') shorten(); }); function copyBtnLabelNode(){ for (var i = $copyBtn.childNodes.length - 1; i >= 0; i--) { if ($copyBtn.childNodes[i].nodeType === 3) return $copyBtn.childNodes[i]; } var t = document.createTextNode(''); $copyBtn.appendChild(t); return t; } $copyBtn.addEventListener('click', function(){ var text = $shortOut.textContent; if (!text) return; navigator.clipboard.writeText(text).then(function(){ var labelNode = copyBtnLabelNode(); var orig = labelNode.textContent; $copyBtn.classList.add('is-copied'); labelNode.textContent = FastolsI18n.t('tool.shorten.copied', 'Copié ✓'); setTimeout(function(){ labelNode.textContent = orig; $copyBtn.classList.remove('is-copied'); }, 1500); }); }); });