2021-10-26 21:23:08 -07:00
|
|
|
import { Typography } from 'antd';
|
2023-03-21 18:36:21 -07:00
|
|
|
import React, { useEffect, useMemo } from 'react';
|
2021-10-26 21:23:08 -07:00
|
|
|
import { v4 as uuidv4 } from 'uuid';
|
2025-04-16 16:55:38 -07:00
|
|
|
|
|
|
|
import analytics, { EventType } from '@app/analytics';
|
|
|
|
import { renderTypeToRenderer } from '@app/recommendations/renderers';
|
|
|
|
import { RecommendationDisplayType } from '@app/recommendations/types';
|
|
|
|
|
|
|
|
import { RecommendationModule as RecommendationModuleType, ScenarioType } from '@types';
|
2021-10-26 21:23:08 -07:00
|
|
|
|
|
|
|
type Props = {
|
|
|
|
module: RecommendationModuleType;
|
|
|
|
scenarioType: ScenarioType;
|
|
|
|
displayType?: RecommendationDisplayType;
|
|
|
|
showTitle?: boolean;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const RecommendationModule = ({ module, scenarioType, displayType, showTitle }: Props) => {
|
|
|
|
const finalDisplayType = displayType || RecommendationDisplayType.DEFAULT;
|
|
|
|
const renderId = useMemo(() => uuidv4(), []);
|
2023-03-21 18:36:21 -07:00
|
|
|
useEffect(() => {
|
|
|
|
analytics.event({
|
|
|
|
type: EventType.RecommendationImpressionEvent,
|
|
|
|
moduleId: module.moduleId,
|
|
|
|
renderType: module.renderType,
|
|
|
|
scenarioType,
|
|
|
|
});
|
|
|
|
}, [module, scenarioType]);
|
2021-10-26 21:23:08 -07:00
|
|
|
const RecommendationRenderer = renderTypeToRenderer.get(module.renderType);
|
|
|
|
if (!RecommendationRenderer) {
|
|
|
|
console.error(`Failed to find renderer corresponding to renderType ${module.renderType}`);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
{showTitle && <Typography.Title level={4}>{module.title}</Typography.Title>}
|
|
|
|
<RecommendationRenderer
|
|
|
|
renderId={renderId}
|
|
|
|
moduleId={module.moduleId}
|
|
|
|
scenarioType={scenarioType}
|
|
|
|
renderType={module.renderType}
|
|
|
|
content={module.content}
|
|
|
|
displayType={finalDisplayType}
|
|
|
|
/>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
};
|