├── .github ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── card-labeler.yml ├── config.yml ├── labeler.yml ├── no-response.yml ├── pr-labeler.yml ├── pull_request_template.md ├── release-drafter.yml ├── stale.yml ├── workflow-details.json ├── workflow-settings.json └── workflows │ ├── add-release-tag.yml │ ├── broken-link-check.yml │ ├── check-warnings.yml │ ├── ci.yml │ ├── issue-opened.yml │ ├── pr-opened.yml │ ├── pr-updated.yml │ ├── project-card-moved.yml │ ├── sync-workflows.yml │ ├── toc.yml │ └── update-dependencies.yml ├── .gitignore ├── .nvmrc ├── LICENSE ├── Makefile ├── README.md ├── apps ├── admin │ ├── __tests__ │ │ ├── MockFullCalendar.tsx │ │ ├── __mocks__ │ │ │ └── fileMock.js │ │ ├── __snapshots__ │ │ │ └── index.test.tsx.snap │ │ ├── index.test.tsx │ │ ├── pages │ │ │ ├── admins.test.tsx │ │ │ ├── dashboard.test.tsx │ │ │ ├── guests.test.tsx │ │ │ ├── reservations.test.tsx │ │ │ └── rooms.test.tsx │ │ └── utils.tsx │ ├── _pages │ │ ├── admins.tsx │ │ ├── dashboard.tsx │ │ ├── guests.tsx │ │ ├── index.tsx │ │ ├── reservations.tsx │ │ └── rooms.tsx │ ├── babel.config.js │ ├── components │ │ ├── Auth.tsx │ │ ├── AuthenticatedPage.tsx │ │ ├── DataTable.tsx │ │ ├── FullCalendar.tsx │ │ ├── Head.tsx │ │ ├── Layout │ │ │ ├── Footer.tsx │ │ │ ├── Header.tsx │ │ │ ├── Sidebar.tsx │ │ │ └── index.tsx │ │ ├── LicenseDialog.tsx │ │ ├── Login.tsx │ │ ├── PasswordInput.tsx │ │ ├── Route.tsx │ │ ├── SearchTable.tsx │ │ ├── SnackbarContentWrapper.tsx │ │ ├── SnackbarWrapper.tsx │ │ ├── admins │ │ │ ├── EditRoles.tsx │ │ │ ├── RenderRoles.tsx │ │ │ └── SelectIcon.tsx │ │ ├── reservations │ │ │ ├── Calendar.tsx │ │ │ ├── InputNumber.tsx │ │ │ ├── RenderAmount.tsx │ │ │ ├── SelectCheckinDate.tsx │ │ │ ├── SelectCheckoutDate.tsx │ │ │ ├── SelectGuest.tsx │ │ │ └── SelectRoom.tsx │ │ └── rooms │ │ │ └── RoomStatusCalendar.tsx │ ├── hooks │ │ ├── useAuthToken.ts │ │ ├── useDarkMode.ts │ │ ├── useFetch.ts │ │ └── useTheme.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── package.json │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ └── index.tsx │ ├── public │ │ └── favicon.png │ ├── store.tsx │ ├── tsconfig.json │ ├── types │ │ ├── html.d.ts │ │ └── index.ts │ └── utils │ │ ├── actions.ts │ │ ├── api.ts │ │ └── license.ts ├── front │ ├── .gitignore │ ├── _pages │ │ ├── account.tsx │ │ ├── contact.tsx │ │ ├── facility.tsx │ │ ├── index.tsx │ │ ├── info.tsx │ │ ├── meal.tsx │ │ ├── privacy.tsx │ │ ├── reservation.tsx │ │ ├── reservations.tsx │ │ ├── room.tsx │ │ ├── rooms.tsx │ │ ├── terms.tsx │ │ └── top.tsx │ ├── babel.config.js │ ├── components │ │ ├── Auth.tsx │ │ ├── AuthenticatedPage.tsx │ │ ├── Head.tsx │ │ ├── Layout │ │ │ ├── Footer.tsx │ │ │ ├── Header.tsx │ │ │ └── index.tsx │ │ ├── MiniCalendar.tsx │ │ ├── Reservation │ │ │ ├── Account.tsx │ │ │ ├── Confirm.tsx │ │ │ ├── Detail │ │ │ │ ├── Calc.tsx │ │ │ │ ├── Checkin.tsx │ │ │ │ ├── Checkout.tsx │ │ │ │ ├── SelectNumber.tsx │ │ │ │ ├── SelectRoom.tsx │ │ │ │ └── index.tsx │ │ │ ├── GuestInfo.tsx │ │ │ ├── Payment │ │ │ │ ├── NewCard.tsx │ │ │ │ ├── SelectCard.tsx │ │ │ │ └── index.tsx │ │ │ ├── TimePicker.tsx │ │ │ └── index.tsx │ │ ├── ToastWrapper.tsx │ │ └── account │ │ │ ├── Detail.tsx │ │ │ ├── Edit.tsx │ │ │ ├── ReservationList.tsx │ │ │ └── SwitchTab.tsx │ ├── hooks │ │ ├── useAuthToken.ts │ │ └── useFetch.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── package.json │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ └── index.tsx │ ├── public │ │ ├── cover1.jpg │ │ ├── cover2.jpg │ │ ├── cover3.jpg │ │ ├── cover4.jpg │ │ ├── cover5.jpg │ │ ├── cover6.jpg │ │ ├── facility1.jpg │ │ ├── facility2.jpg │ │ ├── facility3.jpg │ │ ├── facility4.jpg │ │ ├── favicon.png │ │ ├── meal1.jpg │ │ ├── meal2.jpg │ │ ├── meal3.jpg │ │ └── meal4.jpg │ ├── server.ts │ ├── store.tsx │ ├── stripe.json │ ├── tsconfig.json │ ├── types │ │ ├── html.d.ts │ │ └── index.ts │ └── utils │ │ ├── actions.ts │ │ ├── api.ts │ │ ├── date.ts │ │ └── history.ts ├── lock │ ├── _pages │ │ ├── index.tsx │ │ ├── room.tsx │ │ ├── rooms.tsx │ │ └── top.tsx │ ├── babel.config.js │ ├── components │ │ ├── Checkout.tsx │ │ ├── Head.tsx │ │ ├── Keypad.tsx │ │ ├── Layout │ │ │ └── index.tsx │ │ ├── Qr.tsx │ │ ├── Reservation.tsx │ │ └── ToastWrapper.tsx │ ├── hooks │ │ └── useFetch.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── package.json │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ └── index.tsx │ ├── public │ │ └── favicon.png │ ├── store.tsx │ ├── tsconfig.json │ ├── types │ │ ├── html.d.ts │ │ └── index.ts │ └── utils │ │ ├── actions.ts │ │ ├── api.ts │ │ ├── date.ts │ │ └── history.ts └── server │ ├── .env.example │ ├── .gitignore │ ├── __tests__ │ ├── __mocks__ │ │ ├── Cancelled.ts │ │ ├── Footer.ts │ │ ├── Head.ts │ │ ├── Header.ts │ │ ├── Paid.ts │ │ ├── Reserved.ts │ │ ├── RoomKey.ts │ │ └── infra │ │ │ ├── database │ │ │ ├── admin.ts │ │ │ ├── factory.ts │ │ │ ├── guest.ts │ │ │ ├── reservation.ts │ │ │ ├── role.ts │ │ │ ├── room.ts │ │ │ └── roomKey.ts │ │ │ ├── mail │ │ │ └── index.ts │ │ │ └── payment │ │ │ └── index.ts │ ├── config │ │ └── env.test.ts │ ├── packages │ │ ├── application │ │ │ ├── service │ │ │ │ ├── auth.test.ts │ │ │ │ ├── auth0.test.ts │ │ │ │ ├── multipart.test.ts │ │ │ │ ├── pages.test.ts │ │ │ │ ├── reservation.test.ts │ │ │ │ └── table.test.ts │ │ │ └── usecase │ │ │ │ ├── admin │ │ │ │ ├── admins │ │ │ │ │ ├── create.test.ts │ │ │ │ │ ├── delete.test.ts │ │ │ │ │ ├── find.test.ts │ │ │ │ │ ├── list.test.ts │ │ │ │ │ ├── listRoles.test.ts │ │ │ │ │ ├── searchRole.test.ts │ │ │ │ │ ├── service.test.ts │ │ │ │ │ └── update.test.ts │ │ │ │ ├── dashboard │ │ │ │ │ ├── cancel.test.ts │ │ │ │ │ ├── checkin.test.ts │ │ │ │ │ ├── checkout.test.ts │ │ │ │ │ ├── getCheckin.test.ts │ │ │ │ │ ├── getCheckout.test.ts │ │ │ │ │ ├── getDailySales.test.ts │ │ │ │ │ ├── getMonthlySales.test.ts │ │ │ │ │ ├── getSelectableRooms.test.ts │ │ │ │ │ └── sendRoomKey.test.ts │ │ │ │ ├── getAdmin.test.ts │ │ │ │ ├── guests │ │ │ │ │ ├── create.test.ts │ │ │ │ │ ├── delete.test.ts │ │ │ │ │ ├── find.test.ts │ │ │ │ │ ├── list.test.ts │ │ │ │ │ └── update.test.ts │ │ │ │ ├── login │ │ │ │ │ └── login.test.ts │ │ │ │ ├── reservations │ │ │ │ │ ├── create.test.ts │ │ │ │ │ ├── delete.test.ts │ │ │ │ │ ├── find.test.ts │ │ │ │ │ ├── getCheckinNotSelectable.test.ts │ │ │ │ │ ├── getCheckoutSelectable.test.ts │ │ │ │ │ ├── getSelectedGuest.test.ts │ │ │ │ │ ├── getSelectedRoom.test.ts │ │ │ │ │ ├── list.test.ts │ │ │ │ │ ├── searchGuest.test.ts │ │ │ │ │ ├── searchRoom.test.ts │ │ │ │ │ ├── service.test.ts │ │ │ │ │ └── update.test.ts │ │ │ │ └── rooms │ │ │ │ │ ├── create.test.ts │ │ │ │ │ ├── delete.test.ts │ │ │ │ │ ├── find.test.ts │ │ │ │ │ ├── getStatusCalendarEvents.test.ts │ │ │ │ │ ├── list.test.ts │ │ │ │ │ └── update.test.ts │ │ │ │ ├── front │ │ │ │ ├── account │ │ │ │ │ ├── getCancelledReservations.test.ts │ │ │ │ │ ├── getGuestInfo.test.ts │ │ │ │ │ ├── getPaidReservations.test.ts │ │ │ │ │ ├── getReservedReservations.test.ts │ │ │ │ │ └── updateGuestInfo.test.ts │ │ │ │ ├── guest │ │ │ │ │ └── find.ts │ │ │ │ ├── login │ │ │ │ │ └── login.test.ts │ │ │ │ ├── reservation │ │ │ │ │ ├── getCheckinNotSelectable.test.ts │ │ │ │ │ ├── getCheckoutSelectable.test.ts │ │ │ │ │ ├── getGuestInfo.test.ts │ │ │ │ │ ├── getRoomInfo.test.ts │ │ │ │ │ ├── getSelectRooms.test.ts │ │ │ │ │ ├── reserve.test.ts │ │ │ │ │ ├── sendRoomKey.test.ts │ │ │ │ │ └── validate.test.ts │ │ │ │ ├── reservations │ │ │ │ │ ├── cancel.test.ts │ │ │ │ │ └── getReservationDetail.test.ts │ │ │ │ └── rooms │ │ │ │ │ ├── calendar.test.ts │ │ │ │ │ ├── find.test.ts │ │ │ │ │ └── list.test.ts │ │ │ │ ├── lock │ │ │ │ └── rooms │ │ │ │ │ ├── checkout.test.ts │ │ │ │ │ ├── find.test.ts │ │ │ │ │ ├── list.test.ts │ │ │ │ │ ├── validateKey.test.ts │ │ │ │ │ └── validateQr.test.ts │ │ │ │ └── stripe │ │ │ │ ├── attachPaymentMethod.test.ts │ │ │ │ ├── checkoutReservations.test.ts │ │ │ │ ├── detachPaymentMethod.test.ts │ │ │ │ ├── getDefaultPaymentMethod.test.ts │ │ │ │ ├── getPaymentMethods.test.ts │ │ │ │ ├── handleWebhook.test.ts │ │ │ │ └── service.test.ts │ │ └── infra │ │ │ ├── database │ │ │ ├── admin.test.ts │ │ │ ├── guest.test.ts │ │ │ ├── reservation.test.ts │ │ │ ├── role.test.ts │ │ │ ├── room.test.ts │ │ │ ├── roomKey.test.ts │ │ │ └── service.test.ts │ │ │ ├── http │ │ │ └── response.test.ts │ │ │ ├── mail │ │ │ ├── index.test.ts │ │ │ └── service.test.ts │ │ │ └── payment.test.ts │ ├── utils.ts │ └── utils │ │ └── slack.test.ts │ ├── api │ ├── admin │ │ ├── admins │ │ │ ├── _adminId@number │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ ├── hooks.ts │ │ │ ├── index.ts │ │ │ ├── roles │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ └── search │ │ │ │ ├── controller.ts │ │ │ │ ├── index.ts │ │ │ │ └── roles │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ ├── controller.ts │ │ ├── dashboard │ │ │ ├── cancel │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── checkin │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── checkout │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ ├── hooks.ts │ │ │ ├── index.ts │ │ │ ├── rooms │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ └── sales │ │ │ │ ├── controller.ts │ │ │ │ ├── daily │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── monthly │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ ├── guests │ │ │ ├── _guestId@number │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ ├── hooks.ts │ │ │ └── index.ts │ │ ├── hooks.ts │ │ ├── index.ts │ │ ├── login │ │ │ ├── controller.ts │ │ │ └── index.ts │ │ ├── reservations │ │ │ ├── _reservationId@number │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── calendar │ │ │ │ ├── checkin │ │ │ │ │ ├── controller.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── checkout │ │ │ │ │ ├── controller.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ ├── guest │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── hooks.ts │ │ │ ├── index.ts │ │ │ ├── room │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ └── search │ │ │ │ ├── controller.ts │ │ │ │ ├── guests │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── rooms │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ └── rooms │ │ │ ├── _roomId@number │ │ │ ├── controller.ts │ │ │ └── index.ts │ │ │ ├── calendar │ │ │ ├── controller.ts │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ ├── hooks.ts │ │ │ └── index.ts │ ├── controller.ts │ ├── front │ │ ├── account │ │ │ ├── controller.ts │ │ │ ├── guest │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── hooks.ts │ │ │ ├── index.ts │ │ │ └── reservations │ │ │ │ ├── cancelled │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ │ ├── controller.ts │ │ │ │ ├── index.ts │ │ │ │ ├── paid │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ │ └── reserved │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ ├── controller.ts │ │ ├── guest │ │ │ ├── controller.ts │ │ │ ├── hooks.ts │ │ │ └── index.ts │ │ ├── hooks.ts │ │ ├── index.ts │ │ ├── login │ │ │ ├── controller.ts │ │ │ └── index.ts │ │ ├── reservation │ │ │ ├── calendar │ │ │ │ ├── checkin │ │ │ │ │ ├── controller.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── checkout │ │ │ │ │ ├── controller.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ ├── guest │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── hooks.ts │ │ │ ├── index.ts │ │ │ ├── rooms │ │ │ │ ├── _roomId@number │ │ │ │ │ ├── controller.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ └── validate │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ ├── reservations │ │ │ ├── _code@string │ │ │ │ ├── cancel │ │ │ │ │ ├── controller.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ └── index.ts │ │ └── rooms │ │ │ ├── _roomId@number │ │ │ ├── calendar │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ └── index.ts │ ├── index.ts │ ├── lock │ │ ├── controller.ts │ │ ├── index.ts │ │ └── rooms │ │ │ ├── _roomId@number │ │ │ ├── controller.ts │ │ │ ├── index.ts │ │ │ ├── keypad │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ └── qr │ │ │ │ ├── controller.ts │ │ │ │ └── index.ts │ │ │ ├── controller.ts │ │ │ └── index.ts │ ├── stripe │ │ ├── controller.ts │ │ ├── hooks.ts │ │ ├── index.ts │ │ ├── method │ │ │ ├── controller.ts │ │ │ └── index.ts │ │ └── methods │ │ │ ├── controller.ts │ │ │ └── index.ts │ └── webhook │ │ ├── controller.ts │ │ ├── index.ts │ │ └── stripe │ │ ├── controller.ts │ │ └── index.ts │ ├── config │ ├── env.ts │ └── registry.ts │ ├── cron.ts │ ├── index.ts │ ├── jest.setup.ts │ ├── package.json │ ├── packages │ ├── application │ │ ├── service │ │ │ ├── auth.ts │ │ │ ├── auth0.ts │ │ │ ├── multipart.ts │ │ │ ├── pages.ts │ │ │ ├── qr.ts │ │ │ ├── reservation.ts │ │ │ └── table.ts │ │ └── usecase │ │ │ ├── admin │ │ │ ├── admins │ │ │ │ ├── create.ts │ │ │ │ ├── delete.ts │ │ │ │ ├── find.ts │ │ │ │ ├── list.ts │ │ │ │ ├── listRoles.ts │ │ │ │ ├── searchRole.ts │ │ │ │ ├── service.ts │ │ │ │ ├── update.ts │ │ │ │ └── validators.ts │ │ │ ├── dashboard │ │ │ │ ├── cancel.ts │ │ │ │ ├── checkin.ts │ │ │ │ ├── checkout.ts │ │ │ │ ├── getCheckin.ts │ │ │ │ ├── getCheckout.ts │ │ │ │ ├── getDailySales.ts │ │ │ │ ├── getMonthlySales.ts │ │ │ │ ├── getSelectableRooms.ts │ │ │ │ ├── sendRoomKey.ts │ │ │ │ ├── types.ts │ │ │ │ └── validators.ts │ │ │ ├── getAdmin.ts │ │ │ ├── guests │ │ │ │ ├── create.ts │ │ │ │ ├── delete.ts │ │ │ │ ├── find.ts │ │ │ │ ├── list.ts │ │ │ │ ├── update.ts │ │ │ │ └── validators.ts │ │ │ ├── login │ │ │ │ ├── login.ts │ │ │ │ └── validators.ts │ │ │ ├── reservations │ │ │ │ ├── create.ts │ │ │ │ ├── delete.ts │ │ │ │ ├── find.ts │ │ │ │ ├── getCheckinNotSelectable.ts │ │ │ │ ├── getCheckoutSelectable.ts │ │ │ │ ├── getSelectedGuest.ts │ │ │ │ ├── getSelectedRoom.ts │ │ │ │ ├── list.ts │ │ │ │ ├── searchGuest.ts │ │ │ │ ├── searchRoom.ts │ │ │ │ ├── service.ts │ │ │ │ ├── update.ts │ │ │ │ └── validators.ts │ │ │ ├── rooms │ │ │ │ ├── create.ts │ │ │ │ ├── delete.ts │ │ │ │ ├── find.ts │ │ │ │ ├── getStatusCalendarEvents.ts │ │ │ │ ├── list.ts │ │ │ │ ├── update.ts │ │ │ │ └── validators.ts │ │ │ └── validators.ts │ │ │ ├── front │ │ │ ├── account │ │ │ │ ├── getCancelledReservations.ts │ │ │ │ ├── getGuestInfo.ts │ │ │ │ ├── getPaidReservations.ts │ │ │ │ ├── getReservedReservations.ts │ │ │ │ ├── updateGuestInfo.ts │ │ │ │ └── validators.ts │ │ │ ├── guest │ │ │ │ └── find.ts │ │ │ ├── login │ │ │ │ ├── login.ts │ │ │ │ └── validators.ts │ │ │ ├── reservation │ │ │ │ ├── getCheckinNotSelectable.ts │ │ │ │ ├── getCheckoutSelectable.ts │ │ │ │ ├── getGuestInfo.ts │ │ │ │ ├── getRoomInfo.ts │ │ │ │ ├── getSelectRooms.ts │ │ │ │ ├── reserve.ts │ │ │ │ ├── sendRoomKey.ts │ │ │ │ ├── validate.ts │ │ │ │ └── validators.ts │ │ │ ├── reservations │ │ │ │ ├── cancel.ts │ │ │ │ └── getReservationDetail.ts │ │ │ ├── rooms │ │ │ │ ├── calendar.ts │ │ │ │ ├── find.ts │ │ │ │ └── list.ts │ │ │ └── validators.ts │ │ │ ├── lock │ │ │ ├── rooms │ │ │ │ ├── checkout.ts │ │ │ │ ├── find.ts │ │ │ │ ├── list.ts │ │ │ │ ├── validateKey.ts │ │ │ │ ├── validateQr.ts │ │ │ │ └── validators.ts │ │ │ └── validators.ts │ │ │ ├── stripe │ │ │ ├── attachPaymentMethod.ts │ │ │ ├── checkoutReservations.ts │ │ │ ├── detachPaymentMethod.ts │ │ │ ├── getDefaultPaymentMethod.ts │ │ │ ├── getPaymentMethods.ts │ │ │ ├── handleWebhook.ts │ │ │ └── service.ts │ │ │ └── validators.ts │ ├── domain │ │ ├── database │ │ │ ├── admin.ts │ │ │ ├── guest.ts │ │ │ ├── reservation.ts │ │ │ ├── role.ts │ │ │ ├── room.ts │ │ │ ├── roomKey.ts │ │ │ └── service │ │ │ │ ├── prisma.ts │ │ │ │ ├── types.ts │ │ │ │ ├── validatable.ts │ │ │ │ └── validator.ts │ │ ├── http │ │ │ └── response.ts │ │ ├── mail │ │ │ └── index.ts │ │ └── payment │ │ │ └── index.ts │ └── infra │ │ ├── database │ │ ├── admin.ts │ │ ├── guest.ts │ │ ├── index.ts │ │ ├── prisma │ │ │ ├── .env.example │ │ │ ├── .gitignore │ │ │ ├── client.ts │ │ │ ├── migrations │ │ │ │ ├── 20210402092106_init │ │ │ │ │ └── migration.sql │ │ │ │ └── migration_lock.toml │ │ │ ├── runner.ts │ │ │ ├── schema.prisma │ │ │ ├── seed.ts │ │ │ └── seeder │ │ │ │ ├── admin.ts │ │ │ │ ├── guest.ts │ │ │ │ ├── reservation.ts │ │ │ │ ├── role.ts │ │ │ │ └── room.ts │ │ ├── reservation.ts │ │ ├── role.ts │ │ ├── room.ts │ │ ├── roomKey.ts │ │ └── service.ts │ │ ├── http │ │ └── response.ts │ │ ├── mail │ │ ├── index.ts │ │ ├── service.ts │ │ ├── task.ts │ │ └── templates │ │ │ ├── Cancelled.html │ │ │ ├── Footer.html │ │ │ ├── Head.html │ │ │ ├── Header.html │ │ │ ├── Paid.html │ │ │ ├── Reserved.html │ │ │ └── RoomKey.html │ │ └── payment │ │ └── index.ts │ ├── public │ └── icons │ │ └── dummy.svg │ ├── server.ts │ ├── tsconfig.json │ ├── types │ └── html.d.ts │ ├── utils │ ├── logger.ts │ └── slack.ts │ ├── validators │ └── index.ts │ └── webpack.config.js ├── config ├── .eslintignore ├── .eslintrc.js ├── aspida.config.js ├── jest.global.setup.ts ├── jest.setup.ts └── license-format.json ├── gh-pages ├── .nojekyll └── index.html ├── infra ├── .env.example ├── README.md ├── docker-compose.yml └── docker │ └── mysql │ ├── conf.d │ └── my.cnf │ └── entrypoint │ └── init.sh ├── jest.config.ts ├── package.json ├── shared ├── config │ ├── auth0.json │ ├── index.ts │ ├── package.json │ └── tsconfig.json ├── constants │ ├── index.ts │ ├── package.json │ └── tsconfig.json ├── types │ ├── index.ts │ ├── package.json │ └── tsconfig.json └── utils │ ├── __tests__ │ └── utils.test.ts │ ├── api.ts │ ├── calc.ts │ ├── calendar.ts │ ├── component.ts │ ├── license.ts │ ├── misc.ts │ ├── package.json │ ├── string.ts │ ├── tsconfig.json │ └── value.ts ├── tsconfig.json └── yarn.lock /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @technote-space 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: https://paypal.me/technote0space -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: 'technote-space' 7 | 8 | --- 9 | 10 | ## Please describe your suggestion: 提案の概要 11 | 12 | 13 | 14 | ## Describe the solution you'd like: 考えうる解決方法 15 | 16 | 17 | 18 | ## Describe alternatives you've considered: 考えうる代替案 19 | 20 | 21 | 22 | ## Additional context: 補足 23 | 24 | 25 | -------------------------------------------------------------------------------- /.github/card-labeler.yml: -------------------------------------------------------------------------------- 1 | Backlog: 2 | 'In progress': 3 | - 'Status: In Progress' 4 | -------------------------------------------------------------------------------- /.github/labeler.yml: -------------------------------------------------------------------------------- 1 | javascript: 2 | - '**/*.js' 3 | typescript: 4 | - '**/*.ts' 5 | php: 6 | - '**/*.php' 7 | python: 8 | - '**/*.py' 9 | cpp: 10 | - '**/*.cpp' 11 | - '**/*.cxx' 12 | - '**/*.cc' 13 | - '**/*.cp' 14 | 15 | 'Type: Testing': 16 | - '**/tests/*' 17 | - '**/test/*' 18 | - '**/__tests__/*' 19 | 20 | 'Type: Documentation': 21 | - '**/*.md' 22 | 23 | 'Type: CI/CD': 24 | - '.github/workflows/*.yml' 25 | - '.circleci/*' 26 | - '.travis.yml' 27 | -------------------------------------------------------------------------------- /.github/no-response.yml: -------------------------------------------------------------------------------- 1 | # Configuration for probot-no-response - https://github.com/probot/no-response 2 | 3 | # Number of days of inactivity before an Issue is closed for lack of response 4 | daysUntilClose: 14 5 | # Label requiring a response 6 | responseRequiredLabel: "Status: More Information Needed" 7 | # Comment to post when closing an Issue for lack of response. Set to `false` to disable 8 | closeComment: > 9 | This issue has been automatically closed because there has been no response 10 | to our request for more information from the original author. With only the 11 | information that is currently in the issue, we don't have enough information 12 | to take action. Please reach out if you have or find the answers we need so 13 | that we can investigate further. 14 | -------------------------------------------------------------------------------- /.github/pr-labeler.yml: -------------------------------------------------------------------------------- 1 | 'Type: Feature': ['feature/*', 'feat/*'] 2 | 'Type: Bug': fix/* 3 | 'Type: Maintenance': ['patch/*', 'chore/*'] 4 | 'Type: Release': release/* 5 | 'Type: Refactoring': ['refactor/*', 'refactoring/*'] 6 | 'Type: Documentation': ['docs/*', 'doc/*'] 7 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Description: 概要 2 | 3 | 4 | 5 | ## Changes: 変更内容 6 | 7 | 8 | 9 | 10 | 11 | 12 | ## Expected Impact: 影響範囲 13 | 14 | 15 | 16 | ## Operating Requirements: 動作要件 17 | 18 | 19 | 20 | ## Additional context: 補足 21 | 22 | 23 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | # Config for https://github.com/apps/release-drafter 2 | name-template: 'v$NEXT_PATCH_VERSION' 3 | tag-template: 'v$NEXT_PATCH_VERSION' 4 | categories: 5 | - title: ':rocket: Features' 6 | labels: 7 | - 'Type: Feature' 8 | - 'Type: Refactoring' 9 | - title: ':bug: Bug Fixes' 10 | labels: 11 | - 'Type: Bug' 12 | - 'Type: Security' 13 | - title: ':wrench: Maintenance' 14 | labels: 15 | - 'Type: Maintenance' 16 | - 'Type: CI/CD' 17 | - title: ':green_book: Docs' 18 | labels: 19 | - 'Type: Documentation' 20 | - title: ':white_check_mark: Tested' 21 | labels: 22 | - 'Type: Testing' 23 | - title: ':sparkles: All Changes' 24 | labels: 25 | - 'Type: Release' 26 | exclude-labels: 27 | - 'dependencies' 28 | template: | 29 | ## What’s Changed 30 | 31 | $CHANGES 32 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 180 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 30 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - "Priority: Critical" 8 | - "Type: Security" 9 | # Label to use when marking an issue as stale 10 | staleLabel: "Status: Abandoned" 11 | # Comment to post when marking an issue as stale. Set to `false` to disable 12 | markComment: > 13 | This issue has been automatically marked as stale because it has not had 14 | recent activity. It will be closed if no further activity occurs. Thank you 15 | for your contributions. 16 | # Comment to post when closing a stale issue. Set to `false` to disable 17 | closeComment: false -------------------------------------------------------------------------------- /.github/workflow-details.json: -------------------------------------------------------------------------------- 1 | { 2 | "ADMIN_PAGES_API_ORIGIN": "https://frourio-demo.technote.space", 3 | "ADMIN_PAGES_SERVER_PORT": "80", 4 | "ADMIN_PAGES_BASE_PATH": "/api", 5 | "ADMIN_PAGES_FRONT_URL": "https://technote-space.github.io/frourio-demo/front/", 6 | "ADMIN_PAGES_LOCK_URL": "https://technote-space.github.io/frourio-demo/lock/", 7 | "TOC_FOOTER": "*generated with [TOC Generator](https://github.com/technote-space/toc-generator)*" 8 | } 9 | -------------------------------------------------------------------------------- /.github/workflow-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "EXCLUDE_MESSAGES": [ 3 | "update package version", 4 | "update packages", 5 | "update wp version", 6 | "trigger workflow", 7 | "update TOC" 8 | ], 9 | "PROJECT": "Backlog", 10 | "ISSUE_COLUMN": "To do", 11 | "PR_COLUMN": "In progress", 12 | "PR_BODY_TITLE": "## Changes", 13 | "TOC_FOLDING": "1", 14 | "TOC_MAX_HEADER_LEVEL": "3", 15 | "TOC_TITLE": "Details", 16 | "TOC_CREATE_PR": "true", 17 | "TOC_TARGET_PATHS": "README*.md", 18 | "BRANCH_PREFIX": "release/", 19 | "ANNOTATION_EXCLUDE_PATTERNS": [ 20 | ">> warning ", 21 | ">> hint: ", 22 | "Cloning into", 23 | "has unmet peer dependency", 24 | "has incorrect peer dependency", 25 | "Using version", 26 | "ci-helper", 27 | "tests/bootstrap.php" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /.github/workflows/broken-link-check.yml: -------------------------------------------------------------------------------- 1 | on: 2 | schedule: 3 | - cron: 10 22 23 * * 4 | repository_dispatch: 5 | types: [check-link] 6 | workflow_dispatch: 7 | 8 | concurrency: 9 | group: ${{ github.workflow }}-${{ github.ref }} 10 | 11 | name: Broken Link Check 12 | jobs: 13 | check: 14 | name: Broken Link Check 15 | runs-on: ubuntu-latest 16 | timeout-minutes: 10 17 | steps: 18 | - name: Broken Link Check 19 | uses: technote-space/broken-link-checker-action@v2 20 | -------------------------------------------------------------------------------- /.github/workflows/issue-opened.yml: -------------------------------------------------------------------------------- 1 | on: 2 | issues: 3 | types: [opened] 4 | 5 | name: Issue opened 6 | 7 | jobs: 8 | assign: 9 | name: Assign issues to project 10 | runs-on: ubuntu-latest 11 | timeout-minutes: 3 12 | steps: 13 | - uses: technote-space/load-config-action@v1 14 | with: 15 | CONFIG_FILENAME: workflow-settings.json, workflow-details.json 16 | IGNORE_WARNING: 'true' 17 | - uses: technote-space/create-project-card-action@v1 18 | with: 19 | PROJECT: ${{ env.PROJECT }} 20 | COLUMN: ${{ env.ISSUE_COLUMN }} 21 | 22 | assignAuthor: 23 | name: Assign author to issue 24 | runs-on: ubuntu-latest 25 | timeout-minutes: 3 26 | steps: 27 | - uses: technote-space/assign-author@v1 28 | -------------------------------------------------------------------------------- /.github/workflows/project-card-moved.yml: -------------------------------------------------------------------------------- 1 | on: 2 | project_card: 3 | types: [created, moved] 4 | 5 | name: Project Card Event 6 | 7 | jobs: 8 | triage: 9 | name: Auto card labeler 10 | runs-on: ubuntu-latest 11 | timeout-minutes: 3 12 | steps: 13 | - uses: technote-space/auto-card-labeler@v1 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | .next/ 13 | out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | /bin/ 21 | tmp.json 22 | .eslintcache 23 | 24 | # debug 25 | npm-debug.log* 26 | yarn-debug.log* 27 | yarn-error.log* 28 | 29 | # local env files 30 | .env 31 | .env.local 32 | .env.development.local 33 | .env.test.local 34 | .env.production.local 35 | 36 | # IDE 37 | /.idea/ 38 | /.vscode/ 39 | 40 | # generated files 41 | license.json 42 | 43 | # log 44 | /logs/ 45 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 15 -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | setup: 2 | npm_config_yes=true npx shx cp -u infra/.env.example infra/.env 3 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash 4 | . ${NVM_DIR}/nvm.sh && nvm use 5 | yarn setup 6 | up: 7 | docker-compose -f infra/docker-compose.yml --env-file infra/.env up -d 8 | stop: 9 | docker-compose -f infra/docker-compose.yml stop 10 | down: 11 | docker-compose -f infra/docker-compose.yml down --remove-orphans 12 | restart: 13 | @make down 14 | @make up 15 | destroy: 16 | @make down 17 | docker volume rm infra_frourio_demo_db 18 | -------------------------------------------------------------------------------- /apps/admin/__tests__/__mocks__/fileMock.js: -------------------------------------------------------------------------------- 1 | module.exports = 'test-file-stub'; 2 | -------------------------------------------------------------------------------- /apps/admin/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['next/babel'], 3 | overrides: [{ 4 | include: [ 5 | /@fullcalendar/, 6 | /@frourio-demo/, 7 | ], 8 | plugins: [ 9 | ['babel-plugin-transform-require-ignore', { 10 | extensions: ['.css'], 11 | }], 12 | ], 13 | }], 14 | }; 15 | -------------------------------------------------------------------------------- /apps/admin/components/Layout/Footer.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | import { memo } from 'react'; 3 | import { makeStyles, createStyles, Theme } from '@material-ui/core/styles'; 4 | 5 | const useStyles = makeStyles((theme: Theme) => createStyles({ 6 | footer: { 7 | width: '100%', 8 | }, 9 | wrap: { 10 | display: 'flex', 11 | padding: '1rem', 12 | background: theme.palette.primary.main, 13 | color: theme.palette.primary.contrastText, 14 | alignItems: 'center', 15 | justifyContent: 'center', 16 | }, 17 | })); 18 | 19 | const Footer: FC = memo(() => { 20 | const classes = useStyles(); 21 | 22 | return ; 27 | }); 28 | 29 | Footer.displayName = 'Footer'; 30 | export default Footer; 31 | -------------------------------------------------------------------------------- /apps/admin/components/admins/RenderRoles.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | import type { Model } from '~/components/DataTable'; 3 | import { memo } from 'react'; 4 | import { Chip } from '@material-ui/core'; 5 | import { makeStyles } from '@material-ui/core/styles'; 6 | 7 | const useStyles = makeStyles({ 8 | chip: { 9 | margin: '2px 1px', 10 | }, 11 | }); 12 | 13 | type Props = { 14 | rowData: Partial; 15 | }; 16 | 17 | const RenderRoles: FC = memo(({ rowData }: Props) => { 18 | const classes = useStyles(); 19 | 20 | return
21 | {rowData['roles'].map(role => )} 22 |
; 23 | }); 24 | 25 | RenderRoles.displayName = 'RenderRoles'; 26 | export default RenderRoles; 27 | -------------------------------------------------------------------------------- /apps/admin/hooks/useDarkMode.ts: -------------------------------------------------------------------------------- 1 | import type { ThemeColor } from '~/types'; 2 | import { useCallback } from 'react'; 3 | import { useStoreContext, useDispatchContext } from '~/store'; 4 | import useLocalStorage from '@technote-space/use-local-storage'; 5 | import useMediaQuery from '@material-ui/core/useMediaQuery'; 6 | 7 | const useDarkMode = (): [ThemeColor, () => void, (value: boolean) => void] => { 8 | const { dispatch } = useDispatchContext(); 9 | const { localStorage } = useStoreContext(); 10 | const [enabledState, setEnabledState] = useLocalStorage('dark-mode-enabled', useMediaQuery('(prefers-color-scheme: dark)'), { 11 | storage: localStorage, 12 | onChanged: (key, value) => { 13 | dispatch({ type: 'LOCAL_STORAGE_CHANGED', key, value }); 14 | }, 15 | }); 16 | const toggleEnabledState = useCallback(() => { 17 | setEnabledState(!enabledState); 18 | }, [enabledState]); 19 | return [enabledState ? 'dark' : 'light', toggleEnabledState, setEnabledState]; 20 | }; 21 | 22 | export default useDarkMode; 23 | -------------------------------------------------------------------------------- /apps/admin/hooks/useFetch.ts: -------------------------------------------------------------------------------- 1 | import type { Dispatch, SwrApiType, SwrApiOptions, SwrApiResponse, SwrFallbackType } from '@frourio-demo/types'; 2 | import type { SWRResponse } from 'swr'; 3 | import useAspidaSWR from '@aspida/swr'; 4 | import { handleAuthError } from '~/utils/api'; 5 | import type { MaybeUndefined } from '@frourio-demo/types'; 6 | 7 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 8 | const useFetch = , F extends SwrFallbackType>(dispatch: Dispatch, fallback: F, api: API, ...option: SwrApiOptions): SwrApiResponse | SWRResponse, any> | never => useAspidaSWR({ 9 | $get: option => handleAuthError(dispatch, fallback, api.get, option), 10 | $path: api.$path, 11 | } as API, ...option); 12 | 13 | export default useFetch; 14 | -------------------------------------------------------------------------------- /apps/admin/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | -------------------------------------------------------------------------------- /apps/admin/next.config.js: -------------------------------------------------------------------------------- 1 | const withTranspileModules = require('next-transpile-modules')([ 2 | '@fullcalendar', 3 | '@frourio-demo', 4 | ]); 5 | const withBundleAnalyzer = require('@next/bundle-analyzer')({ 6 | enabled: process.env.ANALYZE === 'true', 7 | }); 8 | 9 | module.exports = withBundleAnalyzer(withTranspileModules({ 10 | webpack5: false, 11 | assetPrefix: process.env.CI ? '/frourio-demo/admin' : '', 12 | env: { 13 | FRONT_URL: process.env.FRONT_URL, 14 | LOCK_URL: process.env.LOCK_URL, 15 | }, 16 | async rewrites() { 17 | return [ 18 | { 19 | source: '/:any*', 20 | destination: '/', 21 | }, 22 | ]; 23 | }, 24 | webpack: (config) => { 25 | // remove unused packages 26 | // https://github.com/mbrn/material-table/issues/2164#issuecomment-692525181 27 | config.module.rules.push({ 28 | test: /jspdf|moment/, // material-table => jspdf, chart.js => moment 29 | loader: 'null-loader', 30 | }); 31 | 32 | return config; 33 | }, 34 | })); -------------------------------------------------------------------------------- /apps/admin/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import type { FC, PropsWithChildren } from 'react'; 2 | import type { AppProps } from 'next/app'; 3 | import CssBaseline from '@material-ui/core/CssBaseline'; 4 | import Head from '~/components/Head'; 5 | import { StoreContextProvider } from '~/store'; 6 | 7 | const SafeHydrate: FC = ({ children }: PropsWithChildren<{}>) => { 8 | return ( 9 |
10 | {typeof window === 'undefined' ? null : children} 11 |
12 | ); 13 | }; 14 | 15 | const MyApp = ({ Component, pageProps }: PropsWithChildren) => 16 | 17 | 18 | 19 | 20 | 21 | ; 22 | 23 | export default MyApp; 24 | -------------------------------------------------------------------------------- /apps/admin/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import NextDocument, { Html, Head, Main, NextScript } from 'next/document'; 2 | 3 | export default class Document extends NextDocument { 4 | render() { 5 | return 6 | 7 | 8 |
9 | 10 | 11 | ; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/admin/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/technote-space/frourio-demo/8a0e82e8347375953cc9c857ed8777331f50afdb/apps/admin/public/favicon.png -------------------------------------------------------------------------------- /apps/admin/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "include": [ 4 | "next-env.d.ts", 5 | "**/*.ts", 6 | "**/*.tsx" 7 | ], 8 | "exclude": [ 9 | "node_modules" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /apps/admin/types/html.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.html' { 2 | const content: string; 3 | export default content; 4 | } 5 | -------------------------------------------------------------------------------- /apps/admin/utils/license.ts: -------------------------------------------------------------------------------- 1 | import { processLicenses } from '@frourio-demo/utils/license'; 2 | import licenses from '../license.json'; 3 | 4 | export const getLicenseList = () => processLicenses(licenses); 5 | -------------------------------------------------------------------------------- /apps/front/.gitignore: -------------------------------------------------------------------------------- 1 | *.pem 2 | -------------------------------------------------------------------------------- /apps/front/_pages/contact.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | import { memo } from 'react'; 3 | import { Box, Heading, Icon } from '@chakra-ui/react'; 4 | import { IoMdConstruct } from 'react-icons/io'; 5 | 6 | const Contact: FC = memo(() => { 7 | return 8 | お問い合わせ 9 | 工事中... 10 | ; 11 | }); 12 | 13 | Contact.displayName = 'Contact'; 14 | export default Contact; 15 | -------------------------------------------------------------------------------- /apps/front/_pages/facility.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | import { memo } from 'react'; 3 | import { Box, Image } from '@chakra-ui/react'; 4 | 5 | const Facility: FC = memo(() => { 6 | return 7 | 8 | 9 | 10 | 11 | ; 12 | }); 13 | 14 | Facility.displayName = 'Facility'; 15 | export default Facility; 16 | -------------------------------------------------------------------------------- /apps/front/_pages/info.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | import { memo } from 'react'; 3 | import { Box, Heading, Icon } from '@chakra-ui/react'; 4 | import { IoMdConstruct } from 'react-icons/io'; 5 | 6 | const Info: FC = memo(() => { 7 | return 8 | お知らせ 9 | 工事中... 10 | ; 11 | }); 12 | 13 | Info.displayName = 'Info'; 14 | export default Info; 15 | -------------------------------------------------------------------------------- /apps/front/_pages/meal.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | import { memo } from 'react'; 3 | import { Box, Image } from '@chakra-ui/react'; 4 | 5 | const Meal: FC = memo(() => { 6 | return 7 | 8 | 9 | 10 | 11 | ; 12 | }); 13 | 14 | Meal.displayName = 'Meal'; 15 | export default Meal; 16 | -------------------------------------------------------------------------------- /apps/front/_pages/privacy.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | import { memo } from 'react'; 3 | import { Box, Heading, Icon } from '@chakra-ui/react'; 4 | import { IoMdConstruct } from 'react-icons/io'; 5 | 6 | const Privacy: FC = memo(() => { 7 | return 8 | プライバシーポリシー 9 | 工事中... 10 | ; 11 | }); 12 | 13 | Privacy.displayName = 'Privacy'; 14 | export default Privacy; 15 | -------------------------------------------------------------------------------- /apps/front/_pages/terms.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | import { memo } from 'react'; 3 | import { Box, Heading, Icon } from '@chakra-ui/react'; 4 | import { IoMdConstruct } from 'react-icons/io'; 5 | 6 | const Terms: FC = memo(() => { 7 | return 8 | 利用規約 9 | 工事中... 10 | ; 11 | }); 12 | 13 | Terms.displayName = 'Terms'; 14 | export default Terms; 15 | -------------------------------------------------------------------------------- /apps/front/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['next/babel'], 3 | overrides: [{ 4 | include: [ 5 | /@fullcalendar/, 6 | /@frourio-demo/, 7 | /slick-carousel/, 8 | ], 9 | plugins: [ 10 | ['babel-plugin-transform-require-ignore', { 11 | extensions: ['.css'], 12 | }], 13 | ], 14 | }], 15 | }; 16 | -------------------------------------------------------------------------------- /apps/front/components/Layout/Footer.tsx: -------------------------------------------------------------------------------- 1 | import type { FC } from 'react'; 2 | import { memo } from 'react'; 3 | import { Link as RouterLink } from 'react-router-dom'; 4 | import { Flex, Box, Text, Link } from '@chakra-ui/react'; 5 | 6 | const Footer: FC = memo(() => { 7 | return 8 | 9 | 利用規約 10 | プライバシーポリシー 11 | お問い合わせ 12 | 13 | 14 | 15 | {(new Date()).getFullYear()} — Frourioの宿 16 | 17 | 18 | ; 19 | }); 20 | 21 | Footer.displayName = 'Footer'; 22 | export default Footer; 23 | -------------------------------------------------------------------------------- /apps/front/components/Layout/index.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactNode } from 'react'; 2 | import { memo } from 'react'; 3 | import Header from './Header'; 4 | import Footer from './Footer'; 5 | import { Flex } from '@chakra-ui/react'; 6 | 7 | type Props = { 8 | children?: ReactNode 9 | } 10 | 11 | const Layout = memo(({ children }: Props) => 18 |
19 | 20 |
21 | {children} 22 |
23 |
24 |