feat(#1,#2,#5): add checkup nav/progress, image optimization controls, and raise tab bar
Some checks failed
Luggage List Build / build-web (push) Successful in 31s
Luggage List Build / build-android (push) Failing after 1m46s
Luggage List Build / release (push) Has been skipped

This commit is contained in:
2026-04-18 18:45:21 +02:00
parent 89fd4c2f44
commit 0e0ab4a059
4 changed files with 111 additions and 17 deletions

View File

@@ -5,6 +5,12 @@ import ChipGroup from '../components/ChipGroup';
import Field from '../components/Field';
import { styles } from '../styles';
function qualityValue(level) {
if (level === 'high') return 0.95;
if (level === 'low') return 0.45;
return 0.75;
}
export default function ItemModal({
visible,
itemForm,
@@ -14,6 +20,11 @@ export default function ItemModal({
takeItemImage,
saveItemFromModal,
}) {
const mediaOptions = {
quality: qualityValue(itemForm.imageQuality),
allowCrop: !!itemForm.imageAllowCrop,
};
return (
<Modal visible={visible} animationType="slide" transparent>
<View style={styles.modalBackdrop}>
@@ -82,11 +93,28 @@ export default function ItemModal({
</Field>
) : null}
<Field label="Image optimization">
<View style={styles.chipGroup}>
{['low', 'balanced', 'high'].map((level) => {
const active = itemForm.imageQuality === level;
return (
<Pressable key={level} style={[styles.chip, active && styles.chipActive]} onPress={() => updateItemForm('imageQuality', level)}>
<Text style={[styles.chipText, active && styles.chipTextActive]}>{level}</Text>
</Pressable>
);
})}
</View>
</Field>
<Pressable style={styles.inlineToggle} onPress={() => updateItemForm('imageAllowCrop', !itemForm.imageAllowCrop)}>
<Text style={styles.inlineToggleText}>{itemForm.imageAllowCrop ? '☑' : '☐'} Enable optional crop before save</Text>
</Pressable>
<View style={styles.actionRow}>
<Pressable style={[styles.secondaryBtnTight, styles.flex]} onPress={takeItemImage}>
<Pressable style={[styles.secondaryBtnTight, styles.flex]} onPress={() => takeItemImage(mediaOptions)}>
<Text style={styles.secondaryBtnText}>Take photo</Text>
</Pressable>
<Pressable style={[styles.secondaryBtnTight, styles.flex]} onPress={pickItemImage}>
<Pressable style={[styles.secondaryBtnTight, styles.flex]} onPress={() => pickItemImage(mediaOptions)}>
<Text style={styles.secondaryBtnText}>{itemForm.imageUri ? 'From gallery (change)' : 'From gallery'}</Text>
</Pressable>
</View>