From abb0099bc63f4a395a7fd571d09d9059c28c7846 Mon Sep 17 00:00:00 2001 From: William Hsu Date: Wed, 23 Sep 2020 12:03:27 -0700 Subject: [PATCH 1/3] Add paste event to inputs --- apps/js/Question.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/js/Question.js b/apps/js/Question.js index 89a5958..826ef4a 100644 --- a/apps/js/Question.js +++ b/apps/js/Question.js @@ -108,7 +108,13 @@ export default function Question({ } else if (question.type === "short_answer") { contents = ( - { setValue(e.target.value); }} /> + { + setValue(e.target.value); + }} + onPaste={submit} + /> ); } else if (question.type === "short_code_answer") { @@ -120,6 +126,7 @@ export default function Question({ onChange={(e) => { setValue(e.target.value); }} + onPaste={submit} /> ); @@ -133,6 +140,7 @@ export default function Question({ onChange={(e) => { setValue(e.target.value); }} + onPaste={submit} /> ); @@ -158,6 +166,7 @@ export default function Question({ onChange={(e) => { setValue(e.target.value); }} + onPaste={submit} /> ); From 87e2319951696aa8a0ade858cadec55d8194ec11 Mon Sep 17 00:00:00 2001 From: William Hsu Date: Wed, 23 Sep 2020 13:50:47 -0700 Subject: [PATCH 2/3] Add handlePaste --- apps/js/Question.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/apps/js/Question.js b/apps/js/Question.js index 826ef4a..f559bcd 100644 --- a/apps/js/Question.js +++ b/apps/js/Question.js @@ -62,6 +62,18 @@ export default function Question({ } }, [moveCursor.current]); + const handlePaste = (e) => { + e.preventDefault(); + const { target } = e; + const start = target.selectionStart; + const end = target.selectionEnd; + const paste = e.clipboardData.getData('text'); + const newValue = `${value.substring(0, start)}${e.clipboardData.getData('text')}${value.substring(end)}`; + setValue(newValue); + submitValue(newValue, savedValue); + moveCursor.current = { target, pos: start + paste.length }; + } + let contents; if (question.type === "multiple_choice") { contents = ( @@ -113,7 +125,7 @@ export default function Question({ onChange={(e) => { setValue(e.target.value); }} - onPaste={submit} + onPaste={handlePaste} /> ); @@ -126,7 +138,7 @@ export default function Question({ onChange={(e) => { setValue(e.target.value); }} - onPaste={submit} + onPaste={handlePaste} /> ); @@ -140,7 +152,7 @@ export default function Question({ onChange={(e) => { setValue(e.target.value); }} - onPaste={submit} + onPaste={handlePaste} /> ); @@ -166,7 +178,7 @@ export default function Question({ onChange={(e) => { setValue(e.target.value); }} - onPaste={submit} + onPaste={handlePaste} /> ); From 4e1208a55435f79e539e5f4160d4ba29fc790b87 Mon Sep 17 00:00:00 2001 From: William Hsu Date: Wed, 23 Sep 2020 14:00:44 -0700 Subject: [PATCH 3/3] Move submitValue up --- apps/js/Question.js | 76 ++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/apps/js/Question.js b/apps/js/Question.js index f559bcd..3d01807 100644 --- a/apps/js/Question.js +++ b/apps/js/Question.js @@ -62,6 +62,44 @@ export default function Question({ } }, [moveCursor.current]); + const submitValue = async (val, savedVal) => { + if (val === savedVal || saving) { + return; + } + setSaving(true); + try { + const ret = await post("submit_question", { + id: question.id, + value: val, + token: getToken(), + exam: examContext.exam, + }); + setSaving(false); + if (!ret.ok) { + setFailText("Server failed to respond, please try again."); + examContext.onInternetError(); + return; + } + try { + const data = await ret.json(); + if (!data.success) { + setFailText("Server responded but failed to save, please refresh and try again."); + examContext.onInternetError(); + } else { + setSavedValue(val); + setFailText(""); + } + } catch { + setFailText("Server returned invalid JSON. Please try again."); + examContext.onInternetError(); + } + } catch { + setSaving(false); + setFailText("Unable to reach server, your network may have issues."); + examContext.onInternetError(); + } + }; + const handlePaste = (e) => { e.preventDefault(); const { target } = e; @@ -184,44 +222,6 @@ export default function Question({ ); } - const submitValue = async (val, savedVal) => { - if (val === savedVal || saving) { - return; - } - setSaving(true); - try { - const ret = await post("submit_question", { - id: question.id, - value: val, - token: getToken(), - exam: examContext.exam, - }); - setSaving(false); - if (!ret.ok) { - setFailText("Server failed to respond, please try again."); - examContext.onInternetError(); - return; - } - try { - const data = await ret.json(); - if (!data.success) { - setFailText("Server responded but failed to save, please refresh and try again."); - examContext.onInternetError(); - } else { - setSavedValue(val); - setFailText(""); - } - } catch { - setFailText("Server returned invalid JSON. Please try again."); - examContext.onInternetError(); - } - } catch { - setSaving(false); - setFailText("Unable to reach server, your network may have issues."); - examContext.onInternetError(); - } - }; - const submit = () => submitValue(value, savedValue); const debouncedSubmit = useCallback(debounce(submitValue, 3000), []);