woocommerce/plugins/woocommerce-admin/client/marketing/hooks/useRegisteredChannels.ts

164 lines
4.8 KiB
TypeScript

/**
* External dependencies
*/
import { useDispatch, useSelect } from '@wordpress/data';
import { __, sprintf } from '@wordpress/i18n';
import {
createElement,
useCallback,
useState,
useEffect,
useMemo,
useRef,
} from '@wordpress/element';
/**
* Internal dependencies
*/
import { InstalledChannel, SyncStatusType } from '~/marketing/types';
import { STORE_KEY } from '~/marketing/data-multichannel/constants';
import {
ApiFetchError,
Channel,
Channels,
} from '~/marketing/data-multichannel/types';
type UseRegisteredChannels = {
loading: boolean;
data?: Array< InstalledChannel >;
error?: ApiFetchError;
refetch: () => void;
};
// // TODO: To be removed. This is for testing loading state.
// export const useRegisteredChannels = () => {
// // TODO: call API here to get data.
// // The following are just dummy data for testing now.
// return {
// loading: true,
// data: [],
// };
// };
// // TODO: To be removed. This is for testing isSetupCompleted = false.
// export const useRegisteredChannels = () => {
// // TODO: call API here to get data.
// // The following are just dummy data for testing now.
// return {
// loading: false,
// data: [
// {
// slug: 'google-listings-and-ads',
// title: 'Google Listings and Ads',
// description:
// 'Get in front of shoppers and drive traffic so you can grow your business with Smart Shopping Campaigns and free listings.',
// icon: 'https://woocommerce.com/wp-content/plugins/wccom-plugins/marketing-tab-rest-api/icons/google.svg',
// isSetupCompleted: false,
// setupUrl: 'https://www.example.com/setup',
// manageUrl: 'https://www.example.com/manage',
// syncStatus: 'synced' as const,
// issueType: 'none' as const,
// issueText: 'No issues to resolve',
// },
// ],
// };
// };
// // TODO: To be removed. This is for testing error state.
// export const useRegisteredChannels = () => {
// // TODO: call API here to get data.
// // The following are just dummy data for testing now.
// return {
// loading: false,
// data: [
// {
// slug: 'google-listings-and-ads',
// title: 'Google Listings and Ads',
// description:
// 'Get in front of shoppers and drive traffic so you can grow your business with Smart Shopping Campaigns and free listings.',
// icon: 'https://woocommerce.com/wp-content/plugins/wccom-plugins/marketing-tab-rest-api/icons/google.svg',
// isSetupCompleted: true,
// setupUrl: 'https://www.example.com/setup',
// manageUrl: 'https://www.example.com/manage',
// syncStatus: 'failed' as const,
// issueType: 'error' as const,
// issueText: '3 issues to resolve',
// },
// ],
// };
// };
// // TODO: To be removed. This is for testing everything works okay.
// export const useRegisteredChannels = (): UseRegisteredChannels => {
// // TODO: call API here to get data.
// // The following are just dummy data for testing now.
// return {
// loading: false,
// data: [
// {
// slug: 'google-listings-and-ads',
// title: 'Google Listings and Ads',
// description:
// 'Get in front of shoppers and drive traffic so you can grow your business with Smart Shopping Campaigns and free listings.',
// icon: 'https://woocommerce.com/wp-content/plugins/wccom-plugins/marketing-tab-rest-api/icons/google.svg',
// isSetupCompleted: true,
// setupUrl: 'https://www.example.com/setup',
// manageUrl: 'https://www.example.com/manage',
// syncStatus: 'synced' as const,
// issueType: 'none' as const,
// issueText: 'No issues to resolve',
// },
// ],
// };
// };
const statusMap: Record< string, SyncStatusType > = {
synced: 'synced',
'sync-in-progress': 'syncing',
};
const convert = ( data: Channel ): InstalledChannel => {
const issueType = data.errors_count >= 1 ? 'error' : 'none';
const issueText =
data.errors_count >= 1
? sprintf(
// translators: %d: The number of issues to resolve.
__( '%d issues to resolve', 'woocommerce' ),
data.errors_count
)
: __( 'No issues to resolve', 'woocommerce' );
return {
slug: data.slug,
title: data.name,
description: data.description,
icon: data.icon,
isSetupCompleted: data.is_setup_completed,
setupUrl: data.settings_url,
manageUrl: data.settings_url,
syncStatus: statusMap[ data.product_listings_status ],
issueType,
issueText,
};
};
export const useRegisteredChannels = (): UseRegisteredChannels => {
const { invalidateResolution } = useDispatch( STORE_KEY );
const refetch = useCallback( () => {
invalidateResolution( 'getChannels' );
}, [ invalidateResolution ] );
return useSelect( ( select ) => {
const { hasFinishedResolution, getChannels } = select( STORE_KEY );
const channels = getChannels< Channels >();
return {
loading: ! hasFinishedResolution( 'getChannels' ),
data: channels.data?.map( convert ),
error: channels.error,
refetch,
};
} );
};