add filter bar

This commit is contained in:
m
2026-07-12 21:24:42 +02:00
parent de2ec3f382
commit e1b98432f3
2 changed files with 15 additions and 5 deletions
+12 -3
View File
@@ -1,6 +1,7 @@
import React, { useState, useMemo } from 'react'; import React, { useState, useMemo } from 'react';
import { View, FlatList, StyleSheet, TouchableOpacity, Text, Dimensions, Image, ActivityIndicator } from 'react-native'; import { View, FlatList, StyleSheet, TouchableOpacity, Text, Dimensions, Image, ActivityIndicator, KeyboardAvoidingView, Platform } from 'react-native';
import { useNavigation } from '@react-navigation/native'; import { useNavigation } from '@react-navigation/native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { NativeStackNavigationProp } from '@react-navigation/native-stack'; import { NativeStackNavigationProp } from '@react-navigation/native-stack';
import { MaterialIcons } from '@expo/vector-icons'; import { MaterialIcons } from '@expo/vector-icons';
import { useFiles, useFileImage } from '../hooks/useFiles'; import { useFiles, useFileImage } from '../hooks/useFiles';
@@ -98,6 +99,7 @@ function matchesQuery(file: FileItem, query: string, filters: SearchFilters): bo
export function HomeScreen() { export function HomeScreen() {
const navigation = useNavigation<NavigationProp>(); const navigation = useNavigation<NavigationProp>();
const insets = useSafeAreaInsets();
const { data, isLoading, error } = useFiles(); const { data, isLoading, error } = useFiles();
const [searchQuery, setSearchQuery] = useState(''); const [searchQuery, setSearchQuery] = useState('');
const [filters, setFilters] = useState<SearchFilters>({ name: true, ocrText: true, tags: true }); const [filters, setFilters] = useState<SearchFilters>({ name: true, ocrText: true, tags: true });
@@ -135,11 +137,17 @@ export function HomeScreen() {
} }
return ( return (
<View style={styles.container}> <KeyboardAvoidingView
style={styles.container}
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
keyboardVerticalOffset={Platform.OS === 'ios' ? 96 : 0}
>
<FlatList <FlatList
data={groupKeys} data={groupKeys}
keyExtractor={(item) => item} keyExtractor={(item) => item}
contentContainerStyle={styles.list} contentContainerStyle={styles.list}
keyboardShouldPersistTaps="handled"
keyboardDismissMode="on-drag"
ListEmptyComponent={ ListEmptyComponent={
<View style={styles.empty}> <View style={styles.empty}>
<Text style={styles.emptyText}> <Text style={styles.emptyText}>
@@ -177,6 +185,7 @@ export function HomeScreen() {
onClear={() => setSearchQuery('')} onClear={() => setSearchQuery('')}
filters={filters} filters={filters}
onFiltersChange={setFilters} onFiltersChange={setFilters}
bottomPadding={insets.bottom+8}
/> />
<View style={styles.bottomNav}> <View style={styles.bottomNav}>
@@ -201,7 +210,7 @@ export function HomeScreen() {
<Text style={styles.navText}>Scan</Text> <Text style={styles.navText}>Scan</Text>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
</View> </KeyboardAvoidingView>
); );
} }
+3 -2
View File
@@ -17,6 +17,7 @@ interface SearchBarProps {
onClear: () => void; onClear: () => void;
filters: SearchFilters; filters: SearchFilters;
onFiltersChange: (f: SearchFilters) => void; onFiltersChange: (f: SearchFilters) => void;
bottomPadding?: number;
} }
const FILTER_OPTIONS: { key: keyof SearchFilters; label: string; icon: IconName }[] = [ const FILTER_OPTIONS: { key: keyof SearchFilters; label: string; icon: IconName }[] = [
@@ -25,7 +26,7 @@ const FILTER_OPTIONS: { key: keyof SearchFilters; label: string; icon: IconName
{ key: 'tags', label: 'Tags', icon: 'label-outline' }, { key: 'tags', label: 'Tags', icon: 'label-outline' },
]; ];
export function SearchBar({ query, onQueryChange, onClear, filters, onFiltersChange }: SearchBarProps) { export function SearchBar({ query, onQueryChange, onClear, filters, onFiltersChange, bottomPadding = 0 }: SearchBarProps) {
const animatedHeight = useRef(new Animated.Value(0)).current; const animatedHeight = useRef(new Animated.Value(0)).current;
const [panelOpen, setPanelOpen] = React.useState(false); const [panelOpen, setPanelOpen] = React.useState(false);
@@ -50,7 +51,7 @@ export function SearchBar({ query, onQueryChange, onClear, filters, onFiltersCha
const hasActiveFilter = filters.name || filters.ocrText || filters.tags; const hasActiveFilter = filters.name || filters.ocrText || filters.tags;
return ( return (
<View style={styles.wrapper}> <View style={[styles.wrapper, { paddingBottom: bottomPadding }]}>
<View style={styles.inputRow}> <View style={styles.inputRow}>
<View style={styles.inputContainer}> <View style={styles.inputContainer}>
<MaterialIcons name="search" size={20} color="#999" style={styles.searchIcon} /> <MaterialIcons name="search" size={20} color="#999" style={styles.searchIcon} />