importTodoItemfrom'@/components/TodoItem'import{useState,useRef,useEffect}from'react'importReactfrom"react";exportdefaultfunctionHome(){let[todos,setTodos]=useState([]);letinputText=useRef(null);const[newTodo,setNewTodo]=useState("");//useEffect körs om man laddar om sidan och i detta fall så kör useEffect funktionen update.useEffect(()=>{update();},[]);// update häntar alla todos från databasen och lägger dem i en array.constupdate=()=>{fetch(`http://localhost:1337/todos`).then(res=>res.json()).then(allTodo=>{setTodos(allTodo);}).catch((e)=>{console.error(`An error occurred: ${e}`)alert("Ett fel uppstod!")});}// addObject körs när man klickar på enter eller ok knappen och den tar det man skrev och skapar en ny todo sedan kör den update för att man ska knna se den man nyss skapade.constaddObject=()=>{if(newTodo==""){alert("Du skrev inget!")}else{letbody={item: newTodo};fetch(`http://localhost:1337/todos`,{method: "POST",headers: {'Content-type': 'application/json'},body: JSON.stringify(body)}).then(()=>{resetInput()update();}).catch((e)=>{console.error(`An error occurred: ${e}`)alert("Ett fel uppstod!")});}}// removeObject körs när man klicka på ta bort knappen för var var och en todo. det påverkar bara den som man klickade på.constremoveObject=(_item)=>{letpos=_item.id;fetch(`http://localhost:1337/todos/${pos}`,{method: "DELETE"}).then(()=>{update();}).catch((e)=>{console.error(`An error occurred: ${e}`)alert("Ett fel uppstod!")});}// resetInput körs när man klickar på ränsa knappen eller är man skapa en ny todo och den ränsar input fältet.constresetInput=()=>{setNewTodo("")}// RemoveAllObjects körs när man klickar på ta bort alla knappen och det kör en for loop på arrayn och säger till removeObject att ta bort alla.constremoveAllObjects=()=>{for(leti=0;i<todos.length;i++){letpos=todos[i].id;removeObject(todos[i]);}}return(<><main><divclassName="h-100 w-full flex items-center justify-center bg-teal-lightest font-sans"><divclassName="bg-white rounded shadow p-6 m-4 w-full lg:w-3/4 lg:max-w-3xl"><divclassName="mb-4"><h1className="text-grey-darkest">To do List</h1><divclassName="flex mt-4"><inputonKeyDown={(e)=>{if(e.key==="Enter"){addObject();}}}type="text"onChange={(e)=>setNewTodo(e.target.value)}value={newTodo}id='text_input'ref={inputText}className="shadow appearance-none border rounded w-full py-2 px-3 mr-2 text-grey-darker"placeholder="Att göra"/><buttonid='ok_button'onClick={addObject}className="flex-none p-2 ml-2 mr-2 border-2 rounded text-teal-600 border-teal-600 hover:text-white hover:bg-teal-600">OK</button><buttonid='empty_button'onClick={resetInput}className="flex-none p-2 ml-2 border-2 rounded text-teal-600 border-teal-600 hover:text-white hover:bg-teal-600">ränsa</button></div></div><divid='things'className='max-h-192 overflow-auto'><ulid='list'>{todos.map((todo)=>{return<TodoItemtodo={todo}removeObject={removeObject}/>})}</ul><div><buttonid='remove_all_button'onClick={removeAllObjects}className='flex p-3 mt-5 mr-auto ml-auto border-2 rounded text-red-600 border-red-600 hover:text-white hover:bg-red-600'>Ta Bort Alla</button></div></div></div></div></main></>)}
Todoitem.js
import{useState,useRef,useEffect}from"react"exportdefaultfunctionTodoItem(props){const[isChecked,setChecked]=useState(false);letlistItem=useRef(null);constid=props.todo.id;useEffect(()=>{update();},[]);constupdate=()=>{setChecked(props.todo.Checked);}// toggleClass körs när man klickar på en todo och den ändrar hur en todo ser ut.consttoggleClass=()=>{fetch(`http://localhost:1337/todos/${id}`,{method: `PUT`,body: JSON.stringify({Checked: !isChecked}),headers: {'Content-type': 'application/json; charset=UTF-8',},}).then(res=>res.json()).then(allTodo=>{setChecked(allTodo.Checked);console.log(allTodo);}).catch((e)=>{console.error(`An error occurred: ${e}`)alert("Ett fel uppstod!")});};// removeTodo körs när man klicka på ta bort knappen på var todo och den kör removeObject i index.jsconstremoveTodo=(e)=>{e.stopPropagation();props.removeObject(props.todo);}return(<likey={id}ref={listItem}onClick={toggleClass}className={`cursor-pointer relative my-2 py-4 pr-2 pl-10 list-none text-base ${isChecked ? "bg-gray-400 odd:bg-gray-500 hover:bg-gray-300 odd:text-gray-400 text-gray-500 line-through before:absolute odd:before:border-gray-400 before:border-gray-500 before:border-solid before:border-r-2 before:border-b-2 before:top-4.5 before:left-4 before:origin-center before:rotate-45 before:h-4 before:w-2" : "bg-gray-100 odd:bg-gray-200 hover:bg-gray-300"}`}>{props.todo.item}<buttononClick={removeTodo}className={`absolute top-1 bottom-1 h-auto right-1 py-3 px-4 hover:text-white close flex-none p-2 ml-2 border-2 rounded text-center align-middle ${isChecked ? "hover:bg-red-500 text-red-500 border-red-500" : "hover:bg-red-600 text-red-600 border-red-600"}`}>Ta Bort</button></li>)}