Create or modify Expo Router screens and React Native components for the Bloom travel app. Use when: adding new app screens, creating tab screens, building reusable components, setting up navigation, working with React Native UI, or adding new pages to the app.
app/app/(tabs)/components/app/
├── _layout.tsx # Root stack navigator + providers
├── (tabs)/
│ ├── _layout.tsx # Bottom tab navigator config
│ ├── create.tsx # Create trip tab
│ ├── trips.tsx # View trips tab
│ ├── insights.tsx # Community insights tab
│ └── profile.tsx # User profile tab
├── trip/[id].tsx # Dynamic route: trip detail
├── deal/[id].tsx # Dynamic route: deal detail
├── settings/ # Settings sub-pages
├── admin/ # Admin dashboard
└── *.tsx # Top-level screens (flight-booking, subscription, etc.)
Boot order: Environment validation → Auth init (SecureStore) → Convex client → Providers:
ConvexNativeAuthProvider → ThemeProvider → NotificationInitializer
import { View, Text, StyleSheet, ScrollView } from 'react-native';
import { useRouter } from 'expo-router';
import { useQuery } from 'convex/react';
import { api } from '../convex/_generated/api';
import { useTranslation } from 'react-i18next';
import { useTheme } from '../lib/ThemeContext';
export default function MyScreen() {
const router = useRouter();
const { t } = useTranslation();
const { theme } = useTheme();
// Auth token from context for Convex calls
// const { token } = useAuth();
return (
<ScrollView style={[styles.container, { backgroundColor: theme.background }]}>
<Text style={{ color: theme.text }}>{t('myScreen.title')}</Text>
</ScrollView>
);
}
const styles = StyleSheet.create({
container: { flex: 1 },
});
useTheme() from lib/ThemeContext.tsx for dark/light mode colorsuseTranslation() hook and t('key') for all user-facing textuseRouter() for router.push(), router.back(), router.replace()OptimizedImage component or useImages() hook for cached imagesapp/ pathlib/i18n/StyleSheet.create() for styles, apply theme colors dynamicallyapp/(tabs)/_layout.tsxapp/settings/