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
@@ -24,7 +24,7 @@ export default function CertificateListScreen({ route }: Props) {
}));
const handleDownload = (docName: string) => {
toast('Download Started', 'success', `${docName} is being securely downloaded to your device.`);
toast('Download started', 'success', `${docName} is being saved securely to your device.`);
};
return (
@@ -20,7 +20,7 @@ export default function ChequeBookRequestScreen({ navigation }: Props) {
setIsLoading(true);
setTimeout(() => {
setIsLoading(false);
toast('Request Submitted', 'success', 'Your cheque book will be delivered in 3-5 days.');
toast('Request submitted', 'success', 'Your cheque book will arrive in 3 to 5 days.');
navigation.goBack();
}, 1500);
};
@@ -18,13 +18,13 @@ export default function Form15G15HScreen({ navigation }: Props) {
const handleSubmit = () => {
if (!panNumber || !estimatedIncome) {
toast('Validation Failed', 'error', 'PAN and estimated income are required.');
toast('Some details are missing', 'error', 'Please enter your PAN and estimated income to continue.');
return;
}
setIsLoading(true);
setTimeout(() => {
setIsLoading(false);
toast('Form Submitted successfully', 'success', `Your Form ${formType} has been recorded for the current FY.`);
toast('Form submitted', 'success', `Your Form ${formType} has been recorded for the current financial year.`);
navigation.goBack();
}, 1500);
};
@@ -78,7 +78,7 @@ export default function Form15G15HScreen({ navigation }: Props) {
<Text style={{ fontWeight: '700', color: theme.colors.textPrimary }}>Form 15G - FY 24-25</Text>
<Text style={{ fontSize: 12, color: theme.colors.textSecondary }}>Submitted April 2025</Text>
</View>
<Button title="Download" variant="ghost" onPress={() => toast('Downloading...', 'info')} />
<Button title="Download" variant="ghost" onPress={() => toast('Download started', 'info', 'Your form is being prepared for download.')} />
</Card>
</View>
</ScreenShell>
@@ -20,13 +20,13 @@ export default function PositivePayScreen({ navigation }: Props) {
const handleSubmit = () => {
if (!chequeNumber || !amount || !payee) {
toast('Incomplete Form', 'error', 'Please fill all required details.');
toast('Some details are missing', 'error', 'Please fill in all the required details to continue.');
return;
}
setIsLoading(true);
setTimeout(() => {
setIsLoading(false);
toast('Verification Submitted', 'success', `Details for Cheque #${chequeNumber} saved securely.`);
toast('Cheque details submitted', 'success', `Your details for cheque #${chequeNumber} have been saved securely.`);
navigation.goBack();
}, 1500);
};
@@ -80,9 +80,9 @@ export default function ServicesHubScreen({ navigation }: Props) {
iconColor: '#0EA5E9',
onPress: () =>
toast(
'Support chat screen pending',
'Support chat coming soon',
'info',
'This feature is coming in the next update.',
'This feature will be available in the next update.',
),
},
{
@@ -91,7 +91,7 @@ export default function ServicesHubScreen({ navigation }: Props) {
icon: 'help-circle-outline',
iconColor: '#8B5CF6',
onPress: () =>
toast('Help center pending', 'info', 'Coming soon.'),
toast('Help center coming soon', 'info', 'This feature will be available shortly.'),
},
{
id: 'cyber_security',
@@ -17,13 +17,13 @@ export default function SpecialInstructionsScreen({ navigation }: Props) {
const handleSubmit = () => {
if (!title || !description) {
toast('Empty fields', 'error', 'Title and description are required.');
toast('Some details are missing', 'error', 'Please add a title and description before you continue.');
return;
}
setIsLoading(true);
setTimeout(() => {
setIsLoading(false);
toast('Request Logged', 'success', 'Your special instruction has been submitted to the branch.');
toast('Request submitted', 'success', 'Your special instruction has been sent to your branch.');
navigation.goBack();
}, 1500);
};
@@ -24,7 +24,7 @@ export default function StopPaymentScreen({ navigation }: Props) {
setIsLoading(true);
setTimeout(() => {
setIsLoading(false);
toast('Payment Stopped', 'success', `Cheque #${chequeNumber} has been blocked.`);
toast('Payment stopped', 'success', `We've stopped payment on cheque #${chequeNumber}.`);
navigation.goBack();
}, 1500);
};