import React, { useEffect, useMemo } from 'react'; import { ScrollView, StyleSheet, Text, View } from 'react-native'; import type { NativeStackScreenProps } from '@react-navigation/native-stack'; import { useAppDispatch, useAppSelector } from '../../../app/hooks'; import { Button, Card, Input, ScreenShell } from '../../../components'; import type { InsuranceStackParamList } from '../../../navigation/types'; import { useTheme, fontFamily } from '../../../theme'; import { formatCompactCurrency, formatCurrency } from '../../../utils/formatters'; import { InsuranceCategoryChip } from '../components/InsuranceCategoryChip'; import { InsuranceRangeSlider } from '../components/InsuranceRangeSlider'; import { useEstimateInsurancePremiumQuery } from '../services/insuranceApi'; import { insuranceActions } from '../store/insuranceSlice'; import { selectInsuranceCalculator } from '../store/insuranceSelectors'; import { INSURANCE_CATEGORIES } from '../types'; type Props = NativeStackScreenProps; export default function InsuranceCalculatorScreen({ navigation, route }: Props) { const dispatch = useAppDispatch(); const theme = useTheme(); const calculator = useAppSelector(selectInsuranceCalculator); const effectiveCategory = calculator.category; useEffect(() => { if (route.params?.category) { dispatch( insuranceActions.updateInsuranceCalculator({ field: 'category', value: route.params.category, }), ); } }, [dispatch, route.params?.category]); const estimateQuery = useEstimateInsurancePremiumQuery({ ...calculator, category: effectiveCategory, }); const estimate = estimateQuery.data; const coverageValue = useMemo( () => Number(calculator.coverageAmount || 0), [calculator.coverageAmount], ); return ( Policy category {INSURANCE_CATEGORIES.map((category) => ( dispatch( insuranceActions.updateInsuranceCalculator({ field: 'category', value: category, }), ) } /> ))} Adjust your assumptions dispatch( insuranceActions.updateInsuranceCalculator({ field: 'age', value: String(value), }), ) } /> formatCompactCurrency(value)} onValueChange={(value) => dispatch( insuranceActions.updateInsuranceCalculator({ field: 'coverageAmount', value: String(value), }), ) } /> dispatch( insuranceActions.updateInsuranceCalculator({ field: 'tenureYears', value: String(value), }), ) } /> Manual inputs dispatch( insuranceActions.updateInsuranceCalculator({ field: 'age', value }), ) } /> dispatch( insuranceActions.updateInsuranceCalculator({ field: 'coverageAmount', value, }), ) } /> dispatch( insuranceActions.updateInsuranceCalculator({ field: 'tenureYears', value, }), ) } /> Estimated premium Monthly {estimate ? formatCurrency(estimate.monthlyPremium) : '--'} Annual {estimate ? formatCurrency(estimate.annualPremium) : '--'} Recommended protection: {estimate ? formatCompactCurrency(estimate.recommendedCover) : '--'}