Первоначально опубликовано в моем личном блоге — PeteScript
Важнейшей частью функциональности любого веб-приложения является предоставление пользователю возможности поделиться ею — будь то блог, публикация в социальных сетях или новостная статья.
Использование социальных сетей жизненно важно как для распространения информации, так и для успеха в бизнесе.
Недавно перестроив свой личный блог, я подумал, что было бы здорово поделиться тем, как легко создать небольшой компонент, который использует API браузера, чтобы обеспечить функциональность общего доступа с родным интерфейсом, независимо от того, работает ли пользователь на iOS или Android. .
🛠 Что будем строить
Простой компонент общего доступа для Интернета, но с родным интерфейсом. Он открывает множество дополнительных каналов, которыми пользователь уже делится и с которыми взаимодействует, например. Твиттер, Ватсап. Это невероятно мощно и естественно для пользователя, поскольку об этом позаботится их собственная ОС! Довольно мило, правда?
Мой блог основан на шаблоне Gatsby Starter Blog, поэтому он построен с использованием React — поэтому примеры, которые вы видите ниже, будут в некоторой степени специфичны для React, но сама функциональность веб-поделиться — это просто ванильный JavaScript, поэтому, если вы не совсем знакомы с React — не волнуйтесь!
Давайте погрузимся в некоторые короткие фрагменты кода.
📲 Определить тип клиента
Поскольку API Web Share в основном реализуется только мобильными браузерами, мы хотим отображать компонент только в том случае, если клиентом является мобильное устройство или планшет.
Для этого я создал быстрый пользовательский хук, который проверяет User Agent
клиента и возвращает логическое значение, которое мы можем использовать:
const useMobileDevice = () => {
const [isMobileOrTablet, setIsMobileOrTablet] = useState(false);
useEffect(() => {
setIsMobileOrTablet(isMobileOrTabletDevice());
});
return [isMobileOrTablet];
};
Я нашел общую реализацию RegEx в верхнем ответе StackOverflow, которую для простоты я выделил в отдельную функцию (isTabletOrMobileDevice()
).
💅 Стиль это
Распространенным шаблоном пользовательского интерфейса для основного призыва к действию в блогах является наличие плавающего значка в представлении, где пользователь может легко получить к нему доступ. Поскольку мы ориентируемся конкретно на мобильные устройства, мы должны позволить компоненту находиться в правом нижнем углу экрана — это зона высокой активности мобильного устройства, доступ к которой можно легко получить большим пальцем пользователя.
Мы хотим создать это как отдельный компонент, который может содержать эту функциональность и легко импортировать на страницы:
import React from 'react';
const MobileShare = () => { const handleOnClick = () => { // TODO: Placeholder to implement web share API };
return ( <div className='share-icon' onClick={handleOnClick}> <ShareIcon /> </div> ); };
export default MobileShare;
В приведенном выше фрагменте наш ShareIcon
— это просто SVG типичного значка общего доступа.
Чтобы применить к нему плавающий эффект, нам нужно применить позиционирование fixed
к этому элементу в нашем CSS:
.share-icon {
position: fixed;
bottom: 25px;
right: 25px;
cursor: pointer;
height: 40px;
width: 40px;
border-radius: 50%;
padding: 5px;
background-color: rgb(43, 135, 255);
-webkit-box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.75);
-moz-box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.75);
box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.75);
}
Первая часть CSS связана с позиционированием компонента, вторая часть — это просто некоторый пользовательский стиль, который я хотел для своего блога.
💡 Подключение общего API
Последняя часть головоломки — интегрировать наш обработчик onClick
с API веб-ресурса. Поскольку он находится в интерфейсе navigator
, мы хотим вызвать для него функцию share
и передать некоторые пользовательские параметры, относящиеся к конкретному сообщению в блоге.
Мы можем вызвать эту функциональность, реализуя следующее как нашу функцию handleOnClick
, определенную выше:
const handleOnClick = () => {
if (navigator.share) {
navigator
.share({
title: `${postTitle} | ${siteTitle}`,
text: `Check out ${postTitle} on ${siteTitle}`,
url: document.location.href,
})
.then(() => {
console.log('Successfully shared');
})
.catch(error => {
console.error('Something went wrong sharing the blog', error);
});
}
};
Как видите, мы хотим убедиться, что функция navigator.share
доступна на клиенте, который в данный момент использует сайт. Причина такого защитного подхода связана с реализацией API в браузере, о которой я упоминал выше.
Если она доступна, мы вызываем функцию и передаем объект с некоторыми значениями — они представляют свойства, которые клиент может отображать в качестве предварительного просмотра при вызове функции.
Согласно документации MDN, есть три свойства, которые можно передать как часть объекта конфигурации:
Объект, содержащий данные для совместного использования. Необходимо указать хотя бы одно из следующих полей.
Необходимо указать хотя бы одно из этих полей: title
, text
или URL
. Вы можете видеть в приведенном выше фрагменте, что я пропускаю все три, поскольку это обеспечивает самый богатый опыт при обмене. Различные ОС и устройства будут использовать эти свойства немного по-разному, поэтому для моего варианта использования блога я подумал, что лучше предоставить как можно больше подробностей!
Сама функция share()
является асинхронной функцией, поэтому мы можем подключиться к разрешенному обратному вызову, зная, что он завершен — на случай, если вы захотите выполнить какие-либо дополнительные функции, например, представить небольшое уведомление, подтверждающее пользователю, что статья была опубликована. . Для меня я просто выхожу из системы, что он успешно поделился - возможно, я реализую небольшой тост в будущем 😃
API также предоставляет возможность обмениваться файлами, что довольно просто и хорошо задокументировано в документах MDN выше.
🤔 Курики и раздражители
Из-за характера API и браузеров, реализующих его по-разному, на разных устройствах и браузерах будут различия. Например, в iOS я заметил, что свойство text
имеет приоритет для маленького значка, который отображается в собственном виджете общего доступа, а не для значка моего блога.
Ничего страшного, но я заметил небольшое раздражение при его создании!
💫 Резюме
Супер простой, новый браузерный API для взаимодействия, который открывает возможности обмена для мобильного Интернета, но с родным интерфейсом.
Было невероятно легко подключиться, и с помощью нескольких строк кода мы запустили его!
Я определенно рекомендую подключить что-то подобное к вашему личному веб-сайту, так как это может придать ему ощущение повышения уровня и упростить пользователям обмен вашими статьями!
Если вы используете мобильное устройство, вы должны увидеть значок «Поделиться» в правом нижнем углу, пока читаете это, так почему бы вам не попробовать и не посмотреть, как это работает? 😉
Вы можете проверить быструю интеграцию, которую я собрал для своего блога на GitHub.