# カレンダーの予定作成機能1

次に予定を作成できるようにします。

`feature/add-schedule-func`にて作業します。

```bash
git switch -c feature/add-schedule-func
```

予定作成は、モーダルにて行うので、`react-modal`というライブラリをインストールしましょう。

```bash
npm i react-modal
```

また、`react-modal`の型もインストールします。

```bash
npm i -D @types/react-modal
```

では、`organisms`配下に`CreateScheduleModal.tsx`を作成しましょう。

このコンポーネントにて、`react-modal`の`Modal`で全体を括ることで、モーダルとして表示することができます。こちらは`isOpen`という`onRequestClose`という`props`を受け取り、`isOpen`は`boolean`の値を受け取り、`true`の場合にモーダルが表示されます。onRequestCloseはモーダル外をクリックした際に発火する関数を渡し、通常では`isOpen`を`false`にするような関数を渡すことで、画面外をクリックした際にモーダルが閉じるようにします。

<pre class="language-tsx" data-title="organisms/CreateScheduleModal.tsx◎"><code class="lang-tsx"><strong>import Modal from "react-modal";
</strong><strong>
</strong><strong>type PropsType = {
</strong><strong>  isOpen: boolean;
</strong><strong>  closeModal: () => void;
</strong><strong>};
</strong><strong>
</strong><strong>const customStyles = {
</strong><strong>  content: {
</strong><strong>    top: "50%",
</strong><strong>    left: "50%",
</strong><strong>    width: "30%",
</strong><strong>    height: "50vh",
</strong><strong>    transform: "translate(-50%, -50%)",
</strong><strong>  },
</strong><strong>};
</strong><strong>
</strong><strong>export const CreateScheduleModal = ({
</strong><strong>  isOpen,
</strong><strong>  closeModal,
</strong><strong>}: PropsType) => {
</strong><strong>  return (
</strong><strong>    &#x3C;Modal isOpen={isOpen} style={customStyles} onRequestClose={closeModal}>
</strong><strong>      &#x3C;div>
</strong><strong>        &#x3C;h3 className="text-center text-3xl text-lime-800 font-bold pb-5">
</strong><strong>          予定作成
</strong><strong>        &#x3C;/h3>
</strong><strong>      &#x3C;/div>
</strong><strong>    &#x3C;/Modal>
</strong><strong>  );
</strong><strong>};
</strong></code></pre>

では、こちらのモーダルをカレンダーのナビゲーションにボタンを追加し、ボタンを押した際にモーダルが表示するようにしましょう。

`isOpen`というstateを定義し、`closeModal`というisOpenをfalseにする関数を定義します。

そして、`予定作成`というボタンの`onClick`にて、`isOpen`を`true`として、`CreateScheduleModal`を呼び出すようにしましょう。

<pre class="language-tsx" data-title="organisms/CalendarNav.tsx◎"><code class="lang-tsx"><strong>import { Dispatch, SetStateAction, useState } from "react"
</strong>import { addMonths } from "date-fns"
import { FaArrowAltCircleLeft, FaArrowAltCircleRight } from "react-icons/fa"
import { PrimaryBtn } from "../atoms/PrimaryBtn"
import { CreateScheduleModal } from "./CreateScheduleModal"

type PropsType = {
  setCurrentDate: Dispatch&#x3C;SetStateAction&#x3C;Date>>
};

export const CalendarNav = ({ setCurrentDate }: PropsType) => {
<strong>  const [isOpen, setIsOpen] = useState(false)
</strong><strong>  const closeModal = () => setIsOpen(false)
</strong>
  const changeToday = () => setCurrentDate(new Date())
  const changePrevMonth = () =>
    setCurrentDate((prevDate) => addMonths(prevDate, -1))
  const changeNextMonth = () =>
    setCurrentDate((prevDate) => addMonths(prevDate, 1))

  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"
          onClick={changePrevMonth}
        />
        &#x3C;PrimaryBtn size="sm" onClick={changeToday}>
          今日
        &#x3C;/PrimaryBtn>
        &#x3C;FaArrowAltCircleRight
          className="text-lime-800 text-2xl"
          onClick={changeNextMonth}
        />
      &#x3C;/div>
<strong>      &#x3C;PrimaryBtn size="sm" onClick={() => setIsOpen(true)}>
</strong><strong>        予定作成
</strong><strong>      &#x3C;/PrimaryBtn>
</strong><strong>      &#x3C;CreateScheduleModal
</strong><strong>        isOpen={isOpen}
</strong><strong>        closeModal={closeModal}
</strong><strong>      />
</strong>    &#x3C;/div>
  )
}

</code></pre>

これで`予定作成`というボタンを押した際に、モーダルが表示されるようになったかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FSjjN40ZGzwZMD7OqvoSD%2F6a.png?alt=media&#x26;token=5e66136a-adda-4052-8b8f-e47c358a222a" alt=""><figcaption></figcaption></figure>

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

```bash
git add .
```

```bash
git commit
```

commitメッセージは

```
feat: カレンダーナビゲーションに予定作成のボタンを追加し、モーダルを表示するようにした
```

としましょう。
