На прошлой неделе я занялся последним промежуточным фронтенд-проектом, который включал создание TwitchTv-приложения с использованием Twitch API для отображения статуса набора Twitch Streamers.

Это были пользовательские истории для этого проекта:

  1. Пользователи могут видеть, транслируется ли Free Code Camp в настоящее время на Twitch.tv.
  2. Пользователи могут щелкнуть вывод статуса и быть отправлены прямо на канал Twitch.tv Free Code Camp.
  3. Если стример Twitch в настоящее время ведет потоковую передачу, пользователи могут видеть дополнительные сведения о том, что они транслируют.
  4. Пользователи увидят уведомление-заполнитель, если стример закрыл свою учетную запись Twitch (или учетная запись никогда не существовала).

Дизайн

Дизайн моего приложения очень похож на пример приложения, приведенный в описании проекта.

Единственное существенное отличие - это ввод для поиска в верхней части страницы, который я поместил туда для пятой пользовательской истории (подробнее об этом ниже).

Я использовал Skeleton, чтобы помочь с базовым стилем и адаптивностью, поэтому все выглядит хорошо на настольных компьютерах и мобильных устройствах.

Для изображений профиля я использовал фоновые изображения вместо тегов ‹img›. Это связано с тем, что простая установка размера фона для покрытия позволяет изображению масштабироваться до размеров контейнера независимо от его размеров.

Это то, что я узнал во время работы над проектом Генератор случайных цитат, и было приятно снова применить это на практике здесь.

Мыслительный процесс

Сначала я создал массив Twitch Streamers и использовал цикл for для перебора массива и выполнения последовательных запросов AJAX, чтобы я мог получать данные для каждого стримера.

var twitchStreamers = ["dreamhackcs", "skyzhar", "freecodecamp", "faceittv", "comster404", "brunofin", "terakilobyte", "robotcaleb", "sheevergaming", "esl_sc2", "ogamingsc2", "jacksofamerica"];
...
for (var i = 0; i < twitchStreamers.length; i++) {
        ajax();
}
...
function ajax () {
        $.ajax({
            url: "https://api.twitch.tv/kraken/streams/" + twitchStreamers[i] + "?callback=?",
            dataType: "jsonp",
            data: {
                format: "json"
            },
            success: function (data) {
                fetchData(data);
            },
            error: function () {
                console.log("unable to access json");
            }
        });
    }

Если запрос AJAX выполнен успешно, он вызывает другую функцию fetchData (), которая просто извлекает необходимые данные из вывода JSON, такие как имя пользователя, статус, URL-адрес и отображаемое изображение для каждого канала, и вызывает updateHTML (), которая просто берет данные и обновляет DOM.

function fetchData (data) {
        if (data.stream === null) {
            url = data._links.channel.substr(38);
            updateOfflineUsers();
        }
        else if (data.status == 422 || data.status == 404) {
            status = data.message;
            updateHTML(".unavailable");
        }
        else {
            if (data.stream.channel.logo !== null) {
                picture = 'url("' + data.stream.channel.logo + '")';
            }
            else {
                picture = 'url("https://cdn.rawgit.com/ayoisaiah/freeCodeCamp/master/twitch/images/placeholder-2.jpg")';
            }
            url = data._links.channel.substr(38);
            status = "<a href='https://twitch.tv/" + url + "' target='_blank'" + "'>" + data.stream.channel.display_name +  "</a>" + " is currently streaming " + data.stream.game;
            updateHTML(".online");
        }
    }

Для офлайн-стримеров был дополнительный шаг. Мне пришлось сделать еще один вызов API, используя https://api.twitch.tv/kraken/channels/, чтобы получить данные для каждого канала, потому что первый вызов (с использованием https://api.twitch.tv/kraken/streams /) Не предоставил никакой информации об офлайн-стримерах, за исключением того факта, что они не были активны в тот момент.

function updateOfflineUsers () { //If users are offline, make new ajax request to find user info
        $.ajax({
            url: "https://api.twitch.tv/kraken/channels/" + url,
            dataType: "jsonp",
            data: {format: "json"},
            success: function (json) {
                status = "Channel " + "'<a href='" + json.url + "' target='_blank'" + "'>" + json.display_name + "</a>'" + " is currently offline";
                if (json.logo !== null) {
                    picture = 'url("' + json.logo + '")';
                }
                else {
                    picture = 'url("https://cdn.rawgit.com/ayoisaiah/freeCodeCamp/master/twitch/images/placeholder-2.jpg")';
                }
                updateHTML(".offline");
            }
        });
    }

Как только я их разместил, четыре пользовательских истории были завершены, и я был готов к работе. На этом этапе я пометил проект как завершенный, но вскоре подумал, что было бы здорово немного расширить функциональность приложения.

Это было тогда, когда я добавил пятую пользовательскую историю:

  • Пользователи могут искать стримеров TwitchTv и видеть, в сети они или нет.

Итак, я создал функцию поиска, которая принимает данные пользователя и использует их для вызова API:

function search () {
        $(".online, .offline, .unavailable").empty();
        showAll();  
        var searchQuery = $(".search-twitch").val();
        var user = searchQuery.replace(/[^A-Z0-9_]/ig, "");
        $.ajax({
            url: "https://api.twitch.tv/kraken/streams/" + user,
            dataType: "jsonp",
            data: {
                format: "json"
            },
            success: function (data) {
                fetchData(data);                    
            }
        });
    }

Я использовал немного регулярного выражения, чтобы удалить специальные символы и пробелы из пользовательского запроса, оставив только цифры, буквы и символы подчеркивания. Я думаю, это важно, потому что Twitch не допускает использование специальных символов (таких как $, &, e.t.c) или пробелов в именах пользователей, поэтому было необходимо их отфильтровать.

Также помогает то, что если пользователь ищет что-то вроде «лагеря свободного кода» (разделение целых слов пробелами) вместо «freecodecamp», он все равно возвращает ожидаемый релевантный результат.

Вот и все для этого проекта. Вы можете просмотреть финальную версию на Codepen.

Ключевые выводы

Даже сейчас, когда я пишу этот пост в блоге, мне приходят в голову несколько способов улучшить взаимодействие с пользователем в моем приложении, поэтому мой ключевой вывод из этого проекта:

Программное обеспечение никогда не бывает законченным. Это процесс, и он постоянно развивается.

Что дальше

Прямо сейчас я очень стараюсь закончить раздел Промежуточные сценарии алгоритмов на FCC в ближайшие пару дней, чтобы я мог быстро перейти к разделу Расширенный алгоритм.

Моей (краткосрочной) целью остается получение Front-End Certification к концу мая, и если все пойдет хорошо, я смогу получить ее к тому времени. Пожелай мне удачи.

Если вы хотите связаться со мной или связаться со мной, вы можете найти меня в Twitter или напишите мне по электронной почте. Версия этого поста опубликована в моем личном блоге.