]> git.cworth.org Git - zombocom-ai/blobdiff - index.html
Tell server a name at first connection
[zombocom-ai] / index.html
index f5eaea05170672ac01fc4f018f014223c6c2a8f7..243e1da301e56737691f23f760d5eca84056129b 100644 (file)
       all. The only limit is yourself!
     </p>
 
+    <dialog id="name-dialog">
+      <form method="dialog">
+        <p>
+          <label>Your name:
+            <input id="name" type="text" autocomplete="off">
+          </label>
+        </p>
+        <div>
+          <button value="default">OK</button>
+        </div>
+      </form>
+    </dialog>
+
     <p>
       <div id="spinner" align="center">
         <div class="animate-flicker">
@@ -51,7 +64,7 @@
             <label for="code">
               Numeric code:
             </label>
-            <input id="code" type="text" autocomplete="off" placeholder="(Leave blank for random)" />
+            <input id="code" type="number" min="0" max="4294967295" autocomplete="off" placeholder="(Leave blank for random)" />
           </div>
         </div>
 
     <div id="images">
     </div>
 
-    <ul id="comments">
-    </ul>
-
-    <p>
-      <form action="" id="comment-form">
-        <input id="comment" type="text" style="width:100%" autocomplete="off" placeholder="Add a comment" />
-      </form>
-    </p>
-
     <audio loop="" src="/zombo_words.mp3" type="audio/mpeg"></audio>
-    <button id="mute" class="fade volume">
+    <button id="mute" class="menu-button fade volume">
       <div>🔊</div>
       <script>
 const mute = document.querySelector("#mute");
@@ -96,50 +100,133 @@ mute.addEventListener("click", () => {
 
     </button>
 
+    <button id="profile" class="menu-button">
+      <div>👤</div>
+    </button>
+
   </div>
 
   <script src="/socket.io/socket.io.js"></script>
   <script>
     var socket = io();
 
+    const name_input = document.querySelector("#name");
+    const name_dialog = document.querySelector("#name-dialog");
+    var informed_name;
     const images = document.querySelector("#images");
-
-    const comments = document.querySelector("#comments");
-    const comment_form = document.querySelector("#comment-form");
-    const comment = document.querySelector("#comment");
-
     const zombo_form = document.querySelector("#zombo-form");
     const prompt = document.querySelector("#prompt");
     const code = document.querySelector("#code");
-
     const safety= document.querySelector("#safety");
-
     const spinner = document.querySelector("#spinner");
+    const profile = document.querySelector("#profile");
     var spinner_timeout;
 
-    comment_form.addEventListener('submit', function(e) {
-        e.preventDefault();
-        if (comment.value) {
-            socket.emit('comment', comment.value);
-            comment.value = '';
-        }
+    profile.addEventListener('click', () => {
+        name_dialog.showModal();
     });
 
-    socket.on('comment', function(msg) {
-        var item = document.createElement('li');
-        item.textContent = msg;
-        comments.appendChild(item);
+    name_dialog.addEventListener('close', () => {
+        socket.emit('set-name', name_input.value);
+    });
+
+    socket.on('comment', function(comment) {
+        const comments = document.querySelector("#" + comment.comments_id);
+        const dt = document.createElement('dt');
+        const dd = document.createElement('dd');
+        dt.textContent = comment.name + ':';
+        dd.textContent = comment.text;
+        comments.appendChild(dt);
+        comments.appendChild(dd);
+    });
+
+    socket.on('inform-name', (name) => {
+        console.log("Received inform-name event: " + name);
+
+        /* When we receive a name we store it in 3 places:
+         *
+         *   * The informed_name variable (confirming what the server knows)
+         *   * The name_input field (so the user will see that in their profile)
+         *   * In localStorage (for use in a future session)
+         */
+        informed_name = name;
+        name_input.value = name;
+        localStorage.setItem('name', name);
+    });
+
+    socket.on('reset', () => {
+        images.replaceChildren();
+
+        /* Since the server is seeing us for the first time, let it
+           know our name (if we have one). */
+        const name = localStorage.getItem('name');
+        if (name) {
+            socket.emit('set-name', name);
+            return;
+        }
     });
 
     socket.on('image', (image) => {
         const figure = document.createElement('figure');
+
         const img = document.createElement('img');
         img.src = image.filename;
+        figure.appendChild(img);
+
         const figcaption = document.createElement('figcaption');
-        const caption_text = document.createTextNode(`${image.prompt} (${image.code})`);
+        const caption_text = document.createTextNode(`${image.prompt} (${image.code}) `);
         figcaption.appendChild(caption_text);
-        figure.appendChild(img);
+
+        const reuse_button = document.createElement('button');
+        reuse_button.appendChild(document.createTextNode("Reuse"));
+        figcaption.appendChild(reuse_button);
+
+        reuse_button.addEventListener('click', () => {
+            prompt.value = image.prompt;
+            window.scrollTo(0,0);
+        });
+
         figure.appendChild(figcaption);
+
+        const dl_comments = document.createElement('dl');
+        const comments_id = "comments_" + image.index;
+        dl_comments.className = "comments";
+        dl_comments.id = comments_id;
+        figure.appendChild(dl_comments);
+
+        const comment_form = document.createElement('form');
+        const comment_input = document.createElement('input')
+        comment_input.type = "text";
+        comment_input.className = "comment";
+        comment_input.placeholder = "Add a comment";
+        comment_form.appendChild(comment_input);
+        figure.appendChild(comment_form);
+
+        comment_input.addEventListener('focus', () => {
+            /* If the server has informed us it has our name, we are done. */
+            if (informed_name)
+                return;
+
+            /* If server has no name, check local storage. */
+            const name = localStorage.getItem('name');
+            if (name) {
+                socket.emit('set-name', name);
+                return;
+            }
+
+            /* Failing both, bring up the modal dialog to set the name. */
+            name_dialog.showModal();
+        });
+
+        comment_form.addEventListener('submit', function(e) {
+            e.preventDefault();
+            if (comment_input.value) {
+                socket.emit('comment', {comments_id: comments_id,
+                                        text: comment_input.value});
+                comment_input.value = '';
+            }
+        });
+
         images.prepend(figure);
     });
 
@@ -178,6 +265,8 @@ mute.addEventListener("click", () => {
             "An image of",
             "A pencil sketch of",
             "A watercolor of",
+            "A 3D rendering of",
+            "A marble statue of",
         ];
         const subject = [
             " a modern home",
@@ -190,6 +279,7 @@ mute.addEventListener("click", () => {
             " sci-fi buildings",
             " pastel purple clouds",
             " a Teenage Mutant Ninja Turtle",
+            " Pikachu",
         ];
         const scenery = [
             " in tropical surroundings",
@@ -208,6 +298,7 @@ mute.addEventListener("click", () => {
             " on the streets of London at night with neon lights flashing",
             " that is part octopus",
             " melting into a puddle",
+            " on a birthday cake",
         ];
         const artist = [
             ", unreal engine 5",
@@ -219,6 +310,8 @@ mute.addEventListener("click", () => {
             ", fantasy art, neon fog",
             ", epic lighting from above",
             ", trending on artstation",
+            " by Gustav Klimt",
+            " by Leonardo da Vinci",
         ];
 
         prompt.value = random_from(art_type) + random_from(subject) +