Skip to content

Commit 029f8f3

Browse files
committed
A4A > Marketplace: Implement Term pricing for Hosting, Products & Cart
1 parent 8b3b73c commit 029f8f3

File tree

57 files changed

+439
-214
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+439
-214
lines changed

client/a8c-for-agencies/components/pressable-usage-details/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { useSelector } from 'react-redux';
66
import getPressablePlan from 'calypso/a8c-for-agencies/sections/marketplace/pressable-overview/lib/get-pressable-plan';
77
import { getActiveAgency } from 'calypso/state/a8c-for-agencies/agency/selectors';
88
import { TitanOrder } from 'calypso/state/a8c-for-agencies/types';
9-
import { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
9+
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';
1010

1111
import './style.scss';
1212

client/a8c-for-agencies/data/client/use-fetch-client-products.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { UseQueryResult, useQuery } from '@tanstack/react-query';
22
import { selectAlphabeticallySortedProductOptions } from 'calypso/jetpack-cloud/sections/partner-portal/lib';
33
import wpcom from 'calypso/lib/wp';
4-
import { APIProductFamily, APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
4+
import type {
5+
APIProductFamily,
6+
APIProductFamilyProduct,
7+
} from 'calypso/a8c-for-agencies/types/products';
58

69
function queryClientProducts(): Promise< APIProductFamily[] > {
710
return wpcom.req

client/a8c-for-agencies/data/marketplace/use-products-query.ts

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { isEnabled } from '@automattic/calypso-config';
12
import { useQuery, UseQueryResult, useQueryClient } from '@tanstack/react-query';
23
import { useTranslate } from 'i18n-calypso';
34
import { useEffect } from 'react';
@@ -7,16 +8,17 @@ import wpcom from 'calypso/lib/wp';
78
import { useDispatch, useSelector } from 'calypso/state';
89
import { getActiveAgencyId } from 'calypso/state/a8c-for-agencies/agency/selectors';
910
import { errorNotice } from 'calypso/state/notices/actions';
10-
import { APIProductFamily, APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
11+
import type {
12+
APIProductFamily,
13+
APIProductFamilyProduct,
14+
} from 'calypso/a8c-for-agencies/types/products';
1115

12-
function queryProducts(
13-
isPublicFacing: boolean,
14-
agencyId?: number
15-
): Promise< APIProductFamily[] > {
16-
const productsAPIPath = isPublicFacing
17-
? '/jetpack-licensing/public/manage-pricing'
18-
: '/jetpack-licensing/partner/product-families';
16+
const isTermPricingEnabled = isEnabled( 'a4a-bd-term-pricing' ) && isEnabled( 'a4a-bd-checkout' );
1917

18+
async function queryProducts( agencyId?: number ): Promise< APIProductFamily[] > {
19+
const productsAPIPath = isTermPricingEnabled
20+
? '/agency/products'
21+
: '/jetpack-licensing/partner/product-families';
2022
return wpcom.req
2123
.get(
2224
{
@@ -60,20 +62,9 @@ function queryProducts(
6062
} );
6163
}
6264

63-
export function usePublicProductsQuery(): UseQueryResult< APIProductFamilyProduct[], unknown > {
64-
return useProductsQuery( true );
65-
}
66-
67-
const getProductsQueryKey = ( isPublicFacing: boolean, agencyId?: number ) => [
68-
'a4a',
69-
'marketplace',
70-
'products',
71-
isPublicFacing,
72-
agencyId,
73-
];
65+
const getProductsQueryKey = ( agencyId?: number ) => [ 'a4a', 'marketplace', 'products', agencyId ];
7466

7567
export default function useProductsQuery(
76-
isPublicFacing = false,
7768
includeRawData = false,
7869
useStaleData = false
7970
): UseQueryResult< APIProductFamilyProduct[], unknown > {
@@ -82,7 +73,7 @@ export default function useProductsQuery(
8273
const agencyId = useSelector( getActiveAgencyId );
8374

8475
const queryClient = useQueryClient();
85-
const data = queryClient.getQueryData( getProductsQueryKey( isPublicFacing, agencyId ) );
76+
const data = queryClient.getQueryData( getProductsQueryKey( agencyId ) );
8677

8778
let staleTime = 0;
8879

@@ -92,10 +83,10 @@ export default function useProductsQuery(
9283
}
9384

9485
const query = useQuery( {
95-
queryKey: getProductsQueryKey( isPublicFacing, agencyId ),
96-
queryFn: () => queryProducts( isPublicFacing, agencyId ),
86+
queryKey: getProductsQueryKey( agencyId ),
87+
queryFn: () => queryProducts( agencyId ),
9788
select: includeRawData ? getProductsRaw : selectAlphabeticallySortedProductOptions,
98-
enabled: isPublicFacing || !! agencyId,
89+
enabled: !! agencyId,
9990
refetchOnWindowFocus: false,
10091
staleTime,
10192
} );

client/a8c-for-agencies/sections/client/primary/subscriptions-list/mobile-view/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
SubscriptionStatus,
1010
} from '../field-content';
1111
import type { Subscription } from '../../../types';
12-
import type { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
12+
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';
1313

1414
import './style.scss';
1515

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,33 @@
1+
import { isEnabled } from '@automattic/calypso-config';
12
import { formatCurrency } from '@automattic/number-formatters';
23
import { useTranslate } from 'i18n-calypso';
34
import { getProductCommissionPercentage } from '../../referrals/lib/commissions';
4-
import type { ShoppingCartItem } from '../types';
5+
import type { ShoppingCartItem, TermPricingType } from '../types';
56

67
import './style.scss';
78

8-
export default function CommissionsInfo( { items }: { items: ShoppingCartItem[] } ) {
9+
export default function CommissionsInfo( {
10+
items,
11+
termPricing,
12+
}: {
13+
items: ShoppingCartItem[];
14+
termPricing?: TermPricingType;
15+
} ) {
916
const translate = useTranslate();
1017

18+
const isTermPricingEnabled = isEnabled( 'a4a-bd-term-pricing' ) && isEnabled( 'a4a-bd-checkout' );
19+
1120
const totalCommissions = items.reduce( ( acc, item ) => {
1221
const product = item;
13-
const commissionPercentage = getProductCommissionPercentage( product.family_slug );
14-
const totalCommissions = product?.amount
15-
? Number( product.amount.replace( /,/g, '' ) ) * commissionPercentage
16-
: 0;
22+
const commissionPercentage = getProductCommissionPercentage(
23+
product.slug,
24+
product.family_slug
25+
);
26+
const termPrice =
27+
termPricing === 'yearly' ? product.yearly_price ?? 0 : product.monthly_price ?? 0;
28+
const productAmount = product?.amount ? Number( product.amount.replace( /,/g, '' ) ) : 0;
29+
const productPrice = isTermPricingEnabled ? termPrice : productAmount;
30+
const totalCommissions = productPrice * commissionPercentage || 0;
1731
return acc + totalCommissions;
1832
}, 0 );
1933

@@ -22,16 +36,25 @@ export default function CommissionsInfo( { items }: { items: ShoppingCartItem[]
2236
return null;
2337
}
2438

39+
const currency = items[ 0 ]?.currency ?? 'USD';
40+
41+
const totalPricePerTerm =
42+
isTermPricingEnabled && termPricing === 'yearly'
43+
? translate( '%(total)s/yr', {
44+
args: {
45+
total: formatCurrency( totalCommissions, currency ),
46+
},
47+
} )
48+
: translate( '%(total)s/mo', {
49+
args: {
50+
total: formatCurrency( totalCommissions, currency ),
51+
},
52+
} );
53+
2554
return (
2655
<div className="commissions-info">
2756
<span>{ translate( 'Your estimated commission:' ) }</span>
28-
<span>
29-
{ translate( '%(total)s/mo', {
30-
args: {
31-
total: formatCurrency( totalCommissions, 'USD' ),
32-
},
33-
} ) }
34-
</span>
57+
<span>{ totalPricePerTerm }</span>
3558
</div>
3659
);
3760
}

client/a8c-for-agencies/sections/marketplace/download-products-form/woo-product-download.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import ClipboardButton from 'calypso/components/forms/clipboard-button';
66
import { useDispatch } from 'calypso/state';
77
import { recordTracksEvent } from 'calypso/state/analytics/actions';
88
import { infoNotice, errorNotice } from 'calypso/state/notices/actions';
9-
import { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
109
import useLicenseDownloadUrlMutation from '../../purchases/licenses/revoke-license-dialog/hooks/use-license-download-url-mutation';
10+
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';
1111

1212
interface WooProductDownloadProps {
1313
licenseKey: string;

client/a8c-for-agencies/sections/marketplace/hooks/use-product-and-plans.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import useProductsQuery from 'calypso/a8c-for-agencies/data/marketplace/use-prod
44
import { isProductMatch } from 'calypso/jetpack-cloud/sections/partner-portal/primary/issue-license/lib/filter';
55
import { useSelector } from 'calypso/state';
66
import { getAssignedPlanAndProductIDsForSite } from 'calypso/state/partner-portal/licenses/selectors';
7-
import { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
87
import {
98
PRODUCT_TYPE_JETPACK_BACKUP_ADDON,
109
PRODUCT_TYPE_JETPACK_PLAN,
@@ -19,6 +18,7 @@ import {
1918
filterProductsAndPlansByType,
2019
} from '../lib/product-filter';
2120
import type { SiteDetails } from '@automattic/data-stores';
21+
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';
2222

2323
// Plans and Products that we can merged into 1 card.
2424
const MERGABLE_PLANS = [ 'jetpack-security' ];
@@ -111,9 +111,8 @@ export default function useProductAndPlans( {
111111
selectedSite,
112112
selectedProductFilters,
113113
productSearchQuery,
114-
usePublicQuery = false,
115114
}: Props ) {
116-
const { data, isLoading: isLoadingProducts } = useProductsQuery( usePublicQuery );
115+
const { data, isLoading: isLoadingProducts } = useProductsQuery();
117116

118117
const addedPlanAndProducts = useSelector( ( state ) =>
119118
selectedSite ? getAssignedPlanAndProductIDsForSite( state, selectedSite.ID ) : null

client/a8c-for-agencies/sections/marketplace/hooks/use-product-categories.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { useTranslate } from 'i18n-calypso';
22
import { useMemo } from 'react';
33
import { isWooCommerceProduct } from 'calypso/jetpack-cloud/sections/partner-portal/lib';
4-
import { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
54
import { isProductType } from '../lib/product-filter';
65
import {
76
SECURITY_PRODUCT_SLUGS,
@@ -16,6 +15,7 @@ import {
1615
STORE_CONTENT_PRODUCT_SLUGS,
1716
STORE_MANAGEMENT_PRODUCT_SLUGS,
1817
} from '../lib/product-slugs';
18+
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';
1919

2020
type CategoryConfig = {
2121
slugs: string[];
@@ -24,7 +24,7 @@ type CategoryConfig = {
2424

2525
export function useProductCategories( product: APIProductFamilyProduct ): string[] {
2626
const translate = useTranslate();
27-
const { family_slug } = product;
27+
const { family_slug, slug } = product;
2828

2929
return useMemo( () => {
3030
// Add e-commerce category for WooCommerce products
@@ -49,7 +49,7 @@ export function useProductCategories( product: APIProductFamilyProduct ): string
4949
// Add regular categories
5050
categories.push(
5151
...CATEGORIES.reduce( ( acc: string[], { slugs, label } ) => {
52-
if ( slugs.includes( family_slug ) ) {
52+
if ( slugs.includes( slug ) ) {
5353
acc.push( label );
5454
}
5555
return acc;
@@ -68,5 +68,5 @@ export function useProductCategories( product: APIProductFamilyProduct ): string
6868
}
6969

7070
return categories;
71-
}, [ family_slug, translate ] );
71+
}, [ family_slug, translate, slug ] );
7272
}

0 commit comments

Comments
 (0)