近くの飲食店を簡単に検索できるサービス「Ottimo!!」をPWAで作ってみた



# :star: きっかけ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ランチの店を決めるのがめんどくさいなーと思い、「人数と値段を選ぶだけで、サクッと飲食店を決められるアプリ」のプロトタイプを作ってみました🙆1000RT 達成したらこのアプリ作ります！🎉 <a href="https://t.co/jHIp6sOsDE">pic.twitter.com/jHIp6sOsDE</a></p>&mdash; ren@グルメアプリ開発中 (@lotus_rs) <a href="https://twitter.com/lotus_rs/status/995281769589981186?ref_src=twsrc%5Etfw">2018年5月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- というのを見て自分でも似たようなものを作ってみました

# :star2: 実際に作ったもの

## [Ottimo!!](https://mikan3rd.github.io/lunch-search/)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">近くの飲食店が簡単に探せるWebアプリを作ってみました！<br><br>ランチやWiFiのある店も簡単に探せて、地図で案内してくれます。<br><br>また、ホーム画面に追加するとアプリをインストールできます。<a href="https://t.co/fo3FJC8aat">https://t.co/fo3FJC8aat</a> <a href="https://t.co/bbBC6eYgaW">pic.twitter.com/bbBC6eYgaW</a></p>&mdash; みかん三世 (@mikan_the_third) <a href="https://twitter.com/mikan_the_third/status/1005291014209204225?ref_src=twsrc%5Etfw">2018年6月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- スマホ向けのサービスです
- サーバーサイドはHerokuなのでsleepしていると最初の応答が遅いです・・・

# :star: 特徴
- 近くの飲食店をwebから手軽に検索できる
- そのままwebでGoogleMapを使ったルート案内ができる
- 「ランチあり」「Wi-Fiあり」といったありがちな条件のON/OFFが簡単にできる
- 横スワイプで店を選べるので長々と縦スクロールしなくていい
- 他のURLに遷移せずにwebページで詳細を確認できる
- webなのでストアからアプリをダウンロードしたりアップデートしたりする必要がない
- PWA対応しているのでホーム画面に追加すると通常のスマホアプリのように動作する
- 「作者に牛丼をおごる」ボタンをつけてみた（[元ネタ](http://gogotsu.com/archives/3991)）


# :star: 使ったもの
## :pencil: [React](https://reactjs.org/)
- `create-react-app`コマンドで簡単にReactアプリを作ることができます
- このコマンドで生成すると`registerServiceWorker.js`というファイルも作ってくれるので、これを使うだけで簡単にPWA化できます
- あとは`manifest.json`というファイルを作ってアイコンの設定をするくらいです

## :pencil: [GitHub Pages](https://pages.github.com/)
- フロントはGitHub Pages を使うことでサーバーレスでwebページを公開できました
- 無料かつデプロイもコマンド1つで簡単にできるのでオススメです
- [Reactの場合のデプロイ方法](https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#github-pages)
-  ~~[GitLab Pages](https://docs.gitlab.com/ee/user/project/pages/)もあるっぽい~~

## :pencil: [Onsen UI](https://ja.onsen.io/)
- 「モバイルWebアプリを最高に美しく、スムーズに」という謳い文句の通り、ネイティブアプリっぽい動作を簡単に実装できるのでオススメです
- アイコン、ボタン、カルーセル、サイドバーなどのほぼ全てのパーツもOnsenUIを使用しています
- PageとNavigatorを使った独自のルーティングがあるので使う前に要確認
- ~~なぜかReactのリファレンスはあっさりしているので、詳しくは他のリファレンスを参考にした方が良さそう（小声）~~

## :pencil: [ホットペッパー グルメサーチAPI](https://webservice.recruit.co.jp/hotpepper/reference.html)
- 食べログはAPIの提供終了しており、ぐるなびは店舗の画像が取得できない場合があったため、ホットペッパーグルメのAPIを使わせていただきました
- APIの利用登録も簡単で、RateLimit(API使用回数の制限)も特になさそうでした

## :pencil: [GoogleMap JavaScript API](https://developers.google.com/maps/documentation/javascript/tutorial?hl=ja)
- GoogleMapを表示させるために必要です
- reactの場合は[react-google-maps](https://github.com/tomchentw/react-google-maps)を使うと実装したすいです
- 緯度経度は`navigator.geolocation`で取得できます
- iconのrotationに`deviceorientation`イベントで取得した値を入れるとスマホの向いている方向にiconを回転できます
- 使用にはAPIキーの取得が必要です

## :pencil: [GoogleMap Direction API](https://developers.google.com/maps/documentation/directions/?hl=ja)
- GoogleMapのルート案内を使用するために必要です
- スタートとゴールの緯度経度を指定し、移動方法（徒歩、車など）を指定するだけで適切なルートを表示してくれます

## :pencil: [マシュマロ](https://marshmallow-qa.com/)
- 何かバグや改善点があった時にメッセージを受け取れるよう、「作者にメッセージを送る」をマシュマロで送るようにしてみました

## :pencil: [Stripe](https://stripe.com/jp)
- 支払い（決済）を導入してみたかったので試しに使用
- ただしReactには対応できていない部分もあり、Checkoutを使った実装がうまくできませんでした（できるはず）
- そもそもクレジットカード情報を入力してもらうのが微妙なので、投げ銭やLINE Payなどで気軽に決済ができるようになってほしいですね・・・

# :star: 追記
- ホットペッパーAPIの仕様変更により料理カテゴリで検索ができなくなってしまいました・・・
<img width="826" alt="スクリーンショット 2018-10-28 18.29.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/178077/b9513906-db55-9caa-88b5-87bac8e4d4ce.png">