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 { useAuthStore } from '@store/authStore'; import { Input } from '@presentation/components/ui/Input'; import { Button } from '@presentation/components/ui/Button'; import { colors, typography, spacing, radius } from '@shared/theme'; import type { UpdateSpoolPresetInput } from '@domain/SpoolPreset'; import { updatePresetUseCase, deletePresetUseCase } from '@infrastructure/container'; 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: async () => { try { const user = useAuthStore.getState().user; if (!user) { Alert.alert('Erro', 'Usuário não autenticado'); return; } await deletePresetUseCase.execute(preset!.id, user.id); removePreset(preset!.id); router.replace('/(app)/(tabs)/config' as never); } catch (error) { Alert.alert('Erro', `Falha ao deletar: ${(error as Error).message}`); } }, }, ], ); } async function onSubmit(data: FormData): Promise { setIsLoading(true); try { const user = useAuthStore.getState().user; if (!user) { Alert.alert('Erro', 'Usuário não autenticado'); return; } const input: UpdateSpoolPresetInput = { name: data.name, spoolWeightG: Number(data.spoolWeightG), }; const updated = await updatePresetUseCase.execute(preset!.id, user.id, input); updatePreset(updated); router.back(); } catch (error) { Alert.alert('Erro', `Não foi possível salvar as alterações: ${(error as Error).message}`); } 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 */}