diff --git a/src/components/ItemCard.js b/src/components/ItemCard.js index 5357314..e53f52d 100644 --- a/src/components/ItemCard.js +++ b/src/components/ItemCard.js @@ -8,7 +8,7 @@ function statusAccent(status) { return STATUS_COLORS[status] || '#64748b'; } -export default function ItemCard({ item, onEdit, onDelete, onQuickPack, onQuickUnpack }) { +export default function ItemCard({ item, onEdit, onDelete, onQuickPack, onQuickUnpack, onOpenImage }) { const isPacked = item.status === 'packed'; const isUnpacked = item.status === 'unpacked'; @@ -18,7 +18,9 @@ export default function ItemCard({ item, onEdit, onDelete, onQuickPack, onQuickU {item.imageUri ? ( - + onOpenImage?.(item.imageUri)}> + + ) : ( 🧳 diff --git a/src/styles.js b/src/styles.js index afbc513..cf425d4 100644 --- a/src/styles.js +++ b/src/styles.js @@ -517,6 +517,35 @@ export const styles = StyleSheet.create({ borderRadius: 10, backgroundColor: '#111827', }, + imagePreviewBackdrop: { + flex: 1, + backgroundColor: 'rgba(2,6,23,0.88)', + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: 14, + }, + imagePreviewCard: { + width: '100%', + maxWidth: 460, + borderRadius: 14, + borderWidth: 1, + borderColor: '#334155', + backgroundColor: '#0f172a', + padding: 10, + gap: 8, + }, + imagePreviewImage: { + width: '100%', + height: 360, + borderRadius: 10, + backgroundColor: '#0b1220', + }, + imagePreviewHint: { + color: '#93c5fd', + textAlign: 'center', + fontSize: 12, + fontWeight: '600', + }, tabBarWrap: { position: 'absolute', diff --git a/src/tabs/ItemsTab.js b/src/tabs/ItemsTab.js index b6827a0..78027d0 100644 --- a/src/tabs/ItemsTab.js +++ b/src/tabs/ItemsTab.js @@ -1,5 +1,5 @@ import React, { useMemo, useState } from 'react'; -import { Pressable, Text, View } from 'react-native'; +import { Image, Modal, Pressable, Text, View } from 'react-native'; import ItemCard from '../components/ItemCard'; import { ITEM_STATUSES } from '../constants'; import { styles } from '../styles'; @@ -16,6 +16,7 @@ export default function ItemsTab({ }) { const [statusFilter, setStatusFilter] = useState('all'); const [categoryFilter, setCategoryFilter] = useState('all'); + const [imagePreviewUri, setImagePreviewUri] = useState(''); const categories = useMemo( () => Array.from(new Set(selectedTripItems.map((item) => item.category?.trim()).filter(Boolean))).sort((a, b) => a.localeCompare(b)), @@ -100,10 +101,20 @@ export default function ItemsTab({ onDelete={deleteItem} onQuickPack={() => quickSetItemStatus(item.id, 'packed')} onQuickUnpack={() => quickSetItemStatus(item.id, 'unpacked')} + onOpenImage={(uri) => setImagePreviewUri(uri)} /> ))} {selectedTripItems.length > 0 && filteredItems.length === 0 ? No items match the current filters. : null} + + + setImagePreviewUri('')}> + {}}> + {imagePreviewUri ? : null} + Tap outside to close + + + ); }