An open API service indexing awesome lists of open source software.

https://github.com/satansdeer/loftschool-react-final-project


https://github.com/satansdeer/loftschool-react-final-project

Last synced: 2 months ago
JSON representation

Awesome Lists containing this project

README

        

# Финальный проект

![taxi app](/taxi.png)

Вам предстоит самостоятельно написать приложение для заказа такси.

[Пример приложения](https://pensive-gates-d31754.netlify.com/)

Логин: [email protected]
Пароль: 123123

## Работа с сервером

Для получения данных о маршруте и списка доступных адресов - вы можете использовать [сервер](https://loft-taxi.glitch.me/).

Так же на сервере реализована простейшая система авторизации с захардкоженными данными.

### Доступные запросы

- `/auth` - позволяет авторизоваться ([email protected] / 123123)
- `/route` - возвращает список точек для маршрута
- `/addressList` - возвращает список доступных адресов

Более подробное описание на странице [сервера](https://loft-taxi.glitch.me/).

Для сервера использован сервис [glitch](https://glitch.com/), так что вы можете взять существующий сервис за основу, сделать его ремикс и улучшить на своё усмотрение. Например добавить регистрацию и хранение данных пользователя.

## Работа с картой

Для работы с картой предлагается использовать сервис [mapbox](https://www.mapbox.com/). Он предоставляют библиотеку для Javascript, её довольно удобно использовать для отображения карты и маршрутов на ней.

[Документация для Jаvascript библиотеки](https://docs.mapbox.com/mapbox-gl-js/api/)

Для работы с картой вам потребуется зарегистрироваться на [mapbox](https://www.mapbox.com) и получить токен.

### Пример использования карты в приложении

```jsx
export default class Map extends Component {
map = null;
mapContainer = React.createRef();

componentDidMount() {
mapboxgl.accessToken = "ВАШ ТОКЕН С mapbox";
this.map = new mapboxgl.Map({
container: this.mapContainer.current,
style: "mapbox://styles/mapbox/streets-v9",
center: [30.2656504, 59.8029126],
zoom: 15
});
}

componentWillUnmount() {
this.map.remove();
}

render() {
return

;
}
}
```

Так же вам потребуются методы [map.flyTo](https://docs.mapbox.com/mapbox-gl-js/api/#map#flyto) и [map.addLayer](https://docs.mapbox.com/mapbox-gl-js/api/#map#addlayer).

## Работа со стилями

Для реализации приложения предлагается использовать библиотеку компонентов.

Я рекомендую использовать [Material UI](https://material-ui.com/). Именно эта библиотека была использована для демо.

Помимо неё есть множество других библиотек компонентов:

- [semantic-ui](https://react.semantic-ui.com/introduction)
- [ant.design](https://ant.design/docs/spec/introduce)
- [lihtning design](https://www.lightningdesignsystem.com/)
- [grommet](http://grommet.io/)
- [primer](https://primer.github.io/) - библотека компонентов на базе дизайн системы гитхаба.
- [purecss](https://purecss.io/)
- [foundation](https://foundation.zurb.com/)
- [clarity](https://vmware.github.io/clarity/)

## Задачи

Необходимо реализовать приложение со следующим функционалом:

- Как пользователь:

- Я могу авторизоваться в приложении
- При неверном логине или пароле я получу ошибку валидации
- При попытке перейти на любую страницу кроме `/login` я буду перенаправлен обратно на страницу `/login`

- Как авторизованный пользователь:

- Я имею доступ к странице с картой (`/map`)
- При незаполненных платёжных данных на странице карты я вижу сообщение о необходимости их заполнить и ссылку на профиль.
- Я имею доступ к странице профиля (`/profile`)
- На странице профиля (`/profile`) я могу указать данные банковской карты

- Поля `cardName`, `cardNumber`, `expDate`, `cvv` обязательны для заполнения
- Поле `cardName` может содержать только буквы латинского алфавита
- Поле `cardNumber` может содержать только цифры и должно иметь длину 8 символов.
- Поле `expDat` должно иметь формат даты
- Поле `CVV` может содержать только цифры. Состоит из 3 символов.
- Я получаю оповещение при успешном сохранении данных карты.

- Я могу выйти из аккаунта нажав кнопку "Выйти".

- Как авторизованный пользователь с указанными платёжными данными:
- На странице с картой я могу выбрать адрес отправления и прибытия из списка доступных.
- При указанных адресах отправления и прибытия я могу нажать на кнопку "Выполнить заказ".
- Карта переместится к точке отправления.
- Будет построен маршрут от адреса отправления к адресу прибытия.
- Я получу сообщение об успешно выполненном заказе.
- Мне будет доступна кнопка выполнения нового заказа.

## Условия выполнения

- Необходимо реализовать приложение используя библиотеку ReactJS.
- Для управлением состоянием приложения должен быть использован Redux.
- Сайд-эффекты могут быть реализованы с помощью [Redux Saga](https://github.com/redux-saga/redux-saga) либо [Redux Thunk](https://github.com/reduxjs/redux-thunk), в крайнем случае с помощью **middleware**.

### Бонусные условия

- Код редьюсеров покрыт тестами.
- Сайд эффекты покрыты тестами.
- Если в компоненте есть логика - она протестирована.