ОБНОВЛЕНИЕ 2018: Вышло второе издание (современный код и версии пакетов, данное издание УСТАРЕЛО)
На канале так же проводятся бесплатные вебинары, публикуются переводы и авторские материалы, присоединяйтесь!
Взаимодействуем с VK
Чтобы работать с VK API вам необходимо будет создать приложение на сайте vk.com, и указать в настройках URL сервера, с которого вы будете выполнять запросы.
Localhost не поддерживается.
Интеграция VK API
Необходимо добавить скрипт openapi перед нашей сборкой - bundle.js, а так же вызвать VK.init
Сейчас если кликнуть на "войти" - всплывет VK окно с подтверждением прав доступа (первый раз). После подтверждения прав, вместо кнопки войти появляется надпись "Привет, ХХХ". При перезагрузке сайта и повторных нажатиях на "войти" - VK окно мгновенно закрывается, а кнопка вновь изменяется на "Привет, XXX". Неплохо бы было проверять "статус", например в componentWillMount, но оставлю это на "домашку".
Как всегда, доблестный логгер пишет в консоли - что происходит.
Загрузка фото
Нам нужно практически повторить, все что написано выше, только для блока Page.
Можете попробовать сами, используя метод photos.getAll из VK API.
import {
GET_PHOTOS_REQUEST,
GET_PHOTOS_FAIL,
GET_PHOTOS_SUCCESS
} from '../constants/Page'
let photosArr = []
let cached = false
function makeYearPhotos(photos, selectedYear) {
let createdYear, yearPhotos = []
photos.forEach((item) => {
createdYear = new Date(item.created*1000).getFullYear()
if (createdYear === selectedYear ) {
yearPhotos.push(item)
}
})
yearPhotos.sort((a,b) => b.likes.count-a.likes.count);
return yearPhotos
}
function getMorePhotos(offset, count, year, dispatch) {
VK.Api.call('photos.getAll', {extended:1, count: count, offset: offset},(r) => { // eslint-disable-line no-undef
try {
if (offset <= r.response[0] - count) {
offset+=200;
photosArr = photosArr.concat(r.response)
getMorePhotos(offset,count,year,dispatch)
} else {
let photos = makeYearPhotos(photosArr, year)
cached = true
dispatch({
type: GET_PHOTOS_SUCCESS,
payload: photos
})
}
}
catch(e) {
dispatch({
type: GET_PHOTOS_FAIL,
error: true,
payload: new Error(e)
})
}
})
}
export function getPhotos(year) {
return (dispatch) => {
dispatch({
type: GET_PHOTOS_REQUEST,
payload: year
})
if (cached) {
let photos = makeYearPhotos(photosArr, year)
dispatch({
type: GET_PHOTOS_SUCCESS,
payload: photos
})
} else {
getMorePhotos(0,200,year,dispatch)
}
}
}
makeYearPhotos и getMorePhotos можно вынести в папку utils, как вспомогательные функции.
Главное здесь, что мы по прежнему вызываем действия (dispatch actions). Все так, как было в самом начале, просто добавилось немного больше логики для получения фото. Алгоритм получения всех фото (да и необходимость получения всех) - оставляю без комментариев. Мне кажется, это приемлемый способ.
Чтобы потестировать показ ошибок, достаточно просто исправить цифру 200 на 2 или 20. VK с любовью вам ответит, что вы мягко-говоря, очень настойчиво обращаетись к API ;)
Исправив редьюсер и отрисовку в компоненте, мы закончим начатое.