Hanaz Writers

AI Book Cover Creator

Maximum 300 characters are accepted for the back cover summary.
0 / 300 characters
Romantic Drama Comedy Educational Historical
(function(){ const API = "https://ai.hanazwriters.org/cover-creator"; /* ========================================= GET ELEMENTS ========================================= */ const synopsisInput = document.getElementById("synopsisInput"); const characterCount = document.getElementById("characterCount"); const synopsisInfo = document.getElementById("synopsisInfo"); const generateBtn = document.getElementById("generateBtn"); const loadingMessage = document.getElementById("loadingMessage"); const resultBox = document.getElementById("resultBox"); /* ========================================= CHECK SUMMARY LENGTH ========================================= */ function checkSynopsisLength(){ const length = synopsisInput.value.length; /* ========================================= DISPLAY CHARACTER COUNT ========================================= */ characterCount.innerText = length + " / 300 characters"; /* ========================================= TOO LONG ========================================= */ if(length > 300){ characterCount.style.color = "red"; synopsisInfo.innerText = "Your back cover summary is too long. Maximum 300 characters are allowed."; synopsisInfo.style.color = "red"; generateBtn.disabled = true; generateBtn.style.opacity = "0.5"; generateBtn.style.cursor = "not-allowed"; return false; } /* ========================================= VALID LENGTH ========================================= */ characterCount.style.color = "#777"; synopsisInfo.innerText = "Maximum 300 characters are accepted for the back cover summary."; synopsisInfo.style.color = "#555"; generateBtn.disabled = false; generateBtn.style.opacity = "1"; generateBtn.style.cursor = "pointer"; return true; } /* ========================================= CHECK WHILE TYPING / PASTING ========================================= */ synopsisInput.addEventListener( "input", function(){ checkSynopsisLength(); } ); /* ========================================= GENERATE BUTTON ========================================= */ generateBtn.addEventListener( "click", generateCover ); /* ========================================= GENERATE COVER ========================================= */ async function generateCover(){ const title = document.getElementById("titleInput").value.trim(); const author = document.getElementById("authorInput").value.trim(); const synopsis = synopsisInput.value.trim(); const genre = document.getElementById("genreInput").value; /* ========================================= CHECK SUMMARY BEFORE ANY API REQUEST ========================================= */ if(synopsis.length > 300){ resultBox.innerHTML = `

Your back cover summary is too long.

You entered ${synopsis.length} characters. The maximum allowed is 300 characters. Please shorten your summary before generating the cover.

`; checkSynopsisLength(); return; } /* ========================================= TITLE VALIDATION ========================================= */ if(!title){ resultBox.innerHTML = "

Please enter your book title.

"; return; } /* ========================================= AUTHOR VALIDATION ========================================= */ if(!author){ resultBox.innerHTML = "

Please enter the author name.

"; return; } /* ========================================= SUMMARY VALIDATION ========================================= */ if(!synopsis){ resultBox.innerHTML = "

Please enter your back cover summary.

"; return; } /* ========================================= FINAL LENGTH CHECK ========================================= */ if(!checkSynopsisLength()){ return; } /* ========================================= CLEAR OLD RESULT ========================================= */ resultBox.innerHTML = ""; /* ========================================= SHOW LOADING ========================================= */ loadingMessage.style.display = "block"; generateBtn.disabled = true; generateBtn.style.opacity = "0.5"; /* ========================================= SEND REQUEST ========================================= */ try{ const res = await fetch(API,{ method:"POST", headers:{ "Content-Type":"application/json" }, body:JSON.stringify({ title:title, author:author, synopsis:synopsis, genre:genre }) }); /* ========================================= GET SERVER RESPONSE ========================================= */ const data = await res.json(); /* ========================================= SERVER ERROR ========================================= */ if(!res.ok){ throw new Error( data.error || "Something went wrong. Please try again." ); } /* ========================================= CHECK COVER DATA ========================================= */ if(!data.frontCover){ throw new Error( "Front cover was not generated." ); } if(!data.backCover){ throw new Error( "Back cover was not generated." ); } /* ========================================= DISPLAY COVERS ========================================= */ resultBox.innerHTML = ` `; }catch(err){ console.error(err); resultBox.innerHTML = `

${err.message}

`; } /* ========================================= FINISH LOADING ========================================= */ loadingMessage.style.display = "none"; generateBtn.disabled = false; generateBtn.style.opacity = "1"; generateBtn.style.cursor = "pointer"; /* ========================================= RECHECK SUMMARY ========================================= */ checkSynopsisLength(); } })();