| 172 | } |
| 173 | |
| 174 | function Todos({ |
| 175 | initialFilter = '', |
| 176 | setEditingIndex, |
| 177 | }: { |
| 178 | initialFilter: string |
| 179 | setEditingIndex: React.Dispatch<React.SetStateAction<number | null>> |
| 180 | }) { |
| 181 | const [filter, setFilter] = React.useState(initialFilter) |
| 182 | |
| 183 | const { status, data, isFetching, error, failureCount, refetch } = useQuery({ |
| 184 | queryKey: ['todos', { filter }], |
| 185 | queryFn: fetchTodos, |
| 186 | }) |
| 187 | |
| 188 | return ( |
| 189 | <div> |
| 190 | <div> |
| 191 | <label> |
| 192 | Filter:{' '} |
| 193 | <input value={filter} onChange={(e) => setFilter(e.target.value)} /> |
| 194 | </label> |
| 195 | </div> |
| 196 | {status === 'pending' ? ( |
| 197 | <span>Loading... (Attempt: {failureCount + 1})</span> |
| 198 | ) : status === 'error' ? ( |
| 199 | <span> |
| 200 | Error: {error.message} |
| 201 | <br /> |
| 202 | <button onClick={() => refetch()}>Retry</button> |
| 203 | </span> |
| 204 | ) : ( |
| 205 | <> |
| 206 | <ul> |
| 207 | {data |
| 208 | ? data.map((todo) => ( |
| 209 | <li key={todo.id}> |
| 210 | {todo.name}{' '} |
| 211 | <button onClick={() => setEditingIndex(todo.id)}> |
| 212 | Edit |
| 213 | </button> |
| 214 | </li> |
| 215 | )) |
| 216 | : null} |
| 217 | </ul> |
| 218 | <div> |
| 219 | {isFetching ? ( |
| 220 | <span> |
| 221 | Background Refreshing... (Attempt: {failureCount + 1}) |
| 222 | </span> |
| 223 | ) : ( |
| 224 | <span> </span> |
| 225 | )} |
| 226 | </div> |
| 227 | </> |
| 228 | )} |
| 229 | </div> |
| 230 | ) |
| 231 | } |