Output/Llama31_405B/JS/contextual_experiment/update_react/1722508027/TodoApp.tsx (109 lines of code) (raw):

import * as React from 'react'; import { useState, useEffect } from 'react'; import { ALL_TODOS, ACTIVE_TODOS, COMPLETED_TODOS } from './constants'; import TodoModel from './TodoModel'; import TodoItem from './TodoItem'; import TodoFooter from './TodoFooter'; import { useSelector, useDispatch } from 'react-redux'; import { addTodo, toggleAll, clearCompleted } from './TodoModel'; const TodoApp: React.FC = () => { const dispatch = useDispatch(); const todos = useSelector((state: any) => state.todos); const [newTodo, setNewTodo] = useState(''); const [nowShowing, setNowShowing] = useState(ALL_TODOS); const [editing, setEditing] = useState(null); useEffect(() => { const router = (window as any).Router; if (router) { router.init('/'); } }, []); const handleNewTodoKeyDown = (event: React.KeyboardEvent) => { if (event.keyCode !== 13) { return; } event.preventDefault(); const val = newTodo.trim(); if (val) { dispatch(addTodo(val)); setNewTodo(''); } }; const toggleAll = (checked: boolean) => { dispatch(toggleAll(checked)); }; const clearCompleted = () => { dispatch(clearCompleted()); }; const shownTodos = todos.filter((todo: any) => { switch (nowShowing) { case ACTIVE_TODOS: return !todo.completed; case COMPLETED_TODOS: return todo.completed; default: return true; } }); const todoItems = shownTodos.map((todo: any) => { return ( <TodoItem key={todo.id} todo={todo} onToggle={() => dispatch(toggle(todo.id))} onDestroy={() => dispatch(destroy(todo.id))} onEdit={() => setEditing(todo.id)} editing={editing === todo.id} onSave={(title: string) => dispatch(save(todo.id, title))} onCancel={() => setEditing(null)} /> ); }); const activeTodoCount = todos.reduce((accum: number, todo: any) => { return todo.completed ? accum : accum + 1; }, 0); const completedCount = todos.length - activeTodoCount; return ( <div> <header className="header"> <h1>todos</h1> <input className="new-todo" placeholder="What needs to be done?" value={newTodo} onKeyDown={handleNewTodoKeyDown} onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewTodo(event.target.value)} autoFocus={true} /> </header> {todos.length > 0 && ( <section className="main"> <input id="toggle-all" className="toggle-all" type="checkbox" onChange={(event: React.ChangeEvent<HTMLInputElement>) => toggleAll(event.target.checked)} checked={activeTodoCount === 0} /> <label htmlFor="toggle-all" > Mark all as complete </label> <ul className="todo-list"> {todoItems} </ul> </section> )} {(activeTodoCount > 0 || completedCount > 0) && ( <TodoFooter count={activeTodoCount} completedCount={completedCount} nowShowing={nowShowing} onClearCompleted={clearCompleted} /> )} </div> ); }; export default TodoApp;