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

72 lines
2.1 KiB
TypeScript
Raw Normal View History

/**
* External dependencies
*/
import { useSelect, useDispatch } from '@wordpress/data';
import { chain } from 'lodash';
/**
* Internal dependencies
*/
import { STORE_KEY } from '~/marketing/data/constants';
import { InstalledPlugin } from '~/marketing/types';
import { useRecommendedChannels } from './useRecommendedChannels';
import { useRegisteredChannels } from './useRegisteredChannels';
type InstalledExtension = InstalledPlugin;
export type UseInstalledExtensions = {
installedExtensionsWithoutChannels: InstalledExtension[];
activatingExtensions: string[];
activateInstalledExtension: ( slug: string ) => void;
loadInstalledExtensionsAfterActivation: ( slug: string ) => void;
};
/**
* Hook to return plugins and methods for "Installed extensions" card.
*
* The list of installed plugins will not include registered and recommended marketing channels.
*/
export const useInstalledExtensions = (): UseInstalledExtensions => {
const { loading: loadingRegisteredChannels, data: dataRegisteredChannels } =
useRegisteredChannels();
const {
loading: loadingRecommendedChannels,
data: dataRecommendedChannels,
} = useRecommendedChannels();
const { installedPlugins, activatingPlugins } = useSelect( ( select ) => {
const { getInstalledPlugins, getActivatingPlugins } =
select( STORE_KEY );
return {
installedPlugins: getInstalledPlugins< InstalledExtension[] >(),
activatingPlugins: getActivatingPlugins(),
};
}, [] );
const { activateInstalledPlugin, loadInstalledPluginsAfterActivation } =
useDispatch( STORE_KEY );
const loading = loadingRegisteredChannels || loadingRecommendedChannels;
const installedPluginsWithoutChannels = chain( installedPlugins )
.differenceWith(
dataRegisteredChannels || [],
( a, b ) => a.slug === b.slug
)
.differenceWith(
dataRecommendedChannels || [],
( a, b ) => a.slug === b.product
)
.value();
return {
installedExtensionsWithoutChannels: loading
? []
: installedPluginsWithoutChannels,
activatingExtensions: activatingPlugins,
activateInstalledExtension: activateInstalledPlugin,
loadInstalledExtensionsAfterActivation:
loadInstalledPluginsAfterActivation,
};
};