import { Text, TouchableOpacity, Image, View } from 'react-native'; import type { ContentItem, ElementProperty } from '../types'; import { getElementContent, getElementImageUrl } from '../utils'; import { onClick } from '../utils/onClick'; import { getLayoutStyles, getTextStyles, getViewStyles, } from '../utils/styleKeys'; import type { ContentViewItem } from '../store/contentModel'; import Resync from 'resync-javascript'; import { useEffect } from 'react'; import Icon from './icon'; /** * Basic element renderer without form dependencies * This is used to break the circular dependency between elements and forms */ export const RenderBasicElement = ({ element, dataItem, contentItem, }: { element: ContentItem; dataItem?: Record; contentItem?: ContentViewItem; }) => { useEffect(() => { if (element?.event && contentItem?.content?.id) { if (element.eventConfig?.action === 'view') { Resync.logEvent({ eventId: element.event?.eventId, logId: element.eventConfig?.logId || '', }); if (contentItem?.logAnalytics && element.eventConfig?.logId) { contentItem.logAnalytics(element.eventConfig?.logId, { itemId: element?.itemId, contentViewId: contentItem?.content?.id, ...element.eventConfig, }); } } } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if (!element || !contentItem) return null; if (!element.isVisible) return null; const elementData = element.data as ElementProperty; const elementContent = getElementContent(element, dataItem || {}); const handleClick = () => { if (element.eventConfig?.action === 'click' && contentItem?.content?.id) { Resync.logEvent({ eventId: element.event?.eventId || '', logId: element.eventConfig?.logId || '', }); if (contentItem?.logAnalytics && element.eventConfig?.logId) { contentItem.logAnalytics(element.eventConfig?.logId, { itemId: element?.itemId, contentViewId: contentItem?.content?.id, ...element.eventConfig, metadata: dataItem, }); } } onClick({ clickAction: elementData?.clickAction || null, functionRegistry: contentItem?.functionRegistry, navigationRegistry: contentItem?.navigationRegistry, dataItem: dataItem, }); }; switch (element.elementType) { case 'icon': return ( ); case 'text': return ( {elementContent} ); case 'button': return ( {elementData?.icon?.name && elementData.properties?.iconPosition === 'left' && ( )} {elementContent} {elementData?.icon?.name && elementData.properties?.iconPosition === 'right' && ( )} ); case 'image': const imageUrl = getElementImageUrl(element, dataItem || {}); if (elementData.clickAction) { return ( ); } return ( ); case 'divider': return ( ); default: return null; } };