feat(MED-131): analysis package has list of medusa product IDs, not medipost IDs

This commit is contained in:
2025-08-04 12:44:36 +03:00
parent 0d1e255fe2
commit 853bd75119
7 changed files with 49 additions and 41 deletions

View File

@@ -20,7 +20,7 @@ export const generateMetadata = async () => {
};
async function OrderAnalysisPackagePage() {
const { analysisElements, analysisPackages, countryCode } = await loadAnalysisPackages();
const { analysisPackageElements, analysisPackages, countryCode } = await loadAnalysisPackages();
return (
<PageBody>
@@ -29,8 +29,8 @@ async function OrderAnalysisPackagePage() {
<Trans i18nKey={'marketing:selectPackage'} />
</h3>
<ComparePackagesModal
analysisElements={analysisElements}
analysisPackages={analysisPackages}
analysisPackageElements={analysisPackageElements}
triggerElement={
<Button variant="secondary" className="gap-2">
<Trans i18nKey={'marketing:comparePackages'} />

View File

@@ -23,8 +23,7 @@ import { withI18n } from '~/lib/i18n/with-i18n';
import { PackageHeader } from '@/components/package-header';
import { InfoTooltip } from '@/components/ui/info-tooltip';
import { StoreProduct } from '@medusajs/types';
import type { AnalysisElement } from '~/lib/services/analysis-element.service';
import { getAnalysisElementOriginalIds } from '@/utils/medusa-product';
import { getAnalysisElementMedusaProductIds } from '@/utils/medusa-product';
const CheckWithBackground = () => {
return (
@@ -53,12 +52,12 @@ const PackageTableHead = async ({ product, nrOfAnalyses }: { product: StoreProdu
}
const ComparePackagesModal = async ({
analysisElements,
analysisPackages,
analysisPackageElements,
triggerElement,
}: {
analysisElements: AnalysisElement[];
analysisPackages: StoreProduct[];
analysisPackageElements: StoreProduct[];
triggerElement: JSX.Element;
}) => {
const { t } = await createI18nServerInstance();
@@ -71,9 +70,9 @@ const ComparePackagesModal = async ({
return null;
}
const standardPackageAnalyses = getAnalysisElementOriginalIds([standardPackage]);
const standardPlusPackageAnalyses = getAnalysisElementOriginalIds([standardPlusPackage]);
const premiumPackageAnalyses = getAnalysisElementOriginalIds([premiumPackage]);
const standardPackageAnalyses = getAnalysisElementMedusaProductIds([standardPackage]);
const standardPlusPackageAnalyses = getAnalysisElementMedusaProductIds([standardPlusPackage]);
const premiumPackageAnalyses = getAnalysisElementMedusaProductIds([premiumPackage]);
return (
<Dialog>
@@ -110,28 +109,26 @@ const ComparePackagesModal = async ({
</TableRow>
</TableHeader>
<TableBody>
{analysisElements.map(
{analysisPackageElements.map(
(
{
analysis_name_lab: analysisName,
analysis_id_original: analysisId,
title,
id,
description,
},
index,
) => {
if (!analysisName) {
if (!title) {
return null;
}
const includedInStandard = standardPackageAnalyses.includes(analysisId);
const includedInStandardPlus = standardPlusPackageAnalyses.includes(analysisId);
const includedInPremium = premiumPackageAnalyses.includes(analysisId);
const includedInStandard = standardPackageAnalyses.includes(id);
const includedInStandardPlus = standardPlusPackageAnalyses.includes(id);
const includedInPremium = premiumPackageAnalyses.includes(id);
return (
<TableRow key={index}>
<TableCell className="py-6">
{analysisName}{' '}
{/* <InfoTooltip
content={t(tooltipContentKey)}
icon={<QuestionMarkCircledIcon />}
/> */}
{title}{' '}
{description && (<InfoTooltip content={description} icon={<QuestionMarkCircledIcon />} />)}
</TableCell>
<TableCell align="center" className="py-6">
{includedInStandard && <CheckWithBackground />}

View File

@@ -2,8 +2,8 @@ import { cache } from 'react';
import { listProductTypes, listProducts } from "@lib/data/products";
import { listRegions } from '@lib/data/regions';
import { AnalysisElement, getAnalysisElements } from '~/lib/services/analysis-element.service';
import { getAnalysisElementOriginalIds } from '@/utils/medusa-product';
import { getAnalysisElementMedusaProductIds } from '@/utils/medusa-product';
import type { StoreProduct } from '@medusajs/types';
async function countryCodesLoader() {
const countryCodes = await listRegions().then((regions) =>
@@ -23,23 +23,32 @@ async function analysisPackagesLoader() {
const [countryCodes, productTypes] = await Promise.all([loadCountryCodes(), loadProductTypes()]);
const countryCode = countryCodes[0]!;
let analysisPackages: StoreProduct[] = [];
let analysisPackageElements: StoreProduct[] = [];
const productType = productTypes.find(({ metadata }) => metadata?.handle === 'analysis-packages');
if (!productType) {
return { analysisElements: [], analysisPackages: [], countryCode };
return { analysisPackageElements, analysisPackages, countryCode };
}
const { response } = await listProducts({
const analysisPackagesResponse = await listProducts({
countryCode,
queryParams: { limit: 100, "type_id[0]": productType.id },
});
const analysisPackages = response.products;
let analysisElements: AnalysisElement[] = [];
const analysisElementOriginalIds = getAnalysisElementOriginalIds(analysisPackages);
analysisPackages = analysisPackagesResponse.response.products;
if (analysisElementOriginalIds.length) {
analysisElements = await getAnalysisElements({ originalIds: analysisElementOriginalIds });
const analysisElementMedusaProductIds = getAnalysisElementMedusaProductIds(analysisPackages);
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);

View File

@@ -24,7 +24,7 @@ export const generateMetadata = async () => {
};
async function SelectPackagePage() {
const { analysisElements, analysisPackages, countryCode } = await loadAnalysisPackages();
const { analysisPackageElements, analysisPackages, countryCode } = await loadAnalysisPackages();
return (
<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'} />
</h3>
<ComparePackagesModal
analysisElements={analysisElements}
analysisPackages={analysisPackages}
analysisPackageElements={analysisPackageElements}
triggerElement={
<Button variant="secondary" className="gap-2">
<Trans i18nKey={'marketing:comparePackages'} />

View File

@@ -19,7 +19,7 @@ import { handleAddToCart } from '@/lib/services/medusaCart.service';
import { PackageHeader } from './package-header';
import { ButtonTooltip } from './ui/button-tooltip';
import { getAnalysisElementOriginalIds } from '@/utils/medusa-product';
import { getAnalysisElementMedusaProductIds } from '@/utils/medusa-product';
export interface IAnalysisPackage {
titleKey: string;
@@ -52,8 +52,8 @@ export default function SelectAnalysisPackage({
}
const titleKey = analysisPackage.title;
const analysisElementOriginalIds = getAnalysisElementOriginalIds([analysisPackage]);
const nrOfAnalyses = analysisElementOriginalIds.length;
const analysisElementMedusaProductIds = getAnalysisElementMedusaProductIds([analysisPackage]);
const nrOfAnalyses = analysisElementMedusaProductIds.length;
const description = analysisPackage.description ?? '';
const subtitle = analysisPackage.subtitle ?? '';
const variant = analysisPackage.variants?.[0];

View File

@@ -14,7 +14,7 @@ export const listProducts = async ({
regionId,
}: {
pageParam?: number
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams & { "type_id[0]"?: string }
queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams & { "type_id[0]"?: string; id?: string[] }
countryCode?: string
regionId?: string
}): Promise<{

View File

@@ -1,17 +1,19 @@
export const getAnalysisElementOriginalIds = (products: ({ metadata?: { analysisElementOriginalIds?: string } | null } | null)[]) => {
export const getAnalysisElementMedusaProductIds = (products: ({ metadata?: { analysisElementMedusaProductIds?: string } | null } | null)[]) => {
if (!products) {
return [];
}
return products
const mapped = products
.flatMap((product) => {
const value = product?.metadata?.analysisElementOriginalIds;
const value = product?.metadata?.analysisElementMedusaProductIds;
try {
return JSON.parse(value as string);
} 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 [];
}
})
.filter(Boolean) as string[];
return [...new Set(mapped)];
}