Add clean support for rejecting categories that are too large
authorCarl Worth <cworth@cworth.org>
Fri, 12 Jun 2020 00:08:02 +0000 (17:08 -0700)
committerCarl Worth <cworth@cworth.org>
Fri, 12 Jun 2020 00:08:02 +0000 (17:08 -0700)
This is clean in the sense that it prints a message if the server
rejects the submission, but before that it will even do the nice thing
of checking the number on the client side, (and reporting this with
the HTML5 validity API).

empathy/empathy.jsx

index fcfea4d4c0f72edbb3316d54ecdcfc78e79c2dba..3d7034527c0c8bd49dc8fea14dcf14af96b5520e 100644 (file)
@@ -1,3 +1,5 @@
+const MAX_PROMPT_ITEMS = 20;
+
 function undisplay(element) {
   element.style.display="none";
 }
@@ -185,11 +187,15 @@ class CategoryRequest extends React.PureComponent {
     const category_input = this.category.current;
     const category = category_input.value;
 
-    if (/[0-9]/.test(category))
-      category_input.setCustomValidity("");
+    const match = category.match(/[0-9]+/);
+    if (match) {
+      const num_items = parseInt(match[0], 10);
+      if (num_items <= MAX_PROMPT_ITEMS)
+        category_input.setCustomValidity("");
+    }
   }
 
-  handle_submit(event) {
+  async handle_submit(event) {
     const form = event.currentTarget;
     const category_input = this.category.current;
     const category = category_input.value;
@@ -204,11 +210,30 @@ class CategoryRequest extends React.PureComponent {
       return;
     }
 
-    fetch_post_json("prompts", {
-      items: parseInt(match[0], 10),
+    const num_items = parseInt(match[0], 10);
+
+    if (num_items > MAX_PROMPT_ITEMS) {
+      category_input.setCustomValidity(`Maximum number of items is ${MAX_PROMPT_ITEMS}`);
+      form.reportValidity();
+      return;
+    }
+
+    const response = await fetch_post_json("prompts", {
+      items: num_items,
       prompt: category
     });
 
+    if (response.status === 200) {
+      const result = await response.json();
+      console.log(result);
+      if (! result.valid) {
+        add_message("danger", result.message);
+        return;
+      }
+    } else {
+      add_message("danger", "An error occurred submitting your category");
+    }
+
     form.reset();
   }