import { useAlert } from '@/aesthetics/Alert'; import { Text } from '@/aesthetics/Text'; import { IngredientChips } from '@/see-log/components/IngredientChips'; import { TextInput } from '@/aesthetics/TextInput'; import { font, radius, shadows, spacing, useColors } from '@/aesthetics/styles'; import { useStrings } from '@/common/hooks/useStrings'; import { formatDateTime } from '@/common/utils/format'; import type { NutritionDisplayMode, NutritionSortMode } from '@/types/nutrition'; import { ArrowLeft, Pencil, Share, ThumbsDown, ThumbsUp, Trash2 } from 'lucide-react-native'; import { useState } from 'react'; import { Image, Modal, Pressable, ScrollView, StyleSheet, View } from 'react-native'; import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; import { BASE_DAILY_TARGETS } from '@/common/constants/nutrition'; import { NutrientBreakdown } from '@/see-log/home-page/NutrientBreakdown'; import { CastleDebugSections } from './CastleDebugSections'; import { useFoodLogDetail } from './useFoodLogDetail'; export function FoodLogDetailScreen() { const c = useColors(); const strings = useStrings(); const insets = useSafeAreaInsets(); const { showAlert } = useAlert(); const [displayMode, setDisplayMode] = useState('nutrients'); const [sortMode, setSortMode] = useState('default'); const { log, photoUri, primaryPrediction, predictions, showAiComparison, editVisible, editFoodName, setEditVisible, setEditFoodName, handleDelete, handleEdit, handleSaveEdit, router, } = useFoodLogDetail(strings); if (!log) { return ( [styles.backButton, pressed && styles.pressed]} onPress={() => router.back()} hitSlop={12} > {strings.seeLog.detail.logNotFound} ); } return ( [styles.backButton, pressed && styles.pressed]} onPress={() => router.back()} hitSlop={12} > {photoUri && ( )} {log.foodName} {formatDateTime(log.eatenAt)} {log.ingredients.length > 0 && ( {strings.seeLog.detail.ingredients} )} {primaryPrediction && ( {strings.seeLog.detail.detection} {primaryPrediction.predictedFoodName ?? strings.common.unknown} {primaryPrediction.ingredients && primaryPrediction.ingredients.length > 0 && ( {primaryPrediction.ingredients.join(', ')} )} )} {log.nutrition && Object.keys(log.nutrition).length > 0 && ( {strings.seeLog.detail.nutrition} )} {showAiComparison && predictions && predictions.length > 0 && ( )} [styles.actionBtn, pressed && styles.pressed]} onPress={() => showAlert(strings.seeLog.detail.liked, strings.common.comingSoon)} > [styles.actionBtn, pressed && styles.pressed]} onPress={() => showAlert(strings.seeLog.detail.disliked, strings.common.comingSoon)} > [styles.actionBtn, pressed && styles.pressed]} onPress={handleEdit} > [styles.actionBtn, pressed && styles.pressed]} onPress={() => showAlert(strings.seeLog.detail.share, strings.common.comingSoon)} > [styles.actionBtn, pressed && styles.pressed]} onPress={handleDelete} > setEditVisible(false)} > true} > {strings.seeLog.detail.editName} [ styles.modalBtn, { backgroundColor: c.tagBg }, pressed && styles.pressed, ]} onPress={() => setEditVisible(false)} > {strings.common.cancel} [ styles.modalBtn, { backgroundColor: c.accent }, pressed && styles.pressed, ]} onPress={handleSaveEdit} > {strings.common.save} ); } const styles = StyleSheet.create({ container: { flex: 1, }, header: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: spacing.xl, paddingVertical: spacing.md, }, backButton: { width: 40, height: 40, borderRadius: radius.md, alignItems: 'center', justifyContent: 'center', }, scrollView: { flex: 1, }, scrollContent: { paddingHorizontal: spacing.xl, gap: spacing.lg, }, photoContainer: { borderRadius: radius.lg, overflow: 'hidden', }, photo: { width: '100%', aspectRatio: 1, }, titleSection: { alignItems: 'center', gap: spacing.xs, }, foodName: { fontSize: font.xxl, textAlign: 'center', letterSpacing: 0.3, }, time: { fontSize: font.sm, }, notFound: { flex: 1, alignItems: 'center', justifyContent: 'center', }, notFoundText: { fontSize: font.md, }, card: { borderRadius: radius.lg, borderWidth: 1, padding: spacing.lg, gap: spacing.md, }, cardTitle: { fontSize: font.md, fontWeight: '600', }, detection: { gap: spacing.xs, }, detectionName: { fontSize: font.md, fontWeight: '500', }, detectionIngredients: { fontSize: font.sm, }, actionBar: { position: 'absolute', bottom: 0, left: spacing.xl, right: spacing.xl, flexDirection: 'row', justifyContent: 'space-around', paddingVertical: spacing.lg, borderRadius: radius.xl, borderWidth: 1, marginBottom: spacing.xl, }, actionBtn: { padding: spacing.md, borderRadius: radius.md, }, pressed: { opacity: 0.7, }, modalOverlay: { flex: 1, justifyContent: 'center', alignItems: 'center', }, modalContent: { width: '85%', borderRadius: radius.xl, padding: spacing.xl, }, modalTitle: { fontSize: font.xl, marginBottom: spacing.lg, }, modalInput: { borderRadius: radius.md, padding: spacing.lg, fontSize: font.md, marginBottom: spacing.lg, }, modalActions: { flexDirection: 'row', gap: spacing.md, }, modalBtn: { flex: 1, paddingVertical: spacing.md, borderRadius: radius.md, alignItems: 'center', }, modalBtnText: { fontSize: font.md, fontWeight: '500', }, });