Add global search, in-app + push notifications, and fix card/beneficiary/scroll issues

- Global feature search for the user app, wired to the home search icon
- Notifications screen: swipe-to-delete, vanish animation, unread badge,
  and Notifee-backed foreground + background (scheduled) OS notifications
- Fix Add Beneficiary save (single source of truth via beneficiaries slice)
- Fix Cards tab scroll freeze and bottom blank space (use ScreenShell scroll)
- User-friendly toast copy across the app
- Android build tuning: parallel/caching/JVM G1 args, mobile-only ABIs

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Abin Toppo
2026-06-02 16:36:27 +05:30
co-authored by Claude Opus 4.8
parent d7907e1d64
commit 58af541536
48 changed files with 1773 additions and 157 deletions
@@ -100,7 +100,7 @@ export default function BuyInsuranceScreen({ navigation, route }: Props) {
return;
}
toast('Unable to send OTP', 'error', 'Please try again.');
toast('Unable to send OTP', 'error', 'We could not send your code right now. Please try again.');
};
const handleConfirmPurchase = async () => {
@@ -116,7 +116,7 @@ export default function InsuranceClaimsScreen({ route }: Props) {
return;
}
toast('Unable to attach document', 'error', 'Please try again.');
toast('Couldn’t attach document', 'error', 'Something went wrong while uploading. Please try again.');
};
const handleRequestOtp = async () => {
@@ -136,7 +136,7 @@ export default function InsuranceClaimsScreen({ route }: Props) {
return;
}
toast('Unable to send OTP', 'error', 'Please try again.');
toast('Couldn’t send OTP', 'error', 'We couldn’t send your one-time password. Please try again.');
};
const handleSubmitClaim = async () => {
@@ -60,9 +60,9 @@ export default function InsuranceDocumentsScreen(_props: Props) {
const result = await uploadDocument(sample);
if ('data' in result) {
toast('Document uploaded', 'success', `${sample.name} is now available in the secure vault.`);
toast('Document uploaded', 'success', `${sample.name} is now saved securely with your documents.`);
} else {
toast('Upload failed', 'error', 'Please try again.');
toast('Upload didn’t go through', 'error', 'Please check your connection and try uploading again.');
}
};
@@ -118,7 +118,7 @@ export default function InsuranceDocumentsScreen(_props: Props) {
<InsuranceDocumentItem
document={item}
onView={() =>
toast('Document available', 'info', `${item.name} is stored in encrypted vault storage.`)
toast('Document available', 'info', `${item.name} is saved securely with your documents.`)
}
onReupload={() =>
void uploadDocument({
@@ -127,7 +127,7 @@ export default function InsurancePolicyDetailsScreen({ navigation, route }: Prop
toast(
'Policy download ready',
'success',
`${data.documents[0]?.name ?? 'Policy schedule'} is ready from the secure vault.`,
`${data.documents[0]?.name ?? 'Policy schedule'} is ready to download.`,
)
}
/>
@@ -65,10 +65,10 @@ export default function InsuranceRenewalsScreen({ route }: Props) {
toast(
enabled ? 'Auto-renew enabled' : 'Auto-renew disabled',
'success',
`${due.planName} has been updated.`,
`Your settings for ${due.planName} have been updated.`,
);
} else {
toast('Unable to update auto-renew', 'error', 'Please try again.');
toast('Couldn\'t update auto-renew', 'error', 'Something went wrong on our end. Please try again.');
}
};
@@ -87,7 +87,7 @@ export default function InsuranceRenewalsScreen({ route }: Props) {
return;
}
toast('Unable to send OTP', 'error', 'Please try again.');
toast('Couldn\'t send OTP', 'error', 'We couldn\'t send your code right now. Please try again.');
};
const handleConfirmPayment = async () => {