import React from "react";
import { useObservable } from "./observableHook";
import { todoService } from "./services";
import { Todo, VisibilityFilter } from "./todoService";
export const TodoList = () => {
const todos = useObservable(todoService.todos);
const filter = useObservable(todoService.visibilityFilter);
const visibleTodos = getVisibleTodos(todos, filter);
return (
{visibleTodos.map((todo, index) => (
))}
Show: All,
Active,
Completed
);
};
const TodoItem = ({ todo: { text, completed }, index }: { todo: Todo; index: number }) => {
return (
todoService.toggleTodo(index)}
>
{text}
);
};
const FilterLink = ({ filter, children }: { filter: VisibilityFilter; children: React.ReactNode }) => {
const activeFilter = useObservable(todoService.visibilityFilter);
const active = filter === activeFilter;
return active ? (
{children}
) : (
todoService.setVisibilityFilter(filter)}>
{children}
);
};
function getVisibleTodos(todos: Todo[], filter: VisibilityFilter): Todo[] {
switch (filter) {
case VisibilityFilter.SHOW_ALL:
return todos;
case VisibilityFilter.SHOW_COMPLETED:
return todos.filter(t => t.completed);
case VisibilityFilter.SHOW_ACTIVE:
return todos.filter(t => !t.completed);
}
}