# カレンダーのナビゲーションメニューを作成1

次に、先月と次月のカレンダーを表示するようにしましょう。

`feature/prev-and-next-month-calendar`にて作業します。

```bash
git switch -c feature/prev-and-next-month-calendar
```

まず`CalendarPage.tsx`の方で`today`という定数を定義していましたが、こちらを`currentDate`というstateとして管理できるようにします。

<pre class="language-tsx" data-title="pages/CalendarPage.tsx◎"><code class="lang-tsx">import { getMonth} from "date-fns";
<strong>import { useState } from "react";
</strong>import { CalendarHeader } from "../organisms/CalendarHeader";
import { CalendarBody } from "../organisms/CalendarBody";
import { useCalendar } from "../../hooks/useCalendar";

export const CalendarPage = () => {
<strong>  const [currentDate, setCurrentDate] = useState(new Date())
</strong><strong>  const { dateList } = useCalendar({ currentDate: currentDate });
</strong>
  return (
    &#x3C;>
      &#x3C;h1 className=" font-bold text-3xl mb-5">{`${
<strong>        getMonth(currentDate) + 1
</strong>      }月`}&#x3C;/h1>
      &#x3C;table className="w-[80%] border-collapse border-2 border-solid border-lime-800 table-fixed">
        &#x3C;CalendarHeader />
<strong>        &#x3C;CalendarBody currentDate={currentDate} dateList={dateList} />
</strong>      &#x3C;/table>
    &#x3C;/>
  );
}

</code></pre>

次に`organisms`配下に`CalendarNav.tsx`を作成しましょう。先月、次月のカレンダーに移動できるように、左右の矢印のアイコンを使用します。`react-icons`の`FaArrowAltCircleLeft`と`FaArrowAltCircleRight`を使用しましょう。そして、そのアイコンの間に`今日`というボタンを配置し、今月のカレンダーに移動できるようにします。

<pre class="language-tsx" data-title="organisms/CalendarNav.tsx◎"><code class="lang-tsx"><strong>import { FaArrowAltCircleLeft, FaArrowAltCircleRight } from "react-icons/fa"
</strong><strong>
</strong><strong>export const CalendarNav = () => {
</strong><strong>  return (
</strong><strong>    &#x3C;div className="w-[80%] flex justify-between mb-2">
</strong><strong>      &#x3C;div className="flex items-center text-white gap-4">
</strong><strong>        &#x3C;FaArrowAltCircleLeft className="text-lime-800 text-2xl" />
</strong><strong>        &#x3C;button className="bg-lime-800 text-white p-2 text-sm rounded-lg">
</strong><strong>          今日
</strong><strong>        &#x3C;/button>
</strong><strong>        &#x3C;FaArrowAltCircleRight className="text-lime-800 text-2xl" />
</strong><strong>      &#x3C;/div>
</strong><strong>    &#x3C;/div>
</strong><strong>  )
</strong><strong>}
</strong></code></pre>

ここで、`今日`というボタンに関してですが、レイアウトが`PrimaryBtn`コンポーネントと、`p-2 text-sm`のみ異なるので、`PrimaryBtn`にて`size`というpropsを受け取れるようにして、`p-2 text-sm`を変更できるようにしましょう。`PrimaryBtn`にて`SIZE_MAPPING`というオブジェクトの定数を定義して、受け取った`size`というpropsで`SIZE_MAPPING[size]`とすることで、その値を取得し、`className`に埋め込むことで、`size`によって`className`を変更することができます。

<pre class="language-tsx" data-title="atoms/PrimaryBtn.tsx◎"><code class="lang-tsx">import { ReactNode } from "react";

type PropsType = {
<strong>  size: "sm" | "lg"
</strong>  onClick: () => void
  children: ReactNode
}

<strong>const SIZE_MAPPING = {
</strong><strong>  sm: "p-2 text-sm",
</strong><strong>  lg: "p-4 text-lg",
</strong><strong>};
</strong>
<strong>export const PrimaryBtn = ({ size, onClick, children }: PropsType) => {
</strong>  return (
    &#x3C;button
<strong>      className={`bg-lime-800 text-white ${SIZE_MAPPING[size]} rounded-lg`}
</strong>      onClick={onClick}
    >
      {children}
    &#x3C;/button>
  );
};

</code></pre>

`PrimaryBtn`を呼び出しているところを修正しましょう。TopPage.tsxとLoginPage.tsxを修正しましょう。

<pre class="language-tsx" data-title="pages/TopPage.tsx◎"><code class="lang-tsx">...
<strong>        &#x3C;PrimaryBtn size="lg" onClick={() => navigate("/login")}>ログイン&#x3C;/PrimaryBtn>
</strong>...
</code></pre>

<pre class="language-tsx" data-title="page/LoginPage.tsx◎"><code class="lang-tsx">...
<strong>        &#x3C;PrimaryBtn size="lg" onClick={() => null}>ログイン&#x3C;/PrimaryBtn>
</strong>...
</code></pre>

そして、`CalendarNav`の`今日`のボタンに`PrimaryBtn`を使用するようにしましょう。

<pre class="language-tsx" data-title="organisms/CalendarNav.tsx◎"><code class="lang-tsx">import { FaArrowAltCircleLeft, FaArrowAltCircleRight } from "react-icons/fa";
<strong>import { PrimaryBtn } from "../atoms/PrimaryBtn";
</strong>

export const CalendarNav = () => {
  return (
    &#x3C;div className="w-[80%] flex justify-between mb-2">
      &#x3C;div className="flex items-center text-white gap-4">
        &#x3C;FaArrowAltCircleLeft className="text-lime-800 text-2xl" />
<strong>        &#x3C;PrimaryBtn size="sm" onClick={() => null}>
</strong><strong>          今日
</strong><strong>        &#x3C;/PrimaryBtn>
</strong>        &#x3C;FaArrowAltCircleRight className="text-lime-800 text-2xl" />
      &#x3C;/div>
    &#x3C;/div>
  );
};

</code></pre>

こちらをCalendarPage.tsxにて呼び出しましょう。

<pre class="language-tsx" data-title="pages/CalendarPage.tsx◎"><code class="lang-tsx">import { getMonth} from "date-fns";
import { CalendarHeader } from "../organisms/CalendarHeader";
import { CalendarBody } from "../organisms/CalendarBody";
import { useCalendar } from "../../hooks/useCalendar";
import { useState } from "react";
<strong>import { CalendarNav } from "../organisms/CalendarNav";
</strong>
export const CalendarPage = () => {
  const [currentDate, setCurrentDate] = useState(new Date())
  const { dateList } = useCalendar({ currentDate: currentDate });

  return (
    &#x3C;>
      &#x3C;h1 className=" font-bold text-3xl mb-5">{`${
        getMonth(currentDate) + 1
      }月`}&#x3C;/h1>
<strong>      &#x3C;CalendarNav />
</strong>      &#x3C;table className="w-[80%] border-collapse border-2 border-solid border-lime-800 table-fixed">
        &#x3C;CalendarHeader />
        &#x3C;CalendarBody currentDate={currentDate} dateList={dateList} />
      &#x3C;/table>
    &#x3C;/>
  );
}

</code></pre>

以下のように表示されるかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2F3rvbELUrxlGXafXYN9HZ%2F4a.png?alt=media&#x26;token=841ef108-07cd-42ba-a75c-8d3deb51a998" alt=""><figcaption></figcaption></figure>

ここまでの作業をcommitしましょう。

```bash
git add .
```

```bash
git commit
```

commitメッセージは

```
feat: カレンダーのナビゲーションメニューのレイアウトを作成
```

としましょう。
