managarten/nutriphi/apps/mobile/app/index.tsx
Till-JS 6537863696 feat(nutriphi): migrate from Supabase to PostgreSQL + Hetzner S3
- Add nutriphi-database package with Drizzle ORM
  - meals and nutrition_goals schemas
  - PostgreSQL 16 Docker setup
  - Drizzle Kit configuration

- Migrate backend from Supabase to Drizzle
  - Add DatabaseModule with connection pooling
  - Add StorageService for Hetzner Object Storage (S3-compatible)
  - Update MealsService with Drizzle queries
  - Add /api/meals/upload endpoint for image upload + analysis

- Update web app to use backend for uploads
  - Remove Supabase Storage direct upload
  - Update uploadService to send images to backend
  - Remove Supabase dependencies from package.json
  - Simplify hooks.server.ts

- Add Coolify deployment configuration
  - Dockerfile for production build
  - docker-compose.coolify.yml

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 17:52:14 +01:00

52 lines
1.5 KiB
TypeScript

import { router } from 'expo-router';
import { SafeAreaView } from 'react-native-safe-area-context';
import { MealList } from '../components/meals/MealList';
import { FloatingActionButton } from '../components/ui/FloatingActionButton';
import { CameraModal } from '../components/camera/CameraModal';
import { MealWithItems } from '../types/Database';
import { useAppStore } from '../store/AppStore';
export default function Home() {
const { toggleCameraModal, showCameraModal, cameraMode } = useAppStore();
const handleMealPress = (meal: MealWithItems) => {
router.push(`/meal/${meal.id}`);
};
const handleCameraPress = () => {
toggleCameraModal(true, 'camera');
};
const handleGalleryPress = () => {
toggleCameraModal(true, 'gallery');
};
return (
<>
<SafeAreaView className="flex-1 bg-gray-50 dark:bg-gray-900">
<MealList onMealPress={handleMealPress} />
{/* Camera Button (larger, centered) */}
<FloatingActionButton
onPress={handleCameraPress}
sfSymbol="camera"
fallbackIcon="camera"
size="large"
position="center"
/>
{/* Gallery Button (smaller, right) */}
<FloatingActionButton
onPress={handleGalleryPress}
sfSymbol="photo"
fallbackIcon="image"
size="normal"
position="right"
/>
</SafeAreaView>
{showCameraModal && <CameraModal mode={cameraMode || 'camera'} />}
</>
);
}