Skip to content

Приложение для получения текущих астероидов и их «уничтожения»

Notifications You must be signed in to change notification settings

nmgix/nasaNeoWs

Repository files navigation

Тестовое задание 'ARMAGGEDON V2' от Kvartirka

Как запустить

  1. Настроить .env.local с апи ключом, пример файла
    ASTEROID_URL = http:https://www.neowsapp.com/rest/v1/neo
    API_KEY = CURRENT_API_KEY

    ASTEROIDS_URL = https://api.nasa.gov/neo/rest/v1

    APOD_URL = https://api.nasa.gov/planetary/apod

    DAYS_PER_REQUEST=3
  1. npm run start | npm run dev для приложения
  2. npm run styles для перебилда стилей при изменении
  3. npm run test для cypress тестов

Что осталось сделать [45/48]

  1. Страницы

    1. Главная страница
      1. Пк версия
      2. Мобильная версия
    2. Страница заказа уничтожения астероидов
      1. Пк версия
      2. Мобильная версия
    3. Страница описания астероида
      1. Пк версия
      2. Мобильная версия
  2. Компоненты

    1. Частоиспользуемые компоненты
      1. Кнопка ( + стилизация под <a>)
      2. Чекбокс
      3. ScrollableView
      4. Компонент svg-иконок

        <Image> с svg

      5. Контекст
    2. Шапка
      1. Получение изображения дня

        не получилось использовать getInitialProps в _app т.к. после первоначального запроса, при прееходе на другую страницу происходил запрос С фронтенда с несуществующими env

      2. Переключение между астероидами и заказом
    3. Шапка контента
      1. Заголовок
        1. Опциональная дата
      2. Опции
        1. Переключение метрики расстояния (км/лунные орбиты)
        2. Опциональный чекбокс показа только потенциально опасных астероидов
      3. Опциональное использование svg-изображения угрозы астероида

        Вместо svg используется JSX.Element

    4. Карточка астероида для списка
      1. Использование svg-изображения угрозы астероида
      2. Диаметр астероида
      3. Расстояние до земли в км/лунных орбитах
      4. Опасность астероида
      5. Кнопка добавления/удаления из заказа
    5. Список астероидов
      1. Список типа "добавить в заказ"
      2. Список типа "удалить из заказа"
      3. Infinite scroll
    6. Характеристики астероида
    7. Список сближений (ScrollableView)
    8. Кнопка Отправка бригады им. Брюса Уиллиса
    9. Футер
  3. Карта svg-иконок

    Нет смысла переусложнять, всего две svg иконки, хороший пример реализации есть в 22bytetestapp-cancelled, вместо этого использую <Image> с svg

  4. (?) Разделённый контекс для разных частей логики

  5. Убрать ошибочный лоадер "нет астероидов в ..." когда они не успели подгрузиться

  6. Сохранение заказа в localStorage

  7. Покрыть тестами

  8. (?) Docker

  9. Деплой на Vercel

Комментарии

Про реалзиацию getAsteroids

date.toISOString() может поставить дату не сходящуюся с текущей локально

Про currentDate в AsteroidsGrid

-1 от текущего дня необходимо для поулчения астероидов недели исключая последний день прошлой недели

Про Set в addAsteroid внутри Context Provider

Во время написания кода я столкнулся с тем, что при добавлении астетроида в корзину у меня не менялось его состояние, но в Order дважды могло быть добавлено одно айди

Про HeaderSecondaryWrapper

При обновлении order в контексте, HeaderSecondary перерендеривался т.к. используется тот-же контекст (либо разделять контекст на несколько, либо мемоизация)

Про useEffect без зависимостей в контексте

При инициализации стейта у компонента, localStorage является не объявленным

Про setTimeout в pages/oreder

Выбрасывало варнинг Cannot update a component ('ContextProvider') while rendering a different component ('Order).

Про <iframe> в шапке

Неожиданно для меня оказалось что APOD может быть видео с Youtube

Про setLoadingMore в AsteroidsGrid

Необходим чтобы не вызвать при скролле handleAsteroids пока кол-во опасных астероидов меньше чем высота окна (пока кол-во астероидов меньше высоты окна handleAsteroids вызывается чтобы заполнить окно опасными астероидами)

Про window.scrollBy(0, -1) в AsteroidsGrid

Если при запросе астероидов не вернуло ни одного астероида (такое случается когда выставлен фильтр опасных астероидов), а скролл уже находился в самом низу, сделать подъём на 1px чтобы стриггерить функцию handleAsteroids внутри InfiniteScroll

Про id, setId в AsteroidCard.cy.tsx

Т.к. AsteroidCard в memo, он не слушает обновление is_potentially_hazardous_asteroid (оно статичное в приложении, в тестах для проверки оно динамичное)

Про handleAsteroid в /asteroids/[id].tsx

Функция нужна чтобы добавить или удалить элемент из списка, это очевидно. Эту функцию можно было поставить в контекст и оттуда вызывать, но нет. Если пользователь заходит на страницу по ссылке без предварительной загрузки астероидов, у него банально не будет этого астероида в списке всех астероидов и добавить новый в список не получится по айди из астеройдов (как по айди удаляется астероид из списка, например). Если подгружать текущий астероид в список всех, если этот астероид очень давний, он банально будет ломать списки по нумерации (идут все от, например, 22 июля, а тот астероид от 09 ферваля). Conclusion в том, что разделение функций на addAsteroid и removeAsteroid в данной ситуации является самый оптимальным решением.

Про копипаст cy.viewport в тестах

E2e тесты напрочь не хотят видеть cypress/support/e2e.ts

Про order-spec.cy.ts

Тест ведёт себя непредсказуемо, но чаще всего отрабатывает после первого провала+рестарта теста

About

Приложение для получения текущих астероидов и их «уничтожения»

Topics

Resources

Stars

Watchers

Forks

Languages