// template/src/components/Tile/index.tsx import React from 'react'; import { View, Text, TouchableOpacity } from 'react-native'; import { TileProps, AccountTileData, CreditTileData, ServiceTileData, ServiceGridData, PromotionalTileData } from './types'; import { createTileStyles } from './styles'; import { useTheme } from '../../theme/ThemeProvider'; import { Icon } from '@components/Icon'; import { ThemedText } from '@components/ThemedText'; import { AmountDisplay } from '@components/AmountDisplay'; const Tile: React.FC = ({ type, data, style }) => { // Get theme from context const { theme, isLoading } = useTheme(); // Show loading state while theme is loading if (isLoading || !theme) { return ( Loading theme... ); } // Create theme-aware styles const styles = createTileStyles(theme); const renderTile = () => { // ... rest of your existing code stays the same switch (type) { case 'account': return renderAccountTile(data as AccountTileData); case 'creditCard': return renderCreditTile(data as CreditTileData); case 'service': return renderServiceTile(data as ServiceTileData); case 'serviceGrid': return renderServiceGrid(data as ServiceGridData); case 'promotional': return renderPromotionalTile(data as PromotionalTileData); default: return Unknown tile type; } }; const renderAccountTile = (tileData: AccountTileData) => { if (tileData.variant === 'condensed') { return ( <> {tileData.title} {tileData.subtitle && ( {tileData.subtitle} )} {/* Promo Message as separate element */} {tileData.promoMessage && ( {tileData.promoMessage.text} {tileData.promoMessage.showArrow && ( )} )} ); } // Detailed variant (existing layout) return ( <> {tileData.title} {tileData.subtitle} {tileData.showMenu && ( ••• )} {tileData.balance < 0 ? '-' : ''}£{Math.abs(tileData.balance).toFixed(2)} {tileData.balanceLabel && ( {tileData.balanceLabel} )} {tileData.additionalInfo && ( {tileData.additionalInfo} )} {/* Actions inside the main tile */} {tileData.actions && tileData.actions.length > 0 && ( {tileData.actions.map((action, index) => ( {action.label} ))} )} {/* Promo Message as separate element */} {tileData.promoMessage && ( {tileData.promoMessage.text} {tileData.promoMessage.showArrow && ( )} )} ); }; const renderCreditTile = (tileData: CreditTileData) => ( {tileData.title} {tileData.subtitle} {tileData.showMenu && ( ••• )} £{tileData.balance.toLocaleString()} {tileData.balanceLabel && ( {tileData.balanceLabel} )} {tileData.availableCredit && ( Available credit: £{tileData.availableCredit.toLocaleString()} )} {tileData.details && tileData.details.length > 0 && ( {tileData.details.map((detail, index) => ( {detail.label} {detail.value} ))} )} {tileData.primaryAction && ( {tileData.primaryAction.label} )} ); const renderServiceTile = (tileData: ServiceTileData) => ( {tileData.title} {tileData.badge && ( {tileData.badge.text} )} {tileData.description} {tileData.showArrow && ( )} ); const renderServiceGrid = (gridData: ServiceGridData) => ( {gridData.items.map((item) => ( {item.title} {item.description} ))} ); const renderPromotionalTile = (tileData: PromotionalTileData) => ( {tileData.title} {tileData.description} {tileData.action.label} {tileData.image && ( )} ); return renderTile(); }; export default Tile; // Re-export types for convenience export * from './types';