└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Image Feed 2 | 3 | # Ссылки 4 | 5 | - [Дизайн в Figma](https://www.figma.com/design/MujlanK7BDoQRrGci5G6pi/Image-Feed) 6 | - [Unsplash API](https://unsplash.com/documentation) 7 | 8 | # Назначение и цели приложения 9 | 10 | Многостраничное приложение предназначено для просмотра изображений через API Unsplash. 11 | 12 | Цели приложения: 13 | 14 | - Просмотр бесконечной ленты картинок из Unsplash Editorial. 15 | - Просмотр краткой информации из профиля пользователя. 16 | 17 | # Краткое описание приложения 18 | 19 | - В приложении обязательна авторизация через OAuth Unsplash. 20 | - Главный экран состоит из ленты с изображениями. Пользователь может просматривать ее, добавлять и удалять изображения из избранного. 21 | - Пользователи могут просматривать каждое изображение отдельно и делиться ссылкой на них за пределами приложения. 22 | - У пользователя есть профиль с избранными изображениями и краткой информацией о пользователе. 23 | - У приложения есть две версии: расширенная и базовая. В расширенной версии добавляется механика избранного и возможность лайкать фотографии при просмотре изображения на весь экран. 24 | 25 | # Нефункциональные требования 26 | 27 | ## Технические требования 28 | 29 | 1. Авторизация работает через OAuth Unsplash и POST запрос для получения Auth Token. 30 | 2. Лента реализована с помощью UITableView. 31 | 3. В приложении использованы UImageView, UIButton, UILabel, TabBarController, NavigationController, NavigationBar, UITableView, UITableViewCell. 32 | 4. Приложение должно поддерживать устройства iPhone с iOS 13 или выше, предусмотрен только портретный режим. 33 | 5. Все шрифты в приложении — системные, не нужно их скачивать; в Interface Builder это шрифт «System» в выпадающем списке, а при вёрстке из кода — [`systemFont(ofSize:weight:)`](https://developer.apple.com/documentation/uikit/uifont/1619027-systemfont). В текущих версиях iOS (13—16) системный шрифт — это шрифт `SF Pro`, но в будущих версиях он может поменяться. 34 | 35 | # Функциональные требования 36 | 37 | # Авторизация через OAuth 38 | 39 | Для входа в приложение пользователь должен авторизоваться через OAuth. 40 | 41 | **Экран авторизации содержит:** 42 | 43 | 1. Логотип приложения 44 | 2. Кнопку «Войти» 45 | 46 | **Алгоритмы и доступные действия:** 47 | 48 | 1. При входе в приложение пользователь видит splash-screen; 49 | 2. После загрузки приложения открывается экран с возможностью авторизации; 50 | 1. При нажатии на кнопку «Войти» открывается браузер на странице авторизации Unsplash; 51 | 1. При нажатии на кнопку «Login» браузер закрывается. В приложении появляется экран загрузки; 52 | 2. Если авторизация через OAuth Unsplash не настроена, по нажатию на кнопку логина ничего не происходит; 53 | 3. Если авторизация через OAuth Unsplash настроена не корректно — пользователь не сможет войти в приложение; 54 | 4. При неудачной попытке входа всплывает модальное окно с ошибкой; 55 | 1. При нажатии на «ОК» пользователь переходит обратно на экран авторизации; 56 | 5. Если авторизация прошла успешно, то браузер закрывается. В приложении открывается экран с лентой. 57 | 58 | ## Просмотр ленты 59 | 60 | В ленте пользователь может просматривать изображения в ленте, переходить к просмотру отдельного изображения и добавлять их в избранное. 61 | 62 | **Экран ленты содержит:** 63 | 64 | 1. Карточку с изображением; 65 | 1. Кнопку Лайк; 66 | 2. Дата загрузки фотографии; 67 | 2. Таб бар для навигации между лентой и профилем. 68 | 69 | **Алгоритмы и доступные действия:** 70 | 71 | 1. Экран с лентой открывается по умолчанию после входа в приложение; 72 | 2. Лента содержит изображения из Unsplash Editorial; 73 | 3. При скролле вниз и вверх пользователь может просматривать ленту; 74 | 1. Если изображение не успело загрузиться, то пользователю отображается системный лоадер; 75 | 2. Если изображение невозможно загрузить – пользователь видит плэйсхолдер вместо изображения; 76 | 4. При нажатии на кнопку Лайк (серое сердечко) пользователь может лайнкуть изображение. После нажатия отображается лоадер: 77 | 1. Если запрос успешный, то лоадер пропадает, иконка меняет состояние на Кнопку Красный Лайк (красное сердечко). 78 | 2. Если запрос не успешный, то всплывает модальное окно с ошибкой «попробуйте еще раз» 79 | 5. Пользователь может убрать лайк, повторно нажав на кнопку Лайк (красное сердечко). После нажатия отображается лоадер: 80 | 1. Если запрос успешный, то лоадер пропадает, иконка меняет состояние на серое сердечко. 81 | 2. Если запрос не успешный, то всплывает модальное окно с ошибкой «попробуйте еще раз»; 82 | 6. При нажатии на карточку с изображением оно увеличится до границ телефона и пользователь перейдет на экран просмотра изображения (раздел «Просмотр изображения на весь экран»); 83 | 7. При нажатии на иконку профиля пользователь может перейти в профиль; 84 | 8. Пользователь может переключаться между экранами ленты и профиля с помощью таб бара. 85 | 86 | ## Просмотр изображения на весь экран 87 | 88 | Из ленты пользователь может перейти к просмотру изображения на весь экран и поделиться им. 89 | 90 | **Экран содержит:** 91 | 92 | 1. Увеличенное изображение до границ телефона; 93 | 2. Кнопку возврата на предыдущий экран; 94 | 3. Кнопку для загрузки изображения и с возможностью им поделиться. 95 | 96 | **Алгоритмы и доступные действия:** 97 | 98 | 1. При открытии изображения на весь экран пользователь видит растянутое изображение до границ экрана. Изображение выровнено по центру; 99 | 1. Если изображение невозможно загрузить и показать – пользователь видит плэйсхолдер; 100 | 2. Если ответ на запрос не получен — появляется системный алерт с ошибкой; 101 | 2. При нажатии на кнопку Назад пользователь может вернуться на экран просмотра ленты; 102 | 3. При помощи жестов пользователь может перемещаться по растянутому изображению, зумировать и поворачивать изображение. Изображение фиксируется в выбранном положении; 103 | 1. Если не настроены жесты для увеличения или поворота изображения — эти действия будут не доступны; 104 | 4. При нажатии на кнопку кнопку Поделиться всплывает системное меню, в котором пользователь может загрузить изображение или поделиться им; 105 | 1. После совершения действия меню скрывается; 106 | 2. Пользователь может закрыть меню свайпом вниз или при нажатии на крестик; 107 | 3. Если открытие системного меню при нажатии на кнопку “загрузить или поделиться изображением” не настроено — оно не будет показываться; 108 | 109 | ## Просмотр профиля пользователя 110 | 111 | Пользователь может перейти в свой профиль, чтобы посмотреть данные профиля или выйти из него. 112 | 113 | **Экран профиля содержит:** 114 | 115 | 1. Данные профиля; 116 | 1. Фотографию пользователя; 117 | 2. Имя и username пользователя; 118 | 3. Информация о себе; 119 | 2. Кнопку выхода из профиля; 120 | 3. Таб бар; 121 | 122 | **Алгоритмы и доступные действия:** 123 | 124 | 1. Данные профиля загружаются из профиля в Unsplash. Данные профиля нельзя изменить в приложении; 125 | 1. Если данные профиля не подтянулись из Unsplash, то пользователь видит плэйсхолдер вместо аватрки. Username и имя не отображаются; 126 | 2. При нажатии на кнопку выхода из профиля (логаут) пользователь может выйти из приложения. Всплывает системный алерт с подтверждением выхода; 127 | 1. Если пользователь нажимает «Да», то он разлогинивается и открывается экран авторизации; 128 | 1. Если не настроены или настроены неправильно действия с кнопкой «Да», то при нажатии пользователя не разлогинивается и попадает на экран авторизации; 129 | 2. Если пользователь нажимает «Нет», то он возвращается на экран профиля; 130 | 3. Если алерт не настроен, то при нажатии на кнопку выходы ничего не происходит, пользователь не может разлогиниться; 131 | 3. Пользователь может переключаться между экранами ленты и профиля с помощью таб бара. 132 | 133 | # Расширенная версия 134 | 135 | ## Добавление изображения в избранное 136 | 137 | В расширенной версии приложения при нажатии на лайк пользователь добавляет изображение в избранное. Избранное отображается в профиле пользователя. 138 | 139 | 1. При нажатии на кнопку Лайк (серое сердечко) приложение делает запрос на добавление изображения в избранное (не показывая индикатор загрузки). При успешном запросе иконка меняет состояние и изображение добавляется в избранное; 140 | 1. Если запрос на лайк неуспешный, то иконка не меняет свое состояние. Изображение в избранное не добавляется; 141 | 2. Если запрос на добавление в избранное неуспешный, то иконка не меняет свое состояние. Лайк не ставится; 142 | 2. При повторном нажатии на кнопку Лайк (красное сердечко) пользователь может удалить изображение из избранного; 143 | 1. Если запрос на удаление лайка неуспешный, то иконка не меняет свое состояние. Изображение не удаляется из избранного; 144 | 2. Если запрос на удаление изображения из избранного неуспешный, то иконка не меняет свое состояние. Лайк не удаляется; 145 | 3. Пользователь может добавить изображение в избранное при просмотре изображения на весь экран. В расширенной версии добавляется иконка лайка; 146 | 4. Пользователь может просмотреть избранное в профиле. Избранное отображается под данными пользователя. 147 | 1. Рядом с заголовком «Избранное» отображается счетчик количества изображений; 148 | 2. При скролле вниз и вверх пользователь может просматривать ленту с избранными фотографиями. Данные профиля не зафиксированы и скрываются при скролле; 149 | 1. Если изображение не успело загрузиться, то пользователю отображается системный лоадер; 150 | 2. Если изображение невозможно загрузить – пользователь видит плэйсхолдер вместо изображения; 151 | 3. Если фотографии отсутствуют, то пользователь видит плэйсхолдер; 152 | 3. При нажатии на кнопку Лайк пользователь может удалить изображение из избранного. В основной ленте лайк тоже удалится; 153 | 4. Пользователь может просмотреть изображение на весь экран; 154 | --------------------------------------------------------------------------------