Add sections
This commit is contained in:
parent
3fa4714ba0
commit
6ed71eb8f8
@ -4,7 +4,7 @@ import { AddTodoForm } from "@src/components/todos/collapsed/addTodoForm";
|
|||||||
import { CollapsedState } from "@src/components/todos/collapsed/collapsedState";
|
import { CollapsedState } from "@src/components/todos/collapsed/collapsedState";
|
||||||
import { useCreateTodo } from "@src/presentation/hooks/socketHooks";
|
import { useCreateTodo } from "@src/presentation/hooks/socketHooks";
|
||||||
|
|
||||||
export function AddTodo(props: {}) {
|
export function AddTodo(props: { project: string }) {
|
||||||
const { createTodo } = useCreateTodo();
|
const { createTodo } = useCreateTodo();
|
||||||
|
|
||||||
const [collapsed, setCollapsed] = useState<CollapsedState>(
|
const [collapsed, setCollapsed] = useState<CollapsedState>(
|
||||||
@ -21,6 +21,7 @@ export function AddTodo(props: {}) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<AddTodoForm
|
<AddTodoForm
|
||||||
|
project={props.project}
|
||||||
onAdd={(todoName, project) => {
|
onAdd={(todoName, project) => {
|
||||||
createTodo(todoName, project);
|
createTodo(todoName, project);
|
||||||
}}
|
}}
|
||||||
|
@ -3,9 +3,10 @@ import { FC, useState } from "react";
|
|||||||
export const AddTodoForm: FC<{
|
export const AddTodoForm: FC<{
|
||||||
onAdd: (todoName: string, project: string) => void;
|
onAdd: (todoName: string, project: string) => void;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
}> = ({ onAdd, onClose }) => {
|
project: string;
|
||||||
|
}> = ({ onAdd, onClose, ...props }) => {
|
||||||
const [todoName, setTodoName] = useState("");
|
const [todoName, setTodoName] = useState("");
|
||||||
const [project, setProject] = useState("");
|
const [project, setProject] = useState(props.project);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form
|
<form
|
||||||
|
@ -3,7 +3,11 @@ import { TodoItem } from "@src/components/todos/todoItem";
|
|||||||
import { AddTodo } from "@src/components/todos/addTodo";
|
import { AddTodo } from "@src/components/todos/addTodo";
|
||||||
import { useUpdateTodoState } from "@src/presentation/hooks/socketHooks";
|
import { useUpdateTodoState } from "@src/presentation/hooks/socketHooks";
|
||||||
|
|
||||||
export const TodoList = (props: { todos: Todo[]; hideDone: boolean }) => {
|
export const TodoList = (props: {
|
||||||
|
todos: Todo[];
|
||||||
|
hideDone: boolean;
|
||||||
|
project: string;
|
||||||
|
}) => {
|
||||||
const { updateTodoState } = useUpdateTodoState();
|
const { updateTodoState } = useUpdateTodoState();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -23,7 +27,7 @@ export const TodoList = (props: { todos: Todo[]; hideDone: boolean }) => {
|
|||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
<AddTodo />
|
<AddTodo project={props.project} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -1,15 +1,59 @@
|
|||||||
import { PageHeading } from "@src/components/common/headings/pageHeading";
|
import { PageHeading } from "@src/components/common/headings/pageHeading";
|
||||||
import { TodoList } from "@src/components/todos";
|
import { TodoList } from "@src/components/todos";
|
||||||
import { useSelectInboxTodos } from "@src/presentation/hooks/socketHooks";
|
import { useSelectInboxTodos } from "@src/presentation/hooks/socketHooks";
|
||||||
|
import { ProjectsHeading } from "@src/components/common/headings/projectsHeading";
|
||||||
|
import { AddTodo } from "@src/components/todos/addTodo";
|
||||||
|
|
||||||
|
const groupByProjects = (arr) => {
|
||||||
|
if (!arr) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
const criteria = "project";
|
||||||
|
|
||||||
|
return arr.reduce(function (acc, currentValue) {
|
||||||
|
const currentValueElement = currentValue[criteria] || "inbox";
|
||||||
|
|
||||||
|
if (!acc[currentValueElement]) {
|
||||||
|
acc[currentValueElement] = [];
|
||||||
|
}
|
||||||
|
acc[currentValueElement].push(currentValue);
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
};
|
||||||
|
|
||||||
const HomePage = () => {
|
const HomePage = () => {
|
||||||
const { todos, loading } = useSelectInboxTodos();
|
const { todos, loading } = useSelectInboxTodos();
|
||||||
|
const groupedTodos = groupByProjects(todos);
|
||||||
|
const sections = Object.keys(groupedTodos)
|
||||||
|
.filter((s) => s !== "inbox")
|
||||||
|
.sort();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className="py-8 px-14 space-y-6">
|
<main className="py-8 px-14 space-y-6">
|
||||||
<section className="space-y-2 mx-auto max-w-4xl">
|
<section className="space-y-8 mx-auto max-w-4xl">
|
||||||
|
{groupedTodos["inbox"] && (
|
||||||
|
<div className="space-y-2">
|
||||||
<PageHeading title="Inbox" />
|
<PageHeading title="Inbox" />
|
||||||
<TodoList todos={loading ? [] : todos} hideDone />
|
<TodoList todos={groupedTodos["inbox"]} hideDone project={""} />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{sections &&
|
||||||
|
sections.map((section) => (
|
||||||
|
<div key={section} className="space-y-2">
|
||||||
|
<ProjectsHeading title={section} />
|
||||||
|
<TodoList
|
||||||
|
todos={groupedTodos[section]}
|
||||||
|
hideDone
|
||||||
|
project={section}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
{!loading && todos && todos.length === 0 && (
|
||||||
|
<div className="space-y-4">
|
||||||
|
<PageHeading title="You're done!" />
|
||||||
|
<AddTodo project={""} />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user