import React, { useState } from 'react'; import { View, Text, FlatList, TouchableOpacity, StyleSheet, TextInput, } from 'react-native'; import { useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useFilamentStore } from '@store/filamentStore'; import { FilamentCard } from '@presentation/components/filament/FilamentCard'; import type { Filament } from '@domain/Filament'; import { colors, typography, spacing, radius } from '@shared/theme'; import { MATERIALS } from '@shared/constants'; const TABS = ['Todos', ...MATERIALS.slice(0, 4)] as const; /** * Tela de Inventário — CW-0 * Busca, chips de material, lista de filamentos com peso e % de estoque. */ export default function InventoryScreen(): React.ReactElement { const router = useRouter(); const { filaments } = useFilamentStore(); const [search, setSearch] = useState(''); const [activeTab, setActiveTab] = useState('Todos'); const filtered = filaments.filter((f) => { const matchMaterial = activeTab === 'Todos' || f.material === activeTab; const matchSearch = search.length === 0 || f.brand.toLowerCase().includes(search.toLowerCase()) || (f.model ?? '').toLowerCase().includes(search.toLowerCase()) || f.material.toLowerCase().includes(search.toLowerCase()); return matchMaterial && matchSearch; }); function renderItem({ item }: { item: Filament }): React.ReactElement { return ; } return ( {/* Cabeçalho */} Seu estoque Inventário router.push('/(app)/inventory/filters')} > {/* Busca */} {/* Chips de material */} {TABS.map((tab) => ( setActiveTab(tab)} style={[styles.chip, activeTab === tab && styles.chipActive]} > {tab} ))} {/* Contagem */} {filtered.length} FILAMENTOS Ordenar item.id} renderItem={renderItem} contentContainerStyle={styles.list} ItemSeparatorComponent={() => } showsVerticalScrollIndicator={false} ListEmptyComponent={ Nenhum filamento encontrado. } /> ); } const styles = StyleSheet.create({ safe: { flex: 1, backgroundColor: colors.bgBase }, header: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'flex-start', paddingHorizontal: spacing[5], paddingTop: spacing[4] }, headerSub: { fontFamily: typography.fontFamily.ui, fontSize: typography.fontSize.sm, color: colors.textSecondary }, headerTitle: { fontFamily: typography.fontFamily.ui, fontSize: typography.fontSize['2xl'], fontWeight: typography.fontWeight.bold, color: colors.textPrimary }, filterBtn: { width: 40, height: 40, borderRadius: radius.md, backgroundColor: colors.bgSurface, alignItems: 'center', justifyContent: 'center', borderWidth: 1, borderColor: colors.border }, searchRow: { flexDirection: 'row', alignItems: 'center', backgroundColor: colors.bgSurface, borderRadius: radius.md, marginHorizontal: spacing[5], marginTop: spacing[4], paddingHorizontal: spacing[4], borderWidth: 1, borderColor: colors.border, height: 48 }, searchIcon: { marginRight: spacing[2] }, searchInput: { flex: 1, fontFamily: typography.fontFamily.ui, fontSize: typography.fontSize.base, color: colors.textPrimary }, chipsRow: { flexDirection: 'row', gap: spacing[2], paddingHorizontal: spacing[5], marginTop: spacing[3], flexWrap: 'wrap' }, chip: { paddingHorizontal: spacing[4], paddingVertical: spacing[2], borderRadius: radius.full, backgroundColor: colors.bgSurface, borderWidth: 1, borderColor: colors.border }, chipActive: { backgroundColor: colors.accent, borderColor: colors.accent }, chipText: { fontFamily: typography.fontFamily.ui, fontSize: typography.fontSize.sm, fontWeight: typography.fontWeight.medium, color: colors.textSecondary }, chipTextActive: { color: colors.bgBase }, countRow: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingHorizontal: spacing[5], marginTop: spacing[4], marginBottom: spacing[2] }, countText: { fontFamily: typography.fontFamily.ui, fontSize: typography.fontSize.xs, fontWeight: typography.fontWeight.bold, color: colors.textSecondary, letterSpacing: 0.8 }, sortBtn: { flexDirection: 'row', alignItems: 'center', gap: 4 }, sortText: { fontFamily: typography.fontFamily.ui, fontSize: typography.fontSize.sm, color: colors.textSecondary }, list: { paddingHorizontal: spacing[5], paddingBottom: spacing[10] }, separator: { height: spacing[2] }, empty: { alignItems: 'center', gap: spacing[3], paddingTop: spacing[12] }, emptyText: { fontFamily: typography.fontFamily.ui, fontSize: typography.fontSize.base, color: colors.textSecondary }, });