Files
FarmaFinder/apps/frontend-mobile/components/SearchBar.tsx
T
Antoni Nuñez Romeu 190b3d163d
Run Tests on Branches / Backend Tests (push) Successful in 3m38s
Run Tests on Branches / Frontend Tests (push) Successful in 3m28s
Restructure with Turborepo
2026-07-06 15:51:53 +02:00

82 lines
2.0 KiB
TypeScript

import React, { useState } from 'react';
import { View, TextInput, StyleSheet, TouchableOpacity } from 'react-native';
import { Ionicons } from '@expo/vector-icons';
import { colors, spacing, borderRadius } from '../constants/theme';
interface SearchBarProps {
placeholder?: string;
onSearch: (query: string) => void;
value?: string;
onChangeText?: (text: string) => void;
}
export function SearchBar({
placeholder = 'Buscar medicamentos...',
onSearch,
value,
onChangeText
}: SearchBarProps) {
const [localValue, setLocalValue] = useState(value || '');
const handleChange = (text: string) => {
setLocalValue(text);
onChangeText?.(text);
};
const handleSubmit = () => {
onSearch(localValue);
};
const handleClear = () => {
setLocalValue('');
onChangeText?.('');
onSearch('');
};
return (
<View style={styles.container}>
<Ionicons name="search" size={20} color={colors.textSecondary} style={styles.icon} />
<TextInput
style={styles.input}
placeholder={placeholder}
placeholderTextColor={colors.textSecondary}
value={localValue}
onChangeText={handleChange}
onSubmitEditing={handleSubmit}
returnKeyType="search"
autoCorrect={false}
/>
{localValue.length > 0 && (
<TouchableOpacity onPress={handleClear} style={styles.clearButton}>
<Ionicons name="close-circle" size={20} color={colors.textSecondary} />
</TouchableOpacity>
)}
</View>
);
}
const styles = StyleSheet.create({
container: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.card,
borderRadius: borderRadius.md,
paddingHorizontal: spacing.md,
paddingVertical: spacing.sm,
marginHorizontal: spacing.md,
marginVertical: spacing.sm,
},
icon: {
marginRight: spacing.sm,
},
input: {
flex: 1,
fontSize: 16,
color: colors.text,
paddingVertical: spacing.xs,
},
clearButton: {
marginLeft: spacing.sm,
},
});