woocommerce/plugins/woocommerce-admin/client/mobile-banner/index.js

93 lines
2.4 KiB
JavaScript
Raw Normal View History

Add WooCommerce Mobile App Banner Ad for Android and iOS (https://github.com/woocommerce/woocommerce-admin/pull/5037) Fixes woocommerce/woocommerce-admin#4654 The feature calls for a mobile app ad banner to be displayed to users on mobile devices. Based on the discussion in woocommerce/woocommerce-admin#4654 this implements the following: 1. [an iOS Smart App Banner](https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html). This banner is a meta tag that is generated in PHP. It will only display on iOS devices. One note about this: **This tag is not directly trackable like the implemented Android banner. If we would like to track its success then I believe [these instructions are relevant](https://stackoverflow.com/questions/12906502/is-it-possible-to-track-click-throughs-from-iphone-smart-banner/20422334woocommerce/woocommerce-admin#20422334)**. 2. A mobile app banner ad that **only displays on Android** and only displays at the `738px` breakpoint specified in the issue. To only display this banner ad on Android, we use basic checking of the user agent string. I weighed this up against other approaches and for this kind of niche use case a simple UA string check is (imho) still the best way to do this. 3. The banner ad makes use of user preferences to retain a per user setting that determines if that user has dismissed the Android banner. We don't/can't do anything like this for the iOS Smart App Banner (but in theory we shouldn't need to).
2020-08-27 01:46:53 +00:00
/**
* External dependencies
*/
import React, { useEffect, useState } from '@wordpress/element';
import { Button, Icon } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import { recordEvent } from '@woocommerce/tracks';
/**
* Internal dependencies
*/
import { platform, ANDROID_PLATFORM } from '../lib/platform';
import { AppIcon } from './app-icon';
import './style.scss';
import { PLAY_STORE_LINK, TRACKING_EVENT_NAME } from './constants';
const SHOW_APP_BANNER_MODIFIER_CLASS = 'woocommerce-layout__show-app-banner';
export const MobileAppBanner = ( { onInstall, onDismiss } ) => {
useEffect( () => {
const layout = document.getElementsByClassName(
'woocommerce-layout'
)[ 0 ];
if ( platform() === ANDROID_PLATFORM ) {
if ( layout ) {
// This is a hack to allow the mobile banner to work in the context of the header which is
// position fixed. This can be refactored away when we move away from the activity panel
// in future.
layout.classList.add( SHOW_APP_BANNER_MODIFIER_CLASS );
}
}
return () => {
if ( layout ) {
layout.classList.remove( SHOW_APP_BANNER_MODIFIER_CLASS );
}
};
}, [] );
const [ isDismissed, setDismissed ] = useState( false );
// On iOS the "Smart App Banner" meta tag is used so only display this on Android.
if ( platform() === ANDROID_PLATFORM && ! isDismissed ) {
return (
<div className="woocommerce-mobile-app-banner">
<Icon
icon="no-alt"
data-testid="dismiss-btn"
onClick={ () => {
onDismiss();
setDismissed( true );
recordEvent( TRACKING_EVENT_NAME, {
action: 'dismiss',
} );
} }
/>
<AppIcon />
<div className="woocommerce-mobile-app-banner__description">
<p className="woocommerce-mobile-app-banner__description__text">
{ __(
'Run your store from anywhere',
'woocommerce-admin'
) }
</p>
<p className="woocommerce-mobile-app-banner__description__text">
{ __(
'Download the WooCommerce app',
'woocommerce-admin'
) }
</p>
</div>
<Button
href={ PLAY_STORE_LINK }
isSecondary
onClick={ () => {
onInstall();
setDismissed( true );
recordEvent( TRACKING_EVENT_NAME, {
action: 'install',
} );
} }
>
{ __( 'Install', 'woocommerce-admin' ) }
</Button>
</div>
);
}
return null;
};