- setWiFi() now throws detailed errors instead of returning false - Shows specific error messages: "WiFi credentials rejected", timeout etc. - Added logging throughout BLE WiFi configuration flow - Fixed WiFi network deduplication (keeps strongest signal) - Ignore "Operation cancelled" error (normal cleanup behavior) - BatchSetupProgress shows actual error in hint field 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
127 lines
3.0 KiB
TypeScript
127 lines
3.0 KiB
TypeScript
import { Tabs } from 'expo-router';
|
|
import React from 'react';
|
|
import { Ionicons } from '@expo/vector-icons';
|
|
import { Platform, View } from 'react-native';
|
|
|
|
import { HapticTab } from '@/components/haptic-tab';
|
|
import {
|
|
AppColors,
|
|
FontSizes,
|
|
FontWeights,
|
|
Shadows,
|
|
} from '@/constants/theme';
|
|
import { useColorScheme } from '@/hooks/use-color-scheme';
|
|
|
|
export default function TabLayout() {
|
|
const colorScheme = useColorScheme();
|
|
const isDark = colorScheme === 'dark';
|
|
|
|
return (
|
|
<Tabs
|
|
screenOptions={{
|
|
tabBarActiveTintColor: AppColors.primary,
|
|
tabBarInactiveTintColor: AppColors.textMuted,
|
|
tabBarStyle: {
|
|
backgroundColor: AppColors.surface,
|
|
borderTopWidth: 0,
|
|
height: Platform.OS === 'ios' ? 88 : 80,
|
|
paddingBottom: Platform.OS === 'ios' ? 28 : 20,
|
|
paddingTop: 12,
|
|
...Shadows.sm,
|
|
},
|
|
tabBarLabelStyle: {
|
|
fontSize: FontSizes.xs,
|
|
fontWeight: FontWeights.medium,
|
|
marginTop: 4,
|
|
},
|
|
tabBarIconStyle: {
|
|
marginTop: 2,
|
|
},
|
|
headerShown: false,
|
|
tabBarButton: HapticTab,
|
|
}}
|
|
>
|
|
<Tabs.Screen
|
|
name="index"
|
|
options={{
|
|
title: 'Beneficiaries',
|
|
tabBarIcon: ({ color, focused }) => (
|
|
<Ionicons
|
|
name={focused ? 'people' : 'people-outline'}
|
|
size={24}
|
|
color={color}
|
|
/>
|
|
),
|
|
}}
|
|
/>
|
|
{/* Hide old dashboard */}
|
|
<Tabs.Screen
|
|
name="dashboard"
|
|
options={{
|
|
href: null,
|
|
}}
|
|
/>
|
|
{/* Bug/Test tab removed */}
|
|
<Tabs.Screen
|
|
name="bug"
|
|
options={{
|
|
href: null,
|
|
}}
|
|
/>
|
|
<Tabs.Screen
|
|
name="chat"
|
|
options={{
|
|
title: 'Chat',
|
|
tabBarIcon: ({ color, focused }) => (
|
|
<Ionicons
|
|
name={focused ? 'chatbubbles' : 'chatbubbles-outline'}
|
|
size={24}
|
|
color={color}
|
|
/>
|
|
),
|
|
}}
|
|
/>
|
|
<Tabs.Screen
|
|
name="voice"
|
|
options={{
|
|
title: 'Voice',
|
|
tabBarIcon: ({ color, focused }) => (
|
|
<Ionicons
|
|
name={focused ? 'mic' : 'mic-outline'}
|
|
size={24}
|
|
color={color}
|
|
/>
|
|
),
|
|
}}
|
|
/>
|
|
<Tabs.Screen
|
|
name="profile"
|
|
options={{
|
|
title: 'Profile',
|
|
tabBarIcon: ({ color, focused }) => (
|
|
<Ionicons
|
|
name={focused ? 'person' : 'person-outline'}
|
|
size={24}
|
|
color={color}
|
|
/>
|
|
),
|
|
}}
|
|
/>
|
|
{/* Hide explore tab */}
|
|
<Tabs.Screen
|
|
name="explore"
|
|
options={{
|
|
href: null,
|
|
}}
|
|
/>
|
|
{/* Beneficiaries - hidden from tab bar but keeps tab bar visible */}
|
|
<Tabs.Screen
|
|
name="beneficiaries"
|
|
options={{
|
|
href: null,
|
|
}}
|
|
/>
|
|
</Tabs>
|
|
);
|
|
}
|