forked from Smartdevs17/SubTrackr
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFilterBar.tsx
More file actions
121 lines (117 loc) · 3.02 KB
/
Copy pathFilterBar.tsx
File metadata and controls
121 lines (117 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import React from 'react';
import { View, Text, TextInput, TouchableOpacity, StyleSheet } from 'react-native';
import { colors, spacing, borderRadius, typography } from '../../utils/constants';
interface FilterBarProps {
searchQuery: string;
setSearchQuery: (text: string) => void;
onFilterPress: () => void;
hasActiveFilters: boolean;
activeFilterCount: number;
}
export const FilterBar: React.FC<FilterBarProps> = ({
searchQuery,
setSearchQuery,
onFilterPress,
hasActiveFilters,
activeFilterCount,
}) => {
return (
<View style={styles.searchFilterBar}>
<View style={styles.searchContainer}>
<Text style={styles.searchIcon}>🔍</Text>
<TextInput
style={styles.searchInput}
placeholder="Search subscriptions..."
placeholderTextColor={colors.textSecondary}
value={searchQuery}
onChangeText={setSearchQuery}
/>
{searchQuery.length > 0 && (
<TouchableOpacity onPress={() => setSearchQuery('')}>
<Text style={styles.clearSearchIcon}>✕</Text>
</TouchableOpacity>
)}
</View>
<TouchableOpacity
style={[styles.filterButton, hasActiveFilters && styles.filterButtonActive]}
onPress={onFilterPress}>
<Text style={styles.filterIcon}>🔧</Text>
{hasActiveFilters && (
<View style={styles.filterBadge}>
<Text style={styles.filterBadgeText}>{activeFilterCount}</Text>
</View>
)}
</TouchableOpacity>
</View>
);
};
const styles = StyleSheet.create({
searchFilterBar: {
flexDirection: 'row',
alignItems: 'center',
marginTop: spacing.md,
gap: spacing.sm,
},
searchContainer: {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.surface,
borderRadius: borderRadius.md,
paddingHorizontal: spacing.md,
paddingVertical: spacing.sm,
borderWidth: 1,
borderColor: colors.border,
},
searchIcon: {
fontSize: 16,
marginRight: spacing.sm,
color: colors.textSecondary,
},
searchInput: {
flex: 1,
color: colors.text,
...typography.body,
},
clearSearchIcon: {
fontSize: 16,
color: colors.textSecondary,
padding: spacing.xs,
},
filterButton: {
backgroundColor: colors.surface,
borderRadius: borderRadius.md,
padding: spacing.md,
borderWidth: 1,
borderColor: colors.border,
alignItems: 'center',
justifyContent: 'center',
position: 'relative',
},
filterButtonActive: {
backgroundColor: colors.primary,
borderColor: colors.primary,
},
filterIcon: {
fontSize: 18,
color: colors.text,
},
filterBadge: {
position: 'absolute',
top: -5,
right: -5,
backgroundColor: colors.error,
borderRadius: borderRadius.full,
minWidth: 20,
height: 20,
alignItems: 'center',
justifyContent: 'center',
paddingHorizontal: spacing.xs,
},
filterBadgeText: {
...typography.caption,
color: colors.text,
fontWeight: '600',
fontSize: 10,
},
});