Update CBS Mobile App codebase

This commit is contained in:
Abin Toppo
2026-09-21 13:21:25 +05:30
parent 58af541536
commit 2dcb10775c
339 changed files with 26750 additions and 16767 deletions
@@ -2,7 +2,7 @@ import React, { memo } from 'react';
import { Pressable, StyleSheet, Text, View } from 'react-native';
import Ionicons from '@react-native-vector-icons/ionicons';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import type { InsuranceCategory } from '../types';
import { INSURANCE_CATEGORY_META } from '../types';
@@ -79,7 +79,7 @@ const styles = StyleSheet.create({
},
label: {
fontSize: 13,
fontWeight: '700',
fontFamily: fontFamily.bold,
},
});
@@ -2,7 +2,7 @@ import React, { memo } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { Card } from '../../../components';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatCurrency, formatDate } from '../../../utils/formatters';
import type { InsuranceClaim } from '../types';
import { InsuranceStatusPill } from './InsuranceStatusPill';
@@ -56,11 +56,11 @@ const styles = StyleSheet.create({
},
title: {
fontSize: 15,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
meta: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
notes: {
fontSize: 12,
@@ -71,7 +71,7 @@ const styles = StyleSheet.create({
},
metricText: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
});
@@ -2,7 +2,7 @@ import React, { memo } from 'react';
import { Pressable, StyleSheet, Text, View } from 'react-native';
import Ionicons from '@react-native-vector-icons/ionicons';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatDate } from '../../../utils/formatters';
import type { InsuranceDocument } from '../types';
import { InsuranceStatusPill } from './InsuranceStatusPill';
@@ -83,11 +83,11 @@ const styles = StyleSheet.create({
},
name: {
fontSize: 14,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
meta: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
reason: {
fontSize: 11,
@@ -99,7 +99,7 @@ const styles = StyleSheet.create({
},
link: {
fontSize: 12,
fontWeight: '700',
fontFamily: fontFamily.bold,
},
});
@@ -2,7 +2,7 @@ import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { AppModal, Button, Input } from '../../../components';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
interface InsuranceOtpModalProps {
visible: boolean;
@@ -67,12 +67,12 @@ const styles = StyleSheet.create({
},
hintLabel: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
hintValue: {
fontSize: 16,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
});
@@ -2,7 +2,7 @@ import React, { memo } from 'react';
import { Pressable, StyleSheet, Text, View } from 'react-native';
import Ionicons from '@react-native-vector-icons/ionicons';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import type { InsurancePaymentMethod } from '../types';
interface InsurancePaymentMethodTileProps {
@@ -103,7 +103,7 @@ const styles = StyleSheet.create({
},
label: {
fontSize: 14,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
description: {
fontSize: 12,
@@ -3,7 +3,7 @@ import { Pressable, StyleSheet, Text, View } from 'react-native';
import Ionicons from '@react-native-vector-icons/ionicons';
import { Button, Card } from '../../../components';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import type { InsurancePlan } from '../types';
import { formatCompactCurrency, formatCurrency } from '../../../utils/formatters';
@@ -140,11 +140,11 @@ const styles = StyleSheet.create({
},
title: {
fontSize: 16,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
subtitle: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
ratioBadge: {
minWidth: 68,
@@ -156,11 +156,11 @@ const styles = StyleSheet.create({
},
ratioValue: {
fontSize: 16,
fontWeight: '900',
fontFamily: fontFamily.bold,
},
ratioLabel: {
fontSize: 10,
fontWeight: '800',
fontFamily: fontFamily.bold,
letterSpacing: 0.5,
},
summary: {
@@ -179,17 +179,17 @@ const styles = StyleSheet.create({
},
metricLabel: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
metricValue: {
fontSize: 18,
fontWeight: '900',
fontFamily: fontFamily.bold,
},
metricCaption: {
fontSize: 11,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
listWrap: {
gap: 8,
@@ -202,7 +202,7 @@ const styles = StyleSheet.create({
listText: {
flex: 1,
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
lineHeight: 17,
},
actionRow: {
@@ -220,7 +220,7 @@ const styles = StyleSheet.create({
},
compareLabel: {
fontSize: 12,
fontWeight: '700',
fontFamily: fontFamily.bold,
},
selectButton: {
flex: 1,
@@ -3,7 +3,7 @@ import { Pressable, StyleSheet, Text, View } from 'react-native';
import Ionicons from '@react-native-vector-icons/ionicons';
import { Card } from '../../../components';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatCompactCurrency, formatCurrency, formatDate } from '../../../utils/formatters';
import type { InsurancePolicy } from '../types';
import { InsuranceStatusPill } from './InsuranceStatusPill';
@@ -80,11 +80,11 @@ const styles = StyleSheet.create({
},
title: {
fontSize: 16,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
meta: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
metrics: {
flexDirection: 'row',
@@ -95,13 +95,13 @@ const styles = StyleSheet.create({
},
metricLabel: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
metricValue: {
fontSize: 18,
fontWeight: '900',
fontFamily: fontFamily.bold,
marginTop: 4,
},
footer: {
@@ -116,7 +116,7 @@ const styles = StyleSheet.create({
},
footerText: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
});
@@ -7,7 +7,7 @@ import {
type LayoutChangeEvent,
} from 'react-native';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
interface InsuranceRangeSliderProps {
label: string;
@@ -118,13 +118,13 @@ const styles = StyleSheet.create({
},
label: {
fontSize: 12,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
value: {
fontSize: 14,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
track: {
height: 8,
@@ -1,33 +1,68 @@
import React, { memo } from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { useTheme } from '../../../theme';
import { textStyles, useTheme } from '../../../theme';
interface InsuranceStatusPillProps {
status: string;
}
const STATUS_COLORS: Record<string, string> = {
Active: '#10B981',
'Renewal Due': '#F59E0B',
Expired: '#EF4444',
'Grace Period': '#F97316',
Submitted: '#3B82F6',
'Under Review': '#6366F1',
Approved: '#10B981',
Rejected: '#EF4444',
Settled: '#059669',
uploaded: '#3B82F6',
verified: '#10B981',
rejected: '#EF4444',
/**
* A status as a tinted pill.
*
* ── WHY THIS HOLDS ROLE NAMES AND NOT COLOURS ───────────────────────────────
* This map used to hold twelve hex values, one per status, declared at module
* scope where the theme does not exist. That had two consequences: the pills
* could not follow a theme change, and the tint behind each one was built as
* `${hex}16` — the hue at ~9% alpha over whatever was underneath. On a white
* card that is a pale wash; on a dark card it is invisible.
*
* Naming a role instead lets the theme supply both halves — a legible tone and
* a measured tint surface — for whichever ramp is live.
*
* ── WHY TWELVE STATUSES SHARE FOUR TONES ────────────────────────────────────
* Twelve distinct colours is not twelve distinct meanings; it is four, said
* twelve ways. A customer reads the WORD to tell "Submitted" from "Under
* Review" — the colour only has to say which of four situations they are in:
* fine, needs attention, refused, or in progress. Collapsing them is what
* makes the colour informative rather than decorative.
*/
type Tone = 'success' | 'warning' | 'danger' | 'info';
const STATUS_TONES: Record<string, Tone> = {
/* Settled and done. */
Active: 'success',
Approved: 'success',
Settled: 'success',
verified: 'success',
/* Still fine, but the customer has something to do. */
'Renewal Due': 'warning',
'Grace Period': 'warning',
/* Refused or lapsed. */
Expired: 'danger',
Rejected: 'danger',
rejected: 'danger',
/* With the bank, nothing owed by the customer. */
Submitted: 'info',
'Under Review': 'info',
uploaded: 'info',
};
const InsuranceStatusPillComponent = ({ status }: InsuranceStatusPillProps) => {
const theme = useTheme();
const color = STATUS_COLORS[status] ?? theme.colors.primary;
const tone = STATUS_TONES[status];
// An unmapped status falls back to the brand tint rather than to one of the
// four meanings — telling a customer "approved" because a new status string
// was not added here would be worse than saying nothing.
const color = tone ? theme.colors[tone] : theme.colors.primary;
const background = tone ? theme.colors[`${tone}Surface`] : theme.colors.primarySurface;
return (
<View style={[styles.pill, { backgroundColor: `${color}16` }]}>
<View style={[styles.pill, { backgroundColor: background }]}>
<Text style={[styles.label, { color }]}>{status}</Text>
</View>
);
@@ -40,11 +75,12 @@ const styles = StyleSheet.create({
paddingVertical: 6,
alignSelf: 'flex-start',
},
// `eyebrow` is the scale entry for exactly this: an 11pt uppercase label
// with wide tracking. It is what the hand-rolled
// fontSize/fontWeight/textTransform/letterSpacing block here was
// approximating.
label: {
fontSize: 11,
fontWeight: '800',
textTransform: 'uppercase',
letterSpacing: 0.5,
...textStyles.eyebrow,
},
});
@@ -7,7 +7,7 @@ import { Button, Card, Input, ScreenShell } from '../../../components';
import { ToggleSwitch } from '../../cards/components/ToggleSwitch';
import { useToast } from '../../../hooks/useToast';
import type { InsuranceStackParamList } from '../../../navigation/types';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatCompactCurrency, formatCurrency } from '../../../utils/formatters';
import { InsuranceCategoryChip } from '../components/InsuranceCategoryChip';
import { InsuranceOtpModal } from '../components/InsuranceOtpModal';
@@ -558,7 +558,7 @@ const styles = StyleSheet.create({
},
stepLabel: {
fontSize: 11,
fontWeight: '800',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
@@ -567,7 +567,7 @@ const styles = StyleSheet.create({
},
sectionTitle: {
fontSize: 16,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
categoryWrap: {
flexDirection: 'row',
@@ -591,7 +591,7 @@ const styles = StyleSheet.create({
},
errorText: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
actionStack: {
gap: 10,
@@ -603,15 +603,15 @@ const styles = StyleSheet.create({
},
summaryTitle: {
fontSize: 15,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
summaryCopy: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
summaryAmount: {
fontSize: 13,
fontWeight: '700',
fontFamily: fontFamily.bold,
},
sectionHeader: {
flexDirection: 'row',
@@ -5,7 +5,7 @@ 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 } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatCompactCurrency, formatCurrency } from '../../../utils/formatters';
import { InsuranceCategoryChip } from '../components/InsuranceCategoryChip';
import { InsuranceRangeSlider } from '../components/InsuranceRangeSlider';
@@ -211,7 +211,7 @@ const styles = StyleSheet.create({
},
sectionTitle: {
fontSize: 16,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
categoryWrap: {
flexDirection: 'row',
@@ -233,13 +233,13 @@ const styles = StyleSheet.create({
},
resultLabel: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
resultValue: {
fontSize: 18,
fontWeight: '900',
fontFamily: fontFamily.bold,
},
recommendation: {
fontSize: 12,
@@ -11,7 +11,7 @@ import type { NativeStackScreenProps } from '@react-navigation/native-stack';
import { Button, Card, EmptyState, Input, Loader, ScreenShell } from '../../../components';
import { useToast } from '../../../hooks/useToast';
import type { InsuranceStackParamList } from '../../../navigation/types';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatCurrency, formatDate } from '../../../utils/formatters';
import { InsuranceClaimCard } from '../components/InsuranceClaimCard';
import { InsuranceDocumentItem } from '../components/InsuranceDocumentItem';
@@ -357,7 +357,7 @@ const styles = StyleSheet.create({
},
sectionTitle: {
fontSize: 16,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
policyWrap: {
gap: 10,
@@ -369,7 +369,7 @@ const styles = StyleSheet.create({
},
policySummaryTitle: {
fontSize: 14,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
policySummaryText: {
fontSize: 12,
@@ -384,7 +384,7 @@ const styles = StyleSheet.create({
},
errorText: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
separator: {
height: 12,
@@ -4,7 +4,7 @@ import type { NativeStackScreenProps } from '@react-navigation/native-stack';
import { Button, Card, EmptyState, Loader, ScreenShell } from '../../../components';
import type { InsuranceStackParamList } from '../../../navigation/types';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatCompactCurrency, formatCurrency } from '../../../utils/formatters';
import { useCompareInsurancePlansQuery } from '../services/insuranceApi';
@@ -122,7 +122,7 @@ const styles = StyleSheet.create({
},
rowLabel: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
@@ -136,7 +136,7 @@ const styles = StyleSheet.create({
},
valueText: {
fontSize: 14,
fontWeight: '700',
fontFamily: fontFamily.bold,
},
planColumnWrap: {
flexDirection: 'row',
@@ -149,11 +149,11 @@ const styles = StyleSheet.create({
},
planTitle: {
fontSize: 15,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
planSubtitle: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
planBullet: {
fontSize: 12,
@@ -13,7 +13,7 @@ import Animated, { FadeInDown } from 'react-native-reanimated';
import { Button, Card, EmptyState, Loader, ScreenShell } from '../../../components';
import type { InsuranceStackParamList } from '../../../navigation/types';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import {
formatCompactCurrency,
formatCurrency,
@@ -306,13 +306,13 @@ const styles = StyleSheet.create({
},
heroEyebrow: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.6,
},
heroTitle: {
fontSize: 28,
fontWeight: '900',
fontFamily: fontFamily.bold,
marginTop: 4,
},
heroSubtitle: {
@@ -330,11 +330,11 @@ const styles = StyleSheet.create({
},
heroBadgeValue: {
fontSize: 22,
fontWeight: '900',
fontFamily: fontFamily.bold,
},
heroBadgeLabel: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
@@ -350,17 +350,17 @@ const styles = StyleSheet.create({
},
metricLabel: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
metricValue: {
fontSize: 18,
fontWeight: '900',
fontFamily: fontFamily.bold,
},
metricCaption: {
fontSize: 11,
fontWeight: '600',
fontFamily: fontFamily.semibold,
lineHeight: 16,
},
sectionCard: {
@@ -368,7 +368,7 @@ const styles = StyleSheet.create({
},
sectionTitle: {
fontSize: 17,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
actionRow: {
flexDirection: 'row',
@@ -392,7 +392,7 @@ const styles = StyleSheet.create({
},
linkText: {
fontSize: 12,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
notificationCard: {
gap: 0,
@@ -410,7 +410,7 @@ const styles = StyleSheet.create({
},
notificationTitle: {
fontSize: 14,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
notificationBody: {
fontSize: 12,
@@ -11,7 +11,7 @@ import type { NativeStackScreenProps } from '@react-navigation/native-stack';
import { Button, Card, EmptyState, Loader, ScreenShell } from '../../../components';
import { useToast } from '../../../hooks/useToast';
import type { InsuranceStackParamList } from '../../../navigation/types';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { InsuranceDocumentItem } from '../components/InsuranceDocumentItem';
import { useGetInsuranceDocumentsQuery, useUploadInsuranceDocumentMutation } from '../services/insuranceApi';
@@ -165,7 +165,7 @@ const styles = StyleSheet.create({
},
sectionTitle: {
fontSize: 16,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
actionRow: {
flexDirection: 'row',
@@ -12,7 +12,7 @@ import Ionicons from '@react-native-vector-icons/ionicons';
import { Card, EmptyState, Loader, ScreenShell } from '../../../components';
import type { InsuranceStackParamList } from '../../../navigation/types';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatDate } from '../../../utils/formatters';
import {
useGetInsuranceNotificationsQuery,
@@ -27,7 +27,10 @@ export default function InsuranceNotificationsScreen(_props: Props) {
const [markRead] = useMarkInsuranceNotificationReadMutation();
return (
<ScreenShell title="Notifications" subtitle="Premiums, renewals, claim updates, and offers">
<ScreenShell
// The body is a FlatList, so it owns the scrolling.
scrollable={false}
title="Notifications" subtitle="Premiums, renewals, claim updates, and offers">
<FlatList
data={data ?? []}
keyExtractor={(item) => item.id}
@@ -107,7 +110,7 @@ const styles = StyleSheet.create({
},
title: {
fontSize: 15,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
body: {
fontSize: 12,
@@ -115,7 +118,7 @@ const styles = StyleSheet.create({
},
date: {
fontSize: 11,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
unreadWrap: {
width: 26,
@@ -10,7 +10,7 @@ import type { NativeStackScreenProps } from '@react-navigation/native-stack';
import { Button, Card, EmptyState, Loader, ScreenShell } from '../../../components';
import type { InsuranceStackParamList } from '../../../navigation/types';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatCompactCurrency } from '../../../utils/formatters';
import { InsurancePolicyCard } from '../components/InsurancePolicyCard';
import { useGetInsurancePoliciesQuery } from '../services/insuranceApi';
@@ -107,13 +107,13 @@ const styles = StyleSheet.create({
},
summaryLabel: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
summaryValue: {
fontSize: 26,
fontWeight: '900',
fontFamily: fontFamily.bold,
},
summaryCaption: {
fontSize: 12,
@@ -6,7 +6,7 @@ import Ionicons from '@react-native-vector-icons/ionicons';
import { Button, Card, EmptyState, Loader, ScreenShell } from '../../../components';
import { useToast } from '../../../hooks/useToast';
import type { InsuranceStackParamList } from '../../../navigation/types';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatCompactCurrency, formatCurrency, formatDate } from '../../../utils/formatters';
import { InsuranceStatusPill } from '../components/InsuranceStatusPill';
import { useGetInsurancePolicyDetailQuery } from '../services/insuranceApi';
@@ -249,11 +249,11 @@ const styles = StyleSheet.create({
},
heroTitle: {
fontSize: 18,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
heroMeta: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
metricGrid: {
flexDirection: 'row',
@@ -267,17 +267,17 @@ const styles = StyleSheet.create({
},
metricLabel: {
fontSize: 11,
fontWeight: '700',
fontFamily: fontFamily.bold,
textTransform: 'uppercase',
letterSpacing: 0.5,
},
metricValue: {
fontSize: 18,
fontWeight: '900',
fontFamily: fontFamily.bold,
},
metricCaption: {
fontSize: 11,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
infoList: {
gap: 6,
@@ -287,7 +287,7 @@ const styles = StyleSheet.create({
lineHeight: 18,
},
infoStrong: {
fontWeight: '700',
fontFamily: fontFamily.bold,
},
actionCard: {
gap: 12,
@@ -304,7 +304,7 @@ const styles = StyleSheet.create({
},
sectionTitle: {
fontSize: 16,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
listRow: {
flexDirection: 'row',
@@ -315,7 +315,7 @@ const styles = StyleSheet.create({
flex: 1,
fontSize: 12,
lineHeight: 18,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
documentRow: {
flexDirection: 'row',
@@ -330,10 +330,10 @@ const styles = StyleSheet.create({
},
documentName: {
fontSize: 14,
fontWeight: '700',
fontFamily: fontFamily.bold,
},
documentMeta: {
fontSize: 11,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
});
@@ -12,7 +12,7 @@ import { Button, Card, EmptyState, Loader, ScreenShell } from '../../../componen
import { ToggleSwitch } from '../../cards/components/ToggleSwitch';
import { useToast } from '../../../hooks/useToast';
import type { InsuranceStackParamList } from '../../../navigation/types';
import { useTheme } from '../../../theme';
import { useTheme, fontFamily } from '../../../theme';
import { formatCurrency, formatDate } from '../../../utils/formatters';
import { InsuranceOtpModal } from '../components/InsuranceOtpModal';
import { InsurancePaymentMethodTile } from '../components/InsurancePaymentMethodTile';
@@ -125,7 +125,10 @@ export default function InsuranceRenewalsScreen({ route }: Props) {
};
return (
<ScreenShell title="Renewals" subtitle="Pay premiums and manage auto-renew">
<ScreenShell
// The body is a FlatList, so it owns the scrolling.
scrollable={false}
title="Renewals" subtitle="Pay premiums and manage auto-renew">
<FlatList
data={filteredDues}
keyExtractor={(item) => item.id}
@@ -256,7 +259,7 @@ const styles = StyleSheet.create({
},
sectionTitle: {
fontSize: 16,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
dueCard: {
gap: 12,
@@ -272,11 +275,11 @@ const styles = StyleSheet.create({
},
planTitle: {
fontSize: 15,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
planMeta: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
metricRow: {
flexDirection: 'row',
@@ -285,11 +288,11 @@ const styles = StyleSheet.create({
},
metricLabel: {
fontSize: 12,
fontWeight: '600',
fontFamily: fontFamily.semibold,
},
metricValue: {
fontSize: 14,
fontWeight: '800',
fontFamily: fontFamily.bold,
},
separator: {
height: 12,