部屋の検索・予約ができるようにしよう
🔍 検索ができるようにしよう
このレッスンでは、宿泊希望日で部屋の検索・予約ができるようにします。
まずは、Home画面
を完成させます。
表示するメッセージと日付入力のフォームを追加するために、以下のコードでHome.js
を更新しましょう。
frontend/asserts/js/pages/Home.js
import FormDate from "../components/FormDate";
const Home = () => {
return (
<>
<div className="text-center" style={{ margin: "200px" }}>
<h1>Welcome.</h1>
<h1>Select your stay dates and find a hotel!</h1>
<FormDate />
</div>
<div className="text-center">
<p>
Owners who wish to list their rooms should connect to the NEAR Wallet.
</p>
</div>
</>
);
};
export default Home;
import
の追加、return文
の書き換えを行いました。
これにより、ユーザーに向けたメッセージと日付を入力するフォームが表示できるようになりました!
確認のため、Home
画面を表示してみましょう。
試しに、日付を入力してSearch
ボタンを押してみましょう。
Search画面
に遷移ができればHome画面
は完成です!
ここで、Search
画面への遷移を設定した部分を振り返ります。
App.js
<Route path="/search/:date" element={<Search />} />
/search
のパスに:date
というキーワードを追加していました。
Search
画面に遷移したブラウザのURLを見てみましょう。パスの最後に、検索をした日付が追加されているはずです。
localhost:1234/search/2022-08-09
実際に値を渡す部分は、FormDate
コンポーネント内に実装しました。
FormDate.js
// URLに入力された日付を入れて遷移先へ渡す
onClick={() => navigate(`/search/${date}`)}
このように、検索された日付を遷移先に渡します。
次に、Search画面
を完成させます。
この画面では検索結果の表示と、再度検索ができるように日付入力フォームを表示します。
以下のコードで、Search.js
を更新しましょう。
frontend/asserts/js/pages/Search.js
import { useEffect, useState } from "react";
import Row from "react-bootstrap/Row";
import { useParams } from "react-router-dom";
import FormDate from "../components/FormDate";
import Room from "../components/Room";
import { book_room, get_available_rooms } from "../near/utils";
const Search = () => {
// URLから検索する日付を取得する
const { date } = useParams();
// 予約できる部屋のデータを設定する
const [availableRooms, setAvailableRooms] = useState([]);
const getAvailableRooms = async () => {
setAvailableRooms(await get_available_rooms(date));
};
const booking = async (room_id, price) => {
book_room({
room_id,
date,
price,
});
getAvailableRooms();
};
// 検索する日付が更新されるたびに`getAvailableRooms`を実行する
useEffect(() => {
getAvailableRooms();
}, [date]);
return (
<>
{/* 日付を入力するフォームを表示 */}
<FormDate />
<div className="text-center" style={{ margin: "20px" }}>
<h2>{date}</h2>
{availableRooms.length === 0 ? (
<h3>Sorry, no rooms found.</h3>
) : (
<>
{/* NEAR Walletに接続されている時 */}
{window.accountId && <h3>{availableRooms.length} found.</h3>}
{/* NEAR Walletに接続していない時 */}
{!window.accountId && (
<h3>
{availableRooms.length} found. To book, you must be connected to
the NEAR Wallet.
</h3>
)}
</>
)}
</div>
{/* 予約可能な部屋を表示する */}
<Row>
{availableRooms.map((_room) => (
<Room room={{ ..._room }} key={_room.room_id} booking={booking} />
))}
</Row>
</>
);
};
export default Search;