feat(MED-131): analysis package has list of medusa product IDs, not medipost IDs
This commit is contained in:
@@ -20,7 +20,7 @@ export const generateMetadata = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
async function OrderAnalysisPackagePage() {
|
async function OrderAnalysisPackagePage() {
|
||||||
const { analysisElements, analysisPackages, countryCode } = await loadAnalysisPackages();
|
const { analysisPackageElements, analysisPackages, countryCode } = await loadAnalysisPackages();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageBody>
|
<PageBody>
|
||||||
@@ -29,8 +29,8 @@ async function OrderAnalysisPackagePage() {
|
|||||||
<Trans i18nKey={'marketing:selectPackage'} />
|
<Trans i18nKey={'marketing:selectPackage'} />
|
||||||
</h3>
|
</h3>
|
||||||
<ComparePackagesModal
|
<ComparePackagesModal
|
||||||
analysisElements={analysisElements}
|
|
||||||
analysisPackages={analysisPackages}
|
analysisPackages={analysisPackages}
|
||||||
|
analysisPackageElements={analysisPackageElements}
|
||||||
triggerElement={
|
triggerElement={
|
||||||
<Button variant="secondary" className="gap-2">
|
<Button variant="secondary" className="gap-2">
|
||||||
<Trans i18nKey={'marketing:comparePackages'} />
|
<Trans i18nKey={'marketing:comparePackages'} />
|
||||||
|
|||||||
@@ -23,8 +23,7 @@ import { withI18n } from '~/lib/i18n/with-i18n';
|
|||||||
import { PackageHeader } from '@/components/package-header';
|
import { PackageHeader } from '@/components/package-header';
|
||||||
import { InfoTooltip } from '@/components/ui/info-tooltip';
|
import { InfoTooltip } from '@/components/ui/info-tooltip';
|
||||||
import { StoreProduct } from '@medusajs/types';
|
import { StoreProduct } from '@medusajs/types';
|
||||||
import type { AnalysisElement } from '~/lib/services/analysis-element.service';
|
import { getAnalysisElementMedusaProductIds } from '@/utils/medusa-product';
|
||||||
import { getAnalysisElementOriginalIds } from '@/utils/medusa-product';
|
|
||||||
|
|
||||||
const CheckWithBackground = () => {
|
const CheckWithBackground = () => {
|
||||||
return (
|
return (
|
||||||
@@ -53,12 +52,12 @@ const PackageTableHead = async ({ product, nrOfAnalyses }: { product: StoreProdu
|
|||||||
}
|
}
|
||||||
|
|
||||||
const ComparePackagesModal = async ({
|
const ComparePackagesModal = async ({
|
||||||
analysisElements,
|
|
||||||
analysisPackages,
|
analysisPackages,
|
||||||
|
analysisPackageElements,
|
||||||
triggerElement,
|
triggerElement,
|
||||||
}: {
|
}: {
|
||||||
analysisElements: AnalysisElement[];
|
|
||||||
analysisPackages: StoreProduct[];
|
analysisPackages: StoreProduct[];
|
||||||
|
analysisPackageElements: StoreProduct[];
|
||||||
triggerElement: JSX.Element;
|
triggerElement: JSX.Element;
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = await createI18nServerInstance();
|
const { t } = await createI18nServerInstance();
|
||||||
@@ -71,9 +70,9 @@ const ComparePackagesModal = async ({
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const standardPackageAnalyses = getAnalysisElementOriginalIds([standardPackage]);
|
const standardPackageAnalyses = getAnalysisElementMedusaProductIds([standardPackage]);
|
||||||
const standardPlusPackageAnalyses = getAnalysisElementOriginalIds([standardPlusPackage]);
|
const standardPlusPackageAnalyses = getAnalysisElementMedusaProductIds([standardPlusPackage]);
|
||||||
const premiumPackageAnalyses = getAnalysisElementOriginalIds([premiumPackage]);
|
const premiumPackageAnalyses = getAnalysisElementMedusaProductIds([premiumPackage]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialog>
|
<Dialog>
|
||||||
@@ -110,28 +109,26 @@ const ComparePackagesModal = async ({
|
|||||||
</TableRow>
|
</TableRow>
|
||||||
</TableHeader>
|
</TableHeader>
|
||||||
<TableBody>
|
<TableBody>
|
||||||
{analysisElements.map(
|
{analysisPackageElements.map(
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
analysis_name_lab: analysisName,
|
title,
|
||||||
analysis_id_original: analysisId,
|
id,
|
||||||
|
description,
|
||||||
},
|
},
|
||||||
index,
|
index,
|
||||||
) => {
|
) => {
|
||||||
if (!analysisName) {
|
if (!title) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const includedInStandard = standardPackageAnalyses.includes(analysisId);
|
const includedInStandard = standardPackageAnalyses.includes(id);
|
||||||
const includedInStandardPlus = standardPlusPackageAnalyses.includes(analysisId);
|
const includedInStandardPlus = standardPlusPackageAnalyses.includes(id);
|
||||||
const includedInPremium = premiumPackageAnalyses.includes(analysisId);
|
const includedInPremium = premiumPackageAnalyses.includes(id);
|
||||||
return (
|
return (
|
||||||
<TableRow key={index}>
|
<TableRow key={index}>
|
||||||
<TableCell className="py-6">
|
<TableCell className="py-6">
|
||||||
{analysisName}{' '}
|
{title}{' '}
|
||||||
{/* <InfoTooltip
|
{description && (<InfoTooltip content={description} icon={<QuestionMarkCircledIcon />} />)}
|
||||||
content={t(tooltipContentKey)}
|
|
||||||
icon={<QuestionMarkCircledIcon />}
|
|
||||||
/> */}
|
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell align="center" className="py-6">
|
<TableCell align="center" className="py-6">
|
||||||
{includedInStandard && <CheckWithBackground />}
|
{includedInStandard && <CheckWithBackground />}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import { cache } from 'react';
|
|||||||
|
|
||||||
import { listProductTypes, listProducts } from "@lib/data/products";
|
import { listProductTypes, listProducts } from "@lib/data/products";
|
||||||
import { listRegions } from '@lib/data/regions';
|
import { listRegions } from '@lib/data/regions';
|
||||||
import { AnalysisElement, getAnalysisElements } from '~/lib/services/analysis-element.service';
|
import { getAnalysisElementMedusaProductIds } from '@/utils/medusa-product';
|
||||||
import { getAnalysisElementOriginalIds } from '@/utils/medusa-product';
|
import type { StoreProduct } from '@medusajs/types';
|
||||||
|
|
||||||
async function countryCodesLoader() {
|
async function countryCodesLoader() {
|
||||||
const countryCodes = await listRegions().then((regions) =>
|
const countryCodes = await listRegions().then((regions) =>
|
||||||
@@ -23,23 +23,32 @@ async function analysisPackagesLoader() {
|
|||||||
const [countryCodes, productTypes] = await Promise.all([loadCountryCodes(), loadProductTypes()]);
|
const [countryCodes, productTypes] = await Promise.all([loadCountryCodes(), loadProductTypes()]);
|
||||||
const countryCode = countryCodes[0]!;
|
const countryCode = countryCodes[0]!;
|
||||||
|
|
||||||
|
let analysisPackages: StoreProduct[] = [];
|
||||||
|
let analysisPackageElements: StoreProduct[] = [];
|
||||||
|
|
||||||
const productType = productTypes.find(({ metadata }) => metadata?.handle === 'analysis-packages');
|
const productType = productTypes.find(({ metadata }) => metadata?.handle === 'analysis-packages');
|
||||||
if (!productType) {
|
if (!productType) {
|
||||||
return { analysisElements: [], analysisPackages: [], countryCode };
|
return { analysisPackageElements, analysisPackages, countryCode };
|
||||||
}
|
}
|
||||||
|
|
||||||
const { response } = await listProducts({
|
const analysisPackagesResponse = await listProducts({
|
||||||
countryCode,
|
countryCode,
|
||||||
queryParams: { limit: 100, "type_id[0]": productType.id },
|
queryParams: { limit: 100, "type_id[0]": productType.id },
|
||||||
});
|
});
|
||||||
const analysisPackages = response.products;
|
analysisPackages = analysisPackagesResponse.response.products;
|
||||||
let analysisElements: AnalysisElement[] = [];
|
|
||||||
const analysisElementOriginalIds = getAnalysisElementOriginalIds(analysisPackages);
|
|
||||||
|
|
||||||
if (analysisElementOriginalIds.length) {
|
const analysisElementMedusaProductIds = getAnalysisElementMedusaProductIds(analysisPackages);
|
||||||
analysisElements = await getAnalysisElements({ originalIds: analysisElementOriginalIds });
|
if (analysisElementMedusaProductIds.length > 0) {
|
||||||
|
const { response: { products } } = await listProducts({
|
||||||
|
countryCode,
|
||||||
|
queryParams: {
|
||||||
|
id: analysisElementMedusaProductIds,
|
||||||
|
limit: 100,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
analysisPackageElements = products;
|
||||||
}
|
}
|
||||||
|
|
||||||
return { analysisElements, analysisPackages, countryCode };
|
return { analysisPackageElements, analysisPackages, countryCode };
|
||||||
}
|
}
|
||||||
export const loadAnalysisPackages = cache(analysisPackagesLoader);
|
export const loadAnalysisPackages = cache(analysisPackagesLoader);
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export const generateMetadata = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
async function SelectPackagePage() {
|
async function SelectPackagePage() {
|
||||||
const { analysisElements, analysisPackages, countryCode } = await loadAnalysisPackages();
|
const { analysisPackageElements, analysisPackages, countryCode } = await loadAnalysisPackages();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="container mx-auto my-24 flex flex-col items-center space-y-12">
|
<div className="container mx-auto my-24 flex flex-col items-center space-y-12">
|
||||||
@@ -34,8 +34,8 @@ async function SelectPackagePage() {
|
|||||||
<Trans i18nKey={'marketing:selectPackage'} />
|
<Trans i18nKey={'marketing:selectPackage'} />
|
||||||
</h3>
|
</h3>
|
||||||
<ComparePackagesModal
|
<ComparePackagesModal
|
||||||
analysisElements={analysisElements}
|
|
||||||
analysisPackages={analysisPackages}
|
analysisPackages={analysisPackages}
|
||||||
|
analysisPackageElements={analysisPackageElements}
|
||||||
triggerElement={
|
triggerElement={
|
||||||
<Button variant="secondary" className="gap-2">
|
<Button variant="secondary" className="gap-2">
|
||||||
<Trans i18nKey={'marketing:comparePackages'} />
|
<Trans i18nKey={'marketing:comparePackages'} />
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import { handleAddToCart } from '@/lib/services/medusaCart.service';
|
|||||||
|
|
||||||
import { PackageHeader } from './package-header';
|
import { PackageHeader } from './package-header';
|
||||||
import { ButtonTooltip } from './ui/button-tooltip';
|
import { ButtonTooltip } from './ui/button-tooltip';
|
||||||
import { getAnalysisElementOriginalIds } from '@/utils/medusa-product';
|
import { getAnalysisElementMedusaProductIds } from '@/utils/medusa-product';
|
||||||
|
|
||||||
export interface IAnalysisPackage {
|
export interface IAnalysisPackage {
|
||||||
titleKey: string;
|
titleKey: string;
|
||||||
@@ -52,8 +52,8 @@ export default function SelectAnalysisPackage({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const titleKey = analysisPackage.title;
|
const titleKey = analysisPackage.title;
|
||||||
const analysisElementOriginalIds = getAnalysisElementOriginalIds([analysisPackage]);
|
const analysisElementMedusaProductIds = getAnalysisElementMedusaProductIds([analysisPackage]);
|
||||||
const nrOfAnalyses = analysisElementOriginalIds.length;
|
const nrOfAnalyses = analysisElementMedusaProductIds.length;
|
||||||
const description = analysisPackage.description ?? '';
|
const description = analysisPackage.description ?? '';
|
||||||
const subtitle = analysisPackage.subtitle ?? '';
|
const subtitle = analysisPackage.subtitle ?? '';
|
||||||
const variant = analysisPackage.variants?.[0];
|
const variant = analysisPackage.variants?.[0];
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ export const listProducts = async ({
|
|||||||
regionId,
|
regionId,
|
||||||
}: {
|
}: {
|
||||||
pageParam?: number
|
pageParam?: number
|
||||||
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams & { "type_id[0]"?: string }
|
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams & { "type_id[0]"?: string; id?: string[] }
|
||||||
countryCode?: string
|
countryCode?: string
|
||||||
regionId?: string
|
regionId?: string
|
||||||
}): Promise<{
|
}): Promise<{
|
||||||
|
|||||||
@@ -1,17 +1,19 @@
|
|||||||
export const getAnalysisElementOriginalIds = (products: ({ metadata?: { analysisElementOriginalIds?: string } | null } | null)[]) => {
|
export const getAnalysisElementMedusaProductIds = (products: ({ metadata?: { analysisElementMedusaProductIds?: string } | null } | null)[]) => {
|
||||||
if (!products) {
|
if (!products) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return products
|
const mapped = products
|
||||||
.flatMap((product) => {
|
.flatMap((product) => {
|
||||||
const value = product?.metadata?.analysisElementOriginalIds;
|
const value = product?.metadata?.analysisElementMedusaProductIds;
|
||||||
try {
|
try {
|
||||||
return JSON.parse(value as string);
|
return JSON.parse(value as string);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Failed to parse analysisElementOriginalIds from analysis package, possibly invalid format", e);
|
console.error("Failed to parse analysisElementMedusaProductIds from analysis package, possibly invalid format", e);
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.filter(Boolean) as string[];
|
.filter(Boolean) as string[];
|
||||||
|
|
||||||
|
return [...new Set(mapped)];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user