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

78 lines
1.8 KiB
TypeScript
Raw Normal View History

/**
* External dependencies
*/
import { useSelect } from '@wordpress/data';
2022-12-19 12:54:01 +00:00
/**
* Internal dependencies
*/
import { Campaign } from '~/marketing/types';
import { STORE_KEY } from '~/marketing/data-multichannel/constants';
import {
CampaignsPagination,
Campaign as APICampaign,
ApiFetchError,
} from '~/marketing/data-multichannel/types';
import { useRegisteredChannels } from '~/marketing/hooks';
2022-12-19 12:54:01 +00:00
type UseCampaignsType = {
loading: boolean;
data?: Array< Campaign >;
error?: ApiFetchError;
2023-02-23 18:13:20 +00:00
meta?: {
total?: number;
};
2022-12-19 12:54:01 +00:00
};
2023-03-01 19:15:38 +00:00
/**
* Custom hook to get campaigns.
*
* @param page Page number. Default is `1`.
* @param perPage Page size, i.e. number of records in one page. Default is `5`.
2023-03-01 19:15:38 +00:00
*/
export const useCampaigns = ( page = 1, perPage = 5 ): UseCampaignsType => {
2023-02-23 18:13:20 +00:00
const { data: channels } = useRegisteredChannels();
2022-12-17 13:08:14 +00:00
2023-02-23 18:13:20 +00:00
return useSelect(
( select ) => {
const { hasFinishedResolution, getCampaigns } = select( STORE_KEY );
const { campaignsPage, meta } = getCampaigns< CampaignsPagination >(
2023-02-23 18:13:20 +00:00
page,
perPage
);
2023-02-23 18:13:20 +00:00
const convert = ( campaign: APICampaign ): Campaign => {
const channel = channels?.find(
( el ) => el.slug === campaign.channel
);
const cost = campaign.cost ? campaign.cost.formatted : '-';
const sales = campaign.sales ? campaign.sales.formatted : '-';
2023-11-02 08:28:39 +00:00
2023-02-23 18:13:20 +00:00
return {
id: `${ campaign.channel }|${ campaign.id }`,
title: campaign.title,
description: '',
2023-11-02 14:19:03 +00:00
cost,
sales,
2023-02-23 18:13:20 +00:00
manageUrl: campaign.manage_url,
icon: channel?.icon || '',
channelName: channel?.title || '',
channelSlug: campaign.channel,
};
};
return {
2023-02-23 18:13:20 +00:00
loading: ! hasFinishedResolution( 'getCampaigns', [
page,
perPage,
] ),
data: campaignsPage?.data?.map( convert ),
error: campaignsPage?.error,
meta,
};
2023-02-23 18:13:20 +00:00
},
[ page, perPage, channels ]
2023-02-23 18:13:20 +00:00
);
};