1
0
Fork 0
mirror of https://github.com/kou029w/_.git synced 2025-01-31 06:18:07 +00:00
_/pages/todo.tsx

79 lines
1.7 KiB
TypeScript
Raw Normal View History

2020-02-09 05:53:07 +09:00
import React, { FormEvent } from "react";
import { MDXContext } from "@mdx-js/react";
type State = {
id: number;
todo: Map<number, string>;
};
type Action =
| {
type: "add";
body: string;
}
| {
type: "delete";
key: number;
};
const initialState: State = {
id: 0,
2020-06-11 20:59:34 +09:00
todo: new Map(),
2020-02-09 05:53:07 +09:00
};
function reducer(state: State, action: Action) {
switch (action.type) {
case "add":
state.todo.set(state.id, action.body);
return { ...state, id: state.id + 1 };
case "delete":
state.todo.delete(action.key);
return { ...state };
}
}
export default () => {
const components = React.useContext(MDXContext);
const [state, dispatch] = React.useReducer(reducer, initialState);
const onSubmit = React.useCallback(
(event: FormEvent) => {
event.preventDefault();
const body =
new FormData(event.currentTarget as HTMLFormElement)
.get("body")
?.toString() || "";
if (body.length === 0) return;
dispatch({
type: "add",
2020-06-11 20:59:34 +09:00
body,
2020-02-09 05:53:07 +09:00
});
},
[dispatch]
);
const H1 = components.h1 || "h1";
const Ul = components.ul || "ul";
const Li = components.li || "li";
return (
<>
<H1>ToDo List</H1>
<form onSubmit={onSubmit}>
<input type="text" key={state.id} name="body" autoFocus />
<input type="submit" name="submit" value="+" />
</form>
<Ul>
{[...state.todo].map(([key, body]) => (
<Li key={key}>
<input
type="checkbox"
name={`${key}-checkbox`}
onChange={() => dispatch({ type: "delete", key })}
/>
{body}
</Li>
))}
</Ul>
</>
);
};