pajenerator/index.js

133 lines
2.5 KiB
JavaScript

/*
* index.js - Pajenerator client code
*/
// State
var generating = false;
var names = [];
var flashcount = 0;
var flashinterval;
// Needed elements
let root;
let btn;
let out;
const search_front = "https://www.linkedin.com/pub/dir?firstName=";
const search_back = "&lastName=&trk=people-guest_people-search-bar_search-submit";
function onready()
{
root = document.querySelector("html")
btn = document.querySelector("#btn");
out = document.querySelector("#name-box");
}
// Returns the names from the API - as many as are configured.
function get_names(onget)
{
const error_response = Array(15).fill(["Errar", "Prablem"]).flat();
const uri = "/api";
let req = new XMLHttpRequest();
req.onreadystatechange = function() {
if (this.readyState == 4) {
if (this.status != 200) {
onget(error_response);
return;
}
try {
let arr = JSON.parse(this.responseText)
onget(arr);
} catch {
console.log("bad json: "+this.responseText)
onget(error_response);
}
}
}
req.open("GET", uri, true);
req.send();
}
/*
* 0.2x + 0.2e^(x-27)
* where:
* x - nth iteration
* returns - time in seconds
*/
function timeout(i)
{
return (0.2*i) + (0.2*Math.exp(i - 27));
}
function cleanup_generate()
{
// Reset button text (partially)
btn.textContent = "Do the needful";
btn.disabled = true;
// Reset cursor
root.classList.remove("loading");
btn.classList.remove("loading");
out.classList.remove("loading");
// People with this name
document.querySelector("#search").classList.remove("hidden");
document.querySelector("#search").href = search_front + out.value + search_back;
flashinterval = setInterval(() => {
out.classList.toggle("highlight");
if (flashcount++ >= 6) {
flashcount = 0;
generating = false;
names = [];
clearInterval(flashinterval);
out.classList.remove("highlight");
btn.disabled = false;
}
}, 500)
}
function run_generate()
{
for (let i = 0; i < names.length; i++) {
setTimeout(() => {
out.value = names[i];
if (i == names.length - 1) {
cleanup_generate();
}
}, 1000*timeout(i));
}
}
function pull_names(arr)
{
names = names.concat(arr);
if (names.length >= 30) {
run_generate();
} else {
get_names(pull_names)
}
}
function generate()
{
if (generating)
return;
generating = true;
// Button text
btn.textContent = "Ok sar...!";
// Cursors
root.classList.add("loading");
btn.classList.add("loading");
out.classList.add("loading");
// People with this name
document.querySelector("#search").classList.add("hidden");
get_names(pull_names);
}