import React, { useState } from 'react'; import { View, Text, TouchableOpacity, StyleSheet, Alert, } from 'react-native'; import { useLocalSearchParams, useRouter } from 'expo-router'; import { useForm, Controller } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Ionicons } from '@expo/vector-icons'; import { SafeAreaView } from 'react-native-safe-area-context'; import { usePresetStore } from '@store/presetStore'; import { Input } from '@presentation/components/ui/Input'; import { Button } from '@presentation/components/ui/Button'; import { colors, typography, spacing, radius } from '@shared/theme'; const schema = z.object({ name: z.string().min(1, 'Nome obrigatório'), spoolWeightG: z.coerce.number().min(1, 'Peso obrigatório'), }); type FormData = z.infer; type SpoolType = 'Plástico' | 'Papelão' | 'Outro'; /** * Tela de Editar Preset — 1KD-0 */ export default function EditPresetScreen(): React.ReactElement { const { id } = useLocalSearchParams<{ id: string }>(); const router = useRouter(); const { presets, updatePreset, removePreset } = usePresetStore(); const preset = presets.find((p) => p.id === id); const [spoolType, setSpoolType] = useState('Plástico'); const [isLoading, setIsLoading] = useState(false); const { control, handleSubmit, formState: { errors } } = useForm({ resolver: zodResolver(schema), defaultValues: { name: preset?.name ?? '', spoolWeightG: preset?.spoolWeightG ?? undefined, }, }); if (!preset) { return ( Preset não encontrado router.back()}> Voltar ); } function handleDelete(): void { Alert.alert( 'Excluir preset', `Deseja excluir o preset "${preset!.name}"?`, [ { text: 'Cancelar', style: 'cancel' }, { text: 'Excluir', style: 'destructive', onPress: () => { removePreset(preset!.id); router.replace('/(app)/(tabs)/config' as never); }, }, ], ); } async function onSubmit(data: FormData): Promise { setIsLoading(true); try { // TODO: UpdatePresetUseCase via DI container updatePreset({ ...preset!, name: data.name, spoolWeightG: Number(data.spoolWeightG), }); router.back(); } catch { Alert.alert('Erro', 'Não foi possível salvar as alterações.'); } finally { setIsLoading(false); } } return ( {/* Header */} router.back()}> Editar Preset {/* Ícone */} {/* Nome */} ( } /> )} /> {/* Peso */} ( } rightLabel="g" /> )} /> Pese o carretel vazio em uma balança e insira o valor em gramas. {/* Tipo */} TIPO DE CARRETEL Opcional {(['Plástico', 'Papelão', 'Outro'] as SpoolType[]).map((t) => ( setSpoolType(t)} style={[styles.chip, spoolType === t && styles.chipActive]} > {t} ))} {/* CTA */}