feat: add per-domain registrar price comparison (register + renew)
This commit is contained in:
parent
b5d632e887
commit
75300a1005
51
index.html
51
index.html
@ -51,10 +51,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h2>TOP domen</h2>
|
<h2>TOP domen + porównanie cen (rejestracja / odnowienie)</h2>
|
||||||
<div class="table-wrap">
|
<div class="table-wrap">
|
||||||
<table>
|
<table>
|
||||||
<thead><tr><th>Domena</th><th>TLD</th><th>Score</th><th>Status</th></tr></thead>
|
<thead><tr><th>Domena</th><th>TLD</th><th>Score</th><th>Status</th><th>Oferty (top 3)</th></tr></thead>
|
||||||
<tbody id="rows"></tbody>
|
<tbody id="rows"></tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@ -63,6 +63,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
let domains = [];
|
let domains = [];
|
||||||
|
let priceItems = [];
|
||||||
|
|
||||||
function money(v){ return (v===null || v===undefined || Number.isNaN(Number(v))) ? '—' : `${Number(v).toFixed(2)} zł`; }
|
function money(v){ return (v===null || v===undefined || Number.isNaN(Number(v))) ? '—' : `${Number(v).toFixed(2)} zł`; }
|
||||||
|
|
||||||
@ -71,6 +72,39 @@ function domainCheckUrl(domain){
|
|||||||
return `https://www.whois.com/whois/${d}`;
|
return `https://www.whois.com/whois/${d}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function registrarDomainUrl(name, domain){
|
||||||
|
const d = encodeURIComponent(domain);
|
||||||
|
const n = (name || '').toLowerCase();
|
||||||
|
if(n.includes('cyber')) return `https://cyberfolks.pl/domeny-rejestracja/?slowa=${d}`;
|
||||||
|
if(n.includes('home.pl')) return `https://home.pl/szukaj/?query=${d}`;
|
||||||
|
if(n.includes('nazwa')) return `https://www.nazwa.pl/sprawdz-domene/?domain=${d}`;
|
||||||
|
if(n.includes('ovh')) return `https://www.ovhcloud.com/pl/domains/?domain=${d}`;
|
||||||
|
if(n.includes('aftermarket')) return `https://aftermarket.pl/szukaj/${d}`;
|
||||||
|
if(n.includes('porkbun')) return `https://porkbun.com/checkout/search?q=${d}`;
|
||||||
|
return domainCheckUrl(domain);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadPrices(){
|
||||||
|
const u = new URL('./api.php', location.href);
|
||||||
|
u.searchParams.set('action','prices');
|
||||||
|
const d = await (await fetch(u)).json();
|
||||||
|
priceItems = d.items || [];
|
||||||
|
}
|
||||||
|
|
||||||
|
function topOffersByTld(tld){
|
||||||
|
const offers = priceItems
|
||||||
|
.filter(x => x.tld === tld && x.register_price !== null && x.renew_price !== null)
|
||||||
|
.map(x => ({
|
||||||
|
registrar: x.registrar,
|
||||||
|
register: Number(x.register_price),
|
||||||
|
renew: Number(x.renew_price),
|
||||||
|
twoYear: Number(x.register_price) + Number(x.renew_price)
|
||||||
|
}))
|
||||||
|
.filter(x => !Number.isNaN(x.register) && !Number.isNaN(x.renew))
|
||||||
|
.sort((a,b) => a.twoYear - b.twoYear);
|
||||||
|
return offers.slice(0,3);
|
||||||
|
}
|
||||||
|
|
||||||
async function loadDomains(){
|
async function loadDomains(){
|
||||||
const q = document.getElementById('q').value.trim();
|
const q = document.getElementById('q').value.trim();
|
||||||
const tld = document.getElementById('tld').value;
|
const tld = document.getElementById('tld').value;
|
||||||
@ -91,16 +125,26 @@ function renderRows(){
|
|||||||
for(const d of domains.slice(0,300)){
|
for(const d of domains.slice(0,300)){
|
||||||
const tr = document.createElement('tr');
|
const tr = document.createElement('tr');
|
||||||
const checkUrl = domainCheckUrl(d.domain);
|
const checkUrl = domainCheckUrl(d.domain);
|
||||||
|
const offers = topOffersByTld(d.tld);
|
||||||
|
const offersHtml = offers.length
|
||||||
|
? offers.map(o => {
|
||||||
|
const link = registrarDomainUrl(o.registrar, d.domain);
|
||||||
|
return `<div><a href='${link}' target='_blank'>${o.registrar}</a>: reg ${money(o.register)} / odn ${money(o.renew)} <span class='muted'>(2l: ${money(o.twoYear)})</span></div>`;
|
||||||
|
}).join('')
|
||||||
|
: `<span class='muted'>Brak danych cenowych dla .${d.tld}</span>`;
|
||||||
|
|
||||||
tr.innerHTML = `<td><a href='${checkUrl}' target='_blank'><b>${d.domain}</b></a> ${d.is_new ? `<span class='chip'>NEW</span>` : ''}</td>
|
tr.innerHTML = `<td><a href='${checkUrl}' target='_blank'><b>${d.domain}</b></a> ${d.is_new ? `<span class='chip'>NEW</span>` : ''}</td>
|
||||||
<td>.${d.tld}</td>
|
<td>.${d.tld}</td>
|
||||||
<td>${d.score}</td>
|
<td>${d.score}</td>
|
||||||
<td>${d.status || 'available'}</td>`;
|
<td>${d.status || 'available'}</td>
|
||||||
|
<td>${offersHtml}</td>`;
|
||||||
rows.appendChild(tr);
|
rows.appendChild(tr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function refreshAll(){
|
async function refreshAll(){
|
||||||
await loadDomains();
|
await loadDomains();
|
||||||
|
await loadPrices();
|
||||||
renderRows();
|
renderRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,6 +157,7 @@ function setupAutoRefresh(){
|
|||||||
if(enabled){
|
if(enabled){
|
||||||
autoTimer = setInterval(async()=>{
|
autoTimer = setInterval(async()=>{
|
||||||
await loadDomains();
|
await loadDomains();
|
||||||
|
await loadPrices();
|
||||||
renderRows();
|
renderRows();
|
||||||
}, 60000);
|
}, 60000);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user