作成日: 2023-10-21T11:37:46.923Z
前回は編集の部分を実装しました。今回でラスト、削除の部分を作成します。
実装量は少ないので頑張りましょう!
deleteTodo:"http://localhost:8080/todo/deleteTodo/",
今回はuseridとitemidを使います。
あとは今までのコードとほとんど変わらず実装できます。
//todo削除
export const deleteTodo=async(userid:string,itemid:string)=>{
const res=await fetch(`${linkName.deleteTodo}${userid}/${itemid}`,{
method:"DELETE",
});
const resData=await res.json();
return resData.data as todoType[];
}
上記名前のフォルダの編集をしていきます。
import { IconButton } from "@mui/material";
import DeleteIcon from '@mui/icons-material/Delete';
import { Dispatch, SetStateAction } from "react";
import { todoType } from "@/shared/type";
import { deleteTodo } from "@/api/todo";
interface props{
isEdit:boolean;
userid:string|null;
itemid:string;
setIsComplete:Dispatch<SetStateAction<todoType[]>>;
setIsImcomplete:Dispatch<SetStateAction<todoType[]>>;
}
const DeleteButton = ({
isEdit,
userid,
itemid,
setIsComplete,
setIsImcomplete,
}:props) => {
const handleClick=async()=>{
const data:todoType[]=await deleteTodo(userid as string,itemid);
setIsComplete(data.filter(item=>item.checked===1));
setIsImcomplete(data.filter(item=>item.checked===0));
}
return (
<div>
<IconButton
aria-label="delete"
disabled={isEdit}
onClick={()=>handleClick()}
>
<DeleteIcon />
</IconButton>
</div>
);
}
export default DeleteButton;
今までの総復習のようなもんですね。
引数でitemidとuseridを渡しています。
そしてタスクが完了か未完了かを分けています。
もうお分かりだと思います。
propsが増えたので渡すものを宣言してあげなければなりません。
コードは一部を記載します。
<DeleteButton
isEdit={isEdit}
userid={userid}
itemid={todo.id}
setIsComplete={setIsComplete}
setIsImcomplete={setIsImcomplete
/>
一応サインアウトボタンも作ります。
今回はホームへの遷移だけですが、本来であればDBの仕様を使ってログインしてるかしてないかの状態を保存し〜とか
やるんでしょうけど今回は全く考えていなかったので遷移だけにします。
import ja from "@/shared/ja";
import linkName from "@/shared/linkName";
import { Button } from "@mui/material";
import Link from "next/link";
import styles from "./style.css";
const SignOutButton = () => {
return (
<div className={styles.containar}>
<Link href={linkName.home}>
<Button variant="text">
{ja.todo.signout}
</Button>
</Link>
</div>
);
}
export default SignOutButton;
marginTopだけつけようと思います。stylesheetを書いてください。
import { style } from "@vanilla-extract/css";
const styles={
containar:style({
marginTop:"10px",
})
}
export default styles;
'use client'
import { ReadonlyURLSearchParams, useSearchParams } from "next/navigation";
import Title from "../components/title";
import Greeting from "./greeting";
import styles from "./style.css";
import NotLogin from "./notLogin";
import TodoInputForm from "./todoInputForm";
import TodoList from "./todoList";
import { SetStateAction, useState } from "react";
import { todoToggleType, todoType } from "@/shared/type";
import { isCmptoggleItems } from "@/shared/data";
import IsCompleteToggle from "./isCompleteToggle";
import SignOutButton from "./signoutButton";
const Todo = () => {
const searchParams:ReadonlyURLSearchParams=useSearchParams();
const name:string|null=searchParams.get('name');
const id:string|null=searchParams.get('id');
const [todo,setTodo]=useState<todoType[]>([]);
const [imcompleteData,setImcompleteData]=useState<todoType[]>([]);
const [completeData,setCompleteData]=useState<todoType[]>([]);
const [toggleItem,setToggleItem]=useState<string>(isCmptoggleItems[0].value);
return (
<main className={styles.containar}>
{id&&name?(
<>
<Title/>
<Greeting
name={name}
/>
<TodoInputForm
id={id}
setTodos={setTodo}
setCompleteData={setCompleteData}
setImcompleteData={setImcompleteData}
/>
<IsCompleteToggle
toggle={toggleItem}
setToggle={setToggleItem}
/>
<TodoList
id={id}
todos={todo}
setTodo={setTodo}
completeData={completeData}
imcompleteData={imcompleteData}
setCompleteData={setCompleteData}
setImcompleteData={setImcompleteData}
toggle={toggleItem}
/>
<SignOutButton/>
</>
):(
<NotLogin/>
)}
</main>
);
}
export default Todo;
こんな感じで一連の流れの処理ができたと思います。
今回はバックエンドからフロントエンドでtodoを作っていきました。
長い時間をかけてこの記事を書きましたがなかなか難しいなと思いました。
さらに、実装していくうちにこうすると良いかもと思ったのでリファクタをしていこうと思います。
それではまた!!!!