t3-stack入門 (7) 詳細ページ追加&ログイン時のみDeleteボタンを表示

pages/index.tsxがテンプレート作成時のままなので、todo.tsxの内容をindex.tsxに移します。

![new_index_page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508186/480326cb-425d-57d2-a35e-619ea7e22f45.png)

デザインセンスがないので見てくれが悪いですが、とりあえず進めます。

## Todo詳細表示ページ
src/pages/todo/[todoId].tsxにTodo詳細表示ページを作成します。
このようなプロパテイ名とその値が並んでいる画面、業務でWebアプリを作っていたときはdl/dt/ddを使うのが正しいことはわかっていたのですが、CSSでdt/ddを縦に並べるのがめんどくさいのでtableタグでやっていました。
今回はtailwinduiにそのものずばりのコンポーネントがあったのでそれを参考にします。

https://tailwindui.com/components/application-ui/data-display/description-lists

```typescript
import { NextPage } from "next";
import { TruckReturn } from "tabler-icons-react";

import { format } from "date-fns";
import { useRouter } from "next/router";
import { Layout } from "../../components/Layout";
import { trpc } from "../../utils/trpc";
import Link from "next/link";

const SingleTodoPage: NextPage = () => {
  const router = useRouter();
  const taskId = Number(router.query.todoId);
  const { data, isLoading, error } = trpc.todo.get.useQuery({
    id: taskId,
  });
  if (isLoading) {
    return <Layout title="Task Detail">Loading single task...</Layout>;
  }
  if (error) {
    return <Layout title="Tak Detail">{error.message}</Layout>;
  }
  return (
    <Layout title="Task Detail">
      <div className="border-t">
        <dl>
          <div className="px4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
            <dt className="text-gray-500">Title</dt>
            <dd className="text-white-900 mt-1">{data?.title}</dd>
          </div>
          <div className="px py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
            <dt className="text-gray-500">Description</dt>
            <dd className="text-white-900 mt-1">{data?.description}</dd>
          </div>
          <div className="px4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
            <dt className="text-gray-500">Creted At</dt>
            <dd className="text-white-900 mt-1">
              {data && format(new Date(data.createdAt), "yyyy-MM-dd HH:mm:ss")}
            </dd>
          </div>
          <div className="px4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
            <dt className="text-gray-500">Updated At</dt>
            <dd className="text-white-900 mt-1">
              {data && format(new Date(data.updatedAt), "yyyy-MM-dd HH:mm:ss")}
            </dd>
          </div>
        </dl>
      </div>
      <Link href={`/`}>
        <TruckReturn className="mt-3 h-6 w-6 cursor-pointer text-blue-600" />
      </Link>
    </Layout>
  );
};
export default SingleTodoPage;

```

## Todo一覧で自分のTodoのみDeleteボタンを表示する

Server側で、自分のTodoのみ削除できるように変更したので、自分のTodoのみDeleteボタンを表示するように変更します。
また、Todo詳細表示ページへのリンクを追加しておきます。
```diff_typescript
@@ -64,15 +64,17 @@ const Todo: NextPage = () => {
           <Card withBorder key={todo.id} mt={"sm"}>
             <Group position={"apart"}>
-              <Text>{todo.title}</Text>
-              <ActionIcon
-                onClick={() => {
-                  deleteTodo.mutate({ id: todo.id });
-                }}
-                color={"red"}
-                variant={"transparent"}
-              >
-                <Trash />
-              </ActionIcon>
+              <Link href={`/todo/${todo.id}`}>
+                    <span className="cursor-pointer">{todo.title}</span>
+              </Link>
+              {sessionData?.user?.id === todo.owner.id && (
+                <ActionIcon
+                  onClick={() => {
+                    deleteTodo.mutate({ id: todo.id });
+                  }}
+                  color={"red"}
+                  variant={"transparent"}
+                >
+                  <Trash />
+                </ActionIcon>
+              )}
             </Group>
           </Card>
         ))}

```
![show_delete_only_mytodo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508186/cf8cb2f4-2c2b-e90f-b4e5-5dfa8421cec0.png)


ちゃんと、自分のTodoのみにDeleteボタンが表示されるようになりました。

## Componentを分ける
pages/index.tsxにTodoのEdit用コンポーネント、表示用コンポーネントをすべて記述していてわかりにくいのでsrc/features/todoディレクトリを作成してEdit用コンポーネント、表示用コンポーネントを独立させました。
featuresディレクトリというのは

https://zenn.dev/meijin/articles/bulletproof-react-is-best-architecture

を参考にしてつけてみました。
おかげてsrc/pages/index.tsxはだいぶすっきりしました。

ここまでの変更は以下の通りです。

https://github.com/bioflowy/t3-todo-example/commit/a993b779ec20a3f65e2c99aaea8bf9b574fca48d