<div>, <span>, <p> in JSX | Use <View>, <View>, <Text> |
Text rendered directly in <View> | Always wrap in <Text> |
ScrollView with .map() for long lists | Use <FlatList> with keyExtractor |
Inline style objects style={{ margin: 8 }} for static values | Move to StyleSheet.create() |
| Hardcoded status bar height | Use SafeAreaView or useSafeAreaInsets() |
supabase.auth.getSession() | Always use supabase.auth.getUser() |
| Creating a new Supabase client in a component | Import the singleton from @/lib/supabase |
Writing directly to wash_transactions | Use the log_wash RPC |
router.push() for auth redirect | Use router.replace() |
Importing from packages/ui in mobile | Build a dedicated component in apps/mobile/components/ |
Array index as FlatList key | Use stable DB id in keyExtractor |
Missing isLoading / isError handling | Always handle all TanStack Query states |