diff --git a/db.json b/db.json index 73ed95d1a..6d964418b 100644 --- a/db.json +++ b/db.json @@ -3,38 +3,68 @@ { "id": 1, "prompt": "What special prop should always be included for lists of elements?", - "answers": ["id", "name", "key", "prop"], - "correctIndex": 2 + "answers": [ + "id", + "name", + "key", + "prop" + ], + "correctIndex": 3 }, { "id": 2, "prompt": "A React component is a function that returns ______.", - "answers": ["HTML", "JSX", "props", "state"], + "answers": [ + "HTML", + "JSX", + "props", + "state" + ], "correctIndex": 1 }, { "id": 3, "prompt": "Which event handler will run when a user is finished filling out a form?", - "answers": ["onSubmit", "onClick", "onChange", "onForm"], - "correctIndex": 0 + "answers": [ + "onSubmit", + "onClick", + "onChange", + "onForm" + ], + "correctIndex": 2 }, { "id": 4, "prompt": "______ is a tool that transpiles JSX into valid JavaScript.", - "answers": ["React", "Babel", "Webpack", "ES6"], + "answers": [ + "React", + "Babel", + "Webpack", + "ES6" + ], "correctIndex": 1 }, { "id": 5, "prompt": "What syntax makes it possible to unpack values from arrays, or properties from objects, into distinct variables?", - "answers": ["spread", "key-value", "coalescing", "destructuring"], + "answers": [ + "spread", + "key-value", + "coalescing", + "destructuring" + ], "correctIndex": 3 }, { "id": 6, "prompt": "Returning different elements from a component depending on the state of your application is known as _____ rendering.", - "answers": ["voodoo", "conditional", "reactive", "controlled"], + "answers": [ + "voodoo", + "conditional", + "reactive", + "controlled" + ], "correctIndex": 1 } ] -} +} \ No newline at end of file diff --git a/src/components/App.js b/src/components/App.js index 4d33c1320..0849d3fa2 100644 --- a/src/components/App.js +++ b/src/components/App.js @@ -1,15 +1,55 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import AdminNavBar from "./AdminNavBar"; import QuestionForm from "./QuestionForm"; import QuestionList from "./QuestionList"; function App() { const [page, setPage] = useState("List"); + const [questions, setQuestions] = useState([]); + + useEffect(() => { + fetch("http://localhost:4000/questions") + .then((res) => res.json()) + .then((questions) => { + setQuestions(questions); + }); + }, []); + + const addQuestion = (newQuestion) => { + setQuestions([...questions, newQuestion]); + }; + + const deleteQuestion = (deletedQuestion) => { + const updatedQuestions = questions.filter( + (question) => question.id !== deletedQuestion.id + ); + setQuestions(updatedQuestions); + }; + + const updateQuestion = (updatedQuestion) => { + const updatedQuestions = questions.map((question) => + question.id === updatedQuestion.id ? updatedQuestion : question + ); + setQuestions(updatedQuestions); + }; + + let content = page; + if (page === "Form") { + content = ; + } else { + content = ( + + ); + } return (
- {page === "Form" ? : } + {content}
); } diff --git a/src/components/QuestionForm.js b/src/components/QuestionForm.js index f02af04e7..4d4a1cc42 100644 --- a/src/components/QuestionForm.js +++ b/src/components/QuestionForm.js @@ -1,13 +1,13 @@ import React, { useState } from "react"; -function QuestionForm(props) { +function QuestionForm({ addQuestion }) { const [formData, setFormData] = useState({ prompt: "", answer1: "", answer2: "", answer3: "", answer4: "", - correctIndex: 0, + correctIndex: "", }); function handleChange(event) { @@ -19,7 +19,35 @@ function QuestionForm(props) { function handleSubmit(event) { event.preventDefault(); - console.log(formData); + + const newQuestion = { + prompt: formData.prompt, + answers: [ + formData.answer1, + formData.answer2, + formData.answer3, + formData.answer4, + ], + correctIndex: parseInt(formData.correctIndex), + }; + + fetch("http://localhost:4000/questions", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(newQuestion), + }) + .then((res) => res.json()) + .then((newQuestion) => addQuestion(newQuestion)); + setFormData({ + prompt: "", + answer1: "", + answer2: "", + answer3: "", + answer4: "", + correctIndex: "", + }); } return ( diff --git a/src/components/QuestionItem.js b/src/components/QuestionItem.js index ab5e8e820..d6bdd2246 100644 --- a/src/components/QuestionItem.js +++ b/src/components/QuestionItem.js @@ -1,6 +1,6 @@ import React from "react"; -function QuestionItem({ question }) { +function QuestionItem({ question, deleteQuestion, updateQuestion }) { const { id, prompt, answers, correctIndex } = question; const options = answers.map((answer, index) => ( @@ -8,6 +8,29 @@ function QuestionItem({ question }) { {answer} )); + const handleDelete = () => { + fetch(`http://localhost:4000/questions/${id}`, { + method: "DELETE", + }) + .then((res) => res.json()) + .then(() => deleteQuestion(question)); + }; + + const answerChange = (event) => { + const newIndex = parseInt(event.target.value); + + fetch(`http://localhost:4000/questions/${id}`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ correctIndex: newIndex }), + }) + .then((res) => res.json()) + .then((updatedQuestion) => { + updateQuestion(updatedQuestion); + }); + }; return (
  • @@ -15,9 +38,11 @@ function QuestionItem({ question }) {
    Prompt: {prompt}
    - +
  • ); } diff --git a/src/components/QuestionList.js b/src/components/QuestionList.js index 4b3701bb2..c3ac9bffc 100644 --- a/src/components/QuestionList.js +++ b/src/components/QuestionList.js @@ -1,10 +1,20 @@ import React from "react"; +import QuestionItem from "./QuestionItem"; + +function QuestionList({ questions, deleteQuestion, updateQuestion }) { + const questionList = questions.map((question) => ( + + )); -function QuestionList() { return (

    Quiz Questions

    -
      {/* display QuestionItem components here after fetching */}
    +
      {questionList}
    ); }