Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { useSelector } from 'react-redux';
import getPressablePlan from 'calypso/a8c-for-agencies/sections/marketplace/pressable-overview/lib/get-pressable-plan';
import { getActiveAgency } from 'calypso/state/a8c-for-agencies/agency/selectors';
import { TitanOrder } from 'calypso/state/a8c-for-agencies/types';
import { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We created a new types file on A4A as we are introducing new fields.


import './style.scss';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { UseQueryResult, useQuery } from '@tanstack/react-query';
import { selectAlphabeticallySortedProductOptions } from 'calypso/jetpack-cloud/sections/partner-portal/lib';
import wpcom from 'calypso/lib/wp';
import { APIProductFamily, APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
import type {
APIProductFamily,
APIProductFamilyProduct,
} from 'calypso/a8c-for-agencies/types/products';

function queryClientProducts(): Promise< APIProductFamily[] > {
return wpcom.req
Expand Down Expand Up @@ -33,6 +36,10 @@ function queryClientProducts(): Promise< APIProductFamily[] > {
.map( ( product ) => ( {
...product,
family_slug: family.slug,
alternative_product_id:
product.alternative_product_id ||
product.monthly_alternative_product_id ||
product.yearly_alternative_product_id,
} ) ),
};
} )
Expand Down
42 changes: 18 additions & 24 deletions client/a8c-for-agencies/data/marketplace/use-products-query.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { isEnabled } from '@automattic/calypso-config';
import { useQuery, UseQueryResult, useQueryClient } from '@tanstack/react-query';
import { useTranslate } from 'i18n-calypso';
import { useEffect } from 'react';
Expand All @@ -7,16 +8,16 @@ import wpcom from 'calypso/lib/wp';
import { useDispatch, useSelector } from 'calypso/state';
import { getActiveAgencyId } from 'calypso/state/a8c-for-agencies/agency/selectors';
import { errorNotice } from 'calypso/state/notices/actions';
import { APIProductFamily, APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
import type {
APIProductFamily,
APIProductFamilyProduct,
} from 'calypso/a8c-for-agencies/types/products';

function queryProducts(
isPublicFacing: boolean,
agencyId?: number
): Promise< APIProductFamily[] > {
const productsAPIPath = isPublicFacing
? '/jetpack-licensing/public/manage-pricing'
async function queryProducts( agencyId?: number ): Promise< APIProductFamily[] > {
const isTermPricingEnabled = isEnabled( 'a4a-bd-term-pricing' ) && isEnabled( 'a4a-bd-checkout' );
const productsAPIPath = isTermPricingEnabled
? '/agency/products'
: '/jetpack-licensing/partner/product-families';

return wpcom.req
.get(
{
Expand Down Expand Up @@ -51,6 +52,10 @@ function queryProducts(
.map( ( product ) => ( {
...product,
family_slug: family.slug,
alternative_product_id:
product.alternative_product_id ||
product.monthly_alternative_product_id ||
product.yearly_alternative_product_id,
} ) ),
};
} )
Expand All @@ -60,20 +65,9 @@ function queryProducts(
} );
}

export function usePublicProductsQuery(): UseQueryResult< APIProductFamilyProduct[], unknown > {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are not using this anywhere.

return useProductsQuery( true );
}

const getProductsQueryKey = ( isPublicFacing: boolean, agencyId?: number ) => [
'a4a',
'marketplace',
'products',
isPublicFacing,
agencyId,
];
const getProductsQueryKey = ( agencyId?: number ) => [ 'a4a', 'marketplace', 'products', agencyId ];

export default function useProductsQuery(
isPublicFacing = false,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed support for the public-facing API as we no longer need it.

includeRawData = false,
useStaleData = false
): UseQueryResult< APIProductFamilyProduct[], unknown > {
Expand All @@ -82,7 +76,7 @@ export default function useProductsQuery(
const agencyId = useSelector( getActiveAgencyId );

const queryClient = useQueryClient();
const data = queryClient.getQueryData( getProductsQueryKey( isPublicFacing, agencyId ) );
const data = queryClient.getQueryData( getProductsQueryKey( agencyId ) );

let staleTime = 0;

Expand All @@ -92,10 +86,10 @@ export default function useProductsQuery(
}

const query = useQuery( {
queryKey: getProductsQueryKey( isPublicFacing, agencyId ),
queryFn: () => queryProducts( isPublicFacing, agencyId ),
queryKey: getProductsQueryKey( agencyId ),
queryFn: () => queryProducts( agencyId ),
select: includeRawData ? getProductsRaw : selectAlphabeticallySortedProductOptions,
enabled: isPublicFacing || !! agencyId,
enabled: !! agencyId,
refetchOnWindowFocus: false,
staleTime,
} );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
SubscriptionStatus,
} from '../field-content';
import type { Subscription } from '../../../types';
import type { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';

import './style.scss';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,33 @@
import { isEnabled } from '@automattic/calypso-config';
import { formatCurrency } from '@automattic/number-formatters';
import { useTranslate } from 'i18n-calypso';
import { getProductCommissionPercentage } from '../../referrals/lib/commissions';
import type { ShoppingCartItem } from '../types';
import type { ShoppingCartItem, TermPricingType } from '../types';

import './style.scss';

export default function CommissionsInfo( { items }: { items: ShoppingCartItem[] } ) {
export default function CommissionsInfo( {
items,
termPricing,
}: {
items: ShoppingCartItem[];
termPricing?: TermPricingType;
} ) {
const translate = useTranslate();

const isTermPricingEnabled = isEnabled( 'a4a-bd-term-pricing' ) && isEnabled( 'a4a-bd-checkout' );

const totalCommissions = items.reduce( ( acc, item ) => {
const product = item;
const commissionPercentage = getProductCommissionPercentage( product.family_slug );
const totalCommissions = product?.amount
? Number( product.amount.replace( /,/g, '' ) ) * commissionPercentage
: 0;
const commissionPercentage = getProductCommissionPercentage(
product.slug,
product.family_slug
);
const termPrice =
termPricing === 'yearly' ? product.yearly_price ?? 0 : product.monthly_price ?? 0;
const productAmount = product?.amount ? Number( product.amount.replace( /,/g, '' ) ) : 0;
const productPrice = isTermPricingEnabled ? termPrice : productAmount;
const totalCommissions = productPrice * commissionPercentage || 0;
return acc + totalCommissions;
}, 0 );

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

const currency = items[ 0 ]?.currency ?? 'USD';

const totalPricePerTerm =
isTermPricingEnabled && termPricing === 'yearly'
? translate( '%(total)s/yr', {
args: {
total: formatCurrency( totalCommissions, currency ),
},
} )
: translate( '%(total)s/mo', {
args: {
total: formatCurrency( totalCommissions, currency ),
},
} );

return (
<div className="commissions-info">
<span>{ translate( 'Your estimated commission:' ) }</span>
<span>
{ translate( '%(total)s/mo', {
args: {
total: formatCurrency( totalCommissions, 'USD' ),
},
} ) }
</span>
<span>{ totalPricePerTerm }</span>
</div>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import ClipboardButton from 'calypso/components/forms/clipboard-button';
import { useDispatch } from 'calypso/state';
import { recordTracksEvent } from 'calypso/state/analytics/actions';
import { infoNotice, errorNotice } from 'calypso/state/notices/actions';
import { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
import useLicenseDownloadUrlMutation from '../../purchases/licenses/revoke-license-dialog/hooks/use-license-download-url-mutation';
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';

interface WooProductDownloadProps {
licenseKey: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import useProductsQuery from 'calypso/a8c-for-agencies/data/marketplace/use-prod
import { isProductMatch } from 'calypso/jetpack-cloud/sections/partner-portal/primary/issue-license/lib/filter';
import { useSelector } from 'calypso/state';
import { getAssignedPlanAndProductIDsForSite } from 'calypso/state/partner-portal/licenses/selectors';
import { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
import {
PRODUCT_TYPE_JETPACK_BACKUP_ADDON,
PRODUCT_TYPE_JETPACK_PLAN,
Expand All @@ -19,6 +18,7 @@ import {
filterProductsAndPlansByType,
} from '../lib/product-filter';
import type { SiteDetails } from '@automattic/data-stores';
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';

// Plans and Products that we can merged into 1 card.
const MERGABLE_PLANS = [ 'jetpack-security' ];
Expand Down Expand Up @@ -111,9 +111,8 @@ export default function useProductAndPlans( {
selectedSite,
selectedProductFilters,
productSearchQuery,
usePublicQuery = false,
}: Props ) {
const { data, isLoading: isLoadingProducts } = useProductsQuery( usePublicQuery );
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

usePublicQuery is not used anywhere.

const { data, isLoading: isLoadingProducts } = useProductsQuery();

const addedPlanAndProducts = useSelector( ( state ) =>
selectedSite ? getAssignedPlanAndProductIDsForSite( state, selectedSite.ID ) : null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { useTranslate } from 'i18n-calypso';
import { useMemo } from 'react';
import { isWooCommerceProduct } from 'calypso/jetpack-cloud/sections/partner-portal/lib';
import { APIProductFamilyProduct } from 'calypso/state/partner-portal/types';
import { isProductType } from '../lib/product-filter';
import {
SECURITY_PRODUCT_SLUGS,
Expand All @@ -15,16 +14,20 @@ import {
MERCHANDISING_PRODUCT_SLUGS,
STORE_CONTENT_PRODUCT_SLUGS,
STORE_MANAGEMENT_PRODUCT_SLUGS,
BACKUP_STORAGE_FAMILY_SLUG,
JETPACK_PACKS_FAMILY_SLUG,
} from '../lib/product-slugs';
import type { APIProductFamilyProduct } from 'calypso/a8c-for-agencies/types/products';

type CategoryConfig = {
slugs: string[];
familySlugs?: string[];
label: string;
};

export function useProductCategories( product: APIProductFamilyProduct ): string[] {
const translate = useTranslate();
const { family_slug } = product;
const { family_slug, slug } = product;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are going to change how we group families. You can see the response here: 199438-ghe-Automattic/wpcom

To support that, we are going to use the slug also so that the current implementation doesn't break.


return useMemo( () => {
// Add e-commerce category for WooCommerce products
Expand All @@ -33,7 +36,11 @@ export function useProductCategories( product: APIProductFamilyProduct ): string
: [];

const CATEGORIES: CategoryConfig[] = [
{ slugs: SECURITY_PRODUCT_SLUGS, label: translate( 'security' ) },
{
slugs: SECURITY_PRODUCT_SLUGS,
familySlugs: [ BACKUP_STORAGE_FAMILY_SLUG ],
label: translate( 'security' ),
},
{ slugs: PERFORMANCE_PRODUCT_SLUGS, label: translate( 'performance' ) },
{ slugs: SOCIAL_PRODUCT_SLUGS, label: translate( 'social' ) },
{ slugs: GROWTH_PRODUCT_SLUGS, label: translate( 'growth' ) },
Expand All @@ -48,18 +55,18 @@ export function useProductCategories( product: APIProductFamilyProduct ): string

// Add regular categories
categories.push(
...CATEGORIES.reduce( ( acc: string[], { slugs, label } ) => {
if ( slugs.includes( family_slug ) ) {
...CATEGORIES.reduce( ( acc: string[], { slugs, familySlugs, label } ) => {
if ( slugs.includes( slug ) || familySlugs?.includes( family_slug ) ) {
acc.push( label );
}
return acc;
}, [] )
);

// Add product type categories
if ( family_slug === 'jetpack-packs' ) {
if ( family_slug === JETPACK_PACKS_FAMILY_SLUG ) {
categories.push( translate( 'bundle' ), translate( 'plan' ) );
} else if ( family_slug === 'jetpack-backup-storage' ) {
} else if ( family_slug === BACKUP_STORAGE_FAMILY_SLUG ) {
categories.push( translate( 'add-on' ) );
} else if ( isProductType( family_slug ) ) {
categories.push( translate( 'product' ) );
Expand All @@ -68,5 +75,5 @@ export function useProductCategories( product: APIProductFamilyProduct ): string
}

return categories;
}, [ family_slug, translate ] );
}, [ family_slug, translate, slug ] );
}
Loading